diff --git a/webdir/.htaccess b/.htaccess old mode 100755 new mode 100644 similarity index 100% rename from webdir/.htaccess rename to .htaccess diff --git a/Acl.php b/Acl.php old mode 100755 new mode 100644 index cb83dbf..011ce0b --- a/Acl.php +++ b/Acl.php @@ -1,7 +1,7 @@ registerNamespace('Monkeys_'); $loader->registerNamespace('CommunityID'); $loader->registerNamespace('Auth'); + $loader->registerNamespace('Yubico'); new Monkeys_Application_Module_Autoloader(array( 'namespace' => '', 'basePath' => APP_DIR . '/modules/default', @@ -82,31 +83,15 @@ class Application public static function setConfig() { - if (file_exists(APP_DIR . DIRECTORY_SEPARATOR . 'config.php')) { - $configFile = APP_DIR . DIRECTORY_SEPARATOR . 'config.php'; - } else { - $configFile = APP_DIR . DIRECTORY_SEPARATOR . 'config.default.php'; - } - $config = array(); - require $configFile; - - // in case config.php is empty (during install) - if (!$config) { - $configFile = APP_DIR . DIRECTORY_SEPARATOR . 'config.default.php'; - require $configFile; + // first defaults are loaded, then the custom configs + require APP_DIR . DIRECTORY_SEPARATOR . 'config.default.php'; + if (file_exists(APP_DIR . DIRECTORY_SEPARATOR . 'config.php')) { + require APP_DIR . DIRECTORY_SEPARATOR . 'config.php'; } self::$config = new Zend_Config($config, array('allowModifications' => true)); - if(self::$config->environment->installed === null) { - $configFile = APP_DIR . DIRECTORY_SEPARATOR . 'config.default.php'; - require $configFile; - self::$config = new Zend_Config($config, array('allowModifications' => true)); - } - - // @todo: remove this when all interconnected apps use the same LDAP source - self::$config->environment->app = 'communityid'; Zend_Registry::set('config', self::$config); } @@ -162,10 +147,11 @@ class Application public static function setDatabase() { - // constant not set if pdo_mysql extension is not loaded - if (defined('PDO::MYSQL_ATTR_USE_BUFFERED_QUERY')) { + // I was using this for when using PDO, but lately it's generating a segfault, and we're not using PDO anymore anyway + /*if (defined('PDO::MYSQL_ATTR_USE_BUFFERED_QUERY')) { + // constant not set if pdo_mysql extension is not loaded self::$config->database->params->driver_options = array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true); - } + }*/ $db = Zend_Db::factory(self::$config->database); if (self::$config->logging->level == Zend_Log::DEBUG) { diff --git a/CHANGELOG b/CHANGELOG index dce5679..59c170d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,10 +1,124 @@ +2010-05-26 / 2.0.0-RC3 / Reiner Jung + +*NEW FEATURES:* + +- Added check to see if cURL is enabled (needed for Yubikey) +- Added label to list password requirements +- Detect missing new config settings after upgrade, and show warning notice. + +*FIXED BUGS:* + +- Updated language reference files + +2010-05-3 / 2.0.0-RC2 / Reiner Jung + +*NEW FEATURES:* + +NONE + +*FIXED BUGS:* + +- javascript error when authenticating +- upgrade from version prior to 1.2.1 was broken + +2010-04-20 / 2.0.0-RC1 / Reiner Jung + +*NEW FEATURES:* + +- Yubikey support: users can log into the community-ID and authenticate themselves during an OpenID transaction using a Yubikey. The administrator must configure this as explained in the config.php file. If allowed by the administrator, users can choose the authentication mode (password or Yubikey) in their account section. +- Added PAPE extension support: implemented a phishing-resistant authentication policy, through a sign-in image a user can manage. +- Added ability to blacklist usernames throug regular expression in the config file. +- Check passwords against dictionary, username, minimum length, include numbers, include symbols and include upper and lower case chars. Applied to Registration form, change password form and new user form. All this configurable in config.php +- Implemented multiple profiles for users. +- Added cronjob script to automatically delete unconfirmed accounts. Note that all these maintenance scripts have been removed from the release, and must be retrieved manually from svn://source.keyboard-monkeys.org/communityid/branches/scripts +- utilities and tests directories have also been moved to a separate svn branch. + +*FIXED BUGS:* + +- Fixed javascript error under IE and Chrome. +- The reminder counter was not being reset when a user confirmed his account. + +2010-03-08 / 1.2.1 / Reiner Jung + +*NEW FEATURES:* + +- NONE + +*FIXED BUGS:* + +- With the 1.2 release we introduced a bug where the login to Facebook was not working anymore +- The reminder counter is not reset after the user confirms +- Italian translation from Paolo Campegiani +- Update Catalan translation + +2010-02-05 / 1.2.0 / Reiner Jung + +*NEW FEATURES:* + +- NONE + +*FIXED BUGS:* + +- In the authentication page for an openid transaction, the openid shouldn't be changeable +- Password recovery URL was forced to be http even when the site was using https +- Couldn't edit user profile or change pwd + +2010-01-28 / 1.2.0-RC2 / Reiner Jung + +*NEW FEATURES:* + +- New plugin framework for stats +- Catalan translation added + +*FIXED BUGS* + +- Login not working if subdomain & mixed mode enabled + +2009-12-04 / 1.2.0-RC1 / Reiner Jung + +*NEW FEATURES:* + +- Ability to set page metadata in the config +- Ability to set set different resource files (email templates, eula) on a per-theme basis +- For user data and authentication, admin can choose the default DB storage, or to connect to an LDAP server +- Autofocus in the password field when authenticating + +*FIXED BUGS:* + +- NONE + +2009-11-20 / 1.1.1 / Reiner Jung + +NEW FEATURES: + +- Added more requirements checks during the installation ( PHP version, and existence of some extensions and options) +- Language updates. + +FIXED BUGS: + +- The 'register now' section was still visible in the home page when registrations were disabled in the config file. + +2009-10-05 / 1.1.0 / Reiner Jung + +NEW FEATURES: + +- Japanese translation added from Kevin Fujii + +FIXED BUGS: + +- Languages updates +- Moved language files under LC_MESSAGES directories +- Normalization of URL stored in the sites table +- Increase graph bottom margin to make room for x-axis labels +- Show error messages for bad login or bad captcha when trying to log in +- A couple of spelling/grammar issues fixed +- upgraded jpgraph to version 3.0.4. Solves compatibility with php 5.3 + 2009-09-18 / 1.1.0-RC2 / Reiner Jung NEW FEATURES: -- During installation, ask for desired admin user username and -password, instead of using the default admin/admin. The admin's E-mail -is set to the support E-mail provided in that same form. +- During installation, ask for desired admin user username and password, instead of using the default admin/admin. The admin's E-mail is set to the support E-mail provided in that same form. - Language updates. FIXED BUGS: @@ -16,74 +130,53 @@ FIXED BUGS: NEW FEATURES: -- Clear button in Manage Users section will clear search input box, and -restore the current filtered list. +- Clear button in Manage Users section will clear search input box, and restore the current filtered list. - Updated translation strings - Added i18n to the account reminder E-mail template -- When browsing users, show the number of reminders sent to unconfirmed -users, in the status column. +- When browsing users, show the number of reminders sent to unconfirmed users, in the status column. - Upgraded Zend Framework to latest stable version, 1.9.2 -- Completely removed the requirement of having to enable short tags in -php.ini +- Completely removed the requirement of having to enable short tags in php.ini FIXED BUGS: - Fixed return on denied immediate request -- Wasn't forgetting user after closing browser, when not using the -Remember Me feature +- Wasn't forgetting user after closing browser, when not using the Remember Me feature - Fixed issues with the unconfirmed user message reminders - Clean error message when attempting to install with empty config.php file -- Fixed warning message when pdo_mysql extension is not loaded. Note -that that extension still isn't a requirement, since we're still using -mysqli -- Fixed small installation issue when installing directly on the web -root dir -- After the upgrade process finishes, log out the user to avoid problems -when the users table structure changes. +- Fixed warning message when pdo_mysql extension is not loaded. Note that that extension still isn't a requirement, since we're still using mysqli +- Fixed small installation issue when installing directly on the web root dir +- After the upgrade process finishes, log out the user to avoid problems when the users table structure changes. 2009-08-21 / 1.1.0BETA / Reiner Jung NEW FEATURES: -- Community-ID news feed has been moved to a new About section, visible -only by admins. +- Community-ID news feed has been moved to a new About section, visible only by admins. - News in the home page are now manageable by the admin. -- Brute-force login attempts are now mitigated through the appearance of -a captcha after the third failed attempt, in both the main page login -section, and when trying to log-in while during an OpenID authentication. +- Brute-force login attempts are now mitigated through the appearance of a captcha after the third failed attempt, in both the main page login section, and when trying to log-in while during an OpenID authentication. - Removed requirement of having short_open_tag php.ini directive to be On. - The user's OpenID URL is now visible in all pages when he's logged in. - The Manage Users section now has a search field. -- You're able to delete unconfirmed users that have not confirmed their -account for a given number of days. -- You're able to send a reminder to unconfirmed users that have not -confirmed their account for a given number of days. -- Added sorting ability for the History Log table. Have it sort from -latest to oldest by default. -- Replaced rich-text editor in the Message Users section with the more -capable FCK Editor. -- Rich-text editor messages are filtered through the HTMLPurifier lib, -that filters out XSS and other malignous content. +- You're able to delete unconfirmed users that have not confirmed their account for a given number of days. +- You're able to send a reminder to unconfirmed users that have not confirmed their account for a given number of days. +- Added sorting ability for the History Log table. Have it sort from latest to oldest by default. +- Replaced rich-text editor in the Message Users section with the more capable FCK Editor. +- Rich-text editor messages are filtered through the HTMLPurifier lib, that filters out XSS and other malignous content. - Upgraded Zend Framework to version 1.8.4PL1 FIXED BUGS: -- Fixed compatibility with OpenID relays that send their info through -POST instead of GET. -- Fixed support for relays not sending the OpenID identifier. This fixes -Facebook compatibility. +- Fixed compatibility with OpenID relays that send their info through POST instead of GET. +- Fixed support for relays not sending the OpenID identifier. This fixes Facebook compatibility. - Fixed clashes with other Zend Frameworks located in PHP's include path. -- Now only ascii characters will be allowed in the usernames, to avoid -problems in the OpenID URL. +- Now only ascii characters will be allowed in the usernames, to avoid problems in the OpenID URL. - Fixed pagination issues in the Manage Users section. - Fixed pagination issues in the History Log section. - Fixed problems in the Feedback and Message Users forms. -- Mass-mailing to users will have the recipients in BCC instead of TO, -to avoid revealing E-mails to all recipients. -- Fixed layout issue of the login checkbox "Remember me", under IE and -Opera. +- Mass-mailing to users will have the recipients in BCC instead of TO, to avoid revealing E-mails to all recipients. +- Fixed layout issue of the login checkbox "Remember me", under IE and Opera. - Fixed some javascript error messages under IE. diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 5e3da9c..dc62b7a 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -10,9 +10,11 @@ Patch contribution Translations - * Swedish Translation from Peter Kindström - * Polish Translation from Piotr Baranowski - * Dutch Translation from Stanley Westerveld + * Japanese translation from Kevin Fujii + * Swedish translation from Peter Kindström + * Polish translation from Piotr Baranowski + * Dutch translation from Stanley Westerveld + * Catalan translation from Ferran Cabrer Testing diff --git a/utilities/IIS_7_rewrite_config.txt b/IIS_7_rewrite_config.txt similarity index 100% rename from utilities/IIS_7_rewrite_config.txt rename to IIS_7_rewrite_config.txt diff --git a/README b/README index b9a0b5d..6450f2a 100644 --- a/README +++ b/README @@ -1,5 +1,16 @@ -009-08-21 Reiner Jung +2010-04-20 Reiner Jung + +- To provide a simpler installation, all files will go under the web +dir, and there's no longer need to create a symlink. Have +this in mind when upgrading, replacing the symlink you currently have +with the files from this release. + +- Some of the new features need new configuration directives. To +upgrade, use the older config.php file, and only after a successful +upgrade you can take a look at config.default.php and fill out the new +directives into the config.php file NEW REQUIREMENTS: - Minimal supported PHP version is 5.2.4 +- For YubiKey support php-curl package is required diff --git a/README.md b/README.md index 9333cc1..ba08122 100644 --- a/README.md +++ b/README.md @@ -1 +1,4 @@ -import things form https://sourceforge.net/projects/communityid/files/ +CommunityID +=========== + +PHP OpenID Server \ No newline at end of file diff --git a/config.default.php b/config.default.php index c274018..628844b 100644 --- a/config.default.php +++ b/config.default.php @@ -9,6 +9,7 @@ $config['environment']['production'] = true; $config['environment']['YDN'] = true; $config['environment']['ajax_slowdown'] = 0; $config['environment']['keep_history_days'] = 90; +$config['environment']['unconfirmed_accounts_days_expire'] = 0; # Enable / Disable account self-registration. $config['environment']['registrations_enabled'] = true; @@ -18,12 +19,20 @@ $config['environment']['locale'] = 'auto'; $config['environment']['template'] = 'default'; + +# +# ------- HTML metadata ------------ +# +$config['metadata']['description'] = 'Community-ID, the open source OpenID provider'; +$config['metadata']['keywords'] = 'Community-ID, OpenID, Open source'; + + # # ------- LOGGING ------------ # # Enter a path relative to the installation's root dir, or an absolute path. # The file must exist, and be writable by the web server user -$config['logging']['location'] = 'log.txt'; +$config['logging']['location'] = '/var/log/communityid.log'; # Log level. You can use any of these constants or numbers: # Zend_Log::EMERG = 0; // Emergency: system is unusable @@ -71,6 +80,89 @@ $config['database']['params']['username'] = ''; $config['database']['params']['password'] = ''; +# +# ------- PASSWORDS ------------ +# +# Point to file with a blacklist of words +# The path must relative to Community-ID's root directory. +$config['security']['passwords']['dictionary'] = 'libs/Monkeys/Dictionaries/english.txt'; + +# If set to true, the password should not contain the username +$config['security']['passwords']['username_different'] = true; + +# Set the password's minimum length +$config['security']['passwords']['minimum_length'] = 6; + +# Set to true if the password should contain number characters +$config['security']['passwords']['include_numbers'] = true; + +# Set to true if the password should contain non alpha-numeric characters +$config['security']['passwords']['include_symbols'] = true; + +# Set to true if the password should contain both lower case and uppercase characters +$config['security']['passwords']['lowercase_and_uppercase'] = true; + + +# +# ------- USERNAMES ------------ +# +# Enter a regular expression (or litteral) for usernames you wish to exclude +# You can add as many entries as you want +$config['security']['usernames']['exclude'][0] = ''; + + +# +# ------- LDAP ------------ +# +# Warning: Only turn on for new installations. +# Ask for help if you want to migrate from a DB-based installation to an LDAP one. +# +$config['ldap']['enabled'] = false; +$config['ldap']['host'] = 'localhost'; +$config['ldap']['baseDn'] = 'ou=users,dc=community-id,dc=org'; +$config['ldap']['bindRequiresDn'] = true; + +# credentials for LDAP administator user. Username must be a DN. This is not the same +# as the Community-ID administrator user. +$config['ldap']['username'] = 'cn=admin,dc=community-id,dc=org'; +$config['ldap']['password'] = 'admin'; + +# CN for the Community-ID admin +$config['ldap']['admin'] = 'admin'; + +# If set to true, when the Account Info is updated or the account is deleted, +# then the LDAP record is updated/deleted as well. +# If set to false, the account info cannot be modified. +# This doesn't apply to the Personal Info Section. +$config['ldap']['keepRecordsSynced'] = true; + +# If set to true, the user can change his password, and the LDAP record is updated as well. +$config['ldap']['canChangePassword'] = true; + +# Hashing algorithm used to store passwords in LDAP +# If you prefer to leave the passwords unhashed, set to false. +$config['ldap']['passwordHashing'] = 'SSHA'; + +# These defaults are drawn from an inetOrgPerson LDAP Object class +$config['ldap']['fields']['nickname'] = 'cn'; +$config['ldap']['fields']['email'] = 'mail'; +$config['ldap']['fields']['fullname'] = 'givenname+sn'; +$config['ldap']['fields']['postcode'] = 'postalCode'; + + +# +# ------- YUBIKEY ------------ +# +$config['yubikey']['enabled'] = false; + +# Set to true to force utilization of the Yubikey, instead of passwords. +# Only use it for newer installations, as current existent users won't be able to log-in. +$config['yubikey']['force'] = false; + +$config['yubikey']['api_id'] = ''; +$config['yubikey']['api_key'] = ''; + + # # ------- E-MAIL ------------ # diff --git a/config.template.php b/config.template.php index a829ccc..fb6463e 100644 --- a/config.template.php +++ b/config.template.php @@ -9,6 +9,7 @@ $config['environment']['production'] = {environment.production}; $config['environment']['YDN'] = {environment.YDN}; $config['environment']['ajax_slowdown'] = {environment.ajax_slowdown}; $config['environment']['keep_history_days'] = {environment.keep_history_days}; +$config['environment']['unconfirmed_accounts_days_expire'] = {environment.unconfirmed_accounts_days_expire}; # Enable / Disable account self-registration. $config['environment']['registrations_enabled'] = {environment.registrations_enabled}; @@ -19,6 +20,14 @@ $config['environment']['locale'] = '{environment.locale}'; $config['environment']['template'] = '{environment.template}'; + +# +# ------- HTML metadata ------------ +# +$config['metadata']['description'] = '{metadata.description}'; +$config['metadata']['keywords'] = '{metadata.keywords}'; + + # # ------- LOGGING ------------ # @@ -72,6 +81,87 @@ $config['database']['params']['username'] = '{database.params.username}'; $config['database']['params']['password'] = '{database.params.password}'; + +# +# ------- PASSWORDS ------------ +# +# Point to file with a blacklist of words +# The path must relative to Community-ID's root directory. +$config['security']['passwords']['dictionary'] = '{security.passwords.dictionary}'; + +# If set to true, the password should not contain the username +$config['security']['passwords']['username_different'] = {security.passwords.username_different}; + +# Set the password's minimum length +$config['security']['passwords']['minimum_length'] = {security.passwords.minimum_length}; + +# Set to true if the password should contain number characters +$config['security']['passwords']['include_numbers'] = {security.passwords.include_numbers}; + +# Set to true if the password should contain non alpha-numeric characters +$config['security']['passwords']['include_symbols'] = {security.passwords.include_symbols}; + +# Set to true if the password should contain both lower case and uppercase characters +$config['security']['passwords']['lowercase_and_uppercase'] = {security.passwords.lowercase_and_uppercase}; + + +# +# ------- USERNAMES ------------ +# +# Enter a regular expression (or litteral) for usernames you wish to exclude +# You can add as many entries as you want +$config['security']['usernames']['exclude'][0] = '{security.usernames.exclude}'; + + +# +# ------- LDAP ------------ +# +$config['ldap']['enabled'] = {ldap.enabled}; +$config['ldap']['host'] = '{ldap.host}'; +$config['ldap']['baseDn'] = '{ldap.baseDn}'; +$config['ldap']['bindRequiresDn'] = {ldap.bindRequiresDn}; + +# credentials for LDAP administator user. Username must be a DN. This is not the same +# as the Community-ID administrator user. +$config['ldap']['username'] = '{ldap.username}'; +$config['ldap']['password'] = '{ldap.password}'; + +# CN for the Community-ID admin +$config['ldap']['admin'] = '{ldap.admin}'; + +# If set to true, when the Account Info is updated or the account is deleted, +# then the LDAP record is updated/deleted as well. +# If set to false, the account info cannot be modified. +# This doesn't apply to the Personal Info Section. +$config['ldap']['keepRecordsSynced'] = {ldap.keepRecordsSynced}; + +# If set to true, the user can change his password, and the LDAP record is updated as well. +$config['ldap']['canChangePassword'] = {ldap.canChangePassword}; + +# Hashing algorithm used to store passwords in LDAP +# If you prefer to leave the passwords unhashed, set to false. +$config['ldap']['passwordHashing'] = '{ldap.passwordHashing}'; + +# These defaults are drawn from an inetOrgPerson LDAP Object class +$config['ldap']['fields']['nickname'] = '{ldap.fields.nickname}'; +$config['ldap']['fields']['email'] = '{ldap.fields.email}'; +$config['ldap']['fields']['fullname'] = '{ldap.fields.fullname}'; +$config['ldap']['fields']['postcode'] = '{ldap.fields.postcode}'; + + +# +# ------- YUBIKEY ------------ +# +$config['yubikey']['enabled'] = {yubikey.enabled}; + +# Set to true to force utilization of the Yubikey, instead of passwords. +# Only use it for newer installations, as current existent users won't be able to log-in. +$config['yubikey']['force'] = {yubikey.force}; + +$config['yubikey']['api_id'] = '{yubikey.api_id}'; +$config['yubikey']['api_key'] = '{yubikey.api_key}'; + + # # ------- E-MAIL ------------ # diff --git a/webdir/favicon.ico b/favicon.ico old mode 100755 new mode 100644 similarity index 100% rename from webdir/favicon.ico rename to favicon.ico diff --git a/webdir/fckeditor/_upgrade.html b/fckeditor/_upgrade.html similarity index 100% rename from webdir/fckeditor/_upgrade.html rename to fckeditor/_upgrade.html diff --git a/webdir/fckeditor/_whatsnew.html b/fckeditor/_whatsnew.html similarity index 100% rename from webdir/fckeditor/_whatsnew.html rename to fckeditor/_whatsnew.html diff --git a/webdir/fckeditor/_whatsnew_history.html b/fckeditor/_whatsnew_history.html similarity index 100% rename from webdir/fckeditor/_whatsnew_history.html rename to fckeditor/_whatsnew_history.html diff --git a/webdir/fckeditor/editor/_source/classes/fckcontextmenu.js b/fckeditor/editor/_source/classes/fckcontextmenu.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckcontextmenu.js rename to fckeditor/editor/_source/classes/fckcontextmenu.js diff --git a/webdir/fckeditor/editor/_source/classes/fckdataprocessor.js b/fckeditor/editor/_source/classes/fckdataprocessor.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckdataprocessor.js rename to fckeditor/editor/_source/classes/fckdataprocessor.js diff --git a/webdir/fckeditor/editor/_source/classes/fckdocumentfragment_gecko.js b/fckeditor/editor/_source/classes/fckdocumentfragment_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckdocumentfragment_gecko.js rename to fckeditor/editor/_source/classes/fckdocumentfragment_gecko.js diff --git a/webdir/fckeditor/editor/_source/classes/fckdocumentfragment_ie.js b/fckeditor/editor/_source/classes/fckdocumentfragment_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckdocumentfragment_ie.js rename to fckeditor/editor/_source/classes/fckdocumentfragment_ie.js diff --git a/webdir/fckeditor/editor/_source/classes/fckdomrange.js b/fckeditor/editor/_source/classes/fckdomrange.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckdomrange.js rename to fckeditor/editor/_source/classes/fckdomrange.js diff --git a/webdir/fckeditor/editor/_source/classes/fckdomrange_gecko.js b/fckeditor/editor/_source/classes/fckdomrange_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckdomrange_gecko.js rename to fckeditor/editor/_source/classes/fckdomrange_gecko.js diff --git a/webdir/fckeditor/editor/_source/classes/fckdomrange_ie.js b/fckeditor/editor/_source/classes/fckdomrange_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckdomrange_ie.js rename to fckeditor/editor/_source/classes/fckdomrange_ie.js diff --git a/webdir/fckeditor/editor/_source/classes/fckdomrangeiterator.js b/fckeditor/editor/_source/classes/fckdomrangeiterator.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckdomrangeiterator.js rename to fckeditor/editor/_source/classes/fckdomrangeiterator.js diff --git a/webdir/fckeditor/editor/_source/classes/fckeditingarea.js b/fckeditor/editor/_source/classes/fckeditingarea.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckeditingarea.js rename to fckeditor/editor/_source/classes/fckeditingarea.js diff --git a/webdir/fckeditor/editor/_source/classes/fckelementpath.js b/fckeditor/editor/_source/classes/fckelementpath.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckelementpath.js rename to fckeditor/editor/_source/classes/fckelementpath.js diff --git a/webdir/fckeditor/editor/_source/classes/fckenterkey.js b/fckeditor/editor/_source/classes/fckenterkey.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckenterkey.js rename to fckeditor/editor/_source/classes/fckenterkey.js diff --git a/webdir/fckeditor/editor/_source/classes/fckevents.js b/fckeditor/editor/_source/classes/fckevents.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckevents.js rename to fckeditor/editor/_source/classes/fckevents.js diff --git a/webdir/fckeditor/editor/_source/classes/fckhtmliterator.js b/fckeditor/editor/_source/classes/fckhtmliterator.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckhtmliterator.js rename to fckeditor/editor/_source/classes/fckhtmliterator.js diff --git a/webdir/fckeditor/editor/_source/classes/fckicon.js b/fckeditor/editor/_source/classes/fckicon.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckicon.js rename to fckeditor/editor/_source/classes/fckicon.js diff --git a/webdir/fckeditor/editor/_source/classes/fckiecleanup.js b/fckeditor/editor/_source/classes/fckiecleanup.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckiecleanup.js rename to fckeditor/editor/_source/classes/fckiecleanup.js diff --git a/webdir/fckeditor/editor/_source/classes/fckimagepreloader.js b/fckeditor/editor/_source/classes/fckimagepreloader.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckimagepreloader.js rename to fckeditor/editor/_source/classes/fckimagepreloader.js diff --git a/webdir/fckeditor/editor/_source/classes/fckkeystrokehandler.js b/fckeditor/editor/_source/classes/fckkeystrokehandler.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckkeystrokehandler.js rename to fckeditor/editor/_source/classes/fckkeystrokehandler.js diff --git a/webdir/fckeditor/editor/_source/classes/fckmenublock.js b/fckeditor/editor/_source/classes/fckmenublock.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckmenublock.js rename to fckeditor/editor/_source/classes/fckmenublock.js diff --git a/webdir/fckeditor/editor/_source/classes/fckmenublockpanel.js b/fckeditor/editor/_source/classes/fckmenublockpanel.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckmenublockpanel.js rename to fckeditor/editor/_source/classes/fckmenublockpanel.js diff --git a/webdir/fckeditor/editor/_source/classes/fckmenuitem.js b/fckeditor/editor/_source/classes/fckmenuitem.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckmenuitem.js rename to fckeditor/editor/_source/classes/fckmenuitem.js diff --git a/webdir/fckeditor/editor/_source/classes/fckpanel.js b/fckeditor/editor/_source/classes/fckpanel.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckpanel.js rename to fckeditor/editor/_source/classes/fckpanel.js diff --git a/webdir/fckeditor/editor/_source/classes/fckplugin.js b/fckeditor/editor/_source/classes/fckplugin.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckplugin.js rename to fckeditor/editor/_source/classes/fckplugin.js diff --git a/webdir/fckeditor/editor/_source/classes/fckspecialcombo.js b/fckeditor/editor/_source/classes/fckspecialcombo.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckspecialcombo.js rename to fckeditor/editor/_source/classes/fckspecialcombo.js diff --git a/webdir/fckeditor/editor/_source/classes/fckstyle.js b/fckeditor/editor/_source/classes/fckstyle.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckstyle.js rename to fckeditor/editor/_source/classes/fckstyle.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbar.js b/fckeditor/editor/_source/classes/fcktoolbar.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbar.js rename to fckeditor/editor/_source/classes/fcktoolbar.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarbreak_gecko.js b/fckeditor/editor/_source/classes/fcktoolbarbreak_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarbreak_gecko.js rename to fckeditor/editor/_source/classes/fcktoolbarbreak_gecko.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarbreak_ie.js b/fckeditor/editor/_source/classes/fcktoolbarbreak_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarbreak_ie.js rename to fckeditor/editor/_source/classes/fcktoolbarbreak_ie.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarbutton.js b/fckeditor/editor/_source/classes/fcktoolbarbutton.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarbutton.js rename to fckeditor/editor/_source/classes/fcktoolbarbutton.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarbuttonui.js b/fckeditor/editor/_source/classes/fcktoolbarbuttonui.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarbuttonui.js rename to fckeditor/editor/_source/classes/fcktoolbarbuttonui.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarfontformatcombo.js b/fckeditor/editor/_source/classes/fcktoolbarfontformatcombo.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarfontformatcombo.js rename to fckeditor/editor/_source/classes/fcktoolbarfontformatcombo.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarfontscombo.js b/fckeditor/editor/_source/classes/fcktoolbarfontscombo.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarfontscombo.js rename to fckeditor/editor/_source/classes/fcktoolbarfontscombo.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarfontsizecombo.js b/fckeditor/editor/_source/classes/fcktoolbarfontsizecombo.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarfontsizecombo.js rename to fckeditor/editor/_source/classes/fcktoolbarfontsizecombo.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarpanelbutton.js b/fckeditor/editor/_source/classes/fcktoolbarpanelbutton.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarpanelbutton.js rename to fckeditor/editor/_source/classes/fcktoolbarpanelbutton.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarspecialcombo.js b/fckeditor/editor/_source/classes/fcktoolbarspecialcombo.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarspecialcombo.js rename to fckeditor/editor/_source/classes/fcktoolbarspecialcombo.js diff --git a/webdir/fckeditor/editor/_source/classes/fcktoolbarstylecombo.js b/fckeditor/editor/_source/classes/fcktoolbarstylecombo.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fcktoolbarstylecombo.js rename to fckeditor/editor/_source/classes/fcktoolbarstylecombo.js diff --git a/webdir/fckeditor/editor/_source/classes/fckw3crange.js b/fckeditor/editor/_source/classes/fckw3crange.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckw3crange.js rename to fckeditor/editor/_source/classes/fckw3crange.js diff --git a/webdir/fckeditor/editor/_source/classes/fckxml.js b/fckeditor/editor/_source/classes/fckxml.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckxml.js rename to fckeditor/editor/_source/classes/fckxml.js diff --git a/webdir/fckeditor/editor/_source/classes/fckxml_gecko.js b/fckeditor/editor/_source/classes/fckxml_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckxml_gecko.js rename to fckeditor/editor/_source/classes/fckxml_gecko.js diff --git a/webdir/fckeditor/editor/_source/classes/fckxml_ie.js b/fckeditor/editor/_source/classes/fckxml_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/classes/fckxml_ie.js rename to fckeditor/editor/_source/classes/fckxml_ie.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fck_othercommands.js b/fckeditor/editor/_source/commandclasses/fck_othercommands.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fck_othercommands.js rename to fckeditor/editor/_source/commandclasses/fck_othercommands.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckblockquotecommand.js b/fckeditor/editor/_source/commandclasses/fckblockquotecommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckblockquotecommand.js rename to fckeditor/editor/_source/commandclasses/fckblockquotecommand.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckcorestylecommand.js b/fckeditor/editor/_source/commandclasses/fckcorestylecommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckcorestylecommand.js rename to fckeditor/editor/_source/commandclasses/fckcorestylecommand.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckfitwindow.js b/fckeditor/editor/_source/commandclasses/fckfitwindow.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckfitwindow.js rename to fckeditor/editor/_source/commandclasses/fckfitwindow.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckindentcommands.js b/fckeditor/editor/_source/commandclasses/fckindentcommands.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckindentcommands.js rename to fckeditor/editor/_source/commandclasses/fckindentcommands.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckjustifycommands.js b/fckeditor/editor/_source/commandclasses/fckjustifycommands.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckjustifycommands.js rename to fckeditor/editor/_source/commandclasses/fckjustifycommands.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fcklistcommands.js b/fckeditor/editor/_source/commandclasses/fcklistcommands.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fcklistcommands.js rename to fckeditor/editor/_source/commandclasses/fcklistcommands.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fcknamedcommand.js b/fckeditor/editor/_source/commandclasses/fcknamedcommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fcknamedcommand.js rename to fckeditor/editor/_source/commandclasses/fcknamedcommand.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js b/fckeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js rename to fckeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckpastewordcommand.js b/fckeditor/editor/_source/commandclasses/fckpastewordcommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckpastewordcommand.js rename to fckeditor/editor/_source/commandclasses/fckpastewordcommand.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckremoveformatcommand.js b/fckeditor/editor/_source/commandclasses/fckremoveformatcommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckremoveformatcommand.js rename to fckeditor/editor/_source/commandclasses/fckremoveformatcommand.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckshowblocks.js b/fckeditor/editor/_source/commandclasses/fckshowblocks.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckshowblocks.js rename to fckeditor/editor/_source/commandclasses/fckshowblocks.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js b/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js rename to fckeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js b/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js rename to fckeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fckstylecommand.js b/fckeditor/editor/_source/commandclasses/fckstylecommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fckstylecommand.js rename to fckeditor/editor/_source/commandclasses/fckstylecommand.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fcktablecommand.js b/fckeditor/editor/_source/commandclasses/fcktablecommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fcktablecommand.js rename to fckeditor/editor/_source/commandclasses/fcktablecommand.js diff --git a/webdir/fckeditor/editor/_source/commandclasses/fcktextcolorcommand.js b/fckeditor/editor/_source/commandclasses/fcktextcolorcommand.js similarity index 100% rename from webdir/fckeditor/editor/_source/commandclasses/fcktextcolorcommand.js rename to fckeditor/editor/_source/commandclasses/fcktextcolorcommand.js diff --git a/webdir/fckeditor/editor/_source/fckconstants.js b/fckeditor/editor/_source/fckconstants.js similarity index 100% rename from webdir/fckeditor/editor/_source/fckconstants.js rename to fckeditor/editor/_source/fckconstants.js diff --git a/webdir/fckeditor/editor/_source/fckeditorapi.js b/fckeditor/editor/_source/fckeditorapi.js similarity index 100% rename from webdir/fckeditor/editor/_source/fckeditorapi.js rename to fckeditor/editor/_source/fckeditorapi.js diff --git a/webdir/fckeditor/editor/_source/fckjscoreextensions.js b/fckeditor/editor/_source/fckjscoreextensions.js similarity index 100% rename from webdir/fckeditor/editor/_source/fckjscoreextensions.js rename to fckeditor/editor/_source/fckjscoreextensions.js diff --git a/webdir/fckeditor/editor/_source/fckscriptloader.js b/fckeditor/editor/_source/fckscriptloader.js similarity index 100% rename from webdir/fckeditor/editor/_source/fckscriptloader.js rename to fckeditor/editor/_source/fckscriptloader.js diff --git a/webdir/fckeditor/editor/_source/internals/fck.js b/fckeditor/editor/_source/internals/fck.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fck.js rename to fckeditor/editor/_source/internals/fck.js diff --git a/webdir/fckeditor/editor/_source/internals/fck_contextmenu.js b/fckeditor/editor/_source/internals/fck_contextmenu.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fck_contextmenu.js rename to fckeditor/editor/_source/internals/fck_contextmenu.js diff --git a/webdir/fckeditor/editor/_source/internals/fck_gecko.js b/fckeditor/editor/_source/internals/fck_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fck_gecko.js rename to fckeditor/editor/_source/internals/fck_gecko.js diff --git a/webdir/fckeditor/editor/_source/internals/fck_ie.js b/fckeditor/editor/_source/internals/fck_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fck_ie.js rename to fckeditor/editor/_source/internals/fck_ie.js diff --git a/webdir/fckeditor/editor/_source/internals/fckbrowserinfo.js b/fckeditor/editor/_source/internals/fckbrowserinfo.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckbrowserinfo.js rename to fckeditor/editor/_source/internals/fckbrowserinfo.js diff --git a/webdir/fckeditor/editor/_source/internals/fckcodeformatter.js b/fckeditor/editor/_source/internals/fckcodeformatter.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckcodeformatter.js rename to fckeditor/editor/_source/internals/fckcodeformatter.js diff --git a/webdir/fckeditor/editor/_source/internals/fckcommands.js b/fckeditor/editor/_source/internals/fckcommands.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckcommands.js rename to fckeditor/editor/_source/internals/fckcommands.js diff --git a/webdir/fckeditor/editor/_source/internals/fckconfig.js b/fckeditor/editor/_source/internals/fckconfig.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckconfig.js rename to fckeditor/editor/_source/internals/fckconfig.js diff --git a/webdir/fckeditor/editor/_source/internals/fckdebug.js b/fckeditor/editor/_source/internals/fckdebug.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckdebug.js rename to fckeditor/editor/_source/internals/fckdebug.js diff --git a/webdir/fckeditor/editor/_source/internals/fckdebug_empty.js b/fckeditor/editor/_source/internals/fckdebug_empty.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckdebug_empty.js rename to fckeditor/editor/_source/internals/fckdebug_empty.js diff --git a/webdir/fckeditor/editor/_source/internals/fckdialog.js b/fckeditor/editor/_source/internals/fckdialog.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckdialog.js rename to fckeditor/editor/_source/internals/fckdialog.js diff --git a/webdir/fckeditor/editor/_source/internals/fckdocumentprocessor.js b/fckeditor/editor/_source/internals/fckdocumentprocessor.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckdocumentprocessor.js rename to fckeditor/editor/_source/internals/fckdocumentprocessor.js diff --git a/webdir/fckeditor/editor/_source/internals/fckdomtools.js b/fckeditor/editor/_source/internals/fckdomtools.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckdomtools.js rename to fckeditor/editor/_source/internals/fckdomtools.js diff --git a/webdir/fckeditor/editor/_source/internals/fcklanguagemanager.js b/fckeditor/editor/_source/internals/fcklanguagemanager.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcklanguagemanager.js rename to fckeditor/editor/_source/internals/fcklanguagemanager.js diff --git a/webdir/fckeditor/editor/_source/internals/fcklisthandler.js b/fckeditor/editor/_source/internals/fcklisthandler.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcklisthandler.js rename to fckeditor/editor/_source/internals/fcklisthandler.js diff --git a/webdir/fckeditor/editor/_source/internals/fcklistslib.js b/fckeditor/editor/_source/internals/fcklistslib.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcklistslib.js rename to fckeditor/editor/_source/internals/fcklistslib.js diff --git a/webdir/fckeditor/editor/_source/internals/fckplugins.js b/fckeditor/editor/_source/internals/fckplugins.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckplugins.js rename to fckeditor/editor/_source/internals/fckplugins.js diff --git a/webdir/fckeditor/editor/_source/internals/fckregexlib.js b/fckeditor/editor/_source/internals/fckregexlib.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckregexlib.js rename to fckeditor/editor/_source/internals/fckregexlib.js diff --git a/webdir/fckeditor/editor/_source/internals/fckselection.js b/fckeditor/editor/_source/internals/fckselection.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckselection.js rename to fckeditor/editor/_source/internals/fckselection.js diff --git a/webdir/fckeditor/editor/_source/internals/fckselection_gecko.js b/fckeditor/editor/_source/internals/fckselection_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckselection_gecko.js rename to fckeditor/editor/_source/internals/fckselection_gecko.js diff --git a/webdir/fckeditor/editor/_source/internals/fckselection_ie.js b/fckeditor/editor/_source/internals/fckselection_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckselection_ie.js rename to fckeditor/editor/_source/internals/fckselection_ie.js diff --git a/webdir/fckeditor/editor/_source/internals/fckstyles.js b/fckeditor/editor/_source/internals/fckstyles.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckstyles.js rename to fckeditor/editor/_source/internals/fckstyles.js diff --git a/webdir/fckeditor/editor/_source/internals/fcktablehandler.js b/fckeditor/editor/_source/internals/fcktablehandler.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcktablehandler.js rename to fckeditor/editor/_source/internals/fcktablehandler.js diff --git a/webdir/fckeditor/editor/_source/internals/fcktablehandler_gecko.js b/fckeditor/editor/_source/internals/fcktablehandler_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcktablehandler_gecko.js rename to fckeditor/editor/_source/internals/fcktablehandler_gecko.js diff --git a/webdir/fckeditor/editor/_source/internals/fcktablehandler_ie.js b/fckeditor/editor/_source/internals/fcktablehandler_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcktablehandler_ie.js rename to fckeditor/editor/_source/internals/fcktablehandler_ie.js diff --git a/webdir/fckeditor/editor/_source/internals/fcktoolbaritems.js b/fckeditor/editor/_source/internals/fcktoolbaritems.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcktoolbaritems.js rename to fckeditor/editor/_source/internals/fcktoolbaritems.js diff --git a/webdir/fckeditor/editor/_source/internals/fcktoolbarset.js b/fckeditor/editor/_source/internals/fcktoolbarset.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcktoolbarset.js rename to fckeditor/editor/_source/internals/fcktoolbarset.js diff --git a/webdir/fckeditor/editor/_source/internals/fcktools.js b/fckeditor/editor/_source/internals/fcktools.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcktools.js rename to fckeditor/editor/_source/internals/fcktools.js diff --git a/webdir/fckeditor/editor/_source/internals/fcktools_gecko.js b/fckeditor/editor/_source/internals/fcktools_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcktools_gecko.js rename to fckeditor/editor/_source/internals/fcktools_gecko.js diff --git a/webdir/fckeditor/editor/_source/internals/fcktools_ie.js b/fckeditor/editor/_source/internals/fcktools_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fcktools_ie.js rename to fckeditor/editor/_source/internals/fcktools_ie.js diff --git a/webdir/fckeditor/editor/_source/internals/fckundo.js b/fckeditor/editor/_source/internals/fckundo.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckundo.js rename to fckeditor/editor/_source/internals/fckundo.js diff --git a/webdir/fckeditor/editor/_source/internals/fckurlparams.js b/fckeditor/editor/_source/internals/fckurlparams.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckurlparams.js rename to fckeditor/editor/_source/internals/fckurlparams.js diff --git a/webdir/fckeditor/editor/_source/internals/fckxhtml.js b/fckeditor/editor/_source/internals/fckxhtml.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckxhtml.js rename to fckeditor/editor/_source/internals/fckxhtml.js diff --git a/webdir/fckeditor/editor/_source/internals/fckxhtml_gecko.js b/fckeditor/editor/_source/internals/fckxhtml_gecko.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckxhtml_gecko.js rename to fckeditor/editor/_source/internals/fckxhtml_gecko.js diff --git a/webdir/fckeditor/editor/_source/internals/fckxhtml_ie.js b/fckeditor/editor/_source/internals/fckxhtml_ie.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckxhtml_ie.js rename to fckeditor/editor/_source/internals/fckxhtml_ie.js diff --git a/webdir/fckeditor/editor/_source/internals/fckxhtmlentities.js b/fckeditor/editor/_source/internals/fckxhtmlentities.js similarity index 100% rename from webdir/fckeditor/editor/_source/internals/fckxhtmlentities.js rename to fckeditor/editor/_source/internals/fckxhtmlentities.js diff --git a/webdir/fckeditor/editor/css/behaviors/disablehandles.htc b/fckeditor/editor/css/behaviors/disablehandles.htc similarity index 100% rename from webdir/fckeditor/editor/css/behaviors/disablehandles.htc rename to fckeditor/editor/css/behaviors/disablehandles.htc diff --git a/webdir/fckeditor/editor/css/behaviors/showtableborders.htc b/fckeditor/editor/css/behaviors/showtableborders.htc similarity index 100% rename from webdir/fckeditor/editor/css/behaviors/showtableborders.htc rename to fckeditor/editor/css/behaviors/showtableborders.htc diff --git a/webdir/fckeditor/editor/css/fck_editorarea.css b/fckeditor/editor/css/fck_editorarea.css similarity index 100% rename from webdir/fckeditor/editor/css/fck_editorarea.css rename to fckeditor/editor/css/fck_editorarea.css diff --git a/webdir/fckeditor/editor/css/fck_internal.css b/fckeditor/editor/css/fck_internal.css similarity index 100% rename from webdir/fckeditor/editor/css/fck_internal.css rename to fckeditor/editor/css/fck_internal.css diff --git a/webdir/fckeditor/editor/css/fck_showtableborders_gecko.css b/fckeditor/editor/css/fck_showtableborders_gecko.css similarity index 100% rename from webdir/fckeditor/editor/css/fck_showtableborders_gecko.css rename to fckeditor/editor/css/fck_showtableborders_gecko.css diff --git a/webdir/fckeditor/editor/css/images/block_address.png b/fckeditor/editor/css/images/block_address.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_address.png rename to fckeditor/editor/css/images/block_address.png diff --git a/webdir/fckeditor/editor/css/images/block_blockquote.png b/fckeditor/editor/css/images/block_blockquote.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_blockquote.png rename to fckeditor/editor/css/images/block_blockquote.png diff --git a/webdir/fckeditor/editor/css/images/block_div.png b/fckeditor/editor/css/images/block_div.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_div.png rename to fckeditor/editor/css/images/block_div.png diff --git a/webdir/fckeditor/editor/css/images/block_h1.png b/fckeditor/editor/css/images/block_h1.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_h1.png rename to fckeditor/editor/css/images/block_h1.png diff --git a/webdir/fckeditor/editor/css/images/block_h2.png b/fckeditor/editor/css/images/block_h2.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_h2.png rename to fckeditor/editor/css/images/block_h2.png diff --git a/webdir/fckeditor/editor/css/images/block_h3.png b/fckeditor/editor/css/images/block_h3.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_h3.png rename to fckeditor/editor/css/images/block_h3.png diff --git a/webdir/fckeditor/editor/css/images/block_h4.png b/fckeditor/editor/css/images/block_h4.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_h4.png rename to fckeditor/editor/css/images/block_h4.png diff --git a/webdir/fckeditor/editor/css/images/block_h5.png b/fckeditor/editor/css/images/block_h5.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_h5.png rename to fckeditor/editor/css/images/block_h5.png diff --git a/webdir/fckeditor/editor/css/images/block_h6.png b/fckeditor/editor/css/images/block_h6.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_h6.png rename to fckeditor/editor/css/images/block_h6.png diff --git a/webdir/fckeditor/editor/css/images/block_p.png b/fckeditor/editor/css/images/block_p.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_p.png rename to fckeditor/editor/css/images/block_p.png diff --git a/webdir/fckeditor/editor/css/images/block_pre.png b/fckeditor/editor/css/images/block_pre.png similarity index 100% rename from webdir/fckeditor/editor/css/images/block_pre.png rename to fckeditor/editor/css/images/block_pre.png diff --git a/webdir/fckeditor/editor/css/images/fck_anchor.gif b/fckeditor/editor/css/images/fck_anchor.gif similarity index 100% rename from webdir/fckeditor/editor/css/images/fck_anchor.gif rename to fckeditor/editor/css/images/fck_anchor.gif diff --git a/webdir/fckeditor/editor/css/images/fck_flashlogo.gif b/fckeditor/editor/css/images/fck_flashlogo.gif similarity index 100% rename from webdir/fckeditor/editor/css/images/fck_flashlogo.gif rename to fckeditor/editor/css/images/fck_flashlogo.gif diff --git a/webdir/fckeditor/editor/css/images/fck_hiddenfield.gif b/fckeditor/editor/css/images/fck_hiddenfield.gif similarity index 100% rename from webdir/fckeditor/editor/css/images/fck_hiddenfield.gif rename to fckeditor/editor/css/images/fck_hiddenfield.gif diff --git a/webdir/fckeditor/editor/css/images/fck_pagebreak.gif b/fckeditor/editor/css/images/fck_pagebreak.gif similarity index 100% rename from webdir/fckeditor/editor/css/images/fck_pagebreak.gif rename to fckeditor/editor/css/images/fck_pagebreak.gif diff --git a/webdir/fckeditor/editor/css/images/fck_plugin.gif b/fckeditor/editor/css/images/fck_plugin.gif similarity index 100% rename from webdir/fckeditor/editor/css/images/fck_plugin.gif rename to fckeditor/editor/css/images/fck_plugin.gif diff --git a/webdir/fckeditor/editor/dialog/common/fck_dialog_common.css b/fckeditor/editor/dialog/common/fck_dialog_common.css similarity index 100% rename from webdir/fckeditor/editor/dialog/common/fck_dialog_common.css rename to fckeditor/editor/dialog/common/fck_dialog_common.css diff --git a/webdir/fckeditor/editor/dialog/common/fck_dialog_common.js b/fckeditor/editor/dialog/common/fck_dialog_common.js similarity index 100% rename from webdir/fckeditor/editor/dialog/common/fck_dialog_common.js rename to fckeditor/editor/dialog/common/fck_dialog_common.js diff --git a/webdir/fckeditor/editor/dialog/common/images/locked.gif b/fckeditor/editor/dialog/common/images/locked.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/common/images/locked.gif rename to fckeditor/editor/dialog/common/images/locked.gif diff --git a/webdir/fckeditor/editor/dialog/common/images/reset.gif b/fckeditor/editor/dialog/common/images/reset.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/common/images/reset.gif rename to fckeditor/editor/dialog/common/images/reset.gif diff --git a/webdir/fckeditor/editor/dialog/common/images/unlocked.gif b/fckeditor/editor/dialog/common/images/unlocked.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/common/images/unlocked.gif rename to fckeditor/editor/dialog/common/images/unlocked.gif diff --git a/webdir/fckeditor/editor/dialog/fck_about.html b/fckeditor/editor/dialog/fck_about.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_about.html rename to fckeditor/editor/dialog/fck_about.html diff --git a/webdir/fckeditor/editor/dialog/fck_about/logo_fckeditor.gif b/fckeditor/editor/dialog/fck_about/logo_fckeditor.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_about/logo_fckeditor.gif rename to fckeditor/editor/dialog/fck_about/logo_fckeditor.gif diff --git a/webdir/fckeditor/editor/dialog/fck_about/logo_fredck.gif b/fckeditor/editor/dialog/fck_about/logo_fredck.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_about/logo_fredck.gif rename to fckeditor/editor/dialog/fck_about/logo_fredck.gif diff --git a/webdir/fckeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif b/fckeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif rename to fckeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif diff --git a/webdir/fckeditor/editor/dialog/fck_anchor.html b/fckeditor/editor/dialog/fck_anchor.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_anchor.html rename to fckeditor/editor/dialog/fck_anchor.html diff --git a/webdir/fckeditor/editor/dialog/fck_button.html b/fckeditor/editor/dialog/fck_button.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_button.html rename to fckeditor/editor/dialog/fck_button.html diff --git a/webdir/fckeditor/editor/dialog/fck_checkbox.html b/fckeditor/editor/dialog/fck_checkbox.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_checkbox.html rename to fckeditor/editor/dialog/fck_checkbox.html diff --git a/webdir/fckeditor/editor/dialog/fck_colorselector.html b/fckeditor/editor/dialog/fck_colorselector.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_colorselector.html rename to fckeditor/editor/dialog/fck_colorselector.html diff --git a/webdir/fckeditor/editor/dialog/fck_div.html b/fckeditor/editor/dialog/fck_div.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_div.html rename to fckeditor/editor/dialog/fck_div.html diff --git a/webdir/fckeditor/editor/dialog/fck_docprops.html b/fckeditor/editor/dialog/fck_docprops.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_docprops.html rename to fckeditor/editor/dialog/fck_docprops.html diff --git a/webdir/fckeditor/editor/dialog/fck_docprops/fck_document_preview.html b/fckeditor/editor/dialog/fck_docprops/fck_document_preview.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_docprops/fck_document_preview.html rename to fckeditor/editor/dialog/fck_docprops/fck_document_preview.html diff --git a/webdir/fckeditor/editor/dialog/fck_flash.html b/fckeditor/editor/dialog/fck_flash.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_flash.html rename to fckeditor/editor/dialog/fck_flash.html diff --git a/webdir/fckeditor/editor/dialog/fck_flash/fck_flash.js b/fckeditor/editor/dialog/fck_flash/fck_flash.js similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_flash/fck_flash.js rename to fckeditor/editor/dialog/fck_flash/fck_flash.js diff --git a/webdir/fckeditor/editor/dialog/fck_flash/fck_flash_preview.html b/fckeditor/editor/dialog/fck_flash/fck_flash_preview.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_flash/fck_flash_preview.html rename to fckeditor/editor/dialog/fck_flash/fck_flash_preview.html diff --git a/webdir/fckeditor/editor/dialog/fck_form.html b/fckeditor/editor/dialog/fck_form.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_form.html rename to fckeditor/editor/dialog/fck_form.html diff --git a/webdir/fckeditor/editor/dialog/fck_hiddenfield.html b/fckeditor/editor/dialog/fck_hiddenfield.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_hiddenfield.html rename to fckeditor/editor/dialog/fck_hiddenfield.html diff --git a/webdir/fckeditor/editor/dialog/fck_image.html b/fckeditor/editor/dialog/fck_image.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_image.html rename to fckeditor/editor/dialog/fck_image.html diff --git a/webdir/fckeditor/editor/dialog/fck_image/fck_image.js b/fckeditor/editor/dialog/fck_image/fck_image.js similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_image/fck_image.js rename to fckeditor/editor/dialog/fck_image/fck_image.js diff --git a/webdir/fckeditor/editor/dialog/fck_image/fck_image_preview.html b/fckeditor/editor/dialog/fck_image/fck_image_preview.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_image/fck_image_preview.html rename to fckeditor/editor/dialog/fck_image/fck_image_preview.html diff --git a/webdir/fckeditor/editor/dialog/fck_link.html b/fckeditor/editor/dialog/fck_link.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_link.html rename to fckeditor/editor/dialog/fck_link.html diff --git a/webdir/fckeditor/editor/dialog/fck_link/fck_link.js b/fckeditor/editor/dialog/fck_link/fck_link.js similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_link/fck_link.js rename to fckeditor/editor/dialog/fck_link/fck_link.js diff --git a/webdir/fckeditor/editor/dialog/fck_listprop.html b/fckeditor/editor/dialog/fck_listprop.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_listprop.html rename to fckeditor/editor/dialog/fck_listprop.html diff --git a/webdir/fckeditor/editor/dialog/fck_paste.html b/fckeditor/editor/dialog/fck_paste.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_paste.html rename to fckeditor/editor/dialog/fck_paste.html diff --git a/webdir/fckeditor/editor/dialog/fck_radiobutton.html b/fckeditor/editor/dialog/fck_radiobutton.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_radiobutton.html rename to fckeditor/editor/dialog/fck_radiobutton.html diff --git a/webdir/fckeditor/editor/dialog/fck_replace.html b/fckeditor/editor/dialog/fck_replace.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_replace.html rename to fckeditor/editor/dialog/fck_replace.html diff --git a/webdir/fckeditor/editor/dialog/fck_select.html b/fckeditor/editor/dialog/fck_select.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_select.html rename to fckeditor/editor/dialog/fck_select.html diff --git a/webdir/fckeditor/editor/dialog/fck_select/fck_select.js b/fckeditor/editor/dialog/fck_select/fck_select.js similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_select/fck_select.js rename to fckeditor/editor/dialog/fck_select/fck_select.js diff --git a/webdir/fckeditor/editor/dialog/fck_smiley.html b/fckeditor/editor/dialog/fck_smiley.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_smiley.html rename to fckeditor/editor/dialog/fck_smiley.html diff --git a/webdir/fckeditor/editor/dialog/fck_source.html b/fckeditor/editor/dialog/fck_source.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_source.html rename to fckeditor/editor/dialog/fck_source.html diff --git a/webdir/fckeditor/editor/dialog/fck_specialchar.html b/fckeditor/editor/dialog/fck_specialchar.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_specialchar.html rename to fckeditor/editor/dialog/fck_specialchar.html diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages.html b/fckeditor/editor/dialog/fck_spellerpages.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages.html rename to fckeditor/editor/dialog/fck_spellerpages.html diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css diff --git a/webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js b/fckeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js rename to fckeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js diff --git a/webdir/fckeditor/editor/dialog/fck_table.html b/fckeditor/editor/dialog/fck_table.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_table.html rename to fckeditor/editor/dialog/fck_table.html diff --git a/webdir/fckeditor/editor/dialog/fck_tablecell.html b/fckeditor/editor/dialog/fck_tablecell.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_tablecell.html rename to fckeditor/editor/dialog/fck_tablecell.html diff --git a/webdir/fckeditor/editor/dialog/fck_template.html b/fckeditor/editor/dialog/fck_template.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_template.html rename to fckeditor/editor/dialog/fck_template.html diff --git a/webdir/fckeditor/editor/dialog/fck_template/images/template1.gif b/fckeditor/editor/dialog/fck_template/images/template1.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_template/images/template1.gif rename to fckeditor/editor/dialog/fck_template/images/template1.gif diff --git a/webdir/fckeditor/editor/dialog/fck_template/images/template2.gif b/fckeditor/editor/dialog/fck_template/images/template2.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_template/images/template2.gif rename to fckeditor/editor/dialog/fck_template/images/template2.gif diff --git a/webdir/fckeditor/editor/dialog/fck_template/images/template3.gif b/fckeditor/editor/dialog/fck_template/images/template3.gif similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_template/images/template3.gif rename to fckeditor/editor/dialog/fck_template/images/template3.gif diff --git a/webdir/fckeditor/editor/dialog/fck_textarea.html b/fckeditor/editor/dialog/fck_textarea.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_textarea.html rename to fckeditor/editor/dialog/fck_textarea.html diff --git a/webdir/fckeditor/editor/dialog/fck_textfield.html b/fckeditor/editor/dialog/fck_textfield.html similarity index 100% rename from webdir/fckeditor/editor/dialog/fck_textfield.html rename to fckeditor/editor/dialog/fck_textfield.html diff --git a/webdir/fckeditor/editor/dtd/fck_dtd_test.html b/fckeditor/editor/dtd/fck_dtd_test.html similarity index 100% rename from webdir/fckeditor/editor/dtd/fck_dtd_test.html rename to fckeditor/editor/dtd/fck_dtd_test.html diff --git a/webdir/fckeditor/editor/dtd/fck_xhtml10strict.js b/fckeditor/editor/dtd/fck_xhtml10strict.js similarity index 100% rename from webdir/fckeditor/editor/dtd/fck_xhtml10strict.js rename to fckeditor/editor/dtd/fck_xhtml10strict.js diff --git a/webdir/fckeditor/editor/dtd/fck_xhtml10transitional.js b/fckeditor/editor/dtd/fck_xhtml10transitional.js similarity index 100% rename from webdir/fckeditor/editor/dtd/fck_xhtml10transitional.js rename to fckeditor/editor/dtd/fck_xhtml10transitional.js diff --git a/webdir/fckeditor/editor/fckdebug.html b/fckeditor/editor/fckdebug.html similarity index 100% rename from webdir/fckeditor/editor/fckdebug.html rename to fckeditor/editor/fckdebug.html diff --git a/webdir/fckeditor/editor/fckdialog.html b/fckeditor/editor/fckdialog.html similarity index 100% rename from webdir/fckeditor/editor/fckdialog.html rename to fckeditor/editor/fckdialog.html diff --git a/webdir/fckeditor/editor/fckeditor.html b/fckeditor/editor/fckeditor.html similarity index 100% rename from webdir/fckeditor/editor/fckeditor.html rename to fckeditor/editor/fckeditor.html diff --git a/webdir/fckeditor/editor/fckeditor.original.html b/fckeditor/editor/fckeditor.original.html similarity index 100% rename from webdir/fckeditor/editor/fckeditor.original.html rename to fckeditor/editor/fckeditor.original.html diff --git a/webdir/fckeditor/editor/filemanager/browser/default/browser.css b/fckeditor/editor/filemanager/browser/default/browser.css similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/browser.css rename to fckeditor/editor/filemanager/browser/default/browser.css diff --git a/webdir/fckeditor/editor/filemanager/browser/default/browser.html b/fckeditor/editor/filemanager/browser/default/browser.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/browser.html rename to fckeditor/editor/filemanager/browser/default/browser.html diff --git a/webdir/fckeditor/editor/filemanager/browser/default/frmactualfolder.html b/fckeditor/editor/filemanager/browser/default/frmactualfolder.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/frmactualfolder.html rename to fckeditor/editor/filemanager/browser/default/frmactualfolder.html diff --git a/webdir/fckeditor/editor/filemanager/browser/default/frmcreatefolder.html b/fckeditor/editor/filemanager/browser/default/frmcreatefolder.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/frmcreatefolder.html rename to fckeditor/editor/filemanager/browser/default/frmcreatefolder.html diff --git a/webdir/fckeditor/editor/filemanager/browser/default/frmfolders.html b/fckeditor/editor/filemanager/browser/default/frmfolders.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/frmfolders.html rename to fckeditor/editor/filemanager/browser/default/frmfolders.html diff --git a/webdir/fckeditor/editor/filemanager/browser/default/frmresourceslist.html b/fckeditor/editor/filemanager/browser/default/frmresourceslist.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/frmresourceslist.html rename to fckeditor/editor/filemanager/browser/default/frmresourceslist.html diff --git a/webdir/fckeditor/editor/filemanager/browser/default/frmresourcetype.html b/fckeditor/editor/filemanager/browser/default/frmresourcetype.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/frmresourcetype.html rename to fckeditor/editor/filemanager/browser/default/frmresourcetype.html diff --git a/webdir/fckeditor/editor/filemanager/browser/default/frmupload.html b/fckeditor/editor/filemanager/browser/default/frmupload.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/frmupload.html rename to fckeditor/editor/filemanager/browser/default/frmupload.html diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif b/fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif rename to fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/Folder.gif b/fckeditor/editor/filemanager/browser/default/images/Folder.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/Folder.gif rename to fckeditor/editor/filemanager/browser/default/images/Folder.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/Folder32.gif b/fckeditor/editor/filemanager/browser/default/images/Folder32.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/Folder32.gif rename to fckeditor/editor/filemanager/browser/default/images/Folder32.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif b/fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif rename to fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif b/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif rename to fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/FolderUp.gif b/fckeditor/editor/filemanager/browser/default/images/FolderUp.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/FolderUp.gif rename to fckeditor/editor/filemanager/browser/default/images/FolderUp.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif b/fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/ai.gif b/fckeditor/editor/filemanager/browser/default/images/icons/ai.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/ai.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/ai.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/avi.gif b/fckeditor/editor/filemanager/browser/default/images/icons/avi.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/avi.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/avi.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif b/fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/cs.gif b/fckeditor/editor/filemanager/browser/default/images/icons/cs.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/cs.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/cs.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif b/fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/dll.gif b/fckeditor/editor/filemanager/browser/default/images/icons/dll.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/dll.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/dll.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/doc.gif b/fckeditor/editor/filemanager/browser/default/images/icons/doc.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/doc.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/doc.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/exe.gif b/fckeditor/editor/filemanager/browser/default/images/icons/exe.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/exe.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/exe.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/fla.gif b/fckeditor/editor/filemanager/browser/default/images/icons/fla.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/fla.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/fla.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/gif.gif b/fckeditor/editor/filemanager/browser/default/images/icons/gif.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/gif.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/gif.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/htm.gif b/fckeditor/editor/filemanager/browser/default/images/icons/htm.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/htm.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/htm.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/html.gif b/fckeditor/editor/filemanager/browser/default/images/icons/html.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/html.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/html.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif b/fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/js.gif b/fckeditor/editor/filemanager/browser/default/images/icons/js.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/js.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/js.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif b/fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif b/fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif b/fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/png.gif b/fckeditor/editor/filemanager/browser/default/images/icons/png.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/png.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/png.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif b/fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif b/fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/swf.gif b/fckeditor/editor/filemanager/browser/default/images/icons/swf.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/swf.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/swf.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/swt.gif b/fckeditor/editor/filemanager/browser/default/images/icons/swt.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/swt.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/swt.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/txt.gif b/fckeditor/editor/filemanager/browser/default/images/icons/txt.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/txt.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/txt.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif b/fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/xls.gif b/fckeditor/editor/filemanager/browser/default/images/icons/xls.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/xls.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/xls.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/xml.gif b/fckeditor/editor/filemanager/browser/default/images/icons/xml.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/xml.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/xml.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/icons/zip.gif b/fckeditor/editor/filemanager/browser/default/images/icons/zip.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/icons/zip.gif rename to fckeditor/editor/filemanager/browser/default/images/icons/zip.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/images/spacer.gif b/fckeditor/editor/filemanager/browser/default/images/spacer.gif similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/images/spacer.gif rename to fckeditor/editor/filemanager/browser/default/images/spacer.gif diff --git a/webdir/fckeditor/editor/filemanager/browser/default/js/common.js b/fckeditor/editor/filemanager/browser/default/js/common.js similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/js/common.js rename to fckeditor/editor/filemanager/browser/default/js/common.js diff --git a/webdir/fckeditor/editor/filemanager/browser/default/js/fckxml.js b/fckeditor/editor/filemanager/browser/default/js/fckxml.js similarity index 100% rename from webdir/fckeditor/editor/filemanager/browser/default/js/fckxml.js rename to fckeditor/editor/filemanager/browser/default/js/fckxml.js diff --git a/webdir/fckeditor/editor/filemanager/connectors/asp/basexml.asp b/fckeditor/editor/filemanager/connectors/asp/basexml.asp similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/asp/basexml.asp rename to fckeditor/editor/filemanager/connectors/asp/basexml.asp diff --git a/webdir/fckeditor/editor/filemanager/connectors/asp/class_upload.asp b/fckeditor/editor/filemanager/connectors/asp/class_upload.asp similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/asp/class_upload.asp rename to fckeditor/editor/filemanager/connectors/asp/class_upload.asp diff --git a/webdir/fckeditor/editor/filemanager/connectors/asp/commands.asp b/fckeditor/editor/filemanager/connectors/asp/commands.asp similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/asp/commands.asp rename to fckeditor/editor/filemanager/connectors/asp/commands.asp diff --git a/webdir/fckeditor/editor/filemanager/connectors/asp/config.asp b/fckeditor/editor/filemanager/connectors/asp/config.asp similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/asp/config.asp rename to fckeditor/editor/filemanager/connectors/asp/config.asp diff --git a/webdir/fckeditor/editor/filemanager/connectors/asp/connector.asp b/fckeditor/editor/filemanager/connectors/asp/connector.asp similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/asp/connector.asp rename to fckeditor/editor/filemanager/connectors/asp/connector.asp diff --git a/webdir/fckeditor/editor/filemanager/connectors/asp/io.asp b/fckeditor/editor/filemanager/connectors/asp/io.asp similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/asp/io.asp rename to fckeditor/editor/filemanager/connectors/asp/io.asp diff --git a/webdir/fckeditor/editor/filemanager/connectors/asp/upload.asp b/fckeditor/editor/filemanager/connectors/asp/upload.asp similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/asp/upload.asp rename to fckeditor/editor/filemanager/connectors/asp/upload.asp diff --git a/webdir/fckeditor/editor/filemanager/connectors/asp/util.asp b/fckeditor/editor/filemanager/connectors/asp/util.asp similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/asp/util.asp rename to fckeditor/editor/filemanager/connectors/asp/util.asp diff --git a/webdir/fckeditor/editor/filemanager/connectors/aspx/config.ascx b/fckeditor/editor/filemanager/connectors/aspx/config.ascx similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/aspx/config.ascx rename to fckeditor/editor/filemanager/connectors/aspx/config.ascx diff --git a/webdir/fckeditor/editor/filemanager/connectors/aspx/connector.aspx b/fckeditor/editor/filemanager/connectors/aspx/connector.aspx similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/aspx/connector.aspx rename to fckeditor/editor/filemanager/connectors/aspx/connector.aspx diff --git a/webdir/fckeditor/editor/filemanager/connectors/aspx/upload.aspx b/fckeditor/editor/filemanager/connectors/aspx/upload.aspx similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/aspx/upload.aspx rename to fckeditor/editor/filemanager/connectors/aspx/upload.aspx diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/ImageObject.cfc b/fckeditor/editor/filemanager/connectors/cfm/ImageObject.cfc similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/ImageObject.cfc rename to fckeditor/editor/filemanager/connectors/cfm/ImageObject.cfc diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm b/fckeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm rename to fckeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm b/fckeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm rename to fckeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm b/fckeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm rename to fckeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/cf_commands.cfm b/fckeditor/editor/filemanager/connectors/cfm/cf_commands.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/cf_commands.cfm rename to fckeditor/editor/filemanager/connectors/cfm/cf_commands.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/cf_connector.cfm b/fckeditor/editor/filemanager/connectors/cfm/cf_connector.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/cf_connector.cfm rename to fckeditor/editor/filemanager/connectors/cfm/cf_connector.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/cf_io.cfm b/fckeditor/editor/filemanager/connectors/cfm/cf_io.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/cf_io.cfm rename to fckeditor/editor/filemanager/connectors/cfm/cf_io.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/cf_upload.cfm b/fckeditor/editor/filemanager/connectors/cfm/cf_upload.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/cf_upload.cfm rename to fckeditor/editor/filemanager/connectors/cfm/cf_upload.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/cf_util.cfm b/fckeditor/editor/filemanager/connectors/cfm/cf_util.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/cf_util.cfm rename to fckeditor/editor/filemanager/connectors/cfm/cf_util.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/config.cfm b/fckeditor/editor/filemanager/connectors/cfm/config.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/config.cfm rename to fckeditor/editor/filemanager/connectors/cfm/config.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/connector.cfm b/fckeditor/editor/filemanager/connectors/cfm/connector.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/connector.cfm rename to fckeditor/editor/filemanager/connectors/cfm/connector.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/image.cfc b/fckeditor/editor/filemanager/connectors/cfm/image.cfc similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/image.cfc rename to fckeditor/editor/filemanager/connectors/cfm/image.cfc diff --git a/webdir/fckeditor/editor/filemanager/connectors/cfm/upload.cfm b/fckeditor/editor/filemanager/connectors/cfm/upload.cfm similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/cfm/upload.cfm rename to fckeditor/editor/filemanager/connectors/cfm/upload.cfm diff --git a/webdir/fckeditor/editor/filemanager/connectors/lasso/config.lasso b/fckeditor/editor/filemanager/connectors/lasso/config.lasso similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/lasso/config.lasso rename to fckeditor/editor/filemanager/connectors/lasso/config.lasso diff --git a/webdir/fckeditor/editor/filemanager/connectors/lasso/connector.lasso b/fckeditor/editor/filemanager/connectors/lasso/connector.lasso similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/lasso/connector.lasso rename to fckeditor/editor/filemanager/connectors/lasso/connector.lasso diff --git a/webdir/fckeditor/editor/filemanager/connectors/lasso/upload.lasso b/fckeditor/editor/filemanager/connectors/lasso/upload.lasso similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/lasso/upload.lasso rename to fckeditor/editor/filemanager/connectors/lasso/upload.lasso diff --git a/webdir/fckeditor/editor/filemanager/connectors/perl/basexml.pl b/fckeditor/editor/filemanager/connectors/perl/basexml.pl similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/perl/basexml.pl rename to fckeditor/editor/filemanager/connectors/perl/basexml.pl diff --git a/webdir/fckeditor/editor/filemanager/connectors/perl/commands.pl b/fckeditor/editor/filemanager/connectors/perl/commands.pl similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/perl/commands.pl rename to fckeditor/editor/filemanager/connectors/perl/commands.pl diff --git a/webdir/fckeditor/editor/filemanager/connectors/perl/config.pl b/fckeditor/editor/filemanager/connectors/perl/config.pl similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/perl/config.pl rename to fckeditor/editor/filemanager/connectors/perl/config.pl diff --git a/webdir/fckeditor/editor/filemanager/connectors/perl/connector.cgi b/fckeditor/editor/filemanager/connectors/perl/connector.cgi similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/perl/connector.cgi rename to fckeditor/editor/filemanager/connectors/perl/connector.cgi diff --git a/webdir/fckeditor/editor/filemanager/connectors/perl/io.pl b/fckeditor/editor/filemanager/connectors/perl/io.pl similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/perl/io.pl rename to fckeditor/editor/filemanager/connectors/perl/io.pl diff --git a/webdir/fckeditor/editor/filemanager/connectors/perl/upload.cgi b/fckeditor/editor/filemanager/connectors/perl/upload.cgi similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/perl/upload.cgi rename to fckeditor/editor/filemanager/connectors/perl/upload.cgi diff --git a/webdir/fckeditor/editor/filemanager/connectors/perl/upload_fck.pl b/fckeditor/editor/filemanager/connectors/perl/upload_fck.pl similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/perl/upload_fck.pl rename to fckeditor/editor/filemanager/connectors/perl/upload_fck.pl diff --git a/webdir/fckeditor/editor/filemanager/connectors/perl/util.pl b/fckeditor/editor/filemanager/connectors/perl/util.pl similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/perl/util.pl rename to fckeditor/editor/filemanager/connectors/perl/util.pl diff --git a/webdir/fckeditor/editor/filemanager/connectors/php/basexml.php b/fckeditor/editor/filemanager/connectors/php/basexml.php similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/php/basexml.php rename to fckeditor/editor/filemanager/connectors/php/basexml.php diff --git a/webdir/fckeditor/editor/filemanager/connectors/php/commands.php b/fckeditor/editor/filemanager/connectors/php/commands.php similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/php/commands.php rename to fckeditor/editor/filemanager/connectors/php/commands.php diff --git a/webdir/fckeditor/editor/filemanager/connectors/php/config.php b/fckeditor/editor/filemanager/connectors/php/config.php similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/php/config.php rename to fckeditor/editor/filemanager/connectors/php/config.php diff --git a/webdir/fckeditor/editor/filemanager/connectors/php/connector.php b/fckeditor/editor/filemanager/connectors/php/connector.php similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/php/connector.php rename to fckeditor/editor/filemanager/connectors/php/connector.php diff --git a/webdir/fckeditor/editor/filemanager/connectors/php/io.php b/fckeditor/editor/filemanager/connectors/php/io.php similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/php/io.php rename to fckeditor/editor/filemanager/connectors/php/io.php diff --git a/webdir/fckeditor/editor/filemanager/connectors/php/phpcompat.php b/fckeditor/editor/filemanager/connectors/php/phpcompat.php similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/php/phpcompat.php rename to fckeditor/editor/filemanager/connectors/php/phpcompat.php diff --git a/webdir/fckeditor/editor/filemanager/connectors/php/upload.php b/fckeditor/editor/filemanager/connectors/php/upload.php similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/php/upload.php rename to fckeditor/editor/filemanager/connectors/php/upload.php diff --git a/webdir/fckeditor/editor/filemanager/connectors/php/util.php b/fckeditor/editor/filemanager/connectors/php/util.php similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/php/util.php rename to fckeditor/editor/filemanager/connectors/php/util.php diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/config.py b/fckeditor/editor/filemanager/connectors/py/config.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/config.py rename to fckeditor/editor/filemanager/connectors/py/config.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/connector.py b/fckeditor/editor/filemanager/connectors/py/connector.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/connector.py rename to fckeditor/editor/filemanager/connectors/py/connector.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/fckcommands.py b/fckeditor/editor/filemanager/connectors/py/fckcommands.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/fckcommands.py rename to fckeditor/editor/filemanager/connectors/py/fckcommands.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/fckconnector.py b/fckeditor/editor/filemanager/connectors/py/fckconnector.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/fckconnector.py rename to fckeditor/editor/filemanager/connectors/py/fckconnector.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/fckoutput.py b/fckeditor/editor/filemanager/connectors/py/fckoutput.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/fckoutput.py rename to fckeditor/editor/filemanager/connectors/py/fckoutput.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/fckutil.py b/fckeditor/editor/filemanager/connectors/py/fckutil.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/fckutil.py rename to fckeditor/editor/filemanager/connectors/py/fckutil.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/htaccess.txt b/fckeditor/editor/filemanager/connectors/py/htaccess.txt similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/htaccess.txt rename to fckeditor/editor/filemanager/connectors/py/htaccess.txt diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/upload.py b/fckeditor/editor/filemanager/connectors/py/upload.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/upload.py rename to fckeditor/editor/filemanager/connectors/py/upload.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/wsgi.py b/fckeditor/editor/filemanager/connectors/py/wsgi.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/wsgi.py rename to fckeditor/editor/filemanager/connectors/py/wsgi.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/py/zope.py b/fckeditor/editor/filemanager/connectors/py/zope.py similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/py/zope.py rename to fckeditor/editor/filemanager/connectors/py/zope.py diff --git a/webdir/fckeditor/editor/filemanager/connectors/test.html b/fckeditor/editor/filemanager/connectors/test.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/test.html rename to fckeditor/editor/filemanager/connectors/test.html diff --git a/webdir/fckeditor/editor/filemanager/connectors/uploadtest.html b/fckeditor/editor/filemanager/connectors/uploadtest.html similarity index 100% rename from webdir/fckeditor/editor/filemanager/connectors/uploadtest.html rename to fckeditor/editor/filemanager/connectors/uploadtest.html diff --git a/webdir/fckeditor/editor/images/anchor.gif b/fckeditor/editor/images/anchor.gif similarity index 100% rename from webdir/fckeditor/editor/images/anchor.gif rename to fckeditor/editor/images/anchor.gif diff --git a/webdir/fckeditor/editor/images/arrow_ltr.gif b/fckeditor/editor/images/arrow_ltr.gif similarity index 100% rename from webdir/fckeditor/editor/images/arrow_ltr.gif rename to fckeditor/editor/images/arrow_ltr.gif diff --git a/webdir/fckeditor/editor/images/arrow_rtl.gif b/fckeditor/editor/images/arrow_rtl.gif similarity index 100% rename from webdir/fckeditor/editor/images/arrow_rtl.gif rename to fckeditor/editor/images/arrow_rtl.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/angel_smile.gif b/fckeditor/editor/images/smiley/msn/angel_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/angel_smile.gif rename to fckeditor/editor/images/smiley/msn/angel_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/angry_smile.gif b/fckeditor/editor/images/smiley/msn/angry_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/angry_smile.gif rename to fckeditor/editor/images/smiley/msn/angry_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/broken_heart.gif b/fckeditor/editor/images/smiley/msn/broken_heart.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/broken_heart.gif rename to fckeditor/editor/images/smiley/msn/broken_heart.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/cake.gif b/fckeditor/editor/images/smiley/msn/cake.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/cake.gif rename to fckeditor/editor/images/smiley/msn/cake.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/confused_smile.gif b/fckeditor/editor/images/smiley/msn/confused_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/confused_smile.gif rename to fckeditor/editor/images/smiley/msn/confused_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/cry_smile.gif b/fckeditor/editor/images/smiley/msn/cry_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/cry_smile.gif rename to fckeditor/editor/images/smiley/msn/cry_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/devil_smile.gif b/fckeditor/editor/images/smiley/msn/devil_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/devil_smile.gif rename to fckeditor/editor/images/smiley/msn/devil_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/embaressed_smile.gif b/fckeditor/editor/images/smiley/msn/embaressed_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/embaressed_smile.gif rename to fckeditor/editor/images/smiley/msn/embaressed_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/envelope.gif b/fckeditor/editor/images/smiley/msn/envelope.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/envelope.gif rename to fckeditor/editor/images/smiley/msn/envelope.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/heart.gif b/fckeditor/editor/images/smiley/msn/heart.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/heart.gif rename to fckeditor/editor/images/smiley/msn/heart.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/kiss.gif b/fckeditor/editor/images/smiley/msn/kiss.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/kiss.gif rename to fckeditor/editor/images/smiley/msn/kiss.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/lightbulb.gif b/fckeditor/editor/images/smiley/msn/lightbulb.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/lightbulb.gif rename to fckeditor/editor/images/smiley/msn/lightbulb.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/omg_smile.gif b/fckeditor/editor/images/smiley/msn/omg_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/omg_smile.gif rename to fckeditor/editor/images/smiley/msn/omg_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/regular_smile.gif b/fckeditor/editor/images/smiley/msn/regular_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/regular_smile.gif rename to fckeditor/editor/images/smiley/msn/regular_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/sad_smile.gif b/fckeditor/editor/images/smiley/msn/sad_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/sad_smile.gif rename to fckeditor/editor/images/smiley/msn/sad_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/shades_smile.gif b/fckeditor/editor/images/smiley/msn/shades_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/shades_smile.gif rename to fckeditor/editor/images/smiley/msn/shades_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/teeth_smile.gif b/fckeditor/editor/images/smiley/msn/teeth_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/teeth_smile.gif rename to fckeditor/editor/images/smiley/msn/teeth_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/thumbs_down.gif b/fckeditor/editor/images/smiley/msn/thumbs_down.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/thumbs_down.gif rename to fckeditor/editor/images/smiley/msn/thumbs_down.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/thumbs_up.gif b/fckeditor/editor/images/smiley/msn/thumbs_up.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/thumbs_up.gif rename to fckeditor/editor/images/smiley/msn/thumbs_up.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/tounge_smile.gif b/fckeditor/editor/images/smiley/msn/tounge_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/tounge_smile.gif rename to fckeditor/editor/images/smiley/msn/tounge_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif b/fckeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif rename to fckeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif diff --git a/webdir/fckeditor/editor/images/smiley/msn/wink_smile.gif b/fckeditor/editor/images/smiley/msn/wink_smile.gif similarity index 100% rename from webdir/fckeditor/editor/images/smiley/msn/wink_smile.gif rename to fckeditor/editor/images/smiley/msn/wink_smile.gif diff --git a/webdir/fckeditor/editor/images/spacer.gif b/fckeditor/editor/images/spacer.gif similarity index 100% rename from webdir/fckeditor/editor/images/spacer.gif rename to fckeditor/editor/images/spacer.gif diff --git a/webdir/fckeditor/editor/js/fckadobeair.js b/fckeditor/editor/js/fckadobeair.js similarity index 100% rename from webdir/fckeditor/editor/js/fckadobeair.js rename to fckeditor/editor/js/fckadobeair.js diff --git a/webdir/fckeditor/editor/js/fckeditorcode_gecko.js b/fckeditor/editor/js/fckeditorcode_gecko.js similarity index 100% rename from webdir/fckeditor/editor/js/fckeditorcode_gecko.js rename to fckeditor/editor/js/fckeditorcode_gecko.js diff --git a/webdir/fckeditor/editor/js/fckeditorcode_ie.js b/fckeditor/editor/js/fckeditorcode_ie.js similarity index 100% rename from webdir/fckeditor/editor/js/fckeditorcode_ie.js rename to fckeditor/editor/js/fckeditorcode_ie.js diff --git a/webdir/fckeditor/editor/lang/_translationstatus.txt b/fckeditor/editor/lang/_translationstatus.txt similarity index 100% rename from webdir/fckeditor/editor/lang/_translationstatus.txt rename to fckeditor/editor/lang/_translationstatus.txt diff --git a/webdir/fckeditor/editor/lang/af.js b/fckeditor/editor/lang/af.js similarity index 100% rename from webdir/fckeditor/editor/lang/af.js rename to fckeditor/editor/lang/af.js diff --git a/webdir/fckeditor/editor/lang/ar.js b/fckeditor/editor/lang/ar.js similarity index 100% rename from webdir/fckeditor/editor/lang/ar.js rename to fckeditor/editor/lang/ar.js diff --git a/webdir/fckeditor/editor/lang/bg.js b/fckeditor/editor/lang/bg.js similarity index 100% rename from webdir/fckeditor/editor/lang/bg.js rename to fckeditor/editor/lang/bg.js diff --git a/webdir/fckeditor/editor/lang/bn.js b/fckeditor/editor/lang/bn.js similarity index 100% rename from webdir/fckeditor/editor/lang/bn.js rename to fckeditor/editor/lang/bn.js diff --git a/webdir/fckeditor/editor/lang/bs.js b/fckeditor/editor/lang/bs.js similarity index 100% rename from webdir/fckeditor/editor/lang/bs.js rename to fckeditor/editor/lang/bs.js diff --git a/webdir/fckeditor/editor/lang/ca.js b/fckeditor/editor/lang/ca.js similarity index 100% rename from webdir/fckeditor/editor/lang/ca.js rename to fckeditor/editor/lang/ca.js diff --git a/webdir/fckeditor/editor/lang/cs.js b/fckeditor/editor/lang/cs.js similarity index 100% rename from webdir/fckeditor/editor/lang/cs.js rename to fckeditor/editor/lang/cs.js diff --git a/webdir/fckeditor/editor/lang/da.js b/fckeditor/editor/lang/da.js similarity index 100% rename from webdir/fckeditor/editor/lang/da.js rename to fckeditor/editor/lang/da.js diff --git a/webdir/fckeditor/editor/lang/de.js b/fckeditor/editor/lang/de.js similarity index 100% rename from webdir/fckeditor/editor/lang/de.js rename to fckeditor/editor/lang/de.js diff --git a/webdir/fckeditor/editor/lang/el.js b/fckeditor/editor/lang/el.js similarity index 100% rename from webdir/fckeditor/editor/lang/el.js rename to fckeditor/editor/lang/el.js diff --git a/webdir/fckeditor/editor/lang/en-au.js b/fckeditor/editor/lang/en-au.js similarity index 100% rename from webdir/fckeditor/editor/lang/en-au.js rename to fckeditor/editor/lang/en-au.js diff --git a/webdir/fckeditor/editor/lang/en-ca.js b/fckeditor/editor/lang/en-ca.js similarity index 100% rename from webdir/fckeditor/editor/lang/en-ca.js rename to fckeditor/editor/lang/en-ca.js diff --git a/webdir/fckeditor/editor/lang/en-uk.js b/fckeditor/editor/lang/en-uk.js similarity index 100% rename from webdir/fckeditor/editor/lang/en-uk.js rename to fckeditor/editor/lang/en-uk.js diff --git a/webdir/fckeditor/editor/lang/en.js b/fckeditor/editor/lang/en.js similarity index 100% rename from webdir/fckeditor/editor/lang/en.js rename to fckeditor/editor/lang/en.js diff --git a/webdir/fckeditor/editor/lang/eo.js b/fckeditor/editor/lang/eo.js similarity index 100% rename from webdir/fckeditor/editor/lang/eo.js rename to fckeditor/editor/lang/eo.js diff --git a/webdir/fckeditor/editor/lang/es.js b/fckeditor/editor/lang/es.js similarity index 100% rename from webdir/fckeditor/editor/lang/es.js rename to fckeditor/editor/lang/es.js diff --git a/webdir/fckeditor/editor/lang/et.js b/fckeditor/editor/lang/et.js similarity index 100% rename from webdir/fckeditor/editor/lang/et.js rename to fckeditor/editor/lang/et.js diff --git a/webdir/fckeditor/editor/lang/eu.js b/fckeditor/editor/lang/eu.js similarity index 100% rename from webdir/fckeditor/editor/lang/eu.js rename to fckeditor/editor/lang/eu.js diff --git a/webdir/fckeditor/editor/lang/fa.js b/fckeditor/editor/lang/fa.js similarity index 100% rename from webdir/fckeditor/editor/lang/fa.js rename to fckeditor/editor/lang/fa.js diff --git a/webdir/fckeditor/editor/lang/fi.js b/fckeditor/editor/lang/fi.js similarity index 100% rename from webdir/fckeditor/editor/lang/fi.js rename to fckeditor/editor/lang/fi.js diff --git a/webdir/fckeditor/editor/lang/fo.js b/fckeditor/editor/lang/fo.js similarity index 100% rename from webdir/fckeditor/editor/lang/fo.js rename to fckeditor/editor/lang/fo.js diff --git a/webdir/fckeditor/editor/lang/fr-ca.js b/fckeditor/editor/lang/fr-ca.js similarity index 100% rename from webdir/fckeditor/editor/lang/fr-ca.js rename to fckeditor/editor/lang/fr-ca.js diff --git a/webdir/fckeditor/editor/lang/fr.js b/fckeditor/editor/lang/fr.js similarity index 100% rename from webdir/fckeditor/editor/lang/fr.js rename to fckeditor/editor/lang/fr.js diff --git a/webdir/fckeditor/editor/lang/gl.js b/fckeditor/editor/lang/gl.js similarity index 100% rename from webdir/fckeditor/editor/lang/gl.js rename to fckeditor/editor/lang/gl.js diff --git a/webdir/fckeditor/editor/lang/gu.js b/fckeditor/editor/lang/gu.js similarity index 100% rename from webdir/fckeditor/editor/lang/gu.js rename to fckeditor/editor/lang/gu.js diff --git a/webdir/fckeditor/editor/lang/he.js b/fckeditor/editor/lang/he.js similarity index 100% rename from webdir/fckeditor/editor/lang/he.js rename to fckeditor/editor/lang/he.js diff --git a/webdir/fckeditor/editor/lang/hi.js b/fckeditor/editor/lang/hi.js similarity index 100% rename from webdir/fckeditor/editor/lang/hi.js rename to fckeditor/editor/lang/hi.js diff --git a/webdir/fckeditor/editor/lang/hr.js b/fckeditor/editor/lang/hr.js similarity index 100% rename from webdir/fckeditor/editor/lang/hr.js rename to fckeditor/editor/lang/hr.js diff --git a/webdir/fckeditor/editor/lang/hu.js b/fckeditor/editor/lang/hu.js similarity index 100% rename from webdir/fckeditor/editor/lang/hu.js rename to fckeditor/editor/lang/hu.js diff --git a/webdir/fckeditor/editor/lang/is.js b/fckeditor/editor/lang/is.js similarity index 100% rename from webdir/fckeditor/editor/lang/is.js rename to fckeditor/editor/lang/is.js diff --git a/webdir/fckeditor/editor/lang/it.js b/fckeditor/editor/lang/it.js similarity index 100% rename from webdir/fckeditor/editor/lang/it.js rename to fckeditor/editor/lang/it.js diff --git a/webdir/fckeditor/editor/lang/ja.js b/fckeditor/editor/lang/ja.js similarity index 100% rename from webdir/fckeditor/editor/lang/ja.js rename to fckeditor/editor/lang/ja.js diff --git a/webdir/fckeditor/editor/lang/km.js b/fckeditor/editor/lang/km.js similarity index 100% rename from webdir/fckeditor/editor/lang/km.js rename to fckeditor/editor/lang/km.js diff --git a/webdir/fckeditor/editor/lang/ko.js b/fckeditor/editor/lang/ko.js similarity index 100% rename from webdir/fckeditor/editor/lang/ko.js rename to fckeditor/editor/lang/ko.js diff --git a/webdir/fckeditor/editor/lang/lt.js b/fckeditor/editor/lang/lt.js similarity index 100% rename from webdir/fckeditor/editor/lang/lt.js rename to fckeditor/editor/lang/lt.js diff --git a/webdir/fckeditor/editor/lang/lv.js b/fckeditor/editor/lang/lv.js similarity index 100% rename from webdir/fckeditor/editor/lang/lv.js rename to fckeditor/editor/lang/lv.js diff --git a/webdir/fckeditor/editor/lang/mn.js b/fckeditor/editor/lang/mn.js similarity index 100% rename from webdir/fckeditor/editor/lang/mn.js rename to fckeditor/editor/lang/mn.js diff --git a/webdir/fckeditor/editor/lang/ms.js b/fckeditor/editor/lang/ms.js similarity index 100% rename from webdir/fckeditor/editor/lang/ms.js rename to fckeditor/editor/lang/ms.js diff --git a/webdir/fckeditor/editor/lang/nb.js b/fckeditor/editor/lang/nb.js similarity index 100% rename from webdir/fckeditor/editor/lang/nb.js rename to fckeditor/editor/lang/nb.js diff --git a/webdir/fckeditor/editor/lang/nl.js b/fckeditor/editor/lang/nl.js similarity index 100% rename from webdir/fckeditor/editor/lang/nl.js rename to fckeditor/editor/lang/nl.js diff --git a/webdir/fckeditor/editor/lang/no.js b/fckeditor/editor/lang/no.js similarity index 100% rename from webdir/fckeditor/editor/lang/no.js rename to fckeditor/editor/lang/no.js diff --git a/webdir/fckeditor/editor/lang/pl.js b/fckeditor/editor/lang/pl.js similarity index 100% rename from webdir/fckeditor/editor/lang/pl.js rename to fckeditor/editor/lang/pl.js diff --git a/webdir/fckeditor/editor/lang/pt-br.js b/fckeditor/editor/lang/pt-br.js similarity index 100% rename from webdir/fckeditor/editor/lang/pt-br.js rename to fckeditor/editor/lang/pt-br.js diff --git a/webdir/fckeditor/editor/lang/pt.js b/fckeditor/editor/lang/pt.js similarity index 100% rename from webdir/fckeditor/editor/lang/pt.js rename to fckeditor/editor/lang/pt.js diff --git a/webdir/fckeditor/editor/lang/ro.js b/fckeditor/editor/lang/ro.js similarity index 100% rename from webdir/fckeditor/editor/lang/ro.js rename to fckeditor/editor/lang/ro.js diff --git a/webdir/fckeditor/editor/lang/ru.js b/fckeditor/editor/lang/ru.js similarity index 100% rename from webdir/fckeditor/editor/lang/ru.js rename to fckeditor/editor/lang/ru.js diff --git a/webdir/fckeditor/editor/lang/sk.js b/fckeditor/editor/lang/sk.js similarity index 100% rename from webdir/fckeditor/editor/lang/sk.js rename to fckeditor/editor/lang/sk.js diff --git a/webdir/fckeditor/editor/lang/sl.js b/fckeditor/editor/lang/sl.js similarity index 100% rename from webdir/fckeditor/editor/lang/sl.js rename to fckeditor/editor/lang/sl.js diff --git a/webdir/fckeditor/editor/lang/sr-latn.js b/fckeditor/editor/lang/sr-latn.js similarity index 100% rename from webdir/fckeditor/editor/lang/sr-latn.js rename to fckeditor/editor/lang/sr-latn.js diff --git a/webdir/fckeditor/editor/lang/sr.js b/fckeditor/editor/lang/sr.js similarity index 100% rename from webdir/fckeditor/editor/lang/sr.js rename to fckeditor/editor/lang/sr.js diff --git a/webdir/fckeditor/editor/lang/sv.js b/fckeditor/editor/lang/sv.js similarity index 100% rename from webdir/fckeditor/editor/lang/sv.js rename to fckeditor/editor/lang/sv.js diff --git a/webdir/fckeditor/editor/lang/th.js b/fckeditor/editor/lang/th.js similarity index 100% rename from webdir/fckeditor/editor/lang/th.js rename to fckeditor/editor/lang/th.js diff --git a/webdir/fckeditor/editor/lang/tr.js b/fckeditor/editor/lang/tr.js similarity index 100% rename from webdir/fckeditor/editor/lang/tr.js rename to fckeditor/editor/lang/tr.js diff --git a/webdir/fckeditor/editor/lang/uk.js b/fckeditor/editor/lang/uk.js similarity index 100% rename from webdir/fckeditor/editor/lang/uk.js rename to fckeditor/editor/lang/uk.js diff --git a/webdir/fckeditor/editor/lang/vi.js b/fckeditor/editor/lang/vi.js similarity index 100% rename from webdir/fckeditor/editor/lang/vi.js rename to fckeditor/editor/lang/vi.js diff --git a/webdir/fckeditor/editor/lang/zh-cn.js b/fckeditor/editor/lang/zh-cn.js similarity index 100% rename from webdir/fckeditor/editor/lang/zh-cn.js rename to fckeditor/editor/lang/zh-cn.js diff --git a/webdir/fckeditor/editor/lang/zh.js b/fckeditor/editor/lang/zh.js similarity index 100% rename from webdir/fckeditor/editor/lang/zh.js rename to fckeditor/editor/lang/zh.js diff --git a/webdir/fckeditor/editor/plugins/autogrow/fckplugin.js b/fckeditor/editor/plugins/autogrow/fckplugin.js similarity index 100% rename from webdir/fckeditor/editor/plugins/autogrow/fckplugin.js rename to fckeditor/editor/plugins/autogrow/fckplugin.js diff --git a/webdir/fckeditor/editor/plugins/bbcode/_sample/sample.config.js b/fckeditor/editor/plugins/bbcode/_sample/sample.config.js similarity index 100% rename from webdir/fckeditor/editor/plugins/bbcode/_sample/sample.config.js rename to fckeditor/editor/plugins/bbcode/_sample/sample.config.js diff --git a/webdir/fckeditor/editor/plugins/bbcode/_sample/sample.html b/fckeditor/editor/plugins/bbcode/_sample/sample.html similarity index 100% rename from webdir/fckeditor/editor/plugins/bbcode/_sample/sample.html rename to fckeditor/editor/plugins/bbcode/_sample/sample.html diff --git a/webdir/fckeditor/editor/plugins/bbcode/fckplugin.js b/fckeditor/editor/plugins/bbcode/fckplugin.js similarity index 100% rename from webdir/fckeditor/editor/plugins/bbcode/fckplugin.js rename to fckeditor/editor/plugins/bbcode/fckplugin.js diff --git a/webdir/fckeditor/editor/plugins/dragresizetable/fckplugin.js b/fckeditor/editor/plugins/dragresizetable/fckplugin.js similarity index 100% rename from webdir/fckeditor/editor/plugins/dragresizetable/fckplugin.js rename to fckeditor/editor/plugins/dragresizetable/fckplugin.js diff --git a/webdir/fckeditor/editor/plugins/placeholder/fck_placeholder.html b/fckeditor/editor/plugins/placeholder/fck_placeholder.html similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/fck_placeholder.html rename to fckeditor/editor/plugins/placeholder/fck_placeholder.html diff --git a/webdir/fckeditor/editor/plugins/placeholder/fckplugin.js b/fckeditor/editor/plugins/placeholder/fckplugin.js similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/fckplugin.js rename to fckeditor/editor/plugins/placeholder/fckplugin.js diff --git a/webdir/fckeditor/editor/plugins/placeholder/lang/de.js b/fckeditor/editor/plugins/placeholder/lang/de.js similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/lang/de.js rename to fckeditor/editor/plugins/placeholder/lang/de.js diff --git a/webdir/fckeditor/editor/plugins/placeholder/lang/en.js b/fckeditor/editor/plugins/placeholder/lang/en.js similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/lang/en.js rename to fckeditor/editor/plugins/placeholder/lang/en.js diff --git a/webdir/fckeditor/editor/plugins/placeholder/lang/es.js b/fckeditor/editor/plugins/placeholder/lang/es.js similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/lang/es.js rename to fckeditor/editor/plugins/placeholder/lang/es.js diff --git a/webdir/fckeditor/editor/plugins/placeholder/lang/fr.js b/fckeditor/editor/plugins/placeholder/lang/fr.js similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/lang/fr.js rename to fckeditor/editor/plugins/placeholder/lang/fr.js diff --git a/webdir/fckeditor/editor/plugins/placeholder/lang/it.js b/fckeditor/editor/plugins/placeholder/lang/it.js similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/lang/it.js rename to fckeditor/editor/plugins/placeholder/lang/it.js diff --git a/webdir/fckeditor/editor/plugins/placeholder/lang/pl.js b/fckeditor/editor/plugins/placeholder/lang/pl.js similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/lang/pl.js rename to fckeditor/editor/plugins/placeholder/lang/pl.js diff --git a/webdir/fckeditor/editor/plugins/placeholder/placeholder.gif b/fckeditor/editor/plugins/placeholder/placeholder.gif similarity index 100% rename from webdir/fckeditor/editor/plugins/placeholder/placeholder.gif rename to fckeditor/editor/plugins/placeholder/placeholder.gif diff --git a/webdir/fckeditor/editor/plugins/simplecommands/fckplugin.js b/fckeditor/editor/plugins/simplecommands/fckplugin.js similarity index 100% rename from webdir/fckeditor/editor/plugins/simplecommands/fckplugin.js rename to fckeditor/editor/plugins/simplecommands/fckplugin.js diff --git a/webdir/fckeditor/editor/plugins/tablecommands/fckplugin.js b/fckeditor/editor/plugins/tablecommands/fckplugin.js similarity index 100% rename from webdir/fckeditor/editor/plugins/tablecommands/fckplugin.js rename to fckeditor/editor/plugins/tablecommands/fckplugin.js diff --git a/webdir/fckeditor/editor/skins/_fckviewstrips.html b/fckeditor/editor/skins/_fckviewstrips.html similarity index 100% rename from webdir/fckeditor/editor/skins/_fckviewstrips.html rename to fckeditor/editor/skins/_fckviewstrips.html diff --git a/webdir/fckeditor/editor/skins/default/fck_dialog.css b/fckeditor/editor/skins/default/fck_dialog.css similarity index 100% rename from webdir/fckeditor/editor/skins/default/fck_dialog.css rename to fckeditor/editor/skins/default/fck_dialog.css diff --git a/webdir/fckeditor/editor/skins/default/fck_dialog_ie6.js b/fckeditor/editor/skins/default/fck_dialog_ie6.js similarity index 100% rename from webdir/fckeditor/editor/skins/default/fck_dialog_ie6.js rename to fckeditor/editor/skins/default/fck_dialog_ie6.js diff --git a/webdir/fckeditor/editor/skins/default/fck_editor.css b/fckeditor/editor/skins/default/fck_editor.css similarity index 100% rename from webdir/fckeditor/editor/skins/default/fck_editor.css rename to fckeditor/editor/skins/default/fck_editor.css diff --git a/webdir/fckeditor/editor/skins/default/fck_strip.gif b/fckeditor/editor/skins/default/fck_strip.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/fck_strip.gif rename to fckeditor/editor/skins/default/fck_strip.gif diff --git a/webdir/fckeditor/editor/skins/default/images/dialog.sides.gif b/fckeditor/editor/skins/default/images/dialog.sides.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/dialog.sides.gif rename to fckeditor/editor/skins/default/images/dialog.sides.gif diff --git a/webdir/fckeditor/editor/skins/default/images/dialog.sides.png b/fckeditor/editor/skins/default/images/dialog.sides.png similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/dialog.sides.png rename to fckeditor/editor/skins/default/images/dialog.sides.png diff --git a/webdir/fckeditor/editor/skins/default/images/dialog.sides.rtl.png b/fckeditor/editor/skins/default/images/dialog.sides.rtl.png similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/dialog.sides.rtl.png rename to fckeditor/editor/skins/default/images/dialog.sides.rtl.png diff --git a/webdir/fckeditor/editor/skins/default/images/sprites.gif b/fckeditor/editor/skins/default/images/sprites.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/sprites.gif rename to fckeditor/editor/skins/default/images/sprites.gif diff --git a/webdir/fckeditor/editor/skins/default/images/sprites.png b/fckeditor/editor/skins/default/images/sprites.png similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/sprites.png rename to fckeditor/editor/skins/default/images/sprites.png diff --git a/webdir/fckeditor/editor/skins/default/images/toolbar.arrowright.gif b/fckeditor/editor/skins/default/images/toolbar.arrowright.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/toolbar.arrowright.gif rename to fckeditor/editor/skins/default/images/toolbar.arrowright.gif diff --git a/webdir/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif b/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif rename to fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif diff --git a/webdir/fckeditor/editor/skins/default/images/toolbar.collapse.gif b/fckeditor/editor/skins/default/images/toolbar.collapse.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/toolbar.collapse.gif rename to fckeditor/editor/skins/default/images/toolbar.collapse.gif diff --git a/webdir/fckeditor/editor/skins/default/images/toolbar.end.gif b/fckeditor/editor/skins/default/images/toolbar.end.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/toolbar.end.gif rename to fckeditor/editor/skins/default/images/toolbar.end.gif diff --git a/webdir/fckeditor/editor/skins/default/images/toolbar.expand.gif b/fckeditor/editor/skins/default/images/toolbar.expand.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/toolbar.expand.gif rename to fckeditor/editor/skins/default/images/toolbar.expand.gif diff --git a/webdir/fckeditor/editor/skins/default/images/toolbar.separator.gif b/fckeditor/editor/skins/default/images/toolbar.separator.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/toolbar.separator.gif rename to fckeditor/editor/skins/default/images/toolbar.separator.gif diff --git a/webdir/fckeditor/editor/skins/default/images/toolbar.start.gif b/fckeditor/editor/skins/default/images/toolbar.start.gif similarity index 100% rename from webdir/fckeditor/editor/skins/default/images/toolbar.start.gif rename to fckeditor/editor/skins/default/images/toolbar.start.gif diff --git a/webdir/fckeditor/editor/skins/office2003/fck_dialog.css b/fckeditor/editor/skins/office2003/fck_dialog.css similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/fck_dialog.css rename to fckeditor/editor/skins/office2003/fck_dialog.css diff --git a/webdir/fckeditor/editor/skins/office2003/fck_dialog_ie6.js b/fckeditor/editor/skins/office2003/fck_dialog_ie6.js similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/fck_dialog_ie6.js rename to fckeditor/editor/skins/office2003/fck_dialog_ie6.js diff --git a/webdir/fckeditor/editor/skins/office2003/fck_editor.css b/fckeditor/editor/skins/office2003/fck_editor.css similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/fck_editor.css rename to fckeditor/editor/skins/office2003/fck_editor.css diff --git a/webdir/fckeditor/editor/skins/office2003/fck_strip.gif b/fckeditor/editor/skins/office2003/fck_strip.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/fck_strip.gif rename to fckeditor/editor/skins/office2003/fck_strip.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/dialog.sides.gif b/fckeditor/editor/skins/office2003/images/dialog.sides.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/dialog.sides.gif rename to fckeditor/editor/skins/office2003/images/dialog.sides.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/dialog.sides.png b/fckeditor/editor/skins/office2003/images/dialog.sides.png similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/dialog.sides.png rename to fckeditor/editor/skins/office2003/images/dialog.sides.png diff --git a/webdir/fckeditor/editor/skins/office2003/images/dialog.sides.rtl.png b/fckeditor/editor/skins/office2003/images/dialog.sides.rtl.png similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/dialog.sides.rtl.png rename to fckeditor/editor/skins/office2003/images/dialog.sides.rtl.png diff --git a/webdir/fckeditor/editor/skins/office2003/images/sprites.gif b/fckeditor/editor/skins/office2003/images/sprites.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/sprites.gif rename to fckeditor/editor/skins/office2003/images/sprites.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/sprites.png b/fckeditor/editor/skins/office2003/images/sprites.png similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/sprites.png rename to fckeditor/editor/skins/office2003/images/sprites.png diff --git a/webdir/fckeditor/editor/skins/office2003/images/toolbar.arrowright.gif b/fckeditor/editor/skins/office2003/images/toolbar.arrowright.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/toolbar.arrowright.gif rename to fckeditor/editor/skins/office2003/images/toolbar.arrowright.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/toolbar.bg.gif b/fckeditor/editor/skins/office2003/images/toolbar.bg.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/toolbar.bg.gif rename to fckeditor/editor/skins/office2003/images/toolbar.bg.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif b/fckeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif rename to fckeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/toolbar.collapse.gif b/fckeditor/editor/skins/office2003/images/toolbar.collapse.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/toolbar.collapse.gif rename to fckeditor/editor/skins/office2003/images/toolbar.collapse.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/toolbar.end.gif b/fckeditor/editor/skins/office2003/images/toolbar.end.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/toolbar.end.gif rename to fckeditor/editor/skins/office2003/images/toolbar.end.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/toolbar.expand.gif b/fckeditor/editor/skins/office2003/images/toolbar.expand.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/toolbar.expand.gif rename to fckeditor/editor/skins/office2003/images/toolbar.expand.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/toolbar.separator.gif b/fckeditor/editor/skins/office2003/images/toolbar.separator.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/toolbar.separator.gif rename to fckeditor/editor/skins/office2003/images/toolbar.separator.gif diff --git a/webdir/fckeditor/editor/skins/office2003/images/toolbar.start.gif b/fckeditor/editor/skins/office2003/images/toolbar.start.gif similarity index 100% rename from webdir/fckeditor/editor/skins/office2003/images/toolbar.start.gif rename to fckeditor/editor/skins/office2003/images/toolbar.start.gif diff --git a/webdir/fckeditor/editor/skins/silver/fck_dialog.css b/fckeditor/editor/skins/silver/fck_dialog.css similarity index 100% rename from webdir/fckeditor/editor/skins/silver/fck_dialog.css rename to fckeditor/editor/skins/silver/fck_dialog.css diff --git a/webdir/fckeditor/editor/skins/silver/fck_dialog_ie6.js b/fckeditor/editor/skins/silver/fck_dialog_ie6.js similarity index 100% rename from webdir/fckeditor/editor/skins/silver/fck_dialog_ie6.js rename to fckeditor/editor/skins/silver/fck_dialog_ie6.js diff --git a/webdir/fckeditor/editor/skins/silver/fck_editor.css b/fckeditor/editor/skins/silver/fck_editor.css similarity index 100% rename from webdir/fckeditor/editor/skins/silver/fck_editor.css rename to fckeditor/editor/skins/silver/fck_editor.css diff --git a/webdir/fckeditor/editor/skins/silver/fck_strip.gif b/fckeditor/editor/skins/silver/fck_strip.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/fck_strip.gif rename to fckeditor/editor/skins/silver/fck_strip.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/dialog.sides.gif b/fckeditor/editor/skins/silver/images/dialog.sides.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/dialog.sides.gif rename to fckeditor/editor/skins/silver/images/dialog.sides.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/dialog.sides.png b/fckeditor/editor/skins/silver/images/dialog.sides.png similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/dialog.sides.png rename to fckeditor/editor/skins/silver/images/dialog.sides.png diff --git a/webdir/fckeditor/editor/skins/silver/images/dialog.sides.rtl.png b/fckeditor/editor/skins/silver/images/dialog.sides.rtl.png similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/dialog.sides.rtl.png rename to fckeditor/editor/skins/silver/images/dialog.sides.rtl.png diff --git a/webdir/fckeditor/editor/skins/silver/images/sprites.gif b/fckeditor/editor/skins/silver/images/sprites.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/sprites.gif rename to fckeditor/editor/skins/silver/images/sprites.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/sprites.png b/fckeditor/editor/skins/silver/images/sprites.png similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/sprites.png rename to fckeditor/editor/skins/silver/images/sprites.png diff --git a/webdir/fckeditor/editor/skins/silver/images/toolbar.arrowright.gif b/fckeditor/editor/skins/silver/images/toolbar.arrowright.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/toolbar.arrowright.gif rename to fckeditor/editor/skins/silver/images/toolbar.arrowright.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/toolbar.buttonarrow.gif b/fckeditor/editor/skins/silver/images/toolbar.buttonarrow.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/toolbar.buttonarrow.gif rename to fckeditor/editor/skins/silver/images/toolbar.buttonarrow.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/toolbar.buttonbg.gif b/fckeditor/editor/skins/silver/images/toolbar.buttonbg.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/toolbar.buttonbg.gif rename to fckeditor/editor/skins/silver/images/toolbar.buttonbg.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/toolbar.collapse.gif b/fckeditor/editor/skins/silver/images/toolbar.collapse.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/toolbar.collapse.gif rename to fckeditor/editor/skins/silver/images/toolbar.collapse.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/toolbar.end.gif b/fckeditor/editor/skins/silver/images/toolbar.end.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/toolbar.end.gif rename to fckeditor/editor/skins/silver/images/toolbar.end.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/toolbar.expand.gif b/fckeditor/editor/skins/silver/images/toolbar.expand.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/toolbar.expand.gif rename to fckeditor/editor/skins/silver/images/toolbar.expand.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/toolbar.separator.gif b/fckeditor/editor/skins/silver/images/toolbar.separator.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/toolbar.separator.gif rename to fckeditor/editor/skins/silver/images/toolbar.separator.gif diff --git a/webdir/fckeditor/editor/skins/silver/images/toolbar.start.gif b/fckeditor/editor/skins/silver/images/toolbar.start.gif similarity index 100% rename from webdir/fckeditor/editor/skins/silver/images/toolbar.start.gif rename to fckeditor/editor/skins/silver/images/toolbar.start.gif diff --git a/webdir/fckeditor/editor/wsc/ciframe.html b/fckeditor/editor/wsc/ciframe.html similarity index 100% rename from webdir/fckeditor/editor/wsc/ciframe.html rename to fckeditor/editor/wsc/ciframe.html diff --git a/webdir/fckeditor/editor/wsc/tmpFrameset.html b/fckeditor/editor/wsc/tmpFrameset.html similarity index 100% rename from webdir/fckeditor/editor/wsc/tmpFrameset.html rename to fckeditor/editor/wsc/tmpFrameset.html diff --git a/webdir/fckeditor/editor/wsc/w.html b/fckeditor/editor/wsc/w.html similarity index 100% rename from webdir/fckeditor/editor/wsc/w.html rename to fckeditor/editor/wsc/w.html diff --git a/webdir/fckeditor/fckconfig.js b/fckeditor/fckconfig.js similarity index 100% rename from webdir/fckeditor/fckconfig.js rename to fckeditor/fckconfig.js diff --git a/webdir/fckeditor/fckeditor.afp b/fckeditor/fckeditor.afp similarity index 100% rename from webdir/fckeditor/fckeditor.afp rename to fckeditor/fckeditor.afp diff --git a/webdir/fckeditor/fckeditor.asp b/fckeditor/fckeditor.asp similarity index 100% rename from webdir/fckeditor/fckeditor.asp rename to fckeditor/fckeditor.asp diff --git a/webdir/fckeditor/fckeditor.cfc b/fckeditor/fckeditor.cfc similarity index 100% rename from webdir/fckeditor/fckeditor.cfc rename to fckeditor/fckeditor.cfc diff --git a/webdir/fckeditor/fckeditor.cfm b/fckeditor/fckeditor.cfm similarity index 100% rename from webdir/fckeditor/fckeditor.cfm rename to fckeditor/fckeditor.cfm diff --git a/webdir/fckeditor/fckeditor.js b/fckeditor/fckeditor.js similarity index 100% rename from webdir/fckeditor/fckeditor.js rename to fckeditor/fckeditor.js diff --git a/webdir/fckeditor/fckeditor.lasso b/fckeditor/fckeditor.lasso similarity index 100% rename from webdir/fckeditor/fckeditor.lasso rename to fckeditor/fckeditor.lasso diff --git a/webdir/fckeditor/fckeditor.php b/fckeditor/fckeditor.php similarity index 100% rename from webdir/fckeditor/fckeditor.php rename to fckeditor/fckeditor.php diff --git a/webdir/fckeditor/fckeditor.pl b/fckeditor/fckeditor.pl similarity index 100% rename from webdir/fckeditor/fckeditor.pl rename to fckeditor/fckeditor.pl diff --git a/webdir/fckeditor/fckeditor.py b/fckeditor/fckeditor.py similarity index 100% rename from webdir/fckeditor/fckeditor.py rename to fckeditor/fckeditor.py diff --git a/webdir/fckeditor/fckeditor_php4.php b/fckeditor/fckeditor_php4.php similarity index 100% rename from webdir/fckeditor/fckeditor_php4.php rename to fckeditor/fckeditor_php4.php diff --git a/webdir/fckeditor/fckeditor_php5.php b/fckeditor/fckeditor_php5.php similarity index 100% rename from webdir/fckeditor/fckeditor_php5.php rename to fckeditor/fckeditor_php5.php diff --git a/webdir/fckeditor/fckpackager.xml b/fckeditor/fckpackager.xml similarity index 100% rename from webdir/fckeditor/fckpackager.xml rename to fckeditor/fckpackager.xml diff --git a/webdir/fckeditor/fckstyles.xml b/fckeditor/fckstyles.xml similarity index 100% rename from webdir/fckeditor/fckstyles.xml rename to fckeditor/fckstyles.xml diff --git a/webdir/fckeditor/fcktemplates.xml b/fckeditor/fcktemplates.xml similarity index 100% rename from webdir/fckeditor/fcktemplates.xml rename to fckeditor/fcktemplates.xml diff --git a/webdir/fckeditor/fckutils.cfm b/fckeditor/fckutils.cfm similarity index 100% rename from webdir/fckeditor/fckutils.cfm rename to fckeditor/fckutils.cfm diff --git a/webdir/fckeditor/license.txt b/fckeditor/license.txt similarity index 100% rename from webdir/fckeditor/license.txt rename to fckeditor/license.txt diff --git a/webdir/images/bg_content.jpg b/images/bg_content.jpg similarity index 100% rename from webdir/images/bg_content.jpg rename to images/bg_content.jpg diff --git a/webdir/images/bg_foot.jpg b/images/bg_foot.jpg similarity index 100% rename from webdir/images/bg_foot.jpg rename to images/bg_foot.jpg diff --git a/webdir/images/bg_panel.gif b/images/bg_panel.gif similarity index 100% rename from webdir/images/bg_panel.gif rename to images/bg_panel.gif diff --git a/webdir/images/bg_panel.png b/images/bg_panel.png similarity index 100% rename from webdir/images/bg_panel.png rename to images/bg_panel.png diff --git a/webdir/images/bg_panel_title.gif b/images/bg_panel_title.gif similarity index 100% rename from webdir/images/bg_panel_title.gif rename to images/bg_panel_title.gif diff --git a/webdir/images/bg_title_article.gif b/images/bg_title_article.gif similarity index 100% rename from webdir/images/bg_title_article.gif rename to images/bg_title_article.gif diff --git a/webdir/images/bg_title_article_span.gif b/images/bg_title_article_span.gif similarity index 100% rename from webdir/images/bg_title_article_span.gif rename to images/bg_title_article_span.gif diff --git a/webdir/images/button_register_a.png b/images/button_register_a.png similarity index 100% rename from webdir/images/button_register_a.png rename to images/button_register_a.png diff --git a/webdir/images/button_register_span.png b/images/button_register_span.png similarity index 100% rename from webdir/images/button_register_span.png rename to images/button_register_span.png diff --git a/webdir/images/content_background.png b/images/content_background.png old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/content_background.png rename to images/content_background.png diff --git a/webdir/images/footer_background.png b/images/footer_background.png old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/footer_background.png rename to images/footer_background.png diff --git a/webdir/images/h2.png b/images/h2.png old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/h2.png rename to images/h2.png diff --git a/webdir/images/header_background.png b/images/header_background.png old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/header_background.png rename to images/header_background.png diff --git a/webdir/images/logo.gif b/images/logo.gif old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/logo.gif rename to images/logo.gif diff --git a/webdir/images/openid_small_logo.png b/images/openid_small_logo.png similarity index 100% rename from webdir/images/openid_small_logo.png rename to images/openid_small_logo.png diff --git a/webdir/images/progress.gif b/images/progress.gif similarity index 100% rename from webdir/images/progress.gif rename to images/progress.gif diff --git a/webdir/images/search_icon.png b/images/search_icon.png old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/search_icon.png rename to images/search_icon.png diff --git a/webdir/images/sidebar_border_left.png b/images/sidebar_border_left.png old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/sidebar_border_left.png rename to images/sidebar_border_left.png diff --git a/webdir/images/topnav_background.png b/images/topnav_background.png old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/topnav_background.png rename to images/topnav_background.png diff --git a/webdir/images/topnav_background_hover.png b/images/topnav_background_hover.png old mode 100755 new mode 100644 similarity index 100% rename from webdir/images/topnav_background_hover.png rename to images/topnav_background_hover.png diff --git a/images/yubiright_16x16.gif b/images/yubiright_16x16.gif new file mode 100644 index 0000000..81a69bc Binary files /dev/null and b/images/yubiright_16x16.gif differ diff --git a/index.html b/index.html deleted file mode 100644 index 6c333c0..0000000 --- a/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Community-ID - - - - - - -
-
- -
-
-
-
-

- Your Community-ID installation is not properly set up -

-

- The root directory of Community-ID must be placed outside the web root directory. -

-

- After you do that, make a symlink under your web root directory where you want to serve Community-ID, pointing to the "webdir" subdirectory of the Community-ID directory. -

-

- If for some reason you can't make symlinks, or you can't have your web server follow them, then just make a copy of the "webdir" directory, and then edit the index.php file, setting the APP_DIR constant to the location of the Community-ID root directory. -

-
-
-
-
- -
-
- - diff --git a/bootstrap.php b/index.php old mode 100755 new mode 100644 similarity index 75% rename from bootstrap.php rename to index.php index 9e8e755..283f9f2 --- a/bootstrap.php +++ b/index.php @@ -1,7 +1,7 @@ translate('Send reminder to accounts older than how many days?') ?>", "Are you sure you wish to delete this article?": "translate('Are you sure you wish to delete this article?') ?>", "reminder": "translate('reminder') ?>", - "reminders": "translate('reminders') ?>" + "reminders": "translate('reminders') ?>", + "Are you sure you wish to delete this profile?": "translate('Are you sure you wish to delete this profile?') ?>" } diff --git a/webdir/javascript/tools-min.js b/javascript/tools-min.js similarity index 100% rename from webdir/javascript/tools-min.js rename to javascript/tools-min.js diff --git a/webdir/javascript/yui/animation/animation-debug.js b/javascript/yui/animation/animation-debug.js similarity index 100% rename from webdir/javascript/yui/animation/animation-debug.js rename to javascript/yui/animation/animation-debug.js diff --git a/webdir/javascript/yui/animation/animation-min.js b/javascript/yui/animation/animation-min.js similarity index 100% rename from webdir/javascript/yui/animation/animation-min.js rename to javascript/yui/animation/animation-min.js diff --git a/webdir/javascript/yui/animation/animation.js b/javascript/yui/animation/animation.js similarity index 100% rename from webdir/javascript/yui/animation/animation.js rename to javascript/yui/animation/animation.js diff --git a/webdir/javascript/yui/assets/skins/sam/ajax-loader.gif b/javascript/yui/assets/skins/sam/ajax-loader.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/ajax-loader.gif rename to javascript/yui/assets/skins/sam/ajax-loader.gif diff --git a/webdir/javascript/yui/assets/skins/sam/asc.gif b/javascript/yui/assets/skins/sam/asc.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/asc.gif rename to javascript/yui/assets/skins/sam/asc.gif diff --git a/webdir/javascript/yui/assets/skins/sam/autocomplete.css b/javascript/yui/assets/skins/sam/autocomplete.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/autocomplete.css rename to javascript/yui/assets/skins/sam/autocomplete.css diff --git a/webdir/javascript/yui/assets/skins/sam/bg-h.gif b/javascript/yui/assets/skins/sam/bg-h.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/bg-h.gif rename to javascript/yui/assets/skins/sam/bg-h.gif diff --git a/webdir/javascript/yui/assets/skins/sam/bg-v.gif b/javascript/yui/assets/skins/sam/bg-v.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/bg-v.gif rename to javascript/yui/assets/skins/sam/bg-v.gif diff --git a/webdir/javascript/yui/assets/skins/sam/blankimage.png b/javascript/yui/assets/skins/sam/blankimage.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/blankimage.png rename to javascript/yui/assets/skins/sam/blankimage.png diff --git a/webdir/javascript/yui/assets/skins/sam/button.css b/javascript/yui/assets/skins/sam/button.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/button.css rename to javascript/yui/assets/skins/sam/button.css diff --git a/webdir/javascript/yui/assets/skins/sam/calendar.css b/javascript/yui/assets/skins/sam/calendar.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/calendar.css rename to javascript/yui/assets/skins/sam/calendar.css diff --git a/webdir/javascript/yui/assets/skins/sam/carousel.css b/javascript/yui/assets/skins/sam/carousel.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/carousel.css rename to javascript/yui/assets/skins/sam/carousel.css diff --git a/webdir/javascript/yui/assets/skins/sam/colorpicker.css b/javascript/yui/assets/skins/sam/colorpicker.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/colorpicker.css rename to javascript/yui/assets/skins/sam/colorpicker.css diff --git a/webdir/javascript/yui/assets/skins/sam/container.css b/javascript/yui/assets/skins/sam/container.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/container.css rename to javascript/yui/assets/skins/sam/container.css diff --git a/webdir/javascript/yui/assets/skins/sam/datatable.css b/javascript/yui/assets/skins/sam/datatable.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/datatable.css rename to javascript/yui/assets/skins/sam/datatable.css diff --git a/webdir/javascript/yui/assets/skins/sam/desc.gif b/javascript/yui/assets/skins/sam/desc.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/desc.gif rename to javascript/yui/assets/skins/sam/desc.gif diff --git a/webdir/javascript/yui/assets/skins/sam/dt-arrow-dn.png b/javascript/yui/assets/skins/sam/dt-arrow-dn.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/dt-arrow-dn.png rename to javascript/yui/assets/skins/sam/dt-arrow-dn.png diff --git a/webdir/javascript/yui/assets/skins/sam/dt-arrow-up.png b/javascript/yui/assets/skins/sam/dt-arrow-up.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/dt-arrow-up.png rename to javascript/yui/assets/skins/sam/dt-arrow-up.png diff --git a/webdir/javascript/yui/assets/skins/sam/editor-knob.gif b/javascript/yui/assets/skins/sam/editor-knob.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/editor-knob.gif rename to javascript/yui/assets/skins/sam/editor-knob.gif diff --git a/webdir/javascript/yui/assets/skins/sam/editor-sprite-active.gif b/javascript/yui/assets/skins/sam/editor-sprite-active.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/editor-sprite-active.gif rename to javascript/yui/assets/skins/sam/editor-sprite-active.gif diff --git a/webdir/javascript/yui/assets/skins/sam/editor-sprite.gif b/javascript/yui/assets/skins/sam/editor-sprite.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/editor-sprite.gif rename to javascript/yui/assets/skins/sam/editor-sprite.gif diff --git a/webdir/javascript/yui/assets/skins/sam/editor.css b/javascript/yui/assets/skins/sam/editor.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/editor.css rename to javascript/yui/assets/skins/sam/editor.css diff --git a/webdir/javascript/yui/assets/skins/sam/header_background.png b/javascript/yui/assets/skins/sam/header_background.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/header_background.png rename to javascript/yui/assets/skins/sam/header_background.png diff --git a/webdir/javascript/yui/assets/skins/sam/hue_bg.png b/javascript/yui/assets/skins/sam/hue_bg.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/hue_bg.png rename to javascript/yui/assets/skins/sam/hue_bg.png diff --git a/webdir/javascript/yui/assets/skins/sam/imagecropper.css b/javascript/yui/assets/skins/sam/imagecropper.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/imagecropper.css rename to javascript/yui/assets/skins/sam/imagecropper.css diff --git a/webdir/javascript/yui/assets/skins/sam/layout.css b/javascript/yui/assets/skins/sam/layout.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/layout.css rename to javascript/yui/assets/skins/sam/layout.css diff --git a/webdir/javascript/yui/assets/skins/sam/layout_sprite.png b/javascript/yui/assets/skins/sam/layout_sprite.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/layout_sprite.png rename to javascript/yui/assets/skins/sam/layout_sprite.png diff --git a/webdir/javascript/yui/assets/skins/sam/loading.gif b/javascript/yui/assets/skins/sam/loading.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/loading.gif rename to javascript/yui/assets/skins/sam/loading.gif diff --git a/webdir/javascript/yui/assets/skins/sam/logger.css b/javascript/yui/assets/skins/sam/logger.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/logger.css rename to javascript/yui/assets/skins/sam/logger.css diff --git a/webdir/javascript/yui/assets/skins/sam/menu-button-arrow-disabled.png b/javascript/yui/assets/skins/sam/menu-button-arrow-disabled.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menu-button-arrow-disabled.png rename to javascript/yui/assets/skins/sam/menu-button-arrow-disabled.png diff --git a/webdir/javascript/yui/assets/skins/sam/menu-button-arrow.png b/javascript/yui/assets/skins/sam/menu-button-arrow.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menu-button-arrow.png rename to javascript/yui/assets/skins/sam/menu-button-arrow.png diff --git a/webdir/javascript/yui/assets/skins/sam/menu.css b/javascript/yui/assets/skins/sam/menu.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menu.css rename to javascript/yui/assets/skins/sam/menu.css diff --git a/webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator.png b/javascript/yui/assets/skins/sam/menubaritem_submenuindicator.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator.png rename to javascript/yui/assets/skins/sam/menubaritem_submenuindicator.png diff --git a/webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator_disabled.png b/javascript/yui/assets/skins/sam/menubaritem_submenuindicator_disabled.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menubaritem_submenuindicator_disabled.png rename to javascript/yui/assets/skins/sam/menubaritem_submenuindicator_disabled.png diff --git a/webdir/javascript/yui/assets/skins/sam/menuitem_checkbox.png b/javascript/yui/assets/skins/sam/menuitem_checkbox.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menuitem_checkbox.png rename to javascript/yui/assets/skins/sam/menuitem_checkbox.png diff --git a/webdir/javascript/yui/assets/skins/sam/menuitem_checkbox_disabled.png b/javascript/yui/assets/skins/sam/menuitem_checkbox_disabled.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menuitem_checkbox_disabled.png rename to javascript/yui/assets/skins/sam/menuitem_checkbox_disabled.png diff --git a/webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator.png b/javascript/yui/assets/skins/sam/menuitem_submenuindicator.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator.png rename to javascript/yui/assets/skins/sam/menuitem_submenuindicator.png diff --git a/webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator_disabled.png b/javascript/yui/assets/skins/sam/menuitem_submenuindicator_disabled.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/menuitem_submenuindicator_disabled.png rename to javascript/yui/assets/skins/sam/menuitem_submenuindicator_disabled.png diff --git a/webdir/javascript/yui/assets/skins/sam/paginator.css b/javascript/yui/assets/skins/sam/paginator.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/paginator.css rename to javascript/yui/assets/skins/sam/paginator.css diff --git a/webdir/javascript/yui/assets/skins/sam/picker_mask.png b/javascript/yui/assets/skins/sam/picker_mask.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/picker_mask.png rename to javascript/yui/assets/skins/sam/picker_mask.png diff --git a/webdir/javascript/yui/assets/skins/sam/profilerviewer.css b/javascript/yui/assets/skins/sam/profilerviewer.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/profilerviewer.css rename to javascript/yui/assets/skins/sam/profilerviewer.css diff --git a/webdir/javascript/yui/assets/skins/sam/resize.css b/javascript/yui/assets/skins/sam/resize.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/resize.css rename to javascript/yui/assets/skins/sam/resize.css diff --git a/webdir/javascript/yui/assets/skins/sam/simpleeditor.css b/javascript/yui/assets/skins/sam/simpleeditor.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/simpleeditor.css rename to javascript/yui/assets/skins/sam/simpleeditor.css diff --git a/webdir/javascript/yui/assets/skins/sam/skin.css b/javascript/yui/assets/skins/sam/skin.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/skin.css rename to javascript/yui/assets/skins/sam/skin.css diff --git a/webdir/javascript/yui/assets/skins/sam/slider.css b/javascript/yui/assets/skins/sam/slider.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/slider.css rename to javascript/yui/assets/skins/sam/slider.css diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow-active.png b/javascript/yui/assets/skins/sam/split-button-arrow-active.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/split-button-arrow-active.png rename to javascript/yui/assets/skins/sam/split-button-arrow-active.png diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow-disabled.png b/javascript/yui/assets/skins/sam/split-button-arrow-disabled.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/split-button-arrow-disabled.png rename to javascript/yui/assets/skins/sam/split-button-arrow-disabled.png diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow-focus.png b/javascript/yui/assets/skins/sam/split-button-arrow-focus.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/split-button-arrow-focus.png rename to javascript/yui/assets/skins/sam/split-button-arrow-focus.png diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow-hover.png b/javascript/yui/assets/skins/sam/split-button-arrow-hover.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/split-button-arrow-hover.png rename to javascript/yui/assets/skins/sam/split-button-arrow-hover.png diff --git a/webdir/javascript/yui/assets/skins/sam/split-button-arrow.png b/javascript/yui/assets/skins/sam/split-button-arrow.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/split-button-arrow.png rename to javascript/yui/assets/skins/sam/split-button-arrow.png diff --git a/webdir/javascript/yui/assets/skins/sam/sprite.png b/javascript/yui/assets/skins/sam/sprite.png similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/sprite.png rename to javascript/yui/assets/skins/sam/sprite.png diff --git a/webdir/javascript/yui/assets/skins/sam/sprite.psd b/javascript/yui/assets/skins/sam/sprite.psd similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/sprite.psd rename to javascript/yui/assets/skins/sam/sprite.psd diff --git a/webdir/javascript/yui/assets/skins/sam/tabview.css b/javascript/yui/assets/skins/sam/tabview.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/tabview.css rename to javascript/yui/assets/skins/sam/tabview.css diff --git a/webdir/javascript/yui/assets/skins/sam/treeview-loading.gif b/javascript/yui/assets/skins/sam/treeview-loading.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/treeview-loading.gif rename to javascript/yui/assets/skins/sam/treeview-loading.gif diff --git a/webdir/javascript/yui/assets/skins/sam/treeview-sprite.gif b/javascript/yui/assets/skins/sam/treeview-sprite.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/treeview-sprite.gif rename to javascript/yui/assets/skins/sam/treeview-sprite.gif diff --git a/webdir/javascript/yui/assets/skins/sam/treeview.css b/javascript/yui/assets/skins/sam/treeview.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/treeview.css rename to javascript/yui/assets/skins/sam/treeview.css diff --git a/webdir/javascript/yui/assets/skins/sam/wait.gif b/javascript/yui/assets/skins/sam/wait.gif similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/wait.gif rename to javascript/yui/assets/skins/sam/wait.gif diff --git a/webdir/javascript/yui/assets/skins/sam/yuitest.css b/javascript/yui/assets/skins/sam/yuitest.css similarity index 100% rename from webdir/javascript/yui/assets/skins/sam/yuitest.css rename to javascript/yui/assets/skins/sam/yuitest.css diff --git a/webdir/javascript/yui/autocomplete/assets/autocomplete-core.css b/javascript/yui/autocomplete/assets/autocomplete-core.css similarity index 100% rename from webdir/javascript/yui/autocomplete/assets/autocomplete-core.css rename to javascript/yui/autocomplete/assets/autocomplete-core.css diff --git a/webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete-skin.css b/javascript/yui/autocomplete/assets/skins/sam/autocomplete-skin.css similarity index 100% rename from webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete-skin.css rename to javascript/yui/autocomplete/assets/skins/sam/autocomplete-skin.css diff --git a/webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete.css b/javascript/yui/autocomplete/assets/skins/sam/autocomplete.css similarity index 100% rename from webdir/javascript/yui/autocomplete/assets/skins/sam/autocomplete.css rename to javascript/yui/autocomplete/assets/skins/sam/autocomplete.css diff --git a/webdir/javascript/yui/autocomplete/autocomplete-debug.js b/javascript/yui/autocomplete/autocomplete-debug.js similarity index 100% rename from webdir/javascript/yui/autocomplete/autocomplete-debug.js rename to javascript/yui/autocomplete/autocomplete-debug.js diff --git a/webdir/javascript/yui/autocomplete/autocomplete-min.js b/javascript/yui/autocomplete/autocomplete-min.js similarity index 100% rename from webdir/javascript/yui/autocomplete/autocomplete-min.js rename to javascript/yui/autocomplete/autocomplete-min.js diff --git a/webdir/javascript/yui/autocomplete/autocomplete.js b/javascript/yui/autocomplete/autocomplete.js similarity index 100% rename from webdir/javascript/yui/autocomplete/autocomplete.js rename to javascript/yui/autocomplete/autocomplete.js diff --git a/webdir/javascript/yui/base/base-min.css b/javascript/yui/base/base-min.css similarity index 100% rename from webdir/javascript/yui/base/base-min.css rename to javascript/yui/base/base-min.css diff --git a/webdir/javascript/yui/base/base.css b/javascript/yui/base/base.css similarity index 100% rename from webdir/javascript/yui/base/base.css rename to javascript/yui/base/base.css diff --git a/webdir/javascript/yui/button/assets/button-core.css b/javascript/yui/button/assets/button-core.css similarity index 100% rename from webdir/javascript/yui/button/assets/button-core.css rename to javascript/yui/button/assets/button-core.css diff --git a/webdir/javascript/yui/button/assets/skins/sam/button-skin.css b/javascript/yui/button/assets/skins/sam/button-skin.css similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/button-skin.css rename to javascript/yui/button/assets/skins/sam/button-skin.css diff --git a/webdir/javascript/yui/button/assets/skins/sam/button.css b/javascript/yui/button/assets/skins/sam/button.css similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/button.css rename to javascript/yui/button/assets/skins/sam/button.css diff --git a/webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow-disabled.png b/javascript/yui/button/assets/skins/sam/menu-button-arrow-disabled.png similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow-disabled.png rename to javascript/yui/button/assets/skins/sam/menu-button-arrow-disabled.png diff --git a/webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow.png b/javascript/yui/button/assets/skins/sam/menu-button-arrow.png similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/menu-button-arrow.png rename to javascript/yui/button/assets/skins/sam/menu-button-arrow.png diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-active.png b/javascript/yui/button/assets/skins/sam/split-button-arrow-active.png similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-active.png rename to javascript/yui/button/assets/skins/sam/split-button-arrow-active.png diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-disabled.png b/javascript/yui/button/assets/skins/sam/split-button-arrow-disabled.png similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-disabled.png rename to javascript/yui/button/assets/skins/sam/split-button-arrow-disabled.png diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-focus.png b/javascript/yui/button/assets/skins/sam/split-button-arrow-focus.png similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-focus.png rename to javascript/yui/button/assets/skins/sam/split-button-arrow-focus.png diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-hover.png b/javascript/yui/button/assets/skins/sam/split-button-arrow-hover.png similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/split-button-arrow-hover.png rename to javascript/yui/button/assets/skins/sam/split-button-arrow-hover.png diff --git a/webdir/javascript/yui/button/assets/skins/sam/split-button-arrow.png b/javascript/yui/button/assets/skins/sam/split-button-arrow.png similarity index 100% rename from webdir/javascript/yui/button/assets/skins/sam/split-button-arrow.png rename to javascript/yui/button/assets/skins/sam/split-button-arrow.png diff --git a/webdir/javascript/yui/button/button-debug.js b/javascript/yui/button/button-debug.js similarity index 100% rename from webdir/javascript/yui/button/button-debug.js rename to javascript/yui/button/button-debug.js diff --git a/webdir/javascript/yui/button/button-min.js b/javascript/yui/button/button-min.js similarity index 100% rename from webdir/javascript/yui/button/button-min.js rename to javascript/yui/button/button-min.js diff --git a/webdir/javascript/yui/button/button.js b/javascript/yui/button/button.js similarity index 100% rename from webdir/javascript/yui/button/button.js rename to javascript/yui/button/button.js diff --git a/webdir/javascript/yui/calendar/assets/calendar-core.css b/javascript/yui/calendar/assets/calendar-core.css similarity index 100% rename from webdir/javascript/yui/calendar/assets/calendar-core.css rename to javascript/yui/calendar/assets/calendar-core.css diff --git a/webdir/javascript/yui/calendar/assets/calendar.css b/javascript/yui/calendar/assets/calendar.css similarity index 100% rename from webdir/javascript/yui/calendar/assets/calendar.css rename to javascript/yui/calendar/assets/calendar.css diff --git a/webdir/javascript/yui/calendar/assets/calgrad.png b/javascript/yui/calendar/assets/calgrad.png similarity index 100% rename from webdir/javascript/yui/calendar/assets/calgrad.png rename to javascript/yui/calendar/assets/calgrad.png diff --git a/webdir/javascript/yui/calendar/assets/callt.gif b/javascript/yui/calendar/assets/callt.gif similarity index 100% rename from webdir/javascript/yui/calendar/assets/callt.gif rename to javascript/yui/calendar/assets/callt.gif diff --git a/webdir/javascript/yui/calendar/assets/calrt.gif b/javascript/yui/calendar/assets/calrt.gif similarity index 100% rename from webdir/javascript/yui/calendar/assets/calrt.gif rename to javascript/yui/calendar/assets/calrt.gif diff --git a/webdir/javascript/yui/calendar/assets/calx.gif b/javascript/yui/calendar/assets/calx.gif similarity index 100% rename from webdir/javascript/yui/calendar/assets/calx.gif rename to javascript/yui/calendar/assets/calx.gif diff --git a/webdir/javascript/yui/calendar/assets/skins/sam/calendar-skin.css b/javascript/yui/calendar/assets/skins/sam/calendar-skin.css similarity index 100% rename from webdir/javascript/yui/calendar/assets/skins/sam/calendar-skin.css rename to javascript/yui/calendar/assets/skins/sam/calendar-skin.css diff --git a/webdir/javascript/yui/calendar/assets/skins/sam/calendar.css b/javascript/yui/calendar/assets/skins/sam/calendar.css similarity index 100% rename from webdir/javascript/yui/calendar/assets/skins/sam/calendar.css rename to javascript/yui/calendar/assets/skins/sam/calendar.css diff --git a/webdir/javascript/yui/calendar/calendar-debug.js b/javascript/yui/calendar/calendar-debug.js similarity index 100% rename from webdir/javascript/yui/calendar/calendar-debug.js rename to javascript/yui/calendar/calendar-debug.js diff --git a/webdir/javascript/yui/calendar/calendar-min.js b/javascript/yui/calendar/calendar-min.js similarity index 100% rename from webdir/javascript/yui/calendar/calendar-min.js rename to javascript/yui/calendar/calendar-min.js diff --git a/webdir/javascript/yui/calendar/calendar.js b/javascript/yui/calendar/calendar.js similarity index 100% rename from webdir/javascript/yui/calendar/calendar.js rename to javascript/yui/calendar/calendar.js diff --git a/webdir/javascript/yui/carousel/assets/ajax-loader.gif b/javascript/yui/carousel/assets/ajax-loader.gif similarity index 100% rename from webdir/javascript/yui/carousel/assets/ajax-loader.gif rename to javascript/yui/carousel/assets/ajax-loader.gif diff --git a/webdir/javascript/yui/carousel/assets/carousel-core.css b/javascript/yui/carousel/assets/carousel-core.css similarity index 100% rename from webdir/javascript/yui/carousel/assets/carousel-core.css rename to javascript/yui/carousel/assets/carousel-core.css diff --git a/webdir/javascript/yui/carousel/assets/skins/sam/ajax-loader.gif b/javascript/yui/carousel/assets/skins/sam/ajax-loader.gif similarity index 100% rename from webdir/javascript/yui/carousel/assets/skins/sam/ajax-loader.gif rename to javascript/yui/carousel/assets/skins/sam/ajax-loader.gif diff --git a/webdir/javascript/yui/carousel/assets/skins/sam/carousel-skin.css b/javascript/yui/carousel/assets/skins/sam/carousel-skin.css similarity index 100% rename from webdir/javascript/yui/carousel/assets/skins/sam/carousel-skin.css rename to javascript/yui/carousel/assets/skins/sam/carousel-skin.css diff --git a/webdir/javascript/yui/carousel/assets/skins/sam/carousel.css b/javascript/yui/carousel/assets/skins/sam/carousel.css similarity index 100% rename from webdir/javascript/yui/carousel/assets/skins/sam/carousel.css rename to javascript/yui/carousel/assets/skins/sam/carousel.css diff --git a/webdir/javascript/yui/carousel/carousel-debug.js b/javascript/yui/carousel/carousel-debug.js similarity index 100% rename from webdir/javascript/yui/carousel/carousel-debug.js rename to javascript/yui/carousel/carousel-debug.js diff --git a/webdir/javascript/yui/carousel/carousel-min.js b/javascript/yui/carousel/carousel-min.js similarity index 100% rename from webdir/javascript/yui/carousel/carousel-min.js rename to javascript/yui/carousel/carousel-min.js diff --git a/webdir/javascript/yui/carousel/carousel.js b/javascript/yui/carousel/carousel.js similarity index 100% rename from webdir/javascript/yui/carousel/carousel.js rename to javascript/yui/carousel/carousel.js diff --git a/webdir/javascript/yui/charts/assets/charts.swf b/javascript/yui/charts/assets/charts.swf similarity index 100% rename from webdir/javascript/yui/charts/assets/charts.swf rename to javascript/yui/charts/assets/charts.swf diff --git a/webdir/javascript/yui/charts/charts-debug.js b/javascript/yui/charts/charts-debug.js similarity index 100% rename from webdir/javascript/yui/charts/charts-debug.js rename to javascript/yui/charts/charts-debug.js diff --git a/webdir/javascript/yui/charts/charts-min.js b/javascript/yui/charts/charts-min.js similarity index 100% rename from webdir/javascript/yui/charts/charts-min.js rename to javascript/yui/charts/charts-min.js diff --git a/webdir/javascript/yui/charts/charts.js b/javascript/yui/charts/charts.js similarity index 100% rename from webdir/javascript/yui/charts/charts.js rename to javascript/yui/charts/charts.js diff --git a/webdir/javascript/yui/colorpicker/assets/colorpicker-core.css b/javascript/yui/colorpicker/assets/colorpicker-core.css similarity index 100% rename from webdir/javascript/yui/colorpicker/assets/colorpicker-core.css rename to javascript/yui/colorpicker/assets/colorpicker-core.css diff --git a/webdir/javascript/yui/colorpicker/assets/hue_thumb.png b/javascript/yui/colorpicker/assets/hue_thumb.png similarity index 100% rename from webdir/javascript/yui/colorpicker/assets/hue_thumb.png rename to javascript/yui/colorpicker/assets/hue_thumb.png diff --git a/webdir/javascript/yui/colorpicker/assets/picker_mask.png b/javascript/yui/colorpicker/assets/picker_mask.png similarity index 100% rename from webdir/javascript/yui/colorpicker/assets/picker_mask.png rename to javascript/yui/colorpicker/assets/picker_mask.png diff --git a/webdir/javascript/yui/colorpicker/assets/picker_thumb.png b/javascript/yui/colorpicker/assets/picker_thumb.png similarity index 100% rename from webdir/javascript/yui/colorpicker/assets/picker_thumb.png rename to javascript/yui/colorpicker/assets/picker_thumb.png diff --git a/webdir/javascript/yui/colorpicker/assets/skins/sam/colorpicker-skin.css b/javascript/yui/colorpicker/assets/skins/sam/colorpicker-skin.css similarity index 100% rename from webdir/javascript/yui/colorpicker/assets/skins/sam/colorpicker-skin.css rename to javascript/yui/colorpicker/assets/skins/sam/colorpicker-skin.css diff --git a/webdir/javascript/yui/colorpicker/assets/skins/sam/colorpicker.css b/javascript/yui/colorpicker/assets/skins/sam/colorpicker.css similarity index 100% rename from webdir/javascript/yui/colorpicker/assets/skins/sam/colorpicker.css rename to javascript/yui/colorpicker/assets/skins/sam/colorpicker.css diff --git a/webdir/javascript/yui/colorpicker/assets/skins/sam/hue_bg.png b/javascript/yui/colorpicker/assets/skins/sam/hue_bg.png similarity index 100% rename from webdir/javascript/yui/colorpicker/assets/skins/sam/hue_bg.png rename to javascript/yui/colorpicker/assets/skins/sam/hue_bg.png diff --git a/webdir/javascript/yui/colorpicker/assets/skins/sam/picker_mask.png b/javascript/yui/colorpicker/assets/skins/sam/picker_mask.png similarity index 100% rename from webdir/javascript/yui/colorpicker/assets/skins/sam/picker_mask.png rename to javascript/yui/colorpicker/assets/skins/sam/picker_mask.png diff --git a/webdir/javascript/yui/colorpicker/colorpicker-debug.js b/javascript/yui/colorpicker/colorpicker-debug.js similarity index 100% rename from webdir/javascript/yui/colorpicker/colorpicker-debug.js rename to javascript/yui/colorpicker/colorpicker-debug.js diff --git a/webdir/javascript/yui/colorpicker/colorpicker-min.js b/javascript/yui/colorpicker/colorpicker-min.js similarity index 100% rename from webdir/javascript/yui/colorpicker/colorpicker-min.js rename to javascript/yui/colorpicker/colorpicker-min.js diff --git a/webdir/javascript/yui/colorpicker/colorpicker.js b/javascript/yui/colorpicker/colorpicker.js similarity index 100% rename from webdir/javascript/yui/colorpicker/colorpicker.js rename to javascript/yui/colorpicker/colorpicker.js diff --git a/webdir/javascript/yui/connection/connection-debug.js b/javascript/yui/connection/connection-debug.js similarity index 100% rename from webdir/javascript/yui/connection/connection-debug.js rename to javascript/yui/connection/connection-debug.js diff --git a/webdir/javascript/yui/connection/connection-min.js b/javascript/yui/connection/connection-min.js similarity index 100% rename from webdir/javascript/yui/connection/connection-min.js rename to javascript/yui/connection/connection-min.js diff --git a/webdir/javascript/yui/connection/connection.js b/javascript/yui/connection/connection.js similarity index 100% rename from webdir/javascript/yui/connection/connection.js rename to javascript/yui/connection/connection.js diff --git a/webdir/javascript/yui/container/assets/alrt16_1.gif b/javascript/yui/container/assets/alrt16_1.gif similarity index 100% rename from webdir/javascript/yui/container/assets/alrt16_1.gif rename to javascript/yui/container/assets/alrt16_1.gif diff --git a/webdir/javascript/yui/container/assets/blck16_1.gif b/javascript/yui/container/assets/blck16_1.gif similarity index 100% rename from webdir/javascript/yui/container/assets/blck16_1.gif rename to javascript/yui/container/assets/blck16_1.gif diff --git a/webdir/javascript/yui/container/assets/close12_1.gif b/javascript/yui/container/assets/close12_1.gif similarity index 100% rename from webdir/javascript/yui/container/assets/close12_1.gif rename to javascript/yui/container/assets/close12_1.gif diff --git a/webdir/javascript/yui/container/assets/container-core.css b/javascript/yui/container/assets/container-core.css similarity index 100% rename from webdir/javascript/yui/container/assets/container-core.css rename to javascript/yui/container/assets/container-core.css diff --git a/webdir/javascript/yui/container/assets/container.css b/javascript/yui/container/assets/container.css similarity index 100% rename from webdir/javascript/yui/container/assets/container.css rename to javascript/yui/container/assets/container.css diff --git a/webdir/javascript/yui/container/assets/hlp16_1.gif b/javascript/yui/container/assets/hlp16_1.gif similarity index 100% rename from webdir/javascript/yui/container/assets/hlp16_1.gif rename to javascript/yui/container/assets/hlp16_1.gif diff --git a/webdir/javascript/yui/container/assets/info16_1.gif b/javascript/yui/container/assets/info16_1.gif similarity index 100% rename from webdir/javascript/yui/container/assets/info16_1.gif rename to javascript/yui/container/assets/info16_1.gif diff --git a/webdir/javascript/yui/container/assets/skins/sam/container-skin.css b/javascript/yui/container/assets/skins/sam/container-skin.css similarity index 100% rename from webdir/javascript/yui/container/assets/skins/sam/container-skin.css rename to javascript/yui/container/assets/skins/sam/container-skin.css diff --git a/webdir/javascript/yui/container/assets/skins/sam/container.css b/javascript/yui/container/assets/skins/sam/container.css similarity index 100% rename from webdir/javascript/yui/container/assets/skins/sam/container.css rename to javascript/yui/container/assets/skins/sam/container.css diff --git a/webdir/javascript/yui/container/assets/tip16_1.gif b/javascript/yui/container/assets/tip16_1.gif similarity index 100% rename from webdir/javascript/yui/container/assets/tip16_1.gif rename to javascript/yui/container/assets/tip16_1.gif diff --git a/webdir/javascript/yui/container/assets/warn16_1.gif b/javascript/yui/container/assets/warn16_1.gif similarity index 100% rename from webdir/javascript/yui/container/assets/warn16_1.gif rename to javascript/yui/container/assets/warn16_1.gif diff --git a/webdir/javascript/yui/container/container-debug.js b/javascript/yui/container/container-debug.js similarity index 100% rename from webdir/javascript/yui/container/container-debug.js rename to javascript/yui/container/container-debug.js diff --git a/webdir/javascript/yui/container/container-min.js b/javascript/yui/container/container-min.js similarity index 100% rename from webdir/javascript/yui/container/container-min.js rename to javascript/yui/container/container-min.js diff --git a/webdir/javascript/yui/container/container.js b/javascript/yui/container/container.js similarity index 100% rename from webdir/javascript/yui/container/container.js rename to javascript/yui/container/container.js diff --git a/webdir/javascript/yui/container/container_core-debug.js b/javascript/yui/container/container_core-debug.js similarity index 100% rename from webdir/javascript/yui/container/container_core-debug.js rename to javascript/yui/container/container_core-debug.js diff --git a/webdir/javascript/yui/container/container_core-min.js b/javascript/yui/container/container_core-min.js similarity index 100% rename from webdir/javascript/yui/container/container_core-min.js rename to javascript/yui/container/container_core-min.js diff --git a/webdir/javascript/yui/container/container_core.js b/javascript/yui/container/container_core.js similarity index 100% rename from webdir/javascript/yui/container/container_core.js rename to javascript/yui/container/container_core.js diff --git a/webdir/javascript/yui/cookie/cookie-debug.js b/javascript/yui/cookie/cookie-debug.js similarity index 100% rename from webdir/javascript/yui/cookie/cookie-debug.js rename to javascript/yui/cookie/cookie-debug.js diff --git a/webdir/javascript/yui/cookie/cookie-min.js b/javascript/yui/cookie/cookie-min.js similarity index 100% rename from webdir/javascript/yui/cookie/cookie-min.js rename to javascript/yui/cookie/cookie-min.js diff --git a/webdir/javascript/yui/cookie/cookie.js b/javascript/yui/cookie/cookie.js similarity index 100% rename from webdir/javascript/yui/cookie/cookie.js rename to javascript/yui/cookie/cookie.js diff --git a/webdir/javascript/yui/datasource/datasource-debug.js b/javascript/yui/datasource/datasource-debug.js similarity index 100% rename from webdir/javascript/yui/datasource/datasource-debug.js rename to javascript/yui/datasource/datasource-debug.js diff --git a/webdir/javascript/yui/datasource/datasource-min.js b/javascript/yui/datasource/datasource-min.js similarity index 100% rename from webdir/javascript/yui/datasource/datasource-min.js rename to javascript/yui/datasource/datasource-min.js diff --git a/webdir/javascript/yui/datasource/datasource.js b/javascript/yui/datasource/datasource.js similarity index 100% rename from webdir/javascript/yui/datasource/datasource.js rename to javascript/yui/datasource/datasource.js diff --git a/webdir/javascript/yui/datatable/assets/datatable-core.css b/javascript/yui/datatable/assets/datatable-core.css similarity index 100% rename from webdir/javascript/yui/datatable/assets/datatable-core.css rename to javascript/yui/datatable/assets/datatable-core.css diff --git a/webdir/javascript/yui/datatable/assets/datatable.css b/javascript/yui/datatable/assets/datatable.css similarity index 100% rename from webdir/javascript/yui/datatable/assets/datatable.css rename to javascript/yui/datatable/assets/datatable.css diff --git a/webdir/javascript/yui/datatable/assets/skins/sam/datatable-skin.css b/javascript/yui/datatable/assets/skins/sam/datatable-skin.css similarity index 100% rename from webdir/javascript/yui/datatable/assets/skins/sam/datatable-skin.css rename to javascript/yui/datatable/assets/skins/sam/datatable-skin.css diff --git a/webdir/javascript/yui/datatable/assets/skins/sam/datatable.css b/javascript/yui/datatable/assets/skins/sam/datatable.css similarity index 100% rename from webdir/javascript/yui/datatable/assets/skins/sam/datatable.css rename to javascript/yui/datatable/assets/skins/sam/datatable.css diff --git a/webdir/javascript/yui/datatable/assets/skins/sam/dt-arrow-dn.png b/javascript/yui/datatable/assets/skins/sam/dt-arrow-dn.png similarity index 100% rename from webdir/javascript/yui/datatable/assets/skins/sam/dt-arrow-dn.png rename to javascript/yui/datatable/assets/skins/sam/dt-arrow-dn.png diff --git a/webdir/javascript/yui/datatable/assets/skins/sam/dt-arrow-up.png b/javascript/yui/datatable/assets/skins/sam/dt-arrow-up.png similarity index 100% rename from webdir/javascript/yui/datatable/assets/skins/sam/dt-arrow-up.png rename to javascript/yui/datatable/assets/skins/sam/dt-arrow-up.png diff --git a/webdir/javascript/yui/datatable/datatable-debug.js b/javascript/yui/datatable/datatable-debug.js similarity index 100% rename from webdir/javascript/yui/datatable/datatable-debug.js rename to javascript/yui/datatable/datatable-debug.js diff --git a/webdir/javascript/yui/datatable/datatable-min.js b/javascript/yui/datatable/datatable-min.js similarity index 100% rename from webdir/javascript/yui/datatable/datatable-min.js rename to javascript/yui/datatable/datatable-min.js diff --git a/webdir/javascript/yui/datatable/datatable.js b/javascript/yui/datatable/datatable.js similarity index 100% rename from webdir/javascript/yui/datatable/datatable.js rename to javascript/yui/datatable/datatable.js diff --git a/webdir/javascript/yui/dom/dom-debug.js b/javascript/yui/dom/dom-debug.js similarity index 100% rename from webdir/javascript/yui/dom/dom-debug.js rename to javascript/yui/dom/dom-debug.js diff --git a/webdir/javascript/yui/dom/dom-min.js b/javascript/yui/dom/dom-min.js similarity index 100% rename from webdir/javascript/yui/dom/dom-min.js rename to javascript/yui/dom/dom-min.js diff --git a/webdir/javascript/yui/dom/dom.js b/javascript/yui/dom/dom.js similarity index 100% rename from webdir/javascript/yui/dom/dom.js rename to javascript/yui/dom/dom.js diff --git a/webdir/javascript/yui/dragdrop/dragdrop-debug.js b/javascript/yui/dragdrop/dragdrop-debug.js similarity index 100% rename from webdir/javascript/yui/dragdrop/dragdrop-debug.js rename to javascript/yui/dragdrop/dragdrop-debug.js diff --git a/webdir/javascript/yui/dragdrop/dragdrop-min.js b/javascript/yui/dragdrop/dragdrop-min.js similarity index 100% rename from webdir/javascript/yui/dragdrop/dragdrop-min.js rename to javascript/yui/dragdrop/dragdrop-min.js diff --git a/webdir/javascript/yui/dragdrop/dragdrop.js b/javascript/yui/dragdrop/dragdrop.js similarity index 100% rename from webdir/javascript/yui/dragdrop/dragdrop.js rename to javascript/yui/dragdrop/dragdrop.js diff --git a/webdir/javascript/yui/editor/assets/editor-core.css b/javascript/yui/editor/assets/editor-core.css similarity index 100% rename from webdir/javascript/yui/editor/assets/editor-core.css rename to javascript/yui/editor/assets/editor-core.css diff --git a/webdir/javascript/yui/editor/assets/simpleeditor-core.css b/javascript/yui/editor/assets/simpleeditor-core.css similarity index 100% rename from webdir/javascript/yui/editor/assets/simpleeditor-core.css rename to javascript/yui/editor/assets/simpleeditor-core.css diff --git a/webdir/javascript/yui/editor/assets/skins/sam/blankimage.png b/javascript/yui/editor/assets/skins/sam/blankimage.png similarity index 100% rename from webdir/javascript/yui/editor/assets/skins/sam/blankimage.png rename to javascript/yui/editor/assets/skins/sam/blankimage.png diff --git a/webdir/javascript/yui/editor/assets/skins/sam/editor-knob.gif b/javascript/yui/editor/assets/skins/sam/editor-knob.gif similarity index 100% rename from webdir/javascript/yui/editor/assets/skins/sam/editor-knob.gif rename to javascript/yui/editor/assets/skins/sam/editor-knob.gif diff --git a/webdir/javascript/yui/editor/assets/skins/sam/editor-skin.css b/javascript/yui/editor/assets/skins/sam/editor-skin.css similarity index 100% rename from webdir/javascript/yui/editor/assets/skins/sam/editor-skin.css rename to javascript/yui/editor/assets/skins/sam/editor-skin.css diff --git a/webdir/javascript/yui/editor/assets/skins/sam/editor-sprite-active.gif b/javascript/yui/editor/assets/skins/sam/editor-sprite-active.gif similarity index 100% rename from webdir/javascript/yui/editor/assets/skins/sam/editor-sprite-active.gif rename to javascript/yui/editor/assets/skins/sam/editor-sprite-active.gif diff --git a/webdir/javascript/yui/editor/assets/skins/sam/editor-sprite.gif b/javascript/yui/editor/assets/skins/sam/editor-sprite.gif similarity index 100% rename from webdir/javascript/yui/editor/assets/skins/sam/editor-sprite.gif rename to javascript/yui/editor/assets/skins/sam/editor-sprite.gif diff --git a/webdir/javascript/yui/editor/assets/skins/sam/editor.css b/javascript/yui/editor/assets/skins/sam/editor.css similarity index 100% rename from webdir/javascript/yui/editor/assets/skins/sam/editor.css rename to javascript/yui/editor/assets/skins/sam/editor.css diff --git a/webdir/javascript/yui/editor/assets/skins/sam/simpleeditor-skin.css b/javascript/yui/editor/assets/skins/sam/simpleeditor-skin.css similarity index 100% rename from webdir/javascript/yui/editor/assets/skins/sam/simpleeditor-skin.css rename to javascript/yui/editor/assets/skins/sam/simpleeditor-skin.css diff --git a/webdir/javascript/yui/editor/assets/skins/sam/simpleeditor.css b/javascript/yui/editor/assets/skins/sam/simpleeditor.css similarity index 100% rename from webdir/javascript/yui/editor/assets/skins/sam/simpleeditor.css rename to javascript/yui/editor/assets/skins/sam/simpleeditor.css diff --git a/webdir/javascript/yui/editor/editor-debug.js b/javascript/yui/editor/editor-debug.js similarity index 100% rename from webdir/javascript/yui/editor/editor-debug.js rename to javascript/yui/editor/editor-debug.js diff --git a/webdir/javascript/yui/editor/editor-min.js b/javascript/yui/editor/editor-min.js similarity index 100% rename from webdir/javascript/yui/editor/editor-min.js rename to javascript/yui/editor/editor-min.js diff --git a/webdir/javascript/yui/editor/editor.js b/javascript/yui/editor/editor.js similarity index 100% rename from webdir/javascript/yui/editor/editor.js rename to javascript/yui/editor/editor.js diff --git a/webdir/javascript/yui/editor/simpleeditor-debug.js b/javascript/yui/editor/simpleeditor-debug.js similarity index 100% rename from webdir/javascript/yui/editor/simpleeditor-debug.js rename to javascript/yui/editor/simpleeditor-debug.js diff --git a/webdir/javascript/yui/editor/simpleeditor-min.js b/javascript/yui/editor/simpleeditor-min.js similarity index 100% rename from webdir/javascript/yui/editor/simpleeditor-min.js rename to javascript/yui/editor/simpleeditor-min.js diff --git a/webdir/javascript/yui/editor/simpleeditor.js b/javascript/yui/editor/simpleeditor.js similarity index 100% rename from webdir/javascript/yui/editor/simpleeditor.js rename to javascript/yui/editor/simpleeditor.js diff --git a/webdir/javascript/yui/element/element-debug.js b/javascript/yui/element/element-debug.js similarity index 100% rename from webdir/javascript/yui/element/element-debug.js rename to javascript/yui/element/element-debug.js diff --git a/webdir/javascript/yui/element/element-min.js b/javascript/yui/element/element-min.js similarity index 100% rename from webdir/javascript/yui/element/element-min.js rename to javascript/yui/element/element-min.js diff --git a/webdir/javascript/yui/element/element.js b/javascript/yui/element/element.js similarity index 100% rename from webdir/javascript/yui/element/element.js rename to javascript/yui/element/element.js diff --git a/webdir/javascript/yui/event/event-debug.js b/javascript/yui/event/event-debug.js similarity index 100% rename from webdir/javascript/yui/event/event-debug.js rename to javascript/yui/event/event-debug.js diff --git a/webdir/javascript/yui/event/event-min.js b/javascript/yui/event/event-min.js similarity index 100% rename from webdir/javascript/yui/event/event-min.js rename to javascript/yui/event/event-min.js diff --git a/webdir/javascript/yui/event/event.js b/javascript/yui/event/event.js similarity index 100% rename from webdir/javascript/yui/event/event.js rename to javascript/yui/event/event.js diff --git a/webdir/javascript/yui/fonts/fonts-min.css b/javascript/yui/fonts/fonts-min.css similarity index 100% rename from webdir/javascript/yui/fonts/fonts-min.css rename to javascript/yui/fonts/fonts-min.css diff --git a/webdir/javascript/yui/fonts/fonts.css b/javascript/yui/fonts/fonts.css similarity index 100% rename from webdir/javascript/yui/fonts/fonts.css rename to javascript/yui/fonts/fonts.css diff --git a/webdir/javascript/yui/get/get-debug.js b/javascript/yui/get/get-debug.js similarity index 100% rename from webdir/javascript/yui/get/get-debug.js rename to javascript/yui/get/get-debug.js diff --git a/webdir/javascript/yui/get/get-min.js b/javascript/yui/get/get-min.js similarity index 100% rename from webdir/javascript/yui/get/get-min.js rename to javascript/yui/get/get-min.js diff --git a/webdir/javascript/yui/get/get.js b/javascript/yui/get/get.js similarity index 100% rename from webdir/javascript/yui/get/get.js rename to javascript/yui/get/get.js diff --git a/webdir/javascript/yui/grids/grids-min.css b/javascript/yui/grids/grids-min.css similarity index 100% rename from webdir/javascript/yui/grids/grids-min.css rename to javascript/yui/grids/grids-min.css diff --git a/webdir/javascript/yui/grids/grids.css b/javascript/yui/grids/grids.css similarity index 100% rename from webdir/javascript/yui/grids/grids.css rename to javascript/yui/grids/grids.css diff --git a/webdir/javascript/yui/history/assets/blank.html b/javascript/yui/history/assets/blank.html similarity index 100% rename from webdir/javascript/yui/history/assets/blank.html rename to javascript/yui/history/assets/blank.html diff --git a/webdir/javascript/yui/history/history-debug.js b/javascript/yui/history/history-debug.js similarity index 100% rename from webdir/javascript/yui/history/history-debug.js rename to javascript/yui/history/history-debug.js diff --git a/webdir/javascript/yui/history/history-min.js b/javascript/yui/history/history-min.js similarity index 100% rename from webdir/javascript/yui/history/history-min.js rename to javascript/yui/history/history-min.js diff --git a/webdir/javascript/yui/history/history.js b/javascript/yui/history/history.js similarity index 100% rename from webdir/javascript/yui/history/history.js rename to javascript/yui/history/history.js diff --git a/webdir/javascript/yui/imagecropper/assets/imagecropper-core.css b/javascript/yui/imagecropper/assets/imagecropper-core.css similarity index 100% rename from webdir/javascript/yui/imagecropper/assets/imagecropper-core.css rename to javascript/yui/imagecropper/assets/imagecropper-core.css diff --git a/webdir/javascript/yui/imagecropper/assets/skins/sam/imagecropper-skin.css b/javascript/yui/imagecropper/assets/skins/sam/imagecropper-skin.css similarity index 100% rename from webdir/javascript/yui/imagecropper/assets/skins/sam/imagecropper-skin.css rename to javascript/yui/imagecropper/assets/skins/sam/imagecropper-skin.css diff --git a/webdir/javascript/yui/imagecropper/assets/skins/sam/imagecropper.css b/javascript/yui/imagecropper/assets/skins/sam/imagecropper.css similarity index 100% rename from webdir/javascript/yui/imagecropper/assets/skins/sam/imagecropper.css rename to javascript/yui/imagecropper/assets/skins/sam/imagecropper.css diff --git a/webdir/javascript/yui/imagecropper/imagecropper-debug.js b/javascript/yui/imagecropper/imagecropper-debug.js similarity index 100% rename from webdir/javascript/yui/imagecropper/imagecropper-debug.js rename to javascript/yui/imagecropper/imagecropper-debug.js diff --git a/webdir/javascript/yui/imagecropper/imagecropper-min.js b/javascript/yui/imagecropper/imagecropper-min.js similarity index 100% rename from webdir/javascript/yui/imagecropper/imagecropper-min.js rename to javascript/yui/imagecropper/imagecropper-min.js diff --git a/webdir/javascript/yui/imagecropper/imagecropper.js b/javascript/yui/imagecropper/imagecropper.js similarity index 100% rename from webdir/javascript/yui/imagecropper/imagecropper.js rename to javascript/yui/imagecropper/imagecropper.js diff --git a/webdir/javascript/yui/imageloader/imageloader-debug.js b/javascript/yui/imageloader/imageloader-debug.js similarity index 100% rename from webdir/javascript/yui/imageloader/imageloader-debug.js rename to javascript/yui/imageloader/imageloader-debug.js diff --git a/webdir/javascript/yui/imageloader/imageloader-min.js b/javascript/yui/imageloader/imageloader-min.js similarity index 100% rename from webdir/javascript/yui/imageloader/imageloader-min.js rename to javascript/yui/imageloader/imageloader-min.js diff --git a/webdir/javascript/yui/imageloader/imageloader.js b/javascript/yui/imageloader/imageloader.js similarity index 100% rename from webdir/javascript/yui/imageloader/imageloader.js rename to javascript/yui/imageloader/imageloader.js diff --git a/webdir/javascript/yui/json/json-debug.js b/javascript/yui/json/json-debug.js similarity index 100% rename from webdir/javascript/yui/json/json-debug.js rename to javascript/yui/json/json-debug.js diff --git a/webdir/javascript/yui/json/json-min.js b/javascript/yui/json/json-min.js similarity index 100% rename from webdir/javascript/yui/json/json-min.js rename to javascript/yui/json/json-min.js diff --git a/webdir/javascript/yui/json/json.js b/javascript/yui/json/json.js similarity index 100% rename from webdir/javascript/yui/json/json.js rename to javascript/yui/json/json.js diff --git a/webdir/javascript/yui/layout/assets/layout-core.css b/javascript/yui/layout/assets/layout-core.css similarity index 100% rename from webdir/javascript/yui/layout/assets/layout-core.css rename to javascript/yui/layout/assets/layout-core.css diff --git a/webdir/javascript/yui/layout/assets/skins/sam/layout-skin.css b/javascript/yui/layout/assets/skins/sam/layout-skin.css similarity index 100% rename from webdir/javascript/yui/layout/assets/skins/sam/layout-skin.css rename to javascript/yui/layout/assets/skins/sam/layout-skin.css diff --git a/webdir/javascript/yui/layout/assets/skins/sam/layout.css b/javascript/yui/layout/assets/skins/sam/layout.css similarity index 100% rename from webdir/javascript/yui/layout/assets/skins/sam/layout.css rename to javascript/yui/layout/assets/skins/sam/layout.css diff --git a/webdir/javascript/yui/layout/assets/skins/sam/layout_sprite.png b/javascript/yui/layout/assets/skins/sam/layout_sprite.png similarity index 100% rename from webdir/javascript/yui/layout/assets/skins/sam/layout_sprite.png rename to javascript/yui/layout/assets/skins/sam/layout_sprite.png diff --git a/webdir/javascript/yui/layout/layout-debug.js b/javascript/yui/layout/layout-debug.js similarity index 100% rename from webdir/javascript/yui/layout/layout-debug.js rename to javascript/yui/layout/layout-debug.js diff --git a/webdir/javascript/yui/layout/layout-min.js b/javascript/yui/layout/layout-min.js similarity index 100% rename from webdir/javascript/yui/layout/layout-min.js rename to javascript/yui/layout/layout-min.js diff --git a/webdir/javascript/yui/layout/layout.js b/javascript/yui/layout/layout.js similarity index 100% rename from webdir/javascript/yui/layout/layout.js rename to javascript/yui/layout/layout.js diff --git a/webdir/javascript/yui/logger/assets/logger-core.css b/javascript/yui/logger/assets/logger-core.css similarity index 100% rename from webdir/javascript/yui/logger/assets/logger-core.css rename to javascript/yui/logger/assets/logger-core.css diff --git a/webdir/javascript/yui/logger/assets/logger.css b/javascript/yui/logger/assets/logger.css similarity index 100% rename from webdir/javascript/yui/logger/assets/logger.css rename to javascript/yui/logger/assets/logger.css diff --git a/webdir/javascript/yui/logger/assets/skins/sam/logger-skin.css b/javascript/yui/logger/assets/skins/sam/logger-skin.css similarity index 100% rename from webdir/javascript/yui/logger/assets/skins/sam/logger-skin.css rename to javascript/yui/logger/assets/skins/sam/logger-skin.css diff --git a/webdir/javascript/yui/logger/assets/skins/sam/logger.css b/javascript/yui/logger/assets/skins/sam/logger.css similarity index 100% rename from webdir/javascript/yui/logger/assets/skins/sam/logger.css rename to javascript/yui/logger/assets/skins/sam/logger.css diff --git a/webdir/javascript/yui/logger/logger-debug.js b/javascript/yui/logger/logger-debug.js similarity index 100% rename from webdir/javascript/yui/logger/logger-debug.js rename to javascript/yui/logger/logger-debug.js diff --git a/webdir/javascript/yui/logger/logger-min.js b/javascript/yui/logger/logger-min.js similarity index 100% rename from webdir/javascript/yui/logger/logger-min.js rename to javascript/yui/logger/logger-min.js diff --git a/webdir/javascript/yui/logger/logger.js b/javascript/yui/logger/logger.js similarity index 100% rename from webdir/javascript/yui/logger/logger.js rename to javascript/yui/logger/logger.js diff --git a/webdir/javascript/yui/menu/assets/menu-core.css b/javascript/yui/menu/assets/menu-core.css similarity index 100% rename from webdir/javascript/yui/menu/assets/menu-core.css rename to javascript/yui/menu/assets/menu-core.css diff --git a/webdir/javascript/yui/menu/assets/menu.css b/javascript/yui/menu/assets/menu.css similarity index 100% rename from webdir/javascript/yui/menu/assets/menu.css rename to javascript/yui/menu/assets/menu.css diff --git a/webdir/javascript/yui/menu/assets/menu_down_arrow.png b/javascript/yui/menu/assets/menu_down_arrow.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menu_down_arrow.png rename to javascript/yui/menu/assets/menu_down_arrow.png diff --git a/webdir/javascript/yui/menu/assets/menu_down_arrow_disabled.png b/javascript/yui/menu/assets/menu_down_arrow_disabled.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menu_down_arrow_disabled.png rename to javascript/yui/menu/assets/menu_down_arrow_disabled.png diff --git a/webdir/javascript/yui/menu/assets/menu_up_arrow.png b/javascript/yui/menu/assets/menu_up_arrow.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menu_up_arrow.png rename to javascript/yui/menu/assets/menu_up_arrow.png diff --git a/webdir/javascript/yui/menu/assets/menu_up_arrow_disabled.png b/javascript/yui/menu/assets/menu_up_arrow_disabled.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menu_up_arrow_disabled.png rename to javascript/yui/menu/assets/menu_up_arrow_disabled.png diff --git a/webdir/javascript/yui/menu/assets/menubaritem_submenuindicator.png b/javascript/yui/menu/assets/menubaritem_submenuindicator.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menubaritem_submenuindicator.png rename to javascript/yui/menu/assets/menubaritem_submenuindicator.png diff --git a/webdir/javascript/yui/menu/assets/menubaritem_submenuindicator_disabled.png b/javascript/yui/menu/assets/menubaritem_submenuindicator_disabled.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menubaritem_submenuindicator_disabled.png rename to javascript/yui/menu/assets/menubaritem_submenuindicator_disabled.png diff --git a/webdir/javascript/yui/menu/assets/menubaritem_submenuindicator_selected.png b/javascript/yui/menu/assets/menubaritem_submenuindicator_selected.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menubaritem_submenuindicator_selected.png rename to javascript/yui/menu/assets/menubaritem_submenuindicator_selected.png diff --git a/webdir/javascript/yui/menu/assets/menuitem_checkbox.png b/javascript/yui/menu/assets/menuitem_checkbox.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menuitem_checkbox.png rename to javascript/yui/menu/assets/menuitem_checkbox.png diff --git a/webdir/javascript/yui/menu/assets/menuitem_checkbox_disabled.png b/javascript/yui/menu/assets/menuitem_checkbox_disabled.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menuitem_checkbox_disabled.png rename to javascript/yui/menu/assets/menuitem_checkbox_disabled.png diff --git a/webdir/javascript/yui/menu/assets/menuitem_checkbox_selected.png b/javascript/yui/menu/assets/menuitem_checkbox_selected.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menuitem_checkbox_selected.png rename to javascript/yui/menu/assets/menuitem_checkbox_selected.png diff --git a/webdir/javascript/yui/menu/assets/menuitem_submenuindicator.png b/javascript/yui/menu/assets/menuitem_submenuindicator.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menuitem_submenuindicator.png rename to javascript/yui/menu/assets/menuitem_submenuindicator.png diff --git a/webdir/javascript/yui/menu/assets/menuitem_submenuindicator_disabled.png b/javascript/yui/menu/assets/menuitem_submenuindicator_disabled.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menuitem_submenuindicator_disabled.png rename to javascript/yui/menu/assets/menuitem_submenuindicator_disabled.png diff --git a/webdir/javascript/yui/menu/assets/menuitem_submenuindicator_selected.png b/javascript/yui/menu/assets/menuitem_submenuindicator_selected.png similarity index 100% rename from webdir/javascript/yui/menu/assets/menuitem_submenuindicator_selected.png rename to javascript/yui/menu/assets/menuitem_submenuindicator_selected.png diff --git a/webdir/javascript/yui/menu/assets/skins/sam/menu-skin.css b/javascript/yui/menu/assets/skins/sam/menu-skin.css similarity index 100% rename from webdir/javascript/yui/menu/assets/skins/sam/menu-skin.css rename to javascript/yui/menu/assets/skins/sam/menu-skin.css diff --git a/webdir/javascript/yui/menu/assets/skins/sam/menu.css b/javascript/yui/menu/assets/skins/sam/menu.css similarity index 100% rename from webdir/javascript/yui/menu/assets/skins/sam/menu.css rename to javascript/yui/menu/assets/skins/sam/menu.css diff --git a/webdir/javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator.png b/javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator.png similarity index 100% rename from webdir/javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator.png rename to javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator.png diff --git a/webdir/javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator_disabled.png b/javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator_disabled.png similarity index 100% rename from webdir/javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator_disabled.png rename to javascript/yui/menu/assets/skins/sam/menubaritem_submenuindicator_disabled.png diff --git a/webdir/javascript/yui/menu/assets/skins/sam/menuitem_checkbox.png b/javascript/yui/menu/assets/skins/sam/menuitem_checkbox.png similarity index 100% rename from webdir/javascript/yui/menu/assets/skins/sam/menuitem_checkbox.png rename to javascript/yui/menu/assets/skins/sam/menuitem_checkbox.png diff --git a/webdir/javascript/yui/menu/assets/skins/sam/menuitem_checkbox_disabled.png b/javascript/yui/menu/assets/skins/sam/menuitem_checkbox_disabled.png similarity index 100% rename from webdir/javascript/yui/menu/assets/skins/sam/menuitem_checkbox_disabled.png rename to javascript/yui/menu/assets/skins/sam/menuitem_checkbox_disabled.png diff --git a/webdir/javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator.png b/javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator.png similarity index 100% rename from webdir/javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator.png rename to javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator.png diff --git a/webdir/javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator_disabled.png b/javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator_disabled.png similarity index 100% rename from webdir/javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator_disabled.png rename to javascript/yui/menu/assets/skins/sam/menuitem_submenuindicator_disabled.png diff --git a/webdir/javascript/yui/menu/menu-debug.js b/javascript/yui/menu/menu-debug.js similarity index 100% rename from webdir/javascript/yui/menu/menu-debug.js rename to javascript/yui/menu/menu-debug.js diff --git a/webdir/javascript/yui/menu/menu-min.js b/javascript/yui/menu/menu-min.js similarity index 100% rename from webdir/javascript/yui/menu/menu-min.js rename to javascript/yui/menu/menu-min.js diff --git a/webdir/javascript/yui/menu/menu.js b/javascript/yui/menu/menu.js similarity index 100% rename from webdir/javascript/yui/menu/menu.js rename to javascript/yui/menu/menu.js diff --git a/webdir/javascript/yui/paginator/assets/paginator-core.css b/javascript/yui/paginator/assets/paginator-core.css similarity index 100% rename from webdir/javascript/yui/paginator/assets/paginator-core.css rename to javascript/yui/paginator/assets/paginator-core.css diff --git a/webdir/javascript/yui/paginator/assets/skins/sam/paginator-skin.css b/javascript/yui/paginator/assets/skins/sam/paginator-skin.css similarity index 100% rename from webdir/javascript/yui/paginator/assets/skins/sam/paginator-skin.css rename to javascript/yui/paginator/assets/skins/sam/paginator-skin.css diff --git a/webdir/javascript/yui/paginator/assets/skins/sam/paginator.css b/javascript/yui/paginator/assets/skins/sam/paginator.css similarity index 100% rename from webdir/javascript/yui/paginator/assets/skins/sam/paginator.css rename to javascript/yui/paginator/assets/skins/sam/paginator.css diff --git a/webdir/javascript/yui/paginator/paginator-debug.js b/javascript/yui/paginator/paginator-debug.js similarity index 100% rename from webdir/javascript/yui/paginator/paginator-debug.js rename to javascript/yui/paginator/paginator-debug.js diff --git a/webdir/javascript/yui/paginator/paginator-min.js b/javascript/yui/paginator/paginator-min.js similarity index 100% rename from webdir/javascript/yui/paginator/paginator-min.js rename to javascript/yui/paginator/paginator-min.js diff --git a/webdir/javascript/yui/paginator/paginator.js b/javascript/yui/paginator/paginator.js similarity index 100% rename from webdir/javascript/yui/paginator/paginator.js rename to javascript/yui/paginator/paginator.js diff --git a/webdir/javascript/yui/profiler/profiler-debug.js b/javascript/yui/profiler/profiler-debug.js similarity index 100% rename from webdir/javascript/yui/profiler/profiler-debug.js rename to javascript/yui/profiler/profiler-debug.js diff --git a/webdir/javascript/yui/profiler/profiler-min.js b/javascript/yui/profiler/profiler-min.js similarity index 100% rename from webdir/javascript/yui/profiler/profiler-min.js rename to javascript/yui/profiler/profiler-min.js diff --git a/webdir/javascript/yui/profiler/profiler.js b/javascript/yui/profiler/profiler.js similarity index 100% rename from webdir/javascript/yui/profiler/profiler.js rename to javascript/yui/profiler/profiler.js diff --git a/webdir/javascript/yui/profilerviewer/assets/profilerviewer-core.css b/javascript/yui/profilerviewer/assets/profilerviewer-core.css similarity index 100% rename from webdir/javascript/yui/profilerviewer/assets/profilerviewer-core.css rename to javascript/yui/profilerviewer/assets/profilerviewer-core.css diff --git a/webdir/javascript/yui/profilerviewer/assets/skins/sam/asc.gif b/javascript/yui/profilerviewer/assets/skins/sam/asc.gif similarity index 100% rename from webdir/javascript/yui/profilerviewer/assets/skins/sam/asc.gif rename to javascript/yui/profilerviewer/assets/skins/sam/asc.gif diff --git a/webdir/javascript/yui/profilerviewer/assets/skins/sam/desc.gif b/javascript/yui/profilerviewer/assets/skins/sam/desc.gif similarity index 100% rename from webdir/javascript/yui/profilerviewer/assets/skins/sam/desc.gif rename to javascript/yui/profilerviewer/assets/skins/sam/desc.gif diff --git a/webdir/javascript/yui/profilerviewer/assets/skins/sam/header_background.png b/javascript/yui/profilerviewer/assets/skins/sam/header_background.png similarity index 100% rename from webdir/javascript/yui/profilerviewer/assets/skins/sam/header_background.png rename to javascript/yui/profilerviewer/assets/skins/sam/header_background.png diff --git a/webdir/javascript/yui/profilerviewer/assets/skins/sam/profilerviewer-skin.css b/javascript/yui/profilerviewer/assets/skins/sam/profilerviewer-skin.css similarity index 100% rename from webdir/javascript/yui/profilerviewer/assets/skins/sam/profilerviewer-skin.css rename to javascript/yui/profilerviewer/assets/skins/sam/profilerviewer-skin.css diff --git a/webdir/javascript/yui/profilerviewer/assets/skins/sam/profilerviewer.css b/javascript/yui/profilerviewer/assets/skins/sam/profilerviewer.css similarity index 100% rename from webdir/javascript/yui/profilerviewer/assets/skins/sam/profilerviewer.css rename to javascript/yui/profilerviewer/assets/skins/sam/profilerviewer.css diff --git a/webdir/javascript/yui/profilerviewer/assets/skins/sam/wait.gif b/javascript/yui/profilerviewer/assets/skins/sam/wait.gif similarity index 100% rename from webdir/javascript/yui/profilerviewer/assets/skins/sam/wait.gif rename to javascript/yui/profilerviewer/assets/skins/sam/wait.gif diff --git a/webdir/javascript/yui/profilerviewer/profilerviewer-debug.js b/javascript/yui/profilerviewer/profilerviewer-debug.js similarity index 100% rename from webdir/javascript/yui/profilerviewer/profilerviewer-debug.js rename to javascript/yui/profilerviewer/profilerviewer-debug.js diff --git a/webdir/javascript/yui/profilerviewer/profilerviewer-min.js b/javascript/yui/profilerviewer/profilerviewer-min.js similarity index 100% rename from webdir/javascript/yui/profilerviewer/profilerviewer-min.js rename to javascript/yui/profilerviewer/profilerviewer-min.js diff --git a/webdir/javascript/yui/profilerviewer/profilerviewer.js b/javascript/yui/profilerviewer/profilerviewer.js similarity index 100% rename from webdir/javascript/yui/profilerviewer/profilerviewer.js rename to javascript/yui/profilerviewer/profilerviewer.js diff --git a/webdir/javascript/yui/reset-fonts-grids/reset-fonts-grids.css b/javascript/yui/reset-fonts-grids/reset-fonts-grids.css similarity index 100% rename from webdir/javascript/yui/reset-fonts-grids/reset-fonts-grids.css rename to javascript/yui/reset-fonts-grids/reset-fonts-grids.css diff --git a/webdir/javascript/yui/reset-fonts/reset-fonts.css b/javascript/yui/reset-fonts/reset-fonts.css similarity index 100% rename from webdir/javascript/yui/reset-fonts/reset-fonts.css rename to javascript/yui/reset-fonts/reset-fonts.css diff --git a/webdir/javascript/yui/reset/reset-min.css b/javascript/yui/reset/reset-min.css similarity index 100% rename from webdir/javascript/yui/reset/reset-min.css rename to javascript/yui/reset/reset-min.css diff --git a/webdir/javascript/yui/reset/reset.css b/javascript/yui/reset/reset.css similarity index 100% rename from webdir/javascript/yui/reset/reset.css rename to javascript/yui/reset/reset.css diff --git a/webdir/javascript/yui/resize/assets/resize-core.css b/javascript/yui/resize/assets/resize-core.css similarity index 100% rename from webdir/javascript/yui/resize/assets/resize-core.css rename to javascript/yui/resize/assets/resize-core.css diff --git a/webdir/javascript/yui/resize/assets/skins/sam/layout_sprite.png b/javascript/yui/resize/assets/skins/sam/layout_sprite.png similarity index 100% rename from webdir/javascript/yui/resize/assets/skins/sam/layout_sprite.png rename to javascript/yui/resize/assets/skins/sam/layout_sprite.png diff --git a/webdir/javascript/yui/resize/assets/skins/sam/resize-skin.css b/javascript/yui/resize/assets/skins/sam/resize-skin.css similarity index 100% rename from webdir/javascript/yui/resize/assets/skins/sam/resize-skin.css rename to javascript/yui/resize/assets/skins/sam/resize-skin.css diff --git a/webdir/javascript/yui/resize/assets/skins/sam/resize.css b/javascript/yui/resize/assets/skins/sam/resize.css similarity index 100% rename from webdir/javascript/yui/resize/assets/skins/sam/resize.css rename to javascript/yui/resize/assets/skins/sam/resize.css diff --git a/webdir/javascript/yui/resize/resize-debug.js b/javascript/yui/resize/resize-debug.js similarity index 100% rename from webdir/javascript/yui/resize/resize-debug.js rename to javascript/yui/resize/resize-debug.js diff --git a/webdir/javascript/yui/resize/resize-min.js b/javascript/yui/resize/resize-min.js similarity index 100% rename from webdir/javascript/yui/resize/resize-min.js rename to javascript/yui/resize/resize-min.js diff --git a/webdir/javascript/yui/resize/resize.js b/javascript/yui/resize/resize.js similarity index 100% rename from webdir/javascript/yui/resize/resize.js rename to javascript/yui/resize/resize.js diff --git a/webdir/javascript/yui/selector/selector-debug.js b/javascript/yui/selector/selector-debug.js similarity index 100% rename from webdir/javascript/yui/selector/selector-debug.js rename to javascript/yui/selector/selector-debug.js diff --git a/webdir/javascript/yui/selector/selector-min.js b/javascript/yui/selector/selector-min.js similarity index 100% rename from webdir/javascript/yui/selector/selector-min.js rename to javascript/yui/selector/selector-min.js diff --git a/webdir/javascript/yui/selector/selector.js b/javascript/yui/selector/selector.js similarity index 100% rename from webdir/javascript/yui/selector/selector.js rename to javascript/yui/selector/selector.js diff --git a/webdir/javascript/yui/slider/assets/bg-fader.gif b/javascript/yui/slider/assets/bg-fader.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/bg-fader.gif rename to javascript/yui/slider/assets/bg-fader.gif diff --git a/webdir/javascript/yui/slider/assets/bg-h.gif b/javascript/yui/slider/assets/bg-h.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/bg-h.gif rename to javascript/yui/slider/assets/bg-h.gif diff --git a/webdir/javascript/yui/slider/assets/bg-v-e.gif b/javascript/yui/slider/assets/bg-v-e.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/bg-v-e.gif rename to javascript/yui/slider/assets/bg-v-e.gif diff --git a/webdir/javascript/yui/slider/assets/bg-v.gif b/javascript/yui/slider/assets/bg-v.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/bg-v.gif rename to javascript/yui/slider/assets/bg-v.gif diff --git a/webdir/javascript/yui/slider/assets/left-thumb.png b/javascript/yui/slider/assets/left-thumb.png similarity index 100% rename from webdir/javascript/yui/slider/assets/left-thumb.png rename to javascript/yui/slider/assets/left-thumb.png diff --git a/webdir/javascript/yui/slider/assets/right-thumb.png b/javascript/yui/slider/assets/right-thumb.png similarity index 100% rename from webdir/javascript/yui/slider/assets/right-thumb.png rename to javascript/yui/slider/assets/right-thumb.png diff --git a/webdir/javascript/yui/slider/assets/skins/sam/bg-h.gif b/javascript/yui/slider/assets/skins/sam/bg-h.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/skins/sam/bg-h.gif rename to javascript/yui/slider/assets/skins/sam/bg-h.gif diff --git a/webdir/javascript/yui/slider/assets/skins/sam/bg-v.gif b/javascript/yui/slider/assets/skins/sam/bg-v.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/skins/sam/bg-v.gif rename to javascript/yui/slider/assets/skins/sam/bg-v.gif diff --git a/webdir/javascript/yui/slider/assets/skins/sam/slider-skin.css b/javascript/yui/slider/assets/skins/sam/slider-skin.css similarity index 100% rename from webdir/javascript/yui/slider/assets/skins/sam/slider-skin.css rename to javascript/yui/slider/assets/skins/sam/slider-skin.css diff --git a/webdir/javascript/yui/slider/assets/skins/sam/slider.css b/javascript/yui/slider/assets/skins/sam/slider.css similarity index 100% rename from webdir/javascript/yui/slider/assets/skins/sam/slider.css rename to javascript/yui/slider/assets/skins/sam/slider.css diff --git a/webdir/javascript/yui/slider/assets/slider-core.css b/javascript/yui/slider/assets/slider-core.css similarity index 100% rename from webdir/javascript/yui/slider/assets/slider-core.css rename to javascript/yui/slider/assets/slider-core.css diff --git a/webdir/javascript/yui/slider/assets/slider-skin.css b/javascript/yui/slider/assets/slider-skin.css similarity index 100% rename from webdir/javascript/yui/slider/assets/slider-skin.css rename to javascript/yui/slider/assets/slider-skin.css diff --git a/webdir/javascript/yui/slider/assets/thumb-bar.gif b/javascript/yui/slider/assets/thumb-bar.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/thumb-bar.gif rename to javascript/yui/slider/assets/thumb-bar.gif diff --git a/webdir/javascript/yui/slider/assets/thumb-e.gif b/javascript/yui/slider/assets/thumb-e.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/thumb-e.gif rename to javascript/yui/slider/assets/thumb-e.gif diff --git a/webdir/javascript/yui/slider/assets/thumb-fader.gif b/javascript/yui/slider/assets/thumb-fader.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/thumb-fader.gif rename to javascript/yui/slider/assets/thumb-fader.gif diff --git a/webdir/javascript/yui/slider/assets/thumb-n.gif b/javascript/yui/slider/assets/thumb-n.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/thumb-n.gif rename to javascript/yui/slider/assets/thumb-n.gif diff --git a/webdir/javascript/yui/slider/assets/thumb-s.gif b/javascript/yui/slider/assets/thumb-s.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/thumb-s.gif rename to javascript/yui/slider/assets/thumb-s.gif diff --git a/webdir/javascript/yui/slider/assets/thumb-w.gif b/javascript/yui/slider/assets/thumb-w.gif similarity index 100% rename from webdir/javascript/yui/slider/assets/thumb-w.gif rename to javascript/yui/slider/assets/thumb-w.gif diff --git a/webdir/javascript/yui/slider/slider-debug.js b/javascript/yui/slider/slider-debug.js similarity index 100% rename from webdir/javascript/yui/slider/slider-debug.js rename to javascript/yui/slider/slider-debug.js diff --git a/webdir/javascript/yui/slider/slider-min.js b/javascript/yui/slider/slider-min.js similarity index 100% rename from webdir/javascript/yui/slider/slider-min.js rename to javascript/yui/slider/slider-min.js diff --git a/webdir/javascript/yui/slider/slider.js b/javascript/yui/slider/slider.js similarity index 100% rename from webdir/javascript/yui/slider/slider.js rename to javascript/yui/slider/slider.js diff --git a/webdir/javascript/yui/stylesheet/stylesheet-debug.js b/javascript/yui/stylesheet/stylesheet-debug.js similarity index 100% rename from webdir/javascript/yui/stylesheet/stylesheet-debug.js rename to javascript/yui/stylesheet/stylesheet-debug.js diff --git a/webdir/javascript/yui/stylesheet/stylesheet-min.js b/javascript/yui/stylesheet/stylesheet-min.js similarity index 100% rename from webdir/javascript/yui/stylesheet/stylesheet-min.js rename to javascript/yui/stylesheet/stylesheet-min.js diff --git a/webdir/javascript/yui/stylesheet/stylesheet.js b/javascript/yui/stylesheet/stylesheet.js similarity index 100% rename from webdir/javascript/yui/stylesheet/stylesheet.js rename to javascript/yui/stylesheet/stylesheet.js diff --git a/webdir/javascript/yui/tabview/assets/border_tabs.css b/javascript/yui/tabview/assets/border_tabs.css similarity index 100% rename from webdir/javascript/yui/tabview/assets/border_tabs.css rename to javascript/yui/tabview/assets/border_tabs.css diff --git a/webdir/javascript/yui/tabview/assets/loading.gif b/javascript/yui/tabview/assets/loading.gif similarity index 100% rename from webdir/javascript/yui/tabview/assets/loading.gif rename to javascript/yui/tabview/assets/loading.gif diff --git a/webdir/javascript/yui/tabview/assets/skin-sam.css b/javascript/yui/tabview/assets/skin-sam.css similarity index 100% rename from webdir/javascript/yui/tabview/assets/skin-sam.css rename to javascript/yui/tabview/assets/skin-sam.css diff --git a/webdir/javascript/yui/tabview/assets/skins/sam/tabview-skin.css b/javascript/yui/tabview/assets/skins/sam/tabview-skin.css similarity index 100% rename from webdir/javascript/yui/tabview/assets/skins/sam/tabview-skin.css rename to javascript/yui/tabview/assets/skins/sam/tabview-skin.css diff --git a/webdir/javascript/yui/tabview/assets/skins/sam/tabview.css b/javascript/yui/tabview/assets/skins/sam/tabview.css similarity index 100% rename from webdir/javascript/yui/tabview/assets/skins/sam/tabview.css rename to javascript/yui/tabview/assets/skins/sam/tabview.css diff --git a/webdir/javascript/yui/tabview/assets/tabview-core.css b/javascript/yui/tabview/assets/tabview-core.css similarity index 100% rename from webdir/javascript/yui/tabview/assets/tabview-core.css rename to javascript/yui/tabview/assets/tabview-core.css diff --git a/webdir/javascript/yui/tabview/assets/tabview.css b/javascript/yui/tabview/assets/tabview.css similarity index 100% rename from webdir/javascript/yui/tabview/assets/tabview.css rename to javascript/yui/tabview/assets/tabview.css diff --git a/webdir/javascript/yui/tabview/tabview-debug.js b/javascript/yui/tabview/tabview-debug.js similarity index 100% rename from webdir/javascript/yui/tabview/tabview-debug.js rename to javascript/yui/tabview/tabview-debug.js diff --git a/webdir/javascript/yui/tabview/tabview-min.js b/javascript/yui/tabview/tabview-min.js similarity index 100% rename from webdir/javascript/yui/tabview/tabview-min.js rename to javascript/yui/tabview/tabview-min.js diff --git a/webdir/javascript/yui/tabview/tabview.js b/javascript/yui/tabview/tabview.js similarity index 100% rename from webdir/javascript/yui/tabview/tabview.js rename to javascript/yui/tabview/tabview.js diff --git a/webdir/javascript/yui/treeview/assets/check0.gif b/javascript/yui/treeview/assets/check0.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/check0.gif rename to javascript/yui/treeview/assets/check0.gif diff --git a/webdir/javascript/yui/treeview/assets/check1.gif b/javascript/yui/treeview/assets/check1.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/check1.gif rename to javascript/yui/treeview/assets/check1.gif diff --git a/webdir/javascript/yui/treeview/assets/check2.gif b/javascript/yui/treeview/assets/check2.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/check2.gif rename to javascript/yui/treeview/assets/check2.gif diff --git a/webdir/javascript/yui/treeview/assets/loading.gif b/javascript/yui/treeview/assets/loading.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/loading.gif rename to javascript/yui/treeview/assets/loading.gif diff --git a/webdir/javascript/yui/treeview/assets/skins/sam/loading.gif b/javascript/yui/treeview/assets/skins/sam/loading.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/skins/sam/loading.gif rename to javascript/yui/treeview/assets/skins/sam/loading.gif diff --git a/webdir/javascript/yui/treeview/assets/skins/sam/treeview-loading.gif b/javascript/yui/treeview/assets/skins/sam/treeview-loading.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/skins/sam/treeview-loading.gif rename to javascript/yui/treeview/assets/skins/sam/treeview-loading.gif diff --git a/webdir/javascript/yui/treeview/assets/skins/sam/treeview-skin.css b/javascript/yui/treeview/assets/skins/sam/treeview-skin.css similarity index 100% rename from webdir/javascript/yui/treeview/assets/skins/sam/treeview-skin.css rename to javascript/yui/treeview/assets/skins/sam/treeview-skin.css diff --git a/webdir/javascript/yui/treeview/assets/skins/sam/treeview-sprite.gif b/javascript/yui/treeview/assets/skins/sam/treeview-sprite.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/skins/sam/treeview-sprite.gif rename to javascript/yui/treeview/assets/skins/sam/treeview-sprite.gif diff --git a/webdir/javascript/yui/treeview/assets/skins/sam/treeview.css b/javascript/yui/treeview/assets/skins/sam/treeview.css similarity index 100% rename from webdir/javascript/yui/treeview/assets/skins/sam/treeview.css rename to javascript/yui/treeview/assets/skins/sam/treeview.css diff --git a/webdir/javascript/yui/treeview/assets/treeview-core.css b/javascript/yui/treeview/assets/treeview-core.css similarity index 100% rename from webdir/javascript/yui/treeview/assets/treeview-core.css rename to javascript/yui/treeview/assets/treeview-core.css diff --git a/webdir/javascript/yui/treeview/assets/treeview-loading.gif b/javascript/yui/treeview/assets/treeview-loading.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/treeview-loading.gif rename to javascript/yui/treeview/assets/treeview-loading.gif diff --git a/webdir/javascript/yui/treeview/assets/treeview-skin.css b/javascript/yui/treeview/assets/treeview-skin.css similarity index 100% rename from webdir/javascript/yui/treeview/assets/treeview-skin.css rename to javascript/yui/treeview/assets/treeview-skin.css diff --git a/webdir/javascript/yui/treeview/assets/treeview-sprite.gif b/javascript/yui/treeview/assets/treeview-sprite.gif similarity index 100% rename from webdir/javascript/yui/treeview/assets/treeview-sprite.gif rename to javascript/yui/treeview/assets/treeview-sprite.gif diff --git a/webdir/javascript/yui/treeview/treeview-debug.js b/javascript/yui/treeview/treeview-debug.js similarity index 100% rename from webdir/javascript/yui/treeview/treeview-debug.js rename to javascript/yui/treeview/treeview-debug.js diff --git a/webdir/javascript/yui/treeview/treeview-min.js b/javascript/yui/treeview/treeview-min.js similarity index 100% rename from webdir/javascript/yui/treeview/treeview-min.js rename to javascript/yui/treeview/treeview-min.js diff --git a/webdir/javascript/yui/treeview/treeview.js b/javascript/yui/treeview/treeview.js similarity index 100% rename from webdir/javascript/yui/treeview/treeview.js rename to javascript/yui/treeview/treeview.js diff --git a/webdir/javascript/yui/uploader/assets/uploader.swf b/javascript/yui/uploader/assets/uploader.swf similarity index 100% rename from webdir/javascript/yui/uploader/assets/uploader.swf rename to javascript/yui/uploader/assets/uploader.swf diff --git a/webdir/javascript/yui/uploader/uploader-debug.js b/javascript/yui/uploader/uploader-debug.js similarity index 100% rename from webdir/javascript/yui/uploader/uploader-debug.js rename to javascript/yui/uploader/uploader-debug.js diff --git a/webdir/javascript/yui/uploader/uploader-experimental-debug.js b/javascript/yui/uploader/uploader-experimental-debug.js similarity index 100% rename from webdir/javascript/yui/uploader/uploader-experimental-debug.js rename to javascript/yui/uploader/uploader-experimental-debug.js diff --git a/webdir/javascript/yui/uploader/uploader-min.js b/javascript/yui/uploader/uploader-min.js similarity index 100% rename from webdir/javascript/yui/uploader/uploader-min.js rename to javascript/yui/uploader/uploader-min.js diff --git a/webdir/javascript/yui/uploader/uploader.js b/javascript/yui/uploader/uploader.js similarity index 100% rename from webdir/javascript/yui/uploader/uploader.js rename to javascript/yui/uploader/uploader.js diff --git a/webdir/javascript/yui/utilities/utilities.js b/javascript/yui/utilities/utilities.js similarity index 100% rename from webdir/javascript/yui/utilities/utilities.js rename to javascript/yui/utilities/utilities.js diff --git a/webdir/javascript/yui/yahoo-dom-event/yahoo-dom-event.js b/javascript/yui/yahoo-dom-event/yahoo-dom-event.js similarity index 100% rename from webdir/javascript/yui/yahoo-dom-event/yahoo-dom-event.js rename to javascript/yui/yahoo-dom-event/yahoo-dom-event.js diff --git a/webdir/javascript/yui/yahoo/yahoo-debug.js b/javascript/yui/yahoo/yahoo-debug.js similarity index 100% rename from webdir/javascript/yui/yahoo/yahoo-debug.js rename to javascript/yui/yahoo/yahoo-debug.js diff --git a/webdir/javascript/yui/yahoo/yahoo-min.js b/javascript/yui/yahoo/yahoo-min.js similarity index 100% rename from webdir/javascript/yui/yahoo/yahoo-min.js rename to javascript/yui/yahoo/yahoo-min.js diff --git a/webdir/javascript/yui/yahoo/yahoo.js b/javascript/yui/yahoo/yahoo.js similarity index 100% rename from webdir/javascript/yui/yahoo/yahoo.js rename to javascript/yui/yahoo/yahoo.js diff --git a/webdir/javascript/yui/yuiloader-dom-event/yuiloader-dom-event.js b/javascript/yui/yuiloader-dom-event/yuiloader-dom-event.js similarity index 100% rename from webdir/javascript/yui/yuiloader-dom-event/yuiloader-dom-event.js rename to javascript/yui/yuiloader-dom-event/yuiloader-dom-event.js diff --git a/webdir/javascript/yui/yuiloader/yuiloader-debug.js b/javascript/yui/yuiloader/yuiloader-debug.js similarity index 100% rename from webdir/javascript/yui/yuiloader/yuiloader-debug.js rename to javascript/yui/yuiloader/yuiloader-debug.js diff --git a/webdir/javascript/yui/yuiloader/yuiloader-min.js b/javascript/yui/yuiloader/yuiloader-min.js similarity index 100% rename from webdir/javascript/yui/yuiloader/yuiloader-min.js rename to javascript/yui/yuiloader/yuiloader-min.js diff --git a/webdir/javascript/yui/yuiloader/yuiloader.js b/javascript/yui/yuiloader/yuiloader.js similarity index 100% rename from webdir/javascript/yui/yuiloader/yuiloader.js rename to javascript/yui/yuiloader/yuiloader.js diff --git a/webdir/javascript/yui/yuitest/assets/skins/sam/yuitest-skin.css b/javascript/yui/yuitest/assets/skins/sam/yuitest-skin.css similarity index 100% rename from webdir/javascript/yui/yuitest/assets/skins/sam/yuitest-skin.css rename to javascript/yui/yuitest/assets/skins/sam/yuitest-skin.css diff --git a/webdir/javascript/yui/yuitest/assets/skins/sam/yuitest.css b/javascript/yui/yuitest/assets/skins/sam/yuitest.css similarity index 100% rename from webdir/javascript/yui/yuitest/assets/skins/sam/yuitest.css rename to javascript/yui/yuitest/assets/skins/sam/yuitest.css diff --git a/webdir/javascript/yui/yuitest/assets/testlogger.css b/javascript/yui/yuitest/assets/testlogger.css similarity index 100% rename from webdir/javascript/yui/yuitest/assets/testlogger.css rename to javascript/yui/yuitest/assets/testlogger.css diff --git a/webdir/javascript/yui/yuitest/assets/yuitest-core.css b/javascript/yui/yuitest/assets/yuitest-core.css similarity index 100% rename from webdir/javascript/yui/yuitest/assets/yuitest-core.css rename to javascript/yui/yuitest/assets/yuitest-core.css diff --git a/webdir/javascript/yui/yuitest/yuitest-debug.js b/javascript/yui/yuitest/yuitest-debug.js similarity index 100% rename from webdir/javascript/yui/yuitest/yuitest-debug.js rename to javascript/yui/yuitest/yuitest-debug.js diff --git a/webdir/javascript/yui/yuitest/yuitest-min.js b/javascript/yui/yuitest/yuitest-min.js similarity index 100% rename from webdir/javascript/yui/yuitest/yuitest-min.js rename to javascript/yui/yuitest/yuitest-min.js diff --git a/webdir/javascript/yui/yuitest/yuitest.js b/javascript/yui/yuitest/yuitest.js similarity index 100% rename from webdir/javascript/yui/yuitest/yuitest.js rename to javascript/yui/yuitest/yuitest.js diff --git a/webdir/javascript/yui/yuitest/yuitest_core-debug.js b/javascript/yui/yuitest/yuitest_core-debug.js similarity index 100% rename from webdir/javascript/yui/yuitest/yuitest_core-debug.js rename to javascript/yui/yuitest/yuitest_core-debug.js diff --git a/webdir/javascript/yui/yuitest/yuitest_core-min.js b/javascript/yui/yuitest/yuitest_core-min.js similarity index 100% rename from webdir/javascript/yui/yuitest/yuitest_core-min.js rename to javascript/yui/yuitest/yuitest_core-min.js diff --git a/webdir/javascript/yui/yuitest/yuitest_core.js b/javascript/yui/yuitest/yuitest_core.js similarity index 100% rename from webdir/javascript/yui/yuitest/yuitest_core.js rename to javascript/yui/yuitest/yuitest_core.js diff --git a/languages/ca/LC_MESSAGES/lang.mo b/languages/ca/LC_MESSAGES/lang.mo new file mode 100644 index 0000000..47cf82c Binary files /dev/null and b/languages/ca/LC_MESSAGES/lang.mo differ diff --git a/languages/ca/LC_MESSAGES/lang.po b/languages/ca/LC_MESSAGES/lang.po new file mode 100644 index 0000000..8501211 --- /dev/null +++ b/languages/ca/LC_MESSAGES/lang.po @@ -0,0 +1,1319 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID Catalan translation\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-26 11:15-0500\n" +"PO-Revision-Date: 2010-05-26 11:15-0500\n" +"Last-Translator: Keyboard Monkeys \n" +"Language-Team: Keyboard Monkeys Ltd. \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Catalan\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: ../../../\n" +"X-Poedit-SearchPath-0: modules\n" +"X-Poedit-SearchPath-1: views\n" +"X-Poedit-SearchPath-2: javascript\n" +"X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" + +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "" + +#: modules/users/forms/AccountInfo.php:26 +#: modules/users/forms/Register.php:45 +msgid "Username" +msgstr "Nom de usuari" + +#: modules/users/forms/AccountInfo.php:32 +#: modules/users/forms/Register.php:28 +msgid "First Name" +msgstr "Nombre" + +#: modules/users/forms/AccountInfo.php:37 +#: modules/users/forms/Register.php:33 +msgid "Last Name" +msgstr "Cognom1 i Cognom2" + +#: modules/users/forms/AccountInfo.php:42 +#: modules/users/forms/Register.php:38 +msgid "E-mail" +msgstr "Correo electrónic" + +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "" + +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" +msgstr "" + +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 +msgid "Enter password" +msgstr "Entri la contrasenya" + +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 +#, fuzzy +msgid "Enter password again" +msgstr "Entri la contrasenya" + +#: modules/users/forms/PersonalInfo.php:65 +#, fuzzy +msgid "Profile Name" +msgstr "perfil" + +#: modules/users/forms/Login.php:18 +msgid "USERNAME" +msgstr "NOM DE USUARI" + +#: modules/users/forms/Login.php:27 +msgid "PASSWORD" +msgstr "CONTRASENYA" + +#: modules/users/forms/Register.php:51 +msgid "Enter desired password" +msgstr "Entri la contrasenya que voldrà utilitzar" + +#: modules/users/forms/Register.php:68 +msgid "Please enter the text below" +msgstr "Comprobació que és una persona: Si us plau entri aquest text" + +#: modules/users/models/User.php:129 +#, fuzzy +msgid "Default profile" +msgstr "perfil" + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "Ho sentim molt, els nous registres estan actualmente deshabilitats" + +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "Aquest nom d'usuari ja esta sent utilitzat" + +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "Aquest correu electrònic ja està sent utilitzat" + +#: modules/users/controllers/RegisterController.php:95 +msgid "Community-ID registration confirmation" +msgstr "Community-ID confirmació del registre" + +#: modules/users/controllers/RegisterController.php:100 +msgid "Thank you." +msgstr "Moltes Gràcies." + +#: modules/users/controllers/RegisterController.php:101 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "Automàticament, reberà per correu electrònic a la seva bústia, les instruccions per a activar el seu compte." + +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "" + +#: modules/users/controllers/RegisterController.php:106 +msgid "The account was created but the E-mail could not be sent" +msgstr "El compte fou creada però el correu electrònic no ha pogut ser enviat" + +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 +msgid "Invalid token" +msgstr "Token (cadena de caràcters) invàlit" + +#: modules/users/controllers/RegisterController.php:147 +msgid "Your account has been deleted" +msgstr "El seu compte ha estat esborrat" + +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 +msgid "Invalid credentials" +msgstr "Credencials invàlits" + +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:77 +#, fuzzy +msgid "There was a problem setting the cookie" +msgstr "S'ha produit un error a l'intentar d'enviar el missatge" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:51 +msgid "This E-mail is not registered in the system" +msgstr "Aquest correu electrònic no està registrat en el nostre sistema" + +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 +msgid "Community-ID password reset" +msgstr "Community-ID restablecimient de una nova contrasenya" + +#: modules/users/controllers/RecoverpasswordController.php:74 +msgid "Password reset E-mail has been sent" +msgstr "El correu electrònic de restabliment de contrasenya ha sigut enviat" + +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "Token no vàlit" + +#: modules/users/controllers/RecoverpasswordController.php:103 +msgid "You'll receive your new password via E-mail" +msgstr "Reberà la nova contrasenya per correu electrònic" + +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:301 +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "EL compte fou eliminat, però el formulari no ha pogut ser enviat al administradors" + +#: modules/users/controllers/ProfilegeneralController.php:315 +msgid "Your acccount has been successfully deleted" +msgstr "La compte ha set esborrada amb èxit" + +#: modules/users/controllers/UserslistController.php:59 +msgid "admin" +msgstr "admin" + +#: modules/users/controllers/UserslistController.php:61 +msgid "confirmed" +msgstr "confirmat" + +#: modules/users/controllers/UserslistController.php:63 +msgid "unconfirmed" +msgstr "no confirmat" + +#: modules/users/controllers/PersonalinfoController.php:87 +#, fuzzy +msgid "Profile has been saved" +msgstr "L'article no has sigut guardat." + +#: modules/users/controllers/PersonalinfoController.php:98 +#, fuzzy +msgid "Profile has been deleted" +msgstr "L'article ha sigut eliminat." + +#: modules/users/controllers/ManageusersController.php:31 +msgid "User has been deleted successfully" +msgstr "L'usuari ha sigut esborrat amb èxit" + +#: modules/users/controllers/ManageusersController.php:48 +msgid "Community-ID registration reminder" +msgstr "Community-ID recordatori de registre" + +#: modules/default/forms/MessageUsers.php:17 +msgid "Subject" +msgstr "Asumpte" + +#: modules/default/forms/MessageUsers.php:22 +msgid "CC" +msgstr "CC" + +#: modules/default/forms/OpenidLogin.php:28 +msgid "OpenID URL" +msgstr "OpenID URL" + +#: modules/default/forms/OpenidLogin.php:35 +msgid "Password" +msgstr "Contrasenya" + +#: modules/default/forms/Feedback.php:25 +msgid "Enter your name" +msgstr "Entri/escrigui el seu nom" + +#: modules/default/forms/Feedback.php:30 +msgid "Enter your E-mail" +msgstr "Entri/escrigui la seva bústia de correu electrònic" + +#: modules/default/forms/Feedback.php:37 +msgid "Enter your questions or comments" +msgstr "Entri/escrigui les seves preguntes o comentaris" + +#: modules/default/forms/ErrorMessages.php:20 +msgid "Value is empty, but a non-empty value is required" +msgstr "Es requereix un valor no buit" + +#: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "El valor es requerit i no pot deixar-se buit" + +#: modules/default/forms/ErrorMessages.php:22 +msgid "'%value%' is not a valid email address in the basic format local-part@hostname" +msgstr "'%value%' no és una bústia de correu electrònica vàlida" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "'%hostname%' no és un servidor de noms -hostname- vàlid per a la bústia de correu electrònic '%value%'" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "'%value%' no coincideix amb l'estructura esperada per a unes DNS dominis de un servidor de noms -hosstname DNS-" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "'%value%' sembla ser un servidor de noms - hostname DNS - pero no es pot trobal la TLD corresponent" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "'%value%' sembla ser un nom de xarxa local però els noms de xarxes locals no són permessos" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Captcha value is wrong" +msgstr "El valor del text està equivocat, si us torbni a probar-l'ho" + +#: modules/default/forms/ErrorMessages.php:28 +msgid "Password confirmation does not match" +msgstr "Les contrasenyes no coincideixen" + +#: modules/default/forms/ErrorMessages.php:29 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "Nom d'usuari nomé pot tenir caracters alfanumèrics US-ASCII, i qualsevol dels simbolos $-_.+!*'(), y \"" + +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "Home/Mascle" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "Dona/Femella" + +#: modules/default/models/Fields.php:62 +msgid "Nickname" +msgstr "Sobrenom" + +#: modules/default/models/Fields.php:64 +msgid "Full Name" +msgstr "Nom Complert: nom, cognom1 i cognom2" + +#: modules/default/models/Fields.php:65 +msgid "Date of Birth" +msgstr "Data de Naixement" + +#: modules/default/models/Fields.php:66 +msgid "Gender" +msgstr "Gèner" + +#: modules/default/models/Fields.php:67 +msgid "Postal Code" +msgstr "Codi Postal (CP)" + +#: modules/default/models/Fields.php:68 +msgid "Country" +msgstr "País" + +#: modules/default/models/Fields.php:69 +msgid "Language" +msgstr "Idioma" + +#: modules/default/models/Fields.php:70 +msgid "Time Zone" +msgstr "Zona Horària" + +#: modules/default/controllers/MessageusersController.php:46 +msgid "CC field must be a comma-separated list of valid E-mails" +msgstr "El camp CC ha de ser una llista de bústies de correu (E-mails) vàlides separades per comes" + +#: modules/default/controllers/MessageusersController.php:86 +msgid "Message has been sent" +msgstr "El missatge ha sigut enviat" + +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "S'ha produit un error a l'intentar d'enviar el missatge" + +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "La URL introduida és incorrecta. Si us plau corregir-la i tornar-l'ho a probar." + +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "Acces Denegat - Possiblemente la sessió ha expirat? Intenti-ho de nou." + +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "Gràcies pel seu interès. El missatge ha sigut enviat." + +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "Ho sentim, però la resposta de confirmació no ha pogut ser enviada. Per favor intentiu de nou més tard." + +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "No fou possible extreure les notícies" + +#: modules/default/controllers/CidController.php:47 +msgid "Read More" +msgstr "Leguir més" + +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "Prohibit" + +#: modules/news/forms/Article.php:18 +msgid "Title" +msgstr "Títol" + +#: modules/news/forms/Article.php:24 +msgid "Publication date" +msgstr "Data de publicació" + +#: modules/news/forms/Article.php:32 +msgid "Excerpt" +msgstr "Extracte" + +#: modules/news/controllers/EditController.php:60 +#: modules/news/controllers/EditController.php:90 +msgid "The article doesn't exist." +msgstr "L'article no existeix." + +#: modules/news/controllers/EditController.php:81 +msgid "The article has been saved." +msgstr "L'article no has sigut guardat." + +#: modules/news/controllers/EditController.php:93 +msgid "The article has been deleted." +msgstr "L'article ha sigut eliminat." + +#: modules/install/forms/Install.php:18 +msgid "Hostname" +msgstr "Servidor de Noms -Hostname-" + +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "normal i usualment localhost" + +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "Nom base de dades" + +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "Usuari base de dades" + +#: modules/install/forms/Install.php:40 +msgid "Database password" +msgstr "Contrasenya de la base de dades" + +#: modules/install/forms/Install.php:44 +msgid "Support E-mail" +msgstr "Bústia de Correu electrònic de suport" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "Serà usat com el remitent en qualsevol missatge enviat pel sistema, i com recipient per a la resposta de confirmació dels usuaris" + +#: modules/install/controllers/UpgradeController.php:80 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "L'actualizació ha sigut realitzada amb éxit. Ara es troba en la versió %s" + +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "" + +#: modules/install/controllers/UpgradeController.php:117 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "Corrija antes de hacer la actualizació: El archivo %s es requerido per a proceder" + +#: modules/install/controllers/UpgradeController.php:159 +#, fuzzy +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "Si us plau corregir els següents problemes abans de procedir:" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "No fue posible conectarse a la base de datos usando esas credenciales." + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "Por favor verifique e intente de nuevo." + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "La conexió al motor de base de datos funcionó, pero la base de datos %s no existe o el usuari no tiene acceso a ella. Se intentó crearla, pero el usuari tampoco tiene permisos. Por favor creéla manualmente e intente de nuevo." + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "Se requiere una version de PHP %s o mayor" + +#: modules/install/controllers/CredentialsController.php:234 +#, php-format +msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." +msgstr "El directorio donde Community-ID està instalado debe ser escribible por el usuari del servidor web (%s). Otra opció es create un archivo config.php VACIO que sea escribible por dicho usuari." + +#: modules/install/controllers/CredentialsController.php:237 +#, php-format +msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" +msgstr "El directorio \"catpchas\" debajo del directorio web de Community-ID debe ser escribible por el usuari del servidor web (%s)" + +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "Necesita tener la extensió %s instalada" + +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "Necesita tener soporte per a PNG en su configuració de GD" + +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "Necesita tener soporte per a Freetype en su configuració de GD" + +#: javascript/language.php:30 +msgid "Name" +msgstr "Nombre" + +#: javascript/language.php:31 +msgid "Registration" +msgstr "Registro" + +#: javascript/language.php:32 +msgid "Status" +msgstr "Estado" + +#: javascript/language.php:33 +msgid "profile" +msgstr "perfil" + +#: javascript/language.php:34 +msgid "delete" +msgstr "eliminar" + +#: javascript/language.php:35 +msgid "Site" +msgstr "Sitio" + +#: javascript/language.php:36 +msgid "view info exchanged" +msgstr "ver informació intercambiada" + +#: javascript/language.php:37 +msgid "deny" +msgstr "denegar" + +#: javascript/language.php:38 +msgid "allow" +msgstr "permitir" + +#: javascript/language.php:39 +msgid "Are you sure you wish to send this message to ALL users?" +msgstr "¿Està seguro de querer enviar este mensaje a TODOS los usuaris?" + +#: javascript/language.php:40 +msgid "Are you sure you wish to deny trust to this site?" +msgstr "¿Està seguro de querer denegar este sitio?" + +#: javascript/language.php:41 +msgid "operation failed" +msgstr "la operació ha fallado" + +#: javascript/language.php:42 +msgid "Trust to the following site has been granted:" +msgstr "Confianza per a el siguiente sitio ha sido otorgada:" + +#: javascript/language.php:43 +msgid "Trust the following site has been denied:" +msgstr "Confianza per a el siguiente sitio ha sido denegada:" + +#: javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "ERROR. El servidor retornó:" + +#: javascript/language.php:45 +msgid "Your relationship with the following site has been deleted:" +msgstr "Su relació con el siguiente sitio has sido eliminada:" + +#: javascript/language.php:46 +msgid "The history log has been cleared" +msgstr "El historial ha sido borrado" + +#: javascript/language.php:47 +msgid "Are you sure you wish to allow access to this site?" +msgstr "¿Està seguro de querer otorgar acceso a este sitio?" + +#: javascript/language.php:48 +msgid "Are you sure you wish to delete your relationship with this site?" +msgstr "¿Està seguro de querer elimiar su relació con este sitio?" + +#: javascript/language.php:49 +msgid "Are you sure you wish to delete all the History Log?" +msgstr "¿Està seguro de querer borrar todo el historial?" + +#: javascript/language.php:50 +msgid "Are you sure you wish to delete the user" +msgstr "Està seguro de querer eliminar el usuari" + +#: javascript/language.php:51 +msgid "Are you sure you wish to delete all the unconfirmed accounts?" +msgstr "¿Està seguro de querer eliminar todas las cuentas no confirmatas?" + +#: javascript/language.php:52 +msgid "Date" +msgstr "Fecha" + +#: javascript/language.php:53 +msgid "Result" +msgstr "Resultado" + +#: javascript/language.php:54 +msgid "No records found." +msgstr "No se encontraron registros." + +#: javascript/language.php:55 +msgid "Loading..." +msgstr "Cargando..." + +#: javascript/language.php:56 +msgid "Data error." +msgstr "Error de datos." + +#: javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "Haga click per a ordenar ascendentemente" + +#: javascript/language.php:58 +msgid "Click to sort descending" +msgstr "Haga click per a ordenar descendentemente" + +#: javascript/language.php:59 +msgid "Authorized" +msgstr "Autorizado" + +#: javascript/language.php:60 +msgid "Denied" +msgstr "Denegado" + +#: javascript/language.php:61 +msgid "of" +msgstr "de" + +#: javascript/language.php:62 +msgid "next" +msgstr "sig" + +#: javascript/language.php:63 +msgid "prev" +msgstr "ant" + +#: javascript/language.php:64 +msgid "IP" +msgstr "IP" + +#: javascript/language.php:65 +msgid "Delete unconfirmed accounts older than how many days?" +msgstr "¿Eliminar cuentas sin confirmar màs antiguas que cuantos días?" + +#: javascript/language.php:66 +msgid "The value entered is incorrect" +msgstr "El valor ingresado no es correcto" + +#: javascript/language.php:67 +msgid "Send reminder to accounts older than how many days?" +msgstr "¿Enviar recordatorio a cuentas màs antiguas que cuantos días?" + +#: javascript/language.php:68 +msgid "Are you sure you wish to delete this article?" +msgstr "¿Està seguro de querer eliminar este artículo?" + +#: javascript/language.php:69 +msgid "reminder" +msgstr "recordatorio" + +#: javascript/language.php:70 +msgid "reminders" +msgstr "recordatorios" + +#: javascript/language.php:71 +#, fuzzy +msgid "Are you sure you wish to delete this profile?" +msgstr "¿Està seguro de querer eliminar este artículo?" + +#: libs/Monkeys/Form/Element/Timezone.php:47 +msgid "-- Select a Timezone --" +msgstr "-- Seleccione una zona horaria --" + +#: libs/Monkeys/Form/Element/Country.php:35 +msgid "-- Select a Country --" +msgstr "-- Seleccione un País --" + +#: libs/Monkeys/Form/Element/Language.php:35 +msgid "-- Select a Language --" +msgstr "-- Seleccione un Idioma --" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 +msgid "January" +msgstr "Enero" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "February" +msgstr "Febrero" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "March" +msgstr "Marzo" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +msgid "April" +msgstr "Abrilperfil" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "May" +msgstr "Mayo" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "June" +msgstr "Junio" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "July" +msgstr "Julio" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "August" +msgstr "Agosto" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +msgid "Septembre" +msgstr "Septiembre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "October" +msgstr "Octubre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "November" +msgstr "Noviembre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +msgid "December" +msgstr "Diciembre" + +#: plugins/stats/Authorizations.php:21 +msgid "Authorizations per day" +msgstr "Autoritzacions per dia" + +#: plugins/stats/Sites.php:21 +msgid "Trusted Sites" +msgstr "Llocs de confiança" + +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "Lloc de confiança" + +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "Llocs d'usuaris" + +#: plugins/stats/Top.php:21 +msgid "Top 10 Trusted Sites" +msgstr "Primers 10 Llocs de Confiança" + +#: plugins/stats/Registrations.php:21 +msgid "Registrations per day" +msgstr "Registres por dia" + +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Guardar" + +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:42 +#, fuzzy +msgid "Enable" +msgstr "Home/Mascle" + +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "" + +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Formulari de Registre" + +#: modules/users/views/scripts/register/index.phtml:10 +#: modules/users/views/scripts/recoverpassword/index.phtml:4 +msgid "Send" +msgstr "Enviar" + +#: modules/users/views/scripts/register/eula.phtml:1 +msgid "Please read the following EULA in order to continue" +msgstr "Si us plau llegir els següients termes d'ús per a continuar" + +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "DE ACUERDO" + +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "EN DESACUERDO" + +#: modules/users/views/scripts/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "Hola, %s" + +#: modules/users/views/scripts/login/index.phtml:7 +msgid "Account" +msgstr "El Compte" + +#: modules/users/views/scripts/login/index.phtml:11 +msgid "Personal Info" +msgstr "Informació Personal" + +#: modules/users/views/scripts/login/index.phtml:17 +msgid "Sites database" +msgstr "Base de dades de llocs" + +#: modules/users/views/scripts/login/index.phtml:20 +msgid "History Log" +msgstr "Historial" + +#: modules/users/views/scripts/login/index.phtml:24 +msgid "Logout" +msgstr "Sortit" + +#: modules/users/views/scripts/login/index.phtml:29 +msgid "Admin options" +msgstr "Opcions d'Adminstració" + +#: modules/users/views/scripts/login/index.phtml:32 +msgid "Manage Users" +msgstr "Gestionar Usuaris" + +#: modules/users/views/scripts/login/index.phtml:35 +msgid "Message Users" +msgstr "Enviar Middatges a usuaris" + +#: modules/users/views/scripts/login/index.phtml:39 +msgid "Disable Maintenance Mode" +msgstr "Deshabilitar Modus de Manteniment" + +#: modules/users/views/scripts/login/index.phtml:41 +msgid "Enable Maintenance Mode" +msgstr "Habilitar Modus de Manteniment" + +#: modules/users/views/scripts/login/index.phtml:45 +msgid "Statistics" +msgstr "Estadísticas" + +#: modules/users/views/scripts/login/index.phtml:48 +msgid "About Community-ID" +msgstr "Sobre Community-ID" + +#: modules/users/views/scripts/login/index.phtml:55 +msgid "User access is currently disabled for system maintenance.
Please try again later" +msgstr "L'acces està actualment deshabilitat degut a manteniment del sistema.
Si us plau intente més endavant" + +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:82 +msgid "Remember me" +msgstr "Recordar-me" + +#: modules/users/views/scripts/login/index.phtml:85 +msgid "Log in" +msgstr "Ingresar" + +#: modules/users/views/scripts/login/index.phtml:91 +msgid "Forgot your password?" +msgstr "S'ha oblidat de la contrasenya?" + +#: modules/users/views/scripts/login/index.phtml:98 +msgid "You don't have an account?" +msgstr "No teniu un compte?" + +#: modules/users/views/scripts/login/index.phtml:100 +msgid "REGISTER NOW!" +msgstr "REGISTREU-VOS ARA!" + +#: modules/users/views/scripts/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "Si us plau introdueixi/escrigui la seva bústia de correu electrònic per a rebre l'enlaç per a restablir la seva contrasenya" + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "Enter search string" +msgstr "Entri/escrigui la cadena de búsqueda" + +#: modules/users/views/scripts/manageusers/index.phtml:12 +msgid "Go" +msgstr "Ir" + +#: modules/users/views/scripts/manageusers/index.phtml:13 +msgid "Clear" +msgstr "Esborrar" + +#: modules/users/views/scripts/manageusers/index.phtml:16 +msgid "All" +msgstr "Tots" + +#: modules/users/views/scripts/manageusers/index.phtml:19 +msgid "Confirmed" +msgstr "Confirmats" + +#: modules/users/views/scripts/manageusers/index.phtml:22 +msgid "Unconfirmed" +msgstr "No confirmats" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Total users:" +msgstr "Total usuaris:" + +#: modules/users/views/scripts/manageusers/index.phtml:30 +msgid "Total confirmed users:" +msgstr "Total usuaris confirmatos:" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Total unconfirmed users:" +msgstr "Total usuaris no confirmats:" + +#: modules/users/views/scripts/manageusers/index.phtml:34 +msgid "Add User" +msgstr "Agregar usuari" + +#: modules/users/views/scripts/manageusers/index.phtml:36 +msgid "Delete Unconfirmed Users" +msgstr "Eliminar usuaris no confirmats" + +#: modules/users/views/scripts/manageusers/index.phtml:39 +msgid "Send Reminder" +msgstr "Enviar Recordatorio" + +#: modules/users/views/scripts/personalinfo/edit.phtml:6 +msgid "Cancel" +msgstr "Cancelar" + +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "Esta informació serà utilitzada automàticamente per a omplir els camps de registre en qualsevol transacció OpenID que ho requereixi" + +#: modules/users/views/scripts/personalinfo/index.phtml:23 +#, fuzzy +msgid "Edit profile" +msgstr "Editar Article" + +#: modules/users/views/scripts/personalinfo/index.phtml:29 +#, fuzzy +msgid "Delete profile" +msgstr "Eliminar Artículo" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 +msgid "Not Entered" +msgstr "No Ingresat" + +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "OpenID" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 +msgid "Why do you want to delete your Community-ID account?" +msgstr "Per que desitja eliminar el seu compte de Community-ID?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "Si us plau verifiqui tot el que aplica:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "Això era només una compte de prova" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "Trobat un altre servei millor" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "El servei no té les funcionalitats clau que requereixo" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "Cap raó en particular" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +msgid "Additional comments:" +msgstr "Comentaris adicionals:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +#: modules/users/views/scripts/profile/index.phtml:44 +msgid "Delete Account" +msgstr "Eliminar el Compte" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Informació del Compte" + +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "Editar" + +#: modules/users/views/scripts/profile/index.phtml:24 +msgid "Change Password" +msgstr "Canviar contrasenya" + +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-es.phtml:37 +msgid "There are no news articles yet" +msgstr "No hi han encara artícles" + +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-es.phtml:44 +msgid "View All" +msgstr "Veure Tots" + +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-es.phtml:48 +msgid "Add New Article" +msgstr "Afegir un nou Article" + +#: modules/default/views/scripts/feedback/index.phtml:1 +msgid "In order to serve you better, we have provided the form below for your questions and comments" +msgstr "per a millorar els servei, hem creat aquest formulari per a conèixer les seves preguntes i comentaris" + +#: modules/default/views/scripts/identity/id.phtml:2 +msgid "This is the identity page for the Community-ID user identified with:" +msgstr "Esta és la seva pàgina d'identitat per a el usuari de Community-ID identificat com:" + +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "Aquest missatge serà enviat a tots els usuaris registrats de Community-ID" + +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "canviar a text plà" + +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "canviar a text enriquit (HTML)" + +#: modules/default/views/scripts/openid/trust.phtml:3 +#, php-format +msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." +msgstr "Un lloc identificat com %s a pedut la confirmació de que %s és la URL de la seva identitat" + +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "Adicionalment, també es requereix la següent informació:" + +#: modules/default/views/scripts/openid/trust.phtml:10 +msgid "Fields are automatically filled according to the personal info stored in your community-id account." +msgstr "Los campos son automaticamente llenados de acuerdo con la informació personal guardada en su cuenta de community-id." + +#: modules/default/views/scripts/openid/trust.phtml:11 +msgid "Fields marked with * are required." +msgstr "Los campos marcados con * son requeridos" + +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "" + +#: modules/default/views/scripts/openid/trust.phtml:23 +msgid "Forever" +msgstr "per a sempre" + +#: modules/default/views/scripts/openid/trust.phtml:26 +msgid "Allow" +msgstr "Permetre" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Deny" +msgstr "Denegar" + +#: modules/default/views/scripts/openid/login.phtml:26 +msgid "Login" +msgstr "Ingresar" + +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "" + +#: modules/default/views/scripts/profile/index.phtml:20 +#, php-format +msgid "The privacy policy can be found at %s" +msgstr "La política de privesa és disponible a %s" + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Esborrar Historial" + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Informació Intercanviada" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Informació intercanviada amb:" + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "D'acord, correcte i bé" + +#: modules/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "Versió instal·lada:" + +#: modules/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "Últimas notícies de Community-ID:" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "Anterior" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +msgid "Next" +msgstr "Següent" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "Últimes Notícies" + +#: modules/news/views/scripts/index/index.phtml:16 +#: modules/news/views/scripts/view/index.phtml:3 +#, php-format +msgid "Published on %s" +msgstr "Publicat en %s" + +#: modules/news/views/scripts/index/index.phtml:21 +msgid "read more" +msgstr "llgir més" + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "Editar Article" + +#: modules/news/views/scripts/view/index.phtml:7 +msgid "Delete Article" +msgstr "Eliminar Artículo" + +#: modules/install/views/scripts/index/index.phtml:2 +msgid "This Community-ID instance hasn't been installed yet" +msgstr "Esta instancia de Community-ID no ha sido instalada aún" + +#: modules/install/views/scripts/index/index.phtml:5 +msgid "Proceed with installation" +msgstr "Procedir amb la instal·lació" + +#: modules/install/views/scripts/credentials/index.phtml:3 +msgid "Database and E-mail information" +msgstr "Informació de la base de dades i bústia de correu electrònic" + +#: modules/install/views/scripts/credentials/index.phtml:13 +msgid "Administrator User Information" +msgstr "Informació del usuari Administrador" + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "Si us plau corregir els següents problemes abans de procedir:" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "Provi de nou" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "La instal·lació ha sigut realitzada amb éxit" + +#: modules/install/views/scripts/complete/index.phtml:6 +msgid "You can login as the administrator with the username and password you just provided." +msgstr "Pot ingresar com administrador amb el nombre d'usuari i contrasenya que acaba de donar." + +#: modules/install/views/scripts/complete/index.phtml:7 +msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." +msgstr "Si us plau tingui en compte que aquest usuari és només per a realitzar tasques administratives, i no pot tener una credencial OpenID." + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "Terminar" + +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "Nova versió detectada" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "Inserti les credencials d'administrador per a procedir amb la actualizació:" + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "Asegúreu-vos de fer una còia de recolçament de la base de dades, por si hi han problemes" + +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 +msgid "Home" +msgstr "Inici" + +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 +msgid "Feedback" +msgstr "Retroalimentació" + +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 +msgid "Your OpenID is:" +msgstr "El seu OpenID és:" + +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 +msgid "Maintenance mode is enabled: user access is restricted" +msgstr "El modo de mantenimient està habilitat: l'acces a usuaris és restringit" + +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "Ajut i Suport" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "Privacitat" + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "Sobre Nosotros" + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "Contacti-nos" + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "Seleccionar vista" + +#: plugins/stats/Sites.phtml:4 +msgid "Last Week" +msgstr "Semana Pasada" + +#: plugins/stats/Sites.phtml:5 +msgid "Last Year" +msgstr "Any Pasat" + +#: plugins/stats/Top.phtml:6 +#, php-format +msgid "%s users" +msgstr "%s usuaris" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "Últim Mes" + +#~ msgid "Forgot you password?" +#~ msgstr "S' ha oblidat la contrasenya?" +#~ msgid "Entri la contrasenya de nou" +#~ msgstr "Entri la contrasenya de noun" +#~ msgid "Privacy Policy" +#~ msgstr "Política de Privadesa" +#~ msgid "About Community-id" +#~ msgstr "Sobre Community-id" +#~ msgid "Body:" +#~ msgstr "Contingut:" +#~ msgid "OPEN AN ACCOUNT NOW" +#~ msgstr "OBRI UN COMPTE ARA" +#~ msgid "" +#~ "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" +#~ msgstr "" +#~ "Està cansado de tener que recordar docenas de
nombres de usuari y " +#~ "contraseñas
per a sus sitios favoritos?" +#~ msgid "Starting today
you'll only have to remember one" +#~ msgstr "A partir d'avui
només tindrà que recordar una" + diff --git a/languages/de/LC_MESSAGES/lang.mo b/languages/de/LC_MESSAGES/lang.mo new file mode 100644 index 0000000..57a0d3e Binary files /dev/null and b/languages/de/LC_MESSAGES/lang.mo differ diff --git a/languages/de/lang.po b/languages/de/LC_MESSAGES/lang.po similarity index 59% rename from languages/de/lang.po rename to languages/de/LC_MESSAGES/lang.po index d91b4c9..edf06d0 100644 --- a/languages/de/lang.po +++ b/languages/de/LC_MESSAGES/lang.po @@ -2,62 +2,214 @@ msgid "" msgstr "" "Project-Id-Version: Community-ID English translation\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-09-16 18:54+0100\n" -"PO-Revision-Date: 2009-09-16 19:08+0100\n" -"Last-Translator: Reiner Jung \n" +"POT-Creation-Date: 2010-05-26 11:15-0500\n" +"PO-Revision-Date: 2010-05-26 11:17-0500\n" +"Last-Translator: Keyboard Monkeys \n" "Language-Team: Reiner \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-KeywordsList: translate\n" -"X-Poedit-Basepath: ../../\n" +"X-Poedit-Basepath: ../../../\n" "X-Poedit-Country: GERMANY\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-SearchPath-0: modules\n" "X-Poedit-SearchPath-1: views\n" -"X-Poedit-SearchPath-2: webdir/javascript\n" +"X-Poedit-SearchPath-2: javascript\n" "X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" -#: modules/default/forms/ErrorMessages.php:20 -msgid "Value is empty, but a non-empty value is required" -msgstr "Es wurden keine Daten eingegeben, dies ist nicht zulässig " +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "Nur Dateien des Typs jpg, jpeg, png und gif sind erlaubt.
Maximale Größe ist 2 MB." -#: modules/default/forms/ErrorMessages.php:21 -msgid "'%value%' is not a valid email address in the basic format local-part@hostname" -msgstr "'%value%' ist keine gültige E-Mail Adresse im Format name@domain" +#: modules/users/forms/AccountInfo.php:26 +#: modules/users/forms/Register.php:45 +msgid "Username" +msgstr "Benutzername " -#: modules/default/forms/ErrorMessages.php:22 -msgid "'%hostname%' is not a valid hostname for email address '%value%'" -msgstr "'%hostname%' ist ein nicht gültiger hostname für die E-Mail-Adresse '%value%'" +#: modules/users/forms/AccountInfo.php:32 +#: modules/users/forms/Register.php:28 +msgid "First Name" +msgstr "Vorname" -#: modules/default/forms/ErrorMessages.php:23 -msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +#: modules/users/forms/AccountInfo.php:37 +#: modules/users/forms/Register.php:33 +msgid "Last Name" +msgstr "Nachname" + +#: modules/users/forms/AccountInfo.php:42 +#: modules/users/forms/Register.php:38 +msgid "E-mail" +msgstr "E-Mail" + +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "Authentifizierung Methode" + +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" msgstr "" -#: modules/default/forms/ErrorMessages.php:24 -msgid "'%value%' appears to be a local network name but local network names are not allowed" -msgstr "'%value%' schaut aus wie ein lokales Netzwerk jedoch sind lokale Netzwerke nicht erlaubt" +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 +msgid "Enter password" +msgstr "Passwort eingeben" -#: modules/default/forms/ErrorMessages.php:25 -msgid "Captcha value is wrong" -msgstr "Captcha-Wert ist falsch" +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 +msgid "Enter password again" +msgstr "Passwort erneut eingeben" -#: modules/default/forms/ErrorMessages.php:26 -msgid "Password confirmation does not match" -msgstr "Das eingegebene Password stimmt nicht überein " +#: modules/users/forms/PersonalInfo.php:65 +msgid "Profile Name" +msgstr "Profilname " -#: modules/default/forms/ErrorMessages.php:27 -msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" -msgstr "Benutzername kann nur US-ASCII-alphanumerische Zeichen beinhalten sowie die Symbole $-_.+!*'(),-und \"" +#: modules/users/forms/Login.php:18 +msgid "USERNAME" +msgstr "BENUTZERNAME" -#: modules/default/forms/OpenidLogin.php:27 -msgid "OpenID URL" -msgstr "OpenID URL" +#: modules/users/forms/Login.php:27 +msgid "PASSWORD" +msgstr "PASSWORT" -#: modules/default/forms/OpenidLogin.php:34 -msgid "Password" -msgstr "Passwort" +#: modules/users/forms/Register.php:51 +msgid "Enter desired password" +msgstr "Geben Sie das gewünschte Passwort ein" + +#: modules/users/forms/Register.php:68 +msgid "Please enter the text below" +msgstr "Bitte geben Sie den folgenden Text ein" + +#: modules/users/models/User.php:129 +msgid "Default profile" +msgstr "Standardprofil " + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "Sorry, die Anmeldung ist zur Zeit nicht möglich" + +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "Dieser Benutzername ist vergeben" + +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "Diese E-Mail Adresse wird schon verwendet" + +#: modules/users/controllers/RegisterController.php:95 +msgid "Community-ID registration confirmation" +msgstr "Bestätigung der Community-ID Registrierung" + +#: modules/users/controllers/RegisterController.php:100 +msgid "Thank you." +msgstr "Vielen Dank" + +#: modules/users/controllers/RegisterController.php:101 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "Es wird Ihnen eine E-Mail zu-gesendet mit Informationen wie Sie das Benutzerkonto aktivieren können. " + +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "Die Bestätigung E-Mail konnte nicht gesendet werden, so dass die Erstellung des Benutzerkonto abgebrochen wurde. Bitte nehmen Sie Kontakt zum Support auf." + +#: modules/users/controllers/RegisterController.php:106 +msgid "The account was created but the E-mail could not be sent" +msgstr "Das Benutzerkonto wurde erstellt aber die E-Mail konnte nicht versendet werden" + +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 +msgid "Invalid token" +msgstr "Ungültiger Token " + +#: modules/users/controllers/RegisterController.php:147 +msgid "Your account has been deleted" +msgstr "Ihr Benutzerkonto wurde gelöscht" + +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 +msgid "Invalid credentials" +msgstr "Ungültige Anmeldeinformationen" + +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "Es wurde kein Bild hochgeladen" + +#: modules/users/controllers/SigninimageController.php:77 +msgid "There was a problem setting the cookie" +msgstr "Beim setzen des Cookie ist ein Fehler aufgetreten" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "Bild wurde erfolgreich für diesem Computer/Browser aktiviert" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "Bild wurde erfolgreich auf diesem Computer/Browser deaktiviert" + +#: modules/users/controllers/RecoverpasswordController.php:51 +msgid "This E-mail is not registered in the system" +msgstr "Diese E-Mail Adresse ist im System nicht vorhanden" + +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 +msgid "Community-ID password reset" +msgstr "Community-ID Passwort zurückgesetzt" + +#: modules/users/controllers/RecoverpasswordController.php:74 +msgid "Password reset E-mail has been sent" +msgstr "Die E-Mail zum zurücksetzen Ihres Passworts wurde versendet" + +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "Falscher Token" + +#: modules/users/controllers/RecoverpasswordController.php:103 +msgid "You'll receive your new password via E-mail" +msgstr "Sie werden Ihr neues Passwort via E-Mail erhalten" + +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "Konnte den Yubikey nicht validieren" + +#: modules/users/controllers/ProfilegeneralController.php:301 +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "Das Benutzerkonto wurde gelöscht aber die Feedback E-Mail konnte nicht versendet werden an die Admins" + +#: modules/users/controllers/ProfilegeneralController.php:315 +msgid "Your acccount has been successfully deleted" +msgstr "Ihr Benutzerkonto wurde erfolgreich gelöscht" + +#: modules/users/controllers/UserslistController.php:59 +msgid "admin" +msgstr "Administrator" + +#: modules/users/controllers/UserslistController.php:61 +msgid "confirmed" +msgstr "bestätigt" + +#: modules/users/controllers/UserslistController.php:63 +msgid "unconfirmed" +msgstr "nicht bestätigt" + +#: modules/users/controllers/PersonalinfoController.php:87 +msgid "Profile has been saved" +msgstr "Das Profil wurde gespeichert" + +#: modules/users/controllers/PersonalinfoController.php:98 +msgid "Profile has been deleted" +msgstr "Das Profil wurde gelöscht." + +#: modules/users/controllers/ManageusersController.php:31 +msgid "User has been deleted successfully" +msgstr "Der Benutzer wurde erfolgreich gelöscht " + +#: modules/users/controllers/ManageusersController.php:48 +msgid "Community-ID registration reminder" +msgstr "Erinnerung Ihrer Community-ID Registrierung" #: modules/default/forms/MessageUsers.php:17 msgid "Subject" @@ -67,6 +219,14 @@ msgstr "Thema:" msgid "CC" msgstr "CC" +#: modules/default/forms/OpenidLogin.php:28 +msgid "OpenID URL" +msgstr "OpenID URL" + +#: modules/default/forms/OpenidLogin.php:35 +msgid "Password" +msgstr "Passwort" + #: modules/default/forms/Feedback.php:25 msgid "Enter your name" msgstr "Geben Sie Ihren Namen ein" @@ -79,9 +239,77 @@ msgstr "Geben Sie ihre E-Mail Adresse ein" msgid "Enter your questions or comments" msgstr "Geben Sie Ihre Fragen oder Kommentare ein" -#: modules/default/forms/Feedback.php:44 -msgid "Please enter the text below" -msgstr "Bitte geben Sie den folgenden Text ein" +#: modules/default/forms/ErrorMessages.php:20 +msgid "Value is empty, but a non-empty value is required" +msgstr "Es wurden keine Daten eingegeben, dies ist nicht zulässig " + +#: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "Ein Wert ist erforderlich und kann nicht leer sein" + +#: modules/default/forms/ErrorMessages.php:22 +msgid "'%value%' is not a valid email address in the basic format local-part@hostname" +msgstr "'%value%' ist keine gültige E-Mail Adresse im Format name@domain" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "'%hostname%' ist ein nicht gültiger hostname für die E-Mail-Adresse '%value%'" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "'%value%' stimmt nicht überein mit der erwarteten Struktur für einen DNS-Hostnamen" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "'%value%' schaut aus wie ein lokales Netzwerk jedoch sind lokale Netzwerke nicht erlaubt" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Captcha value is wrong" +msgstr "Captcha-Wert ist falsch" + +#: modules/default/forms/ErrorMessages.php:28 +msgid "Password confirmation does not match" +msgstr "Das eingegebene Password stimmt nicht überein " + +#: modules/default/forms/ErrorMessages.php:29 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "Benutzername kann nur US-ASCII-alphanumerische Zeichen beinhalten sowie die Symbole $-_.+!*'(),-und \"" + +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "Benutzername ist ungültig" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "Die Datei '%value%' wurde nicht hoch geladen" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "Passwort kann kein Wort sein aus einem Wörterbuch" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "Das Passwort darf nicht der Benutzernamen sein" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "Das Passwort muss länger sein als %minLength% Zeichen" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "Das Passwort muss Zahlen enthalten" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "Das Passwort muss Sonderzeichen beinhalten" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "Passwort muss Klein-und Großbuchstaben beinhalten" #: modules/default/models/Field.php:39 msgid "Male" @@ -91,42 +319,66 @@ msgstr "Mann" msgid "Female" msgstr "Frau" -#: modules/default/models/Fields.php:45 +#: modules/default/models/Fields.php:62 msgid "Nickname" msgstr "Spitzname" -#: modules/default/models/Fields.php:46 -msgid "E-mail" -msgstr "E-mail" - -#: modules/default/models/Fields.php:47 +#: modules/default/models/Fields.php:64 msgid "Full Name" msgstr "Kompletter Name" -#: modules/default/models/Fields.php:48 +#: modules/default/models/Fields.php:65 msgid "Date of Birth" msgstr "Geburtsdatum" -#: modules/default/models/Fields.php:49 +#: modules/default/models/Fields.php:66 msgid "Gender" msgstr "Geschlecht" -#: modules/default/models/Fields.php:50 +#: modules/default/models/Fields.php:67 msgid "Postal Code" msgstr "Postleitzahl" -#: modules/default/models/Fields.php:51 +#: modules/default/models/Fields.php:68 msgid "Country" msgstr "Land" -#: modules/default/models/Fields.php:52 +#: modules/default/models/Fields.php:69 msgid "Language" msgstr "Sprache" -#: modules/default/models/Fields.php:53 +#: modules/default/models/Fields.php:70 msgid "Time Zone" msgstr "Zeitzone" +#: modules/default/controllers/MessageusersController.php:46 +msgid "CC field must be a comma-separated list of valid E-mails" +msgstr "Das CC Feld erlaubt ein Komma-separierte Liste mit gültigen E-Mails" + +#: modules/default/controllers/MessageusersController.php:86 +msgid "Message has been sent" +msgstr "Nachricht wurde gesendet" + +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "Es ist ein Fehler aufgetreten beim versenden der Nachricht" + +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "Die eingegebene URL ist falsch. Bitte korrigieren Sie und versuchen es erneut." + +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "Zugriff verweigert - Vielleicht ist Ihre Session ist abgelaufen? Versuchen Sie, sich erneut." + +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "Vielen Dank für Ihr Interesse. Ihre Nachricht wurde weitergeleitet." + +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "Leider konnte das Feedback nicht zugestellt werden. Bitte versuchen Sie es später erneut." + #: modules/default/controllers/CidController.php:29 msgid "Could not retrieve news items" msgstr "Neue Nachrichten konnten nicht abgerufen werden" @@ -135,9 +387,9 @@ msgstr "Neue Nachrichten konnten nicht abgerufen werden" msgid "Read More" msgstr "Mehr lesen" -#: modules/default/controllers/MessageusersController.php:46 -msgid "CC field must be a comma-separated list of valid E-mails" -msgstr "Das CC Feld erlaubt ein Komma-separierte Liste mit gültigen E-Mails" +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "Verboten" #: modules/news/forms/Article.php:18 msgid "Title" @@ -164,635 +416,416 @@ msgstr "Der Artikel wurde gespeichert" msgid "The article has been deleted." msgstr "Der Artikel wurde gelöscht." -#: modules/stats/controllers/SitesController.php:68 -msgid "Trusted sites" -msgstr "Vertrauenswürdige Seiten" +#: modules/install/forms/Install.php:18 +msgid "Hostname" +msgstr "Hostname" -#: modules/stats/controllers/SitesController.php:75 -msgid "Sites per user" -msgstr "Seiten pro Benutzer" +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "normalerweise localhost" -#: modules/install/forms/UpgradeLogin.php:18 -msgid "Username" -msgstr "Benutzername" +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "Datenbank Name" -#: modules/install/controllers/UpgradeController.php:57 -#: modules/install/controllers/UpgradeController.php:65 -msgid "Invalid credentials" -msgstr "Ungültige Anmeldeinformationen" +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "Datenbank Benutzername" -#: modules/install/controllers/UpgradeController.php:73 +#: modules/install/forms/Install.php:40 +msgid "Database password" +msgstr "Datenbank Password" + +#: modules/install/forms/Install.php:44 +msgid "Support E-mail" +msgstr "Support E-mail" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "Wird als Absender für jede Nachricht verwendet die durch das System verschickt wird, und als Empfänger für Benutzer-Feedback" + +#: modules/install/controllers/UpgradeController.php:80 #, php-format msgid "Upgrade was successful. You are now on version %s" msgstr "Upgrade erfolgreich. Sie benutzen jetzt Version %s" -#: modules/install/controllers/UpgradeController.php:102 +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "" + +#: modules/install/controllers/UpgradeController.php:117 #, php-format msgid "Correct before upgrading: File %s is required to proceed" msgstr "Korrigieren Sie vor dem Upgrade: Die Datei %s ist erforderlich, um fortzufahren" -#: modules/install/controllers/CredentialsController.php:200 +#: modules/install/controllers/UpgradeController.php:159 +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "Bitte überprüfen Sie die folgenden Anforderungen bevor Sie fortfahren mit dem Upgrade:" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "Wir konnten keine Verbindung zu der Datenbank herstellen mit den Anmeldeinformationen." + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "Überprüfen Sie es und versuchen es erneut." + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "Die Verbindung zur Datenbank konnte hergestellt werden, die Datenbank %s existiert nicht oder der verwendete Benutzer hat kein Zugriff darauf. Es wurde versucht Sie zu erstellen aber der verwendete Benutzer hat keine ausreichenden Rechte. Bitte erstellen Sie diese selbst und versuchen Sie es erneut. " + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "PHP Version %s oder höher wird benötigt " + +#: modules/install/controllers/CredentialsController.php:234 #, php-format msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." msgstr "Der Ordner in welchem Community-ID installiert wurde beschreibbar sein für der Webserver Benutzer (%s). Eine andere Option ist eine LEERE config.php Datei zu erstellen und diese beschreibbar zu machen für diesen Benutzer." -#: modules/install/controllers/CredentialsController.php:203 +#: modules/install/controllers/CredentialsController.php:237 #, php-format msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" msgstr "Der Webserver Benutzer (%s) muss Schreibrechte haben für den Ordner \"catchas\" " -#: modules/install/controllers/CredentialsController.php:206 +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 #, php-format msgid "You need to have the %s extension installed" msgstr "Sie müssen die Erweiterung %s installiert haben" -#: modules/users/forms/Login.php:18 -msgid "USERNAME" -msgstr "BENUTZERNAME" +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "Sie benötigen PNG Unterstützung in Ihrer GD Konfiguration " -#: modules/users/forms/Login.php:27 -msgid "PASSWORD" -msgstr "PASSWORT" +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "" -#: modules/users/forms/ChangePassword.php:18 -#: modules/users/forms/AccountInfo.php:52 -msgid "Enter password" -msgstr "Passwort eingeben" - -#: modules/users/forms/ChangePassword.php:24 -#: modules/users/forms/Register.php:55 -#: modules/users/forms/AccountInfo.php:58 -msgid "Enter password again" -msgstr "Passwort erneut eingeben" - -#: modules/users/forms/Register.php:26 -#: modules/users/forms/AccountInfo.php:32 -msgid "First Name" -msgstr "Vorname" - -#: modules/users/forms/Register.php:31 -#: modules/users/forms/AccountInfo.php:37 -msgid "Last Name" -msgstr "Nachname" - -#: modules/users/forms/Register.php:49 -msgid "Enter desired password" -msgstr "Geben Sie das gewünschte Passwort ein" - -#: modules/users/controllers/ManageusersController.php:25 -msgid "User has been deleted successfully" -msgstr "Der Benutzer wurde erfolgreich gelöscht " - -#: modules/users/controllers/ManageusersController.php:42 -msgid "Community-ID registration reminder" -msgstr "Erinnerung Ihrer Community-ID Registrierung" - -#: modules/users/controllers/ProfilegeneralController.php:76 -#: modules/users/controllers/RegisterController.php:59 -msgid "This username is already in use" -msgstr "Dieser Benutzername ist vergeben" - -#: modules/users/controllers/ProfilegeneralController.php:85 -#: modules/users/controllers/RegisterController.php:66 -msgid "This E-mail is already in use" -msgstr "Diese E-Mail Adresse wird schon verwendet" - -#: modules/users/controllers/ProfilegeneralController.php:247 -msgid "Your acccount has been successfully deleted" -msgstr "Ihr Benutzerkonto wurde erfolgreich gelöscht" - -#: modules/users/controllers/UserslistController.php:52 -msgid "admin" -msgstr "Administrator" - -#: modules/users/controllers/UserslistController.php:54 -msgid "confirmed" -msgstr "bestätigt" - -#: modules/users/controllers/UserslistController.php:56 -msgid "unconfirmed" -msgstr "nicht bestätigt" - -#: modules/users/controllers/RegisterController.php:26 -msgid "Sorry, registrations are currently disabled" -msgstr "Sorry, die Anmeldung ist zur Zeit nicht möglich" - -#: modules/users/controllers/RegisterController.php:101 -msgid "Community-ID registration confirmation" -msgstr "Bestätigung der Community-ID Registrierung" - -#: modules/users/controllers/RegisterController.php:104 -msgid "Thank you." -msgstr "Vielen Dank" - -#: modules/users/controllers/RegisterController.php:105 -msgid "You will receive an E-mail with instructions to activate the account." -msgstr "Es wird Ihnen eine E-Mail zu-gesendet mit Informationen wie Sie das Benutzerkonto aktivieren können. " - -#: modules/users/controllers/RegisterController.php:107 -msgid "The account was created but the E-mail could not be sent" -msgstr "Das Benutzerkonto wurde erstellt aber die E-Mail konnte nicht versendet werden" - -#: modules/users/controllers/RegisterController.php:121 -#: modules/users/controllers/RegisterController.php:150 -#: modules/users/controllers/RegisterController.php:165 -msgid "Invalid token" -msgstr "Ungültiger Token " - -#: modules/users/controllers/RegisterController.php:156 -msgid "Your account has been deleted" -msgstr "Ihr Benutzerkonto wurde gelöscht" - -#: modules/users/controllers/RecoverpasswordController.php:51 -msgid "This E-mail is not registered in the system" -msgstr "Diese E-Mail Adresse ist im System nicht vorhanden" - -#: modules/users/controllers/RecoverpasswordController.php:82 -#: modules/users/controllers/RecoverpasswordController.php:121 -msgid "Community-ID password reset" -msgstr "Community-ID Passwort zurückgesetzt" - -#: modules/users/controllers/RecoverpasswordController.php:84 -msgid "Password reset E-mail has been sent" -msgstr "Die E-Mail zum zurücksetzen Ihres Passworts wurde versendet" - -#: modules/users/controllers/RecoverpasswordController.php:123 -msgid "You'll receive your new password via E-mail" -msgstr "Sie werden Ihr neues Passwort via E-Mail erhalten" - -#: webdir/javascript/language.php:30 +#: javascript/language.php:30 msgid "Name" msgstr "Name" -#: webdir/javascript/language.php:31 +#: javascript/language.php:31 msgid "Registration" msgstr "Anmeldung" -#: webdir/javascript/language.php:32 +#: javascript/language.php:32 msgid "Status" msgstr "Status" -#: webdir/javascript/language.php:33 +#: javascript/language.php:33 msgid "profile" msgstr "profil" -#: webdir/javascript/language.php:34 +#: javascript/language.php:34 msgid "delete" msgstr "löschen" -#: webdir/javascript/language.php:35 +#: javascript/language.php:35 msgid "Site" msgstr "Seite" -#: webdir/javascript/language.php:36 +#: javascript/language.php:36 msgid "view info exchanged" msgstr "Ausgetauschte Informationen ansehen" -#: webdir/javascript/language.php:37 +#: javascript/language.php:37 msgid "deny" msgstr "verbieten" -#: webdir/javascript/language.php:38 +#: javascript/language.php:38 msgid "allow" msgstr "erlauben" -#: webdir/javascript/language.php:39 +#: javascript/language.php:39 msgid "Are you sure you wish to send this message to ALL users?" msgstr "Sind Sie sicher das Sie diese Nachricht an ALLE Benutzer senden möchten?" -#: webdir/javascript/language.php:40 +#: javascript/language.php:40 msgid "Are you sure you wish to deny trust to this site?" msgstr "Sind Sie sicher das Sie die Vertrauensstellung mit dieser Seite aufheben möchten?" -#: webdir/javascript/language.php:41 +#: javascript/language.php:41 msgid "operation failed" msgstr "Operation fehlgeschlagen" -#: webdir/javascript/language.php:42 +#: javascript/language.php:42 msgid "Trust to the following site has been granted:" msgstr "Die Vertrauensstellung mit dieser Seite wurde hergestellt:" -#: webdir/javascript/language.php:43 +#: javascript/language.php:43 msgid "Trust the following site has been denied:" msgstr "Die Vertrauensstellung mit dieser Seite wurde verweigert:" -#: webdir/javascript/language.php:44 +#: javascript/language.php:44 msgid "ERROR. The server returned:" msgstr "FEHLER: Der Server antwortet: " -#: webdir/javascript/language.php:45 +#: javascript/language.php:45 msgid "Your relationship with the following site has been deleted:" msgstr "Ihre Vertrauensstellung zu dieser Seite wurde gelöscht:" -#: webdir/javascript/language.php:46 +#: javascript/language.php:46 msgid "The history log has been cleared" msgstr "Die Historie wurde gelöscht" -#: webdir/javascript/language.php:47 +#: javascript/language.php:47 msgid "Are you sure you wish to allow access to this site?" msgstr "Sind Sie sicher das Sie den Zugriff für diese Seite erlauben möchten?" -#: webdir/javascript/language.php:48 +#: javascript/language.php:48 msgid "Are you sure you wish to delete your relationship with this site?" msgstr "Sind Sie sicher das Sie die Vertrauensstellung mit dieser Seite löschen möchten?" -#: webdir/javascript/language.php:49 +#: javascript/language.php:49 msgid "Are you sure you wish to delete all the History Log?" msgstr "Sind Sie sicher das Sie die Historie löschen möchten?" -#: webdir/javascript/language.php:50 +#: javascript/language.php:50 msgid "Are you sure you wish to delete the user" msgstr "Sind Sie sicher das Sie diesen Benutzer löschen möchten?" -#: webdir/javascript/language.php:51 +#: javascript/language.php:51 msgid "Are you sure you wish to delete all the unconfirmed accounts?" msgstr "Sind Sie sicher das Sie alle nicht bestätigten Benutzerkonten löschen möchten?" -#: webdir/javascript/language.php:52 +#: javascript/language.php:52 msgid "Date" msgstr "Datum" -#: webdir/javascript/language.php:53 +#: javascript/language.php:53 msgid "Result" msgstr "Ergebnisse" -#: webdir/javascript/language.php:54 +#: javascript/language.php:54 msgid "No records found." msgstr "Keine Einträge gefunden." -#: webdir/javascript/language.php:55 +#: javascript/language.php:55 msgid "Loading..." msgstr "Lade..." -#: webdir/javascript/language.php:56 +#: javascript/language.php:56 msgid "Data error." msgstr "Datenfehler." -#: webdir/javascript/language.php:57 +#: javascript/language.php:57 msgid "Click to sort ascending" msgstr "Klicken Sie, um aufsteigend zu sortieren" -#: webdir/javascript/language.php:58 +#: javascript/language.php:58 msgid "Click to sort descending" msgstr "Klicken Sie, um absteigend zu sortieren " -#: webdir/javascript/language.php:59 +#: javascript/language.php:59 msgid "Authorized" msgstr "autorisiert" -#: webdir/javascript/language.php:60 +#: javascript/language.php:60 msgid "Denied" msgstr "Verweigert" -#: webdir/javascript/language.php:61 +#: javascript/language.php:61 msgid "of" msgstr "von" -#: webdir/javascript/language.php:62 +#: javascript/language.php:62 msgid "next" msgstr "nächste" -#: webdir/javascript/language.php:63 +#: javascript/language.php:63 msgid "prev" msgstr "vorherige" -#: webdir/javascript/language.php:64 +#: javascript/language.php:64 msgid "IP" msgstr "IP" -#: webdir/javascript/language.php:65 +#: javascript/language.php:65 msgid "Delete unconfirmed accounts older than how many days?" msgstr "Unbestätigte Konten löschen älter als, wie viele Tage?" -#: webdir/javascript/language.php:66 +#: javascript/language.php:66 msgid "The value entered is incorrect" msgstr "Der eingegebene Wert ist nicht korrekt " -#: webdir/javascript/language.php:67 +#: javascript/language.php:67 msgid "Send reminder to accounts older than how many days?" msgstr "Erinnerung senden von Konten älter als, wie viele Tage?" -#: webdir/javascript/language.php:68 +#: javascript/language.php:68 msgid "Are you sure you wish to delete this article?" msgstr "Sind Sie sicher das Sie diesen Artikel löschen möchten?" -#: webdir/javascript/language.php:69 +#: javascript/language.php:69 msgid "reminder" msgstr "Erinnerung" -#: webdir/javascript/language.php:70 +#: javascript/language.php:70 msgid "reminders" msgstr "Erinnerungen" -#: libs/Monkeys/Form/Element/Country.php:36 -msgid "-- Select a Country --" -msgstr "-- Wählen Sie ein Land --" +#: javascript/language.php:71 +msgid "Are you sure you wish to delete this profile?" +msgstr "Sind Sie sicher das Sie dieses Profil löschen möchten?" -#: libs/Monkeys/Form/Element/Timezone.php:48 +#: libs/Monkeys/Form/Element/Timezone.php:47 msgid "-- Select a Timezone --" msgstr "-- Wählen Sie eine Zeitzone -- " -#: libs/Monkeys/Form/Element/Language.php:36 +#: libs/Monkeys/Form/Element/Country.php:35 +msgid "-- Select a Country --" +msgstr "-- Wählen Sie ein Land --" + +#: libs/Monkeys/Form/Element/Language.php:35 msgid "-- Select a Language --" msgstr "-- Wählen Sie eine Sprache --" -#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 msgid "January" msgstr "Januar" -#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 msgid "February" msgstr "Februar " -#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 msgid "March" msgstr "März " -#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 msgid "April" msgstr "April" -#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 msgid "May" msgstr "Mai" -#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 msgid "June" msgstr "Juni" -#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 msgid "July" msgstr "Juli " -#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 msgid "August" msgstr "August" -#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 msgid "Septembre" msgstr "September" -#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 msgid "October" msgstr "Oktober" -#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 msgid "November" msgstr "November" -#: libs/Monkeys/View/Helper/FormDateSelects.php:278 +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 msgid "December" msgstr "Dezember" -#: modules/default/views/scripts/feedback/index.phtml:1 -msgid "In order to serve you better, we have provided the form below for your questions and comments" -msgstr "Um unseren Service zu verbessern, haben Sie die Möglichkeit das untenstehende Formular für Ihre Fragen und Kommentare zu benutzen" - -#: modules/default/views/scripts/feedback/index.phtml:7 -#: modules/default/views/scripts/messageusers/index.phtml:29 -msgid "Send" -msgstr "Senden" - -#: modules/default/views/scripts/identity/id.phtml:2 -msgid "This is the identity page for the Community-ID user identified with:" -msgstr " " - -#: modules/default/views/scripts/cid/index.phtml:1 -msgid "About Community-ID" -msgstr "Über Community-ID" - -#: modules/default/views/scripts/cid/index.phtml:3 -msgid "Version installed:" -msgstr "Installierte Version" - -#: modules/default/views/scripts/cid/index.phtml:8 -msgid "Latest news from Community-ID:" -msgstr "Letzen News von Community-ID:" - -#: modules/default/views/scripts/messageusers/index.phtml:9 -msgid "This message will be sent to all registered Community-ID users" -msgstr "Diese Nachricht wird an alle registrierten Community-ID Benutzer gesendet" - -#: modules/default/views/scripts/messageusers/index.phtml:16 -msgid "switch to Plain-Text" -msgstr "Zu Plain-Text umschalten" - -#: modules/default/views/scripts/messageusers/index.phtml:19 -msgid "switch to Rich-Text (HTML)" -msgstr "Zu Rich-Text umschalten (HTML)" - -#: modules/default/views/scripts/privacy/index.phtml:1 -msgid "Privacy Policy" -msgstr "Datenschutzrichtlinie" - -#: modules/default/views/scripts/index/index-en.phtml:39 -#: modules/default/views/scripts/index/index-sv.phtml:49 -#: modules/default/views/scripts/index/index-de.phtml:39 -#: modules/default/views/scripts/index/index-es.phtml:37 -msgid "There are no news articles yet" -msgstr "Es gibt noch keine News-Artikel" - -#: modules/default/views/scripts/index/index-en.phtml:46 -#: modules/default/views/scripts/index/index-sv.phtml:56 -#: modules/default/views/scripts/index/index-de.phtml:46 -#: modules/default/views/scripts/index/index-es.phtml:44 -msgid "View All" -msgstr "Alle anzeigen" - -#: modules/default/views/scripts/index/index-en.phtml:50 -#: modules/default/views/scripts/index/index-sv.phtml:60 -#: modules/default/views/scripts/index/index-de.phtml:50 -#: modules/default/views/scripts/index/index-es.phtml:48 -msgid "Add New Article" -msgstr "Neuen Artikel hinzufügen " - -#: modules/default/views/scripts/openid/trust.phtml:3 -#, php-format -msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." -msgstr "Eine Seite identifiziert als %s möchte die Bestätigung das %s Ihre gültige URL ist." - -#: modules/default/views/scripts/openid/trust.phtml:9 -msgid "It also requests this additional information about you:" -msgstr "Zusätzliche Informationen über Sie werden benötigt:" - -#: modules/default/views/scripts/openid/trust.phtml:10 -msgid "Fields are automatically filled according to the personal info stored in your community-id account." -msgstr "Felder werden automatisch ausgefüllt bezüglich den gespeichert persönlichen Informationen in ihrem Community-ID Konto." - -#: modules/default/views/scripts/openid/trust.phtml:11 -msgid "Fields marked with * are required." -msgstr "(Felder markiert mit einem (*) sind erforderlich) " - -#: modules/default/views/scripts/openid/trust.phtml:19 -#, php-format -msgid "The private policy can be found at %s" -msgstr "Die Datenschutzrichline ist verfügbar unter %s" - -#: modules/default/views/scripts/openid/trust.phtml:24 -msgid "Forever" -msgstr "Für immer" - -#: modules/default/views/scripts/openid/trust.phtml:27 -msgid "Allow" -msgstr "Erlauben" - -#: modules/default/views/scripts/openid/trust.phtml:28 -msgid "Deny" -msgstr "Verbieten" - -#: modules/default/views/scripts/openid/login.phtml:9 -msgid "Login" -msgstr "Anmelden " - -#: modules/default/views/scripts/sites/index.phtml:15 -msgid "Information Exchanged" -msgstr "Ausgetauschte Informationen" - -#: modules/default/views/scripts/sites/index.phtml:17 -msgid "Information exchanged with:" -msgstr "Informationen ausgetauscht mit: " - -#: modules/default/views/scripts/sites/index.phtml:21 -msgid "OK" -msgstr "OK" - -#: modules/default/views/scripts/history/index.phtml:13 -msgid "Clear History" -msgstr "Historie löschen" - -#: modules/news/views/scripts/edit/index.phtml:8 -msgid "Save" -msgstr "Speichern" - -#: modules/news/views/scripts/edit/index.phtml:9 -msgid "Cancel" -msgstr "Abbrechen" - -#: modules/news/views/scripts/view/index.phtml:3 -#, php-format -msgid "Published on %s" -msgstr "Veröffentlicht am %s" - -#: modules/news/views/scripts/view/index.phtml:6 -msgid "Edit Article" -msgstr "Artikel bearbeiten" - -#: modules/news/views/scripts/view/index.phtml:7 -msgid "Delete Article" -msgstr "Artikel löschen" - -#: modules/news/views/scripts/index/pagination.phtml:10 -#: modules/news/views/scripts/index/pagination.phtml:13 -msgid "Previous" -msgstr "Vorherige" - -#: modules/news/views/scripts/index/pagination.phtml:30 -#: modules/news/views/scripts/index/pagination.phtml:33 -msgid "Next" -msgstr "Nächste" - -#: modules/news/views/scripts/index/index.phtml:3 -msgid "Latest News" -msgstr "Letzte News" - -#: modules/news/views/scripts/index/index.phtml:21 -msgid "read more" -msgstr "Mehr lesen " - -#: modules/stats/views/scripts/authorizations/index.phtml:1 +#: plugins/stats/Authorizations.php:21 msgid "Authorizations per day" msgstr "Berechtigungen pro Tag" -#: modules/stats/views/scripts/authorizations/index.phtml:3 -#: modules/stats/views/scripts/registrations/index.phtml:3 -#: modules/stats/views/scripts/sites/index.phtml:3 -msgid "Select view" -msgstr "Ansicht wählen" - -#: modules/stats/views/scripts/authorizations/index.phtml:5 -#: modules/stats/views/scripts/registrations/index.phtml:5 -#: modules/stats/views/scripts/sites/index.phtml:5 -msgid "Last Week" -msgstr "Letzter Woche" - -#: modules/stats/views/scripts/authorizations/index.phtml:6 -#: modules/stats/views/scripts/registrations/index.phtml:7 -#: modules/stats/views/scripts/sites/index.phtml:6 -msgid "Last Year" -msgstr "Letztem Jahr" - -#: modules/stats/views/scripts/registrations/index.phtml:1 -msgid "Registrations per day" -msgstr "Anmeldungen pro Tag" - -#: modules/stats/views/scripts/registrations/index.phtml:6 -msgid "Last Month" -msgstr "Letztem Monat" - -#: modules/stats/views/scripts/sites/index.phtml:1 +#: plugins/stats/Sites.php:21 msgid "Trusted Sites" msgstr "Vertraute Seiten" -#: modules/stats/views/scripts/top/index.phtml:1 +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "Vertrauenswürdige Seiten" + +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "Seiten pro Benutzer" + +#: plugins/stats/Top.php:21 msgid "Top 10 Trusted Sites" msgstr "Top 10 vertrauenswürdige Seiten" -#: modules/stats/views/scripts/top/index.phtml:7 -#, php-format -msgid "%s users" -msgstr "%s Benutzer" +#: plugins/stats/Registrations.php:21 +msgid "Registrations per day" +msgstr "Anmeldungen pro Tag" -#: modules/install/views/scripts/complete/index.phtml:2 -msgid "The installation was performed successfully" -msgstr "Die Installation war erfolgreich" +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "Log-In Bild" -#: modules/install/views/scripts/complete/index.phtml:6 -msgid "You can login as the administrator with the username and password you just provided." -msgstr "Sie können sich als Administrator mit dem Benutzernamen und Passwort anmelden welches Sie gerade festgelegt haben." +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "Sie haben kein Bild hochgeladen" -#: modules/install/views/scripts/complete/index.phtml:7 -msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." -msgstr "Bitte beachten Sie, dass dieser Benutzer nur für administrative Aufgaben genutzt werden kann jedoch keine OpenID Konto." +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "Wählen Sie ein Bild welches sie benutzen möchten als Ihr Log-in Bild:" -#: modules/install/views/scripts/complete/index.phtml:10 -msgid "Finish" -msgstr "Beenden " +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Speichern" -#: modules/install/views/scripts/credentials/index.phtml:3 -msgid "Database and E-mail information" -msgstr "Datenbank und E-Mail informationen" +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "" -#: modules/install/views/scripts/credentials/index.phtml:13 -msgid "Administrator User Information" -msgstr "Administrator Benutzerinformationen " +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "Es dient als Gegenmaßnahme gegen Phishing, da nur Sie das Bild kennen können Sie einfach überprüfen das diese Seite nicht verfälscht wurde. " -#: modules/install/views/scripts/index/index.phtml:2 -msgid "This Community-ID instance hasn't been installed yet" -msgstr "Diese Community-ID Installation wurde noch nicht installiert" +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "" -#: modules/install/views/scripts/index/index.phtml:5 -msgid "Proceed with installation" -msgstr "Mit der Installation fortfahren" +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "Verwenden Sie den folgenden Button zum Aktivieren / Deaktivieren für den aktuellen Computer / Browser:" -#: modules/install/views/scripts/upgrade/index.phtml:1 -msgid "New version detected" -msgstr "Neue Version gefunden" +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "Deaktivieren" -#: modules/install/views/scripts/upgrade/index.phtml:3 -msgid "Enter the administrator credentials to proceed with the upgrade:" -msgstr "Geben Sie die Administrator-Anmeldeinformationen ein um mit dem Upgrade fortzufahren:" +#: modules/users/views/scripts/signinimage/index.phtml:42 +msgid "Enable" +msgstr "Aktivieren" -#: modules/install/views/scripts/upgrade/index.phtml:6 -msgid "Make sure you make a copy of the database before, just in case" -msgstr "Machen Sie eine Kopie der Datenbank, nur für den Fall" +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "Weitere Anweisungen werden angezeigt, nachdem Sie das Bild hochladen haben." -#: modules/install/views/scripts/permissions/index.phtml:2 -msgid "Please correct the following problems before proceeding:" -msgstr "Bitte korrigieren Sie die folgenden Probleme bevor Sie fortfahren:" +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Anmeldeformular" -#: modules/install/views/scripts/permissions/index.phtml:10 -msgid "Check again" -msgstr "Nochmals überprüfen" +#: modules/users/views/scripts/register/index.phtml:10 +#: modules/users/views/scripts/recoverpassword/index.phtml:4 +msgid "Send" +msgstr "Senden" + +#: modules/users/views/scripts/register/eula.phtml:1 +msgid "Please read the following EULA in order to continue" +msgstr "Bitte lesen Sie die folgende EULA bevor Sie fortzufahren " + +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "ICH STIMME ZU" + +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "ICH STIMME NICHT ZU" #: modules/users/views/scripts/login/index.phtml:3 #, php-format @@ -807,66 +840,79 @@ msgstr "Benutzerkonto" msgid "Personal Info" msgstr "Persönliche Informationen " -#: modules/users/views/scripts/login/index.phtml:14 +#: modules/users/views/scripts/login/index.phtml:17 msgid "Sites database" msgstr "Gespeicherte Seiten" -#: modules/users/views/scripts/login/index.phtml:17 +#: modules/users/views/scripts/login/index.phtml:20 msgid "History Log" msgstr "Historie" -#: modules/users/views/scripts/login/index.phtml:21 +#: modules/users/views/scripts/login/index.phtml:24 msgid "Logout" msgstr "Abmelden" -#: modules/users/views/scripts/login/index.phtml:26 +#: modules/users/views/scripts/login/index.phtml:29 msgid "Admin options" msgstr "Administration " -#: modules/users/views/scripts/login/index.phtml:29 +#: modules/users/views/scripts/login/index.phtml:32 msgid "Manage Users" msgstr "Benutzer verwalten" -#: modules/users/views/scripts/login/index.phtml:32 +#: modules/users/views/scripts/login/index.phtml:35 msgid "Message Users" msgstr "Nachricht an Benutzer" -#: modules/users/views/scripts/login/index.phtml:36 +#: modules/users/views/scripts/login/index.phtml:39 msgid "Disable Maintenance Mode" msgstr "Wartungsmodus deaktivieren " -#: modules/users/views/scripts/login/index.phtml:38 +#: modules/users/views/scripts/login/index.phtml:41 msgid "Enable Maintenance Mode" msgstr "Wartungsmodus aktivieren" -#: modules/users/views/scripts/login/index.phtml:42 +#: modules/users/views/scripts/login/index.phtml:45 msgid "Statistics" msgstr "Statistiken" -#: modules/users/views/scripts/login/index.phtml:52 +#: modules/users/views/scripts/login/index.phtml:48 +msgid "About Community-ID" +msgstr "Über Community-ID" + +#: modules/users/views/scripts/login/index.phtml:55 msgid "User access is currently disabled for system maintenance.
Please try again later" msgstr "Die Anmeldung ist zur Zeit nicht möglich wegen Wartungsarbeiten.
Bitte versuchen Sie es zu einem späteren Zeitpunkt nochmals" -#: modules/users/views/scripts/login/index.phtml:66 +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:82 msgid "Remember me" msgstr "An mich erinnern " -#: modules/users/views/scripts/login/index.phtml:69 +#: modules/users/views/scripts/login/index.phtml:85 msgid "Log in" msgstr "Anmelden" -#: modules/users/views/scripts/login/index.phtml:75 -msgid "Forgot you password?" -msgstr "Passwort vergessen?" +#: modules/users/views/scripts/login/index.phtml:91 +msgid "Forgot your password?" +msgstr "Passwort vergessen? " -#: modules/users/views/scripts/login/index.phtml:81 +#: modules/users/views/scripts/login/index.phtml:98 msgid "You don't have an account?" msgstr "Sie haben noch keine Benutzerkonto?" -#: modules/users/views/scripts/login/index.phtml:83 +#: modules/users/views/scripts/login/index.phtml:100 msgid "REGISTER NOW!" msgstr "JETZT ANMELDEN!" +#: modules/users/views/scripts/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "Bitte geben Sie Ihre E-Mail ein und Sie erhalten einen Link zum Zurücksetzen Ihres Passworts" + #: modules/users/views/scripts/manageusers/index.phtml:11 msgid "Enter search string" msgstr "Suchbegriff eingeben" @@ -915,21 +961,29 @@ msgstr "Nicht bestätigte Benutzer löschen" msgid "Send Reminder" msgstr "Erinnerung senden" -#: modules/users/views/scripts/profile/index.phtml:13 -msgid "Account info" -msgstr "Benutzerkonto Details" +#: modules/users/views/scripts/personalinfo/edit.phtml:6 +msgid "Cancel" +msgstr "Abbrechen" -#: modules/users/views/scripts/profile/index.phtml:17 -msgid "Edit" -msgstr "Bearbeiten" +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "Diese Informationen werden verwendet, um automatisch alle Felder auszufüllen währen einer OpenID Transaktion" -#: modules/users/views/scripts/profile/index.phtml:20 -msgid "Change Password" -msgstr "Passwort ändern" +#: modules/users/views/scripts/personalinfo/index.phtml:23 +msgid "Edit profile" +msgstr "Profil bearbeiten" -#: modules/users/views/scripts/profile/index.phtml:39 -msgid "Delete Account" -msgstr "Konto löschen" +#: modules/users/views/scripts/personalinfo/index.phtml:29 +msgid "Delete profile" +msgstr "Profil löschen" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 +msgid "Not Entered" +msgstr "Nicht eingegeben" + +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "Ein anderes Profil erstellen" #: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 msgid "OpenID" @@ -963,50 +1017,279 @@ msgstr "Kein besondere Grund" msgid "Additional comments:" msgstr "Zusätzliche Kommentare:" -#: modules/users/views/scripts/recoverpassword/index.phtml:1 -msgid "Please enter your E-mail below to receive a link to reset your password" -msgstr "Bitte geben Sie Ihre E-Mail ein und Sie erhalten einen Link zum Zurücksetzen Ihres Passworts" +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +#: modules/users/views/scripts/profile/index.phtml:44 +msgid "Delete Account" +msgstr "Konto löschen" -#: modules/users/views/scripts/register/eula.phtml:1 -msgid "Please read the following EULA in order to continue" -msgstr "Bitte lesen Sie die folgende EULA bevor Sie fortzufahren " +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Benutzerkonto Details" -#: modules/users/views/scripts/register/eula.phtml:8 -msgid "I AGREE" -msgstr "ICH STIMME ZU" +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "Bearbeiten" -#: modules/users/views/scripts/register/eula.phtml:9 -msgid "I DISAGREE" -msgstr "ICH STIMME NICHT ZU" +#: modules/users/views/scripts/profile/index.phtml:24 +msgid "Change Password" +msgstr "Passwort ändern" -#: modules/users/views/scripts/register/index.phtml:1 -msgid "Registration Form" -msgstr "Anmeldeformular" +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-es.phtml:37 +msgid "There are no news articles yet" +msgstr "Es gibt noch keine News-Artikel" -#: modules/users/views/scripts/personalinfo/show.phtml:8 -msgid "Not Entered" -msgstr "Nicht eingegeben" +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-es.phtml:44 +msgid "View All" +msgstr "Alle anzeigen" -#: modules/users/views/scripts/personalinfo/index.phtml:22 -msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" -msgstr "Diese Informationen werden verwendet, um automatisch alle Felder auszufüllen währen einer OpenID Transaktion" +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-es.phtml:48 +msgid "Add New Article" +msgstr "Neuen Artikel hinzufügen " -#: views/layouts/layout.phtml:32 +#: modules/default/views/scripts/feedback/index.phtml:1 +msgid "In order to serve you better, we have provided the form below for your questions and comments" +msgstr "Um unseren Service zu verbessern, haben Sie die Möglichkeit das untenstehende Formular für Ihre Fragen und Kommentare zu benutzen" + +#: modules/default/views/scripts/identity/id.phtml:2 +msgid "This is the identity page for the Community-ID user identified with:" +msgstr " " + +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "Diese Nachricht wird an alle registrierten Community-ID Benutzer gesendet" + +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "Zu Plain-Text umschalten" + +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "Zu Rich-Text umschalten (HTML)" + +#: modules/default/views/scripts/openid/trust.phtml:3 +#, php-format +msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." +msgstr "Eine Seite identifiziert als %s möchte die Bestätigung das %s Ihre gültige URL ist." + +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "Zusätzliche Informationen über Sie werden benötigt:" + +#: modules/default/views/scripts/openid/trust.phtml:10 +msgid "Fields are automatically filled according to the personal info stored in your community-id account." +msgstr "Felder werden automatisch ausgefüllt bezüglich den gespeichert persönlichen Informationen in ihrem Community-ID Konto." + +#: modules/default/views/scripts/openid/trust.phtml:11 +msgid "Fields marked with * are required." +msgstr "(Felder markiert mit einem (*) sind erforderlich) " + +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "Bitte warten" + +#: modules/default/views/scripts/openid/trust.phtml:23 +msgid "Forever" +msgstr "Für immer" + +#: modules/default/views/scripts/openid/trust.phtml:26 +msgid "Allow" +msgstr "Erlauben" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Deny" +msgstr "Verbieten" + +#: modules/default/views/scripts/openid/login.phtml:26 +msgid "Login" +msgstr "Anmelden " + +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "Bitte wählen Sie das Profil welches Sie benutzen wollen " + +#: modules/default/views/scripts/profile/index.phtml:20 +#, php-format +msgid "The privacy policy can be found at %s" +msgstr "Die Datenschutzrichline ist verfügbar unter %s " + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Historie löschen" + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Ausgetauschte Informationen" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Informationen ausgetauscht mit: " + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "OK" + +#: modules/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "Installierte Version" + +#: modules/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "Letzen News von Community-ID:" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "Vorherige" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +msgid "Next" +msgstr "Nächste" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "Letzte News" + +#: modules/news/views/scripts/index/index.phtml:16 +#: modules/news/views/scripts/view/index.phtml:3 +#, php-format +msgid "Published on %s" +msgstr "Veröffentlicht am %s" + +#: modules/news/views/scripts/index/index.phtml:21 +msgid "read more" +msgstr "Mehr lesen " + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "Artikel bearbeiten" + +#: modules/news/views/scripts/view/index.phtml:7 +msgid "Delete Article" +msgstr "Artikel löschen" + +#: modules/install/views/scripts/index/index.phtml:2 +msgid "This Community-ID instance hasn't been installed yet" +msgstr "Diese Community-ID Installation wurde noch nicht installiert" + +#: modules/install/views/scripts/index/index.phtml:5 +msgid "Proceed with installation" +msgstr "Mit der Installation fortfahren" + +#: modules/install/views/scripts/credentials/index.phtml:3 +msgid "Database and E-mail information" +msgstr "Datenbank und E-Mail informationen" + +#: modules/install/views/scripts/credentials/index.phtml:13 +msgid "Administrator User Information" +msgstr "Administrator Benutzerinformationen " + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "Bitte korrigieren Sie die folgenden Probleme bevor Sie fortfahren:" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "Nochmals überprüfen" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "Die Installation war erfolgreich" + +#: modules/install/views/scripts/complete/index.phtml:6 +msgid "You can login as the administrator with the username and password you just provided." +msgstr "Sie können sich als Administrator mit dem Benutzernamen und Passwort anmelden welches Sie gerade festgelegt haben." + +#: modules/install/views/scripts/complete/index.phtml:7 +msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." +msgstr "Bitte beachten Sie, dass dieser Benutzer nur für administrative Aufgaben genutzt werden kann jedoch keine OpenID Konto." + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "Beenden " + +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "Neue Version gefunden" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "Geben Sie die Administrator-Anmeldeinformationen ein um mit dem Upgrade fortzufahren:" + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "Machen Sie eine Kopie der Datenbank, nur für den Fall" + +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 msgid "Home" msgstr "Home" -#: views/layouts/layout.phtml:35 +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 msgid "Feedback" msgstr "Feedback" -#: views/layouts/layout.phtml:41 +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 msgid "Your OpenID is:" msgstr "Ihre OpenID ist:" -#: views/layouts/layout.phtml:58 +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 msgid "Maintenance mode is enabled: user access is restricted" msgstr "Der Wartungsmodus ist eingeschaltet und der Benutzer Zugang ist eingeschränkt" +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "Hilfe und Support" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "Datenschutz " + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "Über uns " + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "Kontakt " + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "Ansicht wählen" + +#: plugins/stats/Sites.phtml:4 +msgid "Last Week" +msgstr "Letzter Woche" + +#: plugins/stats/Sites.phtml:5 +msgid "Last Year" +msgstr "Letztem Jahr" + +#: plugins/stats/Top.phtml:6 +#, php-format +msgid "%s users" +msgstr "%s Benutzer" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "Letztem Monat" + +#~ msgid "Forgot you password?" +#~ msgstr "Passwort vergessen?" +#~ msgid "Privacy Policy" +#~ msgstr "Datenschutzrichtlinie" #~ msgid "Body:" #~ msgstr "Body:" #~ msgid "" @@ -1015,14 +1298,6 @@ msgstr "Der Wartungsmodus ist eingeschaltet und der Benutzer Zugang ist eingesch #~ msgstr "Starting" #~ msgid "Starting today
you'll only have to remember one" #~ msgstr "Von heute an müssen
Sie sich nur noch eins erinnern" -#~ msgid "Help and Support" -#~ msgstr "Hilfe und Support" -#~ msgid "Privacy" -#~ msgstr "Datenschutz " -#~ msgid "About Us" -#~ msgstr "Ãœber uns " -#~ msgid "Contact Us" -#~ msgstr "Kontakt " #~ msgid "OPEN AN ACCOUNT NOW" #~ msgstr "EIN BENUTZERKONTO ERSTELLEN" #~ msgid "Arabic" diff --git a/languages/de/lang.mo b/languages/de/lang.mo deleted file mode 100644 index 87493db..0000000 Binary files a/languages/de/lang.mo and /dev/null differ diff --git a/languages/en/LC_MESSAGES/lang.mo b/languages/en/LC_MESSAGES/lang.mo new file mode 100644 index 0000000..8499905 Binary files /dev/null and b/languages/en/LC_MESSAGES/lang.mo differ diff --git a/languages/en/lang.po b/languages/en/LC_MESSAGES/lang.po similarity index 50% rename from languages/en/lang.po rename to languages/en/LC_MESSAGES/lang.po index f3e451a..f866a0e 100644 --- a/languages/en/lang.po +++ b/languages/en/LC_MESSAGES/lang.po @@ -2,80 +2,229 @@ msgid "" msgstr "" "Project-Id-Version: Community-ID English translation\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-08-20 19:39-0500\n" -"PO-Revision-Date: 2009-08-20 19:42-0500\n" -"Last-Translator: Alejandro Pedraza \n" +"POT-Creation-Date: 2010-05-26 11:14-0500\n" +"PO-Revision-Date: 2010-05-26 11:15-0500\n" +"Last-Translator: Keyboard Monkeys \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: English\n" "X-Poedit-KeywordsList: translate\n" -"X-Poedit-Basepath: ../../\n" +"X-Poedit-Basepath: ../../../\n" "X-Poedit-SearchPath-0: modules\n" "X-Poedit-SearchPath-1: views\n" -"X-Poedit-SearchPath-2: webdir/javascript\n" +"X-Poedit-SearchPath-2: javascript\n" +"X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" -#: modules/default/controllers/CidController.php:29 -msgid "Could not retrieve news items" -msgstr "Could not retrieve news items" +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." -#: modules/default/controllers/CidController.php:47 -msgid "Read More" -msgstr "Read More" +#: modules/users/forms/AccountInfo.php:26 +#: modules/users/forms/Register.php:45 +msgid "Username" +msgstr "Username" -#: modules/default/controllers/MessageusersController.php:46 -msgid "CC field must be a comma-separated list of valid E-mails" -msgstr "CC field must be a comma-separated list of valid E-mails" +#: modules/users/forms/AccountInfo.php:32 +#: modules/users/forms/Register.php:28 +msgid "First Name" +msgstr "First Name" -#: modules/default/forms/ErrorMessages.php:20 -msgid "Value is empty, but a non-empty value is required" -msgstr "Value is empty, but a non-empty value is required" +#: modules/users/forms/AccountInfo.php:37 +#: modules/users/forms/Register.php:33 +msgid "Last Name" +msgstr "Last Name" -#: modules/default/forms/ErrorMessages.php:21 -msgid "'%value%' is not a valid email address in the basic format local-part@hostname" -msgstr "'%value%' is not a valid email address in the basic format name@domain" +#: modules/users/forms/AccountInfo.php:42 +#: modules/users/forms/Register.php:38 +msgid "E-mail" +msgstr "E-mail" -#: modules/default/forms/ErrorMessages.php:22 -msgid "'%hostname%' is not a valid hostname for email address '%value%'" -msgstr "'%hostname%' is not a valid hostname for email address '%value%'" +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "Auth Method" -#: modules/default/forms/ErrorMessages.php:23 -msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" -msgstr "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" +msgstr "Associated YubiKey" -#: modules/default/forms/ErrorMessages.php:24 -msgid "'%value%' appears to be a local network name but local network names are not allowed" -msgstr "'%value%' appears to be a local network name but local network names are not allowed" +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 +msgid "Enter password" +msgstr "Enter password" -#: modules/default/forms/ErrorMessages.php:25 -msgid "Captcha value is wrong" -msgstr "Captcha value is wrong" +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 +msgid "Enter password again" +msgstr "Enter password again" -#: modules/default/forms/ErrorMessages.php:26 -msgid "Password confirmation does not match" -msgstr "Password confirmation does not match" +#: modules/users/forms/PersonalInfo.php:65 +msgid "Profile Name" +msgstr "Profile Name" -#: modules/default/forms/ErrorMessages.php:27 -msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" -msgstr "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +#: modules/users/forms/Login.php:18 +msgid "USERNAME" +msgstr "USERNAME" -#: modules/default/forms/OpenidLogin.php:27 +#: modules/users/forms/Login.php:27 +msgid "PASSWORD" +msgstr "PASSWORD" + +#: modules/users/forms/Register.php:51 +msgid "Enter desired password" +msgstr "Enter desired password" + +#: modules/users/forms/Register.php:68 +msgid "Please enter the text below" +msgstr "Please enter the text below" + +#: modules/users/models/User.php:129 +msgid "Default profile" +msgstr "Default profile" + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "Sorry, registrations are currently disabled" + +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "This username is already in use" + +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "This E-mail is already in use" + +#: modules/users/controllers/RegisterController.php:95 +msgid "Community-ID registration confirmation" +msgstr "Community-ID registration confirmation" + +#: modules/users/controllers/RegisterController.php:100 +msgid "Thank you." +msgstr "Thank you." + +#: modules/users/controllers/RegisterController.php:101 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "You will receive an E-mail with instructions to activate the account." + +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." + +#: modules/users/controllers/RegisterController.php:106 +msgid "The account was created but the E-mail could not be sent" +msgstr "The account was created but the E-mail could not be sent" + +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 +msgid "Invalid token" +msgstr "Invalid token" + +#: modules/users/controllers/RegisterController.php:147 +msgid "Your account has been deleted" +msgstr "Your account has been deleted" + +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 +msgid "Invalid credentials" +msgstr "Invalid credentials" + +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "There is no image uploaded" + +#: modules/users/controllers/SigninimageController.php:77 +msgid "There was a problem setting the cookie" +msgstr "There was a problem setting the cookie" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "Image has been set successfully on this computer/browser" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "Image has been disabled successfully on this computer/browser" + +#: modules/users/controllers/RecoverpasswordController.php:51 +msgid "This E-mail is not registered in the system" +msgstr "This E-mail is not registered in the system" + +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 +msgid "Community-ID password reset" +msgstr "Community-ID password reset" + +#: modules/users/controllers/RecoverpasswordController.php:74 +msgid "Password reset E-mail has been sent" +msgstr "Password reset E-mail has been sent" + +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "Wrong Token" + +#: modules/users/controllers/RecoverpasswordController.php:103 +msgid "You'll receive your new password via E-mail" +msgstr "You'll receive your new password via E-mail" + +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "Could not validate Yubikey" + +#: modules/users/controllers/ProfilegeneralController.php:301 +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "Account was deleted, but feedback form couldn't be sent to admins" + +#: modules/users/controllers/ProfilegeneralController.php:315 +msgid "Your acccount has been successfully deleted" +msgstr "Your acccount has been successfully deleted" + +#: modules/users/controllers/UserslistController.php:59 +msgid "admin" +msgstr "admin" + +#: modules/users/controllers/UserslistController.php:61 +msgid "confirmed" +msgstr "confirmed" + +#: modules/users/controllers/UserslistController.php:63 +msgid "unconfirmed" +msgstr "unconfirmed" + +#: modules/users/controllers/PersonalinfoController.php:87 +msgid "Profile has been saved" +msgstr "Profile has been saved" + +#: modules/users/controllers/PersonalinfoController.php:98 +msgid "Profile has been deleted" +msgstr "Profile has been deleted" + +#: modules/users/controllers/ManageusersController.php:31 +msgid "User has been deleted successfully" +msgstr "User has been deleted successfully" + +#: modules/users/controllers/ManageusersController.php:48 +msgid "Community-ID registration reminder" +msgstr "Community-ID registration reminder" + +#: modules/default/forms/MessageUsers.php:17 +msgid "Subject" +msgstr "Subject" + +#: modules/default/forms/MessageUsers.php:22 +msgid "CC" +msgstr "CC" + +#: modules/default/forms/OpenidLogin.php:28 msgid "OpenID URL" msgstr "OpenID URL" -#: modules/default/forms/OpenidLogin.php:34 +#: modules/default/forms/OpenidLogin.php:35 msgid "Password" msgstr "Password" -#: modules/default/forms/MessageUsers.php:17 -msgid "Subject:" -msgstr "Subject:" - -#: modules/default/forms/MessageUsers.php:22 -msgid "CC:" -msgstr "CC:" - #: modules/default/forms/Feedback.php:25 msgid "Enter your name" msgstr "Enter your name" @@ -88,45 +237,77 @@ msgstr "Enter your E-mail" msgid "Enter your questions or comments" msgstr "Enter your questions or comments" -#: modules/default/forms/Feedback.php:44 -msgid "Please enter the text below" -msgstr "Please enter the text below" +#: modules/default/forms/ErrorMessages.php:20 +msgid "Value is empty, but a non-empty value is required" +msgstr "Value is empty, but a non-empty value is required" -#: modules/default/models/Fields.php:45 -msgid "Nickname" -msgstr "Nickname" +#: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "Value is required and can't be empty" -#: modules/default/models/Fields.php:46 -msgid "E-mail" -msgstr "E-mail" +#: modules/default/forms/ErrorMessages.php:22 +msgid "'%value%' is not a valid email address in the basic format local-part@hostname" +msgstr "'%value%' is not a valid email address in the basic format name@domain" -#: modules/default/models/Fields.php:47 -msgid "Full Name" -msgstr "Full Name" +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "'%hostname%' is not a valid hostname for email address '%value%'" -#: modules/default/models/Fields.php:48 -msgid "Date of Birth" -msgstr "Date of Birth" +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "'%value%' does not match the expected structure for a DNS hostname" -#: modules/default/models/Fields.php:49 -msgid "Gender" -msgstr "Gender" +#: modules/default/forms/ErrorMessages.php:25 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "'%value%' appears to be a DNS hostname but cannot match TLD against known list" -#: modules/default/models/Fields.php:50 -msgid "Postal Code" -msgstr "Postal Code" +#: modules/default/forms/ErrorMessages.php:26 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "'%value%' appears to be a local network name but local network names are not allowed" -#: modules/default/models/Fields.php:51 -msgid "Country" -msgstr "Country" +#: modules/default/forms/ErrorMessages.php:27 +msgid "Captcha value is wrong" +msgstr "Captcha value is wrong" -#: modules/default/models/Fields.php:52 -msgid "Language" -msgstr "Language" +#: modules/default/forms/ErrorMessages.php:28 +msgid "Password confirmation does not match" +msgstr "Password confirmation does not match" -#: modules/default/models/Fields.php:53 -msgid "Time Zone" -msgstr "Time Zone" +#: modules/default/forms/ErrorMessages.php:29 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" + +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "Username is invalid" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "The file '%value%' was not uploaded" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "Password can't be a dictionary word" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "Password can't contain the username" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "Password must be longer than %minLength% characters" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "Password must contain numbers" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "Password must contain symbols" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "Password needs to have lowercase and uppercase characters" #: modules/default/models/Field.php:39 msgid "Male" @@ -136,161 +317,77 @@ msgstr "Male" msgid "Female" msgstr "Female" -#: modules/install/controllers/CredentialsController.php:183 -#, php-format -msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." -msgstr "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." +#: modules/default/models/Fields.php:62 +msgid "Nickname" +msgstr "Nickname" -#: modules/install/controllers/CredentialsController.php:186 -#, php-format -msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" -msgstr "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" +#: modules/default/models/Fields.php:64 +msgid "Full Name" +msgstr "Full Name" -#: modules/install/controllers/CredentialsController.php:189 -#, php-format -msgid "You need to have the %s extension installed" -msgstr "You need to have the %s extension installed" +#: modules/default/models/Fields.php:65 +msgid "Date of Birth" +msgstr "Date of Birth" -#: modules/install/controllers/UpgradeController.php:57 -#: modules/install/controllers/UpgradeController.php:65 -#: modules/users/controllers/LoginController.php:46 -#: modules/users/controllers/LoginController.php:74 -msgid "Invalid credentials" -msgstr "Invalid credentials" +#: modules/default/models/Fields.php:66 +msgid "Gender" +msgstr "Gender" -#: modules/install/controllers/UpgradeController.php:73 -#, php-format -msgid "Upgrade was successful. You are now on version %s" -msgstr "Upgrade was successful. You are now on version %s" +#: modules/default/models/Fields.php:67 +msgid "Postal Code" +msgstr "Postal Code" -#: modules/install/controllers/UpgradeController.php:97 -#, php-format -msgid "Correct before upgrading: File %s is required to proceed" -msgstr "Correct before upgrading: File %s is required to proceed" +#: modules/default/models/Fields.php:68 +msgid "Country" +msgstr "Country" -#: modules/install/forms/UpgradeLogin.php:18 -#: modules/users/forms/AccountInfo.php:26 -msgid "Username" -msgstr "Username" +#: modules/default/models/Fields.php:69 +msgid "Language" +msgstr "Language" -#: modules/users/controllers/UserslistController.php:52 -msgid "admin" -msgstr "admin" +#: modules/default/models/Fields.php:70 +msgid "Time Zone" +msgstr "Time Zone" -#: modules/users/controllers/UserslistController.php:54 -msgid "confirmed" -msgstr "confirmed" +#: modules/default/controllers/MessageusersController.php:46 +msgid "CC field must be a comma-separated list of valid E-mails" +msgstr "CC field must be a comma-separated list of valid E-mails" -#: modules/users/controllers/UserslistController.php:56 -msgid "unconfirmed" -msgstr "unconfirmed" +#: modules/default/controllers/MessageusersController.php:86 +msgid "Message has been sent" +msgstr "Message has been sent" -#: modules/users/controllers/ProfilegeneralController.php:76 -#: modules/users/controllers/RegisterController.php:59 -msgid "This username is already in use" -msgstr "This username is already in use" +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "There was an error trying to send the message" -#: modules/users/controllers/ProfilegeneralController.php:85 -#: modules/users/controllers/RegisterController.php:66 -msgid "This E-mail is already in use" -msgstr "This E-mail is already in use" +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "The URL you entered is incorrect. Please correct and try again." -#: modules/users/controllers/ProfilegeneralController.php:243 -msgid "Your acccount has been successfully deleted" -msgstr "Your acccount has been successfully deleted" +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "Access Denied - Maybe your session has expired? Try logging-in again." -#: modules/users/controllers/RegisterController.php:26 -msgid "Sorry, registrations are currently disabled" -msgstr "Sorry, registrations are currently disabled" +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "Thank you for your interest. Your message has been routed." -#: modules/users/controllers/RegisterController.php:101 -msgid "Community-ID registration confirmation" -msgstr "Community-ID registration confirmation" +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "Sorry, the feedback couldn't be delivered. Please try again later." -#: modules/users/controllers/RegisterController.php:104 -msgid "Thank you." -msgstr "Thank you." +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "Could not retrieve news items" -#: modules/users/controllers/RegisterController.php:105 -msgid "You will receive an E-mail with instructions to activate the account." -msgstr "You will receive an E-mail with instructions to activate the account." +#: modules/default/controllers/CidController.php:47 +msgid "Read More" +msgstr "Read More" -#: modules/users/controllers/RegisterController.php:107 -msgid "The account was created but the E-mail could not be sent" -msgstr "The account was created but the E-mail could not be sent" - -#: modules/users/controllers/RegisterController.php:121 -#: modules/users/controllers/RegisterController.php:149 -#: modules/users/controllers/RegisterController.php:163 -msgid "Invalid token" -msgstr "Invalid token" - -#: modules/users/controllers/RegisterController.php:154 -msgid "Your account has been deleted" -msgstr "Your account has been deleted" - -#: modules/users/controllers/ManageusersController.php:25 -msgid "User has been deleted successfully" -msgstr "User has been deleted successfully" - -#: modules/users/controllers/ManageusersController.php:42 -msgid "Community-ID registration reminder" -msgstr "Community-ID registration reminder" - -#: modules/users/controllers/RecoverpasswordController.php:51 -msgid "This E-mail is not registered in the system" -msgstr "This E-mail is not registered in the system" - -#: modules/users/controllers/RecoverpasswordController.php:82 -#: modules/users/controllers/RecoverpasswordController.php:121 -msgid "Community-ID password reset" -msgstr "Community-ID password reset" - -#: modules/users/controllers/RecoverpasswordController.php:84 -msgid "Password reset E-mail has been sent" -msgstr "Password reset E-mail has been sent" - -#: modules/users/controllers/RecoverpasswordController.php:123 -msgid "You'll receive your new password via E-mail" -msgstr "You'll receive your new password via E-mail" - -#: modules/users/forms/Login.php:18 -msgid "USERNAME" -msgstr "USERNAME" - -#: modules/users/forms/Login.php:27 -msgid "PASSWORD" -msgstr "PASSWORD" - -#: modules/users/forms/AccountInfo.php:32 -msgid "First Name" -msgstr "First Name" - -#: modules/users/forms/AccountInfo.php:37 -msgid "Last Name" -msgstr "Last Name" - -#: modules/users/forms/AccountInfo.php:52 -#: modules/users/forms/ChangePassword.php:18 -msgid "Enter password" -msgstr "Enter password" - -#: modules/users/forms/AccountInfo.php:58 -#: modules/users/forms/ChangePassword.php:24 -msgid "Enter password again" -msgstr "Enter password again" - -#: modules/users/forms/Register.php:49 -msgid "Enter desired password" -msgstr "Enter desired password" - -#: modules/stats/controllers/SitesController.php:68 -msgid "Trusted sites" -msgstr "Trusted sites" - -#: modules/stats/controllers/SitesController.php:75 -msgid "Sites per user" -msgstr "Sites per user" +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "Forbidden" #: modules/news/forms/Article.php:18 msgid "Title" @@ -304,328 +401,515 @@ msgstr "Publication date" msgid "Excerpt" msgstr "Excerpt" -#: webdir/javascript/language.php:30 +#: modules/news/controllers/EditController.php:60 +#: modules/news/controllers/EditController.php:90 +msgid "The article doesn't exist." +msgstr "The article doesn't exist." + +#: modules/news/controllers/EditController.php:81 +msgid "The article has been saved." +msgstr "The article has been saved." + +#: modules/news/controllers/EditController.php:93 +msgid "The article has been deleted." +msgstr "The article has been deleted." + +#: modules/install/forms/Install.php:18 +msgid "Hostname" +msgstr "Hostname" + +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "usually localhost" + +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "Database name" + +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "Database username" + +#: modules/install/forms/Install.php:40 +msgid "Database password" +msgstr "Database password" + +#: modules/install/forms/Install.php:44 +msgid "Support E-mail" +msgstr "Support E-mail" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" + +#: modules/install/controllers/UpgradeController.php:80 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "Upgrade was successful. You are now on version %s" + +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." + +#: modules/install/controllers/UpgradeController.php:117 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "Correct before upgrading: File %s is required to proceed" + +#: modules/install/controllers/UpgradeController.php:159 +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "Please address the following requirements before proceeding with the upgrade:" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "We couldn't connect to the database using those credentials." + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "Please verify and try again." + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "PHP version %s or greater is required" + +#: modules/install/controllers/CredentialsController.php:234 +#, php-format +msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." +msgstr "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." + +#: modules/install/controllers/CredentialsController.php:237 +#, php-format +msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" +msgstr "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" + +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "You need to have the %s extension installed" + +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "You need to have PNG support in your GD configuration" + +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "You need to have Freetype support in your GD configuration" + +#: javascript/language.php:30 msgid "Name" msgstr "Name" -#: webdir/javascript/language.php:31 +#: javascript/language.php:31 msgid "Registration" msgstr "Registration" -#: webdir/javascript/language.php:32 +#: javascript/language.php:32 msgid "Status" msgstr "Status" -#: webdir/javascript/language.php:33 +#: javascript/language.php:33 msgid "profile" msgstr "profile" -#: webdir/javascript/language.php:34 +#: javascript/language.php:34 msgid "delete" msgstr "delete" -#: webdir/javascript/language.php:35 +#: javascript/language.php:35 msgid "Site" msgstr "Site" -#: webdir/javascript/language.php:36 +#: javascript/language.php:36 msgid "view info exchanged" msgstr "view info exchanged" -#: webdir/javascript/language.php:37 +#: javascript/language.php:37 msgid "deny" msgstr "deny" -#: webdir/javascript/language.php:38 +#: javascript/language.php:38 msgid "allow" msgstr "allow" -#: webdir/javascript/language.php:39 +#: javascript/language.php:39 msgid "Are you sure you wish to send this message to ALL users?" msgstr "Are you sure you wish to send this message to ALL users?" -#: webdir/javascript/language.php:40 +#: javascript/language.php:40 msgid "Are you sure you wish to deny trust to this site?" msgstr "Are you sure you wish to deny trust to this site?" -#: webdir/javascript/language.php:41 +#: javascript/language.php:41 msgid "operation failed" msgstr "operation failed" -#: webdir/javascript/language.php:42 +#: javascript/language.php:42 msgid "Trust to the following site has been granted:" msgstr "Trust to the following site has been granted:" -#: webdir/javascript/language.php:43 +#: javascript/language.php:43 msgid "Trust the following site has been denied:" msgstr "Trust the following site has been denied:" -#: webdir/javascript/language.php:44 +#: javascript/language.php:44 msgid "ERROR. The server returned:" msgstr "ERROR. The server returned:" -#: webdir/javascript/language.php:45 +#: javascript/language.php:45 msgid "Your relationship with the following site has been deleted:" msgstr "Your relationship with the following site has been deleted:" -#: webdir/javascript/language.php:46 +#: javascript/language.php:46 msgid "The history log has been cleared" msgstr "The history log has been cleared" -#: webdir/javascript/language.php:47 +#: javascript/language.php:47 msgid "Are you sure you wish to allow access to this site?" msgstr "Are you sure you wish to allow access to this site?" -#: webdir/javascript/language.php:48 +#: javascript/language.php:48 msgid "Are you sure you wish to delete your relationship with this site?" msgstr "Are you sure you wish to delete your relationship with this site?" -#: webdir/javascript/language.php:49 +#: javascript/language.php:49 msgid "Are you sure you wish to delete all the History Log?" msgstr "Are you sure you wish to delete all the History Log?" -#: webdir/javascript/language.php:50 +#: javascript/language.php:50 msgid "Are you sure you wish to delete the user" msgstr "Are you sure you wish to delete the user" -#: webdir/javascript/language.php:51 +#: javascript/language.php:51 msgid "Are you sure you wish to delete all the unconfirmed accounts?" msgstr "Are you sure you wish to delete all the unconfirmed accounts?" -#: webdir/javascript/language.php:52 +#: javascript/language.php:52 msgid "Date" msgstr "Date" -#: webdir/javascript/language.php:53 +#: javascript/language.php:53 msgid "Result" msgstr "Result" -#: webdir/javascript/language.php:54 +#: javascript/language.php:54 msgid "No records found." msgstr "No records found." -#: webdir/javascript/language.php:55 +#: javascript/language.php:55 msgid "Loading..." msgstr "Loading..." -#: webdir/javascript/language.php:56 +#: javascript/language.php:56 msgid "Data error." msgstr "Data error." -#: webdir/javascript/language.php:57 +#: javascript/language.php:57 msgid "Click to sort ascending" msgstr "Click to sort ascending" -#: webdir/javascript/language.php:58 +#: javascript/language.php:58 msgid "Click to sort descending" msgstr "Click to sort descending" -#: webdir/javascript/language.php:59 +#: javascript/language.php:59 msgid "Authorized" msgstr "Authorized" -#: webdir/javascript/language.php:60 +#: javascript/language.php:60 msgid "Denied" msgstr "Denied" -#: webdir/javascript/language.php:61 +#: javascript/language.php:61 msgid "of" msgstr "of" -#: webdir/javascript/language.php:62 +#: javascript/language.php:62 msgid "next" msgstr "next" -#: webdir/javascript/language.php:63 +#: javascript/language.php:63 msgid "prev" msgstr "prev" -#: webdir/javascript/language.php:64 +#: javascript/language.php:64 msgid "IP" msgstr "IP" -#: webdir/javascript/language.php:65 +#: javascript/language.php:65 msgid "Delete unconfirmed accounts older than how many days?" msgstr "Delete unconfirmed accounts older than how many days?" -#: webdir/javascript/language.php:66 +#: javascript/language.php:66 msgid "The value entered is incorrect" msgstr "The value entered is incorrect" -#: webdir/javascript/language.php:67 +#: javascript/language.php:67 msgid "Send reminder to accounts older than how many days?" msgstr "Send reminder to accounts older than how many days?" -#: webdir/javascript/language.php:68 +#: javascript/language.php:68 msgid "Are you sure you wish to delete this article?" msgstr "Are you sure you wish to delete this article?" -#: modules/default/views/scripts/openid/login.phtml:9 -msgid "Login" -msgstr "Login" +#: javascript/language.php:69 +msgid "reminder" +msgstr "reminder" -#: modules/default/views/scripts/openid/trust.phtml:3 -#, php-format -msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." -msgstr "A site identifying as %s has asked for confirmation that %s is your identity URL." +#: javascript/language.php:70 +msgid "reminders" +msgstr "reminders" -#: modules/default/views/scripts/openid/trust.phtml:9 -msgid "It also requests this additional information about you:" -msgstr "It also requests this additional information about you:" +#: javascript/language.php:71 +msgid "Are you sure you wish to delete this profile?" +msgstr "Are you sure you wish to delete this profile?" -#: modules/default/views/scripts/openid/trust.phtml:10 -msgid "Fields are automatically filled according to the personal info stored in your community-id account." -msgstr "Fields are automatically filled according to the personal info stored in your community-id account." +#: libs/Monkeys/Form/Element/Timezone.php:47 +msgid "-- Select a Timezone --" +msgstr "-- Select a Timezone --" -#: modules/default/views/scripts/openid/trust.phtml:11 -msgid "Fields marked with * are required." -msgstr "Fields marked with * are required." +#: libs/Monkeys/Form/Element/Country.php:35 +msgid "-- Select a Country --" +msgstr "-- Select a Country --" -#: modules/default/views/scripts/openid/trust.phtml:19 -#, php-format -msgid "The private policy can be found at %s" -msgstr "The private policy can be found at %s" +#: libs/Monkeys/Form/Element/Language.php:35 +msgid "-- Select a Language --" +msgstr "-- Select a Language --" -#: modules/default/views/scripts/openid/trust.phtml:24 -msgid "Forever" -msgstr "Forever" +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 +msgid "January" +msgstr "January" -#: modules/default/views/scripts/openid/trust.phtml:27 -msgid "Allow" -msgstr "Allow" +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "February" +msgstr "February" -#: modules/default/views/scripts/openid/trust.phtml:28 -msgid "Deny" -msgstr "Deny" +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "March" +msgstr "March" -#: modules/default/views/scripts/sites/index.phtml:15 -msgid "Information Exchanged" -msgstr "Information Exchanged" +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +msgid "April" +msgstr "April" -#: modules/default/views/scripts/sites/index.phtml:17 -msgid "Information exchanged with:" -msgstr "Information exchanged with:" +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "May" +msgstr "May" -#: modules/default/views/scripts/sites/index.phtml:21 -msgid "OK" -msgstr "OK" +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "June" +msgstr "June" -#: modules/default/views/scripts/history/index.phtml:13 -msgid "Clear History" -msgstr "Clear History" +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "July" +msgstr "July" -#: modules/default/views/scripts/index/index-es.phtml:37 -#: modules/default/views/scripts/index/index-de.phtml:39 -#: modules/default/views/scripts/index/index-en.phtml:39 -msgid "There are no news articles yet" -msgstr "There are no news articles yet" +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "August" +msgstr "August" -#: modules/default/views/scripts/index/index-es.phtml:44 -#: modules/default/views/scripts/index/index-de.phtml:46 -#: modules/default/views/scripts/index/index-en.phtml:46 -msgid "View All" -msgstr "View All" +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +msgid "Septembre" +msgstr "Septembre" -#: modules/default/views/scripts/index/index-es.phtml:48 -#: modules/default/views/scripts/index/index-de.phtml:50 -#: modules/default/views/scripts/index/index-en.phtml:50 -msgid "Add New Article" -msgstr "Add New Article" +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "October" +msgstr "October" -#: modules/default/views/scripts/cid/index.phtml:1 -msgid "About Community-id" -msgstr "About Community-id" +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "November" +msgstr "November" -#: modules/default/views/scripts/cid/index.phtml:3 -msgid "Version installed:" -msgstr "Version installed:" +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +msgid "December" +msgstr "December" -#: modules/default/views/scripts/cid/index.phtml:8 -msgid "Latest news from Community-ID:" -msgstr "Latest news from Community-ID:" +#: plugins/stats/Authorizations.php:21 +msgid "Authorizations per day" +msgstr "Authorizations per day" -#: modules/default/views/scripts/messageusers/index.phtml:9 -msgid "This message will be sent to all registered Community-ID users" -msgstr "This message will be sent to all registered Community-ID users" +#: plugins/stats/Sites.php:21 +msgid "Trusted Sites" +msgstr "Trusted Sites" -#: modules/default/views/scripts/messageusers/index.phtml:16 -msgid "switch to Plain-Text" -msgstr "switch to Plain-Text" +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "Trusted sites" -#: modules/default/views/scripts/messageusers/index.phtml:19 -msgid "switch to Rich-Text (HTML)" -msgstr "switch to Rich-Text (HTML)" +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "Sites per user" -#: modules/default/views/scripts/messageusers/index.phtml:29 -#: modules/default/views/scripts/feedback/index.phtml:7 -#: modules/install/views/scripts/credentials/index.phtml:12 -#: modules/install/views/scripts/upgrade/index.phtml:11 +#: plugins/stats/Top.php:21 +msgid "Top 10 Trusted Sites" +msgstr "Top 10 Trusted Sites" + +#: plugins/stats/Registrations.php:21 +msgid "Registrations per day" +msgstr "Registrations per day" + +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "Sign-in Image" + +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "You haven't uploaded an image yet" + +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "Select an image to use as your Sign-in Image:" + +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Save" + +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "This image will be shown in the log-in and OpenID authentication screens of Community-ID." + +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." + +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." + +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "Use the following button to enable/disable it in the current computer/browser:" + +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "Disable" + +#: modules/users/views/scripts/signinimage/index.phtml:42 +msgid "Enable" +msgstr "Enable" + +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "Further instructions will appear after you upload the image." + +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Registration Form" + +#: modules/users/views/scripts/register/index.phtml:10 +#: modules/users/views/scripts/recoverpassword/index.phtml:4 msgid "Send" msgstr "Send" -#: modules/default/views/scripts/privacy/index.phtml:1 -msgid "Privacy Policy" -msgstr "Privacy Policy" +#: modules/users/views/scripts/register/eula.phtml:1 +msgid "Please read the following EULA in order to continue" +msgstr "Please read the following EULA in order to continue" -#: modules/default/views/scripts/feedback/index.phtml:1 -msgid "In order to serve you better, we have provided the form below for your questions and comments" -msgstr "In order to serve you better, we have provided the form below for your questions and comments" +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "I AGREE" -#: modules/install/views/scripts/complete/index.phtml:2 -msgid "The installation was performed successfully" -msgstr "The installation was performed successfully" +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "I DISAGREE" -#: modules/install/views/scripts/complete/index.phtml:10 -msgid "Finish" -msgstr "Finish" +#: modules/users/views/scripts/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "Hello, %s" -#: modules/install/views/scripts/credentials/index.phtml:2 -msgid "Database and E-mail information" -msgstr "Database and E-mail information" +#: modules/users/views/scripts/login/index.phtml:7 +msgid "Account" +msgstr "Account" -#: modules/install/views/scripts/permissions/index.phtml:2 -msgid "Please correct the following problems before proceeding:" -msgstr "Please correct the following problems before proceeding:" +#: modules/users/views/scripts/login/index.phtml:11 +msgid "Personal Info" +msgstr "Personal Info" -#: modules/install/views/scripts/permissions/index.phtml:10 -msgid "Check again" -msgstr "Check again" +#: modules/users/views/scripts/login/index.phtml:17 +msgid "Sites database" +msgstr "Sites database" -#: modules/install/views/scripts/index/index.phtml:2 -msgid "This Community-ID instance hasn't been installed yet" -msgstr "This Community-ID instance hasn't been installed yet" +#: modules/users/views/scripts/login/index.phtml:20 +msgid "History Log" +msgstr "History Log" -#: modules/install/views/scripts/index/index.phtml:5 -msgid "Proceed with installation" -msgstr "Proceed with installation" +#: modules/users/views/scripts/login/index.phtml:24 +msgid "Logout" +msgstr "Logout" -#: modules/install/views/scripts/upgrade/index.phtml:1 -msgid "New version detected" -msgstr "New version detected" +#: modules/users/views/scripts/login/index.phtml:29 +msgid "Admin options" +msgstr "Admin options" -#: modules/install/views/scripts/upgrade/index.phtml:3 -msgid "Enter the administrator credentials to proceed with the upgrade:" -msgstr "Enter the administrator credentials to proceed with the upgrade:" +#: modules/users/views/scripts/login/index.phtml:32 +msgid "Manage Users" +msgstr "Manage Users" -#: modules/install/views/scripts/upgrade/index.phtml:6 -msgid "Make sure you make a copy of the database before, just in case" -msgstr "Make sure you make a copy of the database before, just in case" +#: modules/users/views/scripts/login/index.phtml:35 +msgid "Message Users" +msgstr "Message Users" -#: modules/users/views/scripts/profile/index.phtml:13 -msgid "Account info" -msgstr "Account info" +#: modules/users/views/scripts/login/index.phtml:39 +msgid "Disable Maintenance Mode" +msgstr "Disable Maintenance Mode" -#: modules/users/views/scripts/profile/index.phtml:17 -msgid "Edit" -msgstr "Edit" +#: modules/users/views/scripts/login/index.phtml:41 +msgid "Enable Maintenance Mode" +msgstr "Enable Maintenance Mode" -#: modules/users/views/scripts/profile/index.phtml:20 -msgid "Change Password" -msgstr "Change Password" +#: modules/users/views/scripts/login/index.phtml:45 +msgid "Statistics" +msgstr "Statistics" -#: modules/users/views/scripts/profile/index.phtml:38 -msgid "Delete Account" -msgstr "Delete Account" +#: modules/users/views/scripts/login/index.phtml:48 +msgid "About Community-ID" +msgstr "About Community-ID" + +#: modules/users/views/scripts/login/index.phtml:55 +msgid "User access is currently disabled for system maintenance.
Please try again later" +msgstr "User access is currently disabled for system maintenance.
Please try again later" + +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "This is the image that identifies your account in this computer" + +#: modules/users/views/scripts/login/index.phtml:82 +msgid "Remember me" +msgstr "Remember me" + +#: modules/users/views/scripts/login/index.phtml:85 +msgid "Log in" +msgstr "Log in" + +#: modules/users/views/scripts/login/index.phtml:91 +msgid "Forgot your password?" +msgstr "Forgot your password?" + +#: modules/users/views/scripts/login/index.phtml:98 +msgid "You don't have an account?" +msgstr "You don't have an account?" + +#: modules/users/views/scripts/login/index.phtml:100 +msgid "REGISTER NOW!" +msgstr "REGISTER NOW!" + +#: modules/users/views/scripts/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "Please enter your E-mail below to receive a link to reset your password" #: modules/users/views/scripts/manageusers/index.phtml:11 msgid "Enter search string" @@ -675,35 +959,34 @@ msgstr "Delete Unconfirmed Users" msgid "Send Reminder" msgstr "Send Reminder" -#: modules/users/views/scripts/register/eula.phtml:1 -msgid "Please read the following EULA in order to continue" -msgstr "Please read the following EULA in order to continue" - -#: modules/users/views/scripts/register/eula.phtml:8 -msgid "I AGREE" -msgstr "I AGREE" - -#: modules/users/views/scripts/register/eula.phtml:9 -msgid "I DISAGREE" -msgstr "I DISAGREE" - -#: modules/users/views/scripts/register/index.phtml:1 -msgid "Registration Form" -msgstr "Registration Form" - -#: modules/users/views/scripts/profilegeneral/changepassword.phtml:7 -#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:13 -#: modules/users/views/scripts/personalinfo/edit.phtml:5 -msgid "Save" -msgstr "Save" - -#: modules/users/views/scripts/profilegeneral/changepassword.phtml:8 -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:23 -#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:14 #: modules/users/views/scripts/personalinfo/edit.phtml:6 msgid "Cancel" msgstr "Cancel" +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" + +#: modules/users/views/scripts/personalinfo/index.phtml:23 +msgid "Edit profile" +msgstr "Edit profile" + +#: modules/users/views/scripts/personalinfo/index.phtml:29 +msgid "Delete profile" +msgstr "Delete profile" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 +msgid "Not Entered" +msgstr "Not Entered" + +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "Add another profile" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "OpenID" + #: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 msgid "Why do you want to delete your Community-ID account?" msgstr "Why do you want to delete your Community-ID account?" @@ -732,156 +1015,133 @@ msgstr "No particular reason" msgid "Additional comments:" msgstr "Additional comments:" -#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 -msgid "OpenID" -msgstr "OpenID" +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +#: modules/users/views/scripts/profile/index.phtml:44 +msgid "Delete Account" +msgstr "Delete Account" -#: modules/users/views/scripts/recoverpassword/index.phtml:1 -msgid "Please enter your E-mail below to receive a link to reset your password" -msgstr "Please enter your E-mail below to receive a link to reset your password" +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Account info" -#: modules/users/views/scripts/personalinfo/show.phtml:8 -msgid "Not Entered" -msgstr "Not Entered" +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "Edit" -#: modules/users/views/scripts/personalinfo/index.phtml:13 -#: modules/users/views/scripts/login/index.phtml:10 -msgid "Personal Info" -msgstr "Personal Info" +#: modules/users/views/scripts/profile/index.phtml:24 +msgid "Change Password" +msgstr "Change Password" -#: modules/users/views/scripts/personalinfo/index.phtml:22 -msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" -msgstr "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-es.phtml:37 +msgid "There are no news articles yet" +msgstr "There are no news articles yet" -#: modules/users/views/scripts/login/index.phtml:3 +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-es.phtml:44 +msgid "View All" +msgstr "View All" + +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-es.phtml:48 +msgid "Add New Article" +msgstr "Add New Article" + +#: modules/default/views/scripts/feedback/index.phtml:1 +msgid "In order to serve you better, we have provided the form below for your questions and comments" +msgstr "In order to serve you better, we have provided the form below for your questions and comments" + +#: modules/default/views/scripts/identity/id.phtml:2 +msgid "This is the identity page for the Community-ID user identified with:" +msgstr "This is the identity page for the Community-ID user identified with:" + +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "This message will be sent to all registered Community-ID users" + +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "switch to Plain-Text" + +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "switch to Rich-Text (HTML)" + +#: modules/default/views/scripts/openid/trust.phtml:3 #, php-format -msgid "Hello, %s" -msgstr "Hello, %s" +msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." +msgstr "A site identifying as %s has asked for confirmation that %s is your identity URL." -#: modules/users/views/scripts/login/index.phtml:7 -msgid "Account" -msgstr "Account" +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "It also requests this additional information about you:" -#: modules/users/views/scripts/login/index.phtml:13 -msgid "Sites database" -msgstr "Sites database" +#: modules/default/views/scripts/openid/trust.phtml:10 +msgid "Fields are automatically filled according to the personal info stored in your community-id account." +msgstr "Fields are automatically filled according to the personal info stored in your community-id account." -#: modules/users/views/scripts/login/index.phtml:16 -msgid "History Log" -msgstr "History Log" +#: modules/default/views/scripts/openid/trust.phtml:11 +msgid "Fields marked with * are required." +msgstr "Fields marked with * are required." -#: modules/users/views/scripts/login/index.phtml:19 -msgid "Logout" -msgstr "Logout" +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "Please wait" -#: modules/users/views/scripts/login/index.phtml:24 -msgid "Admin options" -msgstr "Admin options" +#: modules/default/views/scripts/openid/trust.phtml:23 +msgid "Forever" +msgstr "Forever" -#: modules/users/views/scripts/login/index.phtml:27 -msgid "Manage Users" -msgstr "Manage Users" +#: modules/default/views/scripts/openid/trust.phtml:26 +msgid "Allow" +msgstr "Allow" -#: modules/users/views/scripts/login/index.phtml:30 -msgid "Message Users" -msgstr "Message Users" +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Deny" +msgstr "Deny" -#: modules/users/views/scripts/login/index.phtml:34 -msgid "Disable Maintenance Mode" -msgstr "Disable Maintenance Mode" +#: modules/default/views/scripts/openid/login.phtml:26 +msgid "Login" +msgstr "Login" -#: modules/users/views/scripts/login/index.phtml:36 -msgid "Enable Maintenance Mode" -msgstr "Enable Maintenance Mode" +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "Please select the profile you want to use:" -#: modules/users/views/scripts/login/index.phtml:40 -msgid "Statistics" -msgstr "Statistics" - -#: modules/users/views/scripts/login/index.phtml:43 -msgid "About Community-ID" -msgstr "About Community-ID" - -#: modules/users/views/scripts/login/index.phtml:50 -msgid "User access is currently disabled for system maintenance.
Please try again later" -msgstr "User access is currently disabled for system maintenance.
Please try again later" - -#: modules/users/views/scripts/login/index.phtml:64 -msgid "Remember me" -msgstr "Remember me" - -#: modules/users/views/scripts/login/index.phtml:67 -msgid "Log in" -msgstr "Log in" - -#: modules/users/views/scripts/login/index.phtml:73 -msgid "Forgot you password?" -msgstr "Forgot you password?" - -#: modules/users/views/scripts/login/index.phtml:79 -msgid "You don't have an account?" -msgstr "You don't have an account?" - -#: modules/users/views/scripts/login/index.phtml:81 -msgid "REGISTER NOW!" -msgstr "REGISTER NOW!" - -#: modules/stats/views/scripts/sites/index.phtml:1 -msgid "Trusted Sites" -msgstr "Trusted Sites" - -#: modules/stats/views/scripts/sites/index.phtml:3 -#: modules/stats/views/scripts/registrations/index.phtml:3 -#: modules/stats/views/scripts/authorizations/index.phtml:3 -msgid "Select view" -msgstr "Select view" - -#: modules/stats/views/scripts/sites/index.phtml:5 -#: modules/stats/views/scripts/registrations/index.phtml:5 -#: modules/stats/views/scripts/authorizations/index.phtml:5 -msgid "Last Week" -msgstr "Last Week" - -#: modules/stats/views/scripts/sites/index.phtml:6 -#: modules/stats/views/scripts/registrations/index.phtml:7 -#: modules/stats/views/scripts/authorizations/index.phtml:6 -msgid "Last Year" -msgstr "Last Year" - -#: modules/stats/views/scripts/top/index.phtml:1 -msgid "Top 10 Trusted Sites" -msgstr "Top 10 Trusted Sites" - -#: modules/stats/views/scripts/top/index.phtml:7 +#: modules/default/views/scripts/profile/index.phtml:20 #, php-format -msgid "%s users" -msgstr "%s users" +msgid "The privacy policy can be found at %s" +msgstr "The privacy policy can be found at %s" -#: modules/stats/views/scripts/registrations/index.phtml:1 -msgid "Registrations per day" -msgstr "Registrations per day" +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Clear History" -#: modules/stats/views/scripts/registrations/index.phtml:6 -msgid "Last Month" -msgstr "Last Month" +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Information Exchanged" -#: modules/stats/views/scripts/authorizations/index.phtml:1 -msgid "Authorizations per day" -msgstr "Authorizations per day" +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Information exchanged with:" -#: modules/news/views/scripts/view/index.phtml:3 -#: modules/news/views/scripts/index/index.phtml:16 -#, php-format -msgid "Published on %s" -msgstr "Published on %s" +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "OK" -#: modules/news/views/scripts/view/index.phtml:6 -msgid "Edit Article" -msgstr "Edit Article" +#: modules/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "Version installed:" -#: modules/news/views/scripts/view/index.phtml:7 -msgid "Delete Article" -msgstr "Delete Article" +#: modules/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "Latest news from Community-ID:" #: modules/news/views/scripts/index/pagination.phtml:10 #: modules/news/views/scripts/index/pagination.phtml:13 @@ -897,26 +1157,139 @@ msgstr "Next" msgid "Latest News" msgstr "Latest News" +#: modules/news/views/scripts/index/index.phtml:16 +#: modules/news/views/scripts/view/index.phtml:3 +#, php-format +msgid "Published on %s" +msgstr "Published on %s" + #: modules/news/views/scripts/index/index.phtml:21 msgid "read more" msgstr "read more" -#: views/layouts/layout.phtml:32 +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "Edit Article" + +#: modules/news/views/scripts/view/index.phtml:7 +msgid "Delete Article" +msgstr "Delete Article" + +#: modules/install/views/scripts/index/index.phtml:2 +msgid "This Community-ID instance hasn't been installed yet" +msgstr "This Community-ID instance hasn't been installed yet" + +#: modules/install/views/scripts/index/index.phtml:5 +msgid "Proceed with installation" +msgstr "Proceed with installation" + +#: modules/install/views/scripts/credentials/index.phtml:3 +msgid "Database and E-mail information" +msgstr "Database and E-mail information" + +#: modules/install/views/scripts/credentials/index.phtml:13 +msgid "Administrator User Information" +msgstr "Administrator User Information" + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "Please correct the following problems before proceeding:" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "Check again" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "The installation was performed successfully" + +#: modules/install/views/scripts/complete/index.phtml:6 +msgid "You can login as the administrator with the username and password you just provided." +msgstr "You can login as the administrator with the username and password you just provided." + +#: modules/install/views/scripts/complete/index.phtml:7 +msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." +msgstr "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "Finish" + +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "New version detected" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "Enter the administrator credentials to proceed with the upgrade:" + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "Make sure you make a copy of the database before, just in case" + +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 msgid "Home" msgstr "Home" -#: views/layouts/layout.phtml:35 +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 msgid "Feedback" msgstr "Feedback" -#: views/layouts/layout.phtml:41 +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 msgid "Your OpenID is:" msgstr "Your OpenID is:" -#: views/layouts/layout.phtml:58 +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 msgid "Maintenance mode is enabled: user access is restricted" msgstr "Maintenance mode is enabled: user access is restricted" +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "Help and Support" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "Privacy" + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "About Us" + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "Contact Us" + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "Select view" + +#: plugins/stats/Sites.phtml:4 +msgid "Last Week" +msgstr "Last Week" + +#: plugins/stats/Sites.phtml:5 +msgid "Last Year" +msgstr "Last Year" + +#: plugins/stats/Top.phtml:6 +#, php-format +msgid "%s users" +msgstr "%s users" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "Last Month" + +#~ msgid "Forgot you password?" +#~ msgstr "Forgot you password?" +#~ msgid "Privacy Policy" +#~ msgstr "Privacy Policy" +#~ msgid "About Community-id" +#~ msgstr "About Community-id" #~ msgid "Body:" #~ msgstr "Body:" #~ msgid "OPEN AN ACCOUNT NOW" @@ -929,12 +1302,4 @@ msgstr "Maintenance mode is enabled: user access is restricted" #~ ">for your favorite websites?" #~ msgid "Starting today
you'll only have to remember one" #~ msgstr "Starting today
you'll only have to remember one" -#~ msgid "Help and Support" -#~ msgstr "Help and Support" -#~ msgid "Privacy" -#~ msgstr "Privacy" -#~ msgid "About Us" -#~ msgstr "About Us" -#~ msgid "Contact Us" -#~ msgstr "Contact Us" diff --git a/languages/en/lang.mo b/languages/en/lang.mo deleted file mode 100644 index 03f6835..0000000 Binary files a/languages/en/lang.mo and /dev/null differ diff --git a/languages/es/LC_MESSAGES/lang.mo b/languages/es/LC_MESSAGES/lang.mo new file mode 100644 index 0000000..ca32da6 Binary files /dev/null and b/languages/es/LC_MESSAGES/lang.mo differ diff --git a/languages/es/lang.po b/languages/es/LC_MESSAGES/lang.po similarity index 59% rename from languages/es/lang.po rename to languages/es/LC_MESSAGES/lang.po index 22e7017..9781f10 100644 --- a/languages/es/lang.po +++ b/languages/es/LC_MESSAGES/lang.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: Community-ID Spanish translation\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-09-16 11:11-0500\n" -"PO-Revision-Date: 2009-09-16 11:14-0500\n" +"POT-Creation-Date: 2010-05-26 11:17-0500\n" +"PO-Revision-Date: 2010-05-26 11:33-0500\n" "Last-Translator: Keyboard Monkeys \n" "Language-Team: Keyboard Monkeys Ltd. \n" "MIME-Version: 1.0\n" @@ -12,43 +12,60 @@ msgstr "" "X-Poedit-Language: Spanish\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-KeywordsList: translate\n" -"X-Poedit-Basepath: ../../\n" +"X-Poedit-Basepath: ../../../\n" "X-Poedit-SearchPath-0: modules\n" "X-Poedit-SearchPath-1: views\n" -"X-Poedit-SearchPath-2: webdir/javascript\n" +"X-Poedit-SearchPath-2: javascript\n" "X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" + +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "Solo archivos de tipo jpg, jpeg, png y gif son permitidos.
Tamaño máximo: 2MB." #: modules/users/forms/AccountInfo.php:26 -#: modules/users/forms/Register.php:43 +#: modules/users/forms/Register.php:45 msgid "Username" msgstr "Nombre de usuario" #: modules/users/forms/AccountInfo.php:32 -#: modules/users/forms/Register.php:26 +#: modules/users/forms/Register.php:28 msgid "First Name" msgstr "Nombre" #: modules/users/forms/AccountInfo.php:37 -#: modules/users/forms/Register.php:31 +#: modules/users/forms/Register.php:33 msgid "Last Name" msgstr "Apellido" #: modules/users/forms/AccountInfo.php:42 -#: modules/users/forms/Register.php:36 +#: modules/users/forms/Register.php:38 msgid "E-mail" msgstr "Correo electrónico" -#: modules/users/forms/AccountInfo.php:52 -#: modules/users/forms/ChangePassword.php:18 +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "Método Autorización" + +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" +msgstr "YubiKey asociada" + +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 msgid "Enter password" msgstr "Ingrese contraseña" -#: modules/users/forms/AccountInfo.php:58 -#: modules/users/forms/Register.php:55 -#: modules/users/forms/ChangePassword.php:24 +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 msgid "Enter password again" msgstr "Ingrese contraseña de nuevo" +#: modules/users/forms/PersonalInfo.php:65 +msgid "Profile Name" +msgstr "Nombre del Perfil" + #: modules/users/forms/Login.php:18 msgid "USERNAME" msgstr "NOMBRE DE USUARIO" @@ -57,97 +74,139 @@ msgstr "NOMBRE DE USUARIO" msgid "PASSWORD" msgstr "CONTRASEÑA" -#: modules/users/forms/Register.php:49 +#: modules/users/forms/Register.php:51 msgid "Enter desired password" msgstr "Ingrese contraseña deseada" -#: modules/users/forms/Register.php:60 +#: modules/users/forms/Register.php:68 msgid "Please enter the text below" msgstr "Por favor ingrese el siguiente texto" +#: modules/users/models/User.php:129 +msgid "Default profile" +msgstr "Perfil por defecto" + #: modules/users/controllers/RegisterController.php:26 msgid "Sorry, registrations are currently disabled" msgstr "Lo sentimos, los nuevos registros están actualmente deshabilitados" #: modules/users/controllers/RegisterController.php:59 -#: modules/users/controllers/ProfilegeneralController.php:76 msgid "This username is already in use" msgstr "Este nombre de usuario ya está en uso" #: modules/users/controllers/RegisterController.php:66 -#: modules/users/controllers/ProfilegeneralController.php:85 msgid "This E-mail is already in use" msgstr "Este correo electrónico ya está en uso" -#: modules/users/controllers/RegisterController.php:101 +#: modules/users/controllers/RegisterController.php:95 msgid "Community-ID registration confirmation" msgstr "Community-ID confirmación de registro" -#: modules/users/controllers/RegisterController.php:104 +#: modules/users/controllers/RegisterController.php:100 msgid "Thank you." msgstr "Gracias." -#: modules/users/controllers/RegisterController.php:105 +#: modules/users/controllers/RegisterController.php:101 msgid "You will receive an E-mail with instructions to activate the account." msgstr "Recibirá por correo electrónico las instrucciones para activar la cuenta." -#: modules/users/controllers/RegisterController.php:107 +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "El correo electrónico de confirmación no se pudo enviar, por lo tanto la creación de la cuenta fue cancelada. Por favor contacte a soporte." + +#: modules/users/controllers/RegisterController.php:106 msgid "The account was created but the E-mail could not be sent" msgstr "La cuenta fue creada pero el correo electrónico no pudo ser enviado" -#: modules/users/controllers/RegisterController.php:121 -#: modules/users/controllers/RegisterController.php:150 -#: modules/users/controllers/RegisterController.php:165 +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 msgid "Invalid token" msgstr "Token inválido" -#: modules/users/controllers/RegisterController.php:156 +#: modules/users/controllers/RegisterController.php:147 msgid "Your account has been deleted" msgstr "Su cuenta ha sido borrada" -#: modules/users/controllers/LoginController.php:46 -#: modules/users/controllers/LoginController.php:74 +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 msgid "Invalid credentials" msgstr "Credenciales inválidas" +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "No hay imagen subida" + +#: modules/users/controllers/SigninimageController.php:77 +msgid "There was a problem setting the cookie" +msgstr "Hubo un problema al establecer la cookie" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "La imagen ha sido establecida con éxito en este computador/navegador" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "La imagen ha sido deshabilitada con éxito en este computador/navegador" + #: modules/users/controllers/RecoverpasswordController.php:51 msgid "This E-mail is not registered in the system" msgstr "Este correo electrónico no está registrado en el sistema" -#: modules/users/controllers/RecoverpasswordController.php:82 -#: modules/users/controllers/RecoverpasswordController.php:121 +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 msgid "Community-ID password reset" msgstr "Community-ID restablecimiento de contraseña" -#: modules/users/controllers/RecoverpasswordController.php:84 +#: modules/users/controllers/RecoverpasswordController.php:74 msgid "Password reset E-mail has been sent" msgstr "El correo electrónico de restablecimiento de contraseña ha sido enviado" -#: modules/users/controllers/RecoverpasswordController.php:123 +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "Token no válido" + +#: modules/users/controllers/RecoverpasswordController.php:103 msgid "You'll receive your new password via E-mail" msgstr "Recibirá la nueva contraseña por correo electrónico" -#: modules/users/controllers/ProfilegeneralController.php:247 +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "No se puede validar la Yubikey" + +#: modules/users/controllers/ProfilegeneralController.php:301 +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "La cuenta fue eliminada, pero el formulario no pudo ser enviado a los administradores" + +#: modules/users/controllers/ProfilegeneralController.php:315 msgid "Your acccount has been successfully deleted" msgstr "Su cuenta ha sido borrada con éxito" -#: modules/users/controllers/UserslistController.php:52 +#: modules/users/controllers/UserslistController.php:59 msgid "admin" msgstr "admin" -#: modules/users/controllers/UserslistController.php:54 +#: modules/users/controllers/UserslistController.php:61 msgid "confirmed" msgstr "confirmado" -#: modules/users/controllers/UserslistController.php:56 +#: modules/users/controllers/UserslistController.php:63 msgid "unconfirmed" msgstr "no confirmado" -#: modules/users/controllers/ManageusersController.php:25 +#: modules/users/controllers/PersonalinfoController.php:87 +msgid "Profile has been saved" +msgstr "El perfil ha sido guardado" + +#: modules/users/controllers/PersonalinfoController.php:98 +msgid "Profile has been deleted" +msgstr "El perfil ha sido eliminado" + +#: modules/users/controllers/ManageusersController.php:31 msgid "User has been deleted successfully" msgstr "El usuario ha sido borrado con éxito" -#: modules/users/controllers/ManageusersController.php:42 +#: modules/users/controllers/ManageusersController.php:48 msgid "Community-ID registration reminder" msgstr "Community-ID recordatorio de registro" @@ -159,11 +218,11 @@ msgstr "Asunto" msgid "CC" msgstr "CC" -#: modules/default/forms/OpenidLogin.php:27 +#: modules/default/forms/OpenidLogin.php:28 msgid "OpenID URL" msgstr "OpenID URL" -#: modules/default/forms/OpenidLogin.php:34 +#: modules/default/forms/OpenidLogin.php:35 msgid "Password" msgstr "Contraseña" @@ -184,33 +243,73 @@ msgid "Value is empty, but a non-empty value is required" msgstr "Se requiere un valor no vacío" #: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "El valor es requerido y no puede dejarse vacío" + +#: modules/default/forms/ErrorMessages.php:22 msgid "'%value%' is not a valid email address in the basic format local-part@hostname" msgstr "'%value%' no es un correo electrónico válido" -#: modules/default/forms/ErrorMessages.php:22 +#: modules/default/forms/ErrorMessages.php:23 msgid "'%hostname%' is not a valid hostname for email address '%value%'" msgstr "'%hostname%' no es un hostname válido para el correo electrónico '%value%'" -#: modules/default/forms/ErrorMessages.php:23 +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "'%value%' no coincide con la estructura esperada para un hostname DNS" + +#: modules/default/forms/ErrorMessages.php:25 msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" msgstr "'%value%' parece ser un hostname DNS pero no se puede encontrar TLD correspondiente" -#: modules/default/forms/ErrorMessages.php:24 +#: modules/default/forms/ErrorMessages.php:26 msgid "'%value%' appears to be a local network name but local network names are not allowed" msgstr "'%value%' parece ser un nombre de red local pero nombres de red local no son permitidos" -#: modules/default/forms/ErrorMessages.php:25 +#: modules/default/forms/ErrorMessages.php:27 msgid "Captcha value is wrong" msgstr "El valor del texto está errado" -#: modules/default/forms/ErrorMessages.php:26 +#: modules/default/forms/ErrorMessages.php:28 msgid "Password confirmation does not match" msgstr "Las contraseñas no coinciden" -#: modules/default/forms/ErrorMessages.php:27 +#: modules/default/forms/ErrorMessages.php:29 msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" msgstr "Nombre de usuario solamente puede contener caracteres alfanuméricos US-ASCII, y cualquiera de los símbolos $-_.+!*'(), y \"" +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "Nombre de usuario es inválido" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "El archivo '%value%' no fue subido" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "La contraseña no puede ser una palabra del diccionario" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "La contraseña no puede contener el nombre de usuario" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "La contraseña no puede ser más larga que %minLength% caractéres" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "La contraseña debe contener números" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "La contraseña debe contener símbolos" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "La contraseña debe tener caractéres en minúscula y mayúscula" + #: modules/default/models/Field.php:39 msgid "Male" msgstr "Hombre" @@ -219,35 +318,35 @@ msgstr "Hombre" msgid "Female" msgstr "Mujer" -#: modules/default/models/Fields.php:45 +#: modules/default/models/Fields.php:62 msgid "Nickname" msgstr "Sobrenombre" -#: modules/default/models/Fields.php:47 +#: modules/default/models/Fields.php:64 msgid "Full Name" msgstr "Nombre Completo" -#: modules/default/models/Fields.php:48 +#: modules/default/models/Fields.php:65 msgid "Date of Birth" msgstr "Fecha de Nacimiento" -#: modules/default/models/Fields.php:49 +#: modules/default/models/Fields.php:66 msgid "Gender" msgstr "Género" -#: modules/default/models/Fields.php:50 +#: modules/default/models/Fields.php:67 msgid "Postal Code" msgstr "Código Postal" -#: modules/default/models/Fields.php:51 +#: modules/default/models/Fields.php:68 msgid "Country" msgstr "País" -#: modules/default/models/Fields.php:52 +#: modules/default/models/Fields.php:69 msgid "Language" msgstr "Idioma" -#: modules/default/models/Fields.php:53 +#: modules/default/models/Fields.php:70 msgid "Time Zone" msgstr "Zona Horaria" @@ -255,6 +354,30 @@ msgstr "Zona Horaria" msgid "CC field must be a comma-separated list of valid E-mails" msgstr "El campo CC debe ser una lista de E-mails válidos separados por comas" +#: modules/default/controllers/MessageusersController.php:86 +msgid "Message has been sent" +msgstr "El mensaje ha sido enviado" + +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "Hubo un error al intentar enviar el mensaje" + +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "La URL que ingresó es incorrecta. Por favor corrija e intente de nuevo." + +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "Acceso Denegado - Posiblemente su sesión ha expirado? Intente ingresar de nuevo." + +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "Gracias por su interés. El mensaje ha sido enrutado." + +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "Lo sentimos, pero la retroalimentación no pudo ser enviada. Por favor intente de nuevo más tarde." + #: modules/default/controllers/CidController.php:29 msgid "Could not retrieve news items" msgstr "No fue posible extraer las noticias" @@ -263,13 +386,9 @@ msgstr "No fue posible extraer las noticias" msgid "Read More" msgstr "Leer Más" -#: modules/stats/controllers/SitesController.php:68 -msgid "Trusted sites" -msgstr "Sitios de confianza" - -#: modules/stats/controllers/SitesController.php:75 -msgid "Sites per user" -msgstr "Sitios por usuario" +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "Prohibido" #: modules/news/forms/Article.php:18 msgid "Title" @@ -296,255 +415,396 @@ msgstr "El artículo has sido guardado." msgid "The article has been deleted." msgstr "El artículo ha sido eliminado." -#: modules/install/controllers/UpgradeController.php:73 +#: modules/install/forms/Install.php:18 +msgid "Hostname" +msgstr "Hostname" + +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "usualmente localhost" + +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "Nombre base de datos" + +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "Usuario base de datos" + +#: modules/install/forms/Install.php:40 +msgid "Database password" +msgstr "Contraseña base de datos" + +#: modules/install/forms/Install.php:44 +msgid "Support E-mail" +msgstr "Correo electrónico de soporte" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "Será usado como el remitente en cualquier mensaje enviado por el sistema, y como recipiente para la retroalimentación de usuarios" + +#: modules/install/controllers/UpgradeController.php:80 #, php-format msgid "Upgrade was successful. You are now on version %s" msgstr "La actualización fue exitosa. Ahora se encuentra en la versión %s" -#: modules/install/controllers/UpgradeController.php:102 +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "ATENCION: Hay nuevas entradas en la configuración. Para cambiar los valores por defecto (como están definidos en config.default.php) agrégelos a su archivo config.php. Las nueva configuración corresponde a las siguientes directivas: %s." + +#: modules/install/controllers/UpgradeController.php:117 #, php-format msgid "Correct before upgrading: File %s is required to proceed" msgstr "Corrija antes de hacer la actualización: El archivo %s es requerido para proceder" -#: modules/install/controllers/CredentialsController.php:200 +#: modules/install/controllers/UpgradeController.php:159 +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "Por favor tenga en cuenta los siguientes requerimientos antes de proceder con la actualización:" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "No fue posible conectarse a la base de datos usando esas credenciales." + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "Por favor verifique e intente de nuevo." + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "La conexión al motor de base de datos funcionó, pero la base de datos %s no existe o el usuario no tiene acceso a ella. Se intentó crearla, pero el usuario tampoco tiene permisos. Por favor creéla manualmente e intente de nuevo." + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "Se requiere una version de PHP %s o mayor" + +#: modules/install/controllers/CredentialsController.php:234 #, php-format msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." msgstr "El directorio donde Community-ID está instalado debe ser escribible por el usuario del servidor web (%s). Otra opción es create un archivo config.php VACIO que sea escribible por dicho usuario." -#: modules/install/controllers/CredentialsController.php:203 +#: modules/install/controllers/CredentialsController.php:237 #, php-format msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" msgstr "El directorio \"catpchas\" debajo del directorio web de Community-ID debe ser escribible por el usuario del servidor web (%s)" -#: modules/install/controllers/CredentialsController.php:206 +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 #, php-format msgid "You need to have the %s extension installed" msgstr "Necesita tener la extensión %s instalada" -#: webdir/javascript/language.php:30 +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "Necesita tener soporte para PNG en su configuración de GD" + +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "Necesita tener soporte para Freetype en su configuración de GD" + +#: javascript/language.php:30 msgid "Name" msgstr "Nombre" -#: webdir/javascript/language.php:31 +#: javascript/language.php:31 msgid "Registration" msgstr "Registro" -#: webdir/javascript/language.php:32 +#: javascript/language.php:32 msgid "Status" msgstr "Estado" -#: webdir/javascript/language.php:33 +#: javascript/language.php:33 msgid "profile" msgstr "perfil" -#: webdir/javascript/language.php:34 +#: javascript/language.php:34 msgid "delete" msgstr "eliminar" -#: webdir/javascript/language.php:35 +#: javascript/language.php:35 msgid "Site" msgstr "Sitio" -#: webdir/javascript/language.php:36 +#: javascript/language.php:36 msgid "view info exchanged" msgstr "ver información intercambiada" -#: webdir/javascript/language.php:37 +#: javascript/language.php:37 msgid "deny" msgstr "denegar" -#: webdir/javascript/language.php:38 +#: javascript/language.php:38 msgid "allow" msgstr "permitir" -#: webdir/javascript/language.php:39 +#: javascript/language.php:39 msgid "Are you sure you wish to send this message to ALL users?" msgstr "¿Está seguro de querer enviar este mensaje a TODOS los usuarios?" -#: webdir/javascript/language.php:40 +#: javascript/language.php:40 msgid "Are you sure you wish to deny trust to this site?" msgstr "¿Está seguro de querer denegar este sitio?" -#: webdir/javascript/language.php:41 +#: javascript/language.php:41 msgid "operation failed" msgstr "la operación ha fallado" -#: webdir/javascript/language.php:42 +#: javascript/language.php:42 msgid "Trust to the following site has been granted:" msgstr "Confianza para el siguiente sitio ha sido otorgada:" -#: webdir/javascript/language.php:43 +#: javascript/language.php:43 msgid "Trust the following site has been denied:" msgstr "Confianza para el siguiente sitio ha sido denegada:" -#: webdir/javascript/language.php:44 +#: javascript/language.php:44 msgid "ERROR. The server returned:" msgstr "ERROR. El servidor retornó:" -#: webdir/javascript/language.php:45 +#: javascript/language.php:45 msgid "Your relationship with the following site has been deleted:" msgstr "Su relación con el siguiente sitio has sido eliminada:" -#: webdir/javascript/language.php:46 +#: javascript/language.php:46 msgid "The history log has been cleared" msgstr "El historial ha sido borrado" -#: webdir/javascript/language.php:47 +#: javascript/language.php:47 msgid "Are you sure you wish to allow access to this site?" msgstr "¿Está seguro de querer otorgar acceso a este sitio?" -#: webdir/javascript/language.php:48 +#: javascript/language.php:48 msgid "Are you sure you wish to delete your relationship with this site?" msgstr "¿Está seguro de querer elimiar su relación con este sitio?" -#: webdir/javascript/language.php:49 +#: javascript/language.php:49 msgid "Are you sure you wish to delete all the History Log?" msgstr "¿Está seguro de querer borrar todo el historial?" -#: webdir/javascript/language.php:50 +#: javascript/language.php:50 msgid "Are you sure you wish to delete the user" msgstr "Está seguro de querer eliminar el usuario" -#: webdir/javascript/language.php:51 +#: javascript/language.php:51 msgid "Are you sure you wish to delete all the unconfirmed accounts?" msgstr "¿Está seguro de querer eliminar todas las cuentas no confirmadas?" -#: webdir/javascript/language.php:52 +#: javascript/language.php:52 msgid "Date" msgstr "Fecha" -#: webdir/javascript/language.php:53 +#: javascript/language.php:53 msgid "Result" msgstr "Resultado" -#: webdir/javascript/language.php:54 +#: javascript/language.php:54 msgid "No records found." msgstr "No se encontraron registros." -#: webdir/javascript/language.php:55 +#: javascript/language.php:55 msgid "Loading..." msgstr "Cargando..." -#: webdir/javascript/language.php:56 +#: javascript/language.php:56 msgid "Data error." msgstr "Error de datos." -#: webdir/javascript/language.php:57 +#: javascript/language.php:57 msgid "Click to sort ascending" msgstr "Haga click para ordenar ascendentemente" -#: webdir/javascript/language.php:58 +#: javascript/language.php:58 msgid "Click to sort descending" msgstr "Haga click para ordenar descendentemente" -#: webdir/javascript/language.php:59 +#: javascript/language.php:59 msgid "Authorized" msgstr "Autorizado" -#: webdir/javascript/language.php:60 +#: javascript/language.php:60 msgid "Denied" msgstr "Denegado" -#: webdir/javascript/language.php:61 +#: javascript/language.php:61 msgid "of" msgstr "de" -#: webdir/javascript/language.php:62 +#: javascript/language.php:62 msgid "next" msgstr "sig" -#: webdir/javascript/language.php:63 +#: javascript/language.php:63 msgid "prev" msgstr "ant" -#: webdir/javascript/language.php:64 +#: javascript/language.php:64 msgid "IP" msgstr "IP" -#: webdir/javascript/language.php:65 +#: javascript/language.php:65 msgid "Delete unconfirmed accounts older than how many days?" msgstr "¿Eliminar cuentas sin confirmar más antiguas que cuantos días?" -#: webdir/javascript/language.php:66 +#: javascript/language.php:66 msgid "The value entered is incorrect" msgstr "El valor ingresado no es correcto" -#: webdir/javascript/language.php:67 +#: javascript/language.php:67 msgid "Send reminder to accounts older than how many days?" msgstr "¿Enviar recordatorio a cuentas más antiguas que cuantos días?" -#: webdir/javascript/language.php:68 +#: javascript/language.php:68 msgid "Are you sure you wish to delete this article?" msgstr "¿Está seguro de querer eliminar este artículo?" -#: webdir/javascript/language.php:69 +#: javascript/language.php:69 msgid "reminder" msgstr "recordatorio" -#: webdir/javascript/language.php:70 +#: javascript/language.php:70 msgid "reminders" msgstr "recordatorios" -#: libs/Monkeys/Form/Element/Timezone.php:48 +#: javascript/language.php:71 +msgid "Are you sure you wish to delete this profile?" +msgstr "¿Está seguro de querer eliminar este perfil?" + +#: libs/Monkeys/Form/Element/Timezone.php:47 msgid "-- Select a Timezone --" msgstr "-- Seleccione una zona horaria --" -#: libs/Monkeys/Form/Element/Country.php:36 +#: libs/Monkeys/Form/Element/Country.php:35 msgid "-- Select a Country --" msgstr "-- Seleccione un País --" -#: libs/Monkeys/Form/Element/Language.php:36 +#: libs/Monkeys/Form/Element/Language.php:35 msgid "-- Select a Language --" msgstr "-- Seleccione un Idioma --" -#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 msgid "January" msgstr "Enero" -#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 msgid "February" msgstr "Febrero" -#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 msgid "March" msgstr "Marzo" -#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 msgid "April" msgstr "Abrilperfil" -#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 msgid "May" msgstr "Mayo" -#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 msgid "June" msgstr "Junio" -#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 msgid "July" msgstr "Julio" -#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 msgid "August" msgstr "Agosto" -#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 msgid "Septembre" msgstr "Septiembre" -#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 msgid "October" msgstr "Octubre" -#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 msgid "November" msgstr "Noviembre" -#: libs/Monkeys/View/Helper/FormDateSelects.php:278 +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 msgid "December" msgstr "Diciembre" +#: plugins/stats/Authorizations.php:21 +msgid "Authorizations per day" +msgstr "Autorizaciones por día" + +#: plugins/stats/Sites.php:21 +msgid "Trusted Sites" +msgstr "Sitios de confianza" + +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "Sitios de confianza" + +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "Sitios por usuario" + +#: plugins/stats/Top.php:21 +msgid "Top 10 Trusted Sites" +msgstr "Primeros 10 Sitios de Confianza" + +#: plugins/stats/Registrations.php:21 +msgid "Registrations per day" +msgstr "Registros por día" + +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "Imágen de ingreso" + +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "Todavía no ha subido ninguna imagen" + +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "Selecciones una imagen para usar como su imagen de ingreso:" + +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Guardar" + +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "Esta imagen será mostrada al ingreso y al autenticarse en una transacción OpenID." + +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "Sirve como una medida anti-Phishing, puesto que solo usted reconocerá su imagen, provando que estas páginas no han sido falsificadas." + +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "Después de haber subido la imagen, para que sea mostrada usted necesita habilitarla en cada computador/navegador que quiera usar (el sistema está basado en cookies)." + +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "Use el siguiente botón para habilitar/deshabilitar el sistema en el actual computador/navegador:" + +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "Deshabilitar" + +#: modules/users/views/scripts/signinimage/index.phtml:42 +msgid "Enable" +msgstr "Habilitar" + +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "Instrucciones adicionales aparecerán después de que suba la image." + #: modules/users/views/scripts/register/index.phtml:1 msgid "Registration Form" msgstr "Formulario de Registro" @@ -576,71 +836,75 @@ msgid "Account" msgstr "Cuenta" #: modules/users/views/scripts/login/index.phtml:11 -#: modules/users/views/scripts/personalinfo/index.phtml:13 msgid "Personal Info" msgstr "Información Personal" -#: modules/users/views/scripts/login/index.phtml:14 +#: modules/users/views/scripts/login/index.phtml:17 msgid "Sites database" msgstr "Base de datos de Sitios" -#: modules/users/views/scripts/login/index.phtml:17 +#: modules/users/views/scripts/login/index.phtml:20 msgid "History Log" msgstr "Historial" -#: modules/users/views/scripts/login/index.phtml:21 +#: modules/users/views/scripts/login/index.phtml:24 msgid "Logout" msgstr "Salir" -#: modules/users/views/scripts/login/index.phtml:26 +#: modules/users/views/scripts/login/index.phtml:29 msgid "Admin options" msgstr "Opciones de Adminstración" -#: modules/users/views/scripts/login/index.phtml:29 +#: modules/users/views/scripts/login/index.phtml:32 msgid "Manage Users" msgstr "Manejar Usuarios" -#: modules/users/views/scripts/login/index.phtml:32 +#: modules/users/views/scripts/login/index.phtml:35 msgid "Message Users" msgstr "Enviar Mensaje a Usuarios" -#: modules/users/views/scripts/login/index.phtml:36 +#: modules/users/views/scripts/login/index.phtml:39 msgid "Disable Maintenance Mode" msgstr "Deshabilitar Modo de Mantenimiento" -#: modules/users/views/scripts/login/index.phtml:38 +#: modules/users/views/scripts/login/index.phtml:41 msgid "Enable Maintenance Mode" msgstr "Habilitar Modo de Mantenimiento" -#: modules/users/views/scripts/login/index.phtml:42 +#: modules/users/views/scripts/login/index.phtml:45 msgid "Statistics" msgstr "Estadísticas" -#: modules/users/views/scripts/login/index.phtml:45 +#: modules/users/views/scripts/login/index.phtml:48 msgid "About Community-ID" msgstr "Sobre Community-ID" -#: modules/users/views/scripts/login/index.phtml:52 +#: modules/users/views/scripts/login/index.phtml:55 msgid "User access is currently disabled for system maintenance.
Please try again later" msgstr "El acceso está actualmente deshabilitado debido a mantenimiento del sistema.
Por favor intente más tarde" -#: modules/users/views/scripts/login/index.phtml:66 +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "Esta es la imagen que identifica su cuenta en este computador" + +#: modules/users/views/scripts/login/index.phtml:82 msgid "Remember me" msgstr "Recuérdeme" -#: modules/users/views/scripts/login/index.phtml:69 +#: modules/users/views/scripts/login/index.phtml:85 msgid "Log in" msgstr "Ingresar" -#: modules/users/views/scripts/login/index.phtml:75 -msgid "Forgot you password?" +#: modules/users/views/scripts/login/index.phtml:91 +msgid "Forgot your password?" msgstr "¿Olvidó su contraseña?" -#: modules/users/views/scripts/login/index.phtml:81 +#: modules/users/views/scripts/login/index.phtml:98 msgid "You don't have an account?" msgstr "¿No tiene una cuenta?" -#: modules/users/views/scripts/login/index.phtml:83 +#: modules/users/views/scripts/login/index.phtml:100 msgid "REGISTER NOW!" msgstr "¡REGISTRESE AHORA!" @@ -696,27 +960,29 @@ msgstr "Eliminar Usuarios no Confirmados" msgid "Send Reminder" msgstr "Enviar Recordatorio" -#: modules/users/views/scripts/personalinfo/edit.phtml:5 -#: modules/users/views/scripts/profilegeneral/changepassword.phtml:7 -msgid "Save" -msgstr "Guardar" - #: modules/users/views/scripts/personalinfo/edit.phtml:6 -#: modules/users/views/scripts/profilegeneral/changepassword.phtml:8 msgid "Cancel" msgstr "Cancelar" -#: modules/users/views/scripts/personalinfo/show.phtml:8 +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "Esta información será usada automáticamente para llenar los campos de registro en cualquier transacción OpenID que lo requiera" + +#: modules/users/views/scripts/personalinfo/index.phtml:23 +msgid "Edit profile" +msgstr "Editar perfil" + +#: modules/users/views/scripts/personalinfo/index.phtml:29 +msgid "Delete profile" +msgstr "Eliminar perfil" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 msgid "Not Entered" msgstr "No Ingresado" -#: modules/users/views/scripts/personalinfo/index.phtml:16 -msgid "Edit" -msgstr "Editar" - -#: modules/users/views/scripts/personalinfo/index.phtml:22 -msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" -msgstr "Esta información será usada automáticamente para llenar los campos de registro en cualquier transacción OpenID que lo requiera" +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "Agregar otro perfil" #: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 msgid "OpenID" @@ -751,7 +1017,7 @@ msgid "Additional comments:" msgstr "Comentarios adicionales:" #: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 -#: modules/users/views/scripts/profile/index.phtml:39 +#: modules/users/views/scripts/profile/index.phtml:44 msgid "Delete Account" msgstr "Eliminar Cuenta" @@ -759,7 +1025,11 @@ msgstr "Eliminar Cuenta" msgid "Account info" msgstr "Información de la Cuenta" -#: modules/users/views/scripts/profile/index.phtml:20 +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "Editar" + +#: modules/users/views/scripts/profile/index.phtml:24 msgid "Change Password" msgstr "Cambiar contraseña" @@ -792,10 +1062,6 @@ msgstr "Para poder servirle mejor, hemos creado el formulario a continuación pa msgid "This is the identity page for the Community-ID user identified with:" msgstr "Esta es la página de identidad para el usuario de Community-ID identificado con:" -#: modules/default/views/scripts/privacy/index.phtml:1 -msgid "Privacy Policy" -msgstr "Política de Privacidad" - #: modules/default/views/scripts/messageusers/index.phtml:9 msgid "This message will be sent to all registered Community-ID users" msgstr "Este mensaje será enviado a todos los usuarios registrados de Community-ID" @@ -825,27 +1091,35 @@ msgstr "Los campos son automaticamente llenados de acuerdo con la información p msgid "Fields marked with * are required." msgstr "Los campos marcados con * son requeridos" -#: modules/default/views/scripts/openid/trust.phtml:19 -#, php-format -msgid "The private policy can be found at %s" -msgstr "La política de privacidad puede ser vista en %s" +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "Por favor espere" -#: modules/default/views/scripts/openid/trust.phtml:24 +#: modules/default/views/scripts/openid/trust.phtml:23 msgid "Forever" msgstr "Para siempre" -#: modules/default/views/scripts/openid/trust.phtml:27 +#: modules/default/views/scripts/openid/trust.phtml:26 msgid "Allow" msgstr "Permitir" -#: modules/default/views/scripts/openid/trust.phtml:28 +#: modules/default/views/scripts/openid/trust.phtml:27 msgid "Deny" msgstr "Denegar" -#: modules/default/views/scripts/openid/login.phtml:9 +#: modules/default/views/scripts/openid/login.phtml:26 msgid "Login" msgstr "Ingresar" +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "Por favor seleccione el perfil que quiera usar:" + +#: modules/default/views/scripts/profile/index.phtml:20 +#, php-format +msgid "The privacy policy can be found at %s" +msgstr "La política de privacidad puede ser vista en %s" + #: modules/default/views/scripts/history/index.phtml:13 msgid "Clear History" msgstr "Borra Historial" @@ -870,49 +1144,6 @@ msgstr "Versión instalada:" msgid "Latest news from Community-ID:" msgstr "Últimas noticias de Community-ID:" -#: modules/stats/views/scripts/authorizations/index.phtml:1 -msgid "Authorizations per day" -msgstr "Autorizaciones por día" - -#: modules/stats/views/scripts/authorizations/index.phtml:3 -#: modules/stats/views/scripts/registrations/index.phtml:3 -#: modules/stats/views/scripts/sites/index.phtml:3 -msgid "Select view" -msgstr "Seleccionar vista" - -#: modules/stats/views/scripts/authorizations/index.phtml:5 -#: modules/stats/views/scripts/registrations/index.phtml:5 -#: modules/stats/views/scripts/sites/index.phtml:5 -msgid "Last Week" -msgstr "Semana Pasada" - -#: modules/stats/views/scripts/authorizations/index.phtml:6 -#: modules/stats/views/scripts/registrations/index.phtml:7 -#: modules/stats/views/scripts/sites/index.phtml:6 -msgid "Last Year" -msgstr "Año Pasado" - -#: modules/stats/views/scripts/top/index.phtml:1 -msgid "Top 10 Trusted Sites" -msgstr "Primeros 10 Sitios de Confianza" - -#: modules/stats/views/scripts/top/index.phtml:7 -#, php-format -msgid "%s users" -msgstr "%s usuarios" - -#: modules/stats/views/scripts/registrations/index.phtml:1 -msgid "Registrations per day" -msgstr "Registros por día" - -#: modules/stats/views/scripts/registrations/index.phtml:6 -msgid "Last Month" -msgstr "Ultimo Mes" - -#: modules/stats/views/scripts/sites/index.phtml:1 -msgid "Trusted Sites" -msgstr "Sitios de confianza" - #: modules/news/views/scripts/index/pagination.phtml:10 #: modules/news/views/scripts/index/pagination.phtml:13 msgid "Previous" @@ -997,22 +1228,67 @@ msgstr "Ingrese las credenciales de administrador para proceder con la actualiza msgid "Make sure you make a copy of the database before, just in case" msgstr "Asegúrese de hacer una copia de respaldo de la base de datos, por si acaso" -#: views/layouts/layout.phtml:32 +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 msgid "Home" msgstr "Inicio" -#: views/layouts/layout.phtml:35 +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 msgid "Feedback" msgstr "Retroalimentación" -#: views/layouts/layout.phtml:41 +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 msgid "Your OpenID is:" msgstr "Su OpenID es:" -#: views/layouts/layout.phtml:58 +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 msgid "Maintenance mode is enabled: user access is restricted" msgstr "El modo de mantenimiento está habilitado: el acceso a usuarios está restringido" +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "Ayuda y Soporte" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "Privacidad" + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "Sobre Nosotros" + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "Contáctenos" + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "Seleccionar vista" + +#: plugins/stats/Sites.phtml:4 +msgid "Last Week" +msgstr "Semana Pasada" + +#: plugins/stats/Sites.phtml:5 +msgid "Last Year" +msgstr "Año Pasado" + +#: plugins/stats/Top.phtml:6 +#, php-format +msgid "%s users" +msgstr "%s usuarios" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "Ultimo Mes" + +#~ msgid "Forgot you password?" +#~ msgstr "¿Olvidó su contraseña?" +#~ msgid "Privacy Policy" +#~ msgstr "Política de Privacidad" #~ msgid "About Community-id" #~ msgstr "Sobre Community-id" #~ msgid "Body:" @@ -1027,12 +1303,4 @@ msgstr "El modo de mantenimiento está habilitado: el acceso a usuarios está re #~ "contraseñas
para sus sitios favoritos?" #~ msgid "Starting today
you'll only have to remember one" #~ msgstr "A partir de hoy
solo tendrá que recordar una" -#~ msgid "Help and Support" -#~ msgstr "Ayuda y Soporte" -#~ msgid "Privacy" -#~ msgstr "Privacidad" -#~ msgid "About Us" -#~ msgstr "Sobre Nosotros" -#~ msgid "Contact Us" -#~ msgstr "Contáctenos" diff --git a/languages/es/lang.mo b/languages/es/lang.mo deleted file mode 100644 index 3f33f11..0000000 Binary files a/languages/es/lang.mo and /dev/null differ diff --git a/languages/it/LC_MESSAGES/it.mo b/languages/it/LC_MESSAGES/it.mo new file mode 100644 index 0000000..672c861 Binary files /dev/null and b/languages/it/LC_MESSAGES/it.mo differ diff --git a/languages/it/LC_MESSAGES/it.po b/languages/it/LC_MESSAGES/it.po new file mode 100644 index 0000000..dd1afb9 --- /dev/null +++ b/languages/it/LC_MESSAGES/it.po @@ -0,0 +1,1306 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID-1.1.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-26 11:33-0500\n" +"PO-Revision-Date: \n" +"Last-Translator: Keyboard Monkeys \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: italian\n" +"X-Poedit-Country: italy\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: ../../..\n" +"X-Poedit-SearchPath-0: modules\n" +"X-Poedit-SearchPath-1: views\n" +"X-Poedit-SearchPath-2: javascript\n" +"X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" + +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "" + +#: modules/users/forms/AccountInfo.php:26 +#: modules/users/forms/Register.php:45 +msgid "Username" +msgstr "Nome utente" + +#: modules/users/forms/AccountInfo.php:32 +#: modules/users/forms/Register.php:28 +msgid "First Name" +msgstr "Nome" + +#: modules/users/forms/AccountInfo.php:37 +#: modules/users/forms/Register.php:33 +msgid "Last Name" +msgstr "Cognome" + +#: modules/users/forms/AccountInfo.php:42 +#: modules/users/forms/Register.php:38 +msgid "E-mail" +msgstr "E-mail" + +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "" + +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" +msgstr "" + +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 +msgid "Enter password" +msgstr "Inserire la password" + +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 +msgid "Enter password again" +msgstr "Inserire nuovamente la password" + +#: modules/users/forms/PersonalInfo.php:65 +#, fuzzy +msgid "Profile Name" +msgstr "profilo" + +#: modules/users/forms/Login.php:18 +msgid "USERNAME" +msgstr "NOME UTENTE" + +#: modules/users/forms/Login.php:27 +msgid "PASSWORD" +msgstr "PASSWORD" + +#: modules/users/forms/Register.php:51 +msgid "Enter desired password" +msgstr "Inserire la password desiderata" + +#: modules/users/forms/Register.php:68 +msgid "Please enter the text below" +msgstr "Si prega di inserire il testo sottostante" + +#: modules/users/models/User.php:129 +#, fuzzy +msgid "Default profile" +msgstr "profilo" + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "Spiacente, le registrazioni sono attualmente disabilitate" + +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "Questo nome utente è già in uso" + +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "Questo indirizzo di e-mail è già in uso" + +#: modules/users/controllers/RegisterController.php:95 +msgid "Community-ID registration confirmation" +msgstr "Conferma della registrazione a Community-ID" + +#: modules/users/controllers/RegisterController.php:100 +msgid "Thank you." +msgstr "Grazie." + +#: modules/users/controllers/RegisterController.php:101 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "Riceverai una e-mail con le istruzioni per attivare l'account." + +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "Non è stato possibile inviare l'e-mail di conferma, per cui la creazione dell'account è stata annullata. Si prega di contattare il supporto." + +#: modules/users/controllers/RegisterController.php:106 +msgid "The account was created but the E-mail could not be sent" +msgstr "L'account è stato creato, ma non è stato possibile inviare l'e-mail" + +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 +msgid "Invalid token" +msgstr "Codice errato" + +#: modules/users/controllers/RegisterController.php:147 +msgid "Your account has been deleted" +msgstr "Il tuo account è stato cancellato" + +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 +msgid "Invalid credentials" +msgstr "Credenziali non valide" + +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:77 +#, fuzzy +msgid "There was a problem setting the cookie" +msgstr "C'è stato un errore nell'invio del messaggio" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:51 +msgid "This E-mail is not registered in the system" +msgstr "Questa e-mail non è registrata nel sistema" + +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 +msgid "Community-ID password reset" +msgstr "Reimpostazione della password di Community-ID" + +#: modules/users/controllers/RecoverpasswordController.php:74 +msgid "Password reset E-mail has been sent" +msgstr "La e-mail per la reimpostazione della password è stata inviata" + +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "Codice errato" + +#: modules/users/controllers/RecoverpasswordController.php:103 +msgid "You'll receive your new password via E-mail" +msgstr "Riceverai la tua nuova password via e-mail" + +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:301 +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "L'account è stato cancellato, ma non si è potuto inviare la segnalazione agli amministratori" + +#: modules/users/controllers/ProfilegeneralController.php:315 +msgid "Your acccount has been successfully deleted" +msgstr "Il tuo account è stato effettivamente cancellato" + +#: modules/users/controllers/UserslistController.php:59 +msgid "admin" +msgstr "amministratore" + +#: modules/users/controllers/UserslistController.php:61 +msgid "confirmed" +msgstr "confermato" + +#: modules/users/controllers/UserslistController.php:63 +msgid "unconfirmed" +msgstr "non confermato" + +#: modules/users/controllers/PersonalinfoController.php:87 +#, fuzzy +msgid "Profile has been saved" +msgstr "L'articolo è stato salvato." + +#: modules/users/controllers/PersonalinfoController.php:98 +#, fuzzy +msgid "Profile has been deleted" +msgstr "L'articolo è stato cancellato." + +#: modules/users/controllers/ManageusersController.php:31 +msgid "User has been deleted successfully" +msgstr "Cancellazione utente effettuata con successo" + +#: modules/users/controllers/ManageusersController.php:48 +msgid "Community-ID registration reminder" +msgstr "Promemoria registrazione a Community-ID" + +#: modules/default/forms/MessageUsers.php:17 +msgid "Subject" +msgstr "Soggetto" + +#: modules/default/forms/MessageUsers.php:22 +msgid "CC" +msgstr "CC" + +#: modules/default/forms/OpenidLogin.php:28 +msgid "OpenID URL" +msgstr "URL OpenID" + +#: modules/default/forms/OpenidLogin.php:35 +msgid "Password" +msgstr "Password" + +#: modules/default/forms/Feedback.php:25 +msgid "Enter your name" +msgstr "Inserisci il tuo nome" + +#: modules/default/forms/Feedback.php:30 +msgid "Enter your E-mail" +msgstr "Inserire la propria e-mail" + +#: modules/default/forms/Feedback.php:37 +msgid "Enter your questions or comments" +msgstr "Inserire le proprie domande o commenti" + +#: modules/default/forms/ErrorMessages.php:20 +msgid "Value is empty, but a non-empty value is required" +msgstr "Il valore non è stato definito, ma è richiesto " + +#: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "Il valore è richiesto e non può essere omesso" + +#: modules/default/forms/ErrorMessages.php:22 +msgid "'%value%' is not a valid email address in the basic format local-part@hostname" +msgstr "'%value%' non è un indirizzo e-mail valido, secondo il formato utente@hostname" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "'%hostname%' non è un nome di host valido per l'indirizzo di e-mail '%value%'" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "'%value%' non combacia con la struttura prevista per un hostname DNS" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "'%value%' sembra un hostname, ma non combacia con la lista dei TLD noti" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "'%value%' sembra un nome di rete locale, ma i nomi locali non sono consentiti" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Captcha value is wrong" +msgstr "Il valore del Captcha è sbagliato" + +#: modules/default/forms/ErrorMessages.php:28 +msgid "Password confirmation does not match" +msgstr "Le due password inserite non coincidono" + +#: modules/default/forms/ErrorMessages.php:29 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "Il nome utente può contenere solo caratteri ASCII alfanumerici e i simboli $-_.+!*'(),\"" + +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "Uomo" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "Donna" + +#: modules/default/models/Fields.php:62 +msgid "Nickname" +msgstr "Soprannome (nick)" + +#: modules/default/models/Fields.php:64 +msgid "Full Name" +msgstr "Nome Completo" + +#: modules/default/models/Fields.php:65 +msgid "Date of Birth" +msgstr "Data di Nascita" + +#: modules/default/models/Fields.php:66 +msgid "Gender" +msgstr "Sesso" + +#: modules/default/models/Fields.php:67 +msgid "Postal Code" +msgstr "Codice Postale" + +#: modules/default/models/Fields.php:68 +msgid "Country" +msgstr "Nazione" + +#: modules/default/models/Fields.php:69 +msgid "Language" +msgstr "Lingua" + +#: modules/default/models/Fields.php:70 +msgid "Time Zone" +msgstr "Fuso Orario" + +#: modules/default/controllers/MessageusersController.php:46 +msgid "CC field must be a comma-separated list of valid E-mails" +msgstr "Il campo CC deve essere un elenco di e-mail valide, separate da virgola" + +#: modules/default/controllers/MessageusersController.php:86 +msgid "Message has been sent" +msgstr "Il messaggio è stato inviato" + +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "C'è stato un errore nell'invio del messaggio" + +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "L'URL inserita non è corretta. Correggerla e provare nuovamente." + +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "Accesso Negato - Forse è scaduta la sessione? Prova a collegarti di nuovo." + +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "Grazie per l'interesse mostrato. Il messaggio è stato inoltrato." + +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "Spiacente, la segnalazione non può essere inviata. Si prega di provare più tardi." + +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "Impossibile prelevare le notizie" + +#: modules/default/controllers/CidController.php:47 +msgid "Read More" +msgstr "Leggi ancora" + +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "Negato" + +#: modules/news/forms/Article.php:18 +msgid "Title" +msgstr "Titolo" + +#: modules/news/forms/Article.php:24 +msgid "Publication date" +msgstr "Data di pubblicazione" + +#: modules/news/forms/Article.php:32 +msgid "Excerpt" +msgstr "Estratto" + +#: modules/news/controllers/EditController.php:60 +#: modules/news/controllers/EditController.php:90 +msgid "The article doesn't exist." +msgstr "L'articolo non esiste." + +#: modules/news/controllers/EditController.php:81 +msgid "The article has been saved." +msgstr "L'articolo è stato salvato." + +#: modules/news/controllers/EditController.php:93 +msgid "The article has been deleted." +msgstr "L'articolo è stato cancellato." + +#: modules/install/forms/Install.php:18 +msgid "Hostname" +msgstr "Nome dell'host" + +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "in genere localhost" + +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "Nome del database" + +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "Nome utente del database" + +#: modules/install/forms/Install.php:40 +msgid "Database password" +msgstr "Password del database" + +#: modules/install/forms/Install.php:44 +msgid "Support E-mail" +msgstr "Indirizzo e-mail per il supporto" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "Sarà utilizzato come il mittente di ogni messaggio inviato dal sistema, e come destinatario di ogni segnalazione" + +#: modules/install/controllers/UpgradeController.php:80 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "Aggiornamento effettuato con successo. Ora si sta usando la versione %s" + +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "" + +#: modules/install/controllers/UpgradeController.php:117 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "Prerequisito prima dell'aggiornamento: il file %s è richiesto" + +#: modules/install/controllers/UpgradeController.php:159 +#, fuzzy +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "Correggere i seguenti problemi prima di procedere:" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "Non è stato possibile connettersi al database usando queste credenziali." + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "Verificare e provare di nuovo." + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "La connessione con il motore di database funziona, ma il database %s non esiste oppure l'utente fornito non ne ha accesso. Il tentativo di creare il database è fallito, perché l'utente non ha nemmeno questo privilegio. Si prega di crearlo in proprio e di provare nuovamente." + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "E' richiesta una versione di PHP pari o superiore a %s" + +#: modules/install/controllers/CredentialsController.php:234 +#, php-format +msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." +msgstr "La directory in cui Community-ID è installato deve essere scrivibile dall'utente del web server (%s). Un'altra opzione è create un file config.php VUOTO che sia scrivibile da tale utente." + +#: modules/install/controllers/CredentialsController.php:237 +#, php-format +msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" +msgstr "La directory \"captchas\" sotto la directory web di Community-ID deve essere scrivibile dall'utente del web server (%s)" + +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "Occorre che l'estensione %s sia installata" + +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "Occorre che il supporto PNG sia fornito con GD" + +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "Occorre che il supporto Freetype sia fornito con GD" + +#: javascript/language.php:30 +msgid "Name" +msgstr "Nome" + +#: javascript/language.php:31 +msgid "Registration" +msgstr "Registrazione" + +#: javascript/language.php:32 +msgid "Status" +msgstr "Stato" + +#: javascript/language.php:33 +msgid "profile" +msgstr "profilo" + +#: javascript/language.php:34 +msgid "delete" +msgstr "cancellare" + +#: javascript/language.php:35 +msgid "Site" +msgstr "Sito" + +#: javascript/language.php:36 +msgid "view info exchanged" +msgstr "vedere le informazioni scambiate" + +#: javascript/language.php:37 +msgid "deny" +msgstr "negare" + +#: javascript/language.php:38 +msgid "allow" +msgstr "consentire" + +#: javascript/language.php:39 +msgid "Are you sure you wish to send this message to ALL users?" +msgstr "Sei sicuro che vuoi inviare questo messaggio a TUTTI gli utenti?" + +#: javascript/language.php:40 +msgid "Are you sure you wish to deny trust to this site?" +msgstr "Sei sicuro che vuoi considerare non affidabile questo sito?" + +#: javascript/language.php:41 +msgid "operation failed" +msgstr "operazione fallita" + +#: javascript/language.php:42 +msgid "Trust to the following site has been granted:" +msgstr "Questo sito viene considerato come affidabile:" + +#: javascript/language.php:43 +msgid "Trust the following site has been denied:" +msgstr "Questo sito viene considerato come non affidabile:" + +#: javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "ERRORE. Il server ha restituito:" + +#: javascript/language.php:45 +msgid "Your relationship with the following site has been deleted:" +msgstr "La relazione con questo sito è stata rimossa:" + +#: javascript/language.php:46 +msgid "The history log has been cleared" +msgstr "Il diario storico è stato cancellato" + +#: javascript/language.php:47 +msgid "Are you sure you wish to allow access to this site?" +msgstr "Sei sicuro che vuoi consentire l'accesso a questo sito?" + +#: javascript/language.php:48 +msgid "Are you sure you wish to delete your relationship with this site?" +msgstr "Sei sicuro che vuoi cancellare ogni relazione con questo sito?" + +#: javascript/language.php:49 +msgid "Are you sure you wish to delete all the History Log?" +msgstr "Sei certo di voler cancellare tutto il diario storico?" + +#: javascript/language.php:50 +msgid "Are you sure you wish to delete the user" +msgstr "Sei sicuro che vuoi cancellare questo utente?" + +#: javascript/language.php:51 +msgid "Are you sure you wish to delete all the unconfirmed accounts?" +msgstr "Sei sicuro che vuoi cancellare tutti gli account non confermati?" + +#: javascript/language.php:52 +msgid "Date" +msgstr "Data" + +#: javascript/language.php:53 +msgid "Result" +msgstr "Risultato" + +#: javascript/language.php:54 +msgid "No records found." +msgstr "Nessuno elemento trovato." + +#: javascript/language.php:55 +msgid "Loading..." +msgstr "Caricamento..." + +#: javascript/language.php:56 +msgid "Data error." +msgstr "Errore nei dati." + +#: javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "Click per ordinare in modo ascendente" + +#: javascript/language.php:58 +msgid "Click to sort descending" +msgstr "Click per ordinare in modo discendente" + +#: javascript/language.php:59 +msgid "Authorized" +msgstr "Autorizzato" + +#: javascript/language.php:60 +msgid "Denied" +msgstr "Negato" + +#: javascript/language.php:61 +msgid "of" +msgstr "di" + +#: javascript/language.php:62 +msgid "next" +msgstr "prossimo" + +#: javascript/language.php:63 +msgid "prev" +msgstr "precedente" + +#: javascript/language.php:64 +msgid "IP" +msgstr "IP" + +#: javascript/language.php:65 +msgid "Delete unconfirmed accounts older than how many days?" +msgstr "Cancellare gli account più vecchi di quanti giorni?" + +#: javascript/language.php:66 +msgid "The value entered is incorrect" +msgstr "Il valore inserito non è corretto" + +#: javascript/language.php:67 +msgid "Send reminder to accounts older than how many days?" +msgstr "Invia un promemoria agli account più vecchi di quanti giorni?" + +#: javascript/language.php:68 +msgid "Are you sure you wish to delete this article?" +msgstr "Sei sicuro che vuoi cancellare questo articolo?" + +#: javascript/language.php:69 +msgid "reminder" +msgstr "promemoria" + +#: javascript/language.php:70 +msgid "reminders" +msgstr "promemoria" + +#: javascript/language.php:71 +#, fuzzy +msgid "Are you sure you wish to delete this profile?" +msgstr "Sei sicuro che vuoi cancellare questo articolo?" + +#: libs/Monkeys/Form/Element/Timezone.php:47 +msgid "-- Select a Timezone --" +msgstr "-- Seleziona un Fuso Orario --" + +#: libs/Monkeys/Form/Element/Country.php:35 +msgid "-- Select a Country --" +msgstr "-- Seleziona una Nazione --" + +#: libs/Monkeys/Form/Element/Language.php:35 +msgid "-- Select a Language --" +msgstr "-- Seleziona una lingua --" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 +msgid "January" +msgstr "Gennaio" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "February" +msgstr "Febbraio" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "March" +msgstr "Marzo" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +msgid "April" +msgstr "Aprile" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "May" +msgstr "Maggio" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "June" +msgstr "Giugno" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "July" +msgstr "Luglio" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "August" +msgstr "Agosto" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +msgid "Septembre" +msgstr "Settembre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "October" +msgstr "Ottobre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "November" +msgstr "Novembre" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +msgid "December" +msgstr "Dicembre" + +#: plugins/stats/Authorizations.php:21 +#, fuzzy +msgid "Authorizations per day" +msgstr "Autorizzato" + +#: plugins/stats/Sites.php:21 +msgid "Trusted Sites" +msgstr "" + +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "" + +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "" + +#: plugins/stats/Top.php:21 +msgid "Top 10 Trusted Sites" +msgstr "" + +#: plugins/stats/Registrations.php:21 +#, fuzzy +msgid "Registrations per day" +msgstr "Modulo di Registrazione" + +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Salva" + +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:42 +#, fuzzy +msgid "Enable" +msgstr "Uomo" + +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "" + +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Modulo di Registrazione" + +#: modules/users/views/scripts/register/index.phtml:10 +#: modules/users/views/scripts/recoverpassword/index.phtml:4 +msgid "Send" +msgstr "Invia" + +#: modules/users/views/scripts/register/eula.phtml:1 +msgid "Please read the following EULA in order to continue" +msgstr "Leggere il seguente accordo d'uso (EULA) prima di proseguire" + +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "ACCETTO" + +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "NON ACCETTO" + +#: modules/users/views/scripts/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "Ciao, %s" + +#: modules/users/views/scripts/login/index.phtml:7 +msgid "Account" +msgstr "Account" + +#: modules/users/views/scripts/login/index.phtml:11 +msgid "Personal Info" +msgstr "Informazioni personali" + +#: modules/users/views/scripts/login/index.phtml:17 +msgid "Sites database" +msgstr "Database dei siti" + +#: modules/users/views/scripts/login/index.phtml:20 +msgid "History Log" +msgstr "Diario storico" + +#: modules/users/views/scripts/login/index.phtml:24 +msgid "Logout" +msgstr "Scollegati" + +#: modules/users/views/scripts/login/index.phtml:29 +msgid "Admin options" +msgstr "Opzioni di amministrazione" + +#: modules/users/views/scripts/login/index.phtml:32 +msgid "Manage Users" +msgstr "Gestione utenti" + +#: modules/users/views/scripts/login/index.phtml:35 +msgid "Message Users" +msgstr "Messaggi agli Utenti" + +#: modules/users/views/scripts/login/index.phtml:39 +msgid "Disable Maintenance Mode" +msgstr "Disattiva Modalita Manutenzione" + +#: modules/users/views/scripts/login/index.phtml:41 +msgid "Enable Maintenance Mode" +msgstr "Attiva Modalità Manutenzione" + +#: modules/users/views/scripts/login/index.phtml:45 +msgid "Statistics" +msgstr "Statistiche" + +#: modules/users/views/scripts/login/index.phtml:48 +msgid "About Community-ID" +msgstr "Riguardo Community-ID" + +#: modules/users/views/scripts/login/index.phtml:55 +msgid "User access is currently disabled for system maintenance.
Please try again later" +msgstr "L'accesso al sistema è temporaneamente sospeso per manutenzione.
Si prega di provare nuovamente più tardi" + +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:82 +msgid "Remember me" +msgstr "Ricordami" + +#: modules/users/views/scripts/login/index.phtml:85 +msgid "Log in" +msgstr "Collegati" + +#: modules/users/views/scripts/login/index.phtml:91 +msgid "Forgot your password?" +msgstr "Dimenticato la password?" + +#: modules/users/views/scripts/login/index.phtml:98 +msgid "You don't have an account?" +msgstr "Non si dispone di un account?" + +#: modules/users/views/scripts/login/index.phtml:100 +msgid "REGISTER NOW!" +msgstr "REGISTRATI ORA!" + +#: modules/users/views/scripts/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "Si prega di inserire la propria e-mail qui sotto per ricevere un link per reimpostare la password" + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "Enter search string" +msgstr "Inserire la stringa di ricerca" + +#: modules/users/views/scripts/manageusers/index.phtml:12 +msgid "Go" +msgstr "Vai" + +#: modules/users/views/scripts/manageusers/index.phtml:13 +msgid "Clear" +msgstr "Cancella" + +#: modules/users/views/scripts/manageusers/index.phtml:16 +msgid "All" +msgstr "Tutti" + +#: modules/users/views/scripts/manageusers/index.phtml:19 +msgid "Confirmed" +msgstr "Confermato" + +#: modules/users/views/scripts/manageusers/index.phtml:22 +msgid "Unconfirmed" +msgstr "Non confermato" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Total users:" +msgstr "Totale utenti:" + +#: modules/users/views/scripts/manageusers/index.phtml:30 +msgid "Total confirmed users:" +msgstr "Totale utenti confermati:" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Total unconfirmed users:" +msgstr "Totale utenti non confermati:" + +#: modules/users/views/scripts/manageusers/index.phtml:34 +msgid "Add User" +msgstr "Aggiungi utente" + +#: modules/users/views/scripts/manageusers/index.phtml:36 +msgid "Delete Unconfirmed Users" +msgstr "Cancella utenti non confermati" + +#: modules/users/views/scripts/manageusers/index.phtml:39 +msgid "Send Reminder" +msgstr "Invia un promemoria" + +#: modules/users/views/scripts/personalinfo/edit.phtml:6 +msgid "Cancel" +msgstr "Cancella" + +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "Queste informazioni saranno usate per riempire automaticamente i campi della registrazione per ogni transazione OpenID che lo richiederà" + +#: modules/users/views/scripts/personalinfo/index.phtml:23 +#, fuzzy +msgid "Edit profile" +msgstr "Modifica Articolo" + +#: modules/users/views/scripts/personalinfo/index.phtml:29 +#, fuzzy +msgid "Delete profile" +msgstr "Cancella l'articolo" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 +msgid "Not Entered" +msgstr "Non Inserito" + +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "OpenID" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 +msgid "Why do you want to delete your Community-ID account?" +msgstr "Perchè si vuole cancellare il proprio account su Community-ID?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "Indicare tutte le condizioni verificate:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "Questo è un account di prova" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "Ho trovato un servizio migliore" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "Il servizio è privo di alcune caratteristiche importanti che mi servono" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "Nessuna ragione in particolare" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +msgid "Additional comments:" +msgstr "Ulteriori commenti:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +#: modules/users/views/scripts/profile/index.phtml:44 +msgid "Delete Account" +msgstr "Cancella Account" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Informazioni sull'account" + +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "Modifica" + +#: modules/users/views/scripts/profile/index.phtml:24 +msgid "Change Password" +msgstr "Cambia la Password" + +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-es.phtml:37 +msgid "There are no news articles yet" +msgstr "Non ci sono ancora notizie" + +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-es.phtml:44 +msgid "View All" +msgstr "Vedi Tutto" + +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-es.phtml:48 +msgid "Add New Article" +msgstr "Aggiungi Nuovo Articolo" + +#: modules/default/views/scripts/feedback/index.phtml:1 +msgid "In order to serve you better, we have provided the form below for your questions and comments" +msgstr "Il modulo sottostante permette di inserire segnalazioni e commenti per migliorare il servizio" + +#: modules/default/views/scripts/identity/id.phtml:2 +msgid "This is the identity page for the Community-ID user identified with:" +msgstr "Questa è la pagina di identificazione dell'utente Community-ID:" + +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "Questo messaggio sarà inviato a tutti gli utenti registrati di Community-ID" + +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "Passa a testo semplice" + +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "Passa a Rich-Text (HTML)" + +#: modules/default/views/scripts/openid/trust.phtml:3 +#, php-format +msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." +msgstr "Un sito che si identifica come %s ha chiesto la conferma che %s è la tua URL identificante." + +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "Ha inoltre richiesto queste addizionali informazioni su di te:" + +#: modules/default/views/scripts/openid/trust.phtml:10 +msgid "Fields are automatically filled according to the personal info stored in your community-id account." +msgstr "I campi vengono riempiti automaticamente in base alle informazioni personali memorizzate nel vostro account su Community-ID" + +#: modules/default/views/scripts/openid/trust.phtml:11 +msgid "Fields marked with * are required." +msgstr "I campi indicati con * sono obbligatori." + +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "" + +#: modules/default/views/scripts/openid/trust.phtml:23 +msgid "Forever" +msgstr "Per sempre" + +#: modules/default/views/scripts/openid/trust.phtml:26 +msgid "Allow" +msgstr "Consentire" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Deny" +msgstr "Negare" + +#: modules/default/views/scripts/openid/login.phtml:26 +msgid "Login" +msgstr "Collegati" + +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "" + +#: modules/default/views/scripts/profile/index.phtml:20 +#, php-format +msgid "The privacy policy can be found at %s" +msgstr "La nota sulla privacy è disponibile a %s" + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Cancella lo storico" + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Informazioni scambiate" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Informazioni scambiate con:" + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "OK" + +#: modules/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "Versione installata:" + +#: modules/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "Ultime notizie da Community-ID:" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "Precedente" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +msgid "Next" +msgstr "Prossimo" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "Ultime notizie" + +#: modules/news/views/scripts/index/index.phtml:16 +#: modules/news/views/scripts/view/index.phtml:3 +#, php-format +msgid "Published on %s" +msgstr "Pubblicato il %s" + +#: modules/news/views/scripts/index/index.phtml:21 +msgid "read more" +msgstr "leggi ancora" + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "Modifica Articolo" + +#: modules/news/views/scripts/view/index.phtml:7 +msgid "Delete Article" +msgstr "Cancella l'articolo" + +#: modules/install/views/scripts/index/index.phtml:2 +msgid "This Community-ID instance hasn't been installed yet" +msgstr "Questa istanza di Community-ID non è stata ancora installata" + +#: modules/install/views/scripts/index/index.phtml:5 +msgid "Proceed with installation" +msgstr "Procedere con l'installazione" + +#: modules/install/views/scripts/credentials/index.phtml:3 +msgid "Database and E-mail information" +msgstr "Informazioni sul database e sull'e-mail" + +#: modules/install/views/scripts/credentials/index.phtml:13 +msgid "Administrator User Information" +msgstr "Informazioni sull'Utente Amministratorte" + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "Correggere i seguenti problemi prima di procedere:" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "Verificare di nuovo" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "L'installazione è stata completata correttamente" + +#: modules/install/views/scripts/complete/index.phtml:6 +msgid "You can login as the administrator with the username and password you just provided." +msgstr "Puoi collegarti come amministratore usando il nome utente e la password che hai appena fornito." + +#: modules/install/views/scripts/complete/index.phtml:7 +msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." +msgstr "Si prega di osservare che questo utente è previsto solo per compiti amministrativi, e non ha quindi delle credenziali OpenID" + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "Fine" + +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "Trovata una nuova versione" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "Inserire le credenziali di amministrazione per procedere con l'aggiornamento:" + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "Verificare che sia stata fatta una copia del database prima, per sicurezza" + +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 +msgid "Home" +msgstr "Home" + +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 +msgid "Feedback" +msgstr "Segnalazioni" + +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 +msgid "Your OpenID is:" +msgstr "Il tuo OpenID è:" + +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 +msgid "Maintenance mode is enabled: user access is restricted" +msgstr "Modalità di manutenzione attivata, ristretto l'accesso degli utenti" + +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "" + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "" + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "" + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "" + +#: plugins/stats/Sites.phtml:4 +#, fuzzy +msgid "Last Week" +msgstr "Cognome" + +#: plugins/stats/Sites.phtml:5 +#, fuzzy +msgid "Last Year" +msgstr "Cognome" + +#: plugins/stats/Top.phtml:6 +#, fuzzy, php-format +msgid "%s users" +msgstr "Totale utenti:" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "" + +#, fuzzy +#~ msgid "Forgot you password?" +#~ msgstr "Dimenticato la password?" + diff --git a/languages/ja/LC_MESSAGES/lang.mo b/languages/ja/LC_MESSAGES/lang.mo new file mode 100644 index 0000000..de3bcd7 Binary files /dev/null and b/languages/ja/LC_MESSAGES/lang.mo differ diff --git a/languages/ja/LC_MESSAGES/lang.po b/languages/ja/LC_MESSAGES/lang.po new file mode 100644 index 0000000..b71ccd7 --- /dev/null +++ b/languages/ja/LC_MESSAGES/lang.po @@ -0,0 +1,1330 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID English translation\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-26 11:33-0500\n" +"PO-Revision-Date: 2010-05-26 11:34-0500\n" +"Last-Translator: Keyboard Monkeys \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: English\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: ../../../\n" +"X-Poedit-SearchPath-0: modules\n" +"X-Poedit-SearchPath-1: views\n" +"X-Poedit-SearchPath-2: javascript\n" +"X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" + +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "" + +#: modules/users/forms/AccountInfo.php:26 +#: modules/users/forms/Register.php:45 +msgid "Username" +msgstr "ユーザå" + +#: modules/users/forms/AccountInfo.php:32 +#: modules/users/forms/Register.php:28 +msgid "First Name" +msgstr "å" + +#: modules/users/forms/AccountInfo.php:37 +#: modules/users/forms/Register.php:33 +msgid "Last Name" +msgstr "姓" + +#: modules/users/forms/AccountInfo.php:42 +#: modules/users/forms/Register.php:38 +msgid "E-mail" +msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«" + +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "" + +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" +msgstr "" + +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 +msgid "Enter password" +msgstr "パスワードを入力" + +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 +msgid "Enter password again" +msgstr "å†åº¦ãƒ‘スワードを入力" + +#: modules/users/forms/PersonalInfo.php:65 +#, fuzzy +msgid "Profile Name" +msgstr "プロフィール" + +#: modules/users/forms/Login.php:18 +msgid "USERNAME" +msgstr "ユーザå" + +#: modules/users/forms/Login.php:27 +msgid "PASSWORD" +msgstr "パスワード" + +#: modules/users/forms/Register.php:51 +msgid "Enter desired password" +msgstr "希望ã®ãƒ‘スワードを入力" + +#: modules/users/forms/Register.php:68 +msgid "Please enter the text below" +msgstr "ç”»åƒå†…ã®æ–‡å­—ã¯?" + +#: modules/users/models/User.php:129 +#, fuzzy +msgid "Default profile" +msgstr "プロフィール" + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "ã™ã¿ã¾ã›ã‚“ãŒã€ç¾åœ¨ç™»éŒ²ã¯ã§ãã¾ã›ã‚“" + +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶åã¯ã™ã§ã«ç™»éŒ²æ¸ˆã¿ã§ã™" + +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã™ã§ã«ç™»éŒ²æ¸ˆã¿ã§ã™" + +#: modules/users/controllers/RegisterController.php:95 +msgid "Community-ID registration confirmation" +msgstr "Community-ID登録ã®ç¢ºèª" + +#: modules/users/controllers/RegisterController.php:100 +msgid "Thank you." +msgstr "ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚" + +#: modules/users/controllers/RegisterController.php:101 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "アカウントを有効ã«ã™ã‚‹æ‰‹é †ã‚’説明ã™ã‚‹é›»å­ãƒ¡ãƒ¼ãƒ«ãŒå±Šã‘られã¾ã™ã€‚" + +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "" + +#: modules/users/controllers/RegisterController.php:106 +msgid "The account was created but the E-mail could not be sent" +msgstr "アカウントã¯ä½œæˆã•ã‚Œã¾ã—ãŸãŒã€é›»å­ãƒ¡ãƒ¼ãƒ«ãŒé€ã‚Œã¾ã›ã‚“ã§ã—ãŸ" + +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 +msgid "Invalid token" +msgstr "Invalid token" + +#: modules/users/controllers/RegisterController.php:147 +msgid "Your account has been deleted" +msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸ" + +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 +msgid "Invalid credentials" +msgstr "ä¸æ­£ãªèªè¨¼æƒ…å ±" + +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:77 +msgid "There was a problem setting the cookie" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:51 +msgid "This E-mail is not registered in the system" +msgstr "ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã‚·ã‚¹ãƒ†ãƒ ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“" + +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 +msgid "Community-ID password reset" +msgstr "Community-IDã®ãƒ‘スワードをリセット" + +#: modules/users/controllers/RecoverpasswordController.php:74 +msgid "Password reset E-mail has been sent" +msgstr "パスワードリセットã®ãŸã‚ã®é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ã‚Šã¾ã—ãŸ" + +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:103 +msgid "You'll receive your new password via E-mail" +msgstr "新パスワードã¯é›»å­ãƒ¡ãƒ¼ãƒ«ã§å±Šã‘られã¾ã™" + +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:301 +#, fuzzy +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "アカウントã¯ä½œæˆã•ã‚Œã¾ã—ãŸãŒã€é›»å­ãƒ¡ãƒ¼ãƒ«ãŒé€ã‚Œã¾ã›ã‚“ã§ã—ãŸ" + +#: modules/users/controllers/ProfilegeneralController.php:315 +msgid "Your acccount has been successfully deleted" +msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯å•é¡Œãªã消去ã•ã‚Œã¾ã—ãŸ" + +#: modules/users/controllers/UserslistController.php:59 +msgid "admin" +msgstr "管ç†è€…" + +#: modules/users/controllers/UserslistController.php:61 +msgid "confirmed" +msgstr "確èªæ¸ˆã¿" + +#: modules/users/controllers/UserslistController.php:63 +msgid "unconfirmed" +msgstr "確èªå‰" + +#: modules/users/controllers/PersonalinfoController.php:87 +#, fuzzy +msgid "Profile has been saved" +msgstr "履歴ログã¯æ¶ˆåŽ»ã•ã‚Œã¾ã—ãŸ" + +#: modules/users/controllers/PersonalinfoController.php:98 +#, fuzzy +msgid "Profile has been deleted" +msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸ" + +#: modules/users/controllers/ManageusersController.php:31 +msgid "User has been deleted successfully" +msgstr "ユーザã¯ç¢ºå®Ÿã«å‰Šé™¤ã•ã‚Œã¾ã—ãŸ" + +#: modules/users/controllers/ManageusersController.php:48 +msgid "Community-ID registration reminder" +msgstr "Community-ID登録ã®ãŠçŸ¥ã‚‰ã›" + +#: modules/default/forms/MessageUsers.php:17 +#, fuzzy +msgid "Subject" +msgstr "Subject:" + +#: modules/default/forms/MessageUsers.php:22 +#, fuzzy +msgid "CC" +msgstr "CC:" + +#: modules/default/forms/OpenidLogin.php:28 +msgid "OpenID URL" +msgstr "OpenID URL" + +#: modules/default/forms/OpenidLogin.php:35 +msgid "Password" +msgstr "パスワード" + +#: modules/default/forms/Feedback.php:25 +msgid "Enter your name" +msgstr "åå‰ã‚’入力" + +#: modules/default/forms/Feedback.php:30 +msgid "Enter your E-mail" +msgstr "メールアドレスを入力" + +#: modules/default/forms/Feedback.php:37 +msgid "Enter your questions or comments" +msgstr "質å•ã‚„コメントã®å…¥åŠ›" + +#: modules/default/forms/ErrorMessages.php:20 +msgid "Value is empty, but a non-empty value is required" +msgstr "値ãŒã‚ã‚Šã¾ã›ã‚“ãŒã€å¿…é ˆã§ã™" + +#: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:22 +msgid "'%value%' is not a valid email address in the basic format local-part@hostname" +msgstr "'%value%' ã¯ã€åå‰@ドメインåã¨ã„ã£ãŸåŸºæœ¬çš„ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®æ›¸å¼ã¨ã—ã¦æ­£ã—ãã‚ã‚Šã¾ã›ã‚“" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "'%hostname%'ã¯ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹:'%value%'ã®ãƒ›ã‚¹ãƒˆåã¨ã—ã¦æ­£ã—ãã‚ã‚Šã¾ã›ã‚“" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "'%value%' ã¯DNSã®ãƒ›ã‚¹ãƒˆåã®ã‚ˆã†ã§ã™ãŒã€TLDã«ãƒžãƒƒãƒã—ã¾ã›ã‚“。" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "'%value%' ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®åå‰ã®ã‚ˆã†ã§ã™ãŒã€ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Captcha value is wrong" +msgstr "Captchaã®å€¤ãŒé–“é•ã£ã¦ã„ã¾ã™" + +#: modules/default/forms/ErrorMessages.php:28 +msgid "Password confirmation does not match" +msgstr "å†ç¢ºèªç”¨ã®ãƒ‘スワードã¨ãƒžãƒƒãƒã—ã¾ã›ã‚“" + +#: modules/default/forms/ErrorMessages.php:29 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "ユーザåã«ã¯ã€åŠè§’英数字ã¨æ¬¡ã®æ–‡å­—ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ $-_.+!*'() \"" + +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "男性" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "女性" + +#: modules/default/models/Fields.php:62 +msgid "Nickname" +msgstr "ニックãƒãƒ¼ãƒ " + +#: modules/default/models/Fields.php:64 +msgid "Full Name" +msgstr "姓å" + +#: modules/default/models/Fields.php:65 +msgid "Date of Birth" +msgstr "誕生日" + +#: modules/default/models/Fields.php:66 +msgid "Gender" +msgstr "性別" + +#: modules/default/models/Fields.php:67 +msgid "Postal Code" +msgstr "郵便番å·" + +#: modules/default/models/Fields.php:68 +msgid "Country" +msgstr "国" + +#: modules/default/models/Fields.php:69 +msgid "Language" +msgstr "言語" + +#: modules/default/models/Fields.php:70 +msgid "Time Zone" +msgstr "時間帯" + +#: modules/default/controllers/MessageusersController.php:46 +msgid "CC field must be a comma-separated list of valid E-mails" +msgstr "CCフィールドã«ã¯ã€æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’コンマã§åŒºåˆ‡ã£ãŸãƒªã‚¹ãƒˆå½¢å¼ã§è¨˜å…¥ã—ã¦ãã ã•ã„" + +#: modules/default/controllers/MessageusersController.php:86 +#, fuzzy +msgid "Message has been sent" +msgstr "ユーザã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹" + +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "" + +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "" + +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "" + +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "" + +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "" + +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "ニュース項目をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: modules/default/controllers/CidController.php:47 +msgid "Read More" +msgstr "続ãを読む" + +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "" + +#: modules/news/forms/Article.php:18 +msgid "Title" +msgstr "タイトル" + +#: modules/news/forms/Article.php:24 +msgid "Publication date" +msgstr "公開日" + +#: modules/news/forms/Article.php:32 +msgid "Excerpt" +msgstr "抜粋" + +#: modules/news/controllers/EditController.php:60 +#: modules/news/controllers/EditController.php:90 +msgid "The article doesn't exist." +msgstr "" + +#: modules/news/controllers/EditController.php:81 +#, fuzzy +msgid "The article has been saved." +msgstr "履歴ログã¯æ¶ˆåŽ»ã•ã‚Œã¾ã—ãŸ" + +#: modules/news/controllers/EditController.php:93 +#, fuzzy +msgid "The article has been deleted." +msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸ" + +#: modules/install/forms/Install.php:18 +#, fuzzy +msgid "Hostname" +msgstr "ホーム" + +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "" + +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "" + +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "" + +#: modules/install/forms/Install.php:40 +#, fuzzy +msgid "Database password" +msgstr "パスワードを入力" + +#: modules/install/forms/Install.php:44 +#, fuzzy +msgid "Support E-mail" +msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "" + +#: modules/install/controllers/UpgradeController.php:80 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "アップグレードã¯æˆåŠŸã—ã¾ã—ãŸã€‚ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %s" + +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "" + +#: modules/install/controllers/UpgradeController.php:117 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "アップグレードã®å‰ã«ä¿®æ­£ãŒå¿…è¦ã§ã™: ファイル %s ãŒãªã„ã®ã§å…ˆã«ã™ã™ã‚ã¾ã›ã‚“" + +#: modules/install/controllers/UpgradeController.php:159 +#, fuzzy +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "次ã®å•é¡Œã‚’修正ã—ã¦ã‹ã‚‰å…ˆã«é€²ã‚“ã§ãã ã•ã„:" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:234 +#, php-format +msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." +msgstr "Community-IDをインストールã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ã€ web serverã®èµ·å‹•ãƒ¦ãƒ¼ã‚¶ (%s)ã‹ã‚‰æ›¸ãè¾¼ã¿ãŒå¯èƒ½ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚別ã®æ–¹æ³•ã¨ã—ã¦ã€å†…容ãŒç©ºã§ã“ã®ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®æ›¸ãè¾¼ã¿ãŒå¯èƒ½ãªconfig.phpファイルを作ã£ã¦ãŠãã“ã¨ã§ã‚‚å¯èƒ½ã§ã™ã€‚" + +#: modules/install/controllers/CredentialsController.php:237 +#, php-format +msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" +msgstr "Community-IDをインストールã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ç›´ä¸‹ã«ã‚ã‚‹\"captchas\"ディレクトリã¯ã€ web server user (%s)ãŒæ›¸ãè¾¼ã¿ã§ãã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" + +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "%s 拡張をインストールã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™" + +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "" + +#: javascript/language.php:30 +msgid "Name" +msgstr "åå‰" + +#: javascript/language.php:31 +msgid "Registration" +msgstr "登録日" + +#: javascript/language.php:32 +msgid "Status" +msgstr "ステータス" + +#: javascript/language.php:33 +msgid "profile" +msgstr "プロフィール" + +#: javascript/language.php:34 +msgid "delete" +msgstr "削除ã™ã‚‹" + +#: javascript/language.php:35 +msgid "Site" +msgstr "サイト" + +#: javascript/language.php:36 +msgid "view info exchanged" +msgstr "交æ›ã•ã‚ŒãŸæƒ…報を見る" + +#: javascript/language.php:37 +msgid "deny" +msgstr "æ‹’å¦ã™ã‚‹" + +#: javascript/language.php:38 +msgid "allow" +msgstr "許å¯ã™ã‚‹" + +#: javascript/language.php:39 +msgid "Are you sure you wish to send this message to ALL users?" +msgstr "本当ã«ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’全ユーザã«é€ã‚Šã¾ã™ã‹?" + +#: javascript/language.php:40 +msgid "Are you sure you wish to deny trust to this site?" +msgstr "本当ã«ã“ã®ã‚µã‚¤ãƒˆã‚’ä¿¡é ¼ã™ã‚‹äº‹ã‚’æ‹’å¦ã—ã¾ã™ã‹?" + +#: javascript/language.php:41 +msgid "operation failed" +msgstr "æ“作失敗" + +#: javascript/language.php:42 +msgid "Trust to the following site has been granted:" +msgstr "次ã®ã‚µã‚¤ãƒˆã‚’ä¿¡é ¼ã™ã‚‹ã“ã¨ã¯èªã‚られã¾ã—ãŸ:" + +#: javascript/language.php:43 +msgid "Trust the following site has been denied:" +msgstr "次ã®ã‚µã‚¤ãƒˆã‚’ä¿¡é ¼ã™ã‚‹ã“ã¨ã¯æ‹’å¦ã•ã‚Œã¾ã—ãŸ:" + +#: javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "エラー. サーãƒã®å¿œç­”:" + +#: javascript/language.php:45 +msgid "Your relationship with the following site has been deleted:" +msgstr "ã“ã®ã‚µã‚¤ãƒˆã¨ã®é–¢ä¿‚データã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸ:" + +#: javascript/language.php:46 +msgid "The history log has been cleared" +msgstr "履歴ログã¯æ¶ˆåŽ»ã•ã‚Œã¾ã—ãŸ" + +#: javascript/language.php:47 +msgid "Are you sure you wish to allow access to this site?" +msgstr "本当ã«ã“ã®ã‚µã‚¤ãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã‹?" + +#: javascript/language.php:48 +msgid "Are you sure you wish to delete your relationship with this site?" +msgstr "本当ã«ã“ã®ã‚µã‚¤ãƒˆã¨ã®é–¢ä¿‚データを削除ã—ã¾ã™ã‹?" + +#: javascript/language.php:49 +msgid "Are you sure you wish to delete all the History Log?" +msgstr "本当ã«ã™ã¹ã¦ã®å±¥æ­´ãƒ­ã‚°ã‚’削除ã—ã¾ã™ã‹?" + +#: javascript/language.php:50 +msgid "Are you sure you wish to delete the user" +msgstr "本当ã«ã“ã®ãƒ¦ãƒ¼ã‚¶ã‚’削除ã—ã¾ã™ã‹?" + +#: javascript/language.php:51 +msgid "Are you sure you wish to delete all the unconfirmed accounts?" +msgstr "本当ã«ã™ã¹ã¦ã®ç¢ºèªå‰ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’削除ã—ã¾ã™ã‹?" + +#: javascript/language.php:52 +msgid "Date" +msgstr "日付" + +#: javascript/language.php:53 +msgid "Result" +msgstr "çµæžœ" + +#: javascript/language.php:54 +msgid "No records found." +msgstr "該当ã™ã‚‹è¨˜éŒ²ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#: javascript/language.php:55 +msgid "Loading..." +msgstr "ロード中..." + +#: javascript/language.php:56 +msgid "Data error." +msgstr "データエラー." + +#: javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "クリックã™ã‚‹ã¨æ˜‡é †ã«ä¸¦ã¹æ›¿ãˆã¾ã™" + +#: javascript/language.php:58 +msgid "Click to sort descending" +msgstr "クリックã™ã‚‹ã¨é™é †ã«ä¸¦ã¹æ›¿ãˆã¾ã™" + +#: javascript/language.php:59 +msgid "Authorized" +msgstr "許å¯ã•ã‚ŒãŸ" + +#: javascript/language.php:60 +msgid "Denied" +msgstr "æ‹’å¦ã•ã‚ŒãŸ" + +#: javascript/language.php:61 +msgid "of" +msgstr "ã®" + +#: javascript/language.php:62 +msgid "next" +msgstr "次" + +#: javascript/language.php:63 +msgid "prev" +msgstr "å‰" + +#: javascript/language.php:64 +msgid "IP" +msgstr "IP" + +#: javascript/language.php:65 +msgid "Delete unconfirmed accounts older than how many days?" +msgstr "確èªã•ã‚Œãªã„ã¾ã¾ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ä½•æ—¥ä»¥ä¸ŠçµŒéŽã—ãŸã‚‰å‰Šé™¤ã—ã¾ã™ã‹?" + +#: javascript/language.php:66 +msgid "The value entered is incorrect" +msgstr "入力ã•ã‚ŒãŸå€¤ã¯æ­£ã—ãã‚ã‚Šã¾ã›ã‚“" + +#: javascript/language.php:67 +msgid "Send reminder to accounts older than how many days?" +msgstr "何日以上ãŸã£ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãŠçŸ¥ã‚‰ã›ã‚’é€ã‚Šã¾ã™ã‹?" + +#: javascript/language.php:68 +msgid "Are you sure you wish to delete this article?" +msgstr "本当ã«ã“ã®è¨˜äº‹ã‚’削除ã—ã¾ã™ã‹?" + +#: javascript/language.php:69 +#, fuzzy +msgid "reminder" +msgstr "性別" + +#: javascript/language.php:70 +#, fuzzy +msgid "reminders" +msgstr "性別" + +#: javascript/language.php:71 +#, fuzzy +msgid "Are you sure you wish to delete this profile?" +msgstr "本当ã«ã“ã®è¨˜äº‹ã‚’削除ã—ã¾ã™ã‹?" + +#: libs/Monkeys/Form/Element/Timezone.php:47 +msgid "-- Select a Timezone --" +msgstr "" + +#: libs/Monkeys/Form/Element/Country.php:35 +msgid "-- Select a Country --" +msgstr "" + +#: libs/Monkeys/Form/Element/Language.php:35 +msgid "-- Select a Language --" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 +msgid "January" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "February" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "March" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +#, fuzzy +msgid "April" +msgstr "プロフィール" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "May" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "June" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "July" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "August" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +#, fuzzy +msgid "Septembre" +msgstr "ログインã®çŠ¶æ…‹ã‚’ä¿æŒ" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "October" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "November" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +#, fuzzy +msgid "December" +msgstr "ログインã®çŠ¶æ…‹ã‚’ä¿æŒ" + +#: plugins/stats/Authorizations.php:21 +msgid "Authorizations per day" +msgstr "æ—¥å˜ä½ã®æ‰¿èªæ•°" + +#: plugins/stats/Sites.php:21 +msgid "Trusted Sites" +msgstr "ä¿¡é ¼ã•ã‚ŒãŸã‚µã‚¤ãƒˆ" + +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "信頼済ã¿ã‚µã‚¤ãƒˆ" + +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "ユーザ毎サイト" + +#: plugins/stats/Top.php:21 +msgid "Top 10 Trusted Sites" +msgstr "ä¿¡é ¼ã§ãるサイトトップ10" + +#: plugins/stats/Registrations.php:21 +msgid "Registrations per day" +msgstr "æ—¥å˜ä½ã®ç™»éŒ²æ•°" + +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "ä¿å­˜" + +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:42 +#, fuzzy +msgid "Enable" +msgstr "男性" + +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "" + +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "登録フォーム" + +#: modules/users/views/scripts/register/index.phtml:10 +#: modules/users/views/scripts/recoverpassword/index.phtml:4 +msgid "Send" +msgstr "é€ä¿¡" + +#: modules/users/views/scripts/register/eula.phtml:1 +msgid "Please read the following EULA in order to continue" +msgstr "次ã®ä½¿ç”¨è¨±è«¾å¥‘約書を読んã§ã‹ã‚‰ç¶šã‘ã¦ãã ã•ã„" + +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "åŒæ„ã™ã‚‹" + +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "åŒæ„ã—ãªã„" + +#: modules/users/views/scripts/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "%sã•ã‚“ã€ã“ã‚“ã«ã¡ã¯" + +#: modules/users/views/scripts/login/index.phtml:7 +msgid "Account" +msgstr "アカウント" + +#: modules/users/views/scripts/login/index.phtml:11 +msgid "Personal Info" +msgstr "個人情報" + +#: modules/users/views/scripts/login/index.phtml:17 +msgid "Sites database" +msgstr "サイトã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹" + +#: modules/users/views/scripts/login/index.phtml:20 +msgid "History Log" +msgstr "履歴ログ" + +#: modules/users/views/scripts/login/index.phtml:24 +msgid "Logout" +msgstr "ログアウト" + +#: modules/users/views/scripts/login/index.phtml:29 +msgid "Admin options" +msgstr "システム管ç†ã‚ªãƒ—ション" + +#: modules/users/views/scripts/login/index.phtml:32 +msgid "Manage Users" +msgstr "ユーザを管ç†ã™ã‚‹" + +#: modules/users/views/scripts/login/index.phtml:35 +msgid "Message Users" +msgstr "ユーザã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹" + +#: modules/users/views/scripts/login/index.phtml:39 +msgid "Disable Maintenance Mode" +msgstr "メンテナンスモードを解除ã™ã‚‹" + +#: modules/users/views/scripts/login/index.phtml:41 +msgid "Enable Maintenance Mode" +msgstr "メンテナンスモードã«ã™ã‚‹" + +#: modules/users/views/scripts/login/index.phtml:45 +msgid "Statistics" +msgstr "統計" + +#: modules/users/views/scripts/login/index.phtml:48 +msgid "About Community-ID" +msgstr "Community-IDã«ã¤ã„ã¦" + +#: modules/users/views/scripts/login/index.phtml:55 +msgid "User access is currently disabled for system maintenance.
Please try again later" +msgstr "ç¾åœ¨ã‚·ã‚¹ãƒ†ãƒ ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã€ãƒ¦ãƒ¼ã‚¶ã‚¢ã‚¯ã‚»ã‚¹ã¯ã§ãã¾ã›ã‚“。
後ã§ã¾ãŸã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã¿ã¦ãã ã•ã„" + +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:82 +msgid "Remember me" +msgstr "ログインã®çŠ¶æ…‹ã‚’ä¿æŒ" + +#: modules/users/views/scripts/login/index.phtml:85 +msgid "Log in" +msgstr "ログイン" + +#: modules/users/views/scripts/login/index.phtml:91 +#, fuzzy +msgid "Forgot your password?" +msgstr "パスワードを忘れãŸã¨ãã¯ï¼Ÿ" + +#: modules/users/views/scripts/login/index.phtml:98 +msgid "You don't have an account?" +msgstr "アカウントをãŠæŒã¡ã§ãªã„æ–¹ã¯ã“ã¡ã‚‰ã¸" + +#: modules/users/views/scripts/login/index.phtml:100 +msgid "REGISTER NOW!" +msgstr "登録ã—ã¾ã—ょã†!" + +#: modules/users/views/scripts/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "パスワードをリセットã™ã‚‹ãŸã‚ã®ãƒªãƒ³ã‚¯ã‚’å¾—ã‚‹ãŸã‚ã«ã¯ã€ä»¥ä¸‹ã«ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„" + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "Enter search string" +msgstr "検索文字列入力" + +#: modules/users/views/scripts/manageusers/index.phtml:12 +msgid "Go" +msgstr "実行ã™ã‚‹" + +#: modules/users/views/scripts/manageusers/index.phtml:13 +msgid "Clear" +msgstr "クリア" + +#: modules/users/views/scripts/manageusers/index.phtml:16 +msgid "All" +msgstr "å…¨ã¦" + +#: modules/users/views/scripts/manageusers/index.phtml:19 +msgid "Confirmed" +msgstr "確èªæ¸ˆ" + +#: modules/users/views/scripts/manageusers/index.phtml:22 +msgid "Unconfirmed" +msgstr "確èªå‰" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Total users:" +msgstr "ç·ãƒ¦ãƒ¼ã‚¶æ•°:" + +#: modules/users/views/scripts/manageusers/index.phtml:30 +msgid "Total confirmed users:" +msgstr "確èªæ¸ˆãƒ¦ãƒ¼ã‚¶ç·æ•°:" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Total unconfirmed users:" +msgstr "確èªå‰ãƒ¦ãƒ¼ã‚¶ç·æ•°:" + +#: modules/users/views/scripts/manageusers/index.phtml:34 +msgid "Add User" +msgstr "ユーザ追加" + +#: modules/users/views/scripts/manageusers/index.phtml:36 +msgid "Delete Unconfirmed Users" +msgstr "確èªå‰ãƒ¦ãƒ¼ã‚¶ã®å‰Šé™¤" + +#: modules/users/views/scripts/manageusers/index.phtml:39 +msgid "Send Reminder" +msgstr "ãŠçŸ¥ã‚‰ã›ã‚’é€ä¿¡" + +#: modules/users/views/scripts/personalinfo/edit.phtml:6 +msgid "Cancel" +msgstr "キャンセル" + +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "ã“ã®æƒ…å ±ã¯ã€OpenIDã®ã‚„ã‚Šã¨ã‚Šã§å¿…è¦ãªç™»éŒ²é …目を自動的ã«æ¸¡ã™ãŸã‚ã«ä½¿ã‚ã‚Œã¾ã™" + +#: modules/users/views/scripts/personalinfo/index.phtml:23 +#, fuzzy +msgid "Edit profile" +msgstr "記事ã®ç·¨é›†" + +#: modules/users/views/scripts/personalinfo/index.phtml:29 +#, fuzzy +msgid "Delete profile" +msgstr "記事を削除" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 +msgid "Not Entered" +msgstr "未入力" + +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "OpenID" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 +msgid "Why do you want to delete your Community-ID account?" +msgstr "ãªãœ Community-ID アカウントを消去ã—ãŸã„ã®ã§ã™ã‹?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "当ã¦ã¯ã¾ã‚‹é …目全ã¦ã«ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "å˜ã«ãƒ†ã‚¹ãƒˆç”¨ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã ã‹ã‚‰" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "別ã«ã‚ˆã‚Šè‰¯ã„サービスãŒã‚ã£ãŸã‹ã‚‰" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "å¿…è¦ãªæ©Ÿèƒ½ã«æ¬ ã‘ã¦ã„ã‚‹ã‹ã‚‰" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "ã¨ã‚ŠãŸã¦ã¦æ„味ã¯ãªã„" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +msgid "Additional comments:" +msgstr "追加コメント:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +#: modules/users/views/scripts/profile/index.phtml:44 +msgid "Delete Account" +msgstr "アカウント削除" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "アカウント情報" + +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "編集" + +#: modules/users/views/scripts/profile/index.phtml:24 +msgid "Change Password" +msgstr "パスワード変更" + +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-es.phtml:37 +msgid "There are no news articles yet" +msgstr "æ–°ã—ã„ニュース記事ã¯ã‚ã‚Šã¾ã›ã‚“" + +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-es.phtml:44 +msgid "View All" +msgstr "å…¨ã¦é–²è¦§" + +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-es.phtml:48 +msgid "Add New Article" +msgstr "新記事ã®è¿½åŠ " + +#: modules/default/views/scripts/feedback/index.phtml:1 +msgid "In order to serve you better, we have provided the form below for your questions and comments" +msgstr "下ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’使ã£ã¦ã‚ãªãŸã®è³ªå•ã‚„コメントをé€ã£ã¦ãã ã•ã„。今後ã®ã‚µãƒ¼ãƒ“スã«å½¹ç«‹ã¦ã¾ã™ã€‚" + +#: modules/default/views/scripts/identity/id.phtml:2 +msgid "This is the identity page for the Community-ID user identified with:" +msgstr "" + +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã™ã¹ã¦ã®ç™»éŒ²æ¸ˆCommunity-IDユーザã«é€ã‚‰ã‚Œã¾ã™" + +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "平文ã«å¤‰æ›´" + +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "HTMLã«å¤‰æ›´" + +#: modules/default/views/scripts/openid/trust.phtml:3 +#, php-format +msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." +msgstr "%s ã¨ã„ã†ã‚µã‚¤ãƒˆã¯ã€ %s ãŒã‚ãªãŸã®èªè¨¼URLã‹ã©ã†ã‹ã®ç¢ºèªã‚’求ã‚ã¦ãã¦ã„ã¾ã™ã€‚." + +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "次ã®è¿½åŠ æƒ…報も求ã‚ã¦ãã¦ã„ã¾ã™:" + +#: modules/default/views/scripts/openid/trust.phtml:10 +msgid "Fields are automatically filled according to the personal info stored in your community-id account." +msgstr "データ欄ã¯ã€ã‚ãªãŸã®Community-idã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«è¨˜è¼‰ã•ã‚Œã¦ã„る個人情報ã«åŸºã¥ã„ã¦è‡ªå‹•çš„ã«å…¥åŠ›ã•ã‚Œã¾ã™ã€‚" + +#: modules/default/views/scripts/openid/trust.phtml:11 +msgid "Fields marked with * are required." +msgstr "(*)ã§ç¤ºã•ã‚ŒãŸå…¥åŠ›æ¬„ã¯å¿…須項目ã§ã™ã€‚" + +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "" + +#: modules/default/views/scripts/openid/trust.phtml:23 +msgid "Forever" +msgstr "永続的" + +#: modules/default/views/scripts/openid/trust.phtml:26 +msgid "Allow" +msgstr "許å¯" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Deny" +msgstr "æ‹’å¦" + +#: modules/default/views/scripts/openid/login.phtml:26 +msgid "Login" +msgstr "ログイン" + +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "" + +#: modules/default/views/scripts/profile/index.phtml:20 +#, fuzzy, php-format +msgid "The privacy policy can be found at %s" +msgstr "個人情報ä¿è­·ã«é–¢ã™ã‚‹æ–¹é‡ã¯ã“ã¡ã‚‰: %s" + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "履歴削除" + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "交æ›ã•ã‚ŒãŸæƒ…å ±" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "情報交æ›å…ˆ:" + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "OK" + +#: modules/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "インストールã•ã‚Œã¦ã„ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³:" + +#: modules/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "Community-IDã‹ã‚‰ã®æœ€æ–°ãƒ‹ãƒ¥ãƒ¼ã‚¹:" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "以å‰" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +msgid "Next" +msgstr "次" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "最新ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹" + +#: modules/news/views/scripts/index/index.phtml:16 +#: modules/news/views/scripts/view/index.phtml:3 +#, php-format +msgid "Published on %s" +msgstr "%sã«å…¬é–‹" + +#: modules/news/views/scripts/index/index.phtml:21 +msgid "read more" +msgstr "続ãを読む" + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "記事ã®ç·¨é›†" + +#: modules/news/views/scripts/view/index.phtml:7 +msgid "Delete Article" +msgstr "記事を削除" + +#: modules/install/views/scripts/index/index.phtml:2 +msgid "This Community-ID instance hasn't been installed yet" +msgstr "ã“ã® Community-ID ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ã¾ã ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“" + +#: modules/install/views/scripts/index/index.phtml:5 +msgid "Proceed with installation" +msgstr "インストレーションをã™ã™ã‚ã‚‹" + +#: modules/install/views/scripts/credentials/index.phtml:3 +msgid "Database and E-mail information" +msgstr "データベースã¨é›»å­ãƒ¡ãƒ¼ãƒ«æƒ…å ±" + +#: modules/install/views/scripts/credentials/index.phtml:13 +msgid "Administrator User Information" +msgstr "" + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "次ã®å•é¡Œã‚’修正ã—ã¦ã‹ã‚‰å…ˆã«é€²ã‚“ã§ãã ã•ã„:" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "å†ç¢ºèª" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "インストレーションã¯æˆåŠŸã—ã¾ã—ãŸ" + +#: modules/install/views/scripts/complete/index.phtml:6 +msgid "You can login as the administrator with the username and password you just provided." +msgstr "" + +#: modules/install/views/scripts/complete/index.phtml:7 +msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." +msgstr "" + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "終了" + +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã™" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "管ç†è€…ã®èªè¨¼æƒ…報を入力ã—ã¦ã‚¢ãƒƒãƒ—グレードをã™ã™ã‚ã¾ã™" + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "万ãŒä¸€ã®ãŸã‚ã«ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ã‚³ãƒ”ーをã¨ã£ã¦ãŠãã¾ã—ょã†" + +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 +msgid "Home" +msgstr "ホーム" + +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 +msgid "Feedback" +msgstr "フィードãƒãƒƒã‚¯" + +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 +msgid "Your OpenID is:" +msgstr "ã‚ãªãŸã® OpenID ã¯:" + +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 +msgid "Maintenance mode is enabled: user access is restricted" +msgstr "ä¿å®ˆãƒ¢ãƒ¼ãƒ‰ã«ãªã£ã¦ã„ã¾ã™ã®ã§ã€ãƒ¦ãƒ¼ã‚¶ã‚¢ã‚¯ã‚»ã‚¹ã¯åˆ¶é™ã•ã‚Œã¾ã™" + +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "Help and Support" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "Privacy" + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "About Us" + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "Contact Us" + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "ビューをé¸æŠž" + +#: plugins/stats/Sites.phtml:4 +msgid "Last Week" +msgstr "éŽåŽ»7日間" + +#: plugins/stats/Sites.phtml:5 +msgid "Last Year" +msgstr "éŽåŽ»1å¹´é–“" + +#: plugins/stats/Top.phtml:6 +#, php-format +msgid "%s users" +msgstr "%s ユーザ" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "éŽåŽ»1ã‹æœˆ" + +#, fuzzy +#~ msgid "Forgot you password?" +#~ msgstr "パスワードを忘れãŸã¨ãã¯ï¼Ÿ" +#~ msgid "Privacy Policy" +#~ msgstr "個人情報ä¿è­·ã«é–¢ã™ã‚‹æ–¹é‡" +#~ msgid "About Community-id" +#~ msgstr "Community-idã«ã¤ã„ã¦" +#~ msgid "Body:" +#~ msgstr "Body:" +#~ msgid "OPEN AN ACCOUNT NOW" +#~ msgstr "OPEN AN ACCOUNT NOW" +#~ msgid "" +#~ "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" +#~ msgstr "" +#~ "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" +#~ msgid "Starting today
you'll only have to remember one" +#~ msgstr "Starting today
you'll only have to remember one" + diff --git a/languages/nl/LC_MESSAGES/lang.mo b/languages/nl/LC_MESSAGES/lang.mo new file mode 100644 index 0000000..a98df45 Binary files /dev/null and b/languages/nl/LC_MESSAGES/lang.mo differ diff --git a/languages/nl/LC_MESSAGES/lang.po b/languages/nl/LC_MESSAGES/lang.po new file mode 100644 index 0000000..599cf6d --- /dev/null +++ b/languages/nl/LC_MESSAGES/lang.po @@ -0,0 +1,1345 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID English translation\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-26 11:34-0500\n" +"PO-Revision-Date: 2010-05-26 11:34-0500\n" +"Last-Translator: Keyboard Monkeys \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: English\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: ../../../\n" +"X-Poedit-SearchPath-0: modules\n" +"X-Poedit-SearchPath-1: views\n" +"X-Poedit-SearchPath-2: javascript\n" +"X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" + +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "" + +#: modules/users/forms/AccountInfo.php:26 +#: modules/users/forms/Register.php:45 +msgid "Username" +msgstr "Gebruikersnaam" + +#: modules/users/forms/AccountInfo.php:32 +#: modules/users/forms/Register.php:28 +msgid "First Name" +msgstr "Voornaam:" + +#: modules/users/forms/AccountInfo.php:37 +#: modules/users/forms/Register.php:33 +msgid "Last Name" +msgstr "Achternaam:" + +#: modules/users/forms/AccountInfo.php:42 +#: modules/users/forms/Register.php:38 +msgid "E-mail" +msgstr "E-mail" + +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "" + +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" +msgstr "" + +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 +msgid "Enter password" +msgstr "Vul wachtwoord in:" + +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 +msgid "Enter password again" +msgstr "Vul wachtwoord nogmaals in:" + +#: modules/users/forms/PersonalInfo.php:65 +#, fuzzy +msgid "Profile Name" +msgstr "profiel" + +#: modules/users/forms/Login.php:18 +msgid "USERNAME" +msgstr "GEBRUIKERSNAAM" + +#: modules/users/forms/Login.php:27 +msgid "PASSWORD" +msgstr "WACHTWOORD" + +#: modules/users/forms/Register.php:51 +msgid "Enter desired password" +msgstr "Vul gewenste wachtwoord in:" + +#: modules/users/forms/Register.php:68 +msgid "Please enter the text below" +msgstr "Vul onderstaande tekst in:" + +#: modules/users/models/User.php:129 +#, fuzzy +msgid "Default profile" +msgstr "profiel" + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "Sorry, registratie is momenteel niet mogelijk" + +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "Deze gebruikersnaam is in gebruik" + +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "Dit E-mail adres is in gebruik" + +#: modules/users/controllers/RegisterController.php:95 +msgid "Community-ID registration confirmation" +msgstr "" + +#: modules/users/controllers/RegisterController.php:100 +msgid "Thank you." +msgstr "" + +#: modules/users/controllers/RegisterController.php:101 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "" + +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "" + +#: modules/users/controllers/RegisterController.php:106 +msgid "The account was created but the E-mail could not be sent" +msgstr "" + +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 +msgid "Invalid token" +msgstr "" + +#: modules/users/controllers/RegisterController.php:147 +#, fuzzy +msgid "Your account has been deleted" +msgstr "Je account is succesvol verwijderd" + +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 +msgid "Invalid credentials" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:77 +msgid "There was a problem setting the cookie" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:51 +#, fuzzy +msgid "This E-mail is not registered in the system" +msgstr "Dit E-mail adres is in gebruik" + +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 +msgid "Community-ID password reset" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:74 +msgid "Password reset E-mail has been sent" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:103 +msgid "You'll receive your new password via E-mail" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:301 +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:315 +msgid "Your acccount has been successfully deleted" +msgstr "Je account is succesvol verwijderd" + +#: modules/users/controllers/UserslistController.php:59 +msgid "admin" +msgstr "admin" + +#: modules/users/controllers/UserslistController.php:61 +msgid "confirmed" +msgstr "bevestigd" + +#: modules/users/controllers/UserslistController.php:63 +msgid "unconfirmed" +msgstr "onbevestigd" + +#: modules/users/controllers/PersonalinfoController.php:87 +#, fuzzy +msgid "Profile has been saved" +msgstr "De historische logs zijn verwijderd" + +#: modules/users/controllers/PersonalinfoController.php:98 +#, fuzzy +msgid "Profile has been deleted" +msgstr "De historische logs zijn verwijderd" + +#: modules/users/controllers/ManageusersController.php:31 +msgid "User has been deleted successfully" +msgstr "Gebruiker is succesvol verwijderd" + +#: modules/users/controllers/ManageusersController.php:48 +msgid "Community-ID registration reminder" +msgstr "" + +#: modules/default/forms/MessageUsers.php:17 +#, fuzzy +msgid "Subject" +msgstr "Onderwerp:" + +#: modules/default/forms/MessageUsers.php:22 +#, fuzzy +msgid "CC" +msgstr "CC:" + +#: modules/default/forms/OpenidLogin.php:28 +#, fuzzy +msgid "OpenID URL" +msgstr "Open ID" + +#: modules/default/forms/OpenidLogin.php:35 +msgid "Password" +msgstr "Wachtwoord" + +#: modules/default/forms/Feedback.php:25 +msgid "Enter your name" +msgstr "Vul je naam in:" + +#: modules/default/forms/Feedback.php:30 +msgid "Enter your E-mail" +msgstr "Vul je E-mail adres in:" + +#: modules/default/forms/Feedback.php:37 +msgid "Enter your questions or comments" +msgstr "Vul je vragen of reaktie in:" + +#: modules/default/forms/ErrorMessages.php:20 +msgid "Value is empty, but a non-empty value is required" +msgstr "Waarde is leeg, deze mag niet leeg zijn" + +#: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:22 +msgid "'%value%' is not a valid email address in the basic format local-part@hostname" +msgstr "'%value%' is geen valide E-mail adres in het formaat local-part@hostname" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Captcha value is wrong" +msgstr "De Captcha inhoud is onjuist" + +#: modules/default/forms/ErrorMessages.php:28 +msgid "Password confirmation does not match" +msgstr "Wachtwoord bevestiging komt niet overeen" + +#: modules/default/forms/ErrorMessages.php:29 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "Man" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "Vrouw" + +#: modules/default/models/Fields.php:62 +msgid "Nickname" +msgstr "Nickname" + +#: modules/default/models/Fields.php:64 +msgid "Full Name" +msgstr "Volledige naam" + +#: modules/default/models/Fields.php:65 +msgid "Date of Birth" +msgstr "Geboortedatum" + +#: modules/default/models/Fields.php:66 +msgid "Gender" +msgstr "Geslacht" + +#: modules/default/models/Fields.php:67 +msgid "Postal Code" +msgstr "Postcode" + +#: modules/default/models/Fields.php:68 +msgid "Country" +msgstr "Land" + +#: modules/default/models/Fields.php:69 +msgid "Language" +msgstr "Taal" + +#: modules/default/models/Fields.php:70 +msgid "Time Zone" +msgstr "Tijdzone" + +#: modules/default/controllers/MessageusersController.php:46 +msgid "CC field must be a comma-separated list of valid E-mails" +msgstr "Het CC veld moet een door komma's gescheiden lijst van geldige E-mail adressen zijn" + +#: modules/default/controllers/MessageusersController.php:86 +#, fuzzy +msgid "Message has been sent" +msgstr "Stuur bericht aan gebruikers" + +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "" + +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "" + +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "" + +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "" + +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "" + +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "Kon geen nieuws items ophalen" + +#: modules/default/controllers/CidController.php:47 +msgid "Read More" +msgstr "Lees verder" + +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "" + +#: modules/news/forms/Article.php:18 +#, fuzzy +msgid "Title" +msgstr "Site" + +#: modules/news/forms/Article.php:24 +msgid "Publication date" +msgstr "" + +#: modules/news/forms/Article.php:32 +msgid "Excerpt" +msgstr "" + +#: modules/news/controllers/EditController.php:60 +#: modules/news/controllers/EditController.php:90 +msgid "The article doesn't exist." +msgstr "" + +#: modules/news/controllers/EditController.php:81 +#, fuzzy +msgid "The article has been saved." +msgstr "De historische logs zijn verwijderd" + +#: modules/news/controllers/EditController.php:93 +#, fuzzy +msgid "The article has been deleted." +msgstr "De historische logs zijn verwijderd" + +#: modules/install/forms/Install.php:18 +#, fuzzy +msgid "Hostname" +msgstr "Home" + +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "" + +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "" + +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "" + +#: modules/install/forms/Install.php:40 +#, fuzzy +msgid "Database password" +msgstr "Vul wachtwoord in:" + +#: modules/install/forms/Install.php:44 +#, fuzzy +msgid "Support E-mail" +msgstr "E-mail" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "" + +#: modules/install/controllers/UpgradeController.php:80 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "" + +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "" + +#: modules/install/controllers/UpgradeController.php:117 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "" + +#: modules/install/controllers/UpgradeController.php:159 +#, fuzzy +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "Corrigeer de volgende problemen voordat je verder gaat:" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:234 +#, php-format +msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." +msgstr "De directory waar Community-ID geinstalleerd is moet schrijfbaar zijn voor de web server user (%s). Een andere mogelijkheid is om een LEEG config.php dat schrijfbaar is voor aan te maken." + +#: modules/install/controllers/CredentialsController.php:237 +#, php-format +msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" +msgstr "De directory \"captchas\" onder de web directory voor Community-ID moet schrijfbaar zijn voor de web server user (%s)" + +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "" + +#: javascript/language.php:30 +msgid "Name" +msgstr "Naam" + +#: javascript/language.php:31 +msgid "Registration" +msgstr "Registratie" + +#: javascript/language.php:32 +msgid "Status" +msgstr "Status" + +#: javascript/language.php:33 +msgid "profile" +msgstr "profiel" + +#: javascript/language.php:34 +msgid "delete" +msgstr "verwijder" + +#: javascript/language.php:35 +msgid "Site" +msgstr "Site" + +#: javascript/language.php:36 +msgid "view info exchanged" +msgstr "bekijk uitgewisselde informatie" + +#: javascript/language.php:37 +msgid "deny" +msgstr "weiger" + +#: javascript/language.php:38 +msgid "allow" +msgstr "sta toe" + +#: javascript/language.php:39 +msgid "Are you sure you wish to send this message to ALL users?" +msgstr "Weet je zeker dat je dit bericht aan ALLE gebruikers wilt verzenden?" + +#: javascript/language.php:40 +msgid "Are you sure you wish to deny trust to this site?" +msgstr "Weet je zeker dat je geen vertrouwen aan deze site wilt toekennen?" + +#: javascript/language.php:41 +msgid "operation failed" +msgstr "handeling mislukt" + +#: javascript/language.php:42 +msgid "Trust to the following site has been granted:" +msgstr "Vertrouwen is aan de volgende site toegekend:" + +#: javascript/language.php:43 +msgid "Trust the following site has been denied:" +msgstr "Vertrouwen is niet toegekend aan de volgende site:" + +#: javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "ERROR. De server meldt:" + +#: javascript/language.php:45 +msgid "Your relationship with the following site has been deleted:" +msgstr "Je relatie met de volgende site is verwijderd:" + +#: javascript/language.php:46 +msgid "The history log has been cleared" +msgstr "De historische logs zijn verwijderd" + +#: javascript/language.php:47 +msgid "Are you sure you wish to allow access to this site?" +msgstr "Weet je zeker dat je toegang wilt geven aan deze site?" + +#: javascript/language.php:48 +msgid "Are you sure you wish to delete your relationship with this site?" +msgstr "Weet je zeker dat je de relatie met deze site wilt verwijderen?" + +#: javascript/language.php:49 +msgid "Are you sure you wish to delete all the History Log?" +msgstr "Weet je zeker dat je alle historische logs wilt verwijderen?" + +#: javascript/language.php:50 +msgid "Are you sure you wish to delete the user" +msgstr "Weet je zeker dat je de gebruiker wilt verwijderen" + +#: javascript/language.php:51 +msgid "Are you sure you wish to delete all the unconfirmed accounts?" +msgstr "Weet je zeker dat je alle onbevestigde accounts wilt verwijderen?" + +#: javascript/language.php:52 +msgid "Date" +msgstr "Datum" + +#: javascript/language.php:53 +msgid "Result" +msgstr "Resultaat" + +#: javascript/language.php:54 +msgid "No records found." +msgstr "Geen resultaten gevonden." + +#: javascript/language.php:55 +msgid "Loading..." +msgstr "Laden..." + +#: javascript/language.php:56 +msgid "Data error." +msgstr "Data error." + +#: javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "Klik om oplopend te sorteren" + +#: javascript/language.php:58 +msgid "Click to sort descending" +msgstr "Klik om aflopend te sorteren" + +#: javascript/language.php:59 +msgid "Authorized" +msgstr "Toegestaan" + +#: javascript/language.php:60 +msgid "Denied" +msgstr "Geweigerd" + +#: javascript/language.php:61 +msgid "of" +msgstr "of" + +#: javascript/language.php:62 +msgid "next" +msgstr "volgende" + +#: javascript/language.php:63 +msgid "prev" +msgstr "vorige" + +#: javascript/language.php:64 +msgid "IP" +msgstr "IP" + +#: javascript/language.php:65 +msgid "Delete unconfirmed accounts older than how many days?" +msgstr "" + +#: javascript/language.php:66 +msgid "The value entered is incorrect" +msgstr "" + +#: javascript/language.php:67 +msgid "Send reminder to accounts older than how many days?" +msgstr "" + +#: javascript/language.php:68 +#, fuzzy +msgid "Are you sure you wish to delete this article?" +msgstr "Weet je zeker dat je de gebruiker wilt verwijderen" + +#: javascript/language.php:69 +#, fuzzy +msgid "reminder" +msgstr "Geslacht" + +#: javascript/language.php:70 +#, fuzzy +msgid "reminders" +msgstr "Geslacht" + +#: javascript/language.php:71 +#, fuzzy +msgid "Are you sure you wish to delete this profile?" +msgstr "Weet je zeker dat je de gebruiker wilt verwijderen" + +#: libs/Monkeys/Form/Element/Timezone.php:47 +msgid "-- Select a Timezone --" +msgstr "" + +#: libs/Monkeys/Form/Element/Country.php:35 +msgid "-- Select a Country --" +msgstr "" + +#: libs/Monkeys/Form/Element/Language.php:35 +msgid "-- Select a Language --" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 +msgid "January" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "February" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "March" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +#, fuzzy +msgid "April" +msgstr "profiel" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "May" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "June" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "July" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "August" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +#, fuzzy +msgid "Septembre" +msgstr "Onthoud mij" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "October" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "November" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +#, fuzzy +msgid "December" +msgstr "Onthoud mij" + +#: plugins/stats/Authorizations.php:21 +msgid "Authorizations per day" +msgstr "Autorisaties per dag" + +#: plugins/stats/Sites.php:21 +msgid "Trusted Sites" +msgstr "vertrouwde sites" + +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "Vertrouwde sites" + +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "Sites per gebruiker" + +#: plugins/stats/Top.php:21 +msgid "Top 10 Trusted Sites" +msgstr "Top 10 vertrouwde sites" + +#: plugins/stats/Registrations.php:21 +msgid "Registrations per day" +msgstr "Registraties per dag" + +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Sla op" + +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:42 +#, fuzzy +msgid "Enable" +msgstr "Man" + +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "" + +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Registratieformulier" + +#: modules/users/views/scripts/register/index.phtml:10 +#: modules/users/views/scripts/recoverpassword/index.phtml:4 +msgid "Send" +msgstr "Verstuur" + +#: modules/users/views/scripts/register/eula.phtml:1 +#, fuzzy +msgid "Please read the following EULA in order to continue" +msgstr "Corrigeer de volgende problemen voordat je verder gaat:" + +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "" + +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "Hallo, %s" + +#: modules/users/views/scripts/login/index.phtml:7 +msgid "Account" +msgstr "Account" + +#: modules/users/views/scripts/login/index.phtml:11 +msgid "Personal Info" +msgstr "Persoonlijke informatie" + +#: modules/users/views/scripts/login/index.phtml:17 +msgid "Sites database" +msgstr "Sites database" + +#: modules/users/views/scripts/login/index.phtml:20 +msgid "History Log" +msgstr "Historisch logs" + +#: modules/users/views/scripts/login/index.phtml:24 +msgid "Logout" +msgstr "Uitloggen" + +#: modules/users/views/scripts/login/index.phtml:29 +msgid "Admin options" +msgstr "Beheer options" + +#: modules/users/views/scripts/login/index.phtml:32 +msgid "Manage Users" +msgstr "Beheer gebruikers" + +#: modules/users/views/scripts/login/index.phtml:35 +msgid "Message Users" +msgstr "Stuur bericht aan gebruikers" + +#: modules/users/views/scripts/login/index.phtml:39 +msgid "Disable Maintenance Mode" +msgstr "Schakel onderhoudsmodus uit" + +#: modules/users/views/scripts/login/index.phtml:41 +msgid "Enable Maintenance Mode" +msgstr "Schakel onderhoudsmodus in" + +#: modules/users/views/scripts/login/index.phtml:45 +msgid "Statistics" +msgstr "Statistieken" + +#: modules/users/views/scripts/login/index.phtml:48 +msgid "About Community-ID" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:55 +msgid "User access is currently disabled for system maintenance.
Please try again later" +msgstr "Gebruikerstoegang is momenteel niet mogelijk in verband met onderhoud.
Probeer het later opnieuw" + +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:82 +msgid "Remember me" +msgstr "Onthoud mij" + +#: modules/users/views/scripts/login/index.phtml:85 +msgid "Log in" +msgstr "Log in" + +#: modules/users/views/scripts/login/index.phtml:91 +#, fuzzy +msgid "Forgot your password?" +msgstr "Wachtwoord vergeten?" + +#: modules/users/views/scripts/login/index.phtml:98 +msgid "You don't have an account?" +msgstr "Je hebt geen account?" + +#: modules/users/views/scripts/login/index.phtml:100 +msgid "REGISTER NOW!" +msgstr "REGISTREER NU!" + +#: modules/users/views/scripts/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "Vul hieronder je E-mail adres in om een link te ontvangen voor het resetten van je wachtwoord" + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "Enter search string" +msgstr "" + +#: modules/users/views/scripts/manageusers/index.phtml:12 +msgid "Go" +msgstr "" + +#: modules/users/views/scripts/manageusers/index.phtml:13 +msgid "Clear" +msgstr "" + +#: modules/users/views/scripts/manageusers/index.phtml:16 +msgid "All" +msgstr "Allen" + +#: modules/users/views/scripts/manageusers/index.phtml:19 +msgid "Confirmed" +msgstr "Bevestigd" + +#: modules/users/views/scripts/manageusers/index.phtml:22 +msgid "Unconfirmed" +msgstr "Onbevestigd" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Total users:" +msgstr "Totaal aantal gebruikers:" + +#: modules/users/views/scripts/manageusers/index.phtml:30 +msgid "Total confirmed users:" +msgstr "Totaal aantal bevestigde gebruikers:" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Total unconfirmed users:" +msgstr "Totaal aantal onbevestigde gebruikers:" + +#: modules/users/views/scripts/manageusers/index.phtml:34 +msgid "Add User" +msgstr "Voeg gebruiker toe" + +#: modules/users/views/scripts/manageusers/index.phtml:36 +msgid "Delete Unconfirmed Users" +msgstr "Verwijder onbevestigde gebruikers" + +#: modules/users/views/scripts/manageusers/index.phtml:39 +msgid "Send Reminder" +msgstr "" + +#: modules/users/views/scripts/personalinfo/edit.phtml:6 +msgid "Cancel" +msgstr "Cancel" + +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "Deze informatie zal gebruikt worden om automatisch registratievelden te vullen wanneer een OpenID transactie dat vereist" + +#: modules/users/views/scripts/personalinfo/index.phtml:23 +#, fuzzy +msgid "Edit profile" +msgstr "profiel" + +#: modules/users/views/scripts/personalinfo/index.phtml:29 +#, fuzzy +msgid "Delete profile" +msgstr "Verwijder account" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 +msgid "Not Entered" +msgstr "Niet ingevuld" + +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "Open ID" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 +msgid "Why do you want to delete your Community-ID account?" +msgstr "Waarom wil jij je Community-ID account verwijderen?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "Selecteer wat van toepassing is:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "Dit was alleen een test account" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "Ik heb een betere service gevonden" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "Aan de service ontbreekt functionaliteit waar ik niet buiten kan" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "Geen specifieke reden" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +msgid "Additional comments:" +msgstr "Aanvullende reakties:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +#: modules/users/views/scripts/profile/index.phtml:44 +msgid "Delete Account" +msgstr "Verwijder account" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Account informatie" + +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "Bewerk" + +#: modules/users/views/scripts/profile/index.phtml:24 +msgid "Change Password" +msgstr "Wijzig wachtwoord" + +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-es.phtml:37 +msgid "There are no news articles yet" +msgstr "" + +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-es.phtml:44 +msgid "View All" +msgstr "" + +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-es.phtml:48 +msgid "Add New Article" +msgstr "" + +#: modules/default/views/scripts/feedback/index.phtml:1 +msgid "In order to serve you better, we have provided the form below for your questions and comments" +msgstr "Om je beter van dienst te kunnen zijn bieden wij je via onderstaand formulier de mogelijkheid om je vragen en opmerkingen kenbaar te maken" + +#: modules/default/views/scripts/identity/id.phtml:2 +msgid "This is the identity page for the Community-ID user identified with:" +msgstr "" + +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "Dit bericht zal aan alle geregistreerde Community-ID gebruikers vezonden worden" + +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "Schakel over naar platte tekst" + +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "Schakel over naar HTML" + +#: modules/default/views/scripts/openid/trust.phtml:3 +#, php-format +msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." +msgstr "Een site die zich identificeert als %s heeft gevraagd te bevestigen dat %s jouw identity URL is." + +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "De site vroeg ook om de volgende extra informatie over jou:" + +#: modules/default/views/scripts/openid/trust.phtml:10 +#, fuzzy +msgid "Fields are automatically filled according to the personal info stored in your community-id account." +msgstr "(Velden worden automatisch gevuld op basis van de persoonlijke informatie die is opgeslagen in jouw community-id account)" + +#: modules/default/views/scripts/openid/trust.phtml:11 +#, fuzzy +msgid "Fields marked with * are required." +msgstr "(velden met een (*) zijn verplicht)" + +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "" + +#: modules/default/views/scripts/openid/trust.phtml:23 +msgid "Forever" +msgstr "Altijd" + +#: modules/default/views/scripts/openid/trust.phtml:26 +msgid "Allow" +msgstr "Sta toe" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Deny" +msgstr "Weiger" + +#: modules/default/views/scripts/openid/login.phtml:26 +msgid "Login" +msgstr "Log in" + +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "" + +#: modules/default/views/scripts/profile/index.phtml:20 +#, fuzzy, php-format +msgid "The privacy policy can be found at %s" +msgstr "De privacy policy is te vinden op %s" + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Verwijder geschiedenis" + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Uitgewisselde informatie" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Information uitgewisseld met:" + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "OK" + +#: modules/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "" + +#: modules/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +#, fuzzy +msgid "Next" +msgstr "volgende" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "Laatste Nieuws" + +#: modules/news/views/scripts/index/index.phtml:16 +#: modules/news/views/scripts/view/index.phtml:3 +#, php-format +msgid "Published on %s" +msgstr "" + +#: modules/news/views/scripts/index/index.phtml:21 +#, fuzzy +msgid "read more" +msgstr "Lees verder" + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "" + +#: modules/news/views/scripts/view/index.phtml:7 +#, fuzzy +msgid "Delete Article" +msgstr "Verwijder account" + +#: modules/install/views/scripts/index/index.phtml:2 +msgid "This Community-ID instance hasn't been installed yet" +msgstr "Deze Community-ID instantie is nog niet geinstalleerd" + +#: modules/install/views/scripts/index/index.phtml:5 +msgid "Proceed with installation" +msgstr "Ga verder met de installatie" + +#: modules/install/views/scripts/credentials/index.phtml:3 +msgid "Database and E-mail information" +msgstr "Database en E-mail informatie" + +#: modules/install/views/scripts/credentials/index.phtml:13 +msgid "Administrator User Information" +msgstr "" + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "Corrigeer de volgende problemen voordat je verder gaat:" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "Controleer nogmaals" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "De installatie is succesvol uitgevoerd" + +#: modules/install/views/scripts/complete/index.phtml:6 +msgid "You can login as the administrator with the username and password you just provided." +msgstr "" + +#: modules/install/views/scripts/complete/index.phtml:7 +msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." +msgstr "" + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "Afmaken" + +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "" + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "" + +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 +msgid "Home" +msgstr "Home" + +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 +msgid "Feedback" +msgstr "Feedback" + +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 +msgid "Your OpenID is:" +msgstr "" + +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 +msgid "Maintenance mode is enabled: user access is restricted" +msgstr "Onderhoudsmodus is actief: gebruikerstoegang is beperkt" + +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "Help en Support" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "Privacy" + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "Over ons" + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "Neem contact op" + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "Selecteer weergave" + +#: plugins/stats/Sites.phtml:4 +msgid "Last Week" +msgstr "Vorige week" + +#: plugins/stats/Sites.phtml:5 +msgid "Last Year" +msgstr "Vorig jaar" + +#: plugins/stats/Top.phtml:6 +#, php-format +msgid "%s users" +msgstr "%s gebruikers" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "Vorige maand" + +#~ msgid "Forgot you password?" +#~ msgstr "Wachtwoord vergeten?" +#~ msgid "Privacy Policy" +#~ msgstr "Privacy Policy" +#~ msgid "Body:" +#~ msgstr "Inhoud:" +#~ msgid "OPEN AN ACCOUNT NOW" +#~ msgstr "MAAK NU EEN ACCOUNT AAN" +#~ msgid "Username:" +#~ msgstr "Gebruikersnaam:" +#~ msgid "E-mail:" +#~ msgstr "E-mail:" +#~ msgid "" +#~ "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" +#~ msgstr "" +#~ "Heb je er genoeg van om
gebruikersnamen en wachtwoorden
voor " +#~ "je favoriete websites te moeten onthouden?" +#~ msgid "Starting today
you'll only have to remember one" +#~ msgstr "Vanaf vandaag
hoef je er nog maar één te onthouden" +#~ msgid "LOGIN" +#~ msgstr "LOGIN" +#~ msgid "LOG IN" +#~ msgstr "LOG IN" + diff --git a/languages/nl/lang.mo b/languages/nl/lang.mo deleted file mode 100644 index 027d55a..0000000 Binary files a/languages/nl/lang.mo and /dev/null differ diff --git a/languages/nl/lang.po b/languages/nl/lang.po deleted file mode 100644 index 4810e98..0000000 --- a/languages/nl/lang.po +++ /dev/null @@ -1,722 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Community-ID English translation\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-05-08 23:26+0100\n" -"PO-Revision-Date: 2009-05-08 23:26+0100\n" -"Last-Translator: Stanley Westerveld \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: English\n" -"X-Poedit-KeywordsList: translate\n" -"X-Poedit-Basepath: ../../\n" -"X-Poedit-SearchPath-0: modules\n" -"X-Poedit-SearchPath-1: views\n" -"X-Poedit-SearchPath-2: webdir/javascript\n" - -#: modules/default/controllers/IndexController.php:27 -msgid "Could not retrieve news items" -msgstr "Kon geen nieuws items ophalen" - -#: modules/default/controllers/IndexController.php:42 -msgid "Read More" -msgstr "Lees verder" - -#: modules/default/controllers/MessageusersController.php:46 -msgid "CC field must be a comma-separated list of valid E-mails" -msgstr "Het CC veld moet een door komma's gescheiden lijst van geldige E-mail adressen zijn" - -#: modules/default/forms/ErrorMessages.php:20 -msgid "Value is empty, but a non-empty value is required" -msgstr "Waarde is leeg, deze mag niet leeg zijn" - -#: modules/default/forms/ErrorMessages.php:21 -msgid "'%value%' is not a valid email address in the basic format local-part@hostname" -msgstr "'%value%' is geen valide E-mail adres in het formaat local-part@hostname" - -#: modules/default/forms/ErrorMessages.php:22 -msgid "Captcha value is wrong" -msgstr "De Captcha inhoud is onjuist" - -#: modules/default/forms/ErrorMessages.php:23 -msgid "Password confirmation does not match" -msgstr "Wachtwoord bevestiging komt niet overeen" - -#: modules/default/forms/FeedbackForm.php:25 -msgid "Enter your name" -msgstr "Vul je naam in:" - -#: modules/default/forms/FeedbackForm.php:30 -msgid "Enter your E-mail" -msgstr "Vul je E-mail adres in:" - -#: modules/default/forms/FeedbackForm.php:37 -msgid "Enter your questions or comments" -msgstr "Vul je vragen of reaktie in:" - -#: modules/default/forms/FeedbackForm.php:44 -msgid "Please enter the text below" -msgstr "Vul onderstaande tekst in:" - -#: modules/default/forms/MessageUsersForm.php:17 -msgid "Subject:" -msgstr "Onderwerp:" - -#: modules/default/forms/MessageUsersForm.php:22 -msgid "CC:" -msgstr "CC:" - -#: modules/default/forms/MessageUsersForm.php:26 -msgid "Body:" -msgstr "Inhoud:" - -#: modules/default/forms/OpenidLoginForm.php:17 -msgid "Username" -msgstr "Gebruikersnaam" - -#: modules/default/forms/OpenidLoginForm.php:22 -msgid "Password" -msgstr "Wachtwoord" - -#: modules/default/models/Field.php:39 -msgid "Male" -msgstr "Man" - -#: modules/default/models/Field.php:40 -msgid "Female" -msgstr "Vrouw" - -#: modules/default/models/Fields.php:32 -msgid "Nickname" -msgstr "Nickname" - -#: modules/default/models/Fields.php:33 -msgid "E-mail" -msgstr "E-mail" - -#: modules/default/models/Fields.php:34 -msgid "Full Name" -msgstr "Volledige naam" - -#: modules/default/models/Fields.php:35 -msgid "Date of Birth" -msgstr "Geboortedatum" - -#: modules/default/models/Fields.php:36 -msgid "Gender" -msgstr "Geslacht" - -#: modules/default/models/Fields.php:37 -msgid "Postal Code" -msgstr "Postcode" - -#: modules/default/models/Fields.php:38 -msgid "Country" -msgstr "Land" - -#: modules/default/models/Fields.php:39 -msgid "Language" -msgstr "Taal" - -#: modules/default/models/Fields.php:40 -msgid "Time Zone" -msgstr "Tijdzone" - -#: modules/install/controllers/CredentialsController.php:185 -#, php-format -msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." -msgstr "De directory waar Community-ID geinstalleerd is moet schrijfbaar zijn voor de web server user (%s). Een andere mogelijkheid is om een LEEG config.php dat schrijfbaar is voor (%s) aan te maken." - -#: modules/install/controllers/CredentialsController.php:188 -#, php-format -msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" -msgstr "De directory \"captchas\" onder de web directory voor Community-ID moet schrijfbaar zijn voor de web server user (%s)" - -#: modules/stats/controllers/SitesController.php:68 -msgid "Trusted sites" -msgstr "Vertrouwde sites" - -#: modules/stats/controllers/SitesController.php:75 -msgid "Sites per user" -msgstr "Sites per gebruiker" - -#: modules/users/controllers/ManageusersController.php:25 -msgid "User has been deleted successfully" -msgstr "Gebruiker is succesvol verwijderd" - -#: modules/users/controllers/ProfilegeneralController.php:76 -#: modules/users/controllers/RegisterController.php:59 -msgid "This username is already in use" -msgstr "Deze gebruikersnaam is in gebruik" - -#: modules/users/controllers/ProfilegeneralController.php:85 -#: modules/users/controllers/RegisterController.php:66 -msgid "This E-mail is already in use" -msgstr "Dit E-mail adres is in gebruik" - -#: modules/users/controllers/ProfilegeneralController.php:243 -msgid "Your acccount has been successfully deleted" -msgstr "Je account is succesvol verwijderd" - -#: modules/users/controllers/RegisterController.php:26 -msgid "Sorry, registrations are currently disabled" -msgstr "Sorry, registratie is momenteel niet mogelijk" - -#: modules/users/controllers/UserslistController.php:50 -msgid "admin" -msgstr "admin" - -#: modules/users/controllers/UserslistController.php:52 -msgid "confirmed" -msgstr "bevestigd" - -#: modules/users/controllers/UserslistController.php:54 -msgid "unconfirmed" -msgstr "onbevestigd" - -#: modules/users/forms/AccountInfoForm.php:30 -msgid "First Name" -msgstr "Voornaam:" - -#: modules/users/forms/AccountInfoForm.php:35 -msgid "Last Name" -msgstr "Achternaam:" - -#: modules/users/forms/AccountInfoForm.php:50 -#: modules/users/forms/ChangePasswordForm.php:18 -msgid "Enter password" -msgstr "Vul wachtwoord in:" - -#: modules/users/forms/AccountInfoForm.php:56 -#: modules/users/forms/ChangePasswordForm.php:24 -msgid "Enter password again" -msgstr "Vul wachtwoord nogmaals in:" - -#: modules/users/forms/LoginForm.php:8 -msgid "USERNAME" -msgstr "GEBRUIKERSNAAM" - -#: modules/users/forms/LoginForm.php:13 -msgid "PASSWORD" -msgstr "WACHTWOORD" - -#: modules/users/forms/RegisterForm.php:48 -msgid "Enter desired password" -msgstr "Vul gewenste wachtwoord in:" - -#: webdir/javascript/language.php:30 -msgid "Name" -msgstr "Naam" - -#: webdir/javascript/language.php:31 -msgid "Registration" -msgstr "Registratie" - -#: webdir/javascript/language.php:32 -msgid "Status" -msgstr "Status" - -#: webdir/javascript/language.php:33 -msgid "profile" -msgstr "profiel" - -#: webdir/javascript/language.php:34 -msgid "delete" -msgstr "verwijder" - -#: webdir/javascript/language.php:35 -msgid "Site" -msgstr "Site" - -#: webdir/javascript/language.php:36 -msgid "view info exchanged" -msgstr "bekijk uitgewisselde informatie" - -#: webdir/javascript/language.php:37 -msgid "deny" -msgstr "weiger" - -#: webdir/javascript/language.php:38 -msgid "allow" -msgstr "sta toe" - -#: webdir/javascript/language.php:39 -msgid "Are you sure you wish to send this message to ALL users?" -msgstr "Weet je zeker dat je dit bericht aan ALLE gebruikers wilt verzenden?" - -#: webdir/javascript/language.php:40 -msgid "Are you sure you wish to deny trust to this site?" -msgstr "Weet je zeker dat je geen vertrouwen aan deze site wilt toekennen?" - -#: webdir/javascript/language.php:41 -msgid "operation failed" -msgstr "handeling mislukt" - -#: webdir/javascript/language.php:42 -msgid "Trust to the following site has been granted:" -msgstr "Vertrouwen is aan de volgende site toegekend:" - -#: webdir/javascript/language.php:43 -msgid "Trust the following site has been denied:" -msgstr "Vertrouwen is niet toegekend aan de volgende site:" - -#: webdir/javascript/language.php:44 -msgid "ERROR. The server returned:" -msgstr "ERROR. De server meldt:" - -#: webdir/javascript/language.php:45 -msgid "Your relationship with the following site has been deleted:" -msgstr "Je relatie met de volgende site is verwijderd:" - -#: webdir/javascript/language.php:46 -msgid "The history log has been cleared" -msgstr "De historische logs zijn verwijderd" - -#: webdir/javascript/language.php:47 -msgid "Are you sure you wish to allow access to this site?" -msgstr "Weet je zeker dat je toegang wilt geven aan deze site?" - -#: webdir/javascript/language.php:48 -msgid "Are you sure you wish to delete your relationship with this site?" -msgstr "Weet je zeker dat je de relatie met deze site wilt verwijderen?" - -#: webdir/javascript/language.php:49 -msgid "Are you sure you wish to delete all the History Log?" -msgstr "Weet je zeker dat je alle historische logs wilt verwijderen?" - -#: webdir/javascript/language.php:50 -msgid "Are you sure you wish to delete the user" -msgstr "Weet je zeker dat je de gebruiker wilt verwijderen" - -#: webdir/javascript/language.php:51 -msgid "Are you sure you wish to delete all the unconfirmed accounts?" -msgstr "Weet je zeker dat je alle onbevestigde accounts wilt verwijderen?" - -#: webdir/javascript/language.php:52 -msgid "Date" -msgstr "Datum" - -#: webdir/javascript/language.php:53 -msgid "Result" -msgstr "Resultaat" - -#: webdir/javascript/language.php:54 -msgid "No records found." -msgstr "Geen resultaten gevonden." - -#: webdir/javascript/language.php:55 -msgid "Loading..." -msgstr "Laden..." - -#: webdir/javascript/language.php:56 -msgid "Data error." -msgstr "Data error." - -#: webdir/javascript/language.php:57 -msgid "Click to sort ascending" -msgstr "Klik om oplopend te sorteren" - -#: webdir/javascript/language.php:58 -msgid "Click to sort descending" -msgstr "Klik om aflopend te sorteren" - -#: webdir/javascript/language.php:59 -msgid "Authorized" -msgstr "Toegestaan" - -#: webdir/javascript/language.php:60 -msgid "Denied" -msgstr "Geweigerd" - -#: webdir/javascript/language.php:61 -msgid "of" -msgstr "of" - -#: webdir/javascript/language.php:62 -msgid "next" -msgstr "volgende" - -#: webdir/javascript/language.php:63 -msgid "prev" -msgstr "vorige" - -#: webdir/javascript/language.php:64 -msgid "IP" -msgstr "IP" - -#: modules/default/views/scripts/feedback/index.phtml:1 -msgid "In order to serve you better, we have provided the form below for your questions and comments" -msgstr "Om je beter van dienst te kunnen zijn bieden wij je via onderstaand formulier de mogelijkheid om je vragen en opmerkingen kenbaar te maken" - -#: modules/default/views/scripts/feedback/index.phtml:7 -#: modules/default/views/scripts/messageusers/index.phtml:39 -msgid "Send" -msgstr "Verstuur" - -#: modules/default/views/scripts/history/index.phtml:13 -msgid "Clear History" -msgstr "Verwijder geschiedenis" - -#: modules/default/views/scripts/index/index.phtml:17 -msgid "OPEN AN ACCOUNT NOW" -msgstr "MAAK NU EEN ACCOUNT AAN" - -#: modules/default/views/scripts/index/index.phtml:22 -msgid "Latest News" -msgstr "Laatste Nieuws" - -#: modules/default/views/scripts/messageusers/index.phtml:9 -msgid "This message will be sent to all registered Community-ID users" -msgstr "Dit bericht zal aan alle geregistreerde Community-ID gebruikers vezonden worden" - -#: modules/default/views/scripts/messageusers/index.phtml:18 -msgid "switch to Plain-Text" -msgstr "Schakel over naar platte tekst" - -#: modules/default/views/scripts/messageusers/index.phtml:21 -msgid "switch to Rich-Text (HTML)" -msgstr "Schakel over naar HTML" - -#: modules/default/views/scripts/openid/login.phtml:5 -msgid "Login" -msgstr "Log in" - -#: modules/default/views/scripts/openid/trust.phtml:3 -#, php-format -msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." -msgstr "Een site die zich identificeert als %s heeft gevraagd te bevestigen dat %s jouw identity URL is." - -#: modules/default/views/scripts/openid/trust.phtml:9 -msgid "It also requests this additional information about you:" -msgstr "De site vroeg ook om de volgende extra informatie over jou:" - -#: modules/default/views/scripts/openid/trust.phtml:10 -msgid "(Fields are automatically filled according to the personal info stored in your community-id account)" -msgstr "(Velden worden automatisch gevuld op basis van de persoonlijke informatie die is opgeslagen in jouw community-id account)" - -#: modules/default/views/scripts/openid/trust.phtml:11 -msgid "(fields marked by (*) are required)" -msgstr "(velden met een (*) zijn verplicht)" - -#: modules/default/views/scripts/openid/trust.phtml:18 -#, php-format -msgid "The private policy can be found at %s" -msgstr "De privacy policy is te vinden op %s" - -#: modules/default/views/scripts/openid/trust.phtml:23 -msgid "Forever" -msgstr "Altijd" - -#: modules/default/views/scripts/openid/trust.phtml:26 -msgid "Allow" -msgstr "Sta toe" - -#: modules/default/views/scripts/openid/trust.phtml:27 -msgid "Deny" -msgstr "Weiger" - -#: modules/default/views/scripts/privacy/index.phtml:1 -msgid "Privacy Policy" -msgstr "Privacy Policy" - -#: modules/default/views/scripts/sites/index.phtml:15 -msgid "Information Exchanged" -msgstr "Uitgewisselde informatie" - -#: modules/default/views/scripts/sites/index.phtml:17 -msgid "Information exchanged with:" -msgstr "Information uitgewisseld met:" - -#: modules/default/views/scripts/sites/index.phtml:21 -msgid "OK" -msgstr "OK" - -#: modules/install/views/scripts/complete/index.phtml:2 -msgid "The installation was performed successfully" -msgstr "De installatie is succesvol uitgevoerd" - -#: modules/install/views/scripts/complete/index.phtml:10 -msgid "Finish" -msgstr "Afmaken" - -#: modules/install/views/scripts/credentials/index.phtml:2 -msgid "Database and E-mail information" -msgstr "Database en E-mail informatie" - -#: modules/install/views/scripts/index/index.phtml:2 -msgid "This Community-ID instance hasn't been installed yet" -msgstr "Deze Community-ID instantie is nog niet geinstalleerd" - -#: modules/install/views/scripts/index/index.phtml:5 -msgid "Proceed with installation" -msgstr "Ga verder met de installatie" - -#: modules/install/views/scripts/permissions/index.phtml:2 -msgid "Please correct the following problems before proceeding:" -msgstr "Corrigeer de volgende problemen voordat je verder gaat:" - -#: modules/install/views/scripts/permissions/index.phtml:10 -msgid "Check again" -msgstr "Controleer nogmaals" - -#: modules/stats/views/scripts/authorizations/index.phtml:1 -msgid "Authorizations per day" -msgstr "Autorisaties per dag" - -#: modules/stats/views/scripts/authorizations/index.phtml:3 -#: modules/stats/views/scripts/registrations/index.phtml:3 -#: modules/stats/views/scripts/sites/index.phtml:3 -msgid "Select view" -msgstr "Selecteer weergave" - -#: modules/stats/views/scripts/authorizations/index.phtml:5 -#: modules/stats/views/scripts/registrations/index.phtml:5 -#: modules/stats/views/scripts/sites/index.phtml:5 -msgid "Last Week" -msgstr "Vorige week" - -#: modules/stats/views/scripts/authorizations/index.phtml:6 -#: modules/stats/views/scripts/registrations/index.phtml:7 -#: modules/stats/views/scripts/sites/index.phtml:6 -msgid "Last Year" -msgstr "Vorig jaar" - -#: modules/stats/views/scripts/registrations/index.phtml:1 -msgid "Registrations per day" -msgstr "Registraties per dag" - -#: modules/stats/views/scripts/registrations/index.phtml:6 -msgid "Last Month" -msgstr "Vorige maand" - -#: modules/stats/views/scripts/sites/index.phtml:1 -msgid "Trusted Sites" -msgstr "vertrouwde sites" - -#: modules/stats/views/scripts/top/index.phtml:1 -msgid "Top 10 Trusted Sites" -msgstr "Top 10 vertrouwde sites" - -#: modules/stats/views/scripts/top/index.phtml:7 -#, php-format -msgid "%s users" -msgstr "%s gebruikers" - -#: modules/users/views/scripts/login/index.phtml:3 -#, php-format -msgid "Hello, %s" -msgstr "Hallo, %s" - -#: modules/users/views/scripts/login/index.phtml:7 -msgid "Account" -msgstr "Account" - -#: modules/users/views/scripts/login/index.phtml:10 -msgid "Personal Info" -msgstr "Persoonlijke informatie" - -#: modules/users/views/scripts/login/index.phtml:13 -msgid "Sites database" -msgstr "Sites database" - -#: modules/users/views/scripts/login/index.phtml:16 -msgid "History Log" -msgstr "Historisch logs" - -#: modules/users/views/scripts/login/index.phtml:19 -msgid "Logout" -msgstr "Uitloggen" - -#: modules/users/views/scripts/login/index.phtml:24 -msgid "Admin options" -msgstr "Beheer options" - -#: modules/users/views/scripts/login/index.phtml:27 -msgid "Manage Users" -msgstr "Beheer gebruikers" - -#: modules/users/views/scripts/login/index.phtml:30 -msgid "Message Users" -msgstr "Stuur bericht aan gebruikers" - -#: modules/users/views/scripts/login/index.phtml:34 -msgid "Disable Maintenance Mode" -msgstr "Schakel onderhoudsmodus uit" - -#: modules/users/views/scripts/login/index.phtml:36 -msgid "Enable Maintenance Mode" -msgstr "Schakel onderhoudsmodus in" - -#: modules/users/views/scripts/login/index.phtml:40 -msgid "Statistics" -msgstr "Statistieken" - -#: modules/users/views/scripts/login/index.phtml:47 -msgid "User access is currently disabled for system maintenance.
Please try again later" -msgstr "Gebruikerstoegang is momenteel niet mogelijk in verband met onderhoud.
Probeer het later opnieuw" - -#: modules/users/views/scripts/login/index.phtml:58 -msgid "Remember me" -msgstr "Onthoud mij" - -#: modules/users/views/scripts/login/index.phtml:61 -msgid "Log in" -msgstr "Log in" - -#: modules/users/views/scripts/login/index.phtml:67 -msgid "Forgot you password?" -msgstr "Wachtwoord vergeten?" - -#: modules/users/views/scripts/login/index.phtml:73 -msgid "You don't have an account?" -msgstr "Je hebt geen account?" - -#: modules/users/views/scripts/login/index.phtml:75 -msgid "REGISTER NOW!" -msgstr "REGISTREER NU!" - -#: modules/users/views/scripts/manageusers/index.phtml:11 -msgid "All" -msgstr "Allen" - -#: modules/users/views/scripts/manageusers/index.phtml:14 -msgid "Confirmed" -msgstr "Bevestigd" - -#: modules/users/views/scripts/manageusers/index.phtml:17 -msgid "Unconfirmed" -msgstr "Onbevestigd" - -#: modules/users/views/scripts/manageusers/index.phtml:24 -msgid "Total users:" -msgstr "Totaal aantal gebruikers:" - -#: modules/users/views/scripts/manageusers/index.phtml:25 -msgid "Total confirmed users:" -msgstr "Totaal aantal bevestigde gebruikers:" - -#: modules/users/views/scripts/manageusers/index.phtml:26 -msgid "Total unconfirmed users:" -msgstr "Totaal aantal onbevestigde gebruikers:" - -#: modules/users/views/scripts/manageusers/index.phtml:29 -msgid "Add User" -msgstr "Voeg gebruiker toe" - -#: modules/users/views/scripts/manageusers/index.phtml:31 -msgid "Delete Unconfirmed Users" -msgstr "Verwijder onbevestigde gebruikers" - -#: modules/users/views/scripts/personalinfo/edit.phtml:42 -msgid "Save" -msgstr "Sla op" - -#: modules/users/views/scripts/personalinfo/edit.phtml:43 -msgid "Cancel" -msgstr "Cancel" - -#: modules/users/views/scripts/personalinfo/index.phtml:16 -#: modules/users/views/scripts/profile/index.phtml:17 -msgid "Edit" -msgstr "Bewerk" - -#: modules/users/views/scripts/personalinfo/index.phtml:22 -msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" -msgstr "Deze informatie zal gebruikt worden om automatisch registratievelden te vullen wanneer een OpenID transactie dat vereist" - -#: modules/users/views/scripts/personalinfo/show.phtml:8 -msgid "Not Entered" -msgstr "Niet ingevuld" - -#: modules/users/views/scripts/profile/index.phtml:13 -msgid "Account info" -msgstr "Account informatie" - -#: modules/users/views/scripts/profile/index.phtml:20 -msgid "Change Password" -msgstr "Wijzig wachtwoord" - -#: modules/users/views/scripts/profile/index.phtml:38 -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 -msgid "Delete Account" -msgstr "Verwijder account" - -#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 -msgid "OpenID" -msgstr "Open ID" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 -msgid "Why do you want to delete your Community-ID account?" -msgstr "Waarom wil jij je Community-ID account verwijderen?" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 -msgid "Please check all that apply:" -msgstr "Selecteer wat van toepassing is:" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 -msgid "This was just a test account" -msgstr "Dit was alleen een test account" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 -msgid "I found a better service" -msgstr "Ik heb een betere service gevonden" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 -msgid "Service lacked some key features I needed" -msgstr "Aan de service ontbreekt functionaliteit waar ik niet buiten kan" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 -msgid "No particular reason" -msgstr "Geen specifieke reden" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 -msgid "Additional comments:" -msgstr "Aanvullende reakties:" - -#: modules/users/views/scripts/recoverpassword/index.phtml:1 -msgid "Please enter your E-mail below to receive a link to reset your password" -msgstr "Vul hieronder je E-mail adres in om een link te ontvangen voor het resetten van je wachtwoord" - -#: modules/users/views/scripts/register/index.phtml:1 -msgid "Registration Form" -msgstr "Registratieformulier" - -#: views/layouts/layout.phtml:32 -msgid "Home" -msgstr "Home" - -#: views/layouts/layout.phtml:35 -msgid "Feedback" -msgstr "Feedback" - -#: views/layouts/layout.phtml:52 -msgid "Maintenance mode is enabled: user access is restricted" -msgstr "Onderhoudsmodus is actief: gebruikerstoegang is beperkt" - -#~ msgid "Username:" -#~ msgstr "Gebruikersnaam:" -#~ msgid "E-mail:" -#~ msgstr "E-mail:" -#~ msgid "" -#~ "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" -#~ msgstr "" -#~ "Heb je er genoeg van om
gebruikersnamen en wachtwoorden
voor " -#~ "je favoriete websites te moeten onthouden?" -#~ msgid "Starting today
you'll only have to remember one" -#~ msgstr "Vanaf vandaag
hoef je er nog maar één te onthouden" -#~ msgid "Help and Support" -#~ msgstr "Help en Support" -#~ msgid "Privacy" -#~ msgstr "Privacy" -#~ msgid "About Us" -#~ msgstr "Over ons" -#~ msgid "Contact Us" -#~ msgstr "Neem contact op" -#~ msgid "LOGIN" -#~ msgstr "LOGIN" -#~ msgid "LOG IN" -#~ msgstr "LOG IN" - diff --git a/languages/pl/LC_MESSAGES/lang.mo b/languages/pl/LC_MESSAGES/lang.mo new file mode 100644 index 0000000..2730750 Binary files /dev/null and b/languages/pl/LC_MESSAGES/lang.mo differ diff --git a/languages/pl/LC_MESSAGES/lang.po b/languages/pl/LC_MESSAGES/lang.po new file mode 100644 index 0000000..ac693c7 --- /dev/null +++ b/languages/pl/LC_MESSAGES/lang.po @@ -0,0 +1,1346 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID English translation\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-26 11:34-0500\n" +"PO-Revision-Date: 2010-05-26 11:34-0500\n" +"Last-Translator: Keyboard Monkeys \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: English\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-Basepath: ../../../\n" +"X-Poedit-SearchPath-0: modules\n" +"X-Poedit-SearchPath-1: views\n" +"X-Poedit-SearchPath-2: javascript\n" +"X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" + +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "" + +#: modules/users/forms/AccountInfo.php:26 +#: modules/users/forms/Register.php:45 +msgid "Username" +msgstr "Login" + +#: modules/users/forms/AccountInfo.php:32 +#: modules/users/forms/Register.php:28 +msgid "First Name" +msgstr "ImiÄ™" + +#: modules/users/forms/AccountInfo.php:37 +#: modules/users/forms/Register.php:33 +msgid "Last Name" +msgstr "Nazwisko" + +#: modules/users/forms/AccountInfo.php:42 +#: modules/users/forms/Register.php:38 +msgid "E-mail" +msgstr "E-mail" + +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "" + +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" +msgstr "" + +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 +msgid "Enter password" +msgstr "Wpisz hasÅ‚o" + +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 +msgid "Enter password again" +msgstr "Wpisz hasÅ‚o ponownie" + +#: modules/users/forms/PersonalInfo.php:65 +#, fuzzy +msgid "Profile Name" +msgstr "profil" + +#: modules/users/forms/Login.php:18 +msgid "USERNAME" +msgstr "LOGIN" + +#: modules/users/forms/Login.php:27 +msgid "PASSWORD" +msgstr "HASÅO" + +#: modules/users/forms/Register.php:51 +msgid "Enter desired password" +msgstr "Wpisz hasÅ‚o" + +#: modules/users/forms/Register.php:68 +msgid "Please enter the text below" +msgstr "Wpisz tekst podany poniżej" + +#: modules/users/models/User.php:129 +#, fuzzy +msgid "Default profile" +msgstr "profil" + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "Wybacz, rejestracja jest aktualnie niemożliwa" + +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "Ten login jest już zajÄ™ty" + +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "Ten adres E-mail jest już zajÄ™ty" + +#: modules/users/controllers/RegisterController.php:95 +msgid "Community-ID registration confirmation" +msgstr "" + +#: modules/users/controllers/RegisterController.php:100 +msgid "Thank you." +msgstr "" + +#: modules/users/controllers/RegisterController.php:101 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "" + +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "" + +#: modules/users/controllers/RegisterController.php:106 +msgid "The account was created but the E-mail could not be sent" +msgstr "" + +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 +msgid "Invalid token" +msgstr "" + +#: modules/users/controllers/RegisterController.php:147 +#, fuzzy +msgid "Your account has been deleted" +msgstr "Twoje konto zostaÅ‚o skasowane" + +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 +msgid "Invalid credentials" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:77 +msgid "There was a problem setting the cookie" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:51 +#, fuzzy +msgid "This E-mail is not registered in the system" +msgstr "Ten adres E-mail jest już zajÄ™ty" + +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 +msgid "Community-ID password reset" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:74 +msgid "Password reset E-mail has been sent" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:103 +msgid "You'll receive your new password via E-mail" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:301 +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:315 +msgid "Your acccount has been successfully deleted" +msgstr "Twoje konto zostaÅ‚o skasowane" + +#: modules/users/controllers/UserslistController.php:59 +msgid "admin" +msgstr "admin" + +#: modules/users/controllers/UserslistController.php:61 +msgid "confirmed" +msgstr "potwierdzony" + +#: modules/users/controllers/UserslistController.php:63 +msgid "unconfirmed" +msgstr "niepotwierdzony" + +#: modules/users/controllers/PersonalinfoController.php:87 +#, fuzzy +msgid "Profile has been saved" +msgstr "Historia zostaÅ‚a wyczyszczona" + +#: modules/users/controllers/PersonalinfoController.php:98 +#, fuzzy +msgid "Profile has been deleted" +msgstr "Historia zostaÅ‚a wyczyszczona" + +#: modules/users/controllers/ManageusersController.php:31 +msgid "User has been deleted successfully" +msgstr "Użytkownik zostaÅ‚ skasowany" + +#: modules/users/controllers/ManageusersController.php:48 +msgid "Community-ID registration reminder" +msgstr "" + +#: modules/default/forms/MessageUsers.php:17 +#, fuzzy +msgid "Subject" +msgstr "TytuÅ‚:" + +#: modules/default/forms/MessageUsers.php:22 +#, fuzzy +msgid "CC" +msgstr "CC:" + +#: modules/default/forms/OpenidLogin.php:28 +#, fuzzy +msgid "OpenID URL" +msgstr "Open ID" + +#: modules/default/forms/OpenidLogin.php:35 +msgid "Password" +msgstr "HasÅ‚o" + +#: modules/default/forms/Feedback.php:25 +msgid "Enter your name" +msgstr "Wpisz swoje imiÄ™" + +#: modules/default/forms/Feedback.php:30 +msgid "Enter your E-mail" +msgstr "Wpisz swój E-mail" + +#: modules/default/forms/Feedback.php:37 +msgid "Enter your questions or comments" +msgstr "Wpisz swoje pytania i komentarze" + +#: modules/default/forms/ErrorMessages.php:20 +msgid "Value is empty, but a non-empty value is required" +msgstr "Wartość nie może być niepusta" + +#: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:22 +msgid "'%value%' is not a valid email address in the basic format local-part@hostname" +msgstr "'%value%' nie jest prawidÅ‚owym adresem E-mail" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Captcha value is wrong" +msgstr "Wartość z captcha jest nieprawidÅ‚owa" + +#: modules/default/forms/ErrorMessages.php:28 +msgid "Password confirmation does not match" +msgstr "Potwierdzenie hasÅ‚a nie jest równe hasÅ‚u" + +#: modules/default/forms/ErrorMessages.php:29 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "Mężczyzna" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "Kobieta" + +#: modules/default/models/Fields.php:62 +msgid "Nickname" +msgstr "Ksywka" + +#: modules/default/models/Fields.php:64 +msgid "Full Name" +msgstr "ImiÄ™ i nazwisko" + +#: modules/default/models/Fields.php:65 +msgid "Date of Birth" +msgstr "Data urodzenia" + +#: modules/default/models/Fields.php:66 +msgid "Gender" +msgstr "PÅ‚eć" + +#: modules/default/models/Fields.php:67 +msgid "Postal Code" +msgstr "Kod pocztowy" + +#: modules/default/models/Fields.php:68 +msgid "Country" +msgstr "Kraj" + +#: modules/default/models/Fields.php:69 +msgid "Language" +msgstr "JÄ™zyk" + +#: modules/default/models/Fields.php:70 +msgid "Time Zone" +msgstr "Strefa czasowa" + +#: modules/default/controllers/MessageusersController.php:46 +msgid "CC field must be a comma-separated list of valid E-mails" +msgstr "Pole CC musi być wypeÅ‚nione wartoÅ›ciami oddzielonymi przecinkiem" + +#: modules/default/controllers/MessageusersController.php:86 +#, fuzzy +msgid "Message has been sent" +msgstr "WiadomoÅ›ci dla Użytkowników" + +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "" + +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "" + +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "" + +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "" + +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "" + +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "Nie mogÄ™ wczytać nowych newsów" + +#: modules/default/controllers/CidController.php:47 +msgid "Read More" +msgstr "Czytaj wiÄ™cej" + +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "" + +#: modules/news/forms/Article.php:18 +#, fuzzy +msgid "Title" +msgstr "Strona" + +#: modules/news/forms/Article.php:24 +msgid "Publication date" +msgstr "" + +#: modules/news/forms/Article.php:32 +msgid "Excerpt" +msgstr "" + +#: modules/news/controllers/EditController.php:60 +#: modules/news/controllers/EditController.php:90 +msgid "The article doesn't exist." +msgstr "" + +#: modules/news/controllers/EditController.php:81 +#, fuzzy +msgid "The article has been saved." +msgstr "Historia zostaÅ‚a wyczyszczona" + +#: modules/news/controllers/EditController.php:93 +#, fuzzy +msgid "The article has been deleted." +msgstr "Historia zostaÅ‚a wyczyszczona" + +#: modules/install/forms/Install.php:18 +#, fuzzy +msgid "Hostname" +msgstr "Strona główna" + +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "" + +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "" + +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "" + +#: modules/install/forms/Install.php:40 +#, fuzzy +msgid "Database password" +msgstr "Wpisz hasÅ‚o" + +#: modules/install/forms/Install.php:44 +#, fuzzy +msgid "Support E-mail" +msgstr "E-mail" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "" + +#: modules/install/controllers/UpgradeController.php:80 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "" + +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "" + +#: modules/install/controllers/UpgradeController.php:117 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "" + +#: modules/install/controllers/UpgradeController.php:159 +#, fuzzy +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "Popraw poniższe problemy zanim przejdziesz dalej:" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "" + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:234 +#, php-format +msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." +msgstr "Katalog instalacyjny Community-ID musi być zapisywalny przez użytkownika serwera (%s). InnÄ… możliwoÅ›ciÄ… jest stworzenie pustego pliku config.php który może byż zapisywany przez tego użytkownika." + +#: modules/install/controllers/CredentialsController.php:237 +#, php-format +msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" +msgstr "Katalog \"captchas\" w katalogu webdir musi być zapisywalny przez użytkownika serwera WWW (%s)" + +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "" + +#: javascript/language.php:30 +msgid "Name" +msgstr "ImiÄ™" + +#: javascript/language.php:31 +msgid "Registration" +msgstr "Rejestracja" + +#: javascript/language.php:32 +msgid "Status" +msgstr "Status" + +#: javascript/language.php:33 +msgid "profile" +msgstr "profil" + +#: javascript/language.php:34 +msgid "delete" +msgstr "skasuj" + +#: javascript/language.php:35 +msgid "Site" +msgstr "Strona" + +#: javascript/language.php:36 +msgid "view info exchanged" +msgstr "view info exchanged" + +#: javascript/language.php:37 +msgid "deny" +msgstr "zabroÅ„" + +#: javascript/language.php:38 +msgid "allow" +msgstr "zezwól" + +#: javascript/language.php:39 +msgid "Are you sure you wish to send this message to ALL users?" +msgstr "Czy jesteÅ› pewien, że chcesz wysÅ‚ać tÄ… wiadomość do wszystkich użytkowników?" + +#: javascript/language.php:40 +msgid "Are you sure you wish to deny trust to this site?" +msgstr "Czy jesteÅ› pewien, że chcesz zabronić dostÄ™pu do tej strony?" + +#: javascript/language.php:41 +msgid "operation failed" +msgstr "operacja nie powiodÅ‚a siÄ™" + +#: javascript/language.php:42 +msgid "Trust to the following site has been granted:" +msgstr "ZezwoliÅ‚eÅ› na dostÄ™p do tej strony:" + +#: javascript/language.php:43 +msgid "Trust the following site has been denied:" +msgstr "ZabroniÅ‚eÅ› dostÄ™pu do tej strony:" + +#: javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "BÅÄ„D. Serwer zwróciÅ‚:" + +#: javascript/language.php:45 +msgid "Your relationship with the following site has been deleted:" +msgstr "Twój zwiÄ…zek z poniższÄ… stronÄ… zostaÅ‚ skasowany:" + +#: javascript/language.php:46 +msgid "The history log has been cleared" +msgstr "Historia zostaÅ‚a wyczyszczona" + +#: javascript/language.php:47 +msgid "Are you sure you wish to allow access to this site?" +msgstr "JesteÅ› pewien, że chcesz dać dostep do tej strony?" + +#: javascript/language.php:48 +msgid "Are you sure you wish to delete your relationship with this site?" +msgstr "JesteÅ› pewien, że chcesz skasować zwiÄ…zek z tÄ… stronÄ…?" + +#: javascript/language.php:49 +msgid "Are you sure you wish to delete all the History Log?" +msgstr "JesteÅ› pewien, że chcesz wyczyÅ›cić log historii?" + +#: javascript/language.php:50 +msgid "Are you sure you wish to delete the user" +msgstr "JesteÅ› pewien, że chcesz skasować użytkownika" + +#: javascript/language.php:51 +msgid "Are you sure you wish to delete all the unconfirmed accounts?" +msgstr "Czy jesteÅ› pewien, że chcesz skasować wszystkie nieaktywowane konta?" + +#: javascript/language.php:52 +msgid "Date" +msgstr "Data" + +#: javascript/language.php:53 +msgid "Result" +msgstr "Wynik" + +#: javascript/language.php:54 +msgid "No records found." +msgstr "Brak rekordów." + +#: javascript/language.php:55 +msgid "Loading..." +msgstr "Wczytywanie..." + +#: javascript/language.php:56 +msgid "Data error." +msgstr "BÅ‚Ä…d danych." + +#: javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "Kliknij aby sortować rosnÄ…co" + +#: javascript/language.php:58 +msgid "Click to sort descending" +msgstr "Kliknij aby sortować malejÄ…co" + +#: javascript/language.php:59 +msgid "Authorized" +msgstr "Autoryzowany" + +#: javascript/language.php:60 +msgid "Denied" +msgstr "Zabroniony" + +#: javascript/language.php:61 +msgid "of" +msgstr "z" + +#: javascript/language.php:62 +msgid "next" +msgstr "nastÄ™pny" + +#: javascript/language.php:63 +msgid "prev" +msgstr "poprzedni" + +#: javascript/language.php:64 +msgid "IP" +msgstr "IP" + +#: javascript/language.php:65 +msgid "Delete unconfirmed accounts older than how many days?" +msgstr "" + +#: javascript/language.php:66 +msgid "The value entered is incorrect" +msgstr "" + +#: javascript/language.php:67 +msgid "Send reminder to accounts older than how many days?" +msgstr "" + +#: javascript/language.php:68 +#, fuzzy +msgid "Are you sure you wish to delete this article?" +msgstr "JesteÅ› pewien, że chcesz skasować użytkownika" + +#: javascript/language.php:69 +#, fuzzy +msgid "reminder" +msgstr "PÅ‚eć" + +#: javascript/language.php:70 +#, fuzzy +msgid "reminders" +msgstr "PÅ‚eć" + +#: javascript/language.php:71 +#, fuzzy +msgid "Are you sure you wish to delete this profile?" +msgstr "JesteÅ› pewien, że chcesz skasować użytkownika" + +#: libs/Monkeys/Form/Element/Timezone.php:47 +msgid "-- Select a Timezone --" +msgstr "" + +#: libs/Monkeys/Form/Element/Country.php:35 +msgid "-- Select a Country --" +msgstr "" + +#: libs/Monkeys/Form/Element/Language.php:35 +msgid "-- Select a Language --" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 +msgid "January" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "February" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "March" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +#, fuzzy +msgid "April" +msgstr "profil" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "May" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "June" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "July" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "August" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +#, fuzzy +msgid "Septembre" +msgstr "ZapamiÄ™taj mnie" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "October" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "November" +msgstr "" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +#, fuzzy +msgid "December" +msgstr "ZapamiÄ™taj mnie" + +#: plugins/stats/Authorizations.php:21 +msgid "Authorizations per day" +msgstr "Liczba autoryzacji na dzieÅ„" + +#: plugins/stats/Sites.php:21 +msgid "Trusted Sites" +msgstr "Zaufane strony" + +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "Zaufane strony" + +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "Liczba stron na użytkownika" + +#: plugins/stats/Top.php:21 +msgid "Top 10 Trusted Sites" +msgstr "10 najczęściej zezwalanych stron" + +#: plugins/stats/Registrations.php:21 +msgid "Registrations per day" +msgstr "Liczba rejestracji na dzieÅ„" + +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Zapisz" + +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:42 +#, fuzzy +msgid "Enable" +msgstr "Mężczyzna" + +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "" + +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Formularz rejestracyjny" + +#: modules/users/views/scripts/register/index.phtml:10 +#: modules/users/views/scripts/recoverpassword/index.phtml:4 +msgid "Send" +msgstr "WyÅ›lij" + +#: modules/users/views/scripts/register/eula.phtml:1 +#, fuzzy +msgid "Please read the following EULA in order to continue" +msgstr "Popraw poniższe problemy zanim przejdziesz dalej:" + +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "" + +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "Witaj, %s" + +#: modules/users/views/scripts/login/index.phtml:7 +msgid "Account" +msgstr "Konto" + +#: modules/users/views/scripts/login/index.phtml:11 +msgid "Personal Info" +msgstr "Informacje osobiste" + +#: modules/users/views/scripts/login/index.phtml:17 +msgid "Sites database" +msgstr "Baza stron" + +#: modules/users/views/scripts/login/index.phtml:20 +msgid "History Log" +msgstr "Historia" + +#: modules/users/views/scripts/login/index.phtml:24 +msgid "Logout" +msgstr "Wyloguj" + +#: modules/users/views/scripts/login/index.phtml:29 +msgid "Admin options" +msgstr "Opcje admina" + +#: modules/users/views/scripts/login/index.phtml:32 +msgid "Manage Users" +msgstr "ZarzÄ…dzaj Użytkownikami" + +#: modules/users/views/scripts/login/index.phtml:35 +msgid "Message Users" +msgstr "WiadomoÅ›ci dla Użytkowników" + +#: modules/users/views/scripts/login/index.phtml:39 +msgid "Disable Maintenance Mode" +msgstr "WyÅ‚Ä…cz tryb konserwacji" + +#: modules/users/views/scripts/login/index.phtml:41 +msgid "Enable Maintenance Mode" +msgstr "WÅ‚Ä…cz tryb konserwacji" + +#: modules/users/views/scripts/login/index.phtml:45 +msgid "Statistics" +msgstr "Statystyki" + +#: modules/users/views/scripts/login/index.phtml:48 +msgid "About Community-ID" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:55 +msgid "User access is currently disabled for system maintenance.
Please try again later" +msgstr "Dostęp dla użytkowników jest aktualnie zabroniony, gdyż system jest w trybie konserwacji.
Spróbuj ponownie później." + +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:82 +msgid "Remember me" +msgstr "Zapamiętaj mnie" + +#: modules/users/views/scripts/login/index.phtml:85 +msgid "Log in" +msgstr "Zaloguj" + +#: modules/users/views/scripts/login/index.phtml:91 +#, fuzzy +msgid "Forgot your password?" +msgstr "Zapomniałeś hasła?" + +#: modules/users/views/scripts/login/index.phtml:98 +msgid "You don't have an account?" +msgstr "Nie masz konta?" + +#: modules/users/views/scripts/login/index.phtml:100 +msgid "REGISTER NOW!" +msgstr "ZAREJESTRUJ SIĘ!" + +#: modules/users/views/scripts/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "Wpisz poniżej swój E-mail aby otrzymać link do przypomnienia hasła" + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "Enter search string" +msgstr "" + +#: modules/users/views/scripts/manageusers/index.phtml:12 +msgid "Go" +msgstr "" + +#: modules/users/views/scripts/manageusers/index.phtml:13 +msgid "Clear" +msgstr "" + +#: modules/users/views/scripts/manageusers/index.phtml:16 +msgid "All" +msgstr "Wszystko" + +#: modules/users/views/scripts/manageusers/index.phtml:19 +msgid "Confirmed" +msgstr "Potwierdzone" + +#: modules/users/views/scripts/manageusers/index.phtml:22 +msgid "Unconfirmed" +msgstr "Niepotwierdzone" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Total users:" +msgstr "Liczba użytkowników:" + +#: modules/users/views/scripts/manageusers/index.phtml:30 +msgid "Total confirmed users:" +msgstr "Liczba potwierdzonych użytkowników:" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Total unconfirmed users:" +msgstr "Liczba niepotwierdzonych użytkowników:" + +#: modules/users/views/scripts/manageusers/index.phtml:34 +msgid "Add User" +msgstr "Dodaj użytkownika" + +#: modules/users/views/scripts/manageusers/index.phtml:36 +msgid "Delete Unconfirmed Users" +msgstr "Skasuj nieaktywnych użytkowników" + +#: modules/users/views/scripts/manageusers/index.phtml:39 +msgid "Send Reminder" +msgstr "" + +#: modules/users/views/scripts/personalinfo/edit.phtml:6 +msgid "Cancel" +msgstr "Anuluj" + +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "Te informacje zostaną automatycznie użyte aby wypełnić pola rejestracyjne dla każdego serwera OpenID która tego zarząda" + +#: modules/users/views/scripts/personalinfo/index.phtml:23 +#, fuzzy +msgid "Edit profile" +msgstr "profil" + +#: modules/users/views/scripts/personalinfo/index.phtml:29 +#, fuzzy +msgid "Delete profile" +msgstr "Skasuj konto" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 +msgid "Not Entered" +msgstr "Nie wpisane" + +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +#, fuzzy +msgid "OpenID" +msgstr "Open ID" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 +msgid "Why do you want to delete your Community-ID account?" +msgstr "Czemu chcesz skasować swoje konto?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "Zaznacz wszystkie które pasują:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "To było konto testowe" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "Znalazłem lepszy serwer" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "Brakowało mi niektórych funkcjonalności" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "Bez powodu" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +msgid "Additional comments:" +msgstr "Dodatkowe komentarze:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +#: modules/users/views/scripts/profile/index.phtml:44 +msgid "Delete Account" +msgstr "Skasuj konto" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Informacje o koncie" + +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "Edycja" + +#: modules/users/views/scripts/profile/index.phtml:24 +msgid "Change Password" +msgstr "Zmień hasło" + +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-es.phtml:37 +msgid "There are no news articles yet" +msgstr "" + +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-es.phtml:44 +msgid "View All" +msgstr "" + +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-es.phtml:48 +msgid "Add New Article" +msgstr "" + +#: modules/default/views/scripts/feedback/index.phtml:1 +msgid "In order to serve you better, we have provided the form below for your questions and comments" +msgstr "Aby lepiej świadczyć nasze usługi, udostępniliśmy formularz poniżej na Twoje pytania i komentarze" + +#: modules/default/views/scripts/identity/id.phtml:2 +msgid "This is the identity page for the Community-ID user identified with:" +msgstr "" + +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "Ta wiadomość zostanie wysłana do wszystkich zarejestrowanych użytkowników" + +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "przełącz na Plain-Text" + +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "przełącz na Rich-Text (HTML)" + +#: modules/default/views/scripts/openid/trust.phtml:3 +#, php-format +msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." +msgstr "Strona przedstawiająca się jako %s pyta o potwierdzenie, że %s to Twoj identyfikator URL." + +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "Pyta również o te dodatkowe informacje o Tobie:" + +#: modules/default/views/scripts/openid/trust.phtml:10 +#, fuzzy +msgid "Fields are automatically filled according to the personal info stored in your community-id account." +msgstr "(Pola są automatycznie wypełniane zgodnie z Twoimi danymi zapisanymi na koncie)" + +#: modules/default/views/scripts/openid/trust.phtml:11 +#, fuzzy +msgid "Fields marked with * are required." +msgstr "(pola oznaczone przez (*) są wymagane)" + +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "" + +#: modules/default/views/scripts/openid/trust.phtml:23 +msgid "Forever" +msgstr "Na zawsze" + +#: modules/default/views/scripts/openid/trust.phtml:26 +msgid "Allow" +msgstr "Zezwól" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Deny" +msgstr "Zabroń" + +#: modules/default/views/scripts/openid/login.phtml:26 +msgid "Login" +msgstr "Login" + +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "" + +#: modules/default/views/scripts/profile/index.phtml:20 +#, fuzzy, php-format +msgid "The privacy policy can be found at %s" +msgstr "Polityka prywatności może być znaleziona pod adresem %s" + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Wyczyść Historię" + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Informacje wymienione" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Informacje wymienione z:" + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "OK" + +#: modules/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "" + +#: modules/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +#, fuzzy +msgid "Next" +msgstr "następny" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "Najnowsze wiadomości" + +#: modules/news/views/scripts/index/index.phtml:16 +#: modules/news/views/scripts/view/index.phtml:3 +#, php-format +msgid "Published on %s" +msgstr "" + +#: modules/news/views/scripts/index/index.phtml:21 +#, fuzzy +msgid "read more" +msgstr "Czytaj więcej" + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "" + +#: modules/news/views/scripts/view/index.phtml:7 +#, fuzzy +msgid "Delete Article" +msgstr "Skasuj konto" + +#: modules/install/views/scripts/index/index.phtml:2 +msgid "This Community-ID instance hasn't been installed yet" +msgstr "Ta instalacja Community-ID nie jest jeszcze zakończona" + +#: modules/install/views/scripts/index/index.phtml:5 +msgid "Proceed with installation" +msgstr "Kontynuuj instalację" + +#: modules/install/views/scripts/credentials/index.phtml:3 +msgid "Database and E-mail information" +msgstr "Potwierdzenie bazy danych i E-maila" + +#: modules/install/views/scripts/credentials/index.phtml:13 +msgid "Administrator User Information" +msgstr "" + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "Popraw poniższe problemy zanim przejdziesz dalej:" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "Sprawdź ponownie" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "Instalacja powiodła się" + +#: modules/install/views/scripts/complete/index.phtml:6 +msgid "You can login as the administrator with the username and password you just provided." +msgstr "" + +#: modules/install/views/scripts/complete/index.phtml:7 +msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." +msgstr "" + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "Zakończ" + +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "" + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "" + +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 +msgid "Home" +msgstr "Strona główna" + +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 +msgid "Feedback" +msgstr "Opinie" + +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 +msgid "Your OpenID is:" +msgstr "" + +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 +msgid "Maintenance mode is enabled: user access is restricted" +msgstr "Tryb konserwacji jest włączony: dostęp dla użytkowników jest zabroniony" + +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "Pomoc i wsparcie" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "Prywatność" + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "O nas" + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "Skontaktuj się" + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "Wybierz widok" + +#: plugins/stats/Sites.phtml:4 +msgid "Last Week" +msgstr "Ostatni tydzień" + +#: plugins/stats/Sites.phtml:5 +msgid "Last Year" +msgstr "Ostatni rok" + +#: plugins/stats/Top.phtml:6 +#, php-format +msgid "%s users" +msgstr "%s użytkowników" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "Ostatni miesiąc" + +#~ msgid "Forgot you password?" +#~ msgstr "Zapomniałeś hasła?" +#~ msgid "Privacy Policy" +#~ msgstr "Polityka Prywatności" +#~ msgid "Body:" +#~ msgstr "Treść:" +#~ msgid "OPEN AN ACCOUNT NOW" +#~ msgstr "STWÓRZ SWOJE KONTO TERAZ" +#~ msgid "" +#~ "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" +#~ msgstr "" +#~ "Masz dość przymusu pamiętania tony
loginów i haseł
do Twoich " +#~ "ulubionych stron internetowych?" +#~ msgid "Starting today
you'll only have to remember one" +#~ msgstr "Od dzisiaj
bÄ™dziesz potrzebowaÅ‚ tylko jednego" +#~ msgid "Username:" +#~ msgstr "Username:" +#~ msgid "E-mail:" +#~ msgstr "E-mail:" +#~ msgid "LOGIN" +#~ msgstr "LOGIN" +#~ msgid "LOG IN" +#~ msgstr "LOG IN" + diff --git a/languages/pl/lang.mo b/languages/pl/lang.mo deleted file mode 100644 index ee4bd98..0000000 Binary files a/languages/pl/lang.mo and /dev/null differ diff --git a/languages/pl/lang.po b/languages/pl/lang.po deleted file mode 100644 index a21583b..0000000 --- a/languages/pl/lang.po +++ /dev/null @@ -1,774 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Community-ID English translation\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-05-12 07:57-0500\n" -"PO-Revision-Date: 2009-05-12 20:31+0100\n" -"Last-Translator: Piotr Baranowski \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: English\n" -"X-Poedit-KeywordsList: translate\n" -"X-Poedit-Basepath: ../../\n" -"X-Poedit-SearchPath-0: modules\n" -"X-Poedit-SearchPath-1: views\n" -"X-Poedit-SearchPath-2: webdir/javascript\n" - -#: modules/default/models/Fields.php:32 -msgid "Nickname" -msgstr "Ksywka" - -#: modules/default/models/Fields.php:33 -#: modules/users/forms/AccountInfoForm.php:40 -#: modules/users/forms/RegisterForm.php:36 -#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:20 -msgid "E-mail" -msgstr "E-mail" - -#: modules/default/models/Fields.php:34 -msgid "Full Name" -msgstr "ImiÄ™ i nazwisko" - -#: modules/default/models/Fields.php:35 -msgid "Date of Birth" -msgstr "Data urodzenia" - -#: modules/default/models/Fields.php:36 -msgid "Gender" -msgstr "PÅ‚eć" - -#: modules/default/models/Fields.php:37 -msgid "Postal Code" -msgstr "Kod pocztowy" - -#: modules/default/models/Fields.php:38 -msgid "Country" -msgstr "Kraj" - -#: modules/default/models/Fields.php:39 -msgid "Language" -msgstr "JÄ™zyk" - -#: modules/default/models/Fields.php:40 -msgid "Time Zone" -msgstr "Strefa czasowa" - -#: modules/default/models/Field.php:39 -msgid "Male" -msgstr "Mężczyzna" - -#: modules/default/models/Field.php:40 -msgid "Female" -msgstr "Kobieta" - -#: modules/default/controllers/IndexController.php:27 -msgid "Could not retrieve news items" -msgstr "Nie mogÄ™ wczytać nowych newsów" - -#: modules/default/controllers/IndexController.php:42 -msgid "Read More" -msgstr "Czytaj wiÄ™cej" - -#: modules/default/controllers/MessageusersController.php:46 -msgid "CC field must be a comma-separated list of valid E-mails" -msgstr "Pole CC musi być wypeÅ‚nione wartoÅ›ciami oddzielonymi przecinkiem" - -#: modules/default/forms/OpenidLoginForm.php:17 -#: modules/users/forms/AccountInfoForm.php:26 -#: modules/users/forms/RegisterForm.php:43 -#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:4 -msgid "Username" -msgstr "Login" - -#: modules/default/forms/OpenidLoginForm.php:22 -msgid "Password" -msgstr "HasÅ‚o" - -#: modules/default/forms/MessageUsersForm.php:17 -msgid "Subject:" -msgstr "TytuÅ‚:" - -#: modules/default/forms/MessageUsersForm.php:22 -msgid "CC:" -msgstr "CC:" - -#: modules/default/forms/MessageUsersForm.php:26 -#: modules/default/views/scripts/messageusers/index.phtml:26 -#: modules/default/views/scripts/messageusers/index.phtml:32 -msgid "Body:" -msgstr "Treść:" - -#: modules/default/forms/FeedbackForm.php:25 -msgid "Enter your name" -msgstr "Wpisz swoje imiÄ™" - -#: modules/default/forms/FeedbackForm.php:30 -msgid "Enter your E-mail" -msgstr "Wpisz swój E-mail" - -#: modules/default/forms/FeedbackForm.php:37 -msgid "Enter your questions or comments" -msgstr "Wpisz swoje pytania i komentarze" - -#: modules/default/forms/FeedbackForm.php:44 -#: modules/users/forms/RegisterForm.php:59 -msgid "Please enter the text below" -msgstr "Wpisz tekst podany poniżej" - -#: modules/default/forms/ErrorMessages.php:20 -msgid "Value is empty, but a non-empty value is required" -msgstr "Wartość nie może być niepusta" - -#: modules/default/forms/ErrorMessages.php:21 -msgid "'%value%' is not a valid email address in the basic format local-part@hostname" -msgstr "'%value%' nie jest prawidÅ‚owym adresem E-mail" - -#: modules/default/forms/ErrorMessages.php:22 -msgid "Captcha value is wrong" -msgstr "Wartość z captcha jest nieprawidÅ‚owa" - -#: modules/default/forms/ErrorMessages.php:23 -msgid "Password confirmation does not match" -msgstr "Potwierdzenie hasÅ‚a nie jest równe hasÅ‚u" - -#: modules/stats/controllers/SitesController.php:68 -msgid "Trusted sites" -msgstr "Zaufane strony" - -#: modules/stats/controllers/SitesController.php:75 -msgid "Sites per user" -msgstr "Liczba stron na użytkownika" - -#: modules/install/controllers/CredentialsController.php:185 -#, php-format -msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." -msgstr "Katalog instalacyjny Community-ID musi być zapisywalny przez użytkownika serwera (%s). InnÄ… możliwoÅ›ciÄ… jest stworzenie pustego pliku config.php który może byż zapisywany przez tego użytkownika." - -#: modules/install/controllers/CredentialsController.php:188 -#, php-format -msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" -msgstr "Katalog \"captchas\" w katalogu webdir musi być zapisywalny przez użytkownika serwera WWW (%s)" - -#: modules/users/controllers/UserslistController.php:50 -msgid "admin" -msgstr "admin" - -#: modules/users/controllers/UserslistController.php:52 -msgid "confirmed" -msgstr "potwierdzony" - -#: modules/users/controllers/UserslistController.php:54 -msgid "unconfirmed" -msgstr "niepotwierdzony" - -#: modules/users/controllers/ProfilegeneralController.php:76 -#: modules/users/controllers/RegisterController.php:59 -msgid "This username is already in use" -msgstr "Ten login jest już zajÄ™ty" - -#: modules/users/controllers/ProfilegeneralController.php:85 -#: modules/users/controllers/RegisterController.php:66 -msgid "This E-mail is already in use" -msgstr "Ten adres E-mail jest już zajÄ™ty" - -#: modules/users/controllers/ProfilegeneralController.php:243 -msgid "Your acccount has been successfully deleted" -msgstr "Twoje konto zostaÅ‚o skasowane" - -#: modules/users/controllers/RegisterController.php:26 -msgid "Sorry, registrations are currently disabled" -msgstr "Wybacz, rejestracja jest aktualnie niemożliwa" - -#: modules/users/controllers/ManageusersController.php:25 -msgid "User has been deleted successfully" -msgstr "Użytkownik zostaÅ‚ skasowany" - -#: modules/users/forms/AccountInfoForm.php:30 -#: modules/users/forms/RegisterForm.php:26 -msgid "First Name" -msgstr "ImiÄ™" - -#: modules/users/forms/AccountInfoForm.php:35 -#: modules/users/forms/RegisterForm.php:31 -msgid "Last Name" -msgstr "Nazwisko" - -#: modules/users/forms/AccountInfoForm.php:50 -#: modules/users/forms/ChangePasswordForm.php:18 -msgid "Enter password" -msgstr "Wpisz hasÅ‚o" - -#: modules/users/forms/AccountInfoForm.php:56 -#: modules/users/forms/RegisterForm.php:54 -#: modules/users/forms/ChangePasswordForm.php:24 -msgid "Enter password again" -msgstr "Wpisz hasÅ‚o ponownie" - -#: modules/users/forms/LoginForm.php:8 -msgid "USERNAME" -msgstr "LOGIN" - -#: modules/users/forms/LoginForm.php:13 -msgid "PASSWORD" -msgstr "HASÅO" - -#: modules/users/forms/RegisterForm.php:48 -msgid "Enter desired password" -msgstr "Wpisz hasÅ‚o" - -#: webdir/javascript/language.php:30 -#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:12 -msgid "Name" -msgstr "ImiÄ™" - -#: webdir/javascript/language.php:31 -msgid "Registration" -msgstr "Rejestracja" - -#: webdir/javascript/language.php:32 -msgid "Status" -msgstr "Status" - -#: webdir/javascript/language.php:33 -msgid "profile" -msgstr "profil" - -#: webdir/javascript/language.php:34 -msgid "delete" -msgstr "skasuj" - -#: webdir/javascript/language.php:35 -msgid "Site" -msgstr "Strona" - -#: webdir/javascript/language.php:36 -msgid "view info exchanged" -msgstr "view info exchanged" - -#: webdir/javascript/language.php:37 -msgid "deny" -msgstr "zabroÅ„" - -#: webdir/javascript/language.php:38 -msgid "allow" -msgstr "zezwól" - -#: webdir/javascript/language.php:39 -msgid "Are you sure you wish to send this message to ALL users?" -msgstr "Czy jesteÅ› pewien, że chcesz wysÅ‚ać tÄ… wiadomość do wszystkich użytkowników?" - -#: webdir/javascript/language.php:40 -msgid "Are you sure you wish to deny trust to this site?" -msgstr "Czy jesteÅ› pewien, że chcesz zabronić dostÄ™pu do tej strony?" - -#: webdir/javascript/language.php:41 -msgid "operation failed" -msgstr "operacja nie powiodÅ‚a siÄ™" - -#: webdir/javascript/language.php:42 -msgid "Trust to the following site has been granted:" -msgstr "ZezwoliÅ‚eÅ› na dostÄ™p do tej strony:" - -#: webdir/javascript/language.php:43 -msgid "Trust the following site has been denied:" -msgstr "ZabroniÅ‚eÅ› dostÄ™pu do tej strony:" - -#: webdir/javascript/language.php:44 -msgid "ERROR. The server returned:" -msgstr "BÅÄ„D. Serwer zwróciÅ‚:" - -#: webdir/javascript/language.php:45 -msgid "Your relationship with the following site has been deleted:" -msgstr "Twój zwiÄ…zek z poniższÄ… stronÄ… zostaÅ‚ skasowany:" - -#: webdir/javascript/language.php:46 -msgid "The history log has been cleared" -msgstr "Historia zostaÅ‚a wyczyszczona" - -#: webdir/javascript/language.php:47 -msgid "Are you sure you wish to allow access to this site?" -msgstr "JesteÅ› pewien, że chcesz dać dostep do tej strony?" - -#: webdir/javascript/language.php:48 -msgid "Are you sure you wish to delete your relationship with this site?" -msgstr "JesteÅ› pewien, że chcesz skasować zwiÄ…zek z tÄ… stronÄ…?" - -#: webdir/javascript/language.php:49 -msgid "Are you sure you wish to delete all the History Log?" -msgstr "JesteÅ› pewien, że chcesz wyczyÅ›cić log historii?" - -#: webdir/javascript/language.php:50 -msgid "Are you sure you wish to delete the user" -msgstr "JesteÅ› pewien, że chcesz skasować użytkownika" - -#: webdir/javascript/language.php:51 -msgid "Are you sure you wish to delete all the unconfirmed accounts?" -msgstr "Czy jesteÅ› pewien, że chcesz skasować wszystkie nieaktywowane konta?" - -#: webdir/javascript/language.php:52 -msgid "Date" -msgstr "Data" - -#: webdir/javascript/language.php:53 -msgid "Result" -msgstr "Wynik" - -#: webdir/javascript/language.php:54 -msgid "No records found." -msgstr "Brak rekordów." - -#: webdir/javascript/language.php:55 -msgid "Loading..." -msgstr "Wczytywanie..." - -#: webdir/javascript/language.php:56 -msgid "Data error." -msgstr "BÅ‚Ä…d danych." - -#: webdir/javascript/language.php:57 -msgid "Click to sort ascending" -msgstr "Kliknij aby sortować rosnÄ…co" - -#: webdir/javascript/language.php:58 -msgid "Click to sort descending" -msgstr "Kliknij aby sortować malejÄ…co" - -#: webdir/javascript/language.php:59 -msgid "Authorized" -msgstr "Autoryzowany" - -#: webdir/javascript/language.php:60 -msgid "Denied" -msgstr "Zabroniony" - -#: webdir/javascript/language.php:61 -msgid "of" -msgstr "z" - -#: webdir/javascript/language.php:62 -msgid "next" -msgstr "nastÄ™pny" - -#: webdir/javascript/language.php:63 -msgid "prev" -msgstr "poprzedni" - -#: webdir/javascript/language.php:64 -msgid "IP" -msgstr "IP" - -#: modules/default/views/scripts/privacy/index.phtml:1 -msgid "Privacy Policy" -msgstr "Polityka PrywatnoÅ›ci" - -#: modules/default/views/scripts/messageusers/index.phtml:9 -msgid "This message will be sent to all registered Community-ID users" -msgstr "Ta wiadomość zostanie wysÅ‚ana do wszystkich zarejestrowanych użytkowników" - -#: modules/default/views/scripts/messageusers/index.phtml:18 -msgid "switch to Plain-Text" -msgstr "przeÅ‚Ä…cz na Plain-Text" - -#: modules/default/views/scripts/messageusers/index.phtml:21 -msgid "switch to Rich-Text (HTML)" -msgstr "przeÅ‚Ä…cz na Rich-Text (HTML)" - -#: modules/default/views/scripts/messageusers/index.phtml:39 -#: modules/default/views/scripts/feedback/index.phtml:7 -#: modules/install/views/scripts/credentials/index.phtml:12 -#: modules/users/views/scripts/register/index.phtml:10 -#: modules/users/views/scripts/recoverpassword/index.phtml:4 -msgid "Send" -msgstr "WyÅ›lij" - -#: modules/default/views/scripts/feedback/index.phtml:1 -msgid "In order to serve you better, we have provided the form below for your questions and comments" -msgstr "Aby lepiej Å›wiadczyć nasze usÅ‚ugi, udostÄ™pniliÅ›my formularz poniżej na Twoje pytania i komentarze" - -#: modules/default/views/scripts/openid/trust.phtml:3 -#, php-format -msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." -msgstr "Strona przedstawiajÄ…ca siÄ™ jako %s pyta o potwierdzenie, że %s to Twoj identyfikator URL." - -#: modules/default/views/scripts/openid/trust.phtml:9 -msgid "It also requests this additional information about you:" -msgstr "Pyta również o te dodatkowe informacje o Tobie:" - -#: modules/default/views/scripts/openid/trust.phtml:10 -msgid "(Fields are automatically filled according to the personal info stored in your community-id account)" -msgstr "(Pola sÄ… automatycznie wypeÅ‚niane zgodnie z Twoimi danymi zapisanymi na koncie)" - -#: modules/default/views/scripts/openid/trust.phtml:11 -msgid "(fields marked by (*) are required)" -msgstr "(pola oznaczone przez (*) sÄ… wymagane)" - -#: modules/default/views/scripts/openid/trust.phtml:18 -#, php-format -msgid "The private policy can be found at %s" -msgstr "Polityka prywatnoÅ›ci może być znaleziona pod adresem %s" - -#: modules/default/views/scripts/openid/trust.phtml:23 -msgid "Forever" -msgstr "Na zawsze" - -#: modules/default/views/scripts/openid/trust.phtml:26 -msgid "Allow" -msgstr "Zezwól" - -#: modules/default/views/scripts/openid/trust.phtml:27 -msgid "Deny" -msgstr "ZabroÅ„" - -#: modules/default/views/scripts/openid/login.phtml:5 -msgid "Login" -msgstr "Login" - -#: modules/default/views/scripts/index/index.phtml:17 -msgid "OPEN AN ACCOUNT NOW" -msgstr "STWÓRZ SWOJE KONTO TERAZ" - -#: modules/default/views/scripts/index/index.phtml:22 -msgid "Latest News" -msgstr "Najnowsze wiadomoÅ›ci" - -#: modules/default/views/scripts/sites/index.phtml:15 -msgid "Information Exchanged" -msgstr "Informacje wymienione" - -#: modules/default/views/scripts/sites/index.phtml:17 -msgid "Information exchanged with:" -msgstr "Informacje wymienione z:" - -#: modules/default/views/scripts/sites/index.phtml:21 -msgid "OK" -msgstr "OK" - -#: modules/default/views/scripts/history/index.phtml:13 -msgid "Clear History" -msgstr "Wyczyść HistoriÄ™" - -#: modules/default/views/scripts_monkeys/index/subheader.phtml:3 -msgid "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" -msgstr "Masz dość przymusu pamiętania tony
loginów i haseł
do Twoich ulubionych stron internetowych?" - -#: modules/default/views/scripts_monkeys/index/subheader.phtml:4 -msgid "Starting today
you'll only have to remember one" -msgstr "Od dzisiaj
będziesz potrzebował tylko jednego" - -#: modules/stats/views/scripts/authorizations/index.phtml:1 -msgid "Authorizations per day" -msgstr "Liczba autoryzacji na dzień" - -#: modules/stats/views/scripts/authorizations/index.phtml:3 -#: modules/stats/views/scripts/registrations/index.phtml:3 -#: modules/stats/views/scripts/sites/index.phtml:3 -msgid "Select view" -msgstr "Wybierz widok" - -#: modules/stats/views/scripts/authorizations/index.phtml:5 -#: modules/stats/views/scripts/registrations/index.phtml:5 -#: modules/stats/views/scripts/sites/index.phtml:5 -msgid "Last Week" -msgstr "Ostatni tydzień" - -#: modules/stats/views/scripts/authorizations/index.phtml:6 -#: modules/stats/views/scripts/registrations/index.phtml:7 -#: modules/stats/views/scripts/sites/index.phtml:6 -msgid "Last Year" -msgstr "Ostatni rok" - -#: modules/stats/views/scripts/registrations/index.phtml:1 -msgid "Registrations per day" -msgstr "Liczba rejestracji na dzień" - -#: modules/stats/views/scripts/registrations/index.phtml:6 -msgid "Last Month" -msgstr "Ostatni miesiąc" - -#: modules/stats/views/scripts/top/index.phtml:1 -msgid "Top 10 Trusted Sites" -msgstr "10 najczęściej zezwalanych stron" - -#: modules/stats/views/scripts/top/index.phtml:7 -#, php-format -msgid "%s users" -msgstr "%s użytkowników" - -#: modules/stats/views/scripts/sites/index.phtml:1 -msgid "Trusted Sites" -msgstr "Zaufane strony" - -#: modules/install/views/scripts/complete/index.phtml:2 -msgid "The installation was performed successfully" -msgstr "Instalacja powiodła się" - -#: modules/install/views/scripts/complete/index.phtml:10 -msgid "Finish" -msgstr "Zakończ" - -#: modules/install/views/scripts/permissions/index.phtml:2 -msgid "Please correct the following problems before proceeding:" -msgstr "Popraw poniższe problemy zanim przejdziesz dalej:" - -#: modules/install/views/scripts/permissions/index.phtml:10 -msgid "Check again" -msgstr "Sprawdź ponownie" - -#: modules/install/views/scripts/credentials/index.phtml:2 -msgid "Database and E-mail information" -msgstr "Potwierdzenie bazy danych i E-maila" - -#: modules/install/views/scripts/index/index.phtml:2 -msgid "This Community-ID instance hasn't been installed yet" -msgstr "Ta instalacja Community-ID nie jest jeszcze zakończona" - -#: modules/install/views/scripts/index/index.phtml:5 -msgid "Proceed with installation" -msgstr "Kontynuuj instalację" - -#: modules/users/views/scripts/register/index.phtml:1 -msgid "Registration Form" -msgstr "Formularz rejestracyjny" - -#: modules/users/views/scripts/personalinfo/edit.phtml:42 -#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:13 -#: modules/users/views/scripts/profilegeneral/changepassword.phtml:36 -msgid "Save" -msgstr "Zapisz" - -#: modules/users/views/scripts/personalinfo/edit.phtml:43 -#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:14 -#: modules/users/views/scripts/profilegeneral/changepassword.phtml:37 -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:23 -msgid "Cancel" -msgstr "Anuluj" - -#: modules/users/views/scripts/personalinfo/show.phtml:8 -msgid "Not Entered" -msgstr "Nie wpisane" - -#: modules/users/views/scripts/personalinfo/index.phtml:13 -#: modules/users/views/scripts/login/index.phtml:10 -#: modules/users/views/scripts_monkeys/login/index.phtml:10 -msgid "Personal Info" -msgstr "Informacje osobiste" - -#: modules/users/views/scripts/personalinfo/index.phtml:16 -#: modules/users/views/scripts/profile/index.phtml:17 -msgid "Edit" -msgstr "Edycja" - -#: modules/users/views/scripts/personalinfo/index.phtml:22 -msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" -msgstr "Te informacje zostaną automatycznie użyte aby wypełnić pola rejestracyjne dla każdego serwera OpenID która tego zarząda" - -#: modules/users/views/scripts/recoverpassword/index.phtml:1 -msgid "Please enter your E-mail below to receive a link to reset your password" -msgstr "Wpisz poniżej swój E-mail aby otrzymać link do przypomnienia hasła" - -#: modules/users/views/scripts/profile/index.phtml:13 -msgid "Account info" -msgstr "Informacje o koncie" - -#: modules/users/views/scripts/profile/index.phtml:20 -msgid "Change Password" -msgstr "Zmień hasło" - -#: modules/users/views/scripts/profile/index.phtml:38 -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 -msgid "Delete Account" -msgstr "Skasuj konto" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 -msgid "Why do you want to delete your Community-ID account?" -msgstr "Czemu chcesz skasować swoje konto?" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 -msgid "Please check all that apply:" -msgstr "Zaznacz wszystkie które pasują:" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 -msgid "This was just a test account" -msgstr "To było konto testowe" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 -msgid "I found a better service" -msgstr "Znalazłem lepszy serwer" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 -msgid "Service lacked some key features I needed" -msgstr "Brakowało mi niektórych funkcjonalności" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 -msgid "No particular reason" -msgstr "Bez powodu" - -#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 -msgid "Additional comments:" -msgstr "Dodatkowe komentarze:" - -#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 -#, fuzzy -msgid "OpenID" -msgstr "Open ID" - -#: modules/users/views/scripts/login/index.phtml:3 -#: modules/users/views/scripts_monkeys/login/index.phtml:3 -#, php-format -msgid "Hello, %s" -msgstr "Witaj, %s" - -#: modules/users/views/scripts/login/index.phtml:7 -#: modules/users/views/scripts_monkeys/login/index.phtml:7 -msgid "Account" -msgstr "Konto" - -#: modules/users/views/scripts/login/index.phtml:13 -#: modules/users/views/scripts_monkeys/login/index.phtml:13 -msgid "Sites database" -msgstr "Baza stron" - -#: modules/users/views/scripts/login/index.phtml:16 -#: modules/users/views/scripts_monkeys/login/index.phtml:16 -msgid "History Log" -msgstr "Historia" - -#: modules/users/views/scripts/login/index.phtml:19 -#: modules/users/views/scripts_monkeys/login/index.phtml:19 -msgid "Logout" -msgstr "Wyloguj" - -#: modules/users/views/scripts/login/index.phtml:24 -#: modules/users/views/scripts_monkeys/login/index.phtml:24 -msgid "Admin options" -msgstr "Opcje admina" - -#: modules/users/views/scripts/login/index.phtml:27 -#: modules/users/views/scripts_monkeys/login/index.phtml:27 -msgid "Manage Users" -msgstr "Zarządzaj Użytkownikami" - -#: modules/users/views/scripts/login/index.phtml:30 -#: modules/users/views/scripts_monkeys/login/index.phtml:30 -msgid "Message Users" -msgstr "Wiadomości dla Użytkowników" - -#: modules/users/views/scripts/login/index.phtml:34 -#: modules/users/views/scripts_monkeys/login/index.phtml:34 -msgid "Disable Maintenance Mode" -msgstr "Wyłącz tryb konserwacji" - -#: modules/users/views/scripts/login/index.phtml:36 -#: modules/users/views/scripts_monkeys/login/index.phtml:36 -msgid "Enable Maintenance Mode" -msgstr "Włącz tryb konserwacji" - -#: modules/users/views/scripts/login/index.phtml:40 -#: modules/users/views/scripts_monkeys/login/index.phtml:40 -msgid "Statistics" -msgstr "Statystyki" - -#: modules/users/views/scripts/login/index.phtml:47 -#: modules/users/views/scripts_monkeys/login/index.phtml:50 -msgid "User access is currently disabled for system maintenance.
Please try again later" -msgstr "Dostęp dla użytkowników jest aktualnie zabroniony, gdyż system jest w trybie konserwacji.
Spróbuj ponownie później." - -#: modules/users/views/scripts/login/index.phtml:58 -#: modules/users/views/scripts_monkeys/login/index.phtml:61 -msgid "Remember me" -msgstr "Zapamiętaj mnie" - -#: modules/users/views/scripts/login/index.phtml:61 -#: modules/users/views/scripts_monkeys/login/index.phtml:64 -msgid "Log in" -msgstr "Zaloguj" - -#: modules/users/views/scripts/login/index.phtml:67 -#: modules/users/views/scripts_monkeys/login/index.phtml:70 -msgid "Forgot you password?" -msgstr "Zapomniałeś hasła?" - -#: modules/users/views/scripts/login/index.phtml:73 -#: modules/users/views/scripts_monkeys/login/index.phtml:76 -msgid "You don't have an account?" -msgstr "Nie masz konta?" - -#: modules/users/views/scripts/login/index.phtml:75 -#: modules/users/views/scripts_monkeys/login/index.phtml:78 -msgid "REGISTER NOW!" -msgstr "ZAREJESTRUJ SIĘ!" - -#: modules/users/views/scripts/manageusers/index.phtml:11 -msgid "All" -msgstr "Wszystko" - -#: modules/users/views/scripts/manageusers/index.phtml:14 -msgid "Confirmed" -msgstr "Potwierdzone" - -#: modules/users/views/scripts/manageusers/index.phtml:17 -msgid "Unconfirmed" -msgstr "Niepotwierdzone" - -#: modules/users/views/scripts/manageusers/index.phtml:24 -msgid "Total users:" -msgstr "Liczba użytkowników:" - -#: modules/users/views/scripts/manageusers/index.phtml:25 -msgid "Total confirmed users:" -msgstr "Liczba potwierdzonych użytkowników:" - -#: modules/users/views/scripts/manageusers/index.phtml:26 -msgid "Total unconfirmed users:" -msgstr "Liczba niepotwierdzonych użytkowników:" - -#: modules/users/views/scripts/manageusers/index.phtml:29 -msgid "Add User" -msgstr "Dodaj użytkownika" - -#: modules/users/views/scripts/manageusers/index.phtml:31 -msgid "Delete Unconfirmed Users" -msgstr "Skasuj nieaktywnych użytkowników" - -#: views/layouts_monkeys/layout.phtml:32 -#: views/layouts/layout.phtml:32 -msgid "Home" -msgstr "Strona główna" - -#: views/layouts_monkeys/layout.phtml:35 -#: views/layouts/layout.phtml:35 -msgid "Feedback" -msgstr "Opinie" - -#: views/layouts_monkeys/layout.phtml:38 -msgid "Help and Support" -msgstr "Pomoc i wsparcie" - -#: views/layouts_monkeys/layout.phtml:55 -#: views/layouts/layout.phtml:52 -msgid "Maintenance mode is enabled: user access is restricted" -msgstr "Tryb konserwacji jest włączony: dostęp dla użytkowników jest zabroniony" - -#: views/layouts_monkeys/layout.phtml:75 -msgid "Privacy" -msgstr "Prywatność" - -#: views/layouts_monkeys/layout.phtml:78 -msgid "About Us" -msgstr "O nas" - -#: views/layouts_monkeys/layout.phtml:81 -msgid "Contact Us" -msgstr "Skontaktuj się" - -#~ msgid "Username:" -#~ msgstr "Username:" -#~ msgid "E-mail:" -#~ msgstr "E-mail:" -#~ msgid "LOGIN" -#~ msgstr "LOGIN" -#~ msgid "LOG IN" -#~ msgstr "LOG IN" - diff --git a/languages/sv/LC_MESSAGES/lang.mo b/languages/sv/LC_MESSAGES/lang.mo new file mode 100644 index 0000000..1ba72e6 Binary files /dev/null and b/languages/sv/LC_MESSAGES/lang.mo differ diff --git a/languages/sv/LC_MESSAGES/lang.po b/languages/sv/LC_MESSAGES/lang.po new file mode 100644 index 0000000..0df6b8b --- /dev/null +++ b/languages/sv/LC_MESSAGES/lang.po @@ -0,0 +1,1310 @@ +msgid "" +msgstr "" +"Project-Id-Version: Community-ID\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-05-26 11:34-0500\n" +"PO-Revision-Date: \n" +"Last-Translator: Keyboard Monkeys \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Swedish\n" +"X-Poedit-Country: SWEDEN\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-Basepath: ../../../\n" +"X-Poedit-KeywordsList: translate\n" +"X-Poedit-SearchPath-0: modules\n" +"X-Poedit-SearchPath-1: views\n" +"X-Poedit-SearchPath-2: javascript\n" +"X-Poedit-SearchPath-3: libs/Monkeys\n" +"X-Poedit-SearchPath-4: plugins\n" + +#: modules/users/forms/SigninImage.php:25 +msgid "Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB." +msgstr "" + +#: modules/users/forms/AccountInfo.php:26 +#: modules/users/forms/Register.php:45 +msgid "Username" +msgstr "Användarnamn" + +#: modules/users/forms/AccountInfo.php:32 +#: modules/users/forms/Register.php:28 +msgid "First Name" +msgstr "Förnamn" + +#: modules/users/forms/AccountInfo.php:37 +#: modules/users/forms/Register.php:33 +msgid "Last Name" +msgstr "Efternamn" + +#: modules/users/forms/AccountInfo.php:42 +#: modules/users/forms/Register.php:38 +msgid "E-mail" +msgstr "E-post" + +#: modules/users/forms/AccountInfo.php:49 +msgid "Auth Method" +msgstr "" + +#: modules/users/forms/AccountInfo.php:56 +msgid "Associated YubiKey" +msgstr "" + +#: modules/users/forms/AccountInfo.php:64 +#: modules/users/forms/ChangePassword.php:26 +msgid "Enter password" +msgstr "Skriv lösenordet" + +#: modules/users/forms/AccountInfo.php:76 +#: modules/users/forms/Register.php:63 +#: modules/users/forms/ChangePassword.php:38 +msgid "Enter password again" +msgstr "Skriv lösenordet igen" + +#: modules/users/forms/PersonalInfo.php:65 +#, fuzzy +msgid "Profile Name" +msgstr "profil" + +#: modules/users/forms/Login.php:18 +msgid "USERNAME" +msgstr "Användarnamn" + +#: modules/users/forms/Login.php:27 +msgid "PASSWORD" +msgstr "Lösenord" + +#: modules/users/forms/Register.php:51 +msgid "Enter desired password" +msgstr "Skriv önskat lösenord" + +#: modules/users/forms/Register.php:68 +msgid "Please enter the text below" +msgstr "Vänligen skriv denna text i rutan nedanför" + +#: modules/users/models/User.php:129 +#, fuzzy +msgid "Default profile" +msgstr "profil" + +#: modules/users/controllers/RegisterController.php:26 +msgid "Sorry, registrations are currently disabled" +msgstr "Möjligheten att registrera sig är för tillfället avstängd" + +#: modules/users/controllers/RegisterController.php:59 +msgid "This username is already in use" +msgstr "Användarnamnet är upptaget" + +#: modules/users/controllers/RegisterController.php:66 +msgid "This E-mail is already in use" +msgstr "E-postadressen är upptagen" + +#: modules/users/controllers/RegisterController.php:95 +msgid "Community-ID registration confirmation" +msgstr "Community-ID registreringsbekräftelse" + +#: modules/users/controllers/RegisterController.php:100 +msgid "Thank you." +msgstr "Tack så mycket!" + +#: modules/users/controllers/RegisterController.php:101 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "Vi har nu skickat ett e-brev med instruktioner om hur du aktiverar ditt OpenID." + +#: modules/users/controllers/RegisterController.php:104 +msgid "The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support." +msgstr "" + +#: modules/users/controllers/RegisterController.php:106 +msgid "The account was created but the E-mail could not be sent" +msgstr "Registreringen är genomförd, men e-brevet kunde inte skickas." + +#: modules/users/controllers/RegisterController.php:123 +#: modules/users/controllers/RegisterController.php:141 +#: modules/users/controllers/RegisterController.php:156 +msgid "Invalid token" +msgstr "Felaktig bekräftelsekod" + +#: modules/users/controllers/RegisterController.php:147 +msgid "Your account has been deleted" +msgstr "Ditt konto har nu raderats" + +#: modules/users/controllers/LoginController.php:63 +#: modules/users/controllers/LoginController.php:97 +msgid "Invalid credentials" +msgstr "Felaktiga inloggningsuppgifter" + +#: modules/users/controllers/SigninimageController.php:71 +msgid "There is no image uploaded" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:77 +#, fuzzy +msgid "There was a problem setting the cookie" +msgstr "Ett fel uppstod när meddelandet skulle skickas" + +#: modules/users/controllers/SigninimageController.php:82 +msgid "Image has been set successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/SigninimageController.php:86 +msgid "Image has been disabled successfully on this computer/browser" +msgstr "" + +#: modules/users/controllers/RecoverpasswordController.php:51 +msgid "This E-mail is not registered in the system" +msgstr "Denna e-postadress finns inte registrerad" + +#: modules/users/controllers/RecoverpasswordController.php:72 +#: modules/users/controllers/RecoverpasswordController.php:101 +msgid "Community-ID password reset" +msgstr "Community-ID lösenordsbyte" + +#: modules/users/controllers/RecoverpasswordController.php:74 +msgid "Password reset E-mail has been sent" +msgstr "E-brev för att byta lösenord har skickats" + +#: modules/users/controllers/RecoverpasswordController.php:83 +msgid "Wrong Token" +msgstr "Felaktig bekräftelsekod" + +#: modules/users/controllers/RecoverpasswordController.php:103 +msgid "You'll receive your new password via E-mail" +msgstr "Ett nytt lösenord har skickats till dig via e-post" + +#: modules/users/controllers/ProfilegeneralController.php:109 +msgid "Could not validate Yubikey" +msgstr "" + +#: modules/users/controllers/ProfilegeneralController.php:301 +msgid "Account was deleted, but feedback form couldn't be sent to admins" +msgstr "Kontot har raderats, men meddelandet kunde inte skickas till administratören" + +#: modules/users/controllers/ProfilegeneralController.php:315 +msgid "Your acccount has been successfully deleted" +msgstr "Ditt konto har nu raderats" + +#: modules/users/controllers/UserslistController.php:59 +msgid "admin" +msgstr "admin" + +#: modules/users/controllers/UserslistController.php:61 +msgid "confirmed" +msgstr "godkänd" + +#: modules/users/controllers/UserslistController.php:63 +msgid "unconfirmed" +msgstr "väntande" + +#: modules/users/controllers/PersonalinfoController.php:87 +#, fuzzy +msgid "Profile has been saved" +msgstr "Nyheten har sparats" + +#: modules/users/controllers/PersonalinfoController.php:98 +#, fuzzy +msgid "Profile has been deleted" +msgstr "Nyheten har raderats" + +#: modules/users/controllers/ManageusersController.php:31 +msgid "User has been deleted successfully" +msgstr "Användaren har raderats" + +#: modules/users/controllers/ManageusersController.php:48 +msgid "Community-ID registration reminder" +msgstr "Community-ID registreringspåminnelse" + +#: modules/default/forms/MessageUsers.php:17 +msgid "Subject" +msgstr "Ämne" + +#: modules/default/forms/MessageUsers.php:22 +msgid "CC" +msgstr "CC" + +#: modules/default/forms/OpenidLogin.php:28 +msgid "OpenID URL" +msgstr "OpenID URL" + +#: modules/default/forms/OpenidLogin.php:35 +msgid "Password" +msgstr "Lösenord" + +#: modules/default/forms/Feedback.php:25 +msgid "Enter your name" +msgstr "Ditt namn" + +#: modules/default/forms/Feedback.php:30 +msgid "Enter your E-mail" +msgstr "Din e-postadress" + +#: modules/default/forms/Feedback.php:37 +msgid "Enter your questions or comments" +msgstr "Din fråga eller kommentar" + +#: modules/default/forms/ErrorMessages.php:20 +msgid "Value is empty, but a non-empty value is required" +msgstr "Uppgift saknas" + +#: modules/default/forms/ErrorMessages.php:21 +msgid "Value is required and can't be empty" +msgstr "Uppgift saknas" + +#: modules/default/forms/ErrorMessages.php:22 +msgid "'%value%' is not a valid email address in the basic format local-part@hostname" +msgstr "'%value%' är inte en godkänd e-postadress enligt formatet: namn@domän" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "'%hostname%' är ingen godkänd domän för e-postadressen '%value%'" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' does not match the expected structure for a DNS hostname" +msgstr "'%value%' ser följer inte strukturen för ett godkänt domännamn" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "'%value%' ser ut att vara ett domännamn, men det finns ingen toppdomän (texten efter sista punkten) som stämmer med det angivna" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "'%value%' ser ut att vara ett lokalt nätverksnamn, men sådana är inte tillåtna" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Captcha value is wrong" +msgstr "Fel text angiven" + +#: modules/default/forms/ErrorMessages.php:28 +msgid "Password confirmation does not match" +msgstr "Lösenorden är olika" + +#: modules/default/forms/ErrorMessages.php:29 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "Användarnamn kan bara innehålla siffor och bokstäver (utom ÅÄÖ) plus symbolerna $-_.+!*'(), och \"" + +#: modules/default/forms/ErrorMessages.php:30 +msgid "Username is invalid" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:31 +msgid "The file '%value%' was not uploaded" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:32 +msgid "Password can't be a dictionary word" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:33 +msgid "Password can't contain the username" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:34 +msgid "Password must be longer than %minLength% characters" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:35 +msgid "Password must contain numbers" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:36 +msgid "Password must contain symbols" +msgstr "" + +#: modules/default/forms/ErrorMessages.php:37 +msgid "Password needs to have lowercase and uppercase characters" +msgstr "" + +#: modules/default/models/Field.php:39 +msgid "Male" +msgstr "Man" + +#: modules/default/models/Field.php:40 +msgid "Female" +msgstr "Kvinna" + +#: modules/default/models/Fields.php:62 +msgid "Nickname" +msgstr "Pseudonym" + +#: modules/default/models/Fields.php:64 +msgid "Full Name" +msgstr "Fullständigt namn" + +#: modules/default/models/Fields.php:65 +msgid "Date of Birth" +msgstr "Födelsedatum" + +#: modules/default/models/Fields.php:66 +msgid "Gender" +msgstr "Kön" + +#: modules/default/models/Fields.php:67 +msgid "Postal Code" +msgstr "Postnummer" + +#: modules/default/models/Fields.php:68 +msgid "Country" +msgstr "Land" + +#: modules/default/models/Fields.php:69 +msgid "Language" +msgstr "Språk" + +#: modules/default/models/Fields.php:70 +msgid "Time Zone" +msgstr "Tidszon" + +#: modules/default/controllers/MessageusersController.php:46 +msgid "CC field must be a comma-separated list of valid E-mails" +msgstr "CC-fältet måste vara en kommaseparerad lista med e-postadresser" + +#: modules/default/controllers/MessageusersController.php:86 +msgid "Message has been sent" +msgstr "Meddelandet har skickats" + +#: modules/default/controllers/MessageusersController.php:88 +msgid "There was an error trying to send the message" +msgstr "Ett fel uppstod när meddelandet skulle skickas" + +#: modules/default/controllers/ErrorController.php:18 +msgid "The URL you entered is incorrect. Please correct and try again." +msgstr "" + +#: modules/default/controllers/ErrorController.php:21 +msgid "Access Denied - Maybe your session has expired? Try logging-in again." +msgstr "" + +#: modules/default/controllers/FeedbackController.php:57 +msgid "Thank you for your interest. Your message has been routed." +msgstr "Tack för ditt meddelande. Det har nu skickats till oss." + +#: modules/default/controllers/FeedbackController.php:59 +msgid "Sorry, the feedback couldn't be delivered. Please try again later." +msgstr "Tyvärr kunde ditt meddelande inte levereras. Vänligen försök igen senare." + +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "Kan inte hämta nyheterna" + +#: modules/default/controllers/CidController.php:47 +msgid "Read More" +msgstr "Läs mer..." + +#: modules/default/controllers/OpenidController.php:26 +msgid "Forbidden" +msgstr "" + +#: modules/news/forms/Article.php:18 +msgid "Title" +msgstr "Titel" + +#: modules/news/forms/Article.php:24 +msgid "Publication date" +msgstr "Publiceringsdatum" + +#: modules/news/forms/Article.php:32 +msgid "Excerpt" +msgstr "Ingress" + +#: modules/news/controllers/EditController.php:60 +#: modules/news/controllers/EditController.php:90 +msgid "The article doesn't exist." +msgstr "Nyheten existerar inte." + +#: modules/news/controllers/EditController.php:81 +msgid "The article has been saved." +msgstr "Nyheten har sparats" + +#: modules/news/controllers/EditController.php:93 +msgid "The article has been deleted." +msgstr "Nyheten har raderats" + +#: modules/install/forms/Install.php:18 +msgid "Hostname" +msgstr "Databasserver" + +#: modules/install/forms/Install.php:19 +msgid "usually localhost" +msgstr "vanligen localhost" + +#: modules/install/forms/Install.php:27 +msgid "Database name" +msgstr "Databasens namn" + +#: modules/install/forms/Install.php:34 +msgid "Database username" +msgstr "Databasens användarnamn" + +#: modules/install/forms/Install.php:40 +msgid "Database password" +msgstr "Databasens lösenord" + +#: modules/install/forms/Install.php:44 +msgid "Support E-mail" +msgstr "Support E-postadress" + +#: modules/install/forms/Install.php:45 +msgid "Will be used as the sender for any message sent by the system, and as the recipient for user feedback" +msgstr "Används som ansändare för e-post skickad av systemet och som mottagare av meddelanden från Kontakt-formuläret." + +#: modules/install/controllers/UpgradeController.php:80 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "Uppgraderingen gick bra. Du kör nu med version %s" + +#: modules/install/controllers/UpgradeController.php:84 +#, php-format +msgid "WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s." +msgstr "" + +#: modules/install/controllers/UpgradeController.php:117 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "Vänligen korrigera innan uppgradering: Filen %s krävs för att kunna fortsätta" + +#: modules/install/controllers/UpgradeController.php:159 +#, fuzzy +msgid "Please address the following requirements before proceeding with the upgrade:" +msgstr "Vänligen rätta till följande problem innan du fortsätter" + +#: modules/install/controllers/CredentialsController.php:44 +msgid "We couldn't connect to the database using those credentials." +msgstr "Det går inte att ansluta till databasen med dessa uppgifter." + +#: modules/install/controllers/CredentialsController.php:45 +msgid "Please verify and try again." +msgstr "Vänligen kontrollera och försök igen." + +#: modules/install/controllers/CredentialsController.php:51 +#, php-format +msgid "The connection to the database engine worked, but the database %s doesn't exist or the provided user doesn't have access to it. An attempt was made to create it, but the provided user doesn't have permissions to do so either. Please create it yourself and try again." +msgstr "Anslutningen till databasmotorn gick bra, men databasen %s saknas, alternativt har angiven användare inte tillgång till den. Ett försök gjordes att skapa databasen, men den angivna användaren har inte tillåtelse att göra det. Vänligen skapa databasen manuellt och försök igen." + +#: modules/install/controllers/CredentialsController.php:230 +#, php-format +msgid "PHP version %s or greater is required" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:234 +#, php-format +msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." +msgstr "Mappen där Community-ID är installerat måste vara skrivbart för webbservern (%s). Ett annat alternativ är att skapa en TOM config.php-fil som är skrivbar för användaren." + +#: modules/install/controllers/CredentialsController.php:237 +#, php-format +msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" +msgstr "Mappen \"captchas\", som ligger under Community-ID-mappen, måste vara skrivbar för webbservern (%s)" + +#: modules/install/controllers/CredentialsController.php:240 +#: modules/install/controllers/CredentialsController.php:243 +#: modules/install/controllers/CredentialsController.php:252 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "Du måste ha tillägget %s installerat" + +#: modules/install/controllers/CredentialsController.php:246 +msgid "You need to have PNG support in your GD configuration" +msgstr "" + +#: modules/install/controllers/CredentialsController.php:249 +msgid "You need to have Freetype support in your GD configuration" +msgstr "" + +#: javascript/language.php:30 +msgid "Name" +msgstr "Namn" + +#: javascript/language.php:31 +msgid "Registration" +msgstr "Registrerad" + +#: javascript/language.php:32 +msgid "Status" +msgstr "Status" + +#: javascript/language.php:33 +msgid "profile" +msgstr "profil" + +#: javascript/language.php:34 +msgid "delete" +msgstr "radera" + +#: javascript/language.php:35 +msgid "Site" +msgstr "Webbplats" + +#: javascript/language.php:36 +msgid "view info exchanged" +msgstr "visa utväxlad information" + +#: javascript/language.php:37 +msgid "deny" +msgstr "neka" + +#: javascript/language.php:38 +msgid "allow" +msgstr "tillåt" + +#: javascript/language.php:39 +msgid "Are you sure you wish to send this message to ALL users?" +msgstr "Är du säker på att du vill skicka detta meddelande till ALLA användare=" + +#: javascript/language.php:40 +msgid "Are you sure you wish to deny trust to this site?" +msgstr "Är du säker på att du vill neka denna webbplats tillträde?" + +#: javascript/language.php:41 +msgid "operation failed" +msgstr "operationen misslyckades" + +#: javascript/language.php:42 +msgid "Trust to the following site has been granted:" +msgstr "Följande webbplats har tillåtits få tillträde:" + +#: javascript/language.php:43 +msgid "Trust the following site has been denied:" +msgstr "Tillträde för denna webbplats har nekats:" + +#: javascript/language.php:44 +msgid "ERROR. The server returned:" +msgstr "FEL. Servern meddelar:" + +#: javascript/language.php:45 +msgid "Your relationship with the following site has been deleted:" +msgstr "Dina relationer med följande webbplats har raderats:" + +#: javascript/language.php:46 +msgid "The history log has been cleared" +msgstr "Besökshistorien har raderats" + +#: javascript/language.php:47 +msgid "Are you sure you wish to allow access to this site?" +msgstr "Är du säker på att du vill tillåta tillträde för denna webbplats?" + +#: javascript/language.php:48 +msgid "Are you sure you wish to delete your relationship with this site?" +msgstr "Är du säker på att du vill radera relationerna med denna webbplats?" + +#: javascript/language.php:49 +msgid "Are you sure you wish to delete all the History Log?" +msgstr "Är du säker på att du vill radera hela besökshistorien?" + +#: javascript/language.php:50 +msgid "Are you sure you wish to delete the user" +msgstr "Är du säker på att du vill radera användaren" + +#: javascript/language.php:51 +msgid "Are you sure you wish to delete all the unconfirmed accounts?" +msgstr "Är du säker på att du vill radera ALLA väntande registreringar?" + +#: javascript/language.php:52 +msgid "Date" +msgstr "Datum" + +#: javascript/language.php:53 +msgid "Result" +msgstr "Händelse" + +#: javascript/language.php:54 +msgid "No records found." +msgstr "Inga poster funna" + +#: javascript/language.php:55 +msgid "Loading..." +msgstr "Hämtar..." + +#: javascript/language.php:56 +msgid "Data error." +msgstr "Datafel" + +#: javascript/language.php:57 +msgid "Click to sort ascending" +msgstr "Sortera i bokstavordning" + +#: javascript/language.php:58 +msgid "Click to sort descending" +msgstr "Sortera i omvänd bokstavordning" + +#: javascript/language.php:59 +msgid "Authorized" +msgstr "Auktoriserad" + +#: javascript/language.php:60 +msgid "Denied" +msgstr "Nekad" + +#: javascript/language.php:61 +msgid "of" +msgstr "av" + +#: javascript/language.php:62 +msgid "next" +msgstr "nästa" + +#: javascript/language.php:63 +msgid "prev" +msgstr "förra" + +#: javascript/language.php:64 +msgid "IP" +msgstr "IP-adress" + +#: javascript/language.php:65 +msgid "Delete unconfirmed accounts older than how many days?" +msgstr "Radera obekräftade konton äldre än hur många dagar?" + +#: javascript/language.php:66 +msgid "The value entered is incorrect" +msgstr "Angivet värde är felaktigt" + +#: javascript/language.php:67 +msgid "Send reminder to accounts older than how many days?" +msgstr "Skicka påminnelse till konton äldre än hur många dagar?" + +#: javascript/language.php:68 +msgid "Are you sure you wish to delete this article?" +msgstr "Är du säker på att du vill radera denna artikel?" + +#: javascript/language.php:69 +msgid "reminder" +msgstr "påminnelse" + +#: javascript/language.php:70 +msgid "reminders" +msgstr "påminnelser" + +#: javascript/language.php:71 +#, fuzzy +msgid "Are you sure you wish to delete this profile?" +msgstr "Är du säker på att du vill radera denna artikel?" + +#: libs/Monkeys/Form/Element/Timezone.php:47 +msgid "-- Select a Timezone --" +msgstr "-- Välj tidszon --" + +#: libs/Monkeys/Form/Element/Country.php:35 +msgid "-- Select a Country --" +msgstr "-- Välj land --" + +#: libs/Monkeys/Form/Element/Language.php:35 +msgid "-- Select a Language --" +msgstr "-- Välj språk --" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:266 +msgid "January" +msgstr "Januari" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:267 +msgid "February" +msgstr "Februari" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:268 +msgid "March" +msgstr "Mars" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:269 +msgid "April" +msgstr "April" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:270 +msgid "May" +msgstr "Maj" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:271 +msgid "June" +msgstr "Juni" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:272 +msgid "July" +msgstr "Juli" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:273 +msgid "August" +msgstr "Augusti" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:274 +msgid "Septembre" +msgstr "September" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:275 +msgid "October" +msgstr "Oktober" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:276 +msgid "November" +msgstr "November" + +#: libs/Monkeys/View/Helper/FormDateSelects.php:277 +msgid "December" +msgstr "December" + +#: plugins/stats/Authorizations.php:21 +msgid "Authorizations per day" +msgstr "Betrodda webbplatser per dag" + +#: plugins/stats/Sites.php:21 +msgid "Trusted Sites" +msgstr "Betrodda webbplatser" + +#: plugins/stats/Sites.php:77 +#: plugins/stats/Sites.php:81 +msgid "Trusted sites" +msgstr "Betrodda platser" + +#: plugins/stats/Sites.php:78 +#: plugins/stats/Sites.php:82 +msgid "Sites per user" +msgstr "Platser per användare" + +#: plugins/stats/Top.php:21 +msgid "Top 10 Trusted Sites" +msgstr "De 10 mest betrodda webbplatserna" + +#: plugins/stats/Registrations.php:21 +msgid "Registrations per day" +msgstr "Registreringar per dag" + +#: modules/users/views/scripts/signinimage/index.phtml:1 +#: modules/users/views/scripts/login/index.phtml:14 +msgid "Sign-in Image" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:8 +msgid "You haven't uploaded an image yet" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:11 +msgid "Select an image to use as your Sign-in Image:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:15 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Spara" + +#: modules/users/views/scripts/signinimage/index.phtml:23 +msgid "This image will be shown in the log-in and OpenID authentication screens of Community-ID." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:26 +msgid "It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven't been falsified." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:29 +msgid "After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based)." +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:34 +msgid "Use the following button to enable/disable it in the current computer/browser:" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:39 +msgid "Disable" +msgstr "" + +#: modules/users/views/scripts/signinimage/index.phtml:42 +#, fuzzy +msgid "Enable" +msgstr "Man" + +#: modules/users/views/scripts/signinimage/index.phtml:51 +msgid "Further instructions will appear after you upload the image." +msgstr "" + +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Registreringsformulär" + +#: modules/users/views/scripts/register/index.phtml:10 +#: modules/users/views/scripts/recoverpassword/index.phtml:4 +msgid "Send" +msgstr "Skicka" + +#: modules/users/views/scripts/register/eula.phtml:1 +msgid "Please read the following EULA in order to continue" +msgstr "Vänligen läs igenom följande villkor" + +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "GODKÄNN villkoren" + +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "Godkänn INTE villkoren" + +#: modules/users/views/scripts/login/index.phtml:3 +#, php-format +msgid "Hello, %s" +msgstr "Hej, %s" + +#: modules/users/views/scripts/login/index.phtml:7 +msgid "Account" +msgstr "Inställningar" + +#: modules/users/views/scripts/login/index.phtml:11 +msgid "Personal Info" +msgstr "Personinformation" + +#: modules/users/views/scripts/login/index.phtml:17 +msgid "Sites database" +msgstr "Webbplatser" + +#: modules/users/views/scripts/login/index.phtml:20 +msgid "History Log" +msgstr "Besökshistoria" + +#: modules/users/views/scripts/login/index.phtml:24 +msgid "Logout" +msgstr "Logga ut" + +#: modules/users/views/scripts/login/index.phtml:29 +msgid "Admin options" +msgstr "Administration" + +#: modules/users/views/scripts/login/index.phtml:32 +msgid "Manage Users" +msgstr "Hantera användare" + +#: modules/users/views/scripts/login/index.phtml:35 +msgid "Message Users" +msgstr "E-post till användare" + +#: modules/users/views/scripts/login/index.phtml:39 +msgid "Disable Maintenance Mode" +msgstr "Öppna efter underhåll" + +#: modules/users/views/scripts/login/index.phtml:41 +msgid "Enable Maintenance Mode" +msgstr "Stäng för underhåll" + +#: modules/users/views/scripts/login/index.phtml:45 +msgid "Statistics" +msgstr "Statistik" + +#: modules/users/views/scripts/login/index.phtml:48 +msgid "About Community-ID" +msgstr "Om Community-ID" + +#: modules/users/views/scripts/login/index.phtml:55 +msgid "User access is currently disabled for system maintenance.
Please try again later" +msgstr "Inloggningen är avstängd på grund av underhåll
Vänligen försök senare" + +#: modules/users/views/scripts/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:65 +msgid "This is the image that identifies your account in this computer" +msgstr "" + +#: modules/users/views/scripts/login/index.phtml:82 +msgid "Remember me" +msgstr "Kom ihåg mig" + +#: modules/users/views/scripts/login/index.phtml:85 +msgid "Log in" +msgstr "Logga in" + +#: modules/users/views/scripts/login/index.phtml:91 +msgid "Forgot your password?" +msgstr "Glömt lösenordet?" + +#: modules/users/views/scripts/login/index.phtml:98 +msgid "You don't have an account?" +msgstr "Saknar du inloggning?" + +#: modules/users/views/scripts/login/index.phtml:100 +msgid "REGISTER NOW!" +msgstr "Registrera dig nu!" + +#: modules/users/views/scripts/recoverpassword/index.phtml:1 +msgid "Please enter your E-mail below to receive a link to reset your password" +msgstr "Vänligen skriv din e-postadress i rutan och skicka den, så får du tillbaka en länk där du kan byta lösenord." + +#: modules/users/views/scripts/manageusers/index.phtml:11 +msgid "Enter search string" +msgstr "Skriv sökord" + +#: modules/users/views/scripts/manageusers/index.phtml:12 +msgid "Go" +msgstr "Sök" + +#: modules/users/views/scripts/manageusers/index.phtml:13 +msgid "Clear" +msgstr "Rensa" + +#: modules/users/views/scripts/manageusers/index.phtml:16 +msgid "All" +msgstr "Alla" + +#: modules/users/views/scripts/manageusers/index.phtml:19 +msgid "Confirmed" +msgstr "Godkända" + +#: modules/users/views/scripts/manageusers/index.phtml:22 +msgid "Unconfirmed" +msgstr "Väntande" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Total users:" +msgstr "Totalt antal användare:" + +#: modules/users/views/scripts/manageusers/index.phtml:30 +msgid "Total confirmed users:" +msgstr "Antal godkända användare:" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Total unconfirmed users:" +msgstr "Antal väntande användare:" + +#: modules/users/views/scripts/manageusers/index.phtml:34 +msgid "Add User" +msgstr "Lägg till användare" + +#: modules/users/views/scripts/manageusers/index.phtml:36 +msgid "Delete Unconfirmed Users" +msgstr "Radera ALLA väntande" + +#: modules/users/views/scripts/manageusers/index.phtml:39 +msgid "Send Reminder" +msgstr "Skicka påminnelse" + +#: modules/users/views/scripts/personalinfo/edit.phtml:6 +msgid "Cancel" +msgstr "Avbryt" + +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "This information will be used to automatically populate registration fields to any OpenID transaction that requires so" +msgstr "Detta är information som kan skickas automatiskt till de webbplaster som ber om det när du loggar in med OpenID" + +#: modules/users/views/scripts/personalinfo/index.phtml:23 +#, fuzzy +msgid "Edit profile" +msgstr "Ändra nyhet" + +#: modules/users/views/scripts/personalinfo/index.phtml:29 +#, fuzzy +msgid "Delete profile" +msgstr "Radera nyhet" + +#: modules/users/views/scripts/personalinfo/index.phtml:49 +msgid "Not Entered" +msgstr "Saknas" + +#: modules/users/views/scripts/personalinfo/index.phtml:57 +msgid "Add another profile" +msgstr "" + +#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:28 +msgid "OpenID" +msgstr "OpenID" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:3 +msgid "Why do you want to delete your Community-ID account?" +msgstr "Varför vill du radera ditt konto hos Community-ID?" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:4 +msgid "Please check all that apply:" +msgstr "Vänligen kryssa i det som stämmer:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:8 +msgid "This was just a test account" +msgstr "Det var bara ett testkonto" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:11 +msgid "I found a better service" +msgstr "Jag har hittat en bättre tjänst" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:14 +msgid "Service lacked some key features I needed" +msgstr "Tjänsten saknar funktioner jag behöver" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:17 +msgid "No particular reason" +msgstr "Ingen speciell orsak" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:20 +msgid "Additional comments:" +msgstr "Kommentarer:" + +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:22 +#: modules/users/views/scripts/profile/index.phtml:44 +msgid "Delete Account" +msgstr "Radera kontot" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Inställningar" + +#: modules/users/views/scripts/profile/index.phtml:18 +msgid "Edit" +msgstr "Ändra" + +#: modules/users/views/scripts/profile/index.phtml:24 +msgid "Change Password" +msgstr "Byt lösenord" + +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-es.phtml:37 +msgid "There are no news articles yet" +msgstr "Det saknas ännu nyhetsartiklar" + +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-es.phtml:44 +msgid "View All" +msgstr "Visa alla" + +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-es.phtml:48 +msgid "Add New Article" +msgstr "Lägg till nyhetsartikel" + +#: modules/default/views/scripts/feedback/index.phtml:1 +msgid "In order to serve you better, we have provided the form below for your questions and comments" +msgstr "För att kunna ge dig bättre service, ber vi dig skriva dina kommentarer och/eller frågor i nedanstående formulär" + +#: modules/default/views/scripts/identity/id.phtml:2 +msgid "This is the identity page for the Community-ID user identified with:" +msgstr "Detta identitetssidan för " + +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "Detta meddelande kommer att skickas till ALLA registrerade användare!" + +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "Växla till vanlig text" + +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "Växla till HTML" + +#: modules/default/views/scripts/openid/trust.phtml:3 +#, php-format +msgid "A site identifying as %s has asked for confirmation that %s is your identity URL." +msgstr "Webbplatsen %s ber dig bekräfta att %s är ditt OpenID." + +#: modules/default/views/scripts/openid/trust.phtml:9 +msgid "It also requests this additional information about you:" +msgstr "Den begär även följande information om dig:" + +#: modules/default/views/scripts/openid/trust.phtml:10 +msgid "Fields are automatically filled according to the personal info stored in your community-id account." +msgstr "Informationen fylls i automatiskt enligt den Personinformation du angivit." + +#: modules/default/views/scripts/openid/trust.phtml:11 +msgid "Fields marked with * are required." +msgstr "Fält markerade med * måste fyllas i" + +#: modules/default/views/scripts/openid/trust.phtml:16 +msgid "Please wait" +msgstr "" + +#: modules/default/views/scripts/openid/trust.phtml:23 +msgid "Forever" +msgstr "Bekräfta automatiskt i fortsättningen" + +#: modules/default/views/scripts/openid/trust.phtml:26 +msgid "Allow" +msgstr "Bekräfta" + +#: modules/default/views/scripts/openid/trust.phtml:27 +msgid "Deny" +msgstr "Neka" + +#: modules/default/views/scripts/openid/login.phtml:26 +msgid "Login" +msgstr "Logga in" + +#: modules/default/views/scripts/profile/index.phtml:5 +msgid "Please select the profile you want to use:" +msgstr "" + +#: modules/default/views/scripts/profile/index.phtml:20 +#, php-format +msgid "The privacy policy can be found at %s" +msgstr "Integritetspolicyn kan hittas på %s" + +#: modules/default/views/scripts/history/index.phtml:13 +msgid "Clear History" +msgstr "Radera " + +#: modules/default/views/scripts/sites/index.phtml:15 +msgid "Information Exchanged" +msgstr "Informationen utväxlad" + +#: modules/default/views/scripts/sites/index.phtml:17 +msgid "Information exchanged with:" +msgstr "Information utväxlad med:" + +#: modules/default/views/scripts/sites/index.phtml:21 +msgid "OK" +msgstr "Ok" + +#: modules/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "Installerad version:" + +#: modules/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "Senaste nytt från Community-ID:" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "Föregående" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +msgid "Next" +msgstr "Nästa" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "Senaste nytt" + +#: modules/news/views/scripts/index/index.phtml:16 +#: modules/news/views/scripts/view/index.phtml:3 +#, php-format +msgid "Published on %s" +msgstr "Publicerad %s" + +#: modules/news/views/scripts/index/index.phtml:21 +msgid "read more" +msgstr "Läs mer..." + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "Ändra nyhet" + +#: modules/news/views/scripts/view/index.phtml:7 +msgid "Delete Article" +msgstr "Radera nyhet" + +#: modules/install/views/scripts/index/index.phtml:2 +msgid "This Community-ID instance hasn't been installed yet" +msgstr "Community-ID har ännu inte blivit installerad" + +#: modules/install/views/scripts/index/index.phtml:5 +msgid "Proceed with installation" +msgstr "Fortsätt med installationen" + +#: modules/install/views/scripts/credentials/index.phtml:3 +msgid "Database and E-mail information" +msgstr "Databas och e-postinformation" + +#: modules/install/views/scripts/credentials/index.phtml:13 +msgid "Administrator User Information" +msgstr " Information om Administratören" + +#: modules/install/views/scripts/permissions/index.phtml:2 +msgid "Please correct the following problems before proceeding:" +msgstr "Vänligen rätta till följande problem innan du fortsätter" + +#: modules/install/views/scripts/permissions/index.phtml:10 +msgid "Check again" +msgstr "Kontrollera igen" + +#: modules/install/views/scripts/complete/index.phtml:2 +msgid "The installation was performed successfully" +msgstr "Installationen genomfördes utan problem" + +#: modules/install/views/scripts/complete/index.phtml:6 +msgid "You can login as the administrator with the username and password you just provided." +msgstr "Du kan logga in som administratör med användarnamnet och lösenordet du just angav." + +#: modules/install/views/scripts/complete/index.phtml:7 +msgid "Please note that this user is only meant for administrative tasks, and cannot have an OpenID credential." +msgstr "Notera att denna användare endast kan administrera webbplatsen och inte ha ett eget OpenID." + +#: modules/install/views/scripts/complete/index.phtml:10 +msgid "Finish" +msgstr "Avsluta" + +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "Ny version upptäckt" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "Ange administratörens inloggningsuppgifter för att fortsätta med installationen: " + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "Se till att du har en säkerhetskopia på databasen, bara utifall..." + +#: views/layouts/layout.phtml:33 +#: views/layouts_monkeys/layout.phtml:33 +msgid "Home" +msgstr "Hem" + +#: views/layouts/layout.phtml:36 +#: views/layouts_monkeys/layout.phtml:36 +msgid "Feedback" +msgstr "Kontakt" + +#: views/layouts/layout.phtml:42 +#: views/layouts_monkeys/layout.phtml:45 +msgid "Your OpenID is:" +msgstr "Ditt OpenID är:" + +#: views/layouts/layout.phtml:59 +#: views/layouts_monkeys/layout.phtml:62 +msgid "Maintenance mode is enabled: user access is restricted" +msgstr "Webbplatsen stängd för underhåll: Inloggning är avstängd" + +#: views/layouts_monkeys/layout.phtml:39 +msgid "Help and Support" +msgstr "" + +#: views/layouts_monkeys/layout.phtml:82 +msgid "Privacy" +msgstr "Integritetspolicy" + +#: views/layouts_monkeys/layout.phtml:85 +msgid "About Us" +msgstr "Om oss" + +#: views/layouts_monkeys/layout.phtml:88 +msgid "Contact Us" +msgstr "Kontakta oss" + +#: plugins/stats/Sites.phtml:2 +msgid "Select view" +msgstr "Välj tidsperiod" + +#: plugins/stats/Sites.phtml:4 +msgid "Last Week" +msgstr "Förra veckan" + +#: plugins/stats/Sites.phtml:5 +msgid "Last Year" +msgstr "Förra året" + +#: plugins/stats/Top.phtml:6 +#, php-format +msgid "%s users" +msgstr "%s användare" + +#: plugins/stats/Registrations.phtml:5 +msgid "Last Month" +msgstr "Förra månaden" + +#, fuzzy +#~ msgid "Forgot you password?" +#~ msgstr "Glömt lösenordet?" +#~ msgid "Privacy Policy" +#~ msgstr "Policy för personlig integritet" +#~ msgid "About Community-id" +#~ msgstr "Om Community-ID" +#~ msgid "Body:" +#~ msgstr "Meddelande:" +#~ msgid "About" +#~ msgstr "Om" + diff --git a/languages/sv/lang.mo b/languages/sv/lang.mo deleted file mode 100644 index 96abb99..0000000 Binary files a/languages/sv/lang.mo and /dev/null differ diff --git a/languages/sv/lang.po b/languages/sv/lang.po deleted file mode 100644 index 96abb99..0000000 Binary files a/languages/sv/lang.po and /dev/null differ diff --git a/libs/CommunityID/Controller/Action.php b/libs/CommunityID/Controller/Action.php index 973373d..eb50ed7 100644 --- a/libs/CommunityID/Controller/Action.php +++ b/libs/CommunityID/Controller/Action.php @@ -1,7 +1,7 @@ _config->metadata->description) { + $this->view->headMeta()->appendName('description', $this->_config->metadata->description); + } + if (@$this->_config->metadata->keywords) { + $this->view->headMeta()->appendName('keywords', $this->_config->metadata->keywords); + } + self::$_metasRendered = true; + } + Zend_Controller_Action_HelperBroker::addPrefix('CommunityID_Controller_Action_Helper'); } protected function _setBase() { if ($this->_config->subdomain->enabled) { - $protocol = $this->getProtocol(); + $protocol = self::getProtocol(); $this->view->base = "$protocol://" . ($this->_config->subdomain->use_www? 'www.' : '') @@ -45,11 +62,18 @@ abstract class CommunityID_Controller_Action extends Monkeys_Controller_Action $this->targetUser = $users->createRow(); } else { if ($userId != $this->user->id && $this->user->role != Users_Model_User::ROLE_ADMIN) { - $this->_helper->FlashMessenger->addMessage('Error: Invalid user id'); + $this->_helper->FlashMessenger->addMessage($this->view->translate('Error: Invalid user id')); $this->_redirect('profile/edit'); } + $users = new Users_Model_Users(); $this->targetUser = $users->getRowInstance($userId); + + if ($this->_config->ldap->enabled) { + $ldap = Monkeys_Ldap::getInstance(); + $ldapUserData = $ldap->get("cn={$this->targetUser->username},{$this->_config->ldap->baseDn}"); + $this->targetUser->overrideWithLdapData($ldapUserData, true); + } } } @@ -59,9 +83,60 @@ abstract class CommunityID_Controller_Action extends Monkeys_Controller_Action protected function _redirectToNormalConnection() { if ($this->_config->SSL->enable_mixed_mode) { - $this->_redirect('http://' . $_SERVER['HTTP_HOST'] . $this->view->base); + if ($this->_config->subdomain->enabled) { + // in this case $this->view->base contains the full URL, so we just gotta replace the protocol + $this->_redirect('http' . substr($this->view->base, strpos($this->view->base, '://'))); + } else { + $this->_redirect('http://' . $_SERVER['HTTP_HOST'] . $this->view->base); + } } else { $this->_redirect(''); } } + + /** + * Circumvent PHP's automatic replacement of dots by underscore in var names in $_GET and $_POST + */ + protected function _queryString() + { + $unfilteredVars = array_merge($_GET, $_POST); + $varsTemp = array(); + $vars = array(); + $extensions = array(); + foreach ($unfilteredVars as $key => $value) { + if ($key == 'password') { + continue; + } + + if (substr($key, 0, 10) == 'openid_ns_') { + $extensions[] = substr($key, 10); + $varsTemp[str_replace('openid_ns_', 'openid.ns.', $key)] = $value; + } else { + $varsTemp[str_replace('openid_', 'openid.', $key)] = $value; + } + } + foreach ($extensions as $extension) { + foreach ($varsTemp as $key => $value) { + if (strpos($key, "openid.$extension") === 0) { + $prefix = "openid.$extension."; + $key = $prefix . substr($key, strlen($prefix)); + } + $vars[$key] = $value; + } + } + if (!$extensions) { + $vars = $varsTemp; + } + + return '?' . http_build_query($vars); + } + + protected function _getOpenIdProvider() + { + $connection = new CommunityID_OpenId_DatabaseConnection(Zend_Registry::get('db')); + $store = new Auth_OpenID_MySQLStore($connection, 'associations', 'nonces'); + $server = new Auth_OpenID_Server($store, $this->_helper->ProviderUrl($this->_config)); + + return $server; + } } diff --git a/libs/CommunityID/Controller/Action/Helper/ProviderUrl.php b/libs/CommunityID/Controller/Action/Helper/ProviderUrl.php index e10a06c..63c27b0 100644 --- a/libs/CommunityID/Controller/Action/Helper/ProviderUrl.php +++ b/libs/CommunityID/Controller/Action/Helper/ProviderUrl.php @@ -1,7 +1,7 @@ subdomain->enabled) { - $protocol = $this->_actionController->getProtocol(); + $protocol = Monkeys_Controller_Action::getProtocol(); preg_match('#(.*)\.'.$config->subdomain->hostname.'#', $currentUrl, $matches); return "$protocol://" diff --git a/libs/CommunityID/OpenId/DatabaseConnection.php b/libs/CommunityID/OpenId/DatabaseConnection.php index d0973c2..d416e51 100644 --- a/libs/CommunityID/OpenId/DatabaseConnection.php +++ b/libs/CommunityID/OpenId/DatabaseConnection.php @@ -1,7 +1,7 @@ environment->template; + if ($template == 'default') { + $template = ''; + } else { + $template = "_$template"; + } + + if (file_exists(APP_DIR . "/resources$template/$locale/$fileName")) { + $file = APP_DIR . "/resources$template/$locale/$fileName"; + } else if (count($localeElements == 2) + && file_exists(APP_DIR . "/resources$template/{$localeElements[0]}/$fileName")) { + $file = APP_DIR . "/resources$template/{$localeElements[0]}/$fileName"; + } else if (file_exists(APP_DIR . "/resources$template/en/$fileName")){ + $file = APP_DIR . "/resources$template/en/$fileName"; + } else if (file_exists(APP_DIR . "/resources/$locale/$fileName")) { + $file = APP_DIR . "/resources/$locale/$fileName"; + } else if (count($localeElements == 2) + && file_exists(APP_DIR . "/resources/{$localeElements[0]}/$fileName")) { + $file = APP_DIR . "/resources/{$localeElements[0]}/$fileName"; + } else if (file_exists(APP_DIR . "/resources/en/$fileName")){ + $file = APP_DIR . "/resources/en/$fileName"; + } else { + throw new Exception("Resource $fileName could not be found"); + } + + return $file; + } +} diff --git a/libs/CommunityID/UpgradeStage.php b/libs/CommunityID/UpgradeStage.php new file mode 100644 index 0000000..3942861 --- /dev/null +++ b/libs/CommunityID/UpgradeStage.php @@ -0,0 +1,31 @@ +_user = $user; + $this->_view = $view; + $this->_db = $db; + } + + public function requirements() + { + return array(); + } + + abstract function proceed(); +} diff --git a/libs/MODIFICATIONS.txt b/libs/MODIFICATIONS.txt index 37b5207..2bff075 100644 --- a/libs/MODIFICATIONS.txt +++ b/libs/MODIFICATIONS.txt @@ -1,5 +1,6 @@ Modifications to the jpgraph lib: - this is just the src directory - - copied the README, VERSION and QPL.txt files + - copied the README and VERSION files - removed the Examples dir - removed the flags* files + - added fonts path in file jpg-config.inc.php, line 43 diff --git a/libs/Monkeys/AccessDeniedException.php b/libs/Monkeys/AccessDeniedException.php index 0b0f879..b4f0d10 100644 --- a/libs/Monkeys/AccessDeniedException.php +++ b/libs/Monkeys/AccessDeniedException.php @@ -1,11 +1,10 @@ setOptions($options); + if ($identity !== null) { + $this->setIdentity($identity); + } + if ($password !== null) { + $this->setPassword($password); + } + } + + public function setOptions($options) + { + $this->_options = is_array($options) ? $options : array(); + return $this; + } + + public function getOptions() + { + return $this->_options; + } + + public function getIdentity() + { + return $this->_identity; + } + + public function setIdentity($identity) + { + $this->_identity = (string) $identity; + return $this; + } + + public function getPassword() + { + return $this->_password; + } + + public function setPassword($password) + { + $this->_password = (string) $password; + return $this; + } + + public function setCredential($credential) + { + return $this->setPassword($credential); + } + + public function authenticate() + { + if (strlen ($this->_password) < self::TOKEN_SIZE + self::MIN_IDENTITY_SIZE) { + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, + $this->_identity, + array('Provided Yubikey is too short') + ); + } + + $identity = substr ($this->_password, 0, strlen ($this->_password) - self::TOKEN_SIZE); + + $this->_options['yubiClient'] = new Yubico_Auth( + $this->_options['api_id'], + $this->_options['api_key'] + ); + + try { + $auth = $this->_options['yubiClient']->verify($this->_password); + return new Zend_Auth_Result( + Zend_Auth_Result::SUCCESS, + $this->_identity + ); + } catch (Zend_Exception $e) { + return new Zend_Auth_Result( + Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, + $this->_identity, + array($e->getMessage(), 'Yubico response: ' . $this->_options['yubiClient']->getLastResponse()) + ); + } + } +} diff --git a/libs/Monkeys/BadUrlException.php b/libs/Monkeys/BadUrlException.php old mode 100755 new mode 100644 index 17bd408..a428545 --- a/libs/Monkeys/BadUrlException.php +++ b/libs/Monkeys/BadUrlException.php @@ -1,11 +1,10 @@ log('Route used: ' . Application::$front->getRouter()->getCurrentRouteName(), Zend_Log::DEBUG); $this->_config = Zend_Registry::get('config'); $this->_settings = new Model_Settings(); @@ -43,7 +52,9 @@ abstract class Monkeys_Controller_Action extends Zend_Controller_Action $this->view->addHelperPath('libs/Monkeys/View/Helper', 'Monkeys_View_Helper'); $this->view->setUseStreamWrapper(true); - $this->_setScriptPaths(); + $this->_addCustomTemplatePath(); + $this->view->addBasePath(APP_DIR . '/views'); + $this->_addCustomTemplatePath(); $this->_setBase(); $this->view->numCols = $this->_numCols; @@ -59,6 +70,8 @@ abstract class Monkeys_Controller_Action extends Zend_Controller_Action $this->view->nextAction = ''; } + $this->view->messages = $this->_helper->FlashMessenger->getMessages(); + if ($this->getRequest()->isXmlHttpRequest()) { $slowdown = $this->_config->environment->ajax_slowdown; if ($slowdown > 0) { @@ -67,7 +80,6 @@ abstract class Monkeys_Controller_Action extends Zend_Controller_Action $this->_helper->layout->disableLayout(); } else { $this->view->version = Application::VERSION; - $this->view->messages = $this->_helper->FlashMessenger->getMessages(); $this->view->loaderCombine = $this->_config->environment->YDN? 'true' : 'false'; $this->view->loaderBase = $this->_config->environment->YDN? 'http://yui.yahooapis.com/2.7.0/build/' @@ -82,7 +94,7 @@ abstract class Monkeys_Controller_Action extends Zend_Controller_Action $this->view->title = $this->_title; } - private function _setScriptPaths() + private function _addCustomTemplatePath() { if (($template = $this->_config->environment->template) == 'default') { return; @@ -149,7 +161,7 @@ abstract class Monkeys_Controller_Action extends Zend_Controller_Action return parent::_redirect($url, $options); } - public function getProtocol() + public static function getProtocol() { if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { return 'https'; diff --git a/libs/Monkeys/Controller/Error.php b/libs/Monkeys/Controller/Error.php index 05455f4..00eea84 100644 --- a/libs/Monkeys/Controller/Error.php +++ b/libs/Monkeys/Controller/Error.php @@ -1,5 +1,13 @@ getResponse()->setRawHeader('HTTP/1.1 404 Not Found'); - $this->view->message = 'The URL you entered is incorrect. Please correct and try again.'; + $this->view->message = $this->_getTranslationForException($exceptionClass); break; case 'Monkeys_AccessDeniedException'; $this->getResponse()->setRawHeader('HTTP/1.1 401 Unauthorized'); - $this->view->message = 'Access Denied - Maybe your session has expired? Try logging-in again.'; + $this->view->message = $this->_getTranslationForException($exceptionClass); break; default: $this->view->message = get_class($errors->exception) . '
' . $errors->exception->getMessage(); @@ -37,7 +45,8 @@ abstract class Monkeys_Controller_Error extends Monkeys_Controller_Action } else if ($this->_config->email->adminemail) { $mail = self::getMail($errors->exception, $this->user, $errors); $mail->send(); - $this->view->message .= '
The system administrator has been notified.'; + $this->view->message .= "
\n"; + $this->view->message .= 'The system administrator has been notified.'; } break; } @@ -110,4 +119,23 @@ EOD; protected function _validateTargetUser() { } + + /** + * Returns translation for an exception message + * + * Override using your translation engine. + */ + protected function _getTranslationForException($ex) + { + switch ($ex) { + case 'Monkeys_BadUrlException': + return 'The URL you entered is incorrect. Please correct and try again.'; + break; + case 'Monkeys_AccessDeniedException': + return 'Access Denied - Maybe your session has expired? Try logging-in again.'; + break; + default: + return $ex; + } + } } diff --git a/libs/Monkeys/Controller/Plugin/Auth.php b/libs/Monkeys/Controller/Plugin/Auth.php old mode 100755 new mode 100644 index 9e6ddb1..80f027f --- a/libs/Monkeys/Controller/Plugin/Auth.php +++ b/libs/Monkeys/Controller/Plugin/Auth.php @@ -1,5 +1,13 @@ getModuleName() . '_' . $request->getControllerName(); if (!$this->_acl->has($resource)) { - //echo "role: " . $user->role . " - resource: $resource - privilege: " . $request->getActionName() . "
\n"; + //echo "role: " . $user->role . " - resource: $resource - privilege: " . $request->getActionName() . "
\n";exit; throw new Monkeys_BadUrlException($this->getRequest()->getRequestUri()); } // if an admin is not allowed for this action, then the action doesn't exist if (!$this->_acl->isAllowed(Users_Model_User::ROLE_ADMIN, $resource, $request->getActionName())) { - //echo "role: " . $user->role . " - resource: $resource - privilege: " . $request->getActionName() . "
\n"; + //echo "role: " . $user->role . " - resource: $resource - privilege: " . $request->getActionName() . "
\n";exit; throw new Monkeys_BadUrlException($this->getRequest()->getRequestUri()); } if (!$this->_acl->isAllowed($user->role, $resource, $request->getActionName())) { - //echo "role: " . $user->role . " - resource: $resource - privilege: " . $request->getActionName() . "
\n"; + //echo "role: " . $user->role . " - resource: $resource - privilege: " . $request->getActionName() . "
\n";exit; throw new Monkeys_AccessDeniedException(); } } diff --git a/libs/Monkeys/Db/Profiler.php b/libs/Monkeys/Db/Profiler.php old mode 100755 new mode 100644 index 474e88b..ad99e0e --- a/libs/Monkeys/Db/Profiler.php +++ b/libs/Monkeys/Db/Profiler.php @@ -1,5 +1,13 @@ fetchRow($this->select()->where('id = ?', $id)); + return $this->find($id)->current(); + } + + public function getRandomRowInstance(Projects_Model_Project $project) + { + $select = $this->select()->where('project_id=?', $project->id)->order(new Zend_Db_Expr('RAND()')); + + return $this->fetchRow($select); } } diff --git a/libs/Monkeys/Dictionaries/english.txt b/libs/Monkeys/Dictionaries/english.txt new file mode 100644 index 0000000..32e1486 --- /dev/null +++ b/libs/Monkeys/Dictionaries/english.txt @@ -0,0 +1,234936 @@ +A +a +aa +aal +aalii +aam +Aani +aardvark +aardwolf +Aaron +Aaronic +Aaronical +Aaronite +Aaronitic +Aaru +Ab +aba +Ababdeh +Ababua +abac +abaca +abacate +abacay +abacinate +abacination +abaciscus +abacist +aback +abactinal +abactinally +abaction +abactor +abaculus +abacus +Abadite +abaff +abaft +abaisance +abaiser +abaissed +abalienate +abalienation +abalone +Abama +abampere +abandon +abandonable +abandoned +abandonedly +abandonee +abandoner +abandonment +Abanic +Abantes +abaptiston +Abarambo +Abaris +abarthrosis +abarticular +abarticulation +abas +abase +abased +abasedly +abasedness +abasement +abaser +Abasgi +abash +abashed +abashedly +abashedness +abashless +abashlessly +abashment +abasia +abasic +abask +Abassin +abastardize +abatable +abate +abatement +abater +abatis +abatised +abaton +abator +abattoir +Abatua +abature +abave +abaxial +abaxile +abaze +abb +Abba +abbacomes +abbacy +Abbadide +abbas +abbasi +abbassi +Abbasside +abbatial +abbatical +abbess +abbey +abbeystede +Abbie +abbot +abbotcy +abbotnullius +abbotship +abbreviate +abbreviately +abbreviation +abbreviator +abbreviatory +abbreviature +Abby +abcoulomb +abdal +abdat +Abderian +Abderite +abdest +abdicable +abdicant +abdicate +abdication +abdicative +abdicator +Abdiel +abditive +abditory +abdomen +abdominal +Abdominales +abdominalian +abdominally +abdominoanterior +abdominocardiac +abdominocentesis +abdominocystic +abdominogenital +abdominohysterectomy +abdominohysterotomy +abdominoposterior +abdominoscope +abdominoscopy +abdominothoracic +abdominous +abdominovaginal +abdominovesical +abduce +abducens +abducent +abduct +abduction +abductor +Abe +abeam +abear +abearance +abecedarian +abecedarium +abecedary +abed +abeigh +Abel +abele +Abelia +Abelian +Abelicea +Abelite +abelite +Abelmoschus +abelmosk +Abelonian +abeltree +Abencerrages +abenteric +abepithymia +Aberdeen +aberdevine +Aberdonian +Aberia +aberrance +aberrancy +aberrant +aberrate +aberration +aberrational +aberrator +aberrometer +aberroscope +aberuncator +abet +abetment +abettal +abettor +abevacuation +abey +abeyance +abeyancy +abeyant +abfarad +abhenry +abhiseka +abhominable +abhor +abhorrence +abhorrency +abhorrent +abhorrently +abhorrer +abhorrible +abhorring +Abhorson +abidal +abidance +abide +abider +abidi +abiding +abidingly +abidingness +Abie +Abies +abietate +abietene +abietic +abietin +Abietineae +abietineous +abietinic +Abiezer +Abigail +abigail +abigailship +abigeat +abigeus +abilao +ability +abilla +abilo +abintestate +abiogenesis +abiogenesist +abiogenetic +abiogenetical +abiogenetically +abiogenist +abiogenous +abiogeny +abiological +abiologically +abiology +abiosis +abiotic +abiotrophic +abiotrophy +Abipon +abir +abirritant +abirritate +abirritation +abirritative +abiston +Abitibi +abiuret +abject +abjectedness +abjection +abjective +abjectly +abjectness +abjoint +abjudge +abjudicate +abjudication +abjunction +abjunctive +abjuration +abjuratory +abjure +abjurement +abjurer +abkar +abkari +Abkhas +Abkhasian +ablach +ablactate +ablactation +ablare +ablastemic +ablastous +ablate +ablation +ablatitious +ablatival +ablative +ablator +ablaut +ablaze +able +ableeze +ablegate +ableness +ablepharia +ablepharon +ablepharous +Ablepharus +ablepsia +ableptical +ableptically +abler +ablest +ablewhackets +ablins +abloom +ablow +ablude +abluent +ablush +ablution +ablutionary +abluvion +ably +abmho +Abnaki +abnegate +abnegation +abnegative +abnegator +Abner +abnerval +abnet +abneural +abnormal +abnormalism +abnormalist +abnormality +abnormalize +abnormally +abnormalness +abnormity +abnormous +abnumerable +Abo +aboard +Abobra +abode +abodement +abody +abohm +aboil +abolish +abolisher +abolishment +abolition +abolitionary +abolitionism +abolitionist +abolitionize +abolla +aboma +abomasum +abomasus +abominable +abominableness +abominably +abominate +abomination +abominator +abomine +Abongo +aboon +aborad +aboral +aborally +abord +aboriginal +aboriginality +aboriginally +aboriginary +aborigine +abort +aborted +aborticide +abortient +abortifacient +abortin +abortion +abortional +abortionist +abortive +abortively +abortiveness +abortus +abouchement +abound +abounder +abounding +aboundingly +about +abouts +above +aboveboard +abovedeck +aboveground +aboveproof +abovestairs +abox +abracadabra +abrachia +abradant +abrade +abrader +Abraham +Abrahamic +Abrahamidae +Abrahamite +Abrahamitic +abraid +Abram +Abramis +abranchial +abranchialism +abranchian +Abranchiata +abranchiate +abranchious +abrasax +abrase +abrash +abrasiometer +abrasion +abrasive +abrastol +abraum +abraxas +abreact +abreaction +abreast +abrenounce +abret +abrico +abridge +abridgeable +abridged +abridgedly +abridger +abridgment +abrim +abrin +abristle +abroach +abroad +Abrocoma +abrocome +abrogable +abrogate +abrogation +abrogative +abrogator +Abroma +Abronia +abrook +abrotanum +abrotine +abrupt +abruptedly +abruption +abruptly +abruptness +Abrus +Absalom +absampere +Absaroka +absarokite +abscess +abscessed +abscession +abscessroot +abscind +abscise +abscision +absciss +abscissa +abscissae +abscisse +abscission +absconce +abscond +absconded +abscondedly +abscondence +absconder +absconsa +abscoulomb +absence +absent +absentation +absentee +absenteeism +absenteeship +absenter +absently +absentment +absentmindedly +absentness +absfarad +abshenry +Absi +absinthe +absinthial +absinthian +absinthiate +absinthic +absinthin +absinthine +absinthism +absinthismic +absinthium +absinthol +absit +absmho +absohm +absolute +absolutely +absoluteness +absolution +absolutism +absolutist +absolutistic +absolutistically +absolutive +absolutization +absolutize +absolutory +absolvable +absolvatory +absolve +absolvent +absolver +absolvitor +absolvitory +absonant +absonous +absorb +absorbability +absorbable +absorbed +absorbedly +absorbedness +absorbefacient +absorbency +absorbent +absorber +absorbing +absorbingly +absorbition +absorpt +absorptance +absorptiometer +absorptiometric +absorption +absorptive +absorptively +absorptiveness +absorptivity +absquatulate +abstain +abstainer +abstainment +abstemious +abstemiously +abstemiousness +abstention +abstentionist +abstentious +absterge +abstergent +abstersion +abstersive +abstersiveness +abstinence +abstinency +abstinent +abstinential +abstinently +abstract +abstracted +abstractedly +abstractedness +abstracter +abstraction +abstractional +abstractionism +abstractionist +abstractitious +abstractive +abstractively +abstractiveness +abstractly +abstractness +abstractor +abstrahent +abstricted +abstriction +abstruse +abstrusely +abstruseness +abstrusion +abstrusity +absume +absumption +absurd +absurdity +absurdly +absurdness +absvolt +Absyrtus +abterminal +abthain +abthainrie +abthainry +abthanage +Abu +abu +abucco +abulia +abulic +abulomania +abuna +abundance +abundancy +abundant +Abundantia +abundantly +abura +aburabozu +aburban +aburst +aburton +abusable +abuse +abusedly +abusee +abuseful +abusefully +abusefulness +abuser +abusion +abusious +abusive +abusively +abusiveness +abut +Abuta +Abutilon +abutment +abuttal +abutter +abutting +abuzz +abvolt +abwab +aby +abysm +abysmal +abysmally +abyss +abyssal +Abyssinian +abyssobenthonic +abyssolith +abyssopelagic +acacatechin +acacatechol +acacetin +Acacia +Acacian +acaciin +acacin +academe +academial +academian +Academic +academic +academical +academically +academicals +academician +academicism +academism +academist +academite +academization +academize +Academus +academy +Acadia +acadialite +Acadian +Acadie +Acaena +acajou +acaleph +Acalepha +Acalephae +acalephan +acalephoid +acalycal +acalycine +acalycinous +acalyculate +Acalypha +Acalypterae +Acalyptrata +Acalyptratae +acalyptrate +Acamar +acampsia +acana +acanaceous +acanonical +acanth +acantha +Acanthaceae +acanthaceous +acanthad +Acantharia +Acanthia +acanthial +acanthin +acanthine +acanthion +acanthite +acanthocarpous +Acanthocephala +acanthocephalan +Acanthocephali +acanthocephalous +Acanthocereus +acanthocladous +Acanthodea +acanthodean +Acanthodei +Acanthodes +acanthodian +Acanthodidae +Acanthodii +Acanthodini +acanthoid +Acantholimon +acanthological +acanthology +acantholysis +acanthoma +Acanthomeridae +acanthon +Acanthopanax +Acanthophis +acanthophorous +acanthopod +acanthopodous +acanthopomatous +acanthopore +acanthopteran +Acanthopteri +acanthopterous +acanthopterygian +Acanthopterygii +acanthosis +acanthous +Acanthuridae +Acanthurus +acanthus +acapnia +acapnial +acapsular +acapu +acapulco +acara +Acarapis +acardia +acardiac +acari +acarian +acariasis +acaricidal +acaricide +acarid +Acarida +Acaridea +acaridean +acaridomatium +acariform +Acarina +acarine +acarinosis +acarocecidium +acarodermatitis +acaroid +acarol +acarologist +acarology +acarophilous +acarophobia +acarotoxic +acarpelous +acarpous +Acarus +Acastus +acatalectic +acatalepsia +acatalepsy +acataleptic +acatallactic +acatamathesia +acataphasia +acataposis +acatastasia +acatastatic +acate +acategorical +acatery +acatharsia +acatharsy +acatholic +acaudal +acaudate +acaulescent +acauline +acaulose +acaulous +acca +accede +accedence +acceder +accelerable +accelerando +accelerant +accelerate +accelerated +acceleratedly +acceleration +accelerative +accelerator +acceleratory +accelerograph +accelerometer +accend +accendibility +accendible +accension +accensor +accent +accentless +accentor +accentuable +accentual +accentuality +accentually +accentuate +accentuation +accentuator +accentus +accept +acceptability +acceptable +acceptableness +acceptably +acceptance +acceptancy +acceptant +acceptation +accepted +acceptedly +accepter +acceptilate +acceptilation +acception +acceptive +acceptor +acceptress +accerse +accersition +accersitor +access +accessarily +accessariness +accessary +accessaryship +accessibility +accessible +accessibly +accession +accessional +accessioner +accessive +accessively +accessless +accessorial +accessorily +accessoriness +accessorius +accessory +accidence +accidency +accident +accidental +accidentalism +accidentalist +accidentality +accidentally +accidentalness +accidented +accidential +accidentiality +accidently +accidia +accidie +accinge +accipient +Accipiter +accipitral +accipitrary +Accipitres +accipitrine +accismus +accite +acclaim +acclaimable +acclaimer +acclamation +acclamator +acclamatory +acclimatable +acclimatation +acclimate +acclimatement +acclimation +acclimatizable +acclimatization +acclimatize +acclimatizer +acclimature +acclinal +acclinate +acclivitous +acclivity +acclivous +accloy +accoast +accoil +accolade +accoladed +accolated +accolent +accolle +accombination +accommodable +accommodableness +accommodate +accommodately +accommodateness +accommodating +accommodatingly +accommodation +accommodational +accommodative +accommodativeness +accommodator +accompanier +accompaniment +accompanimental +accompanist +accompany +accompanyist +accompletive +accomplice +accompliceship +accomplicity +accomplish +accomplishable +accomplished +accomplisher +accomplishment +accomplisht +accompt +accord +accordable +accordance +accordancy +accordant +accordantly +accorder +according +accordingly +accordion +accordionist +accorporate +accorporation +accost +accostable +accosted +accouche +accouchement +accoucheur +accoucheuse +account +accountability +accountable +accountableness +accountably +accountancy +accountant +accountantship +accounting +accountment +accouple +accouplement +accouter +accouterment +accoy +accredit +accreditate +accreditation +accredited +accreditment +accrementitial +accrementition +accresce +accrescence +accrescent +accretal +accrete +accretion +accretionary +accretive +accroach +accroides +accrual +accrue +accruement +accruer +accubation +accubitum +accubitus +accultural +acculturate +acculturation +acculturize +accumbency +accumbent +accumber +accumulable +accumulate +accumulation +accumulativ +accumulative +accumulatively +accumulativeness +accumulator +accuracy +accurate +accurately +accurateness +accurse +accursed +accursedly +accursedness +accusable +accusably +accusal +accusant +accusation +accusatival +accusative +accusatively +accusatorial +accusatorially +accusatory +accusatrix +accuse +accused +accuser +accusingly +accusive +accustom +accustomed +accustomedly +accustomedness +ace +aceacenaphthene +aceanthrene +aceanthrenequinone +acecaffine +aceconitic +acedia +acediamine +acediast +acedy +Aceldama +Acemetae +Acemetic +acenaphthene +acenaphthenyl +acenaphthylene +acentric +acentrous +aceologic +aceology +acephal +Acephala +acephalan +Acephali +acephalia +Acephalina +acephaline +acephalism +acephalist +Acephalite +acephalocyst +acephalous +acephalus +Acer +Aceraceae +aceraceous +Acerae +Acerata +acerate +Acerates +acerathere +Aceratherium +aceratosis +acerb +Acerbas +acerbate +acerbic +acerbity +acerdol +acerin +acerose +acerous +acerra +acertannin +acervate +acervately +acervation +acervative +acervose +acervuline +acervulus +acescence +acescency +acescent +aceship +acesodyne +Acestes +acetabular +Acetabularia +acetabuliferous +acetabuliform +acetabulous +acetabulum +acetacetic +acetal +acetaldehydase +acetaldehyde +acetaldehydrase +acetalization +acetalize +acetamide +acetamidin +acetamidine +acetamido +acetaminol +acetanilid +acetanilide +acetanion +acetaniside +acetanisidide +acetannin +acetarious +acetarsone +acetate +acetated +acetation +acetbromamide +acetenyl +acethydrazide +acetic +acetification +acetifier +acetify +acetimeter +acetimetry +acetin +acetize +acetmethylanilide +acetnaphthalide +acetoacetanilide +acetoacetate +acetoacetic +acetoamidophenol +acetoarsenite +Acetobacter +acetobenzoic +acetobromanilide +acetochloral +acetocinnamene +acetoin +acetol +acetolysis +acetolytic +acetometer +acetometrical +acetometrically +acetometry +acetomorphine +acetonaphthone +acetonate +acetonation +acetone +acetonemia +acetonemic +acetonic +acetonitrile +acetonization +acetonize +acetonuria +acetonurometer +acetonyl +acetonylacetone +acetonylidene +acetophenetide +acetophenin +acetophenine +acetophenone +acetopiperone +acetopyrin +acetosalicylic +acetose +acetosity +acetosoluble +acetothienone +acetotoluide +acetotoluidine +acetous +acetoveratrone +acetoxime +acetoxyl +acetoxyphthalide +acetphenetid +acetphenetidin +acetract +acettoluide +acetum +aceturic +acetyl +acetylacetonates +acetylacetone +acetylamine +acetylate +acetylation +acetylator +acetylbenzene +acetylbenzoate +acetylbenzoic +acetylbiuret +acetylcarbazole +acetylcellulose +acetylcholine +acetylcyanide +acetylenation +acetylene +acetylenediurein +acetylenic +acetylenyl +acetylfluoride +acetylglycine +acetylhydrazine +acetylic +acetylide +acetyliodide +acetylizable +acetylization +acetylize +acetylizer +acetylmethylcarbinol +acetylperoxide +acetylphenol +acetylphenylhydrazine +acetylrosaniline +acetylsalicylate +acetylsalol +acetyltannin +acetylthymol +acetyltropeine +acetylurea +ach +Achaean +Achaemenian +Achaemenid +Achaemenidae +Achaemenidian +Achaenodon +Achaeta +achaetous +achage +Achagua +Achakzai +achalasia +Achamoth +Achango +achar +Achariaceae +Achariaceous +achate +Achates +Achatina +Achatinella +Achatinidae +ache +acheilia +acheilous +acheiria +acheirous +acheirus +Achen +achene +achenial +achenium +achenocarp +achenodium +acher +Achernar +Acheronian +Acherontic +Acherontical +achete +Achetidae +Acheulean +acheweed +achievable +achieve +achievement +achiever +achigan +achilary +achill +Achillea +Achillean +Achilleid +achilleine +Achillize +achillobursitis +achillodynia +achime +Achimenes +Achinese +aching +achingly +achira +Achitophel +achlamydate +Achlamydeae +achlamydeous +achlorhydria +achlorophyllous +achloropsia +Achmetha +acholia +acholic +Acholoe +acholous +acholuria +acholuric +Achomawi +achondrite +achondritic +achondroplasia +achondroplastic +achor +achordal +Achordata +achordate +Achorion +Achras +achree +achroacyte +Achroanthes +achrodextrin +achrodextrinase +achroglobin +achroiocythaemia +achroiocythemia +achroite +achroma +achromacyte +achromasia +achromat +achromate +Achromatiaceae +achromatic +achromatically +achromaticity +achromatin +achromatinic +achromatism +Achromatium +achromatizable +achromatization +achromatize +achromatocyte +achromatolysis +achromatope +achromatophile +achromatopia +achromatopsia +achromatopsy +achromatosis +achromatous +achromaturia +achromia +achromic +Achromobacter +Achromobacterieae +achromoderma +achromophilous +achromotrichia +achromous +achronical +achroodextrin +achroodextrinase +achroous +achropsia +achtehalber +achtel +achtelthaler +Achuas +achy +achylia +achylous +achymia +achymous +Achyranthes +Achyrodes +acichloride +acicula +acicular +acicularly +aciculate +aciculated +aciculum +acid +Acidanthera +Acidaspis +acidemia +acider +acidic +acidiferous +acidifiable +acidifiant +acidific +acidification +acidifier +acidify +acidimeter +acidimetric +acidimetrical +acidimetrically +acidimetry +acidite +acidity +acidize +acidly +acidness +acidoid +acidology +acidometer +acidometry +acidophile +acidophilic +acidophilous +acidoproteolytic +acidosis +acidosteophyte +acidotic +acidproof +acidulate +acidulent +acidulous +aciduric +acidyl +acier +acierage +Acieral +acierate +acieration +aciform +aciliate +aciliated +Acilius +acinaceous +acinaces +acinacifolious +acinaciform +acinar +acinarious +acinary +Acineta +Acinetae +acinetan +Acinetaria +acinetarian +acinetic +acinetiform +Acinetina +acinetinan +acinic +aciniform +acinose +acinotubular +acinous +acinus +Acipenser +Acipenseres +acipenserid +Acipenseridae +acipenserine +acipenseroid +Acipenseroidei +Acis +aciurgy +acker +ackey +ackman +acknow +acknowledge +acknowledgeable +acknowledged +acknowledgedly +acknowledger +aclastic +acle +acleidian +acleistous +Aclemon +aclidian +aclinal +aclinic +acloud +aclys +Acmaea +Acmaeidae +acmatic +acme +acmesthesia +acmic +Acmispon +acmite +acne +acneform +acneiform +acnemia +Acnida +acnodal +acnode +Acocanthera +acocantherin +acock +acockbill +acocotl +Acoela +Acoelomata +acoelomate +acoelomatous +Acoelomi +acoelomous +acoelous +Acoemetae +Acoemeti +Acoemetic +acoin +acoine +Acolapissa +acold +Acolhua +Acolhuan +acologic +acology +acolous +acoluthic +acolyte +acolythate +Acoma +acoma +acomia +acomous +aconative +acondylose +acondylous +acone +aconic +aconin +aconine +aconital +aconite +aconitia +aconitic +aconitin +aconitine +Aconitum +Acontias +acontium +Acontius +aconuresis +acopic +acopon +acopyrin +acopyrine +acor +acorea +acoria +acorn +acorned +Acorus +acosmic +acosmism +acosmist +acosmistic +acotyledon +acotyledonous +acouasm +acouchi +acouchy +acoumeter +acoumetry +acouometer +acouophonia +acoupa +acousmata +acousmatic +acoustic +acoustical +acoustically +acoustician +acousticolateral +Acousticon +acoustics +acquaint +acquaintance +acquaintanceship +acquaintancy +acquaintant +acquainted +acquaintedness +acquest +acquiesce +acquiescement +acquiescence +acquiescency +acquiescent +acquiescently +acquiescer +acquiescingly +acquirability +acquirable +acquire +acquired +acquirement +acquirenda +acquirer +acquisible +acquisite +acquisited +acquisition +acquisitive +acquisitively +acquisitiveness +acquisitor +acquisitum +acquist +acquit +acquitment +acquittal +acquittance +acquitter +Acrab +acracy +acraein +Acraeinae +acraldehyde +Acrania +acranial +acraniate +acrasia +Acrasiaceae +Acrasiales +Acrasida +Acrasieae +Acraspeda +acraspedote +acratia +acraturesis +acrawl +acraze +acre +acreable +acreage +acreak +acream +acred +Acredula +acreman +acrestaff +acrid +acridan +acridian +acridic +Acrididae +Acridiidae +acridine +acridinic +acridinium +acridity +Acridium +acridly +acridness +acridone +acridonium +acridophagus +acridyl +acriflavin +acriflavine +acrimonious +acrimoniously +acrimoniousness +acrimony +acrindoline +acrinyl +acrisia +Acrisius +Acrita +acritan +acrite +acritical +acritol +Acroa +acroaesthesia +acroama +acroamatic +acroamatics +acroanesthesia +acroarthritis +acroasphyxia +acroataxia +acroatic +acrobacy +acrobat +Acrobates +acrobatholithic +acrobatic +acrobatical +acrobatically +acrobatics +acrobatism +acroblast +acrobryous +acrobystitis +Acrocarpi +acrocarpous +acrocephalia +acrocephalic +acrocephalous +acrocephaly +Acrocera +Acroceratidae +Acroceraunian +Acroceridae +Acrochordidae +Acrochordinae +acrochordon +Acroclinium +Acrocomia +acroconidium +acrocontracture +acrocoracoid +acrocyanosis +acrocyst +acrodactylum +acrodermatitis +acrodont +acrodontism +acrodrome +acrodromous +Acrodus +acrodynia +acroesthesia +acrogamous +acrogamy +acrogen +acrogenic +acrogenous +acrogenously +acrography +Acrogynae +acrogynae +acrogynous +acrolein +acrolith +acrolithan +acrolithic +acrologic +acrologically +acrologism +acrologue +acrology +acromania +acromastitis +acromegalia +acromegalic +acromegaly +acromelalgia +acrometer +acromial +acromicria +acromioclavicular +acromiocoracoid +acromiodeltoid +acromiohumeral +acromiohyoid +acromion +acromioscapular +acromiosternal +acromiothoracic +acromonogrammatic +acromphalus +Acromyodi +acromyodian +acromyodic +acromyodous +acromyotonia +acromyotonus +acron +acronarcotic +acroneurosis +acronical +acronically +acronyc +acronych +Acronycta +acronyctous +acronym +acronymic +acronymize +acronymous +acronyx +acrook +acroparalysis +acroparesthesia +acropathology +acropathy +acropetal +acropetally +acrophobia +acrophonetic +acrophonic +acrophony +acropodium +acropoleis +acropolis +acropolitan +Acropora +acrorhagus +acrorrheuma +acrosarc +acrosarcum +acroscleriasis +acroscleroderma +acroscopic +acrose +acrosome +acrosphacelus +acrospire +acrospore +acrosporous +across +acrostic +acrostical +acrostically +acrostichal +Acrosticheae +acrostichic +acrostichoid +Acrostichum +acrosticism +acrostolion +acrostolium +acrotarsial +acrotarsium +acroteleutic +acroterial +acroteric +acroterium +Acrothoracica +acrotic +acrotism +acrotomous +Acrotreta +Acrotretidae +acrotrophic +acrotrophoneurosis +Acrux +Acrydium +acryl +acrylaldehyde +acrylate +acrylic +acrylonitrile +acrylyl +act +acta +actability +actable +Actaea +Actaeaceae +Actaeon +Actaeonidae +Actiad +Actian +actification +actifier +actify +actin +actinal +actinally +actinautographic +actinautography +actine +actinenchyma +acting +Actinia +actinian +Actiniaria +actiniarian +actinic +actinically +Actinidia +Actinidiaceae +actiniferous +actiniform +actinine +actiniochrome +actiniohematin +Actiniomorpha +actinism +Actinistia +actinium +actinobacillosis +Actinobacillus +actinoblast +actinobranch +actinobranchia +actinocarp +actinocarpic +actinocarpous +actinochemistry +actinocrinid +Actinocrinidae +actinocrinite +Actinocrinus +actinocutitis +actinodermatitis +actinodielectric +actinodrome +actinodromous +actinoelectric +actinoelectrically +actinoelectricity +actinogonidiate +actinogram +actinograph +actinography +actinoid +Actinoida +Actinoidea +actinolite +actinolitic +actinologous +actinologue +actinology +actinomere +actinomeric +actinometer +actinometric +actinometrical +actinometry +actinomorphic +actinomorphous +actinomorphy +Actinomyces +Actinomycetaceae +Actinomycetales +actinomycete +actinomycetous +actinomycin +actinomycoma +actinomycosis +actinomycotic +Actinomyxidia +Actinomyxidiida +actinon +Actinonema +actinoneuritis +actinophone +actinophonic +actinophore +actinophorous +actinophryan +Actinophrys +Actinopoda +actinopraxis +actinopteran +Actinopteri +actinopterous +actinopterygian +Actinopterygii +actinopterygious +actinoscopy +actinosoma +actinosome +Actinosphaerium +actinost +actinostereoscopy +actinostomal +actinostome +actinotherapeutic +actinotherapeutics +actinotherapy +actinotoxemia +actinotrichium +actinotrocha +actinouranium +Actinozoa +actinozoal +actinozoan +actinozoon +actinula +action +actionable +actionably +actional +actionary +actioner +actionize +actionless +Actipylea +Actium +activable +activate +activation +activator +active +actively +activeness +activin +activism +activist +activital +activity +activize +actless +actomyosin +acton +actor +actorship +actress +Acts +actu +actual +actualism +actualist +actualistic +actuality +actualization +actualize +actually +actualness +actuarial +actuarially +actuarian +actuary +actuaryship +actuation +actuator +acture +acturience +actutate +acuaesthesia +Acuan +acuate +acuation +Acubens +acuclosure +acuductor +acuesthesia +acuity +aculea +Aculeata +aculeate +aculeated +aculeiform +aculeolate +aculeolus +aculeus +acumen +acuminate +acumination +acuminose +acuminous +acuminulate +acupress +acupressure +acupunctuate +acupunctuation +acupuncturation +acupuncturator +acupuncture +acurative +acushla +acutangular +acutate +acute +acutely +acutenaculum +acuteness +acutiator +acutifoliate +Acutilinguae +acutilingual +acutilobate +acutiplantar +acutish +acutograve +acutonodose +acutorsion +acyanoblepsia +acyanopsia +acyclic +acyesis +acyetic +acyl +acylamido +acylamidobenzene +acylamino +acylate +acylation +acylogen +acyloin +acyloxy +acyloxymethane +acyrological +acyrology +acystia +ad +Ada +adactyl +adactylia +adactylism +adactylous +Adad +adad +adage +adagial +adagietto +adagio +Adai +Adaize +Adam +adamant +adamantean +adamantine +adamantinoma +adamantoblast +adamantoblastoma +adamantoid +adamantoma +adamas +Adamastor +adambulacral +adamellite +Adamhood +Adamic +Adamical +Adamically +adamine +Adamite +adamite +Adamitic +Adamitical +Adamitism +Adamsia +adamsite +adance +adangle +Adansonia +Adapa +adapid +Adapis +adapt +adaptability +adaptable +adaptation +adaptational +adaptationally +adaptative +adaptedness +adapter +adaption +adaptional +adaptionism +adaptitude +adaptive +adaptively +adaptiveness +adaptometer +adaptor +adaptorial +Adar +adarme +adat +adati +adatom +adaunt +adaw +adawe +adawlut +adawn +adaxial +aday +adays +adazzle +adcraft +add +Adda +adda +addability +addable +addax +addebted +added +addedly +addend +addenda +addendum +adder +adderbolt +adderfish +adderspit +adderwort +addibility +addible +addicent +addict +addicted +addictedness +addiction +Addie +addiment +Addisonian +Addisoniana +additament +additamentary +addition +additional +additionally +additionary +additionist +addititious +additive +additively +additivity +additory +addle +addlebrain +addlebrained +addlehead +addleheaded +addleheadedly +addleheadedness +addlement +addleness +addlepate +addlepated +addlepatedness +addleplot +addlings +addlins +addorsed +address +addressee +addresser +addressful +Addressograph +addressor +addrest +Addu +adduce +adducent +adducer +adducible +adduct +adduction +adductive +adductor +Addy +Ade +ade +adead +adeem +adeep +Adela +Adelaide +Adelarthra +Adelarthrosomata +adelarthrosomatous +Adelbert +Adelea +Adeleidae +Adelges +Adelia +Adelina +Adeline +adeling +adelite +Adeliza +adelocerous +Adelochorda +adelocodonic +adelomorphic +adelomorphous +adelopod +Adelops +Adelphi +Adelphian +adelphogamy +Adelphoi +adelpholite +adelphophagy +ademonist +adempted +ademption +adenalgia +adenalgy +Adenanthera +adenase +adenasthenia +adendric +adendritic +adenectomy +adenectopia +adenectopic +adenemphractic +adenemphraxis +adenia +adeniform +adenine +adenitis +adenization +adenoacanthoma +adenoblast +adenocancroid +adenocarcinoma +adenocarcinomatous +adenocele +adenocellulitis +adenochondroma +adenochondrosarcoma +adenochrome +adenocyst +adenocystoma +adenocystomatous +adenodermia +adenodiastasis +adenodynia +adenofibroma +adenofibrosis +adenogenesis +adenogenous +adenographer +adenographic +adenographical +adenography +adenohypersthenia +adenoid +adenoidal +adenoidism +adenoliomyofibroma +adenolipoma +adenolipomatosis +adenologaditis +adenological +adenology +adenolymphocele +adenolymphoma +adenoma +adenomalacia +adenomatome +adenomatous +adenomeningeal +adenometritis +adenomycosis +adenomyofibroma +adenomyoma +adenomyxoma +adenomyxosarcoma +adenoncus +adenoneural +adenoneure +adenopathy +adenopharyngeal +adenopharyngitis +adenophlegmon +Adenophora +adenophore +adenophorous +adenophthalmia +adenophyllous +adenophyma +adenopodous +adenosarcoma +adenosclerosis +adenose +adenosine +adenosis +adenostemonous +Adenostoma +adenotome +adenotomic +adenotomy +adenotyphoid +adenotyphus +adenyl +adenylic +Adeodatus +Adeona +Adephaga +adephagan +adephagia +adephagous +adept +adeptness +adeptship +adequacy +adequate +adequately +adequateness +adequation +adequative +adermia +adermin +Adessenarian +adet +adevism +adfected +adfix +adfluxion +adglutinate +Adhafera +adhaka +adhamant +Adhara +adharma +adhere +adherence +adherency +adherent +adherently +adherer +adherescence +adherescent +adhesion +adhesional +adhesive +adhesively +adhesivemeter +adhesiveness +adhibit +adhibition +adiabatic +adiabatically +adiabolist +adiactinic +adiadochokinesis +adiagnostic +adiantiform +Adiantum +adiaphon +adiaphonon +adiaphoral +adiaphoresis +adiaphoretic +adiaphorism +adiaphorist +adiaphoristic +adiaphorite +adiaphoron +adiaphorous +adiate +adiathermal +adiathermancy +adiathermanous +adiathermic +adiathetic +adiation +Adib +Adicea +adicity +Adiel +adieu +adieux +Adigei +Adighe +Adigranth +adigranth +Adin +Adinida +adinidan +adinole +adion +adipate +adipescent +adipic +adipinic +adipocele +adipocellulose +adipocere +adipoceriform +adipocerous +adipocyte +adipofibroma +adipogenic +adipogenous +adipoid +adipolysis +adipolytic +adipoma +adipomatous +adipometer +adipopexia +adipopexis +adipose +adiposeness +adiposis +adiposity +adiposogenital +adiposuria +adipous +adipsia +adipsic +adipsous +adipsy +adipyl +Adirondack +adit +adital +aditus +adjacency +adjacent +adjacently +adjag +adject +adjection +adjectional +adjectival +adjectivally +adjective +adjectively +adjectivism +adjectivitis +adjiger +adjoin +adjoined +adjoinedly +adjoining +adjoint +adjourn +adjournal +adjournment +adjudge +adjudgeable +adjudger +adjudgment +adjudicate +adjudication +adjudicative +adjudicator +adjudicature +adjunct +adjunction +adjunctive +adjunctively +adjunctly +adjuration +adjuratory +adjure +adjurer +adjust +adjustable +adjustably +adjustage +adjustation +adjuster +adjustive +adjustment +adjutage +adjutancy +adjutant +adjutantship +adjutorious +adjutory +adjutrice +adjuvant +adlay +adless +adlet +Adlumia +adlumidine +adlumine +adman +admarginate +admaxillary +admeasure +admeasurement +admeasurer +admedial +admedian +admensuration +admi +adminicle +adminicula +adminicular +adminiculary +adminiculate +adminiculation +adminiculum +administer +administerd +administerial +administrable +administrant +administrate +administration +administrational +administrative +administratively +administrator +administratorship +administratress +administratrices +administratrix +admirability +admirable +admirableness +admirably +admiral +admiralship +admiralty +admiration +admirative +admirator +admire +admired +admiredly +admirer +admiring +admiringly +admissibility +admissible +admissibleness +admissibly +admission +admissive +admissory +admit +admittable +admittance +admitted +admittedly +admittee +admitter +admittible +admix +admixtion +admixture +admonish +admonisher +admonishingly +admonishment +admonition +admonitioner +admonitionist +admonitive +admonitively +admonitor +admonitorial +admonitorily +admonitory +admonitrix +admortization +adnascence +adnascent +adnate +adnation +adnephrine +adnerval +adneural +adnex +adnexal +adnexed +adnexitis +adnexopexy +adnominal +adnominally +adnomination +adnoun +ado +adobe +adolesce +adolescence +adolescency +adolescent +adolescently +Adolph +Adolphus +Adonai +Adonean +Adonia +Adoniad +Adonian +Adonic +adonidin +adonin +Adoniram +Adonis +adonite +adonitol +adonize +adoperate +adoperation +adopt +adoptability +adoptable +adoptant +adoptative +adopted +adoptedly +adoptee +adopter +adoptian +adoptianism +adoptianist +adoption +adoptional +adoptionism +adoptionist +adoptious +adoptive +adoptively +adorability +adorable +adorableness +adorably +adoral +adorally +adorant +Adorantes +adoration +adoratory +adore +adorer +Adoretus +adoringly +adorn +adorner +adorningly +adornment +adosculation +adossed +adoulie +adown +Adoxa +Adoxaceae +adoxaceous +adoxography +adoxy +adoze +adpao +adpress +adpromission +adradial +adradially +adradius +Adramelech +Adrammelech +adread +adream +adreamed +adreamt +adrectal +adrenal +adrenalectomize +adrenalectomy +Adrenalin +adrenaline +adrenalize +adrenalone +adrenergic +adrenin +adrenine +adrenochrome +adrenocortical +adrenocorticotropic +adrenolysis +adrenolytic +adrenotropic +Adrian +Adriana +Adriatic +Adrienne +adrift +adrip +adroit +adroitly +adroitness +adroop +adrop +adrostral +adrowse +adrue +adry +adsbud +adscendent +adscititious +adscititiously +adscript +adscripted +adscription +adscriptitious +adscriptitius +adscriptive +adsessor +adsheart +adsignification +adsignify +adsmith +adsmithing +adsorb +adsorbable +adsorbate +adsorbent +adsorption +adsorptive +adstipulate +adstipulation +adstipulator +adterminal +adtevac +adular +adularescence +adularia +adulate +adulation +adulator +adulatory +adulatress +Adullam +Adullamite +adult +adulter +adulterant +adulterate +adulterately +adulterateness +adulteration +adulterator +adulterer +adulteress +adulterine +adulterize +adulterous +adulterously +adultery +adulthood +adulticidal +adulticide +adultness +adultoid +adumbral +adumbrant +adumbrate +adumbration +adumbrative +adumbratively +adunc +aduncate +aduncated +aduncity +aduncous +adusk +adust +adustion +adustiosis +Advaita +advance +advanceable +advanced +advancedness +advancement +advancer +advancing +advancingly +advancive +advantage +advantageous +advantageously +advantageousness +advection +advectitious +advective +advehent +advene +advenience +advenient +Advent +advential +Adventism +Adventist +adventitia +adventitious +adventitiously +adventitiousness +adventive +adventual +adventure +adventureful +adventurement +adventurer +adventureship +adventuresome +adventuresomely +adventuresomeness +adventuress +adventurish +adventurous +adventurously +adventurousness +adverb +adverbial +adverbiality +adverbialize +adverbially +adverbiation +adversant +adversaria +adversarious +adversary +adversative +adversatively +adverse +adversely +adverseness +adversifoliate +adversifolious +adversity +advert +advertence +advertency +advertent +advertently +advertisable +advertise +advertisee +advertisement +advertiser +advertising +advice +adviceful +advisability +advisable +advisableness +advisably +advisal +advisatory +advise +advised +advisedly +advisedness +advisee +advisement +adviser +advisership +advisive +advisiveness +advisor +advisorily +advisory +advocacy +advocate +advocateship +advocatess +advocation +advocator +advocatory +advocatress +advocatrice +advocatrix +advolution +advowee +advowson +ady +adynamia +adynamic +adynamy +adyta +adyton +adytum +adz +adze +adzer +adzooks +ae +Aeacides +Aeacus +Aeaean +Aechmophorus +aecial +Aecidiaceae +aecidial +aecidioform +Aecidiomycetes +aecidiospore +aecidiostage +aecidium +aeciospore +aeciostage +aecioteliospore +aeciotelium +aecium +aedeagus +Aedes +aedicula +aedile +aedileship +aedilian +aedilic +aedilitian +aedility +aedoeagus +aefald +aefaldness +aefaldy +aefauld +aegagropila +aegagropile +aegagrus +Aegean +aegerian +aegeriid +Aegeriidae +Aegialitis +aegicrania +Aegina +Aeginetan +Aeginetic +Aegipan +aegirine +aegirinolite +aegirite +aegis +Aegisthus +Aegithalos +Aegithognathae +aegithognathism +aegithognathous +Aegle +Aegopodium +aegrotant +aegyptilla +aegyrite +aeluroid +Aeluroidea +aelurophobe +aelurophobia +aeluropodous +aenach +aenean +aeneolithic +aeneous +aenigmatite +aeolharmonica +Aeolia +Aeolian +Aeolic +Aeolicism +aeolid +Aeolidae +Aeolididae +aeolina +aeoline +aeolipile +Aeolis +Aeolism +Aeolist +aeolistic +aeolodicon +aeolodion +aeolomelodicon +aeolopantalon +aeolotropic +aeolotropism +aeolotropy +aeolsklavier +aeon +aeonial +aeonian +aeonist +Aepyceros +Aepyornis +Aepyornithidae +Aepyornithiformes +Aequi +Aequian +Aequiculi +Aequipalpia +aequoreal +aer +aerage +aerarian +aerarium +aerate +aeration +aerator +aerenchyma +aerenterectasia +aerial +aerialist +aeriality +aerially +aerialness +aeric +aerical +Aerides +aerie +aeried +aerifaction +aeriferous +aerification +aeriform +aerify +aero +Aerobacter +aerobate +aerobatic +aerobatics +aerobe +aerobian +aerobic +aerobically +aerobiologic +aerobiological +aerobiologically +aerobiologist +aerobiology +aerobion +aerobiont +aerobioscope +aerobiosis +aerobiotic +aerobiotically +aerobious +aerobium +aeroboat +Aerobranchia +aerobranchiate +aerobus +aerocamera +aerocartograph +Aerocharidae +aerocolpos +aerocraft +aerocurve +aerocyst +aerodermectasia +aerodone +aerodonetic +aerodonetics +aerodrome +aerodromics +aerodynamic +aerodynamical +aerodynamicist +aerodynamics +aerodyne +aeroembolism +aeroenterectasia +aerofoil +aerogel +aerogen +aerogenes +aerogenesis +aerogenic +aerogenically +aerogenous +aerogeologist +aerogeology +aerognosy +aerogram +aerograph +aerographer +aerographic +aerographical +aerographics +aerography +aerogun +aerohydrodynamic +aerohydropathy +aerohydroplane +aerohydrotherapy +aerohydrous +aeroides +aerolite +aerolith +aerolithology +aerolitic +aerolitics +aerologic +aerological +aerologist +aerology +aeromaechanic +aeromancer +aeromancy +aeromantic +aeromarine +aeromechanical +aeromechanics +aerometeorograph +aerometer +aerometric +aerometry +aeromotor +aeronat +aeronaut +aeronautic +aeronautical +aeronautically +aeronautics +aeronautism +aeronef +aeroneurosis +aeropathy +Aerope +aeroperitoneum +aeroperitonia +aerophagia +aerophagist +aerophagy +aerophane +aerophilatelic +aerophilatelist +aerophilately +aerophile +aerophilic +aerophilous +aerophobia +aerophobic +aerophone +aerophor +aerophore +aerophotography +aerophysical +aerophysics +aerophyte +aeroplane +aeroplaner +aeroplanist +aeropleustic +aeroporotomy +aeroscepsis +aeroscepsy +aeroscope +aeroscopic +aeroscopically +aeroscopy +aerose +aerosiderite +aerosiderolite +Aerosol +aerosol +aerosphere +aerosporin +aerostat +aerostatic +aerostatical +aerostatics +aerostation +aerosteam +aerotactic +aerotaxis +aerotechnical +aerotherapeutics +aerotherapy +aerotonometer +aerotonometric +aerotonometry +aerotropic +aerotropism +aeroyacht +aeruginous +aerugo +aery +aes +Aeschylean +Aeschynanthus +Aeschynomene +aeschynomenous +Aesculaceae +aesculaceous +Aesculapian +Aesculapius +Aesculus +Aesopian +Aesopic +aesthete +aesthetic +aesthetical +aesthetically +aesthetician +aestheticism +aestheticist +aestheticize +aesthetics +aesthiology +aesthophysiology +Aestii +aethalioid +aethalium +aetheogam +aetheogamic +aetheogamous +aethered +Aethionema +aethogen +aethrioscope +Aethusa +Aetian +aetiogenic +aetiotropic +aetiotropically +Aetobatidae +Aetobatus +Aetolian +Aetomorphae +aetosaur +aetosaurian +Aetosaurus +aevia +aface +afaint +Afar +afar +afara +afear +afeard +afeared +afebrile +Afenil +afernan +afetal +affa +affability +affable +affableness +affably +affabrous +affair +affaite +affect +affectable +affectate +affectation +affectationist +affected +affectedly +affectedness +affecter +affectibility +affectible +affecting +affectingly +affection +affectional +affectionally +affectionate +affectionately +affectionateness +affectioned +affectious +affective +affectively +affectivity +affeer +affeerer +affeerment +affeir +affenpinscher +affenspalte +afferent +affettuoso +affiance +affiancer +affiant +affidation +affidavit +affidavy +affiliable +affiliate +affiliation +affinal +affination +affine +affined +affinely +affinitative +affinitatively +affinite +affinition +affinitive +affinity +affirm +affirmable +affirmably +affirmance +affirmant +affirmation +affirmative +affirmatively +affirmatory +affirmer +affirmingly +affix +affixal +affixation +affixer +affixion +affixture +afflation +afflatus +afflict +afflicted +afflictedness +afflicter +afflicting +afflictingly +affliction +afflictionless +afflictive +afflictively +affluence +affluent +affluently +affluentness +afflux +affluxion +afforce +afforcement +afford +affordable +afforest +afforestable +afforestation +afforestment +afformative +affranchise +affranchisement +affray +affrayer +affreight +affreighter +affreightment +affricate +affricated +affrication +affricative +affright +affrighted +affrightedly +affrighter +affrightful +affrightfully +affrightingly +affrightment +affront +affronte +affronted +affrontedly +affrontedness +affronter +affronting +affrontingly +affrontingness +affrontive +affrontiveness +affrontment +affuse +affusion +affy +Afghan +afghani +afield +Afifi +afikomen +afire +aflagellar +aflame +aflare +aflat +aflaunt +aflicker +aflight +afloat +aflow +aflower +afluking +aflush +aflutter +afoam +afoot +afore +aforehand +aforenamed +aforesaid +aforethought +aforetime +aforetimes +afortiori +afoul +afraid +afraidness +Aframerican +Afrasia +Afrasian +afreet +afresh +afret +Afric +African +Africana +Africanism +Africanist +Africanization +Africanize +Africanoid +Africanthropus +Afridi +Afrikaans +Afrikander +Afrikanderdom +Afrikanderism +Afrikaner +Afrogaea +Afrogaean +afront +afrown +Afshah +Afshar +aft +aftaba +after +afteract +afterage +afterattack +afterband +afterbeat +afterbirth +afterblow +afterbody +afterbrain +afterbreach +afterbreast +afterburner +afterburning +aftercare +aftercareer +aftercast +aftercataract +aftercause +afterchance +afterchrome +afterchurch +afterclap +afterclause +aftercome +aftercomer +aftercoming +aftercooler +aftercost +aftercourse +aftercrop +aftercure +afterdamp +afterdate +afterdays +afterdeck +afterdinner +afterdrain +afterdrops +aftereffect +afterend +aftereye +afterfall +afterfame +afterfeed +afterfermentation +afterform +afterfriend +afterfruits +afterfuture +aftergame +aftergas +afterglide +afterglow +aftergo +aftergood +aftergrass +aftergrave +aftergrief +aftergrind +aftergrowth +afterguard +afterguns +afterhand +afterharm +afterhatch +afterhelp +afterhend +afterhold +afterhope +afterhours +afterimage +afterimpression +afterings +afterking +afterknowledge +afterlife +afterlifetime +afterlight +afterloss +afterlove +aftermark +aftermarriage +aftermass +aftermast +aftermath +aftermatter +aftermeal +aftermilk +aftermost +afternight +afternoon +afternoons +afternose +afternote +afteroar +afterpain +afterpart +afterpast +afterpeak +afterpiece +afterplanting +afterplay +afterpressure +afterproof +afterrake +afterreckoning +afterrider +afterripening +afterroll +afterschool +aftersend +aftersensation +aftershaft +aftershafted +aftershine +aftership +aftershock +aftersong +aftersound +afterspeech +afterspring +afterstain +afterstate +afterstorm +afterstrain +afterstretch +afterstudy +afterswarm +afterswarming +afterswell +aftertan +aftertask +aftertaste +afterthinker +afterthought +afterthoughted +afterthrift +aftertime +aftertimes +aftertouch +aftertreatment +aftertrial +afterturn +aftervision +afterwale +afterwar +afterward +afterwards +afterwash +afterwhile +afterwisdom +afterwise +afterwit +afterwitted +afterwork +afterworking +afterworld +afterwrath +afterwrist +aftmost +Aftonian +aftosa +aftward +aftwards +afunction +afunctional +afwillite +Afzelia +aga +agabanee +agacante +agacella +Agaces +Agade +Agag +again +against +againstand +agal +agalactia +agalactic +agalactous +agalawood +agalaxia +agalaxy +Agalena +Agalenidae +Agalinis +agalite +agalloch +agallochum +agallop +agalma +agalmatolite +agalwood +Agama +agama +Agamae +Agamemnon +agamete +agami +agamian +agamic +agamically +agamid +Agamidae +agamobium +agamogenesis +agamogenetic +agamogenetically +agamogony +agamoid +agamont +agamospore +agamous +agamy +aganglionic +Aganice +Aganippe +Agao +Agaonidae +Agapanthus +agape +Agapemone +Agapemonian +Agapemonist +Agapemonite +agapetae +agapeti +agapetid +Agapetidae +Agapornis +agar +agaric +agaricaceae +agaricaceous +Agaricales +agaricic +agariciform +agaricin +agaricine +agaricoid +Agaricus +Agaristidae +agarita +Agarum +agarwal +agasp +Agastache +Agastreae +agastric +agastroneuria +agate +agateware +Agatha +Agathaea +Agathaumas +agathin +Agathis +agathism +agathist +agathodaemon +agathodaemonic +agathokakological +agathology +Agathosma +agatiferous +agatiform +agatine +agatize +agatoid +agaty +Agau +Agave +agavose +Agawam +Agaz +agaze +agazed +Agdistis +age +aged +agedly +agedness +agee +Agelacrinites +Agelacrinitidae +Agelaius +Agelaus +ageless +agelessness +agelong +agen +Agena +agency +agenda +agendum +agenesia +agenesic +agenesis +agennetic +agent +agentess +agential +agentival +agentive +agentry +agentship +ageometrical +ager +Ageratum +ageusia +ageusic +ageustia +agger +aggerate +aggeration +aggerose +Aggie +agglomerant +agglomerate +agglomerated +agglomeratic +agglomeration +agglomerative +agglomerator +agglutinability +agglutinable +agglutinant +agglutinate +agglutination +agglutinationist +agglutinative +agglutinator +agglutinin +agglutinize +agglutinogen +agglutinogenic +agglutinoid +agglutinoscope +agglutogenic +aggradation +aggradational +aggrade +aggrandizable +aggrandize +aggrandizement +aggrandizer +aggrate +aggravate +aggravating +aggravatingly +aggravation +aggravative +aggravator +aggregable +aggregant +Aggregata +Aggregatae +aggregate +aggregately +aggregateness +aggregation +aggregative +aggregator +aggregatory +aggress +aggressin +aggression +aggressionist +aggressive +aggressively +aggressiveness +aggressor +aggrievance +aggrieve +aggrieved +aggrievedly +aggrievedness +aggrievement +aggroup +aggroupment +aggry +aggur +agha +Aghan +aghanee +aghast +aghastness +Aghlabite +Aghorapanthi +Aghori +Agialid +Agib +Agiel +agilawood +agile +agilely +agileness +agility +agillawood +aging +agio +agiotage +agist +agistator +agistment +agistor +agitable +agitant +agitate +agitatedly +agitation +agitational +agitationist +agitative +agitator +agitatorial +agitatrix +agitprop +Agkistrodon +agla +Aglaia +aglance +Aglaonema +Aglaos +aglaozonia +aglare +Aglaspis +Aglauros +agleaf +agleam +aglet +aglethead +agley +aglimmer +aglint +Aglipayan +Aglipayano +aglitter +aglobulia +Aglossa +aglossal +aglossate +aglossia +aglow +aglucon +aglutition +aglycosuric +Aglypha +aglyphodont +Aglyphodonta +Aglyphodontia +aglyphous +agmatine +agmatology +agminate +agminated +agnail +agname +agnamed +agnate +Agnatha +agnathia +agnathic +Agnathostomata +agnathostomatous +agnathous +agnatic +agnatically +agnation +agnel +Agnes +agnification +agnize +Agnoetae +Agnoete +Agnoetism +agnoiology +Agnoite +agnomen +agnomical +agnominal +agnomination +agnosia +agnosis +agnostic +agnostically +agnosticism +Agnostus +agnosy +Agnotozoic +agnus +ago +agog +agoge +agogic +agogics +agoho +agoing +agomensin +agomphiasis +agomphious +agomphosis +agon +agonal +agone +agoniada +agoniadin +agoniatite +Agoniatites +agonic +agonied +agonist +Agonista +agonistarch +agonistic +agonistically +agonistics +agonium +agonize +agonizedly +agonizer +agonizingly +Agonostomus +agonothete +agonothetic +agony +agora +agoranome +agoraphobia +agouara +agouta +agouti +agpaite +agpaitic +Agra +agraffee +agrah +agral +agrammatical +agrammatism +Agrania +agranulocyte +agranulocytosis +agranuloplastic +Agrapha +agraphia +agraphic +agrarian +agrarianism +agrarianize +agrarianly +Agrauleum +agre +agree +agreeability +agreeable +agreeableness +agreeably +agreed +agreeing +agreeingly +agreement +agreer +agregation +agrege +agrestal +agrestial +agrestian +agrestic +agria +agricere +agricole +agricolist +agricolite +agricolous +agricultor +agricultural +agriculturalist +agriculturally +agriculture +agriculturer +agriculturist +Agrilus +Agrimonia +agrimony +agrimotor +agrin +Agriochoeridae +Agriochoerus +agriological +agriologist +agriology +Agrionia +agrionid +Agrionidae +Agriotes +Agriotypidae +Agriotypus +agrise +agrito +agroan +agrobiologic +agrobiological +agrobiologically +agrobiologist +agrobiology +agrogeological +agrogeologically +agrogeology +agrologic +agrological +agrologically +agrology +agrom +Agromyza +agromyzid +Agromyzidae +agronome +agronomial +agronomic +agronomical +agronomics +agronomist +agronomy +agroof +agrope +Agropyron +Agrostemma +agrosteral +Agrostis +agrostographer +agrostographic +agrostographical +agrostography +agrostologic +agrostological +agrostologist +agrostology +agrotechny +Agrotis +aground +agrufe +agruif +agrypnia +agrypnotic +agsam +agua +aguacate +Aguacateca +aguavina +Agudist +ague +aguelike +agueproof +agueweed +aguey +aguilarite +aguilawood +aguinaldo +aguirage +aguish +aguishly +aguishness +agunah +agush +agust +agy +Agyieus +agynarious +agynary +agynous +agyrate +agyria +Ah +ah +aha +ahaaina +ahankara +Ahantchuyuk +ahartalav +ahaunch +ahead +aheap +ahem +Ahepatokla +Ahet +ahey +ahimsa +ahind +ahint +Ahir +ahluwalia +ahmadi +Ahmadiya +Ahnfeltia +aho +Ahom +ahong +ahorse +ahorseback +Ahousaht +ahoy +Ahrendahronon +Ahriman +Ahrimanian +ahsan +Aht +ahu +ahuatle +ahuehuete +ahull +ahum +ahungered +ahungry +ahunt +ahura +ahush +ahwal +ahypnia +ai +Aias +Aiawong +aichmophobia +aid +aidable +aidance +aidant +aide +Aidenn +aider +Aides +aidful +aidless +aiel +aigialosaur +Aigialosauridae +Aigialosaurus +aiglet +aigremore +aigrette +aiguille +aiguillesque +aiguillette +aiguilletted +aikinite +ail +ailantery +ailanthic +Ailanthus +ailantine +ailanto +aile +Aileen +aileron +ailette +Ailie +ailing +aillt +ailment +ailsyte +Ailuridae +ailuro +ailuroid +Ailuroidea +Ailuropoda +Ailuropus +Ailurus +ailweed +aim +Aimak +aimara +Aimee +aimer +aimful +aimfully +aiming +aimless +aimlessly +aimlessness +Aimore +aimworthiness +ainaleh +ainhum +ainoi +ainsell +aint +Ainu +aion +aionial +air +Aira +airable +airampo +airan +airbound +airbrained +airbrush +aircraft +aircraftman +aircraftsman +aircraftswoman +aircraftwoman +aircrew +aircrewman +airdock +airdrome +airdrop +aire +Airedale +airedale +airer +airfield +airfoil +airframe +airfreight +airfreighter +airgraphics +airhead +airiferous +airified +airily +airiness +airing +airish +airless +airlift +airlike +airliner +airmail +airman +airmanship +airmark +airmarker +airmonger +airohydrogen +airometer +airpark +airphobia +airplane +airplanist +airport +airproof +airscape +airscrew +airship +airsick +airsickness +airstrip +airt +airtight +airtightly +airtightness +airward +airwards +airway +airwayman +airwoman +airworthiness +airworthy +airy +aischrolatreia +aiseweed +aisle +aisled +aisleless +aisling +Aissaoua +Aissor +aisteoir +Aistopoda +Aistopodes +ait +aitch +aitchbone +aitchless +aitchpiece +aitesis +aithochroi +aition +aitiotropic +Aitkenite +Aitutakian +aiwan +Aix +aizle +Aizoaceae +aizoaceous +Aizoon +Ajaja +ajaja +ajangle +ajar +ajari +Ajatasatru +ajava +ajhar +ajivika +ajog +ajoint +ajowan +Ajuga +ajutment +ak +Aka +aka +Akal +akala +Akali +akalimba +akamatsu +Akamnik +Akan +Akanekunik +Akania +Akaniaceae +akaroa +akasa +Akawai +akazga +akazgine +akcheh +ake +akeake +akebi +Akebia +akee +akeki +akeley +akenobeite +akepiro +akerite +akey +Akha +Akhissar +Akhlame +Akhmimic +akhoond +akhrot +akhyana +akia +Akim +akimbo +akin +akindle +akinesia +akinesic +akinesis +akinete +akinetic +Akiskemikinik +Akiyenik +Akka +Akkad +Akkadian +Akkadist +akmudar +akmuddar +aknee +ako +akoasm +akoasma +akoluthia +akonge +Akontae +Akoulalion +akov +akpek +Akra +akra +Akrabattine +akroasis +akrochordite +akroterion +Aktistetae +Aktistete +Aktivismus +Aktivist +aku +akuammine +akule +akund +Akwapim +Al +al +ala +Alabama +Alabaman +Alabamian +alabamide +alabamine +alabandite +alabarch +alabaster +alabastos +alabastrian +alabastrine +alabastrites +alabastron +alabastrum +alacha +alack +alackaday +alacreatine +alacreatinine +alacrify +alacritous +alacrity +Alactaga +alada +Aladdin +Aladdinize +Aladfar +Aladinist +alaihi +alaite +Alaki +Alala +alala +alalite +alalonga +alalunga +alalus +Alamanni +Alamannian +Alamannic +alameda +alamo +alamodality +alamonti +alamosite +alamoth +Alan +alan +aland +Alangiaceae +alangin +alangine +Alangium +alani +alanine +alannah +Alans +alantic +alantin +alantol +alantolactone +alantolic +alanyl +alar +Alarbus +alares +Alaria +Alaric +alarm +alarmable +alarmed +alarmedly +alarming +alarmingly +alarmism +alarmist +Alarodian +alarum +alary +alas +Alascan +Alaska +alaskaite +Alaskan +alaskite +Alaster +alastrim +alate +alated +alatern +alaternus +alation +Alauda +Alaudidae +alaudine +Alaunian +Alawi +Alb +alb +alba +albacore +albahaca +Albainn +Alban +alban +Albanenses +Albanensian +Albania +Albanian +albanite +Albany +albarco +albardine +albarello +albarium +albaspidin +albata +Albatros +albatross +albe +albedo +albedograph +albee +albeit +Alberene +Albert +Alberta +albertin +Albertina +Albertine +Albertinian +Albertist +albertite +albertustaler +albertype +albescence +albescent +albespine +albetad +Albi +Albian +albicans +albicant +albication +albiculi +albification +albificative +albiflorous +albify +Albigenses +Albigensian +Albigensianism +Albin +albinal +albiness +albinic +albinism +albinistic +albino +albinoism +albinotic +albinuria +Albion +Albireo +albite +albitic +albitite +albitization +albitophyre +Albizzia +albocarbon +albocinereous +Albococcus +albocracy +Alboin +albolite +albolith +albopannin +albopruinose +alboranite +Albrecht +Albright +albronze +Albruna +Albuca +Albuginaceae +albuginea +albugineous +albuginitis +albugo +album +albumean +albumen +albumenization +albumenize +albumenizer +albumimeter +albumin +albuminate +albuminaturia +albuminiferous +albuminiform +albuminimeter +albuminimetry +albuminiparous +albuminization +albuminize +albuminocholia +albuminofibrin +albuminogenous +albuminoid +albuminoidal +albuminolysis +albuminometer +albuminometry +albuminone +albuminorrhea +albuminoscope +albuminose +albuminosis +albuminous +albuminousness +albuminuria +albuminuric +albumoid +albumoscope +albumose +albumosuria +alburn +alburnous +alburnum +albus +albutannin +Albyn +Alca +Alcaaba +Alcae +Alcaic +alcaide +alcalde +alcaldeship +alcaldia +Alcaligenes +alcalizate +Alcalzar +alcamine +alcanna +Alcantara +Alcantarines +alcarraza +alcatras +alcazar +Alcedines +Alcedinidae +Alcedininae +Alcedo +alcelaphine +Alcelaphus +Alces +alchemic +alchemical +alchemically +Alchemilla +alchemist +alchemistic +alchemistical +alchemistry +alchemize +alchemy +alchera +alcheringa +alchimy +alchitran +alchochoden +Alchornea +alchymy +Alcibiadean +Alcicornium +Alcidae +alcidine +alcine +Alcippe +alclad +alco +alcoate +alcogel +alcogene +alcohate +alcohol +alcoholate +alcoholature +alcoholdom +alcoholemia +alcoholic +alcoholically +alcoholicity +alcoholimeter +alcoholism +alcoholist +alcoholizable +alcoholization +alcoholize +alcoholmeter +alcoholmetric +alcoholomania +alcoholometer +alcoholometric +alcoholometrical +alcoholometry +alcoholophilia +alcoholuria +alcoholysis +alcoholytic +Alcor +Alcoran +Alcoranic +Alcoranist +alcornoco +alcornoque +alcosol +Alcotate +alcove +alcovinometer +Alcuinian +alcyon +Alcyonacea +alcyonacean +Alcyonaria +alcyonarian +Alcyone +Alcyones +Alcyoniaceae +alcyonic +alcyoniform +Alcyonium +alcyonoid +aldamine +aldane +aldazin +aldazine +aldeament +Aldebaran +aldebaranium +aldehol +aldehydase +aldehyde +aldehydic +aldehydine +aldehydrol +alder +Alderamin +alderman +aldermanate +aldermancy +aldermaness +aldermanic +aldermanical +aldermanity +aldermanlike +aldermanly +aldermanry +aldermanship +aldern +Alderney +alderwoman +Aldhafara +Aldhafera +aldim +aldime +aldimine +Aldine +aldine +aldoheptose +aldohexose +aldoketene +aldol +aldolization +aldolize +aldononose +aldopentose +aldose +aldoside +aldoxime +Aldrovanda +Aldus +ale +Alea +aleak +aleatory +alebench +aleberry +Alebion +alec +alecithal +alecize +Aleck +aleconner +alecost +Alectoria +alectoria +Alectorides +alectoridine +alectorioid +Alectoris +alectoromachy +alectoromancy +Alectoromorphae +alectoromorphous +Alectoropodes +alectoropodous +Alectrion +Alectrionidae +alectryomachy +alectryomancy +Alectryon +alecup +alee +alef +alefnull +aleft +alefzero +alegar +alehoof +alehouse +alem +alemana +Alemanni +Alemannian +Alemannic +Alemannish +alembic +alembicate +alembroth +Alemite +alemite +alemmal +alemonger +alen +Alencon +Aleochara +aleph +alephs +alephzero +alepidote +alepole +alepot +Aleppine +Aleppo +alerce +alerse +alert +alertly +alertness +alesan +alestake +aletap +aletaster +Alethea +alethiology +alethopteis +alethopteroid +alethoscope +aletocyte +Aletris +alette +aleukemic +Aleurites +aleuritic +Aleurobius +Aleurodes +Aleurodidae +aleuromancy +aleurometer +aleuronat +aleurone +aleuronic +aleuroscope +Aleut +Aleutian +Aleutic +aleutite +alevin +alewife +Alexander +alexanders +Alexandra +Alexandreid +Alexandrian +Alexandrianism +Alexandrina +Alexandrine +alexandrite +Alexas +Alexia +alexia +Alexian +alexic +alexin +alexinic +alexipharmacon +alexipharmacum +alexipharmic +alexipharmical +alexipyretic +Alexis +alexiteric +alexiterical +Alexius +aleyard +Aleyrodes +aleyrodid +Aleyrodidae +Alf +alf +alfa +alfaje +alfalfa +alfaqui +alfaquin +alfenide +alfet +alfilaria +alfileria +alfilerilla +alfilerillo +alfiona +Alfirk +alfonsin +alfonso +alforja +Alfred +Alfreda +alfresco +alfridaric +alfridary +Alfur +Alfurese +Alfuro +alga +algae +algaecide +algaeological +algaeologist +algaeology +algaesthesia +algaesthesis +algal +algalia +Algaroth +algarroba +algarrobilla +algarrobin +Algarsife +Algarsyf +algate +Algebar +algebra +algebraic +algebraical +algebraically +algebraist +algebraization +algebraize +Algedi +algedo +algedonic +algedonics +algefacient +Algenib +Algerian +Algerine +algerine +Algernon +algesia +algesic +algesis +algesthesis +algetic +Algic +algic +algid +algidity +algidness +Algieba +algific +algin +alginate +algine +alginic +alginuresis +algiomuscular +algist +algivorous +algocyan +algodoncillo +algodonite +algoesthesiometer +algogenic +algoid +Algol +algolagnia +algolagnic +algolagnist +algolagny +algological +algologist +algology +Algoman +algometer +algometric +algometrical +algometrically +algometry +Algomian +Algomic +Algonkian +Algonquian +Algonquin +algophilia +algophilist +algophobia +algor +Algorab +Algores +algorism +algorismic +algorist +algoristic +algorithm +algorithmic +algosis +algous +algovite +algraphic +algraphy +alguazil +algum +Algy +Alhagi +Alhambra +Alhambraic +Alhambresque +Alhena +alhenna +alias +Alibamu +alibangbang +alibi +alibility +alible +Alicant +Alice +alichel +Alichino +Alicia +Alick +alicoche +alictisal +alicyclic +Alida +alidade +Alids +alien +alienability +alienable +alienage +alienate +alienation +alienator +aliency +alienee +aliener +alienicola +alienigenate +alienism +alienist +alienize +alienor +alienship +aliethmoid +aliethmoidal +alif +aliferous +aliform +aligerous +alight +align +aligner +alignment +aligreek +aliipoe +alike +alikeness +alikewise +Alikuluf +Alikulufan +alilonghi +alima +aliment +alimental +alimentally +alimentariness +alimentary +alimentation +alimentative +alimentatively +alimentativeness +alimenter +alimentic +alimentive +alimentiveness +alimentotherapy +alimentum +alimonied +alimony +alin +alinasal +Aline +alineation +alintatao +aliofar +Alioth +alipata +aliped +aliphatic +alipterion +aliptes +aliptic +aliquant +aliquot +aliseptal +alish +alisier +Alisma +Alismaceae +alismaceous +alismad +alismal +Alismales +Alismataceae +alismoid +aliso +Alison +alison +alisonite +alisp +alisphenoid +alisphenoidal +alist +Alister +alit +alite +alitrunk +aliturgic +aliturgical +aliunde +alive +aliveness +alivincular +Alix +aliyah +alizarate +alizari +alizarin +aljoba +alk +alkahest +alkahestic +alkahestica +alkahestical +Alkaid +alkalamide +alkalemia +alkalescence +alkalescency +alkalescent +alkali +alkalic +alkaliferous +alkalifiable +alkalify +alkaligen +alkaligenous +alkalimeter +alkalimetric +alkalimetrical +alkalimetrically +alkalimetry +alkaline +alkalinity +alkalinization +alkalinize +alkalinuria +alkalizable +alkalizate +alkalization +alkalize +alkalizer +alkaloid +alkaloidal +alkalometry +alkalosis +alkalous +Alkalurops +alkamin +alkamine +alkane +alkanet +Alkanna +alkannin +Alkaphrah +alkapton +alkaptonuria +alkaptonuric +alkargen +alkarsin +alkekengi +alkene +alkenna +alkenyl +alkermes +Alkes +alkide +alkine +alkool +Alkoran +Alkoranic +alkoxide +alkoxy +alkoxyl +alky +alkyd +alkyl +alkylamine +alkylate +alkylation +alkylene +alkylic +alkylidene +alkylize +alkylogen +alkyloxy +alkyne +allabuta +allactite +allaeanthus +allagite +allagophyllous +allagostemonous +Allah +allalinite +Allamanda +allamotti +allan +allanite +allanitic +allantiasis +allantochorion +allantoic +allantoid +allantoidal +Allantoidea +allantoidean +allantoidian +allantoin +allantoinase +allantoinuria +allantois +allantoxaidin +allanturic +Allasch +allassotonic +allative +allatrate +allay +allayer +allayment +allbone +Alle +allecret +allectory +allegate +allegation +allegator +allege +allegeable +allegedly +allegement +alleger +Alleghenian +Allegheny +allegiance +allegiancy +allegiant +allegoric +allegorical +allegorically +allegoricalness +allegorism +allegorist +allegorister +allegoristic +allegorization +allegorize +allegorizer +allegory +allegretto +allegro +allele +allelic +allelism +allelocatalytic +allelomorph +allelomorphic +allelomorphism +allelotropic +allelotropism +allelotropy +alleluia +alleluiatic +allemand +allemande +allemontite +allenarly +allene +Allentiac +Allentiacan +aller +allergen +allergenic +allergia +allergic +allergin +allergist +allergy +allerion +allesthesia +alleviate +alleviatingly +alleviation +alleviative +alleviator +alleviatory +alley +alleyed +alleyite +alleyway +allgood +Allhallow +Allhallowtide +allheal +alliable +alliably +Alliaceae +alliaceous +alliance +alliancer +Alliaria +allicampane +allice +allicholly +alliciency +allicient +Allie +allied +Allies +allies +alligate +alligator +alligatored +allineate +allineation +Allionia +Allioniaceae +allision +alliteral +alliterate +alliteration +alliterational +alliterationist +alliterative +alliteratively +alliterativeness +alliterator +Allium +allivalite +allmouth +allness +Allobroges +allocable +allocaffeine +allocatable +allocate +allocatee +allocation +allocator +allochetia +allochetite +allochezia +allochiral +allochirally +allochiria +allochlorophyll +allochroic +allochroite +allochromatic +allochroous +allochthonous +allocinnamic +alloclase +alloclasite +allocochick +allocrotonic +allocryptic +allocute +allocution +allocutive +allocyanine +allodelphite +allodesmism +alloeosis +alloeostropha +alloeotic +alloerotic +alloerotism +allogamous +allogamy +allogene +allogeneity +allogeneous +allogenic +allogenically +allograph +alloiogenesis +alloisomer +alloisomeric +alloisomerism +allokinesis +allokinetic +allokurtic +allomerism +allomerous +allometric +allometry +allomorph +allomorphic +allomorphism +allomorphite +allomucic +allonomous +allonym +allonymous +allopalladium +allopath +allopathetic +allopathetically +allopathic +allopathically +allopathist +allopathy +allopatric +allopatrically +allopatry +allopelagic +allophanamide +allophanates +allophane +allophanic +allophone +allophyle +allophylian +allophylic +Allophylus +allophytoid +alloplasm +alloplasmatic +alloplasmic +alloplast +alloplastic +alloplasty +alloploidy +allopolyploid +allopsychic +alloquial +alloquialism +alloquy +allorhythmia +allorrhyhmia +allorrhythmic +allosaur +Allosaurus +allose +allosematic +allosome +allosyndesis +allosyndetic +allot +allotee +allotelluric +allotheism +Allotheria +allothigene +allothigenetic +allothigenetically +allothigenic +allothigenous +allothimorph +allothimorphic +allothogenic +allothogenous +allotment +allotriodontia +Allotriognathi +allotriomorphic +allotriophagia +allotriophagy +allotriuria +allotrope +allotrophic +allotropic +allotropical +allotropically +allotropicity +allotropism +allotropize +allotropous +allotropy +allotrylic +allottable +allottee +allotter +allotype +allotypical +allover +allow +allowable +allowableness +allowably +allowance +allowedly +allower +alloxan +alloxanate +alloxanic +alloxantin +alloxuraemia +alloxuremia +alloxuric +alloxyproteic +alloy +alloyage +allozooid +allseed +allspice +allthing +allthorn +alltud +allude +allure +allurement +allurer +alluring +alluringly +alluringness +allusion +allusive +allusively +allusiveness +alluvia +alluvial +alluviate +alluviation +alluvion +alluvious +alluvium +allwhere +allwhither +allwork +Allworthy +Ally +ally +allyl +allylamine +allylate +allylation +allylene +allylic +allylthiourea +Alma +alma +Almach +almaciga +almacigo +almadia +almadie +almagest +almagra +Almain +Alman +almanac +almandine +almandite +alme +almeidina +almemar +Almerian +almeriite +Almida +almightily +almightiness +almighty +almique +Almira +almirah +almochoden +Almohad +Almohade +Almohades +almoign +Almon +almon +almond +almondy +almoner +almonership +almonry +Almoravid +Almoravide +Almoravides +almost +almous +alms +almsdeed +almsfolk +almsful +almsgiver +almsgiving +almshouse +almsman +almswoman +almucantar +almuce +almud +almude +almug +Almuredin +almuten +aln +alnage +alnager +alnagership +Alnaschar +Alnascharism +alnein +alnico +Alnilam +alniresinol +Alnitak +Alnitham +alniviridol +alnoite +alnuin +Alnus +alo +Aloadae +Alocasia +alochia +alod +alodial +alodialism +alodialist +alodiality +alodially +alodian +alodiary +alodification +alodium +alody +aloe +aloed +aloelike +aloemodin +aloeroot +aloesol +aloeswood +aloetic +aloetical +aloewood +aloft +alogia +Alogian +alogical +alogically +alogism +alogy +aloid +aloin +Alois +aloisiite +aloma +alomancy +alone +aloneness +along +alongshore +alongshoreman +alongside +alongst +Alonso +Alonsoa +Alonzo +aloof +aloofly +aloofness +aloose +alop +alopecia +Alopecias +alopecist +alopecoid +Alopecurus +alopeke +Alopias +Alopiidae +Alosa +alose +Alouatta +alouatte +aloud +alow +alowe +Aloxite +Aloysia +Aloysius +alp +alpaca +alpasotes +Alpax +alpeen +Alpen +alpenglow +alpenhorn +alpenstock +alpenstocker +alpestral +alpestrian +alpestrine +alpha +alphabet +alphabetarian +alphabetic +alphabetical +alphabetically +alphabetics +alphabetiform +alphabetism +alphabetist +alphabetization +alphabetize +alphabetizer +Alphard +alphatoluic +Alphean +Alphecca +alphenic +Alpheratz +alphitomancy +alphitomorphous +alphol +Alphonist +Alphonse +Alphonsine +Alphonsism +Alphonso +alphorn +alphos +alphosis +alphyl +Alpian +Alpid +alpieu +alpigene +Alpine +alpine +alpinely +alpinery +alpinesque +Alpinia +Alpiniaceae +Alpinism +Alpinist +alpist +Alpujarra +alqueire +alquier +alquifou +alraun +alreadiness +already +alright +alrighty +alroot +alruna +Alsatia +Alsatian +alsbachite +Alshain +Alsinaceae +alsinaceous +Alsine +also +alsoon +Alsophila +Alstonia +alstonidine +alstonine +alstonite +Alstroemeria +alsweill +alt +Altaian +Altaic +Altaid +Altair +altaite +Altamira +altar +altarage +altared +altarist +altarlet +altarpiece +altarwise +altazimuth +alter +alterability +alterable +alterableness +alterably +alterant +alterate +alteration +alterative +altercate +altercation +altercative +alteregoism +alteregoistic +alterer +alterity +altern +alternacy +alternance +alternant +Alternanthera +Alternaria +alternariose +alternate +alternately +alternateness +alternating +alternatingly +alternation +alternationist +alternative +alternatively +alternativeness +alternativity +alternator +alterne +alternifoliate +alternipetalous +alternipinnate +alternisepalous +alternize +alterocentric +Althaea +althaein +Althea +althea +althein +altheine +althionic +altho +althorn +although +Altica +Alticamelus +altigraph +altilik +altiloquence +altiloquent +altimeter +altimetrical +altimetrically +altimetry +altin +altincar +Altingiaceae +altingiaceous +altininck +altiplano +altiscope +altisonant +altisonous +altissimo +altitude +altitudinal +altitudinarian +alto +altogether +altogetherness +altometer +altoun +altrices +altricial +altropathy +altrose +altruism +altruist +altruistic +altruistically +altschin +altun +Aluco +Aluconidae +Aluconinae +aludel +Aludra +alula +alular +alulet +Alulim +alum +alumbloom +Alumel +alumic +alumiferous +alumina +aluminaphone +aluminate +alumine +aluminic +aluminide +aluminiferous +aluminiform +aluminish +aluminite +aluminium +aluminize +aluminoferric +aluminographic +aluminography +aluminose +aluminosilicate +aluminosis +aluminosity +aluminothermic +aluminothermics +aluminothermy +aluminotype +aluminous +aluminum +aluminyl +alumish +alumite +alumium +alumna +alumnae +alumnal +alumni +alumniate +Alumnol +alumnus +alumohydrocalcite +alumroot +Alundum +aluniferous +alunite +alunogen +alupag +Alur +alure +alurgite +alushtite +aluta +alutaceous +Alvah +Alvan +alvar +alvearium +alveary +alveloz +alveola +alveolar +alveolariform +alveolary +alveolate +alveolated +alveolation +alveole +alveolectomy +alveoli +alveoliform +alveolite +Alveolites +alveolitis +alveoloclasia +alveolocondylean +alveolodental +alveololabial +alveololingual +alveolonasal +alveolosubnasal +alveolotomy +alveolus +alveus +alviducous +Alvin +Alvina +alvine +Alvissmal +alvite +alvus +alway +always +aly +Alya +alycompaine +alymphia +alymphopotent +alypin +alysson +Alyssum +alytarch +Alytes +am +ama +amaas +Amabel +amability +amacratic +amacrinal +amacrine +amadavat +amadelphous +Amadi +Amadis +amadou +Amaethon +Amafingo +amaga +amah +Amahuaca +amain +amaister +amakebe +Amakosa +amala +amalaita +amalaka +Amalfian +Amalfitan +amalgam +amalgamable +amalgamate +amalgamation +amalgamationist +amalgamative +amalgamatize +amalgamator +amalgamist +amalgamization +amalgamize +Amalings +Amalrician +amaltas +amamau +Amampondo +Amanda +amandin +Amandus +amang +amani +amania +Amanist +Amanita +amanitin +amanitine +Amanitopsis +amanori +amanous +amantillo +amanuenses +amanuensis +amapa +Amapondo +amar +Amara +Amarantaceae +amarantaceous +amaranth +Amaranthaceae +amaranthaceous +amaranthine +amaranthoid +Amaranthus +amarantite +Amarantus +amarelle +amarevole +amargoso +amarillo +amarin +amarine +amaritude +amarity +amaroid +amaroidal +amarthritis +amaryllid +Amaryllidaceae +amaryllidaceous +amaryllideous +Amaryllis +amasesis +amass +amassable +amasser +amassment +Amasta +amasthenic +amastia +amasty +Amatembu +amaterialistic +amateur +amateurish +amateurishly +amateurishness +amateurism +amateurship +Amati +amative +amatively +amativeness +amatol +amatorial +amatorially +amatorian +amatorious +amatory +amatrice +amatungula +amaurosis +amaurotic +amaze +amazed +amazedly +amazedness +amazeful +amazement +amazia +Amazilia +amazing +amazingly +Amazon +Amazona +Amazonian +Amazonism +amazonite +Amazulu +amba +ambage +ambagiosity +ambagious +ambagiously +ambagiousness +ambagitory +ambalam +amban +ambar +ambaree +ambarella +ambary +ambash +ambassade +Ambassadeur +ambassador +ambassadorial +ambassadorially +ambassadorship +ambassadress +ambassage +ambassy +ambatch +ambatoarinite +ambay +ambeer +amber +amberfish +ambergris +amberiferous +amberite +amberoid +amberous +ambery +ambicolorate +ambicoloration +ambidexter +ambidexterity +ambidextral +ambidextrous +ambidextrously +ambidextrousness +ambience +ambiency +ambiens +ambient +ambier +ambigenous +ambiguity +ambiguous +ambiguously +ambiguousness +ambilateral +ambilateralaterally +ambilaterality +ambilevous +ambilian +ambilogy +ambiopia +ambiparous +ambisinister +ambisinistrous +ambisporangiate +ambisyllabic +ambit +ambital +ambitendency +ambition +ambitionist +ambitionless +ambitionlessly +ambitious +ambitiously +ambitiousness +ambitty +ambitus +ambivalence +ambivalency +ambivalent +ambivert +amble +ambler +ambling +amblingly +amblotic +amblyacousia +amblyaphia +Amblycephalidae +Amblycephalus +amblychromatic +Amblydactyla +amblygeusia +amblygon +amblygonal +amblygonite +amblyocarpous +Amblyomma +amblyope +amblyopia +amblyopic +Amblyopsidae +Amblyopsis +amblyoscope +amblypod +Amblypoda +amblypodous +Amblyrhynchus +amblystegite +Amblystoma +ambo +amboceptoid +amboceptor +Ambocoelia +Amboina +Amboinese +ambomalleal +ambon +ambonite +Ambonnay +ambos +ambosexous +ambosexual +ambrain +ambrein +ambrette +Ambrica +ambrite +ambroid +ambrology +Ambrose +ambrose +ambrosia +ambrosiac +Ambrosiaceae +ambrosiaceous +ambrosial +ambrosially +Ambrosian +ambrosian +ambrosiate +ambrosin +ambrosine +Ambrosio +ambrosterol +ambrotype +ambry +ambsace +ambulacral +ambulacriform +ambulacrum +ambulance +ambulancer +ambulant +ambulate +ambulatio +ambulation +ambulative +ambulator +Ambulatoria +ambulatorial +ambulatorium +ambulatory +ambuling +ambulomancy +amburbial +ambury +ambuscade +ambuscader +ambush +ambusher +ambushment +Ambystoma +Ambystomidae +amchoor +ame +amebiform +ameed +ameen +Ameiuridae +Ameiurus +Ameiva +Amelanchier +amelcorn +Amelia +amelia +amelification +ameliorable +ameliorableness +ameliorant +ameliorate +amelioration +ameliorativ +ameliorative +ameliorator +amellus +ameloblast +ameloblastic +amelu +amelus +Amen +amen +amenability +amenable +amenableness +amenably +amend +amendable +amendableness +amendatory +amende +amender +amendment +amends +amene +amenia +Amenism +Amenite +amenity +amenorrhea +amenorrheal +amenorrheic +amenorrhoea +ament +amentaceous +amental +amentia +Amentiferae +amentiferous +amentiform +amentulum +amentum +amerce +amerceable +amercement +amercer +amerciament +America +American +Americana +Americanese +Americanism +Americanist +Americanistic +Americanitis +Americanization +Americanize +Americanizer +Americanly +Americanoid +Americaward +Americawards +americium +Americomania +Americophobe +Amerimnon +Amerind +Amerindian +Amerindic +amerism +ameristic +amesite +Ametabola +ametabole +ametabolia +ametabolian +ametabolic +ametabolism +ametabolous +ametaboly +ametallous +amethodical +amethodically +amethyst +amethystine +ametoecious +ametria +ametrometer +ametrope +ametropia +ametropic +ametrous +Amex +amgarn +amhar +amherstite +amhran +ami +Amia +amiability +amiable +amiableness +amiably +amianth +amianthiform +amianthine +Amianthium +amianthoid +amianthoidal +amianthus +amic +amicability +amicable +amicableness +amicably +amical +amice +amiced +amicicide +amicrobic +amicron +amicronucleate +amid +amidase +amidate +amidation +amide +amidic +amidid +amidide +amidin +amidine +Amidism +Amidist +amido +amidoacetal +amidoacetic +amidoacetophenone +amidoaldehyde +amidoazo +amidoazobenzene +amidoazobenzol +amidocaffeine +amidocapric +amidofluorid +amidofluoride +amidogen +amidoguaiacol +amidohexose +amidoketone +amidol +amidomyelin +amidon +amidophenol +amidophosphoric +amidoplast +amidoplastid +amidopyrine +amidosuccinamic +amidosulphonal +amidothiazole +amidoxime +amidoxy +amidoxyl +amidrazone +amidship +amidships +amidst +amidstream +amidulin +Amiidae +amil +Amiles +Amiloun +amimia +amimide +amin +aminate +amination +amine +amini +aminic +aminity +aminization +aminize +amino +aminoacetal +aminoacetanilide +aminoacetic +aminoacetone +aminoacetophenetidine +aminoacetophenone +aminoacidemia +aminoaciduria +aminoanthraquinone +aminoazobenzene +aminobarbituric +aminobenzaldehyde +aminobenzamide +aminobenzene +aminobenzoic +aminocaproic +aminodiphenyl +aminoethionic +aminoformic +aminogen +aminoglutaric +aminoguanidine +aminoid +aminoketone +aminolipin +aminolysis +aminolytic +aminomalonic +aminomyelin +aminophenol +aminoplast +aminoplastic +aminopropionic +aminopurine +aminopyrine +aminoquinoline +aminosis +aminosuccinamic +aminosulphonic +aminothiophen +aminovaleric +aminoxylol +Aminta +Amintor +Amioidei +amir +Amiranha +amiray +amirship +Amish +Amishgo +amiss +amissibility +amissible +amissness +Amita +Amitabha +amitosis +amitotic +amitotically +amity +amixia +Amizilis +amla +amli +amlikar +amlong +Amma +amma +amman +Ammanite +ammelide +ammelin +ammeline +ammer +ammeter +Ammi +Ammiaceae +ammiaceous +ammine +amminochloride +amminolysis +amminolytic +ammiolite +ammo +Ammobium +ammochaeta +ammochryse +ammocoete +ammocoetes +ammocoetid +Ammocoetidae +ammocoetiform +ammocoetoid +Ammodytes +Ammodytidae +ammodytoid +ammonal +ammonate +ammonation +Ammonea +ammonia +ammoniacal +ammoniacum +ammoniate +ammoniation +ammonic +ammonical +ammoniemia +ammonification +ammonifier +ammonify +ammoniojarosite +ammonion +ammonionitrate +Ammonite +ammonite +Ammonites +Ammonitess +ammonitic +ammoniticone +ammonitiferous +Ammonitish +ammonitoid +Ammonitoidea +ammonium +ammoniuria +ammonization +ammono +ammonobasic +ammonocarbonic +ammonocarbonous +ammonoid +Ammonoidea +ammonoidean +ammonolysis +ammonolytic +ammonolyze +Ammophila +ammophilous +ammoresinol +ammotherapy +ammu +ammunition +amnemonic +amnesia +amnesic +amnestic +amnesty +amniac +amniatic +amnic +Amnigenia +amnioallantoic +amniochorial +amnioclepsis +amniomancy +amnion +Amnionata +amnionate +amnionic +amniorrhea +Amniota +amniote +amniotitis +amniotome +amober +amobyr +amoeba +amoebae +Amoebaea +amoebaean +amoebaeum +amoebalike +amoeban +amoebian +amoebiasis +amoebic +amoebicide +amoebid +Amoebida +Amoebidae +amoebiform +Amoebobacter +Amoebobacterieae +amoebocyte +Amoebogeniae +amoeboid +amoeboidism +amoebous +amoebula +amok +amoke +amole +amolilla +amomal +Amomales +Amomis +amomum +among +amongst +amontillado +amor +amorado +amoraic +amoraim +amoral +amoralism +amoralist +amorality +amoralize +Amores +amoret +amoretto +Amoreuxia +amorism +amorist +amoristic +Amorite +Amoritic +Amoritish +amorosity +amoroso +amorous +amorously +amorousness +Amorpha +amorphia +amorphic +amorphinism +amorphism +Amorphophallus +amorphophyte +amorphotae +amorphous +amorphously +amorphousness +amorphus +amorphy +amort +amortisseur +amortizable +amortization +amortize +amortizement +Amorua +Amos +Amoskeag +amotion +amotus +amount +amour +amourette +amovability +amovable +amove +Amoy +Amoyan +Amoyese +ampalaya +ampalea +ampangabeite +ampasimenite +Ampelidaceae +ampelidaceous +Ampelidae +ampelideous +Ampelis +ampelite +ampelitic +ampelographist +ampelography +ampelopsidin +ampelopsin +Ampelopsis +Ampelosicyos +ampelotherapy +amper +amperage +ampere +amperemeter +Amperian +amperometer +ampersand +ampery +amphanthium +ampheclexis +ampherotokous +ampherotoky +amphetamine +amphiarthrodial +amphiarthrosis +amphiaster +amphibalus +Amphibia +amphibial +amphibian +amphibichnite +amphibiety +amphibiological +amphibiology +amphibion +amphibiotic +Amphibiotica +amphibious +amphibiously +amphibiousness +amphibium +amphiblastic +amphiblastula +amphiblestritis +Amphibola +amphibole +amphibolia +amphibolic +amphiboliferous +amphiboline +amphibolite +amphibolitic +amphibological +amphibologically +amphibologism +amphibology +amphibolous +amphiboly +amphibrach +amphibrachic +amphibryous +Amphicarpa +Amphicarpaea +amphicarpic +amphicarpium +amphicarpogenous +amphicarpous +amphicentric +amphichroic +amphichrom +amphichromatic +amphichrome +amphicoelian +amphicoelous +Amphicondyla +amphicondylous +amphicrania +amphicreatinine +amphicribral +amphictyon +amphictyonian +amphictyonic +amphictyony +Amphicyon +Amphicyonidae +amphicyrtic +amphicyrtous +amphicytula +amphid +amphide +amphidesmous +amphidetic +amphidiarthrosis +amphidiploid +amphidiploidy +amphidisc +Amphidiscophora +amphidiscophoran +amphierotic +amphierotism +Amphigaea +amphigam +Amphigamae +amphigamous +amphigastrium +amphigastrula +amphigean +amphigen +amphigene +amphigenesis +amphigenetic +amphigenous +amphigenously +amphigonic +amphigonium +amphigonous +amphigony +amphigoric +amphigory +amphigouri +amphikaryon +amphilogism +amphilogy +amphimacer +amphimictic +amphimictical +amphimictically +amphimixis +amphimorula +Amphinesian +Amphineura +amphineurous +amphinucleus +Amphion +Amphionic +Amphioxi +Amphioxidae +Amphioxides +Amphioxididae +amphioxus +amphipeptone +amphiphloic +amphiplatyan +Amphipleura +amphiploid +amphiploidy +amphipneust +Amphipneusta +amphipneustic +Amphipnous +amphipod +Amphipoda +amphipodal +amphipodan +amphipodiform +amphipodous +amphiprostylar +amphiprostyle +amphiprotic +amphipyrenin +Amphirhina +amphirhinal +amphirhine +amphisarca +amphisbaena +amphisbaenian +amphisbaenic +Amphisbaenidae +amphisbaenoid +amphisbaenous +amphiscians +amphiscii +Amphisile +Amphisilidae +amphispermous +amphisporangiate +amphispore +Amphistoma +amphistomatic +amphistome +amphistomoid +amphistomous +Amphistomum +amphistylar +amphistylic +amphistyly +amphitene +amphitheater +amphitheatered +amphitheatral +amphitheatric +amphitheatrical +amphitheatrically +amphithecial +amphithecium +amphithect +amphithyron +amphitokal +amphitokous +amphitoky +amphitriaene +amphitrichous +Amphitrite +amphitropal +amphitropous +Amphitruo +Amphitryon +Amphiuma +Amphiumidae +amphivasal +amphivorous +Amphizoidae +amphodarch +amphodelite +amphodiplopia +amphogenous +ampholyte +amphopeptone +amphophil +amphophile +amphophilic +amphophilous +amphora +amphoral +amphore +amphorette +amphoric +amphoricity +amphoriloquy +amphorophony +amphorous +amphoteric +Amphrysian +ample +amplectant +ampleness +amplexation +amplexicaudate +amplexicaul +amplexicauline +amplexifoliate +amplexus +ampliate +ampliation +ampliative +amplicative +amplidyne +amplification +amplificative +amplificator +amplificatory +amplifier +amplify +amplitude +amply +ampollosity +ampongue +ampoule +ampul +ampulla +ampullaceous +ampullar +Ampullaria +Ampullariidae +ampullary +ampullate +ampullated +ampulliform +ampullitis +ampullula +amputate +amputation +amputational +amputative +amputator +amputee +ampyx +amra +amreeta +amrita +Amritsar +amsath +amsel +Amsonia +Amsterdamer +amt +amtman +Amuchco +amuck +Amueixa +amuguis +amula +amulet +amuletic +amulla +amunam +amurca +amurcosity +amurcous +Amurru +amusable +amuse +amused +amusedly +amusee +amusement +amuser +amusette +Amusgo +amusia +amusing +amusingly +amusingness +amusive +amusively +amusiveness +amutter +amuyon +amuyong +amuze +amvis +Amy +amy +Amyclaean +Amyclas +amyelencephalia +amyelencephalic +amyelencephalous +amyelia +amyelic +amyelinic +amyelonic +amyelous +amygdal +amygdala +Amygdalaceae +amygdalaceous +amygdalase +amygdalate +amygdalectomy +amygdalic +amygdaliferous +amygdaliform +amygdalin +amygdaline +amygdalinic +amygdalitis +amygdaloid +amygdaloidal +amygdalolith +amygdaloncus +amygdalopathy +amygdalothripsis +amygdalotome +amygdalotomy +Amygdalus +amygdonitrile +amygdophenin +amygdule +amyl +amylaceous +amylamine +amylan +amylase +amylate +amylemia +amylene +amylenol +amylic +amylidene +amyliferous +amylin +amylo +amylocellulose +amyloclastic +amylocoagulase +amylodextrin +amylodyspepsia +amylogen +amylogenesis +amylogenic +amylohydrolysis +amylohydrolytic +amyloid +amyloidal +amyloidosis +amyloleucite +amylolysis +amylolytic +amylom +amylometer +amylon +amylopectin +amylophagia +amylophosphate +amylophosphoric +amyloplast +amyloplastic +amyloplastid +amylopsin +amylose +amylosis +amylosynthesis +amylum +amyluria +Amynodon +amynodont +amyosthenia +amyosthenic +amyotaxia +amyotonia +amyotrophia +amyotrophic +amyotrophy +amyous +Amyraldism +Amyraldist +Amyridaceae +amyrin +Amyris +amyrol +amyroot +Amytal +amyxorrhea +amyxorrhoea +an +Ana +ana +Anabaena +Anabantidae +Anabaptism +Anabaptist +Anabaptistic +Anabaptistical +Anabaptistically +Anabaptistry +anabaptize +Anabas +anabasine +anabasis +anabasse +anabata +anabathmos +anabatic +anaberoga +anabibazon +anabiosis +anabiotic +Anablepidae +Anableps +anabo +anabohitsite +anabolic +anabolin +anabolism +anabolite +anabolize +anabong +anabranch +anabrosis +anabrotic +anacahuita +anacahuite +anacalypsis +anacampsis +anacamptic +anacamptically +anacamptics +anacamptometer +anacanth +anacanthine +Anacanthini +anacanthous +anacara +anacard +Anacardiaceae +anacardiaceous +anacardic +Anacardium +anacatadidymus +anacatharsis +anacathartic +anacephalaeosis +anacephalize +Anaces +Anacharis +anachorism +anachromasis +anachronic +anachronical +anachronically +anachronism +anachronismatical +anachronist +anachronistic +anachronistical +anachronistically +anachronize +anachronous +anachronously +anachueta +anacid +anacidity +anaclasis +anaclastic +anaclastics +Anaclete +anacleticum +anaclinal +anaclisis +anaclitic +anacoenosis +anacoluthia +anacoluthic +anacoluthically +anacoluthon +anaconda +Anacreon +Anacreontic +Anacreontically +anacrisis +Anacrogynae +anacrogynae +anacrogynous +anacromyodian +anacrotic +anacrotism +anacrusis +anacrustic +anacrustically +anaculture +anacusia +anacusic +anacusis +Anacyclus +anadem +anadenia +anadicrotic +anadicrotism +anadidymus +anadiplosis +anadipsia +anadipsic +anadrom +anadromous +Anadyomene +anaematosis +anaemia +anaemic +anaeretic +anaerobation +anaerobe +anaerobia +anaerobian +anaerobic +anaerobically +anaerobies +anaerobion +anaerobiont +anaerobiosis +anaerobiotic +anaerobiotically +anaerobious +anaerobism +anaerobium +anaerophyte +anaeroplastic +anaeroplasty +anaesthesia +anaesthesiant +anaesthetically +anaesthetizer +anaetiological +anagalactic +Anagallis +anagap +anagenesis +anagenetic +anagep +anagignoskomena +anaglyph +anaglyphic +anaglyphical +anaglyphics +anaglyphoscope +anaglyphy +anaglyptic +anaglyptical +anaglyptics +anaglyptograph +anaglyptographic +anaglyptography +anaglypton +anagnorisis +anagnost +anagoge +anagogic +anagogical +anagogically +anagogics +anagogy +anagram +anagrammatic +anagrammatical +anagrammatically +anagrammatism +anagrammatist +anagrammatize +anagrams +anagraph +anagua +anagyrin +anagyrine +Anagyris +anahau +Anahita +Anaitis +Anakes +anakinesis +anakinetic +anakinetomer +anakinetomeric +anakoluthia +anakrousis +anaktoron +anal +analabos +analav +analcime +analcimite +analcite +analcitite +analecta +analectic +analects +analemma +analemmatic +analepsis +analepsy +analeptic +analeptical +analgen +analgesia +analgesic +Analgesidae +analgesis +analgesist +analgetic +analgia +analgic +analgize +analkalinity +anallagmatic +anallantoic +Anallantoidea +anallantoidean +anallergic +anally +analogic +analogical +analogically +analogicalness +analogion +analogism +analogist +analogistic +analogize +analogon +analogous +analogously +analogousness +analogue +analogy +analphabet +analphabete +analphabetic +analphabetical +analphabetism +analysability +analysable +analysand +analysation +analyse +analyser +analyses +analysis +analyst +analytic +analytical +analytically +analytics +analyzability +analyzable +analyzation +analyze +analyzer +Anam +anam +anama +anamesite +anametadromous +Anamirta +anamirtin +Anamite +anamite +anammonid +anammonide +anamnesis +anamnestic +anamnestically +Anamnia +Anamniata +Anamnionata +anamnionic +Anamniota +anamniote +anamniotic +anamorphic +anamorphism +anamorphoscope +anamorphose +anamorphosis +anamorphote +anamorphous +anan +anana +ananaplas +ananaples +ananas +ananda +anandrarious +anandria +anandrous +ananepionic +anangioid +anangular +Ananias +Ananism +Ananite +anankastic +Anansi +Ananta +anantherate +anantherous +ananthous +ananym +anapaest +anapaestic +anapaestical +anapaestically +anapaganize +anapaite +anapanapa +anapeiratic +anaphalantiasis +Anaphalis +anaphase +Anaphe +anaphia +anaphora +anaphoral +anaphoria +anaphoric +anaphorical +anaphrodisia +anaphrodisiac +anaphroditic +anaphroditous +anaphylactic +anaphylactin +anaphylactogen +anaphylactogenic +anaphylactoid +anaphylatoxin +anaphylaxis +anaphyte +anaplasia +anaplasis +anaplasm +Anaplasma +anaplasmosis +anaplastic +anaplasty +anaplerosis +anaplerotic +anapnea +anapneic +anapnoeic +anapnograph +anapnoic +anapnometer +anapodeictic +anapophysial +anapophysis +anapsid +Anapsida +anapsidan +Anapterygota +anapterygote +anapterygotism +anapterygotous +Anaptomorphidae +Anaptomorphus +anaptotic +anaptychus +anaptyctic +anaptyctical +anaptyxis +anaqua +anarcestean +Anarcestes +anarch +anarchal +anarchial +anarchic +anarchical +anarchically +anarchism +anarchist +anarchistic +anarchize +anarchoindividualist +anarchosocialist +anarchosyndicalism +anarchosyndicalist +anarchy +anarcotin +anareta +anaretic +anaretical +anargyros +anarthria +anarthric +anarthropod +Anarthropoda +anarthropodous +anarthrosis +anarthrous +anarthrously +anarthrousness +anartismos +anarya +Anaryan +Anas +Anasa +anasarca +anasarcous +Anasazi +anaschistic +anaseismic +Anasitch +anaspadias +anaspalin +Anaspida +Anaspidacea +Anaspides +anastalsis +anastaltic +Anastasia +Anastasian +anastasimon +anastasimos +anastasis +Anastasius +anastate +anastatic +Anastatica +Anastatus +anastigmat +anastigmatic +anastomose +anastomosis +anastomotic +Anastomus +anastrophe +Anastrophia +Anat +anatase +anatexis +anathema +anathematic +anathematical +anathematically +anathematism +anathematization +anathematize +anathematizer +anatheme +anathemize +Anatherum +Anatidae +anatifa +Anatifae +anatifer +anatiferous +Anatinacea +Anatinae +anatine +anatocism +Anatolian +Anatolic +anatomic +anatomical +anatomically +anatomicobiological +anatomicochirurgical +anatomicomedical +anatomicopathologic +anatomicopathological +anatomicophysiologic +anatomicophysiological +anatomicosurgical +anatomism +anatomist +anatomization +anatomize +anatomizer +anatomopathologic +anatomopathological +anatomy +anatopism +anatox +anatoxin +anatreptic +anatripsis +anatripsology +anatriptic +anatron +anatropal +anatropia +anatropous +Anatum +anaudia +anaunter +anaunters +Anax +Anaxagorean +Anaxagorize +anaxial +Anaximandrian +anaxon +anaxone +Anaxonia +anay +anazoturia +anba +anbury +Ancerata +ancestor +ancestorial +ancestorially +ancestral +ancestrally +ancestress +ancestrial +ancestrian +ancestry +Ancha +Anchat +Anchietea +anchietin +anchietine +anchieutectic +anchimonomineral +Anchisaurus +Anchises +Anchistea +Anchistopoda +anchithere +anchitherioid +anchor +anchorable +anchorage +anchorate +anchored +anchorer +anchoress +anchoret +anchoretic +anchoretical +anchoretish +anchoretism +anchorhold +anchorite +anchoritess +anchoritic +anchoritical +anchoritish +anchoritism +anchorless +anchorlike +anchorwise +anchovy +Anchtherium +Anchusa +anchusin +anchusine +anchylose +anchylosis +ancience +anciency +ancient +ancientism +anciently +ancientness +ancientry +ancienty +ancile +ancilla +ancillary +ancipital +ancipitous +Ancistrocladaceae +ancistrocladaceous +Ancistrocladus +ancistroid +ancon +Ancona +anconad +anconagra +anconal +ancone +anconeal +anconeous +anconeus +anconitis +anconoid +ancony +ancora +ancoral +Ancyloceras +Ancylocladus +Ancylodactyla +ancylopod +Ancylopoda +Ancylostoma +ancylostome +ancylostomiasis +Ancylostomum +Ancylus +Ancyrean +Ancyrene +and +anda +andabatarian +Andalusian +andalusite +Andaman +Andamanese +andante +andantino +Andaqui +Andaquian +Andarko +Andaste +Ande +Andean +Andesic +andesine +andesinite +andesite +andesitic +Andevo +Andhra +Andi +Andian +Andine +Andira +andirin +andirine +andiroba +andiron +Andoke +andorite +Andorobo +Andorran +andouillet +andradite +andranatomy +andrarchy +Andre +Andreaea +Andreaeaceae +Andreaeales +Andrena +andrenid +Andrenidae +Andrew +andrewsite +Andria +Andriana +Andrias +andric +androcentric +androcephalous +androcephalum +androclinium +Androclus +androconium +androcracy +androcratic +androcyte +androdioecious +androdioecism +androdynamous +androecial +androecium +androgametangium +androgametophore +androgen +androgenesis +androgenetic +androgenic +androgenous +androginous +androgone +androgonia +androgonial +androgonidium +androgonium +Andrographis +andrographolide +androgynal +androgynary +androgyne +androgyneity +androgynia +androgynism +androgynous +androgynus +androgyny +android +androidal +androkinin +androl +androlepsia +androlepsy +Andromache +andromania +Andromaque +Andromeda +Andromede +andromedotoxin +andromonoecious +andromonoecism +andromorphous +andron +Andronicus +andronitis +andropetalar +andropetalous +androphagous +androphobia +androphonomania +androphore +androphorous +androphorum +androphyll +Andropogon +Androsace +Androscoggin +androseme +androsin +androsphinx +androsporangium +androspore +androsterone +androtauric +androtomy +Andy +anear +aneath +anecdota +anecdotage +anecdotal +anecdotalism +anecdote +anecdotic +anecdotical +anecdotically +anecdotist +anele +anelectric +anelectrode +anelectrotonic +anelectrotonus +anelytrous +anematosis +Anemia +anemia +anemic +anemobiagraph +anemochord +anemoclastic +anemogram +anemograph +anemographic +anemographically +anemography +anemological +anemology +anemometer +anemometric +anemometrical +anemometrically +anemometrograph +anemometrographic +anemometrographically +anemometry +anemonal +anemone +Anemonella +anemonin +anemonol +anemony +anemopathy +anemophile +anemophilous +anemophily +Anemopsis +anemoscope +anemosis +anemotaxis +anemotropic +anemotropism +anencephalia +anencephalic +anencephalotrophia +anencephalous +anencephalus +anencephaly +anend +anenergia +anenst +anent +anenterous +anepia +anepigraphic +anepigraphous +anepiploic +anepithymia +anerethisia +aneretic +anergia +anergic +anergy +anerly +aneroid +aneroidograph +anerotic +anerythroplasia +anerythroplastic +anes +anesis +anesthesia +anesthesiant +anesthesimeter +anesthesiologist +anesthesiology +anesthesis +anesthetic +anesthetically +anesthetist +anesthetization +anesthetize +anesthetizer +anesthyl +anethole +Anethum +anetiological +aneuploid +aneuploidy +aneuria +aneuric +aneurilemmic +aneurin +aneurism +aneurismally +aneurysm +aneurysmal +aneurysmally +aneurysmatic +anew +Anezeh +anfractuose +anfractuosity +anfractuous +anfractuousness +anfracture +Angami +Angara +angaralite +angaria +angary +Angdistis +angekok +angel +Angela +angelate +angeldom +Angeleno +angelet +angeleyes +angelfish +angelhood +angelic +Angelica +angelica +Angelical +angelical +angelically +angelicalness +Angelican +angelicic +angelicize +angelico +angelin +Angelina +angeline +angelique +angelize +angellike +Angelo +angelocracy +angelographer +angelolater +angelolatry +angelologic +angelological +angelology +angelomachy +Angelonia +angelophany +angelot +angelship +Angelus +anger +angerly +Angerona +Angeronalia +Angers +Angetenar +Angevin +angeyok +angiasthenia +angico +Angie +angiectasis +angiectopia +angiemphraxis +angiitis +angild +angili +angina +anginal +anginiform +anginoid +anginose +anginous +angioasthenia +angioataxia +angioblast +angioblastic +angiocarditis +angiocarp +angiocarpian +angiocarpic +angiocarpous +angiocavernous +angiocholecystitis +angiocholitis +angiochondroma +angioclast +angiocyst +angiodermatitis +angiodiascopy +angioelephantiasis +angiofibroma +angiogenesis +angiogenic +angiogeny +angioglioma +angiograph +angiography +angiohyalinosis +angiohydrotomy +angiohypertonia +angiohypotonia +angioid +angiokeratoma +angiokinesis +angiokinetic +angioleucitis +angiolipoma +angiolith +angiology +angiolymphitis +angiolymphoma +angioma +angiomalacia +angiomatosis +angiomatous +angiomegaly +angiometer +angiomyocardiac +angiomyoma +angiomyosarcoma +angioneoplasm +angioneurosis +angioneurotic +angionoma +angionosis +angioparalysis +angioparalytic +angioparesis +angiopathy +angiophorous +angioplany +angioplasty +angioplerosis +angiopoietic +angiopressure +angiorrhagia +angiorrhaphy +angiorrhea +angiorrhexis +angiosarcoma +angiosclerosis +angiosclerotic +angioscope +angiosis +angiospasm +angiospastic +angiosperm +Angiospermae +angiospermal +angiospermatous +angiospermic +angiospermous +angiosporous +angiostegnosis +angiostenosis +angiosteosis +angiostomize +angiostomy +angiostrophy +angiosymphysis +angiotasis +angiotelectasia +angiothlipsis +angiotome +angiotomy +angiotonic +angiotonin +angiotribe +angiotripsy +angiotrophic +Angka +anglaise +angle +angleberry +angled +anglehook +anglepod +angler +Angles +anglesite +anglesmith +angletouch +angletwitch +anglewing +anglewise +angleworm +Anglian +Anglic +Anglican +Anglicanism +Anglicanize +Anglicanly +Anglicanum +Anglicism +Anglicist +Anglicization +anglicization +Anglicize +anglicize +Anglification +Anglify +anglimaniac +angling +Anglish +Anglist +Anglistics +Anglogaea +Anglogaean +angloid +Angloman +Anglomane +Anglomania +Anglomaniac +Anglophile +Anglophobe +Anglophobia +Anglophobiac +Anglophobic +Anglophobist +ango +Angola +angolar +Angolese +angor +Angora +angostura +Angouleme +Angoumian +Angraecum +angrily +angriness +angrite +angry +angst +angster +Angstrom +angstrom +anguid +Anguidae +anguiform +Anguilla +Anguillaria +Anguillidae +anguilliform +anguilloid +Anguillula +Anguillulidae +Anguimorpha +anguine +anguineal +anguineous +Anguinidae +anguiped +Anguis +anguis +anguish +anguished +anguishful +anguishous +anguishously +angula +angular +angulare +angularity +angularization +angularize +angularly +angularness +angulate +angulated +angulately +angulateness +angulation +angulatogibbous +angulatosinuous +anguliferous +angulinerved +Anguloa +angulodentate +angulometer +angulosity +angulosplenial +angulous +anguria +Angus +angusticlave +angustifoliate +angustifolious +angustirostrate +angustisellate +angustiseptal +angustiseptate +angwantibo +anhalamine +anhaline +anhalonine +Anhalonium +anhalouidine +anhang +Anhanga +anharmonic +anhedonia +anhedral +anhedron +anhelation +anhelous +anhematosis +anhemolytic +anhidrosis +anhidrotic +anhima +Anhimae +Anhimidae +anhinga +anhistic +anhistous +anhungered +anhungry +anhydrate +anhydration +anhydremia +anhydremic +anhydric +anhydride +anhydridization +anhydridize +anhydrite +anhydrization +anhydrize +anhydroglocose +anhydromyelia +anhydrous +anhydroxime +anhysteretic +ani +Aniba +Anice +aniconic +aniconism +anicular +anicut +anidian +anidiomatic +anidiomatical +anidrosis +Aniellidae +aniente +anigh +anight +anights +anil +anilao +anilau +anile +anileness +anilic +anilid +anilide +anilidic +anilidoxime +aniline +anilinism +anilinophile +anilinophilous +anility +anilla +anilopyrin +anilopyrine +anima +animability +animable +animableness +animadversion +animadversional +animadversive +animadversiveness +animadvert +animadverter +animal +animalcula +animalculae +animalcular +animalcule +animalculine +animalculism +animalculist +animalculous +animalculum +animalhood +Animalia +animalian +animalic +animalier +animalish +animalism +animalist +animalistic +animality +Animalivora +animalivore +animalivorous +animalization +animalize +animally +animastic +animastical +animate +animated +animatedly +animately +animateness +animater +animating +animatingly +animation +animatism +animatistic +animative +animatograph +animator +anime +animi +Animikean +animikite +animism +animist +animistic +animize +animosity +animotheism +animous +animus +anion +anionic +aniridia +anis +anisal +anisalcohol +anisaldehyde +anisaldoxime +anisamide +anisandrous +anisanilide +anisate +anischuria +anise +aniseed +aniseikonia +aniseikonic +aniselike +aniseroot +anisette +anisic +anisidin +anisidine +anisil +anisilic +anisobranchiate +anisocarpic +anisocarpous +anisocercal +anisochromatic +anisochromia +anisocoria +anisocotyledonous +anisocotyly +anisocratic +anisocycle +anisocytosis +anisodactyl +Anisodactyla +Anisodactyli +anisodactylic +anisodactylous +anisodont +anisogamete +anisogamous +anisogamy +anisogenous +anisogeny +anisognathism +anisognathous +anisogynous +anisoin +anisole +anisoleucocytosis +Anisomeles +anisomelia +anisomelus +anisomeric +anisomerous +anisometric +anisometrope +anisometropia +anisometropic +anisomyarian +Anisomyodi +anisomyodian +anisomyodous +anisopetalous +anisophyllous +anisophylly +anisopia +anisopleural +anisopleurous +anisopod +Anisopoda +anisopodal +anisopodous +anisopogonous +Anisoptera +anisopterous +anisosepalous +anisospore +anisostaminous +anisostemonous +anisosthenic +anisostichous +Anisostichus +anisostomous +anisotonic +anisotropal +anisotrope +anisotropic +anisotropical +anisotropically +anisotropism +anisotropous +anisotropy +anisoyl +anisum +anisuria +anisyl +anisylidene +Anita +anither +anitrogenous +anjan +Anjou +ankaramite +ankaratrite +ankee +anker +ankerite +ankh +ankle +anklebone +anklejack +anklet +anklong +Ankoli +Ankou +ankus +ankusha +ankylenteron +ankyloblepharon +ankylocheilia +ankylodactylia +ankylodontia +ankyloglossia +ankylomele +ankylomerism +ankylophobia +ankylopodia +ankylopoietic +ankyloproctia +ankylorrhinia +Ankylosaurus +ankylose +ankylosis +ankylostoma +ankylotia +ankylotic +ankylotome +ankylotomy +ankylurethria +ankyroid +anlace +anlaut +Ann +ann +Anna +anna +Annabel +annabergite +annal +annale +annaline +annalism +annalist +annalistic +annalize +annals +Annam +Annamese +Annamite +Annamitic +Annapurna +annat +annates +annatto +anneal +annealer +annectent +annection +annelid +Annelida +annelidan +Annelides +annelidian +annelidous +annelism +Annellata +anneloid +annerodite +Anneslia +annet +Annette +annex +annexa +annexable +annexal +annexation +annexational +annexationist +annexer +annexion +annexionist +annexitis +annexive +annexment +annexure +annidalin +Annie +Anniellidae +annihilability +annihilable +annihilate +annihilation +annihilationism +annihilationist +annihilative +annihilator +annihilatory +Annist +annite +anniversarily +anniversariness +anniversary +anniverse +annodated +Annona +annona +Annonaceae +annonaceous +annotate +annotater +annotation +annotative +annotator +annotatory +annotine +annotinous +announce +announceable +announcement +announcer +annoy +annoyance +annoyancer +annoyer +annoyful +annoying +annoyingly +annoyingness +annoyment +annual +annualist +annualize +annually +annuary +annueler +annuent +annuitant +annuity +annul +annular +Annularia +annularity +annularly +annulary +Annulata +annulate +annulated +annulation +annulet +annulettee +annulism +annullable +annullate +annullation +annuller +annulment +annuloid +Annuloida +Annulosa +annulosan +annulose +annulus +annunciable +annunciate +annunciation +annunciative +annunciator +annunciatory +anoa +Anobiidae +anocarpous +anociassociation +anococcygeal +anodal +anode +anodendron +anodic +anodically +anodize +Anodon +Anodonta +anodontia +anodos +anodyne +anodynia +anodynic +anodynous +anoegenetic +anoesia +anoesis +anoestrous +anoestrum +anoestrus +anoetic +anogenic +anogenital +Anogra +anoil +anoine +anoint +anointer +anointment +anole +anoli +anolian +Anolis +Anolympiad +anolyte +Anomala +anomaliflorous +anomaliped +anomalism +anomalist +anomalistic +anomalistical +anomalistically +anomalocephalus +anomaloflorous +Anomalogonatae +anomalogonatous +Anomalon +anomalonomy +Anomalopteryx +anomaloscope +anomalotrophy +anomalous +anomalously +anomalousness +anomalure +Anomaluridae +Anomalurus +anomaly +Anomatheca +Anomia +Anomiacea +Anomiidae +anomite +anomocarpous +anomodont +Anomodontia +Anomoean +Anomoeanism +anomophyllous +anomorhomboid +anomorhomboidal +anomphalous +Anomura +anomural +anomuran +anomurous +anomy +anon +anonang +anoncillo +anonol +anonychia +anonym +anonyma +anonymity +anonymous +anonymously +anonymousness +anonymuncule +anoopsia +anoperineal +anophele +Anopheles +Anophelinae +anopheline +anophoria +anophthalmia +anophthalmos +Anophthalmus +anophyte +anopia +anopisthographic +Anopla +Anoplanthus +anoplocephalic +anoplonemertean +Anoplonemertini +anoplothere +Anoplotheriidae +anoplotherioid +Anoplotherium +anoplotheroid +Anoplura +anopluriform +anopsia +anopubic +anorak +anorchia +anorchism +anorchous +anorchus +anorectal +anorectic +anorectous +anorexia +anorexy +anorgana +anorganic +anorganism +anorganology +anormal +anormality +anorogenic +anorth +anorthic +anorthite +anorthitic +anorthitite +anorthoclase +anorthographic +anorthographical +anorthographically +anorthography +anorthophyre +anorthopia +anorthoscope +anorthose +anorthosite +anoscope +anoscopy +Anosia +anosmatic +anosmia +anosmic +anosphrasia +anosphresia +anospinal +anostosis +Anostraca +anoterite +another +anotherkins +anotia +anotropia +anotta +anotto +anotus +anounou +Anous +anovesical +anoxemia +anoxemic +anoxia +anoxic +anoxidative +anoxybiosis +anoxybiotic +anoxyscope +ansa +ansar +ansarian +Ansarie +ansate +ansation +Anseis +Ansel +Anselm +Anselmian +Anser +anserated +Anseres +Anseriformes +Anserinae +anserine +anserous +anspessade +ansu +ansulate +answer +answerability +answerable +answerableness +answerably +answerer +answeringly +answerless +answerlessly +ant +Anta +anta +antacid +antacrid +antadiform +Antaean +Antaeus +antagonism +antagonist +antagonistic +antagonistical +antagonistically +antagonization +antagonize +antagonizer +antagony +Antaimerina +Antaios +Antaiva +antal +antalgesic +antalgol +antalkali +antalkaline +antambulacral +antanacathartic +antanaclasis +Antanandro +antanemic +antapex +antaphrodisiac +antaphroditic +antapocha +antapodosis +antapology +antapoplectic +Antar +Antara +antarchism +antarchist +antarchistic +antarchistical +antarchy +Antarctalia +Antarctalian +antarctic +Antarctica +antarctica +antarctical +antarctically +Antarctogaea +Antarctogaean +Antares +antarthritic +antasphyctic +antasthenic +antasthmatic +antatrophic +antdom +ante +anteact +anteal +anteambulate +anteambulation +anteater +antebaptismal +antebath +antebrachial +antebrachium +antebridal +antecabinet +antecaecal +antecardium +antecavern +antecedaneous +antecedaneously +antecede +antecedence +antecedency +antecedent +antecedental +antecedently +antecessor +antechamber +antechapel +Antechinomys +antechoir +antechurch +anteclassical +antecloset +antecolic +antecommunion +anteconsonantal +antecornu +antecourt +antecoxal +antecubital +antecurvature +antedate +antedawn +antediluvial +antediluvially +antediluvian +Antedon +antedonin +antedorsal +antefebrile +antefix +antefixal +anteflected +anteflexed +anteflexion +antefurca +antefurcal +antefuture +antegarden +antegrade +antehall +antehistoric +antehuman +antehypophysis +anteinitial +antejentacular +antejudiciary +antejuramentum +antelabium +antelegal +antelocation +antelope +antelopian +antelucan +antelude +anteluminary +antemarginal +antemarital +antemedial +antemeridian +antemetallic +antemetic +antemillennial +antemingent +antemortal +antemundane +antemural +antenarial +antenatal +antenatalitial +antenati +antenave +antenna +antennae +antennal +Antennaria +antennariid +Antennariidae +Antennarius +antennary +Antennata +antennate +antenniferous +antenniform +antennula +antennular +antennulary +antennule +antenodal +antenoon +Antenor +antenumber +anteoccupation +anteocular +anteopercle +anteoperculum +anteorbital +antepagmenta +antepagments +antepalatal +antepaschal +antepast +antepatriarchal +antepectoral +antepectus +antependium +antepenult +antepenultima +antepenultimate +antephialtic +antepileptic +antepirrhema +anteporch +anteportico +anteposition +anteposthumous +anteprandial +antepredicament +antepredicamental +antepreterit +antepretonic +anteprohibition +anteprostate +anteprostatic +antepyretic +antequalm +antereformation +antereformational +anteresurrection +anterethic +anterevolutional +anterevolutionary +anteriad +anterior +anteriority +anteriorly +anteriorness +anteroclusion +anterodorsal +anteroexternal +anterofixation +anteroflexion +anterofrontal +anterograde +anteroinferior +anterointerior +anterointernal +anterolateral +anterolaterally +anteromedial +anteromedian +anteroom +anteroparietal +anteroposterior +anteroposteriorly +anteropygal +anterospinal +anterosuperior +anteroventral +anteroventrally +antes +antescript +antesignanus +antespring +antestature +antesternal +antesternum +antesunrise +antesuperior +antetemple +antetype +Anteva +antevenient +anteversion +antevert +antevocalic +antewar +anthecological +anthecologist +anthecology +Antheia +anthela +anthelion +anthelmintic +anthem +anthema +anthemene +anthemia +Anthemideae +anthemion +Anthemis +anthemwise +anthemy +anther +Antheraea +antheral +Anthericum +antherid +antheridial +antheridiophore +antheridium +antheriferous +antheriform +antherless +antherogenous +antheroid +antherozoid +antherozoidal +antherozooid +antherozooidal +anthesis +Anthesteria +Anthesteriac +anthesterin +Anthesterion +anthesterol +antheximeter +Anthicidae +Anthidium +anthill +Anthinae +anthine +anthobiology +anthocarp +anthocarpous +anthocephalous +Anthoceros +Anthocerotaceae +Anthocerotales +anthocerote +anthochlor +anthochlorine +anthoclinium +anthocyan +anthocyanidin +anthocyanin +anthodium +anthoecological +anthoecologist +anthoecology +anthogenesis +anthogenetic +anthogenous +anthography +anthoid +anthokyan +antholite +anthological +anthologically +anthologion +anthologist +anthologize +anthology +antholysis +Antholyza +anthomania +anthomaniac +Anthomedusae +anthomedusan +Anthomyia +anthomyiid +Anthomyiidae +Anthonin +Anthonomus +Anthony +anthood +anthophagous +Anthophila +anthophile +anthophilian +anthophilous +anthophobia +Anthophora +anthophore +Anthophoridae +anthophorous +anthophyllite +anthophyllitic +Anthophyta +anthophyte +anthorine +anthosiderite +Anthospermum +anthotaxis +anthotaxy +anthotropic +anthotropism +anthoxanthin +Anthoxanthum +Anthozoa +anthozoan +anthozoic +anthozooid +anthozoon +anthracemia +anthracene +anthraceniferous +anthrachrysone +anthracia +anthracic +anthraciferous +anthracin +anthracite +anthracitic +anthracitiferous +anthracitious +anthracitism +anthracitization +anthracnose +anthracnosis +anthracocide +anthracoid +anthracolithic +anthracomancy +Anthracomarti +anthracomartian +Anthracomartus +anthracometer +anthracometric +anthraconecrosis +anthraconite +Anthracosaurus +anthracosis +anthracothere +Anthracotheriidae +Anthracotherium +anthracotic +anthracyl +anthradiol +anthradiquinone +anthraflavic +anthragallol +anthrahydroquinone +anthramine +anthranil +anthranilate +anthranilic +anthranol +anthranone +anthranoyl +anthranyl +anthraphenone +anthrapurpurin +anthrapyridine +anthraquinol +anthraquinone +anthraquinonyl +anthrarufin +anthratetrol +anthrathiophene +anthratriol +anthrax +anthraxolite +anthraxylon +Anthrenus +anthribid +Anthribidae +Anthriscus +anthrohopobiological +anthroic +anthrol +anthrone +anthropic +anthropical +Anthropidae +anthropobiologist +anthropobiology +anthropocentric +anthropocentrism +anthropoclimatologist +anthropoclimatology +anthropocosmic +anthropodeoxycholic +Anthropodus +anthropogenesis +anthropogenetic +anthropogenic +anthropogenist +anthropogenous +anthropogeny +anthropogeographer +anthropogeographical +anthropogeography +anthropoglot +anthropogony +anthropography +anthropoid +anthropoidal +Anthropoidea +anthropoidean +anthropolater +anthropolatric +anthropolatry +anthropolite +anthropolithic +anthropolitic +anthropological +anthropologically +anthropologist +anthropology +anthropomancy +anthropomantic +anthropomantist +anthropometer +anthropometric +anthropometrical +anthropometrically +anthropometrist +anthropometry +anthropomorph +Anthropomorpha +anthropomorphic +anthropomorphical +anthropomorphically +Anthropomorphidae +anthropomorphism +anthropomorphist +anthropomorphite +anthropomorphitic +anthropomorphitical +anthropomorphitism +anthropomorphization +anthropomorphize +anthropomorphological +anthropomorphologically +anthropomorphology +anthropomorphosis +anthropomorphotheist +anthropomorphous +anthropomorphously +anthroponomical +anthroponomics +anthroponomist +anthroponomy +anthropopathia +anthropopathic +anthropopathically +anthropopathism +anthropopathite +anthropopathy +anthropophagi +anthropophagic +anthropophagical +anthropophaginian +anthropophagism +anthropophagist +anthropophagistic +anthropophagite +anthropophagize +anthropophagous +anthropophagously +anthropophagy +anthropophilous +anthropophobia +anthropophuism +anthropophuistic +anthropophysiography +anthropophysite +Anthropopithecus +anthropopsychic +anthropopsychism +Anthropos +anthroposcopy +anthroposociologist +anthroposociology +anthroposomatology +anthroposophical +anthroposophist +anthroposophy +anthropoteleoclogy +anthropoteleological +anthropotheism +anthropotomical +anthropotomist +anthropotomy +anthropotoxin +Anthropozoic +anthropurgic +anthroropolith +anthroxan +anthroxanic +anthryl +anthrylene +Anthurium +Anthus +Anthyllis +anthypophora +anthypophoretic +Anti +anti +antiabolitionist +antiabrasion +antiabrin +antiabsolutist +antiacid +antiadiaphorist +antiaditis +antiadministration +antiae +antiaesthetic +antiager +antiagglutinating +antiagglutinin +antiaggression +antiaggressionist +antiaggressive +antiaircraft +antialbumid +antialbumin +antialbumose +antialcoholic +antialcoholism +antialcoholist +antialdoxime +antialexin +antialien +antiamboceptor +antiamusement +antiamylase +antianaphylactogen +antianaphylaxis +antianarchic +antianarchist +antiangular +antiannexation +antiannexationist +antianopheline +antianthrax +antianthropocentric +antianthropomorphism +antiantibody +antiantidote +antiantienzyme +antiantitoxin +antiaphrodisiac +antiaphthic +antiapoplectic +antiapostle +antiaquatic +antiar +Antiarcha +Antiarchi +antiarin +Antiaris +antiaristocrat +antiarthritic +antiascetic +antiasthmatic +antiastronomical +antiatheism +antiatheist +antiatonement +antiattrition +antiautolysin +antibacchic +antibacchius +antibacterial +antibacteriolytic +antiballooner +antibalm +antibank +antibasilican +antibenzaldoxime +antiberiberin +antibibliolatry +antibigotry +antibilious +antibiont +antibiosis +antibiotic +antibishop +antiblastic +antiblennorrhagic +antiblock +antiblue +antibody +antiboxing +antibreakage +antibridal +antibromic +antibubonic +Antiburgher +antic +anticachectic +antical +anticalcimine +anticalculous +anticalligraphic +anticancer +anticapital +anticapitalism +anticapitalist +anticardiac +anticardium +anticarious +anticarnivorous +anticaste +anticatalase +anticatalyst +anticatalytic +anticatalyzer +anticatarrhal +anticathexis +anticathode +anticaustic +anticensorship +anticentralization +anticephalalgic +anticeremonial +anticeremonialism +anticeremonialist +anticheater +antichlor +antichlorine +antichloristic +antichlorotic +anticholagogue +anticholinergic +antichoromanic +antichorus +antichresis +antichretic +antichrist +antichristian +antichristianity +antichristianly +antichrome +antichronical +antichronically +antichthon +antichurch +antichurchian +antichymosin +anticipant +anticipatable +anticipate +anticipation +anticipative +anticipatively +anticipator +anticipatorily +anticipatory +anticivic +anticivism +anticize +anticker +anticlactic +anticlassical +anticlassicist +Anticlea +anticlergy +anticlerical +anticlericalism +anticlimactic +anticlimax +anticlinal +anticline +anticlinorium +anticlockwise +anticlogging +anticly +anticnemion +anticness +anticoagulant +anticoagulating +anticoagulative +anticoagulin +anticogitative +anticolic +anticombination +anticomet +anticomment +anticommercial +anticommunist +anticomplement +anticomplementary +anticomplex +anticonceptionist +anticonductor +anticonfederationist +anticonformist +anticonscience +anticonscription +anticonscriptive +anticonstitutional +anticonstitutionalist +anticonstitutionally +anticontagion +anticontagionist +anticontagious +anticonventional +anticonventionalism +anticonvulsive +anticor +anticorn +anticorrosion +anticorrosive +anticorset +anticosine +anticosmetic +anticouncil +anticourt +anticourtier +anticous +anticovenanter +anticovenanting +anticreation +anticreative +anticreator +anticreep +anticreeper +anticreeping +anticrepuscular +anticrepuscule +anticrisis +anticritic +anticritique +anticrochet +anticrotalic +anticryptic +anticum +anticyclic +anticyclone +anticyclonic +anticyclonically +anticynic +anticytolysin +anticytotoxin +antidactyl +antidancing +antidecalogue +antideflation +antidemocrat +antidemocratic +antidemocratical +antidemoniac +antidetonant +antidetonating +antidiabetic +antidiastase +Antidicomarian +Antidicomarianite +antidictionary +antidiffuser +antidinic +antidiphtheria +antidiphtheric +antidiphtherin +antidiphtheritic +antidisciplinarian +antidivine +antidivorce +antidogmatic +antidomestic +antidominican +Antidorcas +antidoron +antidotal +antidotally +antidotary +antidote +antidotical +antidotically +antidotism +antidraft +antidrag +antidromal +antidromic +antidromically +antidromous +antidromy +antidrug +antiduke +antidumping +antidynamic +antidynastic +antidyscratic +antidysenteric +antidysuric +antiecclesiastic +antiecclesiastical +antiedemic +antieducation +antieducational +antiegotism +antiejaculation +antiemetic +antiemperor +antiempirical +antiendotoxin +antiendowment +antienergistic +antienthusiastic +antienzyme +antienzymic +antiepicenter +antiepileptic +antiepiscopal +antiepiscopist +antiepithelial +antierosion +antierysipelas +Antietam +antiethnic +antieugenic +antievangelical +antievolution +antievolutionist +antiexpansionist +antiexporting +antiextreme +antieyestrain +antiface +antifaction +antifame +antifanatic +antifat +antifatigue +antifebrile +antifederal +antifederalism +antifederalist +antifelon +antifelony +antifeminism +antifeminist +antiferment +antifermentative +antifertilizer +antifeudal +antifeudalism +antifibrinolysin +antifibrinolysis +antifideism +antifire +antiflash +antiflattering +antiflatulent +antiflux +antifoam +antifoaming +antifogmatic +antiforeign +antiforeignism +antiformin +antifouler +antifouling +antifowl +antifreeze +antifreezing +antifriction +antifrictional +antifrost +antifundamentalist +antifungin +antigalactagogue +antigalactic +antigambling +antiganting +antigen +antigenic +antigenicity +antighostism +antigigmanic +antiglare +antiglyoxalase +antigod +Antigone +antigonococcic +Antigonon +antigonorrheic +Antigonus +antigorite +antigovernment +antigraft +antigrammatical +antigraph +antigravitate +antigravitational +antigropelos +antigrowth +Antiguan +antiguggler +antigyrous +antihalation +antiharmonist +antihectic +antihelix +antihelminthic +antihemagglutinin +antihemisphere +antihemoglobin +antihemolysin +antihemolytic +antihemorrhagic +antihemorrheidal +antihero +antiheroic +antiheroism +antiheterolysin +antihidrotic +antihierarchical +antihierarchist +antihistamine +antihistaminic +antiholiday +antihormone +antihuff +antihum +antihuman +antihumbuggist +antihunting +antihydrophobic +antihydropic +antihydropin +antihygienic +antihylist +antihypnotic +antihypochondriac +antihypophora +antihysteric +Antikamnia +antikathode +antikenotoxin +antiketogen +antiketogenesis +antiketogenic +antikinase +antiking +antiknock +antilabor +antilaborist +antilacrosse +antilacrosser +antilactase +antilapsarian +antileague +antilegalist +antilegomena +antilemic +antilens +antilepsis +antileptic +antilethargic +antileveling +Antilia +antiliberal +antilibration +antilift +antilipase +antilipoid +antiliquor +antilithic +antiliturgical +antiliturgist +Antillean +antilobium +Antilocapra +Antilocapridae +Antilochus +antiloemic +antilogarithm +antilogic +antilogical +antilogism +antilogous +antilogy +antiloimic +Antilope +Antilopinae +antilottery +antiluetin +antilynching +antilysin +antilysis +antilyssic +antilytic +antimacassar +antimachine +antimachinery +antimagistratical +antimalaria +antimalarial +antimallein +antimaniac +antimaniacal +Antimarian +antimark +antimartyr +antimask +antimasker +Antimason +Antimasonic +Antimasonry +antimasque +antimasquer +antimasquerade +antimaterialist +antimaterialistic +antimatrimonial +antimatrimonialist +antimedical +antimedieval +antimelancholic +antimellin +antimeningococcic +antimension +antimensium +antimephitic +antimere +antimerger +antimeric +Antimerina +antimerism +antimeristem +antimetabole +antimetathesis +antimetathetic +antimeter +antimethod +antimetrical +antimetropia +antimetropic +antimiasmatic +antimicrobic +antimilitarism +antimilitarist +antimilitary +antiministerial +antiministerialist +antiminsion +antimiscegenation +antimission +antimissionary +antimissioner +antimixing +antimnemonic +antimodel +antimodern +antimonarchial +antimonarchic +antimonarchical +antimonarchically +antimonarchicalness +antimonarchist +antimonate +antimonial +antimoniate +antimoniated +antimonic +antimonid +antimonide +antimoniferous +antimonious +antimonite +antimonium +antimoniuret +antimoniureted +antimoniuretted +antimonopolist +antimonopoly +antimonsoon +antimony +antimonyl +antimoral +antimoralism +antimoralist +antimosquito +antimusical +antimycotic +antimythic +antimythical +antinarcotic +antinarrative +antinational +antinationalist +antinationalistic +antinatural +antinegro +antinegroism +antineologian +antinephritic +antinepotic +antineuralgic +antineuritic +antineurotoxin +antineutral +antinial +antinicotine +antinion +antinode +antinoise +antinome +antinomian +antinomianism +antinomic +antinomical +antinomist +antinomy +antinormal +antinosarian +Antinous +Antiochene +Antiochian +Antiochianism +antiodont +antiodontalgic +Antiope +antiopelmous +antiophthalmic +antiopium +antiopiumist +antiopiumite +antioptimist +antioptionist +antiorgastic +antiorthodox +antioxidant +antioxidase +antioxidizer +antioxidizing +antioxygen +antioxygenation +antioxygenator +antioxygenic +antipacifist +antipapacy +antipapal +antipapalist +antipapism +antipapist +antipapistical +antiparabema +antiparagraphe +antiparagraphic +antiparallel +antiparallelogram +antiparalytic +antiparalytical +antiparasitic +antiparastatitis +antiparliament +antiparliamental +antiparliamentarist +antiparliamentary +antipart +Antipasch +Antipascha +antipass +antipastic +Antipatharia +antipatharian +antipathetic +antipathetical +antipathetically +antipatheticalness +antipathic +Antipathida +antipathist +antipathize +antipathogen +antipathy +antipatriarch +antipatriarchal +antipatriot +antipatriotic +antipatriotism +antipedal +Antipedobaptism +Antipedobaptist +antipeduncular +antipellagric +antipepsin +antipeptone +antiperiodic +antiperistalsis +antiperistaltic +antiperistasis +antiperistatic +antiperistatical +antiperistatically +antipersonnel +antiperthite +antipestilential +antipetalous +antipewism +antiphagocytic +antipharisaic +antipharmic +antiphase +antiphilosophic +antiphilosophical +antiphlogistian +antiphlogistic +antiphon +antiphonal +antiphonally +antiphonary +antiphoner +antiphonetic +antiphonic +antiphonical +antiphonically +antiphonon +antiphony +antiphrasis +antiphrastic +antiphrastical +antiphrastically +antiphthisic +antiphthisical +antiphylloxeric +antiphysic +antiphysical +antiphysician +antiplague +antiplanet +antiplastic +antiplatelet +antipleion +antiplenist +antiplethoric +antipleuritic +antiplurality +antipneumococcic +antipodagric +antipodagron +antipodal +antipode +antipodean +antipodes +antipodic +antipodism +antipodist +antipoetic +antipoints +antipolar +antipole +antipolemist +antipolitical +antipollution +antipolo +antipolygamy +antipolyneuritic +antipool +antipooling +antipope +antipopery +antipopular +antipopulationist +antiportable +antiposition +antipoverty +antipragmatic +antipragmatist +antiprecipitin +antipredeterminant +antiprelate +antiprelatic +antiprelatist +antipreparedness +antiprestidigitation +antipriest +antipriestcraft +antiprime +antiprimer +antipriming +antiprinciple +antiprism +antiproductionist +antiprofiteering +antiprohibition +antiprohibitionist +antiprojectivity +antiprophet +antiprostate +antiprostatic +antiprotease +antiproteolysis +antiprotozoal +antiprudential +antipruritic +antipsalmist +antipsoric +antiptosis +antipudic +antipuritan +antiputrefaction +antiputrefactive +antiputrescent +antiputrid +antipyic +antipyonin +antipyresis +antipyretic +Antipyrine +antipyrotic +antipyryl +antiqua +antiquarian +antiquarianism +antiquarianize +antiquarianly +antiquarism +antiquartan +antiquary +antiquate +antiquated +antiquatedness +antiquation +antique +antiquely +antiqueness +antiquer +antiquing +antiquist +antiquitarian +antiquity +antirabic +antirabies +antiracemate +antiracer +antirachitic +antirachitically +antiracing +antiradiating +antiradiation +antiradical +antirailwayist +antirational +antirationalism +antirationalist +antirationalistic +antirattler +antireactive +antirealism +antirealistic +antirebating +antirecruiting +antired +antireducer +antireform +antireformer +antireforming +antireformist +antireligion +antireligious +antiremonstrant +antirennet +antirennin +antirent +antirenter +antirentism +antirepublican +antireservationist +antirestoration +antireticular +antirevisionist +antirevolutionary +antirevolutionist +antirheumatic +antiricin +antirickets +antiritual +antiritualistic +antirobin +antiromance +antiromantic +antiromanticism +antiroyal +antiroyalist +Antirrhinum +antirumor +antirun +antirust +antisacerdotal +antisacerdotalist +antisaloon +antisalooner +antisavage +antiscabious +antiscale +antischolastic +antischool +antiscians +antiscientific +antiscion +antiscolic +antiscorbutic +antiscorbutical +antiscrofulous +antiseismic +antiselene +antisensitizer +antisensuous +antisensuousness +antisepalous +antisepsin +antisepsis +antiseptic +antiseptical +antiseptically +antisepticism +antisepticist +antisepticize +antiseption +antiseptize +antiserum +antishipping +Antisi +antisialagogue +antisialic +antisiccative +antisideric +antisilverite +antisimoniacal +antisine +antisiphon +antisiphonal +antiskeptical +antiskid +antiskidding +antislavery +antislaveryism +antislickens +antislip +antismoking +antisnapper +antisocial +antisocialist +antisocialistic +antisocialistically +antisociality +antisolar +antisophist +antisoporific +antispace +antispadix +antispasis +antispasmodic +antispast +antispastic +antispectroscopic +antispermotoxin +antispiritual +antispirochetic +antisplasher +antisplenetic +antisplitting +antispreader +antispreading +antisquama +antisquatting +antistadholder +antistadholderian +antistalling +antistaphylococcic +antistate +antistatism +antistatist +antisteapsin +antisterility +antistes +antistimulant +antistock +antistreptococcal +antistreptococcic +antistreptococcin +antistreptococcus +antistrike +antistrophal +antistrophe +antistrophic +antistrophically +antistrophize +antistrophon +antistrumatic +antistrumous +antisubmarine +antisubstance +antisudoral +antisudorific +antisuffrage +antisuffragist +antisun +antisupernaturalism +antisupernaturalist +antisurplician +antisymmetrical +antisyndicalism +antisyndicalist +antisynod +antisyphilitic +antitabetic +antitabloid +antitangent +antitank +antitarnish +antitartaric +antitax +antiteetotalism +antitegula +antitemperance +antitetanic +antitetanolysin +antithalian +antitheft +antitheism +antitheist +antitheistic +antitheistical +antitheistically +antithenar +antitheologian +antitheological +antithermic +antithermin +antitheses +antithesis +antithesism +antithesize +antithet +antithetic +antithetical +antithetically +antithetics +antithrombic +antithrombin +antitintinnabularian +antitobacco +antitobacconal +antitobacconist +antitonic +antitorpedo +antitoxic +antitoxin +antitrade +antitrades +antitraditional +antitragal +antitragic +antitragicus +antitragus +antitrismus +antitrochanter +antitropal +antitrope +antitropic +antitropical +antitropous +antitropy +antitrust +antitrypsin +antitryptic +antituberculin +antituberculosis +antituberculotic +antituberculous +antiturnpikeism +antitwilight +antitypal +antitype +antityphoid +antitypic +antitypical +antitypically +antitypy +antityrosinase +antiunion +antiunionist +antiuratic +antiurease +antiusurious +antiutilitarian +antivaccination +antivaccinationist +antivaccinator +antivaccinist +antivariolous +antivenefic +antivenereal +antivenin +antivenom +antivenomous +antivermicular +antivibrating +antivibrator +antivibratory +antivice +antiviral +antivirus +antivitalist +antivitalistic +antivitamin +antivivisection +antivivisectionist +antivolition +antiwar +antiwarlike +antiwaste +antiwedge +antiweed +antiwit +antixerophthalmic +antizealot +antizymic +antizymotic +antler +antlered +antlerite +antlerless +antlia +antliate +Antlid +antling +antluetic +antodontalgic +antoeci +antoecian +antoecians +Antoinette +Anton +Antonia +Antonina +antoninianus +Antonio +antonomasia +antonomastic +antonomastical +antonomastically +antonomasy +antonym +antonymous +antonymy +antorbital +antproof +antra +antral +antralgia +antre +antrectomy +antrin +antritis +antrocele +antronasal +antrophore +antrophose +antrorse +antrorsely +antroscope +antroscopy +Antrostomus +antrotome +antrotomy +antrotympanic +antrotympanitis +antrum +antrustion +antrustionship +antship +Antu +antu +Antum +Antwerp +antwise +anubing +Anubis +anucleate +anukabiet +Anukit +anuloma +Anura +anuran +anuresis +anuretic +anuria +anuric +anurous +anury +anus +anusim +anusvara +anutraminosa +anvasser +anvil +anvilsmith +anxietude +anxiety +anxious +anxiously +anxiousness +any +anybody +Anychia +anyhow +anyone +anyplace +Anystidae +anything +anythingarian +anythingarianism +anyway +anyways +anywhen +anywhere +anywhereness +anywheres +anywhy +anywise +anywither +Anzac +Anzanian +Ao +aogiri +Aoife +aonach +Aonian +aorist +aoristic +aoristically +aorta +aortal +aortarctia +aortectasia +aortectasis +aortic +aorticorenal +aortism +aortitis +aortoclasia +aortoclasis +aortolith +aortomalacia +aortomalaxis +aortopathy +aortoptosia +aortoptosis +aortorrhaphy +aortosclerosis +aortostenosis +aortotomy +aosmic +Aotea +Aotearoa +Aotes +Aotus +aoudad +Aouellimiden +Aoul +apa +apabhramsa +apace +Apache +apache +Apachette +apachism +apachite +apadana +apagoge +apagogic +apagogical +apagogically +apaid +Apalachee +apalit +Apama +apandry +Apanteles +Apantesis +apanthropia +apanthropy +apar +Aparai +aparaphysate +aparejo +Apargia +aparithmesis +apart +apartheid +aparthrosis +apartment +apartmental +apartness +apasote +apastron +apatan +Apatela +apatetic +apathetic +apathetical +apathetically +apathic +apathism +apathist +apathistical +apathogenic +Apathus +apathy +apatite +Apatornis +Apatosaurus +Apaturia +Apayao +ape +apeak +apectomy +apedom +apehood +apeiron +apelet +apelike +apeling +apellous +Apemantus +Apennine +apenteric +apepsia +apepsinia +apepsy +apeptic +aper +aperch +aperea +aperient +aperiodic +aperiodically +aperiodicity +aperispermic +aperistalsis +aperitive +apert +apertly +apertness +apertometer +apertural +aperture +apertured +Aperu +apery +apesthesia +apesthetic +apesthetize +Apetalae +apetaloid +apetalose +apetalous +apetalousness +apetaly +apex +apexed +aphaeresis +aphaeretic +aphagia +aphakia +aphakial +aphakic +Aphanapteryx +Aphanes +aphanesite +Aphaniptera +aphanipterous +aphanite +aphanitic +aphanitism +Aphanomyces +aphanophyre +aphanozygous +Apharsathacites +aphasia +aphasiac +aphasic +Aphelandra +Aphelenchus +aphelian +Aphelinus +aphelion +apheliotropic +apheliotropically +apheliotropism +Aphelops +aphemia +aphemic +aphengescope +aphengoscope +aphenoscope +apheresis +apheretic +aphesis +apheta +aphetic +aphetically +aphetism +aphetize +aphicidal +aphicide +aphid +aphides +aphidian +aphidicide +aphidicolous +aphidid +Aphididae +Aphidiinae +aphidious +Aphidius +aphidivorous +aphidolysin +aphidophagous +aphidozer +aphilanthropy +Aphis +aphlaston +aphlebia +aphlogistic +aphnology +aphodal +aphodian +Aphodius +aphodus +aphonia +aphonic +aphonous +aphony +aphoria +aphorism +aphorismatic +aphorismer +aphorismic +aphorismical +aphorismos +aphorist +aphoristic +aphoristically +aphorize +aphorizer +Aphoruridae +aphotic +aphototactic +aphototaxis +aphototropic +aphototropism +Aphra +aphrasia +aphrite +aphrizite +aphrodisia +aphrodisiac +aphrodisiacal +aphrodisian +Aphrodision +Aphrodistic +Aphrodite +Aphroditeum +aphroditic +Aphroditidae +aphroditous +aphrolite +aphronia +aphrosiderite +aphtha +Aphthartodocetae +Aphthartodocetic +Aphthartodocetism +aphthic +aphthitalite +aphthoid +aphthong +aphthongal +aphthongia +aphthous +aphydrotropic +aphydrotropism +aphyllose +aphyllous +aphylly +aphyric +Apiaca +Apiaceae +apiaceous +Apiales +apian +apiarian +apiarist +apiary +apiator +apicad +apical +apically +apices +Apician +apicifixed +apicilar +apicillary +apicitis +apickaback +apicoectomy +apicolysis +apicula +apicular +apiculate +apiculated +apiculation +apicultural +apiculture +apiculturist +apiculus +Apidae +apiece +apieces +apigenin +apii +apiin +apikoros +apilary +Apina +Apinae +Apinage +apinch +aping +apinoid +apio +Apioceridae +apioid +apioidal +apiole +apiolin +apiologist +apiology +apionol +Apios +apiose +Apiosoma +apiphobia +Apis +apish +apishamore +apishly +apishness +apism +apitong +apitpat +Apium +apivorous +apjohnite +aplacental +Aplacentalia +Aplacentaria +Aplacophora +aplacophoran +aplacophorous +aplanat +aplanatic +aplanatically +aplanatism +Aplanobacter +aplanogamete +aplanospore +aplasia +aplastic +Aplectrum +aplenty +aplite +aplitic +aplobasalt +aplodiorite +Aplodontia +Aplodontiidae +aplomb +aplome +Aplopappus +aploperistomatous +aplostemonous +aplotaxene +aplotomy +Apluda +aplustre +Aplysia +apnea +apneal +apneic +apneumatic +apneumatosis +Apneumona +apneumonous +apneustic +apoaconitine +apoatropine +apobiotic +apoblast +apocaffeine +apocalypse +apocalypst +apocalypt +apocalyptic +apocalyptical +apocalyptically +apocalypticism +apocalyptism +apocalyptist +apocamphoric +apocarp +apocarpous +apocarpy +apocatastasis +apocatastatic +apocatharsis +apocenter +apocentric +apocentricity +apocha +apocholic +apochromat +apochromatic +apochromatism +apocinchonine +apocodeine +apocopate +apocopated +apocopation +apocope +apocopic +apocrenic +apocrisiary +Apocrita +apocrustic +apocryph +Apocrypha +apocryphal +apocryphalist +apocryphally +apocryphalness +apocryphate +apocryphon +Apocynaceae +apocynaceous +apocyneous +Apocynum +apod +Apoda +apodal +apodan +apodeipnon +apodeixis +apodema +apodemal +apodematal +apodeme +Apodes +Apodia +apodia +apodictic +apodictical +apodictically +apodictive +Apodidae +apodixis +apodosis +apodous +apodyterium +apoembryony +apofenchene +apogaeic +apogalacteum +apogamic +apogamically +apogamous +apogamously +apogamy +apogeal +apogean +apogee +apogeic +apogenous +apogeny +apogeotropic +apogeotropically +apogeotropism +Apogon +Apogonidae +apograph +apographal +apoharmine +apohyal +Apoidea +apoise +apojove +apokrea +apokreos +apolar +apolarity +apolaustic +apolegamic +Apolista +Apolistan +Apollinarian +Apollinarianism +Apolline +Apollo +Apollonia +Apollonian +Apollonic +apollonicon +Apollonistic +Apolloship +Apollyon +apologal +apologete +apologetic +apologetical +apologetically +apologetics +apologia +apologist +apologize +apologizer +apologue +apology +apolousis +Apolysin +apolysis +apolytikion +apomecometer +apomecometry +apometabolic +apometabolism +apometabolous +apometaboly +apomictic +apomictical +apomixis +apomorphia +apomorphine +aponeurology +aponeurorrhaphy +aponeurosis +aponeurositis +aponeurotic +aponeurotome +aponeurotomy +aponia +aponic +Aponogeton +Aponogetonaceae +aponogetonaceous +apoop +apopenptic +apopetalous +apophantic +apophasis +apophatic +Apophis +apophlegmatic +apophonia +apophony +apophorometer +apophthegm +apophthegmatist +apophyge +apophylactic +apophylaxis +apophyllite +apophyllous +apophysary +apophysate +apophyseal +apophysis +apophysitis +apoplasmodial +apoplastogamous +apoplectic +apoplectical +apoplectically +apoplectiform +apoplectoid +apoplex +apoplexy +apopyle +apoquinamine +apoquinine +aporetic +aporetical +aporhyolite +aporia +Aporobranchia +aporobranchian +Aporobranchiata +Aporocactus +Aporosa +aporose +aporphin +aporphine +Aporrhaidae +Aporrhais +aporrhaoid +aporrhegma +aport +aportoise +aposafranine +aposaturn +aposaturnium +aposematic +aposematically +aposepalous +aposia +aposiopesis +aposiopetic +apositia +apositic +aposoro +aposporogony +aposporous +apospory +apostasis +apostasy +apostate +apostatic +apostatical +apostatically +apostatism +apostatize +apostaxis +apostemate +apostematic +apostemation +apostematous +aposteme +aposteriori +aposthia +apostil +apostle +apostlehood +apostleship +apostolate +apostoless +apostoli +Apostolian +Apostolic +apostolic +apostolical +apostolically +apostolicalness +Apostolici +apostolicism +apostolicity +apostolize +Apostolos +apostrophal +apostrophation +apostrophe +apostrophic +apostrophied +apostrophize +apostrophus +Apotactic +Apotactici +apotelesm +apotelesmatic +apotelesmatical +apothecal +apothecary +apothecaryship +apothece +apothecial +apothecium +apothegm +apothegmatic +apothegmatical +apothegmatically +apothegmatist +apothegmatize +apothem +apotheose +apotheoses +apotheosis +apotheosize +apothesine +apothesis +apotome +apotracheal +apotropaic +apotropaion +apotropaism +apotropous +apoturmeric +apotype +apotypic +apout +apoxesis +Apoxyomenos +apozem +apozema +apozemical +apozymase +Appalachia +Appalachian +appall +appalling +appallingly +appallment +appalment +appanage +appanagist +apparatus +apparel +apparelment +apparence +apparency +apparent +apparently +apparentness +apparition +apparitional +apparitor +appassionata +appassionato +appay +appeal +appealability +appealable +appealer +appealing +appealingly +appealingness +appear +appearance +appearanced +appearer +appeasable +appeasableness +appeasably +appease +appeasement +appeaser +appeasing +appeasingly +appeasive +appellability +appellable +appellancy +appellant +appellate +appellation +appellational +appellative +appellatived +appellatively +appellativeness +appellatory +appellee +appellor +append +appendage +appendaged +appendalgia +appendance +appendancy +appendant +appendectomy +appendical +appendicalgia +appendice +appendicectasis +appendicectomy +appendices +appendicial +appendicious +appendicitis +appendicle +appendicocaecostomy +appendicostomy +appendicular +Appendicularia +appendicularian +Appendiculariidae +Appendiculata +appendiculate +appendiculated +appenditious +appendix +appendorontgenography +appendotome +appentice +apperceive +apperception +apperceptionism +apperceptionist +apperceptionistic +apperceptive +apperceptively +appercipient +appersonation +appertain +appertainment +appertinent +appet +appete +appetence +appetency +appetent +appetently +appetibility +appetible +appetibleness +appetite +appetition +appetitional +appetitious +appetitive +appetize +appetizement +appetizer +appetizingly +appinite +Appius +applanate +applanation +applaud +applaudable +applaudably +applauder +applaudingly +applause +applausive +applausively +apple +appleberry +appleblossom +applecart +appledrane +applegrower +applejack +applejohn +applemonger +applenut +appleringy +appleroot +applesauce +applewife +applewoman +appliable +appliableness +appliably +appliance +appliant +applicability +applicable +applicableness +applicably +applicancy +applicant +applicate +application +applicative +applicatively +applicator +applicatorily +applicatory +applied +appliedly +applier +applique +applosion +applosive +applot +applotment +apply +applyingly +applyment +appoggiatura +appoint +appointable +appointe +appointee +appointer +appointive +appointment +appointor +Appomatox +Appomattoc +apport +apportion +apportionable +apportioner +apportionment +apposability +apposable +appose +apposer +apposiopestic +apposite +appositely +appositeness +apposition +appositional +appositionally +appositive +appositively +appraisable +appraisal +appraise +appraisement +appraiser +appraising +appraisingly +appraisive +appreciable +appreciably +appreciant +appreciate +appreciatingly +appreciation +appreciational +appreciativ +appreciative +appreciatively +appreciativeness +appreciator +appreciatorily +appreciatory +appredicate +apprehend +apprehender +apprehendingly +apprehensibility +apprehensible +apprehensibly +apprehension +apprehensive +apprehensively +apprehensiveness +apprend +apprense +apprentice +apprenticehood +apprenticement +apprenticeship +appressed +appressor +appressorial +appressorium +appreteur +apprise +apprize +apprizement +apprizer +approach +approachability +approachabl +approachable +approachableness +approacher +approaching +approachless +approachment +approbate +approbation +approbative +approbativeness +approbator +approbatory +approof +appropinquate +appropinquation +appropinquity +appropre +appropriable +appropriate +appropriately +appropriateness +appropriation +appropriative +appropriativeness +appropriator +approvable +approvableness +approval +approvance +approve +approvedly +approvedness +approvement +approver +approvingly +approximal +approximate +approximately +approximation +approximative +approximatively +approximativeness +approximator +appulse +appulsion +appulsive +appulsively +appurtenance +appurtenant +apractic +apraxia +apraxic +apricate +aprication +aprickle +apricot +April +Aprilesque +Apriline +Aprilis +apriori +apriorism +apriorist +aprioristic +apriority +Aprocta +aproctia +aproctous +apron +aproneer +apronful +apronless +apronlike +apropos +aprosexia +aprosopia +aprosopous +aproterodont +apse +apselaphesia +apselaphesis +apsidal +apsidally +apsides +apsidiole +apsis +apsychia +apsychical +apt +Aptal +Aptenodytes +Aptera +apteral +apteran +apterial +apterium +apteroid +apterous +Apteryges +apterygial +Apterygidae +Apterygiformes +Apterygogenea +Apterygota +apterygote +apterygotous +Apteryx +Aptian +Aptiana +aptitude +aptitudinal +aptitudinally +aptly +aptness +aptote +aptotic +aptyalia +aptyalism +aptychus +Apulian +apulmonic +apulse +apurpose +Apus +apyonin +apyrene +apyretic +apyrexia +apyrexial +apyrexy +apyrotype +apyrous +aqua +aquabelle +aquabib +aquacade +aquacultural +aquaculture +aquaemanale +aquafortist +aquage +aquagreen +aquamarine +aquameter +aquaplane +aquapuncture +aquarelle +aquarellist +aquaria +aquarial +Aquarian +aquarian +Aquarid +Aquarii +aquariist +aquarium +Aquarius +aquarter +aquascutum +aquatic +aquatical +aquatically +aquatile +aquatint +aquatinta +aquatinter +aquation +aquativeness +aquatone +aquavalent +aquavit +aqueduct +aqueoglacial +aqueoigneous +aqueomercurial +aqueous +aqueously +aqueousness +aquicolous +aquicultural +aquiculture +aquiculturist +aquifer +aquiferous +Aquifoliaceae +aquifoliaceous +aquiform +Aquila +Aquilaria +aquilawood +aquilege +Aquilegia +Aquilian +Aquilid +aquiline +aquilino +aquincubital +aquincubitalism +Aquinist +aquintocubital +aquintocubitalism +aquiparous +Aquitanian +aquiver +aquo +aquocapsulitis +aquocarbonic +aquocellolitis +aquopentamminecobaltic +aquose +aquosity +aquotization +aquotize +ar +ara +Arab +araba +araban +arabana +Arabella +arabesque +arabesquely +arabesquerie +Arabian +Arabianize +Arabic +Arabicism +Arabicize +Arabidopsis +arability +arabin +arabinic +arabinose +arabinosic +Arabis +Arabism +Arabist +arabit +arabitol +arabiyeh +Arabize +arable +Arabophil +Araby +araca +Aracana +aracanga +aracari +Araceae +araceous +arachic +arachidonic +arachin +Arachis +arachnactis +Arachne +arachnean +arachnid +Arachnida +arachnidan +arachnidial +arachnidism +arachnidium +arachnism +Arachnites +arachnitis +arachnoid +arachnoidal +Arachnoidea +arachnoidea +arachnoidean +arachnoiditis +arachnological +arachnologist +arachnology +Arachnomorphae +arachnophagous +arachnopia +arad +Aradidae +arado +araeostyle +araeosystyle +Aragallus +Aragonese +Aragonian +aragonite +araguato +arain +Arains +Arakanese +arakawaite +arake +Arales +Aralia +Araliaceae +araliaceous +araliad +Araliaephyllum +aralie +Araliophyllum +aralkyl +aralkylated +Aramaean +Aramaic +Aramaicize +Aramaism +aramayoite +Aramidae +aramina +Araminta +Aramis +Aramitess +Aramu +Aramus +Aranea +Araneae +araneid +Araneida +araneidan +araneiform +Araneiformes +Araneiformia +aranein +Araneina +Araneoidea +araneologist +araneology +araneous +aranga +arango +Aranyaka +aranzada +arapahite +Arapaho +arapaima +araphorostic +arapunga +Araquaju +arar +Arara +arara +araracanga +ararao +ararauna +arariba +araroba +arati +aration +aratory +Araua +Arauan +Araucan +Araucanian +Araucano +Araucaria +Araucariaceae +araucarian +Araucarioxylon +Araujia +Arauna +Arawa +Arawak +Arawakan +Arawakian +arba +Arbacia +arbacin +arbalest +arbalester +arbalestre +arbalestrier +arbalist +arbalister +arbalo +Arbela +arbiter +arbitrable +arbitrager +arbitragist +arbitral +arbitrament +arbitrarily +arbitrariness +arbitrary +arbitrate +arbitration +arbitrational +arbitrationist +arbitrative +arbitrator +arbitratorship +arbitratrix +arbitrement +arbitrer +arbitress +arboloco +arbor +arboraceous +arboral +arborary +arborator +arboreal +arboreally +arborean +arbored +arboreous +arborescence +arborescent +arborescently +arboresque +arboret +arboreta +arboretum +arborical +arboricole +arboricoline +arboricolous +arboricultural +arboriculture +arboriculturist +arboriform +arborist +arborization +arborize +arboroid +arborolatry +arborous +arborvitae +arborway +arbuscle +arbuscula +arbuscular +arbuscule +arbusterol +arbustum +arbutase +arbute +arbutean +arbutin +arbutinase +arbutus +arc +arca +Arcacea +arcade +Arcadia +Arcadian +arcadian +Arcadianism +Arcadianly +Arcadic +Arcady +arcana +arcanal +arcane +arcanite +arcanum +arcate +arcature +Arcella +Arceuthobium +arch +archabomination +archae +archaecraniate +Archaeoceti +Archaeocyathidae +Archaeocyathus +archaeogeology +archaeographic +archaeographical +archaeography +archaeolatry +archaeolith +archaeolithic +archaeologer +archaeologian +archaeologic +archaeological +archaeologically +archaeologist +archaeology +Archaeopithecus +Archaeopteris +Archaeopterygiformes +Archaeopteryx +Archaeornis +Archaeornithes +archaeostoma +Archaeostomata +archaeostomatous +archagitator +archaic +archaical +archaically +archaicism +archaism +archaist +archaistic +archaize +archaizer +archangel +archangelic +Archangelica +archangelical +archangelship +archantagonist +archantiquary +archapostate +archapostle +archarchitect +archarios +archartist +archband +archbeacon +archbeadle +archbishop +archbishopess +archbishopric +archbishopry +archbotcher +archboutefeu +archbuffoon +archbuilder +archchampion +archchaplain +archcharlatan +archcheater +archchemic +archchief +archchronicler +archcity +archconfraternity +archconsoler +archconspirator +archcorrupter +archcorsair +archcount +archcozener +archcriminal +archcritic +archcrown +archcupbearer +archdapifer +archdapifership +archdeacon +archdeaconate +archdeaconess +archdeaconry +archdeaconship +archdean +archdeanery +archdeceiver +archdefender +archdemon +archdepredator +archdespot +archdetective +archdevil +archdiocesan +archdiocese +archdiplomatist +archdissembler +archdisturber +archdivine +archdogmatist +archdolt +archdruid +archducal +archduchess +archduchy +archduke +archdukedom +arche +archeal +Archean +archearl +archebiosis +archecclesiastic +archecentric +arched +archegone +archegonial +Archegoniata +Archegoniatae +archegoniate +archegoniophore +archegonium +archegony +Archegosaurus +archeion +Archelaus +Archelenis +archelogy +Archelon +archemperor +Archencephala +archencephalic +archenemy +archengineer +archenteric +archenteron +archeocyte +Archeozoic +Archer +archer +archeress +archerfish +archership +archery +arches +archespore +archesporial +archesporium +archetypal +archetypally +archetype +archetypic +archetypical +archetypically +archetypist +archeunuch +archeus +archexorcist +archfelon +archfiend +archfire +archflamen +archflatterer +archfoe +archfool +archform +archfounder +archfriend +archgenethliac +archgod +archgomeral +archgovernor +archgunner +archhead +archheart +archheresy +archheretic +archhost +archhouse +archhumbug +archhypocrisy +archhypocrite +Archiannelida +archiater +Archibald +archibenthal +archibenthic +archibenthos +archiblast +archiblastic +archiblastoma +archiblastula +Archibuteo +archicantor +archicarp +archicerebrum +Archichlamydeae +archichlamydeous +archicleistogamous +archicleistogamy +archicoele +archicontinent +archicyte +archicytula +Archidamus +Archidiaceae +archidiaconal +archidiaconate +archididascalian +archididascalos +Archidiskodon +Archidium +archidome +Archie +archiepiscopacy +archiepiscopal +archiepiscopally +archiepiscopate +archiereus +archigaster +archigastrula +archigenesis +archigonic +archigonocyte +archigony +archiheretical +archikaryon +archil +archilithic +Archilochian +archilowe +archimage +Archimago +archimagus +archimandrite +Archimedean +Archimedes +archimime +archimorphic +archimorula +archimperial +archimperialism +archimperialist +archimperialistic +archimpressionist +Archimycetes +archineuron +archinfamy +archinformer +arching +archipallial +archipallium +archipelagian +archipelagic +archipelago +archipin +archiplasm +archiplasmic +Archiplata +archiprelatical +archipresbyter +archipterygial +archipterygium +archisperm +Archispermae +archisphere +archispore +archistome +archisupreme +archisymbolical +architect +architective +architectonic +Architectonica +architectonically +architectonics +architectress +architectural +architecturalist +architecturally +architecture +architecturesque +Architeuthis +architis +architraval +architrave +architraved +architypographer +archival +archive +archivist +archivolt +archizoic +archjockey +archking +archknave +archleader +archlecher +archleveler +archlexicographer +archliar +archlute +archly +archmachine +archmagician +archmagirist +archmarshal +archmediocrity +archmessenger +archmilitarist +archmime +archminister +archmock +archmocker +archmockery +archmonarch +archmonarchist +archmonarchy +archmugwump +archmurderer +archmystagogue +archness +archocele +archocystosyrinx +archology +archon +archonship +archont +archontate +Archontia +archontic +archoplasm +archoplasmic +archoptoma +archoptosis +archorrhagia +archorrhea +archostegnosis +archostenosis +archosyrinx +archoverseer +archpall +archpapist +archpastor +archpatriarch +archpatron +archphilosopher +archphylarch +archpiece +archpilferer +archpillar +archpirate +archplagiarist +archplagiary +archplayer +archplotter +archplunderer +archplutocrat +archpoet +archpolitician +archpontiff +archpractice +archprelate +archprelatic +archprelatical +archpresbyter +archpresbyterate +archpresbytery +archpretender +archpriest +archpriesthood +archpriestship +archprimate +archprince +archprophet +archprotopope +archprototype +archpublican +archpuritan +archradical +archrascal +archreactionary +archrebel +archregent +archrepresentative +archrobber +archrogue +archruler +archsacrificator +archsacrificer +archsaint +archsatrap +archscoundrel +archseducer +archsee +archsewer +archshepherd +archsin +archsnob +archspirit +archspy +archsteward +archswindler +archsynagogue +archtempter +archthief +archtraitor +archtreasurer +archtreasurership +archturncoat +archtyrant +archurger +archvagabond +archvampire +archvestryman +archvillain +archvillainy +archvisitor +archwag +archway +archwench +archwise +archworker +archworkmaster +Archy +archy +Arcidae +Arcifera +arciferous +arcifinious +arciform +arcing +Arcite +arcked +arcking +arcocentrous +arcocentrum +arcograph +Arcos +Arctalia +Arctalian +Arctamerican +arctation +Arctia +arctian +arctic +arctically +arctician +arcticize +arcticward +arcticwards +arctiid +Arctiidae +Arctisca +Arctium +Arctocephalus +Arctogaea +Arctogaeal +Arctogaean +arctoid +Arctoidea +arctoidean +Arctomys +Arctos +Arctosis +Arctostaphylos +Arcturia +Arcturus +arcual +arcuale +arcuate +arcuated +arcuately +arcuation +arcubalist +arcubalister +arcula +arculite +ardassine +Ardea +Ardeae +ardeb +Ardeidae +Ardelia +ardella +ardency +ardennite +ardent +ardently +ardentness +Ardhamagadhi +Ardhanari +ardish +Ardisia +Ardisiaceae +ardoise +ardor +ardri +ardu +arduinite +arduous +arduously +arduousness +ardurous +are +area +areach +aread +areal +areality +Arean +arear +areasoner +areaway +Areca +Arecaceae +arecaceous +arecaidin +arecaidine +arecain +arecaine +Arecales +arecolidin +arecolidine +arecolin +arecoline +Arecuna +ared +areek +areel +arefact +arefaction +aregenerative +aregeneratory +areito +arena +arenaceous +arenae +Arenaria +arenariae +arenarious +arenation +arend +arendalite +areng +Arenga +Arenicola +arenicole +arenicolite +arenicolous +Arenig +arenilitic +arenoid +arenose +arenosity +arent +areocentric +areographer +areographic +areographical +areographically +areography +areola +areolar +areolate +areolated +areolation +areole +areolet +areologic +areological +areologically +areologist +areology +areometer +areometric +areometrical +areometry +Areopagist +Areopagite +Areopagitic +Areopagitica +Areopagus +areotectonics +areroscope +aretaics +arete +Arethusa +Arethuse +Aretinian +arfvedsonite +argal +argala +argali +argans +Argante +Argas +argasid +Argasidae +Argean +argeers +argel +Argemone +argemony +argenol +argent +argental +argentamid +argentamide +argentamin +argentamine +argentate +argentation +argenteous +argenter +argenteum +argentic +argenticyanide +argentide +argentiferous +Argentina +Argentine +argentine +Argentinean +Argentinian +Argentinidae +argentinitrate +Argentinize +Argentino +argention +argentite +argentojarosite +argentol +argentometric +argentometrically +argentometry +argenton +argentoproteinum +argentose +argentous +argentum +Argestes +arghan +arghel +arghool +Argid +argil +argillaceous +argilliferous +argillite +argillitic +argilloarenaceous +argillocalcareous +argillocalcite +argilloferruginous +argilloid +argillomagnesian +argillous +arginine +argininephosphoric +Argiope +Argiopidae +Argiopoidea +Argive +Argo +argo +Argoan +argol +argolet +Argolian +Argolic +Argolid +argon +Argonaut +Argonauta +Argonautic +Argonne +argosy +argot +argotic +Argovian +arguable +argue +arguer +argufier +argufy +Argulus +argument +argumental +argumentation +argumentatious +argumentative +argumentatively +argumentativeness +argumentator +argumentatory +Argus +argusfish +Argusianus +Arguslike +argute +argutely +arguteness +Argyle +Argyll +Argynnis +argyranthemous +argyranthous +Argyraspides +argyria +argyric +argyrite +argyrocephalous +argyrodite +Argyrol +Argyroneta +Argyropelecus +argyrose +argyrosis +Argyrosomus +argyrythrose +arhar +arhat +arhatship +Arhauaco +arhythmic +aria +Ariadne +Arian +Ariana +Arianism +Arianistic +Arianistical +Arianize +Arianizer +Arianrhod +aribine +Arician +aricine +arid +Arided +aridge +aridian +aridity +aridly +aridness +ariegite +Ariel +ariel +arienzo +Aries +arietation +Arietid +arietinous +arietta +aright +arightly +arigue +Ariidae +Arikara +aril +ariled +arillary +arillate +arillated +arilliform +arillode +arillodium +arilloid +arillus +Arimasp +Arimaspian +Arimathaean +Ariocarpus +Arioi +Arioian +Arion +ariose +arioso +ariot +aripple +Arisaema +arisard +arise +arisen +arist +arista +Aristarch +Aristarchian +aristarchy +aristate +Aristeas +Aristida +Aristides +Aristippus +aristocracy +aristocrat +aristocratic +aristocratical +aristocratically +aristocraticalness +aristocraticism +aristocraticness +aristocratism +aristodemocracy +aristodemocratical +aristogenesis +aristogenetic +aristogenic +aristogenics +Aristol +Aristolochia +Aristolochiaceae +aristolochiaceous +Aristolochiales +aristolochin +aristolochine +aristological +aristologist +aristology +aristomonarchy +Aristophanic +aristorepublicanism +Aristotelian +Aristotelianism +Aristotelic +Aristotelism +aristotype +aristulate +arite +arithmetic +arithmetical +arithmetically +arithmetician +arithmetization +arithmetize +arithmic +arithmocracy +arithmocratic +arithmogram +arithmograph +arithmography +arithmomania +arithmometer +Arius +Arivaipa +Arizona +Arizonan +Arizonian +arizonite +arjun +ark +Arkab +Arkansan +Arkansas +Arkansawyer +arkansite +Arkite +arkite +arkose +arkosic +arksutite +Arleng +arles +Arline +arm +armada +armadilla +Armadillididae +Armadillidium +armadillo +Armado +Armageddon +Armageddonist +armagnac +armament +armamentarium +armamentary +armangite +armariolum +armarium +Armata +Armatoles +Armatoli +armature +armbone +armchair +armchaired +armed +armeniaceous +Armenian +Armenic +Armenize +Armenoid +armer +Armeria +Armeriaceae +armet +armful +armgaunt +armhole +armhoop +Armida +armied +armiferous +armiger +armigeral +armigerous +armil +armilla +Armillaria +armillary +armillate +armillated +arming +Arminian +Arminianism +Arminianize +Arminianizer +armipotence +armipotent +armisonant +armisonous +armistice +armless +armlet +armload +armoire +armonica +armor +Armoracia +armored +armorer +armorial +Armoric +Armorican +Armorician +armoried +armorist +armorproof +armorwise +armory +Armouchiquois +armozeen +armpiece +armpit +armplate +armrack +armrest +arms +armscye +armure +army +arn +arna +Arnaut +arnberry +Arneb +Arnebia +arnee +arni +arnica +Arnold +Arnoldist +Arnoseris +arnotta +arnotto +Arnusian +arnut +Aro +aroar +aroast +arock +aroeira +aroid +aroideous +Aroides +aroint +arolium +arolla +aroma +aromacity +aromadendrin +aromatic +aromatically +aromaticness +aromatite +aromatites +aromatization +aromatize +aromatizer +aromatophor +aromatophore +Aronia +aroon +Aroras +Arosaguntacook +arose +around +arousal +arouse +arousement +arouser +arow +aroxyl +arpeggiando +arpeggiated +arpeggiation +arpeggio +arpeggioed +arpen +arpent +arquerite +arquifoux +arracach +arracacha +Arracacia +arrack +arrah +arraign +arraigner +arraignment +arrame +arrange +arrangeable +arrangement +arranger +arrant +arrantly +Arras +arras +arrased +arrasene +arrastra +arrastre +arratel +arrau +array +arrayal +arrayer +arrayment +arrear +arrearage +arrect +arrector +arrendation +arrenotokous +arrenotoky +arrent +arrentable +arrentation +arreptitious +arrest +arrestable +arrestation +arrestee +arrester +arresting +arrestingly +arrestive +arrestment +arrestor +Arretine +arrhenal +Arrhenatherum +arrhenoid +arrhenotokous +arrhenotoky +arrhinia +arrhizal +arrhizous +arrhythmia +arrhythmic +arrhythmical +arrhythmically +arrhythmous +arrhythmy +arriage +arriba +arride +arridge +arrie +arriere +Arriet +arrimby +arris +arrish +arrisways +arriswise +arrival +arrive +arriver +arroba +arrogance +arrogancy +arrogant +arrogantly +arrogantness +arrogate +arrogatingly +arrogation +arrogative +arrogator +arrojadite +arrope +arrosive +arrow +arrowbush +arrowed +arrowhead +arrowheaded +arrowleaf +arrowless +arrowlet +arrowlike +arrowplate +arrowroot +arrowsmith +arrowstone +arrowweed +arrowwood +arrowworm +arrowy +arroyo +Arruague +Arry +Arryish +Arsacid +Arsacidan +arsanilic +arse +arsedine +arsenal +arsenate +arsenation +arseneted +arsenetted +arsenfast +arsenferratose +arsenhemol +arseniasis +arseniate +arsenic +arsenical +arsenicalism +arsenicate +arsenicism +arsenicize +arsenicophagy +arsenide +arseniferous +arsenillo +arseniopleite +arseniosiderite +arsenious +arsenism +arsenite +arsenium +arseniuret +arseniureted +arsenization +arseno +arsenobenzene +arsenobenzol +arsenobismite +arsenoferratin +arsenofuran +arsenohemol +arsenolite +arsenophagy +arsenophen +arsenophenol +arsenophenylglycin +arsenopyrite +arsenostyracol +arsenotherapy +arsenotungstates +arsenotungstic +arsenous +arsenoxide +arsenyl +arses +arsesmart +arsheen +arshin +arshine +arsine +arsinic +arsino +Arsinoitherium +arsis +arsle +arsmetrik +arsmetrike +arsnicker +arsoite +arson +arsonate +arsonation +arsonic +arsonist +arsonite +arsonium +arsono +arsonvalization +arsphenamine +arsyl +arsylene +Art +art +artaba +artabe +artal +Artamidae +Artamus +artar +artarine +artcraft +artefact +artel +Artemas +Artemia +Artemis +Artemisia +artemisic +artemisin +Artemision +Artemisium +arteriagra +arterial +arterialization +arterialize +arterially +arteriarctia +arteriasis +arteriectasia +arteriectasis +arteriectopia +arterin +arterioarctia +arteriocapillary +arteriococcygeal +arteriodialysis +arteriodiastasis +arteriofibrosis +arteriogenesis +arteriogram +arteriograph +arteriography +arteriole +arteriolith +arteriology +arteriolosclerosis +arteriomalacia +arteriometer +arteriomotor +arterionecrosis +arteriopalmus +arteriopathy +arteriophlebotomy +arterioplania +arterioplasty +arteriopressor +arteriorenal +arteriorrhagia +arteriorrhaphy +arteriorrhexis +arteriosclerosis +arteriosclerotic +arteriospasm +arteriostenosis +arteriostosis +arteriostrepsis +arteriosympathectomy +arteriotome +arteriotomy +arteriotrepsis +arterious +arteriovenous +arterioversion +arterioverter +arteritis +artery +Artesian +artesian +artful +artfully +artfulness +Artgum +artha +arthel +arthemis +arthragra +arthral +arthralgia +arthralgic +arthrectomy +arthredema +arthrempyesis +arthresthesia +arthritic +arthritical +arthriticine +arthritis +arthritism +arthrobacterium +arthrobranch +arthrobranchia +arthrocace +arthrocarcinoma +arthrocele +arthrochondritis +arthroclasia +arthrocleisis +arthroclisis +arthroderm +arthrodesis +arthrodia +arthrodial +arthrodic +Arthrodira +arthrodiran +arthrodire +arthrodirous +Arthrodonteae +arthrodynia +arthrodynic +arthroempyema +arthroempyesis +arthroendoscopy +Arthrogastra +arthrogastran +arthrogenous +arthrography +arthrogryposis +arthrolite +arthrolith +arthrolithiasis +arthrology +arthromeningitis +arthromere +arthromeric +arthrometer +arthrometry +arthroncus +arthroneuralgia +arthropathic +arthropathology +arthropathy +arthrophlogosis +arthrophyma +arthroplastic +arthroplasty +arthropleura +arthropleure +arthropod +Arthropoda +arthropodal +arthropodan +arthropodous +Arthropomata +arthropomatous +arthropterous +arthropyosis +arthrorheumatism +arthrorrhagia +arthrosclerosis +arthrosia +arthrosis +arthrospore +arthrosporic +arthrosporous +arthrosteitis +arthrosterigma +arthrostome +arthrostomy +Arthrostraca +arthrosynovitis +arthrosyrinx +arthrotome +arthrotomy +arthrotrauma +arthrotropic +arthrotyphoid +arthrous +arthroxerosis +Arthrozoa +arthrozoan +arthrozoic +Arthur +Arthurian +Arthuriana +artiad +artichoke +article +articled +articulability +articulable +articulacy +articulant +articular +articulare +articularly +articulary +Articulata +articulate +articulated +articulately +articulateness +articulation +articulationist +articulative +articulator +articulatory +articulite +articulus +Artie +artifact +artifactitious +artifice +artificer +artificership +artificial +artificialism +artificiality +artificialize +artificially +artificialness +artiller +artillerist +artillery +artilleryman +artilleryship +artiness +artinite +Artinskian +artiodactyl +Artiodactyla +artiodactylous +artiphyllous +artisan +artisanship +artist +artistdom +artiste +artistic +artistical +artistically +artistry +artless +artlessly +artlessness +artlet +artlike +Artocarpaceae +artocarpad +artocarpeous +artocarpous +Artocarpus +artolater +artophagous +artophorion +artotype +artotypy +Artotyrite +artware +arty +aru +Aruac +arui +aruke +Arulo +Arum +arumin +Aruncus +arundiferous +arundinaceous +Arundinaria +arundineous +Arundo +Arunta +arupa +arusa +arusha +arustle +arval +arvel +Arverni +Arvicola +arvicole +Arvicolinae +arvicoline +arvicolous +arviculture +arx +ary +Arya +Aryan +Aryanism +Aryanization +Aryanize +aryballoid +aryballus +aryepiglottic +aryl +arylamine +arylamino +arylate +arytenoid +arytenoidal +arzan +Arzava +Arzawa +arzrunite +arzun +As +as +Asa +asaddle +asafetida +Asahel +asak +asale +asana +Asaph +asaphia +Asaphic +asaphid +Asaphidae +Asaphus +asaprol +asarabacca +Asaraceae +Asarh +asarite +asaron +asarone +asarotum +Asarum +asbest +asbestic +asbestiform +asbestine +asbestinize +asbestoid +asbestoidal +asbestos +asbestosis +asbestous +asbestus +asbolin +asbolite +Ascabart +Ascalabota +ascan +Ascanian +Ascanius +ascare +ascariasis +ascaricidal +ascaricide +ascarid +Ascaridae +ascarides +Ascaridia +ascaridiasis +ascaridole +Ascaris +ascaron +Ascella +ascellus +ascend +ascendable +ascendance +ascendancy +ascendant +ascendence +ascendency +ascendent +ascender +ascendible +ascending +ascendingly +ascension +ascensional +ascensionist +Ascensiontide +ascensive +ascent +ascertain +ascertainable +ascertainableness +ascertainably +ascertainer +ascertainment +ascescency +ascescent +ascetic +ascetical +ascetically +asceticism +Ascetta +aschaffite +ascham +aschistic +asci +ascian +Ascidia +Ascidiacea +Ascidiae +ascidian +ascidiate +ascidicolous +ascidiferous +ascidiform +ascidioid +Ascidioida +Ascidioidea +Ascidiozoa +ascidiozooid +ascidium +asciferous +ascigerous +ascii +ascites +ascitic +ascitical +ascititious +asclent +Asclepiad +asclepiad +Asclepiadaceae +asclepiadaceous +Asclepiadae +Asclepiadean +asclepiadeous +Asclepiadic +Asclepian +Asclepias +asclepidin +asclepidoid +Asclepieion +asclepin +Asclepius +ascocarp +ascocarpous +Ascochyta +ascogenous +ascogone +ascogonial +ascogonidium +ascogonium +ascolichen +Ascolichenes +ascoma +ascomycetal +ascomycete +Ascomycetes +ascomycetous +ascon +Ascones +ascophore +ascophorous +Ascophyllum +ascorbic +ascospore +ascosporic +ascosporous +Ascot +ascot +Ascothoracica +ascribable +ascribe +ascript +ascription +ascriptitii +ascriptitious +ascriptitius +ascry +ascula +Ascupart +ascus +ascyphous +Ascyrum +asdic +ase +asearch +asecretory +aseethe +aseismatic +aseismic +aseismicity +aseity +aselgeia +asellate +Aselli +Asellidae +Aselline +Asellus +asem +asemasia +asemia +asepsis +aseptate +aseptic +aseptically +asepticism +asepticize +aseptify +aseptol +aseptolin +asexual +asexuality +asexualization +asexualize +asexually +asfetida +ash +Asha +ashake +ashame +ashamed +ashamedly +ashamedness +ashamnu +Ashangos +Ashantee +Ashanti +Asharasi +ashberry +ashcake +ashen +Asher +asherah +Asherites +ashery +ashes +ashet +ashily +ashimmer +ashine +ashiness +ashipboard +Ashir +ashiver +Ashkenazic +Ashkenazim +ashkoko +ashlar +ashlared +ashlaring +ashless +ashling +Ashluslay +ashman +Ashmolean +Ashochimi +ashore +ashpan +ashpit +ashplant +ashraf +ashrafi +ashthroat +Ashur +ashur +ashweed +ashwort +ashy +asialia +Asian +Asianic +Asianism +Asiarch +Asiarchate +Asiatic +Asiatical +Asiatically +Asiatican +Asiaticism +Asiaticization +Asiaticize +Asiatize +aside +asidehand +asideness +asiderite +asideu +asiento +asilid +Asilidae +Asilus +asimen +Asimina +asimmer +asinego +asinine +asininely +asininity +asiphonate +asiphonogama +asitia +ask +askable +askance +askant +askar +askari +asker +askew +askingly +askip +asklent +Asklepios +askos +Askr +aslant +aslantwise +aslaver +asleep +aslop +aslope +aslumber +asmack +asmalte +asmear +asmile +asmoke +asmolder +asniffle +asnort +asoak +asocial +asok +asoka +asomatophyte +asomatous +asonant +asonia +asop +asor +asouth +asp +aspace +aspalathus +Aspalax +asparagic +asparagine +asparaginic +asparaginous +asparagus +asparagyl +asparkle +aspartate +aspartic +aspartyl +Aspasia +Aspatia +aspect +aspectable +aspectant +aspection +aspectual +aspen +asper +asperate +asperation +aspergation +asperge +asperger +Asperges +aspergil +aspergill +Aspergillaceae +Aspergillales +aspergilliform +aspergillin +aspergillosis +aspergillum +aspergillus +Asperifoliae +asperifoliate +asperifolious +asperite +asperity +aspermatic +aspermatism +aspermatous +aspermia +aspermic +aspermous +asperous +asperously +asperse +aspersed +asperser +aspersion +aspersive +aspersively +aspersor +aspersorium +aspersory +Asperugo +Asperula +asperuloside +asperulous +asphalt +asphaltene +asphalter +asphaltic +asphaltite +asphaltum +aspheterism +aspheterize +asphodel +Asphodelaceae +Asphodeline +Asphodelus +asphyctic +asphyctous +asphyxia +asphyxial +asphyxiant +asphyxiate +asphyxiation +asphyxiative +asphyxiator +asphyxied +asphyxy +aspic +aspiculate +aspiculous +aspidate +aspidiaria +aspidinol +Aspidiotus +Aspidiske +Aspidistra +aspidium +Aspidobranchia +Aspidobranchiata +aspidobranchiate +Aspidocephali +Aspidochirota +Aspidoganoidei +aspidomancy +Aspidosperma +aspidospermine +aspirant +aspirata +aspirate +aspiration +aspirator +aspiratory +aspire +aspirer +aspirin +aspiring +aspiringly +aspiringness +aspish +asplanchnic +Asplenieae +asplenioid +Asplenium +asporogenic +asporogenous +asporous +asport +asportation +asporulate +aspout +asprawl +aspread +Aspredinidae +Aspredo +aspring +asprout +asquare +asquat +asqueal +asquint +asquirm +ass +assacu +assagai +assai +assail +assailable +assailableness +assailant +assailer +assailment +Assam +Assamese +Assamites +assapan +assapanic +assarion +assart +assary +assassin +assassinate +assassination +assassinative +assassinator +assassinatress +assassinist +assate +assation +assault +assaultable +assaulter +assaut +assay +assayable +assayer +assaying +assbaa +asse +assecuration +assecurator +assedation +assegai +asself +assemblable +assemblage +assemble +assembler +assembly +assemblyman +assent +assentaneous +assentation +assentatious +assentator +assentatorily +assentatory +assented +assenter +assentient +assenting +assentingly +assentive +assentiveness +assentor +assert +assertable +assertative +asserter +assertible +assertion +assertional +assertive +assertively +assertiveness +assertor +assertorial +assertorially +assertoric +assertorical +assertorically +assertorily +assertory +assertress +assertrix +assertum +assess +assessable +assessably +assessed +assessee +assession +assessionary +assessment +assessor +assessorial +assessorship +assessory +asset +assets +assever +asseverate +asseveratingly +asseveration +asseverative +asseveratively +asseveratory +asshead +assi +assibilate +assibilation +Assidean +assident +assidual +assidually +assiduity +assiduous +assiduously +assiduousness +assientist +assiento +assify +assign +assignability +assignable +assignably +assignat +assignation +assigned +assignee +assigneeship +assigner +assignment +assignor +assilag +assimilability +assimilable +assimilate +assimilation +assimilationist +assimilative +assimilativeness +assimilator +assimilatory +Assiniboin +assis +Assisan +assise +assish +assishly +assishness +assist +assistance +assistant +assistanted +assistantship +assistency +assister +assistful +assistive +assistless +assistor +assize +assizement +assizer +assizes +asslike +assman +Assmannshauser +assmanship +associability +associable +associableness +associate +associated +associatedness +associateship +association +associational +associationalism +associationalist +associationism +associationist +associationistic +associative +associatively +associativeness +associator +associatory +assoil +assoilment +assoilzie +assonance +assonanced +assonant +assonantal +assonantic +assonate +Assonia +assort +assortative +assorted +assortedness +assorter +assortive +assortment +assuade +assuage +assuagement +assuager +assuasive +assubjugate +assuetude +assumable +assumably +assume +assumed +assumedly +assumer +assuming +assumingly +assumingness +assumpsit +assumption +Assumptionist +assumptious +assumptiousness +assumptive +assumptively +assurable +assurance +assurant +assure +assured +assuredly +assuredness +assurer +assurge +assurgency +assurgent +assuring +assuringly +assyntite +Assyrian +Assyrianize +Assyriological +Assyriologist +Assyriologue +Assyriology +Assyroid +assythment +ast +asta +Astacidae +Astacus +Astakiwi +astalk +astarboard +astare +astart +Astarte +Astartian +Astartidae +astasia +astatic +astatically +astaticism +astatine +astatize +astatizer +astay +asteam +asteatosis +asteep +asteer +asteism +astelic +astely +aster +Asteraceae +asteraceous +Asterales +Asterella +astereognosis +asteria +asterial +Asterias +asteriated +Asteriidae +asterikos +asterin +Asterina +Asterinidae +asterioid +Asterion +asterion +Asterionella +asterisk +asterism +asterismal +astern +asternal +Asternata +asternia +Asterochiton +asteroid +asteroidal +Asteroidea +asteroidean +Asterolepidae +Asterolepis +Asterope +asterophyllite +Asterophyllites +Asterospondyli +asterospondylic +asterospondylous +Asteroxylaceae +Asteroxylon +Asterozoa +asterwort +asthenia +asthenic +asthenical +asthenobiosis +asthenobiotic +asthenolith +asthenology +asthenopia +asthenopic +asthenosphere +astheny +asthma +asthmatic +asthmatical +asthmatically +asthmatoid +asthmogenic +asthore +asthorin +Astian +astichous +astigmatic +astigmatical +astigmatically +astigmatism +astigmatizer +astigmatometer +astigmatoscope +astigmatoscopy +astigmia +astigmism +astigmometer +astigmometry +Astilbe +astilbe +astint +astipulate +astir +astite +astomatal +astomatous +astomia +astomous +astonied +astonish +astonishedly +astonisher +astonishing +astonishingly +astonishingness +astonishment +astony +astoop +astor +astound +astoundable +astounding +astoundingly +astoundment +Astrachan +astraddle +Astraea +Astraean +astraean +astraeid +Astraeidae +astraeiform +astragal +astragalar +astragalectomy +astragali +astragalocalcaneal +astragalocentral +astragalomancy +astragalonavicular +astragaloscaphoid +astragalotibial +Astragalus +astragalus +astrain +astrakanite +astrakhan +astral +astrally +astrand +Astrantia +astraphobia +astrapophobia +astray +astream +astrer +astrict +astriction +astrictive +astrictively +astrictiveness +Astrid +astride +astrier +astriferous +astrild +astringe +astringency +astringent +astringently +astringer +astroalchemist +astroblast +Astrocaryum +astrochemist +astrochemistry +astrochronological +astrocyte +astrocytoma +astrocytomata +astrodiagnosis +astrodome +astrofel +astrogeny +astroglia +astrognosy +astrogonic +astrogony +astrograph +astrographic +astrography +astroid +astroite +astrolabe +astrolabical +astrolater +astrolatry +astrolithology +astrologaster +astrologer +astrologian +astrologic +astrological +astrologically +astrologistic +astrologize +astrologous +astrology +astromancer +astromancy +astromantic +astrometeorological +astrometeorologist +astrometeorology +astrometer +astrometrical +astrometry +astronaut +astronautics +astronomer +astronomic +astronomical +astronomically +astronomics +astronomize +astronomy +Astropecten +Astropectinidae +astrophil +astrophobia +astrophotographic +astrophotography +astrophotometer +astrophotometrical +astrophotometry +astrophyllite +astrophysical +astrophysicist +astrophysics +Astrophyton +astroscope +Astroscopus +astroscopy +astrospectral +astrospectroscopic +astrosphere +astrotheology +astrut +astucious +astuciously +astucity +Astur +Asturian +astute +astutely +astuteness +astylar +Astylospongia +Astylosternus +asudden +asunder +Asuri +aswail +aswarm +asway +asweat +aswell +aswim +aswing +aswirl +aswoon +aswooned +asyla +asyllabia +asyllabic +asyllabical +asylum +asymbiotic +asymbolia +asymbolic +asymbolical +asymmetric +asymmetrical +asymmetrically +Asymmetron +asymmetry +asymptomatic +asymptote +asymptotic +asymptotical +asymptotically +asynapsis +asynaptic +asynartete +asynartetic +asynchronism +asynchronous +asyndesis +asyndetic +asyndetically +asyndeton +asynergia +asynergy +asyngamic +asyngamy +asyntactic +asyntrophy +asystole +asystolic +asystolism +asyzygetic +at +Ata +atabal +atabeg +atabek +Atabrine +Atacaman +Atacamenan +Atacamenian +Atacameno +atacamite +atactic +atactiform +Ataentsic +atafter +Ataigal +Ataiyal +Atalan +ataman +atamasco +Atamosco +atangle +atap +ataraxia +ataraxy +atatschite +ataunt +atavi +atavic +atavism +atavist +atavistic +atavistically +atavus +ataxaphasia +ataxia +ataxiagram +ataxiagraph +ataxiameter +ataxiaphasia +ataxic +ataxinomic +ataxite +ataxonomic +ataxophemia +ataxy +atazir +atbash +atchison +ate +Ateba +atebrin +atechnic +atechnical +atechny +ateeter +atef +atelectasis +atelectatic +ateleological +Ateles +atelestite +atelets +atelier +ateliosis +Atellan +atelo +atelocardia +atelocephalous +ateloglossia +atelognathia +atelomitic +atelomyelia +atelopodia +ateloprosopia +atelorachidia +atelostomia +atemporal +Aten +Atenism +Atenist +Aterian +ates +Atestine +ateuchi +ateuchus +Atfalati +Athabasca +Athabascan +athalamous +athalline +Athamantid +athanasia +Athanasian +Athanasianism +Athanasianist +athanasy +athanor +Athapascan +athar +Atharvan +Athecae +Athecata +athecate +atheism +atheist +atheistic +atheistical +atheistically +atheisticalness +atheize +atheizer +athelia +atheling +athematic +Athena +Athenaea +athenaeum +athenee +Athenian +Athenianly +athenor +Athens +atheological +atheologically +atheology +atheous +Athericera +athericeran +athericerous +atherine +Atherinidae +Atheriogaea +Atheriogaean +Atheris +athermancy +athermanous +athermic +athermous +atheroma +atheromasia +atheromata +atheromatosis +atheromatous +atherosclerosis +Atherosperma +Atherurus +athetesis +athetize +athetoid +athetosic +athetosis +athing +athirst +athlete +athletehood +athletic +athletical +athletically +athleticism +athletics +athletism +athletocracy +athlothete +athlothetes +athodyd +athort +athrepsia +athreptic +athrill +athrive +athrob +athrocyte +athrocytosis +athrogenic +athrong +athrough +athwart +athwarthawse +athwartship +athwartships +athwartwise +athymia +athymic +athymy +athyreosis +athyria +athyrid +Athyridae +Athyris +Athyrium +athyroid +athyroidism +athyrosis +Ati +Atik +Atikokania +atilt +atimon +atinga +atingle +atinkle +atip +atis +Atka +Atlanta +atlantad +atlantal +Atlantean +atlantes +Atlantic +atlantic +Atlantica +Atlantid +Atlantides +atlantite +atlantoaxial +atlantodidymus +atlantomastoid +atlantoodontoid +Atlantosaurus +Atlas +atlas +Atlaslike +atlatl +atle +atlee +atloaxoid +atloid +atloidean +atloidoaxoid +atma +atman +atmiatrics +atmiatry +atmid +atmidalbumin +atmidometer +atmidometry +atmo +atmocausis +atmocautery +atmoclastic +atmogenic +atmograph +atmologic +atmological +atmologist +atmology +atmolysis +atmolyzation +atmolyze +atmolyzer +atmometer +atmometric +atmometry +atmos +atmosphere +atmosphereful +atmosphereless +atmospheric +atmospherical +atmospherically +atmospherics +atmospherology +atmostea +atmosteal +atmosteon +Atnah +atocha +atocia +atokal +atoke +atokous +atoll +atom +atomatic +atomechanics +atomerg +atomic +atomical +atomically +atomician +atomicism +atomicity +atomics +atomiferous +atomism +atomist +atomistic +atomistical +atomistically +atomistics +atomity +atomization +atomize +atomizer +atomology +atomy +atonable +atonal +atonalism +atonalistic +atonality +atonally +atone +atonement +atoneness +atoner +atonia +atonic +atonicity +atoningly +atony +atop +Atophan +atophan +atopic +atopite +atopy +Atorai +Atossa +atour +atoxic +Atoxyl +atoxyl +atrabilarian +atrabilarious +atrabiliar +atrabiliarious +atrabiliary +atrabilious +atrabiliousness +atracheate +Atractaspis +Atragene +atragene +atrail +atrament +atramental +atramentary +atramentous +atraumatic +Atrebates +Atremata +atrematous +atremble +atrepsy +atreptic +atresia +atresic +atresy +atretic +atria +atrial +atrichia +atrichosis +atrichous +atrickle +Atridean +atrienses +atriensis +atriocoelomic +atrioporal +atriopore +atrioventricular +atrip +Atriplex +atrium +atrocha +atrochal +atrochous +atrocious +atrociously +atrociousness +atrocity +atrolactic +Atropa +atropaceous +atropal +atropamine +atrophia +atrophiated +atrophic +atrophied +atrophoderma +atrophy +atropia +atropic +Atropidae +atropine +atropinism +atropinization +atropinize +atropism +atropous +atrorubent +atrosanguineous +atroscine +atrous +atry +Atrypa +Atta +atta +Attacapan +attacco +attach +attachable +attachableness +attache +attached +attachedly +attacher +attacheship +attachment +attack +attackable +attacker +attacolite +Attacus +attacus +attagen +attaghan +attain +attainability +attainable +attainableness +attainder +attainer +attainment +attaint +attaintment +attainture +Attalea +attaleh +Attalid +attar +attargul +attask +attemper +attemperament +attemperance +attemperate +attemperately +attemperation +attemperator +attempt +attemptability +attemptable +attempter +attemptless +attend +attendance +attendancy +attendant +attendantly +attender +attendingly +attendment +attendress +attensity +attent +attention +attentional +attentive +attentively +attentiveness +attently +attenuable +attenuant +attenuate +attenuation +attenuative +attenuator +atter +attercop +attercrop +atterminal +attermine +atterminement +attern +attery +attest +attestable +attestant +attestation +attestative +attestator +attester +attestive +Attic +attic +Attical +Atticism +atticism +Atticist +Atticize +atticize +atticomastoid +attid +Attidae +attinge +attingence +attingency +attingent +attire +attired +attirement +attirer +attitude +attitudinal +attitudinarian +attitudinarianism +attitudinize +attitudinizer +Attiwendaronk +attorn +attorney +attorneydom +attorneyism +attorneyship +attornment +attract +attractability +attractable +attractableness +attractant +attracter +attractile +attractingly +attraction +attractionally +attractive +attractively +attractiveness +attractivity +attractor +attrahent +attrap +attributable +attributal +attribute +attributer +attribution +attributive +attributively +attributiveness +attrist +attrite +attrited +attriteness +attrition +attritive +attritus +attune +attunely +attunement +Atuami +atule +atumble +atune +atwain +atweel +atween +atwin +atwirl +atwist +atwitch +atwitter +atwixt +atwo +atypic +atypical +atypically +atypy +auantic +aube +aubepine +Aubrey +Aubrietia +aubrietia +aubrite +auburn +aubusson +Auca +auca +Aucan +Aucaner +Aucanian +Auchenia +auchenia +auchenium +auchlet +auction +auctionary +auctioneer +auctorial +Aucuba +aucuba +aucupate +audacious +audaciously +audaciousness +audacity +Audaean +Audian +Audibertia +audibility +audible +audibleness +audibly +audience +audiencier +audient +audile +audio +audiogenic +audiogram +audiologist +audiology +audiometer +audiometric +audiometry +Audion +audion +audiophile +audiphone +audit +audition +auditive +auditor +auditoria +auditorial +auditorially +auditorily +auditorium +auditorship +auditory +auditress +auditual +audivise +audiviser +audivision +Audrey +Audubonistic +Aueto +auganite +auge +Augean +augelite +augen +augend +auger +augerer +augh +aught +aughtlins +augite +augitic +augitite +augitophyre +augment +augmentable +augmentation +augmentationer +augmentative +augmentatively +augmented +augmentedly +augmenter +augmentive +augur +augural +augurate +augurial +augurous +augurship +augury +August +august +Augusta +augustal +Augustan +Augusti +Augustin +Augustinian +Augustinianism +Augustinism +augustly +augustness +Augustus +auh +auhuhu +Auk +auk +auklet +aula +aulacocarpous +Aulacodus +Aulacomniaceae +Aulacomnium +aulae +aularian +auld +auldfarrantlike +auletai +aulete +auletes +auletic +auletrides +auletris +aulic +aulicism +auloi +aulophyte +aulos +Aulostoma +Aulostomatidae +Aulostomi +aulostomid +Aulostomidae +Aulostomus +aulu +aum +aumaga +aumail +aumbry +aumery +aumil +aumildar +aumous +aumrie +auncel +aune +Aunjetitz +aunt +aunthood +auntie +auntish +auntlike +auntly +auntsary +auntship +aupaka +aura +aurae +aural +aurally +auramine +Aurantiaceae +aurantiaceous +Aurantium +aurantium +aurar +aurate +aurated +aureate +aureately +aureateness +aureation +aureity +Aurelia +aurelia +aurelian +Aurelius +Aureocasidium +aureola +aureole +aureolin +aureoline +aureomycin +aureous +aureously +auresca +aureus +auribromide +auric +aurichalcite +aurichalcum +aurichloride +aurichlorohydric +auricle +auricled +auricomous +Auricula +auricula +auriculae +auricular +auriculare +auriculares +Auricularia +auricularia +Auriculariaceae +auriculariae +Auriculariales +auricularian +auricularis +auricularly +auriculate +auriculated +auriculately +Auriculidae +auriculocranial +auriculoparietal +auriculotemporal +auriculoventricular +auriculovertical +auricyanhydric +auricyanic +auricyanide +auride +auriferous +aurific +aurification +auriform +aurify +Auriga +aurigal +aurigation +aurigerous +Aurigid +Aurignacian +aurilave +aurin +aurinasal +auriphone +auriphrygia +auriphrygiate +auripuncture +aurir +auriscalp +auriscalpia +auriscalpium +auriscope +auriscopy +aurist +aurite +aurivorous +auroauric +aurobromide +aurochloride +aurochs +aurocyanide +aurodiamine +auronal +aurophobia +aurophore +aurora +aurorae +auroral +aurorally +aurore +aurorean +Aurorian +aurorium +aurotellurite +aurothiosulphate +aurothiosulphuric +aurous +aurrescu +aurulent +aurum +aurure +auryl +Aus +auscult +auscultascope +auscultate +auscultation +auscultative +auscultator +auscultatory +Auscultoscope +auscultoscope +Aushar +auslaut +auslaute +Ausones +Ausonian +auspex +auspicate +auspice +auspices +auspicial +auspicious +auspiciously +auspiciousness +auspicy +Aussie +Austafrican +austenite +austenitic +Auster +austere +austerely +austereness +austerity +Austerlitz +Austin +Austral +austral +Australasian +australene +Australian +Australianism +Australianize +Australic +Australioid +australite +Australoid +Australopithecinae +australopithecine +Australopithecus +Australorp +Austrasian +Austrian +Austrianize +Austric +austrium +Austroasiatic +Austrogaea +Austrogaean +austromancy +Austronesian +Austrophil +Austrophile +Austrophilism +Austroriparian +ausu +ausubo +autacoid +autacoidal +autallotriomorphic +autantitypy +autarch +autarchic +autarchical +Autarchoglossa +autarchy +autarkic +autarkical +autarkist +autarky +aute +autechoscope +autecious +auteciously +auteciousness +autecism +autecologic +autecological +autecologically +autecologist +autecology +autecy +autem +authentic +authentical +authentically +authenticalness +authenticate +authentication +authenticator +authenticity +authenticly +authenticness +authigene +authigenetic +authigenic +authigenous +author +authorcraft +authoress +authorhood +authorial +authorially +authorish +authorism +authoritarian +authoritarianism +authoritative +authoritatively +authoritativeness +authority +authorizable +authorization +authorize +authorized +authorizer +authorless +authorling +authorly +authorship +authotype +autism +autist +autistic +auto +autoabstract +autoactivation +autoactive +autoaddress +autoagglutinating +autoagglutination +autoagglutinin +autoalarm +autoalkylation +autoallogamous +autoallogamy +autoanalysis +autoanalytic +autoantibody +autoanticomplement +autoantitoxin +autoasphyxiation +autoaspiration +autoassimilation +autobahn +autobasidia +Autobasidiomycetes +autobasidiomycetous +autobasidium +Autobasisii +autobiographal +autobiographer +autobiographic +autobiographical +autobiographically +autobiographist +autobiography +autobiology +autoblast +autoboat +autoboating +autobolide +autobus +autocab +autocade +autocall +autocamp +autocamper +autocamping +autocar +autocarist +autocarpian +autocarpic +autocarpous +autocatalepsy +autocatalysis +autocatalytic +autocatalytically +autocatalyze +autocatheterism +autocephalia +autocephality +autocephalous +autocephaly +autoceptive +autochemical +autocholecystectomy +autochrome +autochromy +autochronograph +autochthon +autochthonal +autochthonic +autochthonism +autochthonous +autochthonously +autochthonousness +autochthony +autocide +autocinesis +autoclasis +autoclastic +autoclave +autocoenobium +autocoherer +autocoid +autocollimation +autocollimator +autocolony +autocombustible +autocombustion +autocomplexes +autocondensation +autoconduction +autoconvection +autoconverter +autocopist +autocoprophagous +autocorrosion +autocracy +autocrat +autocratic +autocratical +autocratically +autocrator +autocratoric +autocratorical +autocratrix +autocratship +autocremation +autocriticism +autocystoplasty +autocytolysis +autocytolytic +autodecomposition +autodepolymerization +autodermic +autodestruction +autodetector +autodiagnosis +autodiagnostic +autodiagrammatic +autodidact +autodidactic +autodifferentiation +autodiffusion +autodigestion +autodigestive +autodrainage +autodrome +autodynamic +autodyne +autoecholalia +autoecic +autoecious +autoeciously +autoeciousness +autoecism +autoecous +autoecy +autoeducation +autoeducative +autoelectrolysis +autoelectrolytic +autoelectronic +autoelevation +autoepigraph +autoepilation +autoerotic +autoerotically +autoeroticism +autoerotism +autoexcitation +autofecundation +autofermentation +autoformation +autofrettage +autogamic +autogamous +autogamy +autogauge +autogeneal +autogenesis +autogenetic +autogenetically +autogenic +autogenous +autogenously +autogeny +Autogiro +autogiro +autognosis +autognostic +autograft +autografting +autogram +autograph +autographal +autographer +autographic +autographical +autographically +autographism +autographist +autographometer +autography +autogravure +Autoharp +autoharp +autoheader +autohemic +autohemolysin +autohemolysis +autohemolytic +autohemorrhage +autohemotherapy +autoheterodyne +autoheterosis +autohexaploid +autohybridization +autohypnosis +autohypnotic +autohypnotism +autohypnotization +autoicous +autoignition +autoimmunity +autoimmunization +autoinduction +autoinductive +autoinfection +autoinfusion +autoinhibited +autoinoculable +autoinoculation +autointellectual +autointoxicant +autointoxication +autoirrigation +autoist +autojigger +autojuggernaut +autokinesis +autokinetic +autokrator +autolaryngoscope +autolaryngoscopic +autolaryngoscopy +autolater +autolatry +autolavage +autolesion +autolimnetic +autolith +autoloading +autological +autologist +autologous +autology +autoluminescence +autoluminescent +autolysate +autolysin +autolysis +autolytic +Autolytus +autolyzate +autolyze +automa +automacy +automanual +automat +automata +automatic +automatical +automatically +automaticity +automatin +automatism +automatist +automatization +automatize +automatograph +automaton +automatonlike +automatous +automechanical +automelon +autometamorphosis +autometric +autometry +automobile +automobilism +automobilist +automobilistic +automobility +automolite +automonstration +automorph +automorphic +automorphically +automorphism +automotive +automotor +automower +automysophobia +autonegation +autonephrectomy +autonephrotoxin +autoneurotoxin +autonitridation +autonoetic +autonomasy +autonomic +autonomical +autonomically +autonomist +autonomize +autonomous +autonomously +autonomy +autonym +autoparasitism +autopathic +autopathography +autopathy +autopelagic +autopepsia +autophagi +autophagia +autophagous +autophagy +autophobia +autophoby +autophon +autophone +autophonoscope +autophonous +autophony +autophotoelectric +autophotograph +autophotometry +autophthalmoscope +autophyllogeny +autophyte +autophytic +autophytically +autophytograph +autophytography +autopilot +autoplagiarism +autoplasmotherapy +autoplast +autoplastic +autoplasty +autopneumatic +autopoint +autopoisonous +autopolar +autopolo +autopoloist +autopolyploid +autopore +autoportrait +autoportraiture +autopositive +autopotent +autoprogressive +autoproteolysis +autoprothesis +autopsic +autopsical +autopsy +autopsychic +autopsychoanalysis +autopsychology +autopsychorhythmia +autopsychosis +autoptic +autoptical +autoptically +autopticity +autopyotherapy +autoracemization +autoradiograph +autoradiographic +autoradiography +autoreduction +autoregenerator +autoregulation +autoreinfusion +autoretardation +autorhythmic +autorhythmus +autoriser +autorotation +autorrhaphy +Autosauri +Autosauria +autoschediasm +autoschediastic +autoschediastical +autoschediastically +autoschediaze +autoscience +autoscope +autoscopic +autoscopy +autosender +autosensitization +autosensitized +autosepticemia +autoserotherapy +autoserum +autosexing +autosight +autosign +autosite +autositic +autoskeleton +autosled +autoslip +autosomal +autosomatognosis +autosomatognostic +autosome +autosoteric +autosoterism +autospore +autosporic +autospray +autostability +autostage +autostandardization +autostarter +autostethoscope +autostylic +autostylism +autostyly +autosuggestibility +autosuggestible +autosuggestion +autosuggestionist +autosuggestive +autosuppression +autosymbiontic +autosymbolic +autosymbolical +autosymbolically +autosymnoia +Autosyn +autosyndesis +autotelegraph +autotelic +autotetraploid +autotetraploidy +autothaumaturgist +autotheater +autotheism +autotheist +autotherapeutic +autotherapy +autothermy +autotomic +autotomize +autotomous +autotomy +autotoxaemia +autotoxic +autotoxication +autotoxicity +autotoxicosis +autotoxin +autotoxis +autotractor +autotransformer +autotransfusion +autotransplant +autotransplantation +autotrepanation +autotriploid +autotriploidy +autotroph +autotrophic +autotrophy +autotropic +autotropically +autotropism +autotruck +autotuberculin +autoturning +autotype +autotyphization +autotypic +autotypography +autotypy +autourine +autovaccination +autovaccine +autovalet +autovalve +autovivisection +autoxeny +autoxidation +autoxidator +autoxidizability +autoxidizable +autoxidize +autoxidizer +autozooid +autrefois +autumn +autumnal +autumnally +autumnian +autumnity +Autunian +autunite +auxamylase +auxanogram +auxanology +auxanometer +auxesis +auxetic +auxetical +auxetically +auxiliar +auxiliarly +auxiliary +auxiliate +auxiliation +auxiliator +auxiliatory +auxilium +auximone +auxin +auxinic +auxinically +auxoaction +auxoamylase +auxoblast +auxobody +auxocardia +auxochrome +auxochromic +auxochromism +auxochromous +auxocyte +auxoflore +auxofluor +auxograph +auxographic +auxohormone +auxology +auxometer +auxospore +auxosubstance +auxotonic +auxotox +ava +avadana +avadavat +avadhuta +avahi +avail +availability +available +availableness +availably +availingly +availment +aval +avalanche +avalent +avalvular +Avanguardisti +avania +avanious +Avanti +avanturine +Avar +Avaradrano +avaremotemo +Avarian +avarice +avaricious +avariciously +avariciousness +Avarish +Avars +avascular +avast +avaunt +Ave +ave +avellan +avellane +avellaneous +avellano +avelonge +aveloz +Avena +avenaceous +avenage +avenalin +avener +avenge +avengeful +avengement +avenger +avengeress +avenging +avengingly +avenin +avenolith +avenous +avens +aventail +Aventine +aventurine +avenue +aver +avera +average +averagely +averager +averah +averil +averin +averment +Avernal +Avernus +averrable +averral +Averrhoa +Averroism +Averroist +Averroistic +averruncate +averruncation +averruncator +aversant +aversation +averse +aversely +averseness +aversion +aversive +avert +avertable +averted +avertedly +averter +avertible +Avertin +Aves +Avesta +Avestan +avian +avianization +avianize +aviarist +aviary +aviate +aviatic +aviation +aviator +aviatorial +aviatoriality +aviatory +aviatress +aviatrices +aviatrix +Avicennia +Avicenniaceae +Avicennism +avichi +avicide +avick +avicolous +Avicula +avicular +Avicularia +avicularia +avicularian +Aviculariidae +Avicularimorphae +avicularium +Aviculidae +aviculture +aviculturist +avid +avidious +avidiously +avidity +avidly +avidous +avidya +avifauna +avifaunal +avigate +avigation +avigator +Avignonese +avijja +Avikom +avine +aviolite +avirulence +avirulent +Avis +aviso +avital +avitaminosis +avitaminotic +avitic +avives +avizandum +avo +avocado +avocate +avocation +avocative +avocatory +avocet +avodire +avogadrite +avoid +avoidable +avoidably +avoidance +avoider +avoidless +avoidment +avoirdupois +avolate +avolation +avolitional +avondbloem +avouch +avouchable +avoucher +avouchment +avourneen +avow +avowable +avowableness +avowably +avowal +avowance +avowant +avowed +avowedly +avowedness +avower +avowry +avoyer +avoyership +Avshar +avulse +avulsion +avuncular +avunculate +aw +awa +Awabakal +awabi +Awadhi +awaft +awag +await +awaiter +Awaitlala +awakable +awake +awaken +awakenable +awakener +awakening +awakeningly +awakenment +awald +awalim +awalt +Awan +awane +awanting +awapuhi +award +awardable +awarder +awardment +aware +awaredom +awareness +awaruite +awash +awaste +awat +awatch +awater +awave +away +awayness +awber +awd +awe +awearied +aweary +aweather +aweband +awedness +awee +aweek +aweel +aweigh +Awellimiden +awesome +awesomely +awesomeness +awest +aweto +awfu +awful +awfully +awfulness +awheel +awheft +awhet +awhile +awhir +awhirl +awide +awiggle +awikiwiki +awin +awing +awink +awiwi +awkward +awkwardish +awkwardly +awkwardness +awl +awless +awlessness +awlwort +awmous +awn +awned +awner +awning +awninged +awnless +awnlike +awny +awoke +Awol +awork +awreck +awrist +awrong +awry +Awshar +ax +axal +axbreaker +axe +axed +axenic +axes +axfetch +axhammer +axhammered +axhead +axial +axiality +axially +axiate +axiation +Axifera +axiform +axifugal +axil +axile +axilemma +axilemmata +axilla +axillae +axillant +axillar +axillary +axine +axinite +axinomancy +axiolite +axiolitic +axiological +axiologically +axiologist +axiology +axiom +axiomatic +axiomatical +axiomatically +axiomatization +axiomatize +axion +axiopisty +Axis +axis +axised +axisymmetric +axisymmetrical +axite +axle +axled +axlesmith +axletree +axmaker +axmaking +axman +axmanship +axmaster +Axminster +axodendrite +axofugal +axogamy +axoid +axoidean +axolemma +axolotl +axolysis +axometer +axometric +axometry +axon +axonal +axoneure +axoneuron +Axonia +Axonolipa +axonolipous +axonometric +axonometry +Axonophora +axonophorous +Axonopus +axonost +axopetal +axophyte +axoplasm +axopodia +axopodium +axospermous +axostyle +axseed +axstone +axtree +Axumite +axunge +axweed +axwise +axwort +Ay +ay +ayacahuite +ayah +Ayahuca +Aydendron +aye +ayegreen +ayelp +ayenbite +ayin +Aylesbury +ayless +aylet +ayllu +Aymara +Aymaran +Aymoro +ayond +ayont +ayous +Ayrshire +Aythya +ayu +Ayubite +Ayyubid +azadrachta +azafrin +Azalea +azalea +Azande +azarole +azedarach +azelaic +azelate +Azelfafage +azeotrope +azeotropic +azeotropism +azeotropy +Azerbaijanese +Azerbaijani +Azerbaijanian +Azha +azide +aziethane +Azilian +azilut +Azimech +azimene +azimethylene +azimide +azimine +azimino +aziminobenzene +azimuth +azimuthal +azimuthally +azine +aziola +azlactone +azo +azobacter +azobenzene +azobenzil +azobenzoic +azobenzol +azoblack +azoch +azocochineal +azocoralline +azocorinth +azocyanide +azocyclic +azodicarboxylic +azodiphenyl +azodisulphonic +azoeosin +azoerythrin +azofication +azofier +azoflavine +azoformamide +azoformic +azofy +azogallein +azogreen +azogrenadine +azohumic +azoic +azoimide +azoisobutyronitrile +azole +azolitmin +Azolla +azomethine +azon +azonal +azonaphthalene +azonic +azonium +azoospermia +azoparaffin +azophen +azophenetole +azophenine +azophenol +azophenyl +azophenylene +azophosphin +azophosphore +azoprotein +Azorian +azorite +azorubine +azosulphine +azosulphonic +azotate +azote +azoted +azotemia +azotenesis +azotetrazole +azoth +azothionium +azotic +azotine +azotite +azotize +Azotobacter +Azotobacterieae +azotoluene +azotometer +azotorrhoea +azotous +azoturia +azovernine +azox +azoxazole +azoxime +azoxine +azoxonium +azoxy +azoxyanisole +azoxybenzene +azoxybenzoic +azoxynaphthalene +azoxyphenetole +azoxytoluidine +Aztec +Azteca +azteca +Aztecan +azthionium +azulene +azulite +azulmic +azumbre +azure +azurean +azured +azureous +azurine +azurite +azurmalachite +azurous +azury +Azygobranchia +Azygobranchiata +azygobranchiate +azygomatous +azygos +azygosperm +azygospore +azygous +azyme +azymite +azymous +B +b +ba +baa +baahling +Baal +baal +Baalath +Baalish +Baalism +Baalist +Baalite +Baalitical +Baalize +Baalshem +baar +Bab +baba +babacoote +babai +babasco +babassu +babaylan +Babbie +Babbitt +babbitt +babbitter +Babbittess +Babbittian +Babbittism +Babbittry +babblative +babble +babblement +babbler +babblesome +babbling +babblingly +babblish +babblishly +babbly +babby +Babcock +babe +babehood +Babel +Babeldom +babelet +Babelic +babelike +Babelish +Babelism +Babelize +babery +babeship +Babesia +babesiasis +Babhan +Babi +Babiana +babiche +babied +Babiism +babillard +Babine +babingtonite +babirusa +babish +babished +babishly +babishness +Babism +Babist +Babite +bablah +babloh +baboen +Babongo +baboo +baboodom +babooism +baboon +baboonery +baboonish +baboonroot +baboot +babouche +Babouvism +Babouvist +babroot +Babs +babu +Babua +babudom +babuina +babuism +babul +Babuma +Babungera +babushka +baby +babydom +babyfied +babyhood +babyhouse +babyish +babyishly +babyishness +babyism +babylike +Babylon +Babylonian +Babylonic +Babylonish +Babylonism +Babylonite +Babylonize +babyolatry +babyship +bac +bacaba +bacach +bacalao +bacao +bacbakiri +bacca +baccaceous +baccae +baccalaurean +baccalaureate +baccara +baccarat +baccate +baccated +Bacchae +bacchanal +Bacchanalia +bacchanalian +bacchanalianism +bacchanalianly +bacchanalism +bacchanalization +bacchanalize +bacchant +bacchante +bacchantes +bacchantic +bacchar +baccharis +baccharoid +baccheion +bacchiac +bacchian +Bacchic +bacchic +Bacchical +Bacchides +bacchii +bacchius +Bacchus +Bacchuslike +bacciferous +bacciform +baccivorous +bach +Bacharach +bache +bachel +bachelor +bachelordom +bachelorhood +bachelorism +bachelorize +bachelorlike +bachelorly +bachelorship +bachelorwise +bachelry +Bachichi +Bacillaceae +bacillar +Bacillariaceae +bacillariaceous +Bacillariales +Bacillarieae +Bacillariophyta +bacillary +bacillemia +bacilli +bacillian +bacillicidal +bacillicide +bacillicidic +bacilliculture +bacilliform +bacilligenic +bacilliparous +bacillite +bacillogenic +bacillogenous +bacillophobia +bacillosis +bacilluria +bacillus +Bacis +bacitracin +back +backache +backaching +backachy +backage +backband +backbearing +backbencher +backbite +backbiter +backbitingly +backblow +backboard +backbone +backboned +backboneless +backbonelessness +backbrand +backbreaker +backbreaking +backcap +backcast +backchain +backchat +backcourt +backcross +backdoor +backdown +backdrop +backed +backen +backer +backet +backfall +backfatter +backfield +backfill +backfiller +backfilling +backfire +backfiring +backflap +backflash +backflow +backfold +backframe +backfriend +backfurrow +backgame +backgammon +background +backhand +backhanded +backhandedly +backhandedness +backhander +backhatch +backheel +backhooker +backhouse +backie +backiebird +backing +backjaw +backjoint +backlands +backlash +backlashing +backless +backlet +backlings +backlog +backlotter +backmost +backpedal +backpiece +backplate +backrope +backrun +backsaw +backscraper +backset +backsetting +backsettler +backshift +backside +backsight +backslap +backslapper +backslapping +backslide +backslider +backslidingness +backspace +backspacer +backspang +backspier +backspierer +backspin +backspread +backspringing +backstaff +backstage +backstamp +backstay +backster +backstick +backstitch +backstone +backstop +backstrap +backstretch +backstring +backstrip +backstroke +backstromite +backswept +backswing +backsword +backswording +backswordman +backswordsman +backtack +backtender +backtenter +backtrack +backtracker +backtrick +backup +backveld +backvelder +backwall +backward +backwardation +backwardly +backwardness +backwards +backwash +backwasher +backwashing +backwater +backwatered +backway +backwood +backwoods +backwoodsiness +backwoodsman +backwoodsy +backword +backworm +backwort +backyarder +baclin +bacon +baconer +Baconian +Baconianism +Baconic +Baconism +Baconist +baconize +baconweed +bacony +Bacopa +bacteremia +bacteria +Bacteriaceae +bacteriaceous +bacterial +bacterially +bacterian +bacteric +bactericholia +bactericidal +bactericide +bactericidin +bacterid +bacteriemia +bacteriform +bacterin +bacterioagglutinin +bacterioblast +bacteriocyte +bacteriodiagnosis +bacteriofluorescin +bacteriogenic +bacteriogenous +bacteriohemolysin +bacterioid +bacterioidal +bacteriologic +bacteriological +bacteriologically +bacteriologist +bacteriology +bacteriolysin +bacteriolysis +bacteriolytic +bacteriolyze +bacteriopathology +bacteriophage +bacteriophagia +bacteriophagic +bacteriophagous +bacteriophagy +bacteriophobia +bacterioprecipitin +bacterioprotein +bacteriopsonic +bacteriopsonin +bacteriopurpurin +bacterioscopic +bacterioscopical +bacterioscopically +bacterioscopist +bacterioscopy +bacteriosis +bacteriosolvent +bacteriostasis +bacteriostat +bacteriostatic +bacteriotherapeutic +bacteriotherapy +bacteriotoxic +bacteriotoxin +bacteriotropic +bacteriotropin +bacteriotrypsin +bacterious +bacteritic +bacterium +bacteriuria +bacterization +bacterize +bacteroid +bacteroidal +Bacteroideae +Bacteroides +Bactrian +Bactris +Bactrites +bactriticone +bactritoid +bacula +bacule +baculi +baculiferous +baculiform +baculine +baculite +Baculites +baculitic +baculiticone +baculoid +baculum +baculus +bacury +bad +Badaga +badan +Badarian +badarrah +Badawi +baddeleyite +badderlocks +baddish +baddishly +baddishness +baddock +bade +badenite +badge +badgeless +badgeman +badger +badgerbrush +badgerer +badgeringly +badgerlike +badgerly +badgerweed +badiaga +badian +badigeon +badinage +badious +badland +badlands +badly +badminton +badness +Badon +Baduhenna +bae +Baedeker +Baedekerian +Baeria +baetuli +baetulus +baetyl +baetylic +baetylus +baetzner +bafaro +baff +baffeta +baffle +bafflement +baffler +baffling +bafflingly +bafflingness +baffy +baft +bafta +Bafyot +bag +baga +Baganda +bagani +bagasse +bagataway +bagatelle +bagatine +bagattini +bagattino +Bagaudae +Bagdad +Bagdi +bagel +bagful +baggage +baggageman +baggagemaster +baggager +baggala +bagganet +Baggara +bagged +bagger +baggie +baggily +bagginess +bagging +baggit +baggy +Bagheli +baghouse +Baginda +Bagirmi +bagleaves +baglike +bagmaker +bagmaking +bagman +bagnio +bagnut +bago +Bagobo +bagonet +bagpipe +bagpiper +bagpipes +bagplant +bagrationite +bagre +bagreef +bagroom +baguette +bagwig +bagwigged +bagworm +bagwyn +bah +Bahai +Bahaism +Bahaist +Baham +Bahama +Bahamian +bahan +bahar +Bahaullah +bahawder +bahay +bahera +bahiaite +Bahima +bahisti +Bahmani +Bahmanid +bahnung +baho +bahoe +bahoo +baht +Bahuma +bahur +bahut +Bahutu +bahuvrihi +Baianism +baidarka +Baidya +Baiera +baiginet +baignet +baikalite +baikerinite +baikerite +baikie +bail +bailable +bailage +bailee +bailer +bailey +bailie +bailiery +bailieship +bailiff +bailiffry +bailiffship +bailiwick +bailliage +baillone +Baillonella +bailment +bailor +bailpiece +bailsman +bailwood +bain +bainie +Baining +baioc +baiocchi +baiocco +bairagi +Bairam +bairn +bairnie +bairnish +bairnishness +bairnliness +bairnly +bairnteam +bairntime +bairnwort +Bais +Baisakh +baister +bait +baiter +baith +baittle +baitylos +baize +bajada +bajan +Bajardo +bajarigar +Bajau +Bajocian +bajra +bajree +bajri +bajury +baka +Bakairi +bakal +Bakalai +Bakalei +Bakatan +bake +bakeboard +baked +bakehouse +Bakelite +bakelite +bakelize +baken +bakeoven +bakepan +baker +bakerdom +bakeress +bakerite +bakerless +bakerly +bakership +bakery +bakeshop +bakestone +Bakhtiari +bakie +baking +bakingly +bakli +Bakongo +Bakshaish +baksheesh +baktun +Baku +baku +Bakuba +bakula +Bakunda +Bakuninism +Bakuninist +bakupari +Bakutu +Bakwiri +Bal +bal +Bala +Balaam +Balaamite +Balaamitical +balachong +balaclava +baladine +Balaena +Balaenicipites +balaenid +Balaenidae +balaenoid +Balaenoidea +balaenoidean +Balaenoptera +Balaenopteridae +balafo +balagan +balaghat +balai +Balaic +Balak +Balaklava +balalaika +Balan +balance +balanceable +balanced +balancedness +balancelle +balanceman +balancement +balancer +balancewise +balancing +balander +balandra +balandrana +balaneutics +balangay +balanic +balanid +Balanidae +balaniferous +balanism +balanite +Balanites +balanitis +balanoblennorrhea +balanocele +Balanoglossida +Balanoglossus +balanoid +Balanophora +Balanophoraceae +balanophoraceous +balanophore +balanophorin +balanoplasty +balanoposthitis +balanopreputial +Balanops +Balanopsidaceae +Balanopsidales +balanorrhagia +Balanta +Balante +balantidial +balantidiasis +balantidic +balantidiosis +Balantidium +Balanus +Balao +balao +Balarama +balas +balata +balatong +balatron +balatronic +balausta +balaustine +balaustre +Balawa +Balawu +balboa +balbriggan +balbutiate +balbutient +balbuties +balconet +balconied +balcony +bald +baldachin +baldachined +baldachini +baldachino +baldberry +baldcrown +balden +balder +balderdash +baldhead +baldicoot +Baldie +baldish +baldling +baldly +baldmoney +baldness +baldpate +baldrib +baldric +baldricked +baldricwise +balductum +Baldwin +baldy +bale +Balearian +Balearic +Balearica +baleen +balefire +baleful +balefully +balefulness +balei +baleise +baleless +baler +balete +Bali +bali +balibago +Balija +Balilla +baline +Balinese +balinger +balinghasay +balisaur +balistarius +Balistes +balistid +Balistidae +balistraria +balita +balk +Balkan +Balkanic +Balkanization +Balkanize +Balkar +balker +balkingly +Balkis +balky +ball +ballad +ballade +balladeer +ballader +balladeroyal +balladic +balladical +balladier +balladism +balladist +balladize +balladlike +balladling +balladmonger +balladmongering +balladry +balladwise +ballahoo +ballam +ballan +ballant +ballast +ballastage +ballaster +ballasting +ballata +ballate +ballatoon +balldom +balled +baller +ballerina +ballet +balletic +balletomane +Ballhausplatz +balli +ballist +ballista +ballistae +ballistic +ballistically +ballistician +ballistics +Ballistite +ballistocardiograph +ballium +ballmine +ballogan +ballonet +balloon +balloonation +ballooner +balloonery +balloonet +balloonfish +balloonflower +balloonful +ballooning +balloonish +balloonist +balloonlike +ballot +Ballota +ballotade +ballotage +balloter +balloting +ballotist +ballottement +ballow +Ballplatz +ballplayer +ballproof +ballroom +ballstock +ballup +ballweed +bally +ballyhack +ballyhoo +ballyhooer +ballywack +ballywrack +balm +balmacaan +Balmarcodes +Balmawhapple +balmily +balminess +balmlike +balmony +Balmoral +balmy +balneal +balneary +balneation +balneatory +balneographer +balneography +balneologic +balneological +balneologist +balneology +balneophysiology +balneotechnics +balneotherapeutics +balneotherapia +balneotherapy +Balnibarbi +Baloch +Baloghia +Balolo +balonea +baloney +baloo +Balopticon +Balor +Baloskion +Baloskionaceae +balow +balsa +balsam +balsamation +Balsamea +Balsameaceae +balsameaceous +balsamer +balsamic +balsamical +balsamically +balsamiferous +balsamina +Balsaminaceae +balsaminaceous +balsamine +balsamitic +balsamiticness +balsamize +balsamo +Balsamodendron +Balsamorrhiza +balsamous +balsamroot +balsamum +balsamweed +balsamy +Balt +baltei +balter +balteus +Balthasar +Balti +Baltic +Baltimore +Baltimorean +baltimorite +Baltis +balu +Baluba +Baluch +Baluchi +Baluchistan +baluchithere +baluchitheria +Baluchitherium +baluchitherium +Baluga +Balunda +balushai +baluster +balustered +balustrade +balustraded +balustrading +balut +balwarra +balza +Balzacian +balzarine +bam +Bamalip +Bamangwato +bamban +Bambara +bambini +bambino +bambocciade +bamboo +bamboozle +bamboozlement +bamboozler +Bambos +bamboula +Bambuba +Bambusa +Bambuseae +Bambute +bamoth +Ban +ban +Bana +banaba +banago +banak +banakite +banal +banality +banally +banana +Bananaland +Bananalander +Banande +bananist +bananivorous +banat +Banate +banatite +banausic +Banba +Banbury +banc +banca +bancal +banchi +banco +bancus +band +Banda +banda +bandage +bandager +bandagist +bandaite +bandaka +bandala +bandalore +bandanna +bandannaed +bandar +bandarlog +bandbox +bandboxical +bandboxy +bandcase +bandcutter +bande +bandeau +banded +bandelet +bander +Banderma +banderole +bandersnatch +bandfish +bandhava +bandhook +Bandhor +bandhu +bandi +bandicoot +bandicoy +bandie +bandikai +bandiness +banding +bandit +banditism +banditry +banditti +bandle +bandless +bandlessly +bandlessness +bandlet +bandman +bandmaster +bando +bandog +bandoleer +bandoleered +bandoline +bandonion +Bandor +bandore +bandrol +bandsman +bandstand +bandster +bandstring +Bandusia +Bandusian +bandwork +bandy +bandyball +bandyman +bane +baneberry +baneful +banefully +banefulness +banewort +Banff +bang +banga +Bangala +bangalay +bangalow +Bangash +bangboard +bange +banger +banghy +Bangia +Bangiaceae +bangiaceous +Bangiales +banging +bangkok +bangle +bangled +bangling +bangster +bangtail +Bangwaketsi +bani +banian +banig +banilad +banish +banisher +banishment +banister +Baniva +baniwa +baniya +banjo +banjoist +banjore +banjorine +banjuke +bank +bankable +Bankalachi +bankbook +banked +banker +bankera +bankerdom +bankeress +banket +bankfull +banking +bankman +bankrider +bankrupt +bankruptcy +bankruptism +bankruptlike +bankruptly +bankruptship +bankrupture +bankshall +Banksia +Banksian +bankside +banksman +bankweed +banky +banner +bannered +bannerer +banneret +bannerfish +bannerless +bannerlike +bannerman +bannerol +bannerwise +bannet +banning +bannister +Bannock +bannock +Bannockburn +banns +bannut +banovina +banquet +banqueteer +banqueteering +banqueter +banquette +bansalague +banshee +banstickle +bant +Bantam +bantam +bantamize +bantamweight +bantay +bantayan +banteng +banter +banterer +banteringly +bantery +Bantingism +bantingize +bantling +Bantoid +Bantu +banty +banuyo +banxring +banya +Banyai +banyan +Banyoro +Banyuls +banzai +baobab +bap +Baphia +Baphomet +Baphometic +Baptanodon +Baptisia +baptisin +baptism +baptismal +baptismally +Baptist +baptistery +baptistic +baptizable +baptize +baptizee +baptizement +baptizer +Baptornis +bar +bara +barabara +barabora +Barabra +Baraca +barad +baragnosis +baragouin +baragouinish +Baraithas +barajillo +Baralipton +Baramika +barandos +barangay +barasingha +barathea +barathra +barathrum +barauna +barb +Barbacoa +Barbacoan +barbacou +Barbadian +Barbados +barbal +barbaloin +Barbara +barbaralalia +Barbarea +barbaresque +Barbarian +barbarian +barbarianism +barbarianize +barbaric +barbarical +barbarically +barbarious +barbariousness +barbarism +barbarity +barbarization +barbarize +barbarous +barbarously +barbarousness +Barbary +barbary +barbas +barbasco +barbastel +barbate +barbated +barbatimao +barbe +barbecue +barbed +barbeiro +barbel +barbellate +barbellula +barbellulate +barber +barberess +barberfish +barberish +barberry +barbershop +barbet +barbette +Barbeyaceae +barbican +barbicel +barbigerous +barbion +barbital +barbitalism +barbiton +barbitone +barbitos +barbiturate +barbituric +barbless +barblet +barbone +barbotine +barbudo +Barbula +barbulate +barbule +barbulyie +barbwire +Barcan +barcarole +barcella +barcelona +Barcoo +bard +bardane +bardash +bardcraft +bardel +Bardesanism +Bardesanist +Bardesanite +bardess +bardic +bardie +bardiglio +bardily +bardiness +barding +bardish +bardism +bardlet +bardlike +bardling +bardo +Bardolater +Bardolatry +Bardolph +Bardolphian +bardship +Bardulph +bardy +Bare +bare +bareback +barebacked +bareboat +barebone +bareboned +bareca +barefaced +barefacedly +barefacedness +barefit +barefoot +barefooted +barehanded +barehead +bareheaded +bareheadedness +barelegged +barely +barenecked +bareness +barer +baresark +baresma +baretta +barff +barfish +barfly +barful +bargain +bargainee +bargainer +bargainor +bargainwise +bargander +barge +bargeboard +bargee +bargeer +bargeese +bargehouse +bargelike +bargeload +bargeman +bargemaster +barger +bargh +bargham +barghest +bargoose +Bari +bari +baria +baric +barid +barie +barile +barilla +baring +baris +barish +barit +barite +baritone +barium +bark +barkbound +barkcutter +barkeeper +barken +barkentine +barker +barkery +barkevikite +barkevikitic +barkey +barkhan +barking +barkingly +Barkinji +barkle +barkless +barklyite +barkometer +barkpeel +barkpeeler +barkpeeling +barksome +barky +barlafumble +barlafummil +barless +barley +barleybird +barleybreak +barleycorn +barleyhood +barleymow +barleysick +barling +barlock +barlow +barm +barmaid +barman +barmaster +barmbrack +barmcloth +Barmecidal +Barmecide +barmkin +barmote +barmskin +barmy +barmybrained +barn +Barnabas +Barnabite +Barnaby +barnacle +Barnard +barnard +barnbrack +Barnburner +Barney +barney +barnful +barnhardtite +barnman +barnstorm +barnstormer +barnstorming +Barnumism +Barnumize +barny +barnyard +Baroco +barocyclonometer +barodynamic +barodynamics +barognosis +barogram +barograph +barographic +baroi +barolo +barology +Barolong +barometer +barometric +barometrical +barometrically +barometrograph +barometrography +barometry +barometz +baromotor +baron +baronage +baroness +baronet +baronetage +baronetcy +baronethood +baronetical +baronetship +barong +Baronga +baronial +baronize +baronry +baronship +barony +Baroque +baroque +baroscope +baroscopic +baroscopical +Barosma +barosmin +barotactic +barotaxis +barotaxy +barothermograph +barothermohygrograph +baroto +Barotse +barouche +barouchet +Barouni +baroxyton +barpost +barquantine +barra +barrabkie +barrable +barrabora +barracan +barrack +barracker +barraclade +barracoon +barracouta +barracuda +barrad +barragan +barrage +barragon +barramunda +barramundi +barranca +barrandite +barras +barrator +barratrous +barratrously +barratry +barred +barrel +barrelage +barreled +barreler +barrelet +barrelful +barrelhead +barrelmaker +barrelmaking +barrelwise +barren +barrenly +barrenness +barrenwort +barrer +barret +barrette +barretter +barricade +barricader +barricado +barrico +barrier +barriguda +barrigudo +barrikin +barriness +barring +Barrington +Barringtonia +barrio +barrister +barristerial +barristership +barristress +barroom +barrow +barrowful +Barrowist +barrowman +barrulee +barrulet +barrulety +barruly +barry +Barsac +barse +barsom +Bart +bartender +bartending +barter +barterer +barth +barthite +bartholinitis +Bartholomean +Bartholomew +Bartholomewtide +Bartholomite +bartizan +bartizaned +Bartlemy +Bartlett +barton +Bartonella +Bartonia +Bartram +Bartramia +Bartramiaceae +Bartramian +Bartsia +baru +Baruch +Barundi +baruria +barvel +barwal +barway +barways +barwise +barwood +barycenter +barycentric +barye +baryecoia +baryglossia +barylalia +barylite +baryphonia +baryphonic +baryphony +barysilite +barysphere +baryta +barytes +barythymia +barytic +barytine +barytocalcite +barytocelestine +barytocelestite +baryton +barytone +barytophyllite +barytostrontianite +barytosulphate +bas +basal +basale +basalia +basally +basalt +basaltes +basaltic +basaltiform +basaltine +basaltoid +basanite +basaree +Bascology +bascule +base +baseball +baseballdom +baseballer +baseboard +baseborn +basebred +based +basehearted +baseheartedness +baselard +baseless +baselessly +baselessness +baselike +baseliner +Basella +Basellaceae +basellaceous +basely +baseman +basement +basementward +baseness +basenji +bases +bash +bashaw +bashawdom +bashawism +bashawship +bashful +bashfully +bashfulness +Bashilange +Bashkir +bashlyk +Bashmuric +basial +basialveolar +basiarachnitis +basiarachnoiditis +basiate +basiation +Basibracteolate +basibranchial +basibranchiate +basibregmatic +basic +basically +basichromatic +basichromatin +basichromatinic +basichromiole +basicity +basicranial +basicytoparaplastin +basidia +basidial +basidigital +basidigitale +basidiogenetic +basidiolichen +Basidiolichenes +basidiomycete +Basidiomycetes +basidiomycetous +basidiophore +basidiospore +basidiosporous +basidium +basidorsal +basifacial +basification +basifier +basifixed +basifugal +basify +basigamous +basigamy +basigenic +basigenous +basiglandular +basigynium +basihyal +basihyoid +Basil +basil +basilar +Basilarchia +basilary +basilateral +basilemma +basileus +Basilian +basilic +Basilica +basilica +Basilicae +basilical +basilican +basilicate +basilicon +Basilics +Basilidian +Basilidianism +basilinna +basiliscan +basiliscine +Basiliscus +basilisk +basilissa +Basilosauridae +Basilosaurus +basilweed +basilysis +basilyst +basimesostasis +basin +basinasal +basinasial +basined +basinerved +basinet +basinlike +basioccipital +basion +basiophitic +basiophthalmite +basiophthalmous +basiotribe +basiotripsy +basiparachromatin +basiparaplastin +basipetal +basiphobia +basipodite +basipoditic +basipterygial +basipterygium +basipterygoid +basiradial +basirhinal +basirostral +basis +basiscopic +basisphenoid +basisphenoidal +basitemporal +basiventral +basivertebral +bask +basker +Baskerville +basket +basketball +basketballer +basketful +basketing +basketmaker +basketmaking +basketry +basketware +basketwoman +basketwood +basketwork +basketworm +Baskish +Baskonize +Basoche +Basoga +basoid +Basoko +Basommatophora +basommatophorous +bason +Basongo +basophile +basophilia +basophilic +basophilous +basophobia +basos +basote +Basque +basque +basqued +basquine +bass +Bassa +Bassalia +Bassalian +bassan +bassanello +bassanite +bassara +bassarid +Bassaris +Bassariscus +bassarisk +basset +bassetite +bassetta +Bassia +bassie +bassine +bassinet +bassist +bassness +basso +bassoon +bassoonist +bassorin +bassus +basswood +Bast +bast +basta +Bastaard +Bastard +bastard +bastardism +bastardization +bastardize +bastardliness +bastardly +bastardy +baste +basten +baster +bastide +bastille +bastinade +bastinado +basting +bastion +bastionary +bastioned +bastionet +bastite +bastnasite +basto +baston +basurale +Basuto +Bat +bat +bataan +batad +Batak +batakan +bataleur +Batan +batara +batata +Batatas +batatilla +Batavi +Batavian +batch +batcher +bate +batea +bateau +bateaux +bated +Batekes +batel +bateman +batement +bater +Batetela +batfish +batfowl +batfowler +batfowling +Bath +bath +Bathala +bathe +batheable +bather +bathetic +bathflower +bathhouse +bathic +bathing +bathless +bathman +bathmic +bathmism +bathmotropic +bathmotropism +bathochromatic +bathochromatism +bathochrome +bathochromic +bathochromy +bathoflore +bathofloric +batholite +batholith +batholithic +batholitic +bathometer +Bathonian +bathophobia +bathorse +bathos +bathrobe +bathroom +bathroomed +bathroot +bathtub +bathukolpian +bathukolpic +bathvillite +bathwort +bathyal +bathyanesthesia +bathybian +bathybic +bathybius +bathycentesis +bathychrome +bathycolpian +bathycolpic +bathycurrent +bathyesthesia +bathygraphic +bathyhyperesthesia +bathyhypesthesia +bathylimnetic +bathylite +bathylith +bathylithic +bathylitic +bathymeter +bathymetric +bathymetrical +bathymetrically +bathymetry +bathyorographical +bathypelagic +bathyplankton +bathyseism +bathysmal +bathysophic +bathysophical +bathysphere +bathythermograph +Batidaceae +batidaceous +batik +batiker +batikulin +batikuling +bating +batino +Batis +batiste +batitinan +batlan +batlike +batling +batlon +batman +Batocrinidae +Batocrinus +Batodendron +batoid +Batoidei +Batoka +baton +Batonga +batonistic +batonne +batophobia +Batrachia +batrachian +batrachiate +Batrachidae +Batrachium +batrachoid +Batrachoididae +batrachophagous +Batrachophidia +batrachophobia +batrachoplasty +Batrachospermum +bats +batsman +batsmanship +batster +batswing +batt +Batta +batta +battailous +Battak +Battakhin +battalia +battalion +battarism +battarismus +battel +batteler +batten +battener +battening +batter +batterable +battercake +batterdock +battered +batterer +batterfang +batteried +batterman +battery +batteryman +battik +batting +battish +battle +battled +battledore +battlefield +battleful +battleground +battlement +battlemented +battleplane +battler +battleship +battlesome +battlestead +battlewagon +battleward +battlewise +battological +battologist +battologize +battology +battue +batty +batukite +batule +Batussi +Batwa +batwing +batyphone +batz +batzen +bauble +baublery +baubling +Baubo +bauch +bauchle +bauckie +bauckiebird +baud +baudekin +baudrons +Bauera +Bauhinia +baul +bauleah +Baume +baumhauerite +baun +bauno +Baure +bauson +bausond +bauta +bauxite +bauxitite +Bavarian +bavaroy +bavary +bavenite +baviaantje +Bavian +bavian +baviere +bavin +Bavius +bavoso +baw +bawarchi +bawbee +bawcock +bawd +bawdily +bawdiness +bawdry +bawdship +bawdyhouse +bawl +bawler +bawley +bawn +Bawra +bawtie +baxter +Baxterian +Baxterianism +baxtone +bay +Baya +baya +bayadere +bayal +bayamo +Bayard +bayard +bayardly +bayberry +baybolt +baybush +baycuru +bayed +bayeta +baygall +bayhead +bayish +bayldonite +baylet +baylike +bayman +bayness +Bayogoula +bayok +bayonet +bayoneted +bayoneteer +bayou +baywood +bazaar +baze +Bazigar +bazoo +bazooka +bazzite +bdellid +Bdellidae +bdellium +bdelloid +Bdelloida +Bdellostoma +Bdellostomatidae +Bdellostomidae +bdellotomy +Bdelloura +Bdellouridae +be +beach +beachcomb +beachcomber +beachcombing +beached +beachhead +beachlamar +beachless +beachman +beachmaster +beachward +beachy +beacon +beaconage +beaconless +beaconwise +bead +beaded +beader +beadflush +beadhouse +beadily +beadiness +beading +beadle +beadledom +beadlehood +beadleism +beadlery +beadleship +beadlet +beadlike +beadman +beadroll +beadrow +beadsman +beadswoman +beadwork +beady +Beagle +beagle +beagling +beak +beaked +beaker +beakerful +beakerman +beakermen +beakful +beakhead +beakiron +beaklike +beaky +beal +beala +bealing +beallach +bealtared +Bealtine +Bealtuinn +beam +beamage +beambird +beamed +beamer +beamfilling +beamful +beamhouse +beamily +beaminess +beaming +beamingly +beamish +beamless +beamlet +beamlike +beamman +beamsman +beamster +beamwork +beamy +bean +beanbag +beanbags +beancod +beanery +beanfeast +beanfeaster +beanfield +beanie +beano +beansetter +beanshooter +beanstalk +beant +beanweed +beany +beaproned +bear +bearable +bearableness +bearably +bearance +bearbaiter +bearbaiting +bearbane +bearberry +bearbind +bearbine +bearcoot +beard +bearded +bearder +beardie +bearding +beardless +beardlessness +beardom +beardtongue +beardy +bearer +bearess +bearfoot +bearherd +bearhide +bearhound +bearing +bearish +bearishly +bearishness +bearlet +bearlike +bearm +bearship +bearskin +beartongue +bearward +bearwood +bearwort +beast +beastbane +beastdom +beasthood +beastie +beastily +beastish +beastishness +beastlike +beastlily +beastliness +beastling +beastlings +beastly +beastman +beastship +beat +Beata +beata +beatable +beatae +beatee +beaten +beater +beaterman +beath +beatific +beatifical +beatifically +beatificate +beatification +beatify +beatinest +beating +beatitude +Beatrice +Beatrix +beatster +beatus +beau +Beauclerc +beaufin +Beaufort +beauish +beauism +Beaujolais +Beaumontia +Beaune +beaupere +beauseant +beauship +beauteous +beauteously +beauteousness +beauti +beautician +beautied +beautification +beautifier +beautiful +beautifully +beautifulness +beautify +beautihood +beauty +beautydom +beautyship +beaux +beaver +Beaverboard +beaverboard +beavered +beaverette +beaverish +beaverism +beaverite +beaverize +Beaverkill +beaverkin +beaverlike +beaverpelt +beaverroot +beaverteen +beaverwood +beavery +beback +bebait +beballed +bebang +bebannered +bebar +bebaron +bebaste +bebat +bebathe +bebatter +bebay +bebeast +bebed +bebeerine +bebeeru +bebelted +bebilya +bebite +bebization +beblain +beblear +bebled +bebless +beblister +beblood +bebloom +beblotch +beblubber +bebog +bebop +beboss +bebotch +bebothered +bebouldered +bebrave +bebreech +bebrine +bebrother +bebrush +bebump +bebusy +bebuttoned +becall +becalm +becalmment +becap +becard +becarpet +becarve +becassocked +becater +because +beccafico +becense +bechained +bechalk +bechance +becharm +bechase +bechatter +bechauffeur +becheck +becher +bechern +bechignoned +bechirp +Bechtler +Bechuana +becircled +becivet +Beck +beck +beckelite +becker +becket +beckiron +beckon +beckoner +beckoning +beckoningly +Becky +beclad +beclamor +beclamour +beclang +beclart +beclasp +beclatter +beclaw +becloak +beclog +beclothe +becloud +beclout +beclown +becluster +becobweb +becoiffed +becollier +becolme +becolor +becombed +become +becomes +becoming +becomingly +becomingness +becomma +becompass +becompliment +becoom +becoresh +becost +becousined +becovet +becoward +becquerelite +becram +becramp +becrampon +becrawl +becreep +becrime +becrimson +becrinolined +becripple +becroak +becross +becrowd +becrown +becrush +becrust +becry +becudgel +becuffed +becuiba +becumber +becuna +becurl +becurry +becurse +becurtained +becushioned +becut +bed +bedabble +bedad +bedaggered +bedamn +bedamp +bedangled +bedare +bedark +bedarken +bedash +bedaub +bedawn +beday +bedaze +bedazement +bedazzle +bedazzlement +bedazzling +bedazzlingly +bedboard +bedbug +bedcap +bedcase +bedchair +bedchamber +bedclothes +bedcord +bedcover +bedded +bedder +bedding +bedead +bedeaf +bedeafen +bedebt +bedeck +bedecorate +bedeguar +bedel +beden +bedene +bedesman +bedevil +bedevilment +bedew +bedewer +bedewoman +bedfast +bedfellow +bedfellowship +bedflower +bedfoot +Bedford +bedframe +bedgery +bedgoer +bedgown +bediademed +bediamonded +bediaper +bedight +bedikah +bedim +bedimple +bedin +bedip +bedirt +bedirter +bedirty +bedismal +bedizen +bedizenment +bedkey +bedlam +bedlamer +Bedlamic +bedlamism +bedlamite +bedlamitish +bedlamize +bedlar +bedless +bedlids +bedmaker +bedmaking +bedman +bedmate +bedoctor +bedog +bedolt +bedot +bedote +Bedouin +Bedouinism +bedouse +bedown +bedoyo +bedpan +bedplate +bedpost +bedquilt +bedrabble +bedraggle +bedragglement +bedrail +bedral +bedrape +bedravel +bedrench +bedress +bedribble +bedrid +bedridden +bedriddenness +bedrift +bedright +bedrip +bedrivel +bedrizzle +bedrock +bedroll +bedroom +bedrop +bedrown +bedrowse +bedrug +bedscrew +bedsick +bedside +bedsite +bedsock +bedsore +bedspread +bedspring +bedstaff +bedstand +bedstaves +bedstead +bedstock +bedstraw +bedstring +bedtick +bedticking +bedtime +bedub +beduchess +beduck +beduke +bedull +bedumb +bedunce +bedunch +bedung +bedur +bedusk +bedust +bedwarf +bedway +bedways +bedwell +bedye +Bee +bee +beearn +beebread +beech +beechdrops +beechen +beechnut +beechwood +beechwoods +beechy +beedged +beedom +beef +beefeater +beefer +beefhead +beefheaded +beefily +beefin +beefiness +beefish +beefishness +beefless +beeflower +beefsteak +beeftongue +beefwood +beefy +beegerite +beehead +beeheaded +beeherd +beehive +beehouse +beeish +beeishness +beek +beekeeper +beekeeping +beekite +Beekmantown +beelbow +beelike +beeline +beelol +Beelzebub +Beelzebubian +Beelzebul +beeman +beemaster +been +beennut +beer +beerage +beerbachite +beerbibber +beerhouse +beerily +beeriness +beerish +beerishly +beermaker +beermaking +beermonger +beerocracy +Beerothite +beerpull +beery +bees +beest +beestings +beeswax +beeswing +beeswinged +beet +beeth +Beethovenian +Beethovenish +Beethovian +beetle +beetled +beetlehead +beetleheaded +beetler +beetlestock +beetlestone +beetleweed +beetmister +beetrave +beetroot +beetrooty +beety +beeve +beevish +beeware +beeway +beeweed +beewise +beewort +befall +befame +befamilied +befamine +befan +befancy +befanned +befathered +befavor +befavour +befeather +beferned +befetished +befetter +befezzed +befiddle +befilch +befile +befilleted +befilmed +befilth +befinger +befire +befist +befit +befitting +befittingly +befittingness +beflag +beflannel +beflap +beflatter +beflea +befleck +beflounce +beflour +beflout +beflower +beflum +befluster +befoam +befog +befool +befoolment +befop +before +beforehand +beforeness +beforested +beforetime +beforetimes +befortune +befoul +befouler +befoulment +befountained +befraught +befreckle +befreeze +befreight +befret +befriend +befriender +befriendment +befrill +befringe +befriz +befrocked +befrogged +befrounce +befrumple +befuddle +befuddlement +befuddler +befume +befurbelowed +befurred +beg +begabled +begad +begall +begani +begar +begari +begarlanded +begarnish +begartered +begash +begat +begaud +begaudy +begay +begaze +begeck +begem +beget +begettal +begetter +beggable +beggar +beggardom +beggarer +beggaress +beggarhood +beggarism +beggarlike +beggarliness +beggarly +beggarman +beggarweed +beggarwise +beggarwoman +beggary +Beggiatoa +Beggiatoaceae +beggiatoaceous +begging +beggingly +beggingwise +Beghard +begift +begiggle +begild +begin +beginger +beginner +beginning +begird +begirdle +beglad +beglamour +beglare +beglerbeg +beglerbeglic +beglerbegluc +beglerbegship +beglerbey +beglic +beglide +beglitter +beglobed +begloom +begloze +begluc +beglue +begnaw +bego +begob +begobs +begoggled +begohm +begone +begonia +Begoniaceae +begoniaceous +Begoniales +begorra +begorry +begotten +begottenness +begoud +begowk +begowned +begrace +begrain +begrave +begray +begrease +begreen +begrett +begrim +begrime +begrimer +begroan +begrown +begrudge +begrudgingly +begruntle +begrutch +begrutten +beguard +beguess +beguile +beguileful +beguilement +beguiler +beguiling +beguilingly +Beguin +Beguine +beguine +begulf +begum +begun +begunk +begut +behale +behalf +behallow +behammer +behap +behatted +behave +behavior +behavioral +behaviored +behaviorism +behaviorist +behavioristic +behavioristically +behead +beheadal +beheader +beheadlined +behear +behears +behearse +behedge +beheld +behelp +behemoth +behen +behenate +behenic +behest +behind +behinder +behindhand +behindsight +behint +behn +behold +beholdable +beholden +beholder +beholding +beholdingness +behoney +behoof +behooped +behoot +behoove +behooveful +behoovefully +behoovefulness +behooves +behooving +behoovingly +behorn +behorror +behowl +behung +behusband +behymn +behypocrite +beice +Beid +beige +being +beingless +beingness +beinked +beira +beisa +Beja +bejabers +bejade +bejan +bejant +bejaundice +bejazz +bejel +bejewel +bejezebel +bejig +bejuggle +bejumble +bekah +bekerchief +bekick +bekilted +beking +bekinkinite +bekiss +bekko +beknave +beknight +beknit +beknived +beknotted +beknottedly +beknottedness +beknow +beknown +Bel +bel +bela +belabor +belaced +beladle +belady +belage +belah +Belait +Belaites +belam +Belamcanda +belanda +belar +belard +belash +belate +belated +belatedly +belatedness +belatticed +belaud +belauder +belavendered +belay +belayer +belch +belcher +beld +beldam +beldamship +belderroot +belduque +beleaf +beleaguer +beleaguerer +beleaguerment +beleap +beleave +belecture +beledgered +belee +belemnid +belemnite +Belemnites +belemnitic +Belemnitidae +belemnoid +Belemnoidea +beletter +belfried +belfry +belga +Belgae +Belgian +Belgic +Belgophile +Belgrade +Belgravia +Belgravian +Belial +Belialic +Belialist +belibel +belick +belie +belief +beliefful +belieffulness +beliefless +belier +believability +believable +believableness +believe +believer +believing +believingly +belight +beliked +Belili +belimousined +Belinda +Belinuridae +Belinurus +belion +beliquor +Belis +belite +belitter +belittle +belittlement +belittler +belive +bell +Bella +Bellabella +Bellacoola +belladonna +bellarmine +Bellatrix +bellbind +bellbird +bellbottle +bellboy +belle +belled +belledom +Belleek +bellehood +belleric +Bellerophon +Bellerophontidae +belletrist +belletristic +bellflower +bellhanger +bellhanging +bellhop +bellhouse +bellicism +bellicose +bellicosely +bellicoseness +bellicosity +bellied +belliferous +belligerence +belligerency +belligerent +belligerently +belling +bellipotent +Bellis +bellite +bellmaker +bellmaking +bellman +bellmanship +bellmaster +bellmouth +bellmouthed +Bellona +Bellonian +bellonion +bellote +Bellovaci +bellow +bellower +bellows +bellowsful +bellowslike +bellowsmaker +bellowsmaking +bellowsman +bellpull +belltail +belltopper +belltopperdom +bellware +bellwaver +bellweed +bellwether +bellwind +bellwine +bellwood +bellwort +belly +bellyache +bellyband +bellyer +bellyfish +bellyflaught +bellyful +bellying +bellyland +bellylike +bellyman +bellypiece +bellypinch +beloam +beloeilite +beloid +belomancy +Belone +belonesite +belong +belonger +belonging +belonid +Belonidae +belonite +belonoid +belonosphaerite +belord +Belostoma +Belostomatidae +Belostomidae +belout +belove +beloved +below +belowstairs +belozenged +Belshazzar +Belshazzaresque +belsire +belt +Beltane +belted +Beltene +belter +Beltian +beltie +beltine +belting +Beltir +Beltis +beltmaker +beltmaking +beltman +belton +beltwise +Beluchi +Belucki +beluga +belugite +belute +belve +belvedere +Belverdian +bely +belying +belyingly +belzebuth +bema +bemad +bemadam +bemaddening +bemail +bemaim +bemajesty +beman +bemangle +bemantle +bemar +bemartyr +bemask +bemaster +bemat +bemata +bemaul +bemazed +Bemba +Bembecidae +Bembex +bemeal +bemean +bemedaled +bemedalled +bementite +bemercy +bemingle +beminstrel +bemire +bemirement +bemirror +bemirrorment +bemist +bemistress +bemitered +bemitred +bemix +bemoan +bemoanable +bemoaner +bemoaning +bemoaningly +bemoat +bemock +bemoil +bemoisten +bemole +bemolt +bemonster +bemoon +bemotto +bemoult +bemouth +bemuck +bemud +bemuddle +bemuddlement +bemuddy +bemuffle +bemurmur +bemuse +bemused +bemusedly +bemusement +bemusk +bemuslined +bemuzzle +Ben +ben +bena +benab +Benacus +bename +benami +benamidar +benasty +benben +bench +benchboard +bencher +benchership +benchfellow +benchful +benching +benchland +benchlet +benchman +benchwork +benchy +bencite +bend +benda +bendability +bendable +bended +bender +bending +bendingly +bendlet +bendsome +bendwise +bendy +bene +beneaped +beneath +beneception +beneceptive +beneceptor +benedicite +Benedict +benedict +Benedicta +Benedictine +Benedictinism +benediction +benedictional +benedictionary +benedictive +benedictively +benedictory +Benedictus +benedight +benefaction +benefactive +benefactor +benefactorship +benefactory +benefactress +benefic +benefice +beneficed +beneficeless +beneficence +beneficent +beneficential +beneficently +beneficial +beneficially +beneficialness +beneficiary +beneficiaryship +beneficiate +beneficiation +benefit +benefiter +beneighbored +Benelux +benempt +benempted +beneplacito +benet +Benetnasch +benettle +Beneventan +Beneventana +benevolence +benevolent +benevolently +benevolentness +benevolist +beng +Bengal +Bengalese +Bengali +Bengalic +bengaline +Bengola +Beni +beni +benight +benighted +benightedness +benighten +benighter +benightmare +benightment +benign +benignancy +benignant +benignantly +benignity +benignly +Benin +Benincasa +benison +benitoite +benj +Benjamin +benjamin +benjaminite +Benjamite +Benjy +benjy +Benkulen +benmost +benn +benne +bennel +Bennet +bennet +Bennettitaceae +bennettitaceous +Bennettitales +Bennettites +bennetweed +Benny +benny +beno +benorth +benote +bensel +bensh +benshea +benshee +benshi +bent +bentang +benthal +Benthamic +Benthamism +Benthamite +benthic +benthon +benthonic +benthos +Bentincks +bentiness +benting +Benton +bentonite +bentstar +bentwood +benty +Benu +benumb +benumbed +benumbedness +benumbing +benumbingly +benumbment +benward +benweed +benzacridine +benzal +benzalacetone +benzalacetophenone +benzalaniline +benzalazine +benzalcohol +benzalcyanhydrin +benzaldehyde +benzaldiphenyl +benzaldoxime +benzalethylamine +benzalhydrazine +benzalphenylhydrazone +benzalphthalide +benzamide +benzamido +benzamine +benzaminic +benzamino +benzanalgen +benzanilide +benzanthrone +benzantialdoxime +benzazide +benzazimide +benzazine +benzazole +benzbitriazole +benzdiazine +benzdifuran +benzdioxazine +benzdioxdiazine +benzdioxtriazine +Benzedrine +benzein +benzene +benzenediazonium +benzenoid +benzenyl +benzhydrol +benzhydroxamic +benzidine +benzidino +benzil +benzilic +benzimidazole +benziminazole +benzinduline +benzine +benzo +benzoate +benzoated +benzoazurine +benzobis +benzocaine +benzocoumaran +benzodiazine +benzodiazole +benzoflavine +benzofluorene +benzofulvene +benzofuran +benzofuroquinoxaline +benzofuryl +benzoglycolic +benzoglyoxaline +benzohydrol +benzoic +benzoid +benzoin +benzoinated +benzoiodohydrin +benzol +benzolate +benzole +benzolize +benzomorpholine +benzonaphthol +benzonitrile +benzonitrol +benzoperoxide +benzophenanthrazine +benzophenanthroline +benzophenazine +benzophenol +benzophenone +benzophenothiazine +benzophenoxazine +benzophloroglucinol +benzophosphinic +benzophthalazine +benzopinacone +benzopyran +benzopyranyl +benzopyrazolone +benzopyrylium +benzoquinoline +benzoquinone +benzoquinoxaline +benzosulphimide +benzotetrazine +benzotetrazole +benzothiazine +benzothiazole +benzothiazoline +benzothiodiazole +benzothiofuran +benzothiophene +benzothiopyran +benzotoluide +benzotriazine +benzotriazole +benzotrichloride +benzotrifuran +benzoxate +benzoxy +benzoxyacetic +benzoxycamphor +benzoxyphenanthrene +benzoyl +benzoylate +benzoylation +benzoylformic +benzoylglycine +benzpinacone +benzthiophen +benztrioxazine +benzyl +benzylamine +benzylic +benzylidene +benzylpenicillin +beode +Beothuk +Beothukan +Beowulf +bepaid +Bepaint +bepale +bepaper +beparch +beparody +beparse +bepart +bepaste +bepastured +bepat +bepatched +bepaw +bepearl +bepelt +bepen +bepepper +beperiwigged +bepester +bepewed +bephilter +bephrase +bepicture +bepiece +bepierce +bepile +bepill +bepillared +bepimple +bepinch +bepistoled +bepity +beplague +beplaided +beplaster +beplumed +bepommel +bepowder +bepraise +bepraisement +bepraiser +beprank +bepray +bepreach +bepress +bepretty +bepride +beprose +bepuddle +bepuff +bepun +bepurple +bepuzzle +bepuzzlement +bequalm +bequeath +bequeathable +bequeathal +bequeather +bequeathment +bequest +bequirtle +bequote +ber +berain +berairou +berakah +berake +berakoth +berapt +berascal +berat +berate +berattle +beraunite +beray +berbamine +Berber +Berberi +Berberian +berberid +Berberidaceae +berberidaceous +berberine +Berberis +berberry +Berchemia +Berchta +berdache +bere +Berean +bereason +bereave +bereavement +bereaven +bereaver +bereft +berend +Berengaria +Berengarian +Berengarianism +berengelite +Berenice +Bereshith +beresite +beret +berewick +berg +bergalith +Bergama +Bergamask +bergamiol +Bergamo +Bergamot +bergamot +bergander +bergaptene +berger +berghaan +berginization +berginize +berglet +bergschrund +Bergsonian +Bergsonism +bergut +bergy +bergylt +berhyme +Beri +beribanded +beribboned +beriberi +beriberic +beride +berigora +beringed +beringite +beringleted +berinse +berith +Berkeleian +Berkeleianism +Berkeleyism +Berkeleyite +berkelium +berkovets +berkowitz +Berkshire +berley +berlin +berline +Berliner +berlinite +Berlinize +berm +Bermuda +Bermudian +bermudite +Bern +Bernard +Bernardina +Bernardine +berne +Bernese +Bernice +Bernicia +bernicle +Berninesque +Bernoullian +berobed +Beroe +Beroida +Beroidae +beroll +Berossos +berouged +beround +berrendo +berret +berri +berried +berrier +berrigan +berrugate +berry +berrybush +berryless +berrylike +berrypicker +berrypicking +berseem +berserk +berserker +Bersiamite +Bersil +Bert +Bertat +Berteroa +berth +Bertha +berthage +berthed +berther +berthierite +berthing +Berthold +Bertholletia +Bertie +Bertolonia +Bertram +bertram +bertrandite +bertrum +beruffed +beruffled +berust +bervie +berycid +Berycidae +beryciform +berycine +berycoid +Berycoidea +berycoidean +Berycoidei +Berycomorphi +beryl +berylate +beryllia +berylline +berylliosis +beryllium +berylloid +beryllonate +beryllonite +beryllosis +Berytidae +Beryx +berzelianite +berzeliite +bes +besa +besagne +besaiel +besaint +besan +besanctify +besauce +bescab +bescarf +bescatter +bescent +bescorch +bescorn +bescoundrel +bescour +bescourge +bescramble +bescrape +bescratch +bescrawl +bescreen +bescribble +bescurf +bescurvy +bescutcheon +beseam +besee +beseech +beseecher +beseeching +beseechingly +beseechingness +beseechment +beseem +beseeming +beseemingly +beseemingness +beseemliness +beseemly +beseen +beset +besetment +besetter +besetting +beshackle +beshade +beshadow +beshag +beshake +beshame +beshawled +beshear +beshell +beshield +beshine +beshiver +beshlik +beshod +beshout +beshow +beshower +beshrew +beshriek +beshrivel +beshroud +besiclometer +beside +besides +besiege +besieged +besiegement +besieger +besieging +besiegingly +besigh +besilver +besin +besing +besiren +besit +beslab +beslap +beslash +beslave +beslaver +besleeve +beslime +beslimer +beslings +beslipper +beslobber +beslow +beslubber +beslur +beslushed +besmear +besmearer +besmell +besmile +besmirch +besmircher +besmirchment +besmoke +besmooth +besmother +besmouch +besmudge +besmut +besmutch +besnare +besneer +besnivel +besnow +besnuff +besodden +besogne +besognier +besoil +besom +besomer +besonnet +besoot +besoothe +besoothement +besot +besotment +besotted +besottedly +besottedness +besotting +besottingly +besought +besoul +besour +bespangle +bespate +bespatter +bespatterer +bespatterment +bespawl +bespeak +bespeakable +bespeaker +bespecked +bespeckle +bespecklement +bespectacled +besped +bespeech +bespeed +bespell +bespelled +bespend +bespete +bespew +bespice +bespill +bespin +bespirit +bespit +besplash +besplatter +besplit +bespoke +bespoken +bespot +bespottedness +bespouse +bespout +bespray +bespread +besprent +besprinkle +besprinkler +bespurred +besputter +bespy +besqueeze +besquib +besra +Bess +Bessarabian +Besselian +Bessemer +bessemer +Bessemerize +bessemerize +Bessera +Bessi +Bessie +Bessy +best +bestab +bestain +bestamp +bestar +bestare +bestarve +bestatued +bestay +bestayed +bestead +besteer +bestench +bester +bestial +bestialism +bestialist +bestiality +bestialize +bestially +bestiarian +bestiarianism +bestiary +bestick +bestill +bestink +bestir +bestness +bestock +bestore +bestorm +bestove +bestow +bestowable +bestowage +bestowal +bestower +bestowing +bestowment +bestraddle +bestrapped +bestraught +bestraw +bestreak +bestream +bestrew +bestrewment +bestride +bestripe +bestrode +bestubbled +bestuck +bestud +besugar +besuit +besully +beswarm +besweatered +besweeten +beswelter +beswim +beswinge +beswitch +bet +Beta +beta +betacism +betacismus +betafite +betag +betail +betailor +betaine +betainogen +betalk +betallow +betangle +betanglement +betask +betassel +betatron +betattered +betaxed +betear +beteela +beteem +betel +Betelgeuse +Beth +beth +bethabara +bethankit +bethel +Bethesda +bethflower +bethink +Bethlehem +Bethlehemite +bethought +bethrall +bethreaten +bethroot +Bethuel +bethumb +bethump +bethunder +bethwack +Bethylidae +betide +betimber +betimes +betinge +betipple +betire +betis +betitle +betocsin +betoil +betoken +betokener +betone +betongue +Betonica +betony +betorcin +betorcinol +betoss +betowel +betowered +Betoya +Betoyan +betrace +betrail +betrample +betrap +betravel +betray +betrayal +betrayer +betrayment +betread +betrend +betrim +betrinket +betroth +betrothal +betrothed +betrothment +betrough +betrousered +betrumpet +betrunk +Betsey +Betsileos +Betsimisaraka +betso +Betsy +Betta +betted +better +betterer +bettergates +bettering +betterly +betterment +bettermost +betterness +betters +Bettina +Bettine +betting +bettong +bettonga +Bettongia +bettor +Betty +betty +betuckered +Betula +Betulaceae +betulaceous +betulin +betulinamaric +betulinic +betulinol +Betulites +beturbaned +betusked +betutor +betutored +betwattled +between +betweenbrain +betweenity +betweenmaid +betweenness +betweenwhiles +betwine +betwit +betwixen +betwixt +beudantite +Beulah +beuniformed +bevatron +beveil +bevel +beveled +beveler +bevelled +bevelment +bevenom +bever +beverage +beverse +bevesseled +bevesselled +beveto +bevillain +bevined +bevoiled +bevomit +bevue +bevy +bewail +bewailable +bewailer +bewailing +bewailingly +bewailment +bewaitered +bewall +beware +bewash +bewaste +bewater +beweary +beweep +beweeper +bewelcome +bewelter +bewept +bewest +bewet +bewhig +bewhiskered +bewhisper +bewhistle +bewhite +bewhiten +bewidow +bewig +bewigged +bewilder +bewildered +bewilderedly +bewilderedness +bewildering +bewilderingly +bewilderment +bewimple +bewinged +bewinter +bewired +bewitch +bewitchedness +bewitcher +bewitchery +bewitchful +bewitching +bewitchingly +bewitchingness +bewitchment +bewith +bewizard +bework +beworm +beworn +beworry +beworship +bewrap +bewrathed +bewray +bewrayer +bewrayingly +bewrayment +bewreath +bewreck +bewrite +bey +beydom +beylic +beylical +beyond +beyrichite +beyship +Bezaleel +Bezaleelian +bezant +bezantee +bezanty +bezel +bezesteen +bezetta +bezique +bezoar +bezoardic +bezonian +Bezpopovets +bezzi +bezzle +bezzo +bhabar +Bhadon +Bhaga +bhagavat +bhagavata +bhaiachari +bhaiyachara +bhakta +bhakti +bhalu +bhandar +bhandari +bhang +bhangi +Bhar +bhara +bharal +Bharata +bhat +bhava +Bhavani +bheesty +bhikku +bhikshu +Bhil +Bhili +Bhima +Bhojpuri +bhoosa +Bhotia +Bhotiya +Bhowani +bhoy +Bhumij +bhungi +bhungini +bhut +Bhutanese +Bhutani +bhutatathata +Bhutia +biabo +biacetyl +biacetylene +biacid +biacromial +biacuminate +biacuru +bialate +biallyl +bialveolar +Bianca +Bianchi +bianchite +bianco +biangular +biangulate +biangulated +biangulous +bianisidine +biannual +biannually +biannulate +biarchy +biarcuate +biarcuated +biarticular +biarticulate +biarticulated +bias +biasness +biasteric +biaswise +biatomic +biauricular +biauriculate +biaxal +biaxial +biaxiality +biaxially +biaxillary +bib +bibacious +bibacity +bibasic +bibation +bibb +bibber +bibble +bibbler +bibbons +bibcock +bibenzyl +bibi +Bibio +bibionid +Bibionidae +bibiri +bibitory +Bible +bibless +Biblic +Biblical +Biblicality +Biblically +Biblicism +Biblicist +Biblicistic +Biblicolegal +Biblicoliterary +Biblicopsychological +biblioclasm +biblioclast +bibliofilm +bibliogenesis +bibliognost +bibliognostic +bibliogony +bibliograph +bibliographer +bibliographic +bibliographical +bibliographically +bibliographize +bibliography +biblioklept +bibliokleptomania +bibliokleptomaniac +bibliolater +bibliolatrous +bibliolatry +bibliological +bibliologist +bibliology +bibliomancy +bibliomane +bibliomania +bibliomaniac +bibliomaniacal +bibliomanian +bibliomanianism +bibliomanism +bibliomanist +bibliopegic +bibliopegist +bibliopegistic +bibliopegy +bibliophage +bibliophagic +bibliophagist +bibliophagous +bibliophile +bibliophilic +bibliophilism +bibliophilist +bibliophilistic +bibliophily +bibliophobia +bibliopolar +bibliopole +bibliopolery +bibliopolic +bibliopolical +bibliopolically +bibliopolism +bibliopolist +bibliopolistic +bibliopoly +bibliosoph +bibliotaph +bibliotaphic +bibliothec +bibliotheca +bibliothecal +bibliothecarial +bibliothecarian +bibliothecary +bibliotherapeutic +bibliotherapist +bibliotherapy +bibliothetic +bibliotic +bibliotics +bibliotist +Biblism +Biblist +biblus +biborate +bibracteate +bibracteolate +bibulosity +bibulous +bibulously +bibulousness +Bibulus +bicalcarate +bicameral +bicameralism +bicamerist +bicapitate +bicapsular +bicarbonate +bicarbureted +bicarinate +bicarpellary +bicarpellate +bicaudal +bicaudate +Bice +bice +bicellular +bicentenary +bicentennial +bicephalic +bicephalous +biceps +bicetyl +bichir +bichloride +bichord +bichromate +bichromatic +bichromatize +bichrome +bichromic +bichy +biciliate +biciliated +bicipital +bicipitous +bicircular +bicirrose +bick +bicker +bickerer +bickern +biclavate +biclinium +bicollateral +bicollaterality +bicolligate +bicolor +bicolored +bicolorous +biconcave +biconcavity +bicondylar +bicone +biconic +biconical +biconically +biconjugate +biconsonantal +biconvex +bicorn +bicornate +bicorne +bicorned +bicornous +bicornuate +bicornuous +bicornute +bicorporal +bicorporate +bicorporeal +bicostate +bicrenate +bicrescentic +bicrofarad +bicron +bicrural +bicursal +bicuspid +bicuspidate +bicyanide +bicycle +bicycler +bicyclic +bicyclism +bicyclist +bicyclo +bicycloheptane +bicylindrical +bid +bidactyl +bidactyle +bidactylous +bidar +bidarka +bidcock +biddable +biddableness +biddably +biddance +Biddelian +bidder +bidding +Biddulphia +Biddulphiaceae +Biddy +biddy +bide +Bidens +bident +bidental +bidentate +bidented +bidential +bidenticulate +bider +bidet +bidigitate +bidimensional +biding +bidirectional +bidiurnal +Bidpai +bidri +biduous +bieberite +Biedermeier +bield +bieldy +bielectrolysis +bielenite +Bielid +Bielorouss +bien +bienly +bienness +biennia +biennial +biennially +biennium +bier +bierbalk +biethnic +bietle +bifacial +bifanged +bifara +bifarious +bifariously +bifer +biferous +biff +biffin +bifid +bifidate +bifidated +bifidity +bifidly +bifilar +bifilarly +bifistular +biflabellate +biflagellate +biflecnode +biflected +biflex +biflorate +biflorous +bifluoride +bifocal +bifoil +bifold +bifolia +bifoliate +bifoliolate +bifolium +biforked +biform +biformed +biformity +biforous +bifront +bifrontal +bifronted +bifurcal +bifurcate +bifurcated +bifurcately +bifurcation +big +biga +bigamic +bigamist +bigamistic +bigamize +bigamous +bigamously +bigamy +bigarade +bigaroon +bigarreau +bigbloom +bigemina +bigeminal +bigeminate +bigeminated +bigeminum +bigener +bigeneric +bigential +bigeye +bigg +biggah +biggen +bigger +biggest +biggin +biggish +biggonet +bigha +bighead +bighearted +bigheartedness +bighorn +bight +biglandular +biglenoid +biglot +bigmouth +bigmouthed +bigness +Bignonia +Bignoniaceae +bignoniaceous +bignoniad +bignou +bigoniac +bigonial +bigot +bigoted +bigotedly +bigotish +bigotry +bigotty +bigroot +bigthatch +biguanide +biguttate +biguttulate +bigwig +bigwigged +bigwiggedness +bigwiggery +bigwiggism +Bihai +Biham +bihamate +Bihari +biharmonic +bihourly +bihydrazine +bija +bijasal +bijou +bijouterie +bijoux +bijugate +bijugular +bike +bikh +bikhaconitine +bikini +Bikol +Bikram +Bikukulla +Bilaan +bilabe +bilabial +bilabiate +bilalo +bilamellar +bilamellate +bilamellated +bilaminar +bilaminate +bilaminated +bilander +bilateral +bilateralism +bilaterality +bilaterally +bilateralness +Bilati +bilberry +bilbie +bilbo +bilboquet +bilby +bilch +bilcock +bildar +bilders +bile +bilestone +bilge +bilgy +Bilharzia +bilharzial +bilharziasis +bilharzic +bilharziosis +bilianic +biliary +biliate +biliation +bilic +bilicyanin +bilifaction +biliferous +bilification +bilifuscin +bilify +bilihumin +bilimbi +bilimbing +biliment +Bilin +bilinear +bilineate +bilingual +bilingualism +bilingually +bilinguar +bilinguist +bilinigrin +bilinite +bilio +bilious +biliously +biliousness +biliprasin +bilipurpurin +bilipyrrhin +bilirubin +bilirubinemia +bilirubinic +bilirubinuria +biliteral +biliteralism +bilith +bilithon +biliverdic +biliverdin +bilixanthin +bilk +bilker +Bill +bill +billa +billable +billabong +billback +billbeetle +Billbergia +billboard +billbroking +billbug +billed +biller +billet +billeter +billethead +billeting +billetwood +billety +billfish +billfold +billhead +billheading +billholder +billhook +billian +billiard +billiardist +billiardly +billiards +Billiken +billikin +billing +billingsgate +billion +billionaire +billionism +billionth +billitonite +Billjim +billman +billon +billot +billow +billowiness +billowy +billposter +billposting +billsticker +billsticking +Billy +billy +billyboy +billycan +billycock +billyer +billyhood +billywix +bilo +bilobated +bilobe +bilobed +bilobiate +bilobular +bilocation +bilocellate +bilocular +biloculate +Biloculina +biloculine +bilophodont +Biloxi +bilsh +Bilskirnir +bilsted +biltong +biltongue +Bim +bimaculate +bimaculated +bimalar +Bimana +bimanal +bimane +bimanous +bimanual +bimanually +bimarginate +bimarine +bimastic +bimastism +bimastoid +bimasty +bimaxillary +bimbil +Bimbisara +bimeby +bimensal +bimester +bimestrial +bimetalic +bimetallism +bimetallist +bimetallistic +bimillenary +bimillennium +bimillionaire +Bimini +Bimmeler +bimodal +bimodality +bimolecular +bimonthly +bimotored +bimotors +bimucronate +bimuscular +bin +binal +binaphthyl +binarium +binary +binate +binately +bination +binational +binaural +binauricular +binbashi +bind +binder +bindery +bindheimite +binding +bindingly +bindingness +bindle +bindlet +bindoree +bindweb +bindweed +bindwith +bindwood +bine +binervate +bineweed +bing +binge +bingey +binghi +bingle +bingo +bingy +binh +Bini +biniodide +Binitarian +Binitarianism +bink +binman +binna +binnacle +binning +binnite +binnogue +bino +binocle +binocular +binocularity +binocularly +binoculate +binodal +binode +binodose +binodous +binomenclature +binomial +binomialism +binomially +binominal +binominated +binominous +binormal +binotic +binotonous +binous +binoxalate +binoxide +bint +bintangor +binturong +binuclear +binucleate +binucleated +binucleolate +binukau +Binzuru +biobibliographical +biobibliography +bioblast +bioblastic +biocatalyst +biocellate +biocentric +biochemic +biochemical +biochemically +biochemics +biochemist +biochemistry +biochemy +biochore +bioclimatic +bioclimatology +biocoenose +biocoenosis +biocoenotic +biocycle +biod +biodynamic +biodynamical +biodynamics +biodyne +bioecologic +bioecological +bioecologically +bioecologist +bioecology +biogen +biogenase +biogenesis +biogenesist +biogenetic +biogenetical +biogenetically +biogenetics +biogenous +biogeny +biogeochemistry +biogeographic +biogeographical +biogeographically +biogeography +biognosis +biograph +biographee +biographer +biographic +biographical +biographically +biographist +biographize +biography +bioherm +biokinetics +biolinguistics +biolith +biologese +biologic +biological +biologically +biologicohumanistic +biologism +biologist +biologize +biology +bioluminescence +bioluminescent +biolysis +biolytic +biomagnetic +biomagnetism +biomathematics +biome +biomechanical +biomechanics +biometeorology +biometer +biometric +biometrical +biometrically +biometrician +biometricist +biometrics +biometry +biomicroscopy +bion +bionergy +bionomic +bionomical +bionomically +bionomics +bionomist +bionomy +biophagism +biophagous +biophagy +biophilous +biophore +biophotophone +biophysical +biophysicochemical +biophysics +biophysiography +biophysiological +biophysiologist +biophysiology +biophyte +bioplasm +bioplasmic +bioplast +bioplastic +bioprecipitation +biopsic +biopsy +biopsychic +biopsychical +biopsychological +biopsychologist +biopsychology +biopyribole +bioral +biorbital +biordinal +bioreaction +biorgan +bios +bioscope +bioscopic +bioscopy +biose +biosis +biosocial +biosociological +biosphere +biostatic +biostatical +biostatics +biostatistics +biosterin +biosterol +biostratigraphy +biosynthesis +biosynthetic +biosystematic +biosystematics +biosystematist +biosystematy +Biota +biota +biotaxy +biotechnics +biotic +biotical +biotics +biotin +biotite +biotitic +biotome +biotomy +biotope +biotype +biotypic +biovular +biovulate +bioxalate +bioxide +bipack +bipaleolate +Bipaliidae +Bipalium +bipalmate +biparasitic +biparental +biparietal +biparous +biparted +bipartible +bipartient +bipartile +bipartisan +bipartisanship +bipartite +bipartitely +bipartition +biparty +bipaschal +bipectinate +bipectinated +biped +bipedal +bipedality +bipedism +bipeltate +bipennate +bipennated +bipenniform +biperforate +bipersonal +bipetalous +biphase +biphasic +biphenol +biphenyl +biphenylene +bipinnaria +bipinnate +bipinnated +bipinnately +bipinnatifid +bipinnatiparted +bipinnatipartite +bipinnatisect +bipinnatisected +biplanal +biplanar +biplane +biplicate +biplicity +biplosion +biplosive +bipod +bipolar +bipolarity +bipolarize +Bipont +Bipontine +biporose +biporous +biprism +biprong +bipunctal +bipunctate +bipunctual +bipupillate +bipyramid +bipyramidal +bipyridine +bipyridyl +biquadrantal +biquadrate +biquadratic +biquarterly +biquartz +biquintile +biracial +biracialism +biradial +biradiate +biradiated +biramous +birational +birch +birchbark +birchen +birching +birchman +birchwood +bird +birdbander +birdbanding +birdbath +birdberry +birdcall +birdcatcher +birdcatching +birdclapper +birdcraft +birddom +birdeen +birder +birdglue +birdhood +birdhouse +birdie +birdikin +birding +birdland +birdless +birdlet +birdlike +birdlime +birdling +birdlore +birdman +birdmouthed +birdnest +birdnester +birdseed +birdstone +birdweed +birdwise +birdwoman +birdy +birectangular +birefracting +birefraction +birefractive +birefringence +birefringent +bireme +biretta +Birgus +biri +biriba +birimose +birk +birken +Birkenhead +Birkenia +Birkeniidae +birkie +birkremite +birl +birle +birler +birlie +birlieman +birlinn +birma +Birmingham +Birminghamize +birn +birny +Biron +birostrate +birostrated +birotation +birotatory +birr +birse +birsle +birsy +birth +birthbed +birthday +birthland +birthless +birthmark +birthmate +birthnight +birthplace +birthright +birthroot +birthstone +birthstool +birthwort +birthy +bis +bisabol +bisaccate +bisacromial +bisalt +Bisaltae +bisantler +bisaxillary +bisbeeite +biscacha +Biscanism +Biscayan +Biscayanism +biscayen +Biscayner +bischofite +biscotin +biscuit +biscuiting +biscuitlike +biscuitmaker +biscuitmaking +biscuitroot +biscuitry +bisdiapason +bisdimethylamino +bisect +bisection +bisectional +bisectionally +bisector +bisectrices +bisectrix +bisegment +biseptate +biserial +biserially +biseriate +biseriately +biserrate +bisetose +bisetous +bisexed +bisext +bisexual +bisexualism +bisexuality +bisexually +bisexuous +bisglyoxaline +Bishareen +Bishari +Bisharin +bishop +bishopdom +bishopess +bishopful +bishophood +bishopless +bishoplet +bishoplike +bishopling +bishopric +bishopship +bishopweed +bisiliac +bisilicate +bisiliquous +bisimine +bisinuate +bisinuation +bisischiadic +bisischiatic +Bisley +bislings +bismar +Bismarck +Bismarckian +Bismarckianism +bismarine +bismerpund +bismillah +bismite +Bismosol +bismuth +bismuthal +bismuthate +bismuthic +bismuthide +bismuthiferous +bismuthine +bismuthinite +bismuthite +bismuthous +bismuthyl +bismutite +bismutoplagionite +bismutosmaltite +bismutosphaerite +bisnaga +bison +bisonant +bisontine +bisphenoid +bispinose +bispinous +bispore +bisporous +bisque +bisquette +bissext +bissextile +bisson +bistate +bistephanic +bister +bistered +bistetrazole +bisti +bistipular +bistipulate +bistipuled +bistort +Bistorta +bistournage +bistoury +bistratal +bistratose +bistriate +bistriazole +bistro +bisubstituted +bisubstitution +bisulcate +bisulfid +bisulphate +bisulphide +bisulphite +bisyllabic +bisyllabism +bisymmetric +bisymmetrical +bisymmetrically +bisymmetry +bit +bitable +bitangent +bitangential +bitanhol +bitartrate +bitbrace +bitch +bite +bitemporal +bitentaculate +biter +biternate +biternately +bitesheep +bitewing +bitheism +Bithynian +biti +biting +bitingly +bitingness +Bitis +bitless +bito +bitolyl +bitonality +bitreadle +bitripartite +bitripinnatifid +bitriseptate +bitrochanteric +bitstock +bitstone +bitt +bitted +bitten +bitter +bitterbark +bitterblain +bitterbloom +bitterbur +bitterbush +bitterful +bitterhead +bitterhearted +bitterheartedness +bittering +bitterish +bitterishness +bitterless +bitterling +bitterly +bittern +bitterness +bitternut +bitterroot +bitters +bittersweet +bitterweed +bitterwood +bitterworm +bitterwort +bitthead +bittie +Bittium +bittock +bitty +bitubercular +bituberculate +bituberculated +Bitulithic +bitulithic +bitume +bitumed +bitumen +bituminate +bituminiferous +bituminization +bituminize +bituminoid +bituminous +bitwise +bityite +bitypic +biune +biunial +biunity +biunivocal +biurate +biurea +biuret +bivalence +bivalency +bivalent +bivalve +bivalved +Bivalvia +bivalvian +bivalvous +bivalvular +bivariant +bivariate +bivascular +bivaulted +bivector +biventer +biventral +biverbal +bivinyl +bivious +bivittate +bivocal +bivocalized +bivoltine +bivoluminous +bivouac +biwa +biweekly +biwinter +Bixa +Bixaceae +bixaceous +bixbyite +bixin +biyearly +biz +bizardite +bizarre +bizarrely +bizarreness +Bizen +bizet +bizonal +bizone +Bizonia +bizygomatic +bizz +blab +blabber +blabberer +blachong +black +blackacre +blackamoor +blackback +blackball +blackballer +blackband +Blackbeard +blackbelly +blackberry +blackbine +blackbird +blackbirder +blackbirding +blackboard +blackboy +blackbreast +blackbush +blackbutt +blackcap +blackcoat +blackcock +blackdamp +blacken +blackener +blackening +blacker +blacketeer +blackey +blackeyes +blackface +Blackfeet +blackfellow +blackfellows +blackfin +blackfire +blackfish +blackfisher +blackfishing +Blackfoot +blackfoot +Blackfriars +blackguard +blackguardism +blackguardize +blackguardly +blackguardry +Blackhander +blackhead +blackheads +blackheart +blackhearted +blackheartedness +blackie +blacking +blackish +blackishly +blackishness +blackit +blackjack +blackland +blackleg +blackleggery +blacklegism +blacklegs +blackly +blackmail +blackmailer +blackneb +blackneck +blackness +blacknob +blackout +blackpoll +blackroot +blackseed +blackshirted +blacksmith +blacksmithing +blackstick +blackstrap +blacktail +blackthorn +blacktongue +blacktree +blackwash +blackwasher +blackwater +blackwood +blackwork +blackwort +blacky +blad +bladder +bladderet +bladderless +bladderlike +bladdernose +bladdernut +bladderpod +bladderseed +bladderweed +bladderwort +bladdery +blade +bladebone +bladed +bladelet +bladelike +blader +bladesmith +bladewise +blading +bladish +blady +bladygrass +blae +blaeberry +blaeness +blaewort +blaff +blaffert +blaflum +blah +blahlaut +blain +blair +blairmorite +Blake +blake +blakeberyed +blamable +blamableness +blamably +blame +blamed +blameful +blamefully +blamefulness +blameless +blamelessly +blamelessness +blamer +blameworthiness +blameworthy +blaming +blamingly +blan +blanc +blanca +blancard +Blanch +blanch +blancher +blanching +blanchingly +blancmange +blancmanger +blanco +bland +blanda +Blandfordia +blandiloquence +blandiloquious +blandiloquous +blandish +blandisher +blandishing +blandishingly +blandishment +blandly +blandness +blank +blankard +blankbook +blanked +blankeel +blanket +blanketed +blanketeer +blanketflower +blanketing +blanketless +blanketmaker +blanketmaking +blanketry +blanketweed +blankety +blanking +blankish +Blankit +blankite +blankly +blankness +blanky +blanque +blanquillo +blare +Blarina +blarney +blarneyer +blarnid +blarny +blart +blas +blase +blash +blashy +Blasia +blaspheme +blasphemer +blasphemous +blasphemously +blasphemousness +blasphemy +blast +blasted +blastema +blastemal +blastematic +blastemic +blaster +blastful +blasthole +blastid +blastie +blasting +blastment +blastocarpous +blastocheme +blastochyle +blastocoele +blastocolla +blastocyst +blastocyte +blastoderm +blastodermatic +blastodermic +blastodisk +blastogenesis +blastogenetic +blastogenic +blastogeny +blastogranitic +blastoid +Blastoidea +blastoma +blastomata +blastomere +blastomeric +Blastomyces +blastomycete +Blastomycetes +blastomycetic +blastomycetous +blastomycosis +blastomycotic +blastoneuropore +Blastophaga +blastophitic +blastophoral +blastophore +blastophoric +blastophthoria +blastophthoric +blastophyllum +blastoporal +blastopore +blastoporic +blastoporphyritic +blastosphere +blastospheric +blastostylar +blastostyle +blastozooid +blastplate +blastula +blastulae +blastular +blastulation +blastule +blasty +blat +blatancy +blatant +blatantly +blate +blately +blateness +blather +blatherer +blatherskite +blathery +blatjang +Blatta +blatta +Blattariae +blatter +blatterer +blatti +blattid +Blattidae +blattiform +Blattodea +blattoid +Blattoidea +blaubok +Blaugas +blauwbok +blaver +blaw +blawort +blay +blaze +blazer +blazing +blazingly +blazon +blazoner +blazoning +blazonment +blazonry +blazy +bleaberry +bleach +bleachability +bleachable +bleached +bleacher +bleacherite +bleacherman +bleachery +bleachfield +bleachground +bleachhouse +bleaching +bleachman +bleachworks +bleachyard +bleak +bleakish +bleakly +bleakness +bleaky +blear +bleared +blearedness +bleareye +bleariness +blearness +bleary +bleat +bleater +bleating +bleatingly +bleaty +bleb +blebby +blechnoid +Blechnum +bleck +blee +bleed +bleeder +bleeding +bleekbok +bleery +bleeze +bleezy +blellum +blemish +blemisher +blemishment +Blemmyes +blench +blencher +blenching +blenchingly +blencorn +blend +blendcorn +blende +blended +blender +blending +blendor +blendure +blendwater +blennadenitis +blennemesis +blennenteria +blennenteritis +blenniid +Blenniidae +blenniiform +Blenniiformes +blennioid +Blennioidea +blennocele +blennocystitis +blennoemesis +blennogenic +blennogenous +blennoid +blennoma +blennometritis +blennophlogisma +blennophlogosis +blennophthalmia +blennoptysis +blennorrhagia +blennorrhagic +blennorrhea +blennorrheal +blennorrhinia +blennosis +blennostasis +blennostatic +blennothorax +blennotorrhea +blennuria +blenny +blennymenitis +blent +bleo +blephara +blepharadenitis +blepharal +blepharanthracosis +blepharedema +blepharelcosis +blepharemphysema +Blephariglottis +blepharism +blepharitic +blepharitis +blepharoadenitis +blepharoadenoma +blepharoatheroma +blepharoblennorrhea +blepharocarcinoma +Blepharocera +Blepharoceridae +blepharochalasis +blepharochromidrosis +blepharoclonus +blepharocoloboma +blepharoconjunctivitis +blepharodiastasis +blepharodyschroia +blepharohematidrosis +blepharolithiasis +blepharomelasma +blepharoncosis +blepharoncus +blepharophimosis +blepharophryplasty +blepharophthalmia +blepharophyma +blepharoplast +blepharoplastic +blepharoplasty +blepharoplegia +blepharoptosis +blepharopyorrhea +blepharorrhaphy +blepharospasm +blepharospath +blepharosphincterectomy +blepharostat +blepharostenosis +blepharosymphysis +blepharosyndesmitis +blepharosynechia +blepharotomy +blepharydatis +Blephillia +blesbok +blesbuck +bless +blessed +blessedly +blessedness +blesser +blessing +blessingly +blest +blet +bletheration +Bletia +Bletilla +blewits +blibe +blick +blickey +Blighia +blight +blightbird +blighted +blighter +blighting +blightingly +blighty +blimbing +blimp +blimy +blind +blindage +blindball +blinded +blindedly +blinder +blindeyes +blindfast +blindfish +blindfold +blindfolded +blindfoldedness +blindfolder +blindfoldly +blinding +blindingly +blindish +blindless +blindling +blindly +blindness +blindstory +blindweed +blindworm +blink +blinkard +blinked +blinker +blinkered +blinking +blinkingly +blinks +blinky +blinter +blintze +blip +bliss +blissful +blissfully +blissfulness +blissless +blissom +blister +blistered +blistering +blisteringly +blisterweed +blisterwort +blistery +blite +blithe +blithebread +blitheful +blithefully +blithehearted +blithelike +blithely +blithemeat +blithen +blitheness +blither +blithering +blithesome +blithesomely +blithesomeness +blitter +Blitum +blitz +blitzbuggy +blitzkrieg +blizz +blizzard +blizzardly +blizzardous +blizzardy +blo +bloat +bloated +bloatedness +bloater +bloating +blob +blobbed +blobber +blobby +bloc +block +blockade +blockader +blockage +blockbuster +blocked +blocker +blockhead +blockheaded +blockheadedly +blockheadedness +blockheadish +blockheadishness +blockheadism +blockholer +blockhouse +blockiness +blocking +blockish +blockishly +blockishness +blocklayer +blocklike +blockmaker +blockmaking +blockman +blockpate +blockship +blocky +blodite +bloke +blolly +blomstrandine +blonde +blondeness +blondine +blood +bloodalley +bloodalp +bloodbeat +bloodberry +bloodbird +bloodcurdler +bloodcurdling +blooddrop +blooddrops +blooded +bloodfin +bloodflower +bloodguilt +bloodguiltiness +bloodguiltless +bloodguilty +bloodhound +bloodied +bloodily +bloodiness +bloodleaf +bloodless +bloodlessly +bloodlessness +bloodletter +bloodletting +bloodline +bloodmobile +bloodmonger +bloodnoun +bloodripe +bloodripeness +bloodroot +bloodshed +bloodshedder +bloodshedding +bloodshot +bloodshotten +bloodspiller +bloodspilling +bloodstain +bloodstained +bloodstainedness +bloodstanch +bloodstock +bloodstone +bloodstroke +bloodsuck +bloodsucker +bloodsucking +bloodthirst +bloodthirster +bloodthirstily +bloodthirstiness +bloodthirsting +bloodthirsty +bloodweed +bloodwite +bloodwood +bloodworm +bloodwort +bloodworthy +bloody +bloodybones +blooey +bloom +bloomage +bloomer +Bloomeria +bloomerism +bloomers +bloomery +bloomfell +blooming +bloomingly +bloomingness +bloomkin +bloomless +Bloomsburian +Bloomsbury +bloomy +bloop +blooper +blooping +blore +blosmy +blossom +blossombill +blossomed +blossomhead +blossomless +blossomry +blossomtime +blossomy +blot +blotch +blotched +blotchy +blotless +blotter +blottesque +blottesquely +blotting +blottingly +blotto +blotty +bloubiskop +blouse +bloused +blousing +blout +blow +blowback +blowball +blowcock +blowdown +blowen +blower +blowfish +blowfly +blowgun +blowhard +blowhole +blowiness +blowing +blowings +blowiron +blowlamp +blowline +blown +blowoff +blowout +blowpipe +blowpoint +blowproof +blowspray +blowth +blowtorch +blowtube +blowup +blowy +blowze +blowzed +blowzing +blowzy +blub +blubber +blubberer +blubbering +blubberingly +blubberman +blubberous +blubbery +blucher +bludgeon +bludgeoned +bludgeoneer +bludgeoner +blue +blueback +bluebead +Bluebeard +bluebeard +Bluebeardism +bluebell +bluebelled +blueberry +bluebill +bluebird +blueblaw +bluebonnet +bluebook +bluebottle +bluebreast +bluebuck +bluebush +bluebutton +bluecap +bluecoat +bluecup +bluefish +bluegill +bluegown +bluegrass +bluehearted +bluehearts +blueing +bluejack +bluejacket +bluejoint +blueleg +bluelegs +bluely +blueness +bluenose +Bluenoser +blueprint +blueprinter +bluer +blues +bluesides +bluestem +bluestocking +bluestockingish +bluestockingism +bluestone +bluestoner +bluet +bluethroat +bluetongue +bluetop +blueweed +bluewing +bluewood +bluey +bluff +bluffable +bluffer +bluffly +bluffness +bluffy +bluggy +bluing +bluish +bluishness +bluism +Blumea +blunder +blunderbuss +blunderer +blunderful +blunderhead +blunderheaded +blunderheadedness +blundering +blunderingly +blundersome +blunge +blunger +blunk +blunker +blunks +blunnen +blunt +blunter +blunthead +blunthearted +bluntie +bluntish +bluntly +bluntness +blup +blur +blurb +blurbist +blurred +blurredness +blurrer +blurry +blurt +blush +blusher +blushful +blushfully +blushfulness +blushiness +blushing +blushingly +blushless +blushwort +blushy +bluster +blusteration +blusterer +blustering +blusteringly +blusterous +blusterously +blustery +blype +bo +boa +Boaedon +boagane +Boanbura +Boanerges +boanergism +boar +boarcite +board +boardable +boarder +boarding +boardinghouse +boardlike +boardly +boardman +boardwalk +boardy +boarfish +boarhound +boarish +boarishly +boarishness +boarship +boarskin +boarspear +boarstaff +boarwood +boast +boaster +boastful +boastfully +boastfulness +boasting +boastive +boastless +boat +boatable +boatage +boatbill +boatbuilder +boatbuilding +boater +boatfalls +boatful +boathead +boatheader +boathouse +boatie +boating +boatkeeper +boatless +boatlike +boatlip +boatload +boatloader +boatloading +boatly +boatman +boatmanship +boatmaster +boatowner +boatsetter +boatshop +boatside +boatsman +boatswain +boattail +boatward +boatwise +boatwoman +boatwright +Bob +bob +boba +bobac +Bobadil +Bobadilian +Bobadilish +Bobadilism +bobbed +bobber +bobbery +bobbin +bobbiner +bobbinet +bobbing +Bobbinite +bobbinwork +bobbish +bobbishly +bobble +bobby +bobcat +bobcoat +bobeche +bobfly +bobierrite +bobization +bobjerom +bobo +bobolink +bobotie +bobsled +bobsleigh +bobstay +bobtail +bobtailed +bobwhite +bobwood +bocaccio +bocal +bocardo +bocasine +bocca +boccale +boccarella +boccaro +bocce +Bocconia +boce +bocedization +Boche +bocher +Bochism +bock +bockerel +bockeret +bocking +bocoy +bod +bodach +bodacious +bodaciously +bode +bodeful +bodega +bodement +boden +bodenbenderite +boder +bodewash +bodge +bodger +bodgery +bodhi +bodhisattva +bodice +bodiced +bodicemaker +bodicemaking +bodied +bodier +bodieron +bodikin +bodiless +bodilessness +bodiliness +bodily +bodiment +boding +bodingly +bodkin +bodkinwise +bodle +Bodleian +Bodo +bodock +Bodoni +body +bodybending +bodybuilder +bodyguard +bodyhood +bodyless +bodymaker +bodymaking +bodyplate +bodywise +bodywood +bodywork +Boebera +Boedromion +Boehmenism +Boehmenist +Boehmenite +Boehmeria +boeotarch +Boeotian +Boeotic +Boer +Boerdom +Boerhavia +Boethian +Boethusian +bog +boga +bogan +bogard +bogart +bogberry +bogey +bogeyman +boggart +boggin +bogginess +boggish +boggle +bogglebo +boggler +boggy +boghole +bogie +bogieman +bogier +Bogijiab +bogland +boglander +bogle +bogledom +boglet +bogman +bogmire +Bogo +bogo +Bogomil +Bogomile +Bogomilian +bogong +Bogota +bogsucker +bogtrot +bogtrotter +bogtrotting +bogue +bogum +bogus +bogusness +bogway +bogwood +bogwort +bogy +bogydom +bogyism +bogyland +Bohairic +bohawn +bohea +Bohemia +Bohemian +Bohemianism +bohemium +bohereen +bohireen +boho +bohor +bohunk +boid +Boidae +Boii +Boiko +boil +boilable +boildown +boiled +boiler +boilerful +boilerhouse +boilerless +boilermaker +boilermaking +boilerman +boilersmith +boilerworks +boilery +boiling +boilinglike +boilingly +boilover +boily +Bois +boist +boisterous +boisterously +boisterousness +bojite +bojo +bokadam +bokard +bokark +boke +Bokhara +Bokharan +bokom +bola +Bolag +bolar +Bolboxalis +bold +bolden +Bolderian +boldhearted +boldine +boldly +boldness +boldo +Boldu +bole +bolection +bolectioned +boled +boleite +Bolelia +bolelike +bolero +Boletaceae +boletaceous +bolete +Boletus +boleweed +bolewort +bolide +bolimba +bolis +bolivar +bolivarite +bolivia +Bolivian +boliviano +bolk +boll +Bollandist +bollard +bolled +boller +bolling +bollock +bollworm +bolly +Bolo +bolo +Bologna +Bolognan +Bolognese +bolograph +bolographic +bolographically +bolography +Boloism +boloman +bolometer +bolometric +boloney +boloroot +Bolshevik +Bolsheviki +Bolshevikian +Bolshevism +Bolshevist +Bolshevistic +Bolshevistically +Bolshevize +Bolshie +bolson +bolster +bolsterer +bolsterwork +bolt +boltage +boltant +boltcutter +boltel +bolter +bolthead +boltheader +boltheading +bolthole +bolti +bolting +boltless +boltlike +boltmaker +boltmaking +Boltonia +boltonite +boltrope +boltsmith +boltstrake +boltuprightness +boltwork +bolus +Bolyaian +bom +boma +Bomarea +bomb +bombable +Bombacaceae +bombacaceous +bombard +bombarde +bombardelle +bombarder +bombardier +bombardment +bombardon +bombast +bombaster +bombastic +bombastically +bombastry +Bombax +Bombay +bombazet +bombazine +bombed +bomber +bombiccite +Bombidae +bombilate +bombilation +Bombinae +bombinate +bombination +bombo +bombola +bombonne +bombous +bombproof +bombshell +bombsight +Bombus +bombycid +Bombycidae +bombyciform +Bombycilla +Bombycillidae +Bombycina +bombycine +Bombyliidae +Bombyx +Bon +bon +bonaci +bonagh +bonaght +bonair +bonairly +bonairness +bonally +bonang +bonanza +Bonapartean +Bonapartism +Bonapartist +Bonasa +bonasus +bonaventure +Bonaveria +bonavist +Bonbo +bonbon +bonce +bond +bondage +bondager +bondar +bonded +Bondelswarts +bonder +bonderman +bondfolk +bondholder +bondholding +bonding +bondless +bondman +bondmanship +bondsman +bondstone +bondswoman +bonduc +bondwoman +bone +boneache +bonebinder +boneblack +bonebreaker +boned +bonedog +bonefish +boneflower +bonehead +boneheaded +boneless +bonelessly +bonelessness +bonelet +bonelike +Bonellia +boner +boneset +bonesetter +bonesetting +boneshaker +boneshaw +bonetail +bonewood +bonework +bonewort +Boney +bonfire +bong +Bongo +bongo +bonhomie +Boni +boniata +Boniface +bonification +boniform +bonify +boniness +boninite +bonitarian +bonitary +bonito +bonk +bonnaz +bonnet +bonneted +bonneter +bonnethead +bonnetless +bonnetlike +bonnetman +bonnibel +bonnily +bonniness +Bonny +bonny +bonnyclabber +bonnyish +bonnyvis +Bononian +bonsai +bonspiel +bontebok +bontebuck +bontequagga +Bontok +bonus +bonxie +bony +bonyfish +bonze +bonzer +bonzery +bonzian +boo +boob +boobery +boobily +boobook +booby +boobyalla +boobyish +boobyism +bood +boodie +boodle +boodledom +boodleism +boodleize +boodler +boody +boof +booger +boogiewoogie +boohoo +boojum +book +bookable +bookbinder +bookbindery +bookbinding +bookboard +bookcase +bookcraft +bookdealer +bookdom +booked +booker +bookery +bookfold +bookful +bookholder +bookhood +bookie +bookiness +booking +bookish +bookishly +bookishness +bookism +bookkeeper +bookkeeping +bookland +bookless +booklet +booklike +bookling +booklore +booklover +bookmaker +bookmaking +Bookman +bookman +bookmark +bookmarker +bookmate +bookmobile +bookmonger +bookplate +bookpress +bookrack +bookrest +bookroom +bookseller +booksellerish +booksellerism +bookselling +bookshelf +bookshop +bookstack +bookstall +bookstand +bookstore +bookward +bookwards +bookways +bookwise +bookwork +bookworm +bookwright +booky +bool +Boolian +booly +boolya +boom +boomable +boomage +boomah +boomboat +boomdas +boomer +boomerang +booming +boomingly +boomless +boomlet +boomorah +boomslang +boomslange +boomster +boomy +boon +boondock +boondocks +boondoggle +boondoggler +Boone +boonfellow +boongary +boonk +boonless +Boophilus +boopis +boor +boorish +boorishly +boorishness +boort +boose +boost +booster +boosterism +boosy +boot +bootblack +bootboy +booted +bootee +booter +bootery +Bootes +bootful +booth +boother +Boothian +boothite +bootholder +boothose +Bootid +bootied +bootikin +booting +bootjack +bootlace +bootleg +bootlegger +bootlegging +bootless +bootlessly +bootlessness +bootlick +bootlicker +bootmaker +bootmaking +boots +bootstrap +booty +bootyless +booze +boozed +boozer +boozily +booziness +boozy +bop +bopeep +boppist +bopyrid +Bopyridae +bopyridian +Bopyrus +bor +bora +borable +borachio +boracic +boraciferous +boracous +borage +Boraginaceae +boraginaceous +Borago +Borak +borak +boral +Boran +Borana +Borani +borasca +borasque +Borassus +borate +borax +Borboridae +Borborus +borborygmic +borborygmus +bord +bordage +bordar +bordarius +Bordeaux +bordel +bordello +border +bordered +borderer +Borderies +bordering +borderism +borderland +borderlander +borderless +borderline +bordermark +Borderside +bordroom +bordure +bordured +bore +boreable +boread +Boreades +boreal +borealis +borean +Boreas +borecole +boredom +boree +boreen +boregat +borehole +Boreiad +boreism +borele +borer +boresome +Boreus +borg +borgh +borghalpenny +Borghese +borh +boric +borickite +boride +borine +boring +boringly +boringness +Borinqueno +Boris +borish +borism +bority +borize +borlase +born +borne +Bornean +Borneo +borneol +borning +bornite +bornitic +bornyl +Boro +boro +Borocaine +borocalcite +borocarbide +borocitrate +borofluohydric +borofluoric +borofluoride +borofluorin +boroglycerate +boroglyceride +boroglycerine +borolanite +boron +boronatrocalcite +Boronia +boronic +borophenol +borophenylic +Bororo +Bororoan +borosalicylate +borosalicylic +borosilicate +borosilicic +borotungstate +borotungstic +borough +boroughlet +boroughmaster +boroughmonger +boroughmongering +boroughmongery +boroughship +borowolframic +borracha +borrel +Borrelia +Borrelomycetaceae +Borreria +Borrichia +Borromean +Borrovian +borrow +borrowable +borrower +borrowing +borsch +borscht +borsholder +borsht +borstall +bort +bortsch +borty +bortz +Boruca +Borussian +borwort +boryl +Borzicactus +borzoi +Bos +Bosc +boscage +bosch +boschbok +Boschneger +boschvark +boschveld +bose +Boselaphus +boser +bosh +Boshas +bosher +Bosjesman +bosjesman +bosk +bosker +bosket +boskiness +bosky +bosn +Bosniac +Bosniak +Bosnian +Bosnisch +bosom +bosomed +bosomer +bosomy +Bosporan +Bosporanic +Bosporian +bosporus +boss +bossage +bossdom +bossed +bosselated +bosselation +bosser +bosset +bossiness +bossing +bossism +bosslet +bossship +bossy +bostangi +bostanji +bosthoon +Boston +boston +Bostonese +Bostonian +bostonite +bostrychid +Bostrychidae +bostrychoid +bostrychoidal +bostryx +bosun +Boswellia +Boswellian +Boswelliana +Boswellism +Boswellize +bot +bota +botanic +botanical +botanically +botanist +botanize +botanizer +botanomancy +botanophile +botanophilist +botany +botargo +Botaurinae +Botaurus +botch +botched +botchedly +botcher +botcherly +botchery +botchily +botchiness +botchka +botchy +bote +Botein +botella +boterol +botfly +both +bother +botheration +botherer +botherheaded +botherment +bothersome +bothlike +Bothnian +Bothnic +bothrenchyma +Bothriocephalus +Bothriocidaris +Bothriolepis +bothrium +Bothrodendron +bothropic +Bothrops +bothros +bothsided +bothsidedness +bothway +bothy +Botocudo +botonee +botong +Botrychium +Botrydium +Botryllidae +Botryllus +botryogen +botryoid +botryoidal +botryoidally +botryolite +Botryomyces +botryomycoma +botryomycosis +botryomycotic +Botryopteriaceae +botryopterid +Botryopteris +botryose +botryotherapy +Botrytis +bott +bottekin +Botticellian +bottine +bottle +bottlebird +bottled +bottleflower +bottleful +bottlehead +bottleholder +bottlelike +bottlemaker +bottlemaking +bottleman +bottleneck +bottlenest +bottlenose +bottler +bottling +bottom +bottomchrome +bottomed +bottomer +bottoming +bottomless +bottomlessly +bottomlessness +bottommost +bottomry +bottstick +botuliform +botulin +botulinum +botulism +botulismus +bouchal +bouchaleen +boucharde +bouche +boucher +boucherism +boucherize +bouchette +boud +boudoir +bouffancy +bouffant +Bougainvillaea +Bougainvillea +Bougainvillia +Bougainvilliidae +bougar +bouge +bouget +bough +boughed +boughless +boughpot +bought +boughten +boughy +bougie +bouillabaisse +bouillon +bouk +boukit +boulangerite +Boulangism +Boulangist +boulder +boulderhead +bouldering +bouldery +boule +boulevard +boulevardize +boultel +boulter +boulterer +boun +bounce +bounceable +bounceably +bouncer +bouncing +bouncingly +bound +boundable +boundary +bounded +boundedly +boundedness +bounden +bounder +bounding +boundingly +boundless +boundlessly +boundlessness +boundly +boundness +bounteous +bounteously +bounteousness +bountied +bountiful +bountifully +bountifulness +bountith +bountree +bounty +bountyless +bouquet +bourasque +Bourbon +bourbon +Bourbonesque +Bourbonian +Bourbonism +Bourbonist +bourbonize +bourd +bourder +bourdon +bourette +bourg +bourgeois +bourgeoise +bourgeoisie +bourgeoisitic +Bourignian +Bourignianism +Bourignianist +Bourignonism +Bourignonist +bourn +bournless +bournonite +bourock +Bourout +bourse +bourtree +bouse +bouser +Boussingaultia +boussingaultite +boustrophedon +boustrophedonic +bousy +bout +boutade +Bouteloua +bouto +boutonniere +boutylka +Bouvardia +bouw +bovarism +bovarysm +bovate +bovenland +bovicide +boviculture +bovid +Bovidae +boviform +bovine +bovinely +bovinity +Bovista +bovoid +bovovaccination +bovovaccine +bow +bowable +bowback +bowbells +bowbent +bowboy +Bowdichia +bowdlerism +bowdlerization +bowdlerize +bowed +bowedness +bowel +boweled +bowelless +bowellike +bowels +bowenite +bower +bowerbird +bowerlet +bowermaiden +bowermay +bowerwoman +Bowery +bowery +Boweryish +bowet +bowfin +bowgrace +bowhead +bowie +bowieful +bowing +bowingly +bowk +bowkail +bowker +bowknot +bowl +bowla +bowleg +bowlegged +bowleggedness +bowler +bowless +bowlful +bowlike +bowline +bowling +bowllike +bowlmaker +bowls +bowly +bowmaker +bowmaking +bowman +bowpin +bowralite +bowshot +bowsprit +bowstave +bowstring +bowstringed +bowwoman +bowwood +bowwort +bowwow +bowyer +boxberry +boxboard +boxbush +boxcar +boxen +Boxer +boxer +Boxerism +boxfish +boxful +boxhaul +boxhead +boxing +boxkeeper +boxlike +boxmaker +boxmaking +boxman +boxthorn +boxty +boxwallah +boxwood +boxwork +boxy +boy +boyang +boyar +boyard +boyardism +boyardom +boyarism +boycott +boycottage +boycotter +boycottism +boydom +boyer +boyhood +boyish +boyishly +boyishness +boyism +boyla +boylike +boyology +boysenberry +boyship +boza +bozal +bozo +bozze +bra +brab +brabagious +brabant +Brabanter +Brabantine +brabble +brabblement +brabbler +brabblingly +Brabejum +braca +braccate +braccia +bracciale +braccianite +braccio +brace +braced +bracelet +braceleted +bracer +bracero +braces +brach +Brachelytra +brachelytrous +bracherer +brachering +brachet +brachial +brachialgia +brachialis +Brachiata +brachiate +brachiation +brachiator +brachiferous +brachigerous +Brachinus +brachiocephalic +brachiocrural +brachiocubital +brachiocyllosis +brachiofacial +brachiofaciolingual +brachioganoid +Brachioganoidei +brachiolaria +brachiolarian +brachiopod +Brachiopoda +brachiopode +brachiopodist +brachiopodous +brachioradial +brachioradialis +brachiorrhachidian +brachiorrheuma +brachiosaur +Brachiosaurus +brachiostrophosis +brachiotomy +brachistocephali +brachistocephalic +brachistocephalous +brachistocephaly +brachistochrone +brachistochronic +brachistochronous +brachium +brachtmema +brachyaxis +brachycardia +brachycatalectic +brachycephal +brachycephalic +brachycephalism +brachycephalization +brachycephalize +brachycephalous +brachycephaly +Brachycera +brachyceral +brachyceric +brachycerous +brachychronic +brachycnemic +Brachycome +brachycranial +brachydactyl +brachydactylic +brachydactylism +brachydactylous +brachydactyly +brachydiagonal +brachydodrome +brachydodromous +brachydomal +brachydomatic +brachydome +brachydont +brachydontism +brachyfacial +brachyglossal +brachygnathia +brachygnathism +brachygnathous +brachygrapher +brachygraphic +brachygraphical +brachygraphy +brachyhieric +brachylogy +brachymetropia +brachymetropic +Brachyoura +brachyphalangia +Brachyphyllum +brachypinacoid +brachypinacoidal +brachypleural +brachypnea +brachypodine +brachypodous +brachyprism +brachyprosopic +brachypterous +brachypyramid +brachyrrhinia +brachysclereid +brachyskelic +brachysm +brachystaphylic +Brachystegia +brachystochrone +Brachystomata +brachystomatous +brachystomous +brachytic +brachytypous +Brachyura +brachyural +brachyuran +brachyuranic +brachyure +brachyurous +Brachyurus +bracing +bracingly +bracingness +brack +brackebuschite +bracken +brackened +bracker +bracket +bracketing +bracketwise +brackish +brackishness +brackmard +bracky +Bracon +braconid +Braconidae +bract +bractea +bracteal +bracteate +bracted +bracteiform +bracteolate +bracteole +bracteose +bractless +bractlet +brad +bradawl +Bradbury +Bradburya +bradenhead +bradmaker +Bradshaw +bradsot +bradyacousia +bradycardia +bradycauma +bradycinesia +bradycrotic +bradydactylia +bradyesthesia +bradyglossia +bradykinesia +bradykinetic +bradylalia +bradylexia +bradylogia +bradynosus +bradypepsia +bradypeptic +bradyphagia +bradyphasia +bradyphemia +bradyphrasia +bradyphrenia +bradypnea +bradypnoea +bradypod +bradypode +Bradypodidae +bradypodoid +Bradypus +bradyseism +bradyseismal +bradyseismic +bradyseismical +bradyseismism +bradyspermatism +bradysphygmia +bradystalsis +bradyteleocinesia +bradyteleokinesis +bradytocia +bradytrophic +bradyuria +brae +braeface +braehead +braeman +braeside +brag +braggardism +braggart +braggartism +braggartly +braggartry +braggat +bragger +braggery +bragget +bragging +braggingly +braggish +braggishly +Bragi +bragite +bragless +braguette +Brahm +Brahma +brahmachari +Brahmahood +Brahmaic +Brahman +Brahmana +Brahmanaspati +Brahmanda +Brahmaness +Brahmanhood +Brahmani +Brahmanic +Brahmanical +Brahmanism +Brahmanist +Brahmanistic +Brahmanize +Brahmany +Brahmi +Brahmic +Brahmin +Brahminic +Brahminism +Brahmoism +Brahmsian +Brahmsite +Brahui +braid +braided +braider +braiding +Braidism +Braidist +brail +Braille +Braillist +brain +brainache +braincap +braincraft +brainer +brainfag +brainge +braininess +brainless +brainlessly +brainlessness +brainlike +brainpan +brains +brainsick +brainsickly +brainsickness +brainstone +brainward +brainwash +brainwasher +brainwashing +brainwater +brainwood +brainwork +brainworker +brainy +braird +braireau +brairo +braise +brake +brakeage +brakehand +brakehead +brakeless +brakeload +brakemaker +brakemaking +brakeman +braker +brakeroot +brakesman +brakie +braky +Bram +Bramantesque +Bramantip +bramble +brambleberry +bramblebush +brambled +brambling +brambly +brambrack +Bramia +bran +brancard +branch +branchage +branched +Branchellion +brancher +branchery +branchful +branchi +branchia +branchiae +branchial +Branchiata +branchiate +branchicolous +branchiferous +branchiform +branchihyal +branchiness +branching +Branchiobdella +branchiocardiac +branchiogenous +branchiomere +branchiomeric +branchiomerism +branchiopallial +branchiopod +Branchiopoda +branchiopodan +branchiopodous +Branchiopulmonata +branchiopulmonate +branchiosaur +Branchiosauria +branchiosaurian +Branchiosaurus +branchiostegal +Branchiostegidae +branchiostegite +branchiostegous +Branchiostoma +branchiostomid +Branchiostomidae +Branchipodidae +Branchipus +branchireme +Branchiura +branchiurous +branchless +branchlet +branchlike +branchling +branchman +branchstand +branchway +branchy +brand +branded +Brandenburg +Brandenburger +brander +brandering +brandied +brandify +brandise +brandish +brandisher +brandisite +brandless +brandling +brandreth +brandy +brandyball +brandyman +brandywine +brangle +brangled +branglement +brangler +brangling +branial +brank +brankie +brankursine +branle +branner +brannerite +branny +bransle +bransolder +brant +Branta +brantail +brantness +Brasenia +brash +brashiness +brashness +brashy +brasiletto +brasque +brass +brassage +brassard +brassart +Brassavola +brassbound +brassbounder +brasse +brasser +brasset +Brassia +brassic +Brassica +Brassicaceae +brassicaceous +brassidic +brassie +brassiere +brassily +brassiness +brassish +brasslike +brassware +brasswork +brassworker +brassworks +brassy +brassylic +brat +bratling +bratstvo +brattach +brattice +bratticer +bratticing +brattie +brattish +brattishing +brattle +brauna +Brauneberger +Brauneria +braunite +Brauronia +Brauronian +Brava +bravade +bravado +bravadoism +brave +bravehearted +bravely +braveness +braver +bravery +braving +bravish +bravo +bravoite +bravura +bravuraish +braw +brawl +brawler +brawling +brawlingly +brawlsome +brawly +brawlys +brawn +brawned +brawnedness +brawner +brawnily +brawniness +brawny +braws +braxy +bray +brayer +brayera +brayerin +braystone +braza +braze +brazen +brazenface +brazenfaced +brazenfacedly +brazenly +brazenness +brazer +brazera +brazier +braziery +brazil +brazilein +brazilette +Brazilian +brazilin +brazilite +brazilwood +breach +breacher +breachful +breachy +bread +breadbasket +breadberry +breadboard +breadbox +breadearner +breadearning +breaden +breadfruit +breadless +breadlessness +breadmaker +breadmaking +breadman +breadnut +breadroot +breadseller +breadstuff +breadth +breadthen +breadthless +breadthriders +breadthways +breadthwise +breadwinner +breadwinning +breaghe +break +breakable +breakableness +breakably +breakage +breakaway +breakax +breakback +breakbones +breakdown +breaker +breakerman +breakfast +breakfaster +breakfastless +breaking +breakless +breakneck +breakoff +breakout +breakover +breakshugh +breakstone +breakthrough +breakup +breakwater +breakwind +bream +breards +breast +breastband +breastbeam +breastbone +breasted +breaster +breastfeeding +breastful +breastheight +breasthook +breastie +breasting +breastless +breastmark +breastpiece +breastpin +breastplate +breastplow +breastrail +breastrope +breastsummer +breastweed +breastwise +breastwood +breastwork +breath +breathable +breathableness +breathe +breathed +breather +breathful +breathiness +breathing +breathingly +breathless +breathlessly +breathlessness +breathseller +breathy +breba +breccia +breccial +brecciated +brecciation +brecham +Brechites +breck +brecken +bred +bredbergite +brede +bredi +bree +breech +breechblock +breechcloth +breechclout +breeched +breeches +breechesflower +breechesless +breeching +breechless +breechloader +breed +breedable +breedbate +breeder +breediness +breeding +breedy +breek +breekless +breekums +breeze +breezeful +breezeless +breezelike +breezeway +breezily +breeziness +breezy +bregma +bregmata +bregmate +bregmatic +brehon +brehonship +brei +breislakite +breithauptite +brekkle +brelaw +breloque +breme +bremely +bremeness +Bremia +bremsstrahlung +brennage +brent +Brenthis +brephic +Brescian +bret +bretelle +bretesse +breth +brethren +Breton +Bretonian +Bretschneideraceae +brett +brettice +Bretwalda +Bretwaldadom +Bretwaldaship +breunnerite +breva +breve +brevet +brevetcy +breviary +breviate +breviature +brevicaudate +brevicipitid +Brevicipitidae +breviconic +brevier +brevifoliate +breviger +brevilingual +breviloquence +breviloquent +breviped +brevipen +brevipennate +breviradiate +brevirostral +brevirostrate +Brevirostrines +brevit +brevity +brew +brewage +brewer +brewership +brewery +brewhouse +brewing +brewis +brewmaster +brewst +brewster +brewsterite +brey +Brian +briar +briarberry +Briard +Briarean +Briareus +briarroot +bribe +bribee +bribegiver +bribegiving +bribemonger +briber +bribery +bribetaker +bribetaking +bribeworthy +Bribri +brichen +brichette +brick +brickbat +brickcroft +brickel +bricken +brickfield +brickfielder +brickhood +bricking +brickish +brickkiln +bricklayer +bricklaying +brickle +brickleness +bricklike +brickliner +bricklining +brickly +brickmaker +brickmaking +brickmason +brickset +bricksetter +bricktimber +brickwise +brickwork +bricky +brickyard +bricole +bridal +bridale +bridaler +bridally +Bride +bride +bridebed +bridebowl +bridecake +bridechamber +bridecup +bridegod +bridegroom +bridegroomship +bridehead +bridehood +brideknot +bridelace +brideless +bridelike +bridely +bridemaid +bridemaiden +bridemaidship +brideship +bridesmaid +bridesmaiding +bridesman +bridestake +bridewain +brideweed +bridewell +bridewort +bridge +bridgeable +bridgeboard +bridgebote +bridgebuilder +bridgebuilding +bridged +bridgehead +bridgekeeper +bridgeless +bridgelike +bridgemaker +bridgemaking +bridgeman +bridgemaster +bridgepot +Bridger +bridger +Bridget +bridgetree +bridgeward +bridgewards +bridgeway +bridgework +bridging +bridle +bridled +bridleless +bridleman +bridler +bridling +bridoon +brief +briefing +briefless +brieflessly +brieflessness +briefly +briefness +briefs +brier +brierberry +briered +brierroot +brierwood +briery +brieve +brig +brigade +brigadier +brigadiership +brigalow +brigand +brigandage +brigander +brigandine +brigandish +brigandishly +brigandism +Brigantes +Brigantia +brigantine +brigatry +brigbote +brigetty +Briggsian +Brighella +Brighid +bright +brighten +brightener +brightening +Brighteyes +brighteyes +brightish +brightly +brightness +brightsmith +brightsome +brightsomeness +brightwork +Brigid +Brigittine +brill +brilliance +brilliancy +brilliandeer +brilliant +brilliantine +brilliantly +brilliantness +brilliantwise +brilliolette +brillolette +brills +brim +brimborion +brimborium +brimful +brimfully +brimfulness +briming +brimless +brimmed +brimmer +brimming +brimmingly +brimstone +brimstonewort +brimstony +brin +brindlish +brine +brinehouse +brineless +brineman +briner +bring +bringal +bringall +bringer +brininess +brinish +brinishness +brinjal +brinjarry +brink +brinkless +briny +brioche +briolette +brique +briquette +brisk +brisken +brisket +briskish +briskly +briskness +brisling +brisque +briss +Brissotin +Brissotine +bristle +bristlebird +bristlecone +bristled +bristleless +bristlelike +bristler +bristletail +bristlewort +bristliness +bristly +Bristol +brisure +brit +Britain +Britannia +Britannian +Britannic +Britannically +britchka +brith +brither +Briticism +British +Britisher +Britishhood +Britishism +Britishly +Britishness +Briton +Britoness +britska +Brittany +britten +brittle +brittlebush +brittlely +brittleness +brittlestem +brittlewood +brittlewort +brittling +Briza +brizz +broach +broacher +broad +broadacre +broadax +broadbill +Broadbrim +broadbrim +broadcast +broadcaster +broadcloth +broaden +broadhead +broadhearted +broadhorn +broadish +broadleaf +broadloom +broadly +broadmouth +broadness +broadpiece +broadshare +broadsheet +broadside +broadspread +broadsword +broadtail +broadthroat +Broadway +broadway +Broadwayite +broadways +broadwife +broadwise +brob +Brobdingnag +Brobdingnagian +brocade +brocaded +brocard +brocardic +brocatel +brocatello +broccoli +broch +brochan +brochant +brochantite +broche +brochette +brochidodromous +brocho +brochure +brock +brockage +brocked +brocket +brockle +brod +brodder +brodeglass +brodequin +broderer +Brodiaea +brog +brogan +brogger +broggerite +broggle +brogue +brogueful +brogueneer +broguer +broguery +broguish +broider +broiderer +broideress +broidery +broigne +broil +broiler +broiling +broilingly +brokage +broke +broken +brokenhearted +brokenheartedly +brokenheartedness +brokenly +brokenness +broker +brokerage +brokeress +brokership +broking +brolga +broll +brolly +broma +bromacetanilide +bromacetate +bromacetic +bromacetone +bromal +bromalbumin +bromamide +bromargyrite +bromate +bromaurate +bromauric +brombenzamide +brombenzene +brombenzyl +bromcamphor +bromcresol +brome +bromeigon +Bromeikon +bromeikon +Bromelia +Bromeliaceae +bromeliaceous +bromeliad +bromelin +bromellite +bromethyl +bromethylene +bromgelatin +bromhidrosis +bromhydrate +bromhydric +Bromian +bromic +bromide +bromidic +bromidically +bromidrosis +brominate +bromination +bromindigo +bromine +brominism +brominize +bromiodide +Bromios +bromism +bromite +Bromius +bromization +bromize +bromizer +bromlite +bromoacetone +bromoaurate +bromoauric +bromobenzene +bromobenzyl +bromocamphor +bromochlorophenol +bromocresol +bromocyanidation +bromocyanide +bromocyanogen +bromoethylene +bromoform +bromogelatin +bromohydrate +bromohydrin +bromoil +bromoiodide +bromoiodism +bromoiodized +bromoketone +bromol +bromomania +bromomenorrhea +bromomethane +bromometric +bromometrical +bromometrically +bromometry +bromonaphthalene +bromophenol +bromopicrin +bromopnea +bromoprotein +bromothymol +bromous +bromphenol +brompicrin +bromthymol +bromuret +Bromus +bromvogel +bromyrite +bronc +bronchadenitis +bronchi +bronchia +bronchial +bronchially +bronchiarctia +bronchiectasis +bronchiectatic +bronchiloquy +bronchiocele +bronchiocrisis +bronchiogenic +bronchiolar +bronchiole +bronchioli +bronchiolitis +bronchiolus +bronchiospasm +bronchiostenosis +bronchitic +bronchitis +bronchium +bronchoadenitis +bronchoalveolar +bronchoaspergillosis +bronchoblennorrhea +bronchocavernous +bronchocele +bronchocephalitis +bronchoconstriction +bronchoconstrictor +bronchodilatation +bronchodilator +bronchoegophony +bronchoesophagoscopy +bronchogenic +bronchohemorrhagia +broncholemmitis +broncholith +broncholithiasis +bronchomotor +bronchomucormycosis +bronchomycosis +bronchopathy +bronchophonic +bronchophony +bronchophthisis +bronchoplasty +bronchoplegia +bronchopleurisy +bronchopneumonia +bronchopneumonic +bronchopulmonary +bronchorrhagia +bronchorrhaphy +bronchorrhea +bronchoscope +bronchoscopic +bronchoscopist +bronchoscopy +bronchospasm +bronchostenosis +bronchostomy +bronchotetany +bronchotome +bronchotomist +bronchotomy +bronchotracheal +bronchotyphoid +bronchotyphus +bronchovesicular +bronchus +bronco +broncobuster +brongniardite +bronk +Bronteana +bronteon +brontephobia +Brontesque +bronteum +brontide +brontogram +brontograph +brontolite +brontology +brontometer +brontophobia +Brontops +Brontosaurus +brontoscopy +Brontotherium +Brontozoum +Bronx +bronze +bronzed +bronzelike +bronzen +bronzer +bronzesmith +bronzewing +bronzify +bronzine +bronzing +bronzite +bronzitite +bronzy +broo +brooch +brood +brooder +broodiness +brooding +broodingly +broodless +broodlet +broodling +broody +brook +brookable +brooked +brookflower +brookie +brookite +brookless +brooklet +brooklike +brooklime +Brooklynite +brookside +brookweed +brooky +brool +broom +broombush +broomcorn +broomer +broommaker +broommaking +broomrape +broomroot +broomshank +broomstaff +broomstick +broomstraw +broomtail +broomweed +broomwood +broomwort +broomy +broon +broose +broozled +brose +Brosimum +brosot +brosy +brot +brotan +brotany +broth +brothel +brotheler +brothellike +brothelry +brother +brotherhood +brotherless +brotherlike +brotherliness +brotherly +brothership +Brotherton +brotherwort +brothy +brotocrystal +Brotula +brotulid +Brotulidae +brotuliform +brough +brougham +brought +Broussonetia +brow +browache +Browallia +browallia +browband +browbeat +browbeater +browbound +browden +browed +browis +browless +browman +brown +brownback +browner +Brownian +brownie +browniness +browning +Browningesque +brownish +Brownism +Brownist +Brownistic +Brownistical +brownly +brownness +brownout +brownstone +browntail +browntop +brownweed +brownwort +browny +browpiece +browpost +browse +browser +browsick +browsing +browst +bruang +Brucella +brucellosis +Bruchidae +Bruchus +brucia +brucina +brucine +brucite +bruckle +bruckled +bruckleness +Bructeri +brugh +brugnatellite +bruin +bruise +bruiser +bruisewort +bruising +bruit +bruiter +bruke +Brule +brulee +brulyie +brulyiement +brumal +Brumalia +brumby +brume +Brummagem +brummagem +brumous +brumstane +brumstone +brunch +Brunella +Brunellia +Brunelliaceae +brunelliaceous +brunet +brunetness +brunette +brunetteness +Brunfelsia +brunissure +Brunistic +brunneous +Brunnichia +Bruno +Brunonia +Brunoniaceae +Brunonian +Brunonism +Brunswick +brunswick +brunt +bruscus +brush +brushable +brushball +brushbird +brushbush +brushed +brusher +brushes +brushet +brushful +brushiness +brushing +brushite +brushland +brushless +brushlessness +brushlet +brushlike +brushmaker +brushmaking +brushman +brushoff +brushproof +brushwood +brushwork +brushy +brusque +brusquely +brusqueness +Brussels +brustle +brut +Bruta +brutage +brutal +brutalism +brutalist +brutalitarian +brutality +brutalization +brutalize +brutally +brute +brutedom +brutelike +brutely +bruteness +brutification +brutify +bruting +brutish +brutishly +brutishness +brutism +brutter +Brutus +bruzz +Bryaceae +bryaceous +Bryales +Bryanism +Bryanite +Bryanthus +bryogenin +bryological +bryologist +bryology +Bryonia +bryonidin +bryonin +bryony +Bryophyllum +Bryophyta +bryophyte +bryophytic +Bryozoa +bryozoan +bryozoon +bryozoum +Brython +Brythonic +Bryum +Bu +bu +bual +buaze +bub +buba +bubal +bubaline +Bubalis +bubalis +Bubastid +Bubastite +bubble +bubbleless +bubblement +bubbler +bubbling +bubblingly +bubblish +bubbly +bubby +bubbybush +Bube +bubinga +Bubo +bubo +buboed +bubonalgia +bubonic +Bubonidae +bubonocele +bubukle +bucare +bucca +buccal +buccally +buccan +buccaneer +buccaneerish +buccate +Buccellarius +buccina +buccinal +buccinator +buccinatory +Buccinidae +bucciniform +buccinoid +Buccinum +Bucco +buccobranchial +buccocervical +buccogingival +buccolabial +buccolingual +bucconasal +Bucconidae +Bucconinae +buccopharyngeal +buccula +Bucculatrix +bucentaur +Bucephala +Bucephalus +Buceros +Bucerotes +Bucerotidae +Bucerotinae +Buchanan +Buchanite +buchite +Buchloe +Buchmanism +Buchmanite +Buchnera +buchnerite +buchonite +buchu +buck +buckaroo +buckberry +buckboard +buckbrush +buckbush +bucked +buckeen +bucker +bucket +bucketer +bucketful +bucketing +bucketmaker +bucketmaking +bucketman +buckety +buckeye +buckhorn +buckhound +buckie +bucking +buckish +buckishly +buckishness +buckjump +buckjumper +bucklandite +buckle +buckled +buckleless +buckler +Buckleya +buckling +bucklum +bucko +buckplate +buckpot +buckra +buckram +bucksaw +buckshee +buckshot +buckskin +buckskinned +buckstall +buckstay +buckstone +bucktail +buckthorn +bucktooth +buckwagon +buckwash +buckwasher +buckwashing +buckwheat +buckwheater +buckwheatlike +bucky +bucoliast +bucolic +bucolical +bucolically +bucolicism +Bucorvinae +Bucorvus +bucrane +bucranium +bud +buda +buddage +budder +Buddh +Buddha +Buddhahood +Buddhaship +buddhi +Buddhic +Buddhism +Buddhist +Buddhistic +Buddhistical +Buddhology +budding +buddle +Buddleia +buddleman +buddler +buddy +budge +budger +budgeree +budgereegah +budgerigar +budgerow +budget +budgetary +budgeteer +budgeter +budgetful +Budh +budless +budlet +budlike +budmash +Budorcas +budtime +Budukha +Buduma +budwood +budworm +budzat +Buettneria +Buettneriaceae +bufagin +buff +buffable +buffalo +buffaloback +buffball +buffcoat +buffed +buffer +buffet +buffeter +buffing +buffle +bufflehead +bufflehorn +buffont +buffoon +buffoonery +buffoonesque +buffoonish +buffoonism +buffware +buffy +bufidin +bufo +Bufonidae +bufonite +bufotalin +bug +bugaboo +bugan +bugbane +bugbear +bugbeardom +bugbearish +bugbite +bugdom +bugfish +bugger +buggery +bugginess +buggy +buggyman +bughead +bughouse +Bugi +Buginese +Buginvillaea +bugle +bugled +bugler +buglet +bugleweed +buglewort +bugloss +bugologist +bugology +bugproof +bugre +bugseed +bugweed +bugwort +buhl +buhr +buhrstone +build +buildable +builder +building +buildingless +buildress +buildup +built +buirdly +buisson +buist +Bukat +Bukeyef +bukh +Bukidnon +bukshi +bulak +Bulanda +bulb +bulbaceous +bulbar +bulbed +bulbiferous +bulbiform +bulbil +Bulbilis +bulbilla +bulbless +bulblet +bulblike +bulbocapnin +bulbocapnine +bulbocavernosus +bulbocavernous +Bulbochaete +Bulbocodium +bulbomedullary +bulbomembranous +bulbonuclear +Bulbophyllum +bulborectal +bulbose +bulbospinal +bulbotuber +bulbous +bulbul +bulbule +bulby +bulchin +Bulgar +Bulgari +Bulgarian +Bulgaric +Bulgarophil +bulge +bulger +bulginess +bulgy +bulimia +bulimiac +bulimic +bulimiform +bulimoid +Bulimulidae +Bulimus +bulimy +bulk +bulked +bulker +bulkhead +bulkheaded +bulkily +bulkiness +bulkish +bulky +bull +bulla +bullace +bullamacow +bullan +bullary +bullate +bullated +bullation +bullback +bullbaiting +bullbat +bullbeggar +bullberry +bullbird +bullboat +bullcart +bullcomber +bulldog +bulldogged +bulldoggedness +bulldoggy +bulldogism +bulldoze +bulldozer +buller +bullet +bulleted +bullethead +bulletheaded +bulletheadedness +bulletin +bulletless +bulletlike +bulletmaker +bulletmaking +bulletproof +bulletwood +bullety +bullfeast +bullfight +bullfighter +bullfighting +bullfinch +bullfist +bullflower +bullfoot +bullfrog +bullhead +bullheaded +bullheadedly +bullheadedness +bullhide +bullhoof +bullhorn +Bullidae +bulliform +bullimong +bulling +bullion +bullionism +bullionist +bullionless +bullish +bullishly +bullishness +bullism +bullit +bullneck +bullnose +bullnut +bullock +bullocker +Bullockite +bullockman +bullocky +Bullom +bullous +bullpates +bullpoll +bullpout +bullskin +bullsticker +bullsucker +bullswool +bulltoad +bullule +bullweed +bullwhack +bullwhacker +bullwhip +bullwort +bully +bullyable +bullydom +bullyhuff +bullying +bullyism +bullyrag +bullyragger +bullyragging +bullyrook +bulrush +bulrushlike +bulrushy +bulse +bult +bulter +bultey +bultong +bultow +bulwand +bulwark +bum +bumbailiff +bumbailiffship +bumbarge +bumbaste +bumbaze +bumbee +bumbershoot +bumble +bumblebee +bumbleberry +Bumbledom +bumblefoot +bumblekite +bumblepuppy +bumbler +bumbo +bumboat +bumboatman +bumboatwoman +bumclock +Bumelia +bumicky +bummalo +bummaree +bummed +bummer +bummerish +bummie +bumming +bummler +bummock +bump +bumpee +bumper +bumperette +bumpily +bumpiness +bumping +bumpingly +bumpkin +bumpkinet +bumpkinish +bumpkinly +bumpology +bumptious +bumptiously +bumptiousness +bumpy +bumtrap +bumwood +bun +Buna +buna +buncal +bunce +bunch +bunchberry +buncher +bunchflower +bunchily +bunchiness +bunchy +buncombe +bund +Bunda +Bundahish +Bundeli +bunder +Bundestag +bundle +bundler +bundlerooted +bundlet +bundobust +bundook +Bundu +bundweed +bundy +bunemost +bung +Bunga +bungaloid +bungalow +bungarum +Bungarus +bungee +bungerly +bungey +bungfu +bungfull +bunghole +bungle +bungler +bunglesome +bungling +bunglingly +bungmaker +bungo +bungwall +bungy +Buninahua +bunion +bunk +bunker +bunkerman +bunkery +bunkhouse +bunkie +bunkload +bunko +bunkum +bunnell +bunny +bunnymouth +bunodont +Bunodonta +bunolophodont +Bunomastodontidae +bunoselenodont +bunsenite +bunt +buntal +bunted +Bunter +bunter +bunting +buntline +bunton +bunty +bunya +bunyah +bunyip +Bunyoro +buoy +buoyage +buoyance +buoyancy +buoyant +buoyantly +buoyantness +Buphaga +buphthalmia +buphthalmic +Buphthalmum +bupleurol +Bupleurum +buplever +buprestid +Buprestidae +buprestidan +Buprestis +bur +buran +burao +Burbank +burbank +burbankian +Burbankism +burbark +Burberry +burble +burbler +burbly +burbot +burbush +burd +burdalone +burden +burdener +burdenless +burdenous +burdensome +burdensomely +burdensomeness +burdie +Burdigalian +burdock +burdon +bure +bureau +bureaucracy +bureaucrat +bureaucratic +bureaucratical +bureaucratically +bureaucratism +bureaucratist +bureaucratization +bureaucratize +bureaux +burel +burele +buret +burette +burfish +burg +burgage +burgality +burgall +burgee +burgensic +burgeon +burgess +burgessdom +burggrave +burgh +burghal +burghalpenny +burghbote +burghemot +burgher +burgherage +burgherdom +burgheress +burgherhood +burghermaster +burghership +burghmaster +burghmoot +burglar +burglarious +burglariously +burglarize +burglarproof +burglary +burgle +burgomaster +burgomastership +burgonet +burgoo +burgoyne +burgrave +burgraviate +burgul +Burgundian +Burgundy +burgus +burgware +burhead +Burhinidae +Burhinus +Buri +buri +burial +burian +Buriat +buried +burier +burin +burinist +burion +buriti +burka +burke +burker +burkundaz +burl +burlap +burled +burler +burlesque +burlesquely +burlesquer +burlet +burletta +Burley +burlily +burliness +Burlington +burly +Burman +Burmannia +Burmanniaceae +burmanniaceous +Burmese +burmite +burn +burnable +burnbeat +burned +burner +burnet +burnetize +burnfire +burnie +burniebee +burning +burningly +burnish +burnishable +burnisher +burnishing +burnishment +burnoose +burnoosed +burnous +burnout +burnover +Burnsian +burnside +burnsides +burnt +burntweed +burnut +burnwood +burny +buro +burp +burr +burrah +burrawang +burred +burrel +burrer +burrgrailer +burring +burrish +burrito +burrknot +burro +burrobrush +burrow +burroweed +burrower +burrowstown +burry +bursa +bursal +bursar +bursarial +bursarship +bursary +bursate +bursattee +bursautee +burse +burseed +Bursera +Burseraceae +Burseraceous +bursicle +bursiculate +bursiform +bursitis +burst +burster +burstwort +burt +burthenman +burton +burtonization +burtonize +burucha +Burushaski +Burut +burweed +bury +burying +bus +Busaos +busby +buscarl +buscarle +bush +bushbeater +bushbuck +bushcraft +bushed +bushel +busheler +bushelful +bushelman +bushelwoman +busher +bushfighter +bushfighting +bushful +bushhammer +bushi +bushily +bushiness +bushing +bushland +bushless +bushlet +bushlike +bushmaker +bushmaking +Bushman +bushmanship +bushmaster +bushment +Bushongo +bushranger +bushranging +bushrope +bushveld +bushwa +bushwhack +bushwhacker +bushwhacking +bushwife +bushwoman +bushwood +bushy +busied +busily +busine +business +businesslike +businesslikeness +businessman +businesswoman +busk +busked +busker +busket +buskin +buskined +buskle +busky +busman +buss +busser +bussock +bussu +bust +bustard +busted +bustee +buster +busthead +bustic +busticate +bustle +bustled +bustler +bustling +bustlingly +busy +busybodied +busybody +busybodyish +busybodyism +busybodyness +Busycon +busyhead +busying +busyish +busyness +busywork +but +butadiene +butadiyne +butanal +butane +butanoic +butanol +butanolid +butanolide +butanone +butch +butcher +butcherbird +butcherdom +butcherer +butcheress +butchering +butcherless +butcherliness +butcherly +butcherous +butchery +Bute +Butea +butein +butene +butenyl +Buteo +buteonine +butic +butine +butler +butlerage +butlerdom +butleress +butlerism +butlerlike +butlership +butlery +butment +Butomaceae +butomaceous +Butomus +butoxy +butoxyl +Butsu +butt +butte +butter +butteraceous +butterback +butterball +butterbill +butterbird +butterbox +butterbump +butterbur +butterbush +buttercup +buttered +butterfat +butterfingered +butterfingers +butterfish +butterflower +butterfly +butterflylike +butterhead +butterine +butteriness +butteris +butterjags +butterless +butterlike +buttermaker +buttermaking +butterman +buttermilk +buttermonger +buttermouth +butternose +butternut +butterroot +butterscotch +butterweed +butterwife +butterwoman +butterworker +butterwort +butterwright +buttery +butteryfingered +buttgenbachite +butting +buttinsky +buttle +buttock +buttocked +buttocker +button +buttonball +buttonbur +buttonbush +buttoned +buttoner +buttonhold +buttonholder +buttonhole +buttonholer +buttonhook +buttonless +buttonlike +buttonmold +buttons +buttonweed +buttonwood +buttony +buttress +buttressless +buttresslike +buttstock +buttwoman +buttwood +butty +buttyman +butyl +butylamine +butylation +butylene +butylic +Butyn +butyne +butyr +butyraceous +butyral +butyraldehyde +butyrate +butyric +butyrically +butyrin +butyrinase +butyrochloral +butyrolactone +butyrometer +butyrometric +butyrone +butyrous +butyrousness +butyryl +Buxaceae +buxaceous +Buxbaumia +Buxbaumiaceae +buxerry +buxom +buxomly +buxomness +Buxus +buy +buyable +buyer +Buyides +buzane +buzylene +buzz +buzzard +buzzardlike +buzzardly +buzzer +buzzerphone +buzzgloak +buzzies +buzzing +buzzingly +buzzle +buzzwig +buzzy +by +Byblidaceae +Byblis +bycoket +bye +byee +byegaein +byeman +byepath +byerite +byerlite +byestreet +byeworker +byeworkman +bygane +byganging +bygo +bygoing +bygone +byhand +bylaw +bylawman +byname +bynedestin +Bynin +byon +byordinar +byordinary +byous +byously +bypass +bypasser +bypast +bypath +byplay +byre +byreman +byrewards +byrewoman +byrlaw +byrlawman +byrnie +byroad +Byronesque +Byronian +Byroniana +Byronic +Byronically +Byronics +Byronish +Byronism +Byronist +Byronite +Byronize +byrrus +Byrsonima +byrthynsak +Bysacki +bysen +bysmalith +byspell +byssaceous +byssal +byssiferous +byssin +byssine +byssinosis +byssogenous +byssoid +byssolite +byssus +bystander +bystreet +byth +bytime +bytownite +bytownitite +bywalk +bywalker +byway +bywoner +byword +bywork +Byzantian +Byzantine +Byzantinesque +Byzantinism +Byzantinize +C +c +ca +caam +caama +caaming +caapeba +caatinga +cab +caba +cabaan +caback +cabaho +cabal +cabala +cabalassou +cabaletta +cabalic +cabalism +cabalist +cabalistic +cabalistical +cabalistically +caballer +caballine +caban +cabana +cabaret +cabas +cabasset +cabassou +cabbage +cabbagehead +cabbagewood +cabbagy +cabber +cabble +cabbler +cabby +cabda +cabdriver +cabdriving +cabellerote +caber +cabernet +cabestro +cabezon +cabilliau +cabin +Cabinda +cabinet +cabinetmaker +cabinetmaking +cabinetry +cabinetwork +cabinetworker +cabinetworking +cabio +Cabirean +Cabiri +Cabiria +Cabirian +Cabiric +Cabiritic +cable +cabled +cablegram +cableless +cablelike +cableman +cabler +cablet +cableway +cabling +cabman +cabob +caboceer +cabochon +cabocle +Cabomba +Cabombaceae +caboodle +cabook +caboose +caboshed +cabot +cabotage +cabree +cabrerite +cabreuva +cabrilla +cabriole +cabriolet +cabrit +cabstand +cabureiba +cabuya +Caca +Cacajao +Cacalia +cacam +Cacan +Cacana +cacanthrax +cacao +Cacara +Cacatua +Cacatuidae +Cacatuinae +Caccabis +cacesthesia +cacesthesis +cachalot +cachaza +cache +cachectic +cachemia +cachemic +cachet +cachexia +cachexic +cachexy +cachibou +cachinnate +cachinnation +cachinnator +cachinnatory +cacholong +cachou +cachrys +cachucha +cachunde +Cacicus +cacidrosis +caciocavallo +cacique +caciqueship +caciquism +cack +cackerel +cackle +cackler +cacocholia +cacochroia +cacochylia +cacochymia +cacochymic +cacochymical +cacochymy +cacocnemia +cacodaemoniac +cacodaemonial +cacodaemonic +cacodemon +cacodemonia +cacodemoniac +cacodemonial +cacodemonic +cacodemonize +cacodemonomania +cacodontia +cacodorous +cacodoxian +cacodoxical +cacodoxy +cacodyl +cacodylate +cacodylic +cacoeconomy +cacoepist +cacoepistic +cacoepy +cacoethes +cacoethic +cacogalactia +cacogastric +cacogenesis +cacogenic +cacogenics +cacogeusia +cacoglossia +cacographer +cacographic +cacographical +cacography +cacology +cacomagician +cacomelia +cacomistle +cacomixl +cacomixle +cacomorphia +cacomorphosis +caconychia +caconym +caconymic +cacoon +cacopathy +cacopharyngia +cacophonia +cacophonic +cacophonical +cacophonically +cacophonist +cacophonize +cacophonous +cacophonously +cacophony +cacophthalmia +cacoplasia +cacoplastic +cacoproctia +cacorhythmic +cacorrhachis +cacorrhinia +cacosmia +cacospermia +cacosplanchnia +cacostomia +cacothansia +cacotheline +cacothesis +cacothymia +cacotrichia +cacotrophia +cacotrophic +cacotrophy +cacotype +cacoxene +cacoxenite +cacozeal +cacozealous +cacozyme +Cactaceae +cactaceous +Cactales +cacti +cactiform +cactoid +Cactus +cacuminal +cacuminate +cacumination +cacuminous +cacur +cad +cadalene +cadamba +cadastral +cadastration +cadastre +cadaver +cadaveric +cadaverine +cadaverize +cadaverous +cadaverously +cadaverousness +cadbait +cadbit +cadbote +caddice +caddiced +Caddie +caddie +caddis +caddised +caddish +caddishly +caddishness +caddle +Caddo +Caddoan +caddow +caddy +cade +cadelle +cadence +cadenced +cadency +cadent +cadential +cadenza +cader +caderas +Cadet +cadet +cadetcy +cadetship +cadette +cadew +cadge +cadger +cadgily +cadginess +cadgy +cadi +cadilesker +cadinene +cadism +cadiueio +cadjan +cadlock +Cadmean +cadmia +cadmic +cadmide +cadmiferous +cadmium +cadmiumize +Cadmopone +Cadmus +cados +cadrans +cadre +cadua +caduac +caduca +caducary +caducean +caduceus +caduciary +caducibranch +Caducibranchiata +caducibranchiate +caducicorn +caducity +caducous +cadus +Cadwal +Cadwallader +cadweed +caeca +caecal +caecally +caecectomy +caeciform +Caecilia +Caeciliae +caecilian +Caeciliidae +caecitis +caecocolic +caecostomy +caecotomy +caecum +Caedmonian +Caedmonic +Caelian +caelometer +Caelum +Caelus +Caenogaea +Caenogaean +Caenolestes +caenostylic +caenostyly +caeoma +caeremoniarius +Caerphilly +Caesalpinia +Caesalpiniaceae +caesalpiniaceous +Caesar +Caesardom +Caesarean +Caesareanize +Caesarian +Caesarism +Caesarist +Caesarize +caesaropapacy +caesaropapism +caesaropopism +Caesarotomy +Caesarship +caesious +caesura +caesural +caesuric +cafeneh +cafenet +cafeteria +caffa +caffeate +caffeic +caffeina +caffeine +caffeinic +caffeinism +caffeism +caffeol +caffeone +caffetannic +caffetannin +caffiso +caffle +caffoline +caffoy +cafh +cafiz +caftan +caftaned +cag +Cagayan +cage +caged +cageful +cageless +cagelike +cageling +cageman +cager +cagester +cagework +cagey +caggy +cagily +cagit +cagmag +Cagn +Cahenslyism +Cahill +cahincic +Cahita +cahiz +Cahnite +Cahokia +cahoot +cahot +cahow +Cahuapana +Cahuilla +caickle +caid +cailcedra +cailleach +caimacam +caimakam +caiman +caimitillo +caimito +Cain +cain +Caingang +Caingua +Cainian +Cainish +Cainism +Cainite +Cainitic +caique +caiquejee +Cairba +caird +Cairene +cairn +cairned +cairngorm +cairngorum +cairny +Cairo +caisson +caissoned +Caitanyas +Caite +caitiff +Cajan +Cajanus +cajeput +cajole +cajolement +cajoler +cajolery +cajoling +cajolingly +cajuela +Cajun +cajun +cajuput +cajuputene +cajuputol +Cakavci +Cakchikel +cake +cakebox +cakebread +cakehouse +cakemaker +cakemaking +caker +cakette +cakewalk +cakewalker +cakey +Cakile +caky +cal +calaba +Calabar +Calabari +calabash +calabaza +calabazilla +calaber +calaboose +calabrasella +Calabrese +calabrese +Calabrian +calade +Caladium +calais +calalu +Calamagrostis +calamanco +calamansi +Calamariaceae +calamariaceous +Calamariales +calamarian +calamarioid +calamaroid +calamary +calambac +calambour +calamiferous +calamiform +calaminary +calamine +calamint +Calamintha +calamistral +calamistrum +calamite +calamitean +Calamites +calamitoid +calamitous +calamitously +calamitousness +calamity +Calamodendron +calamondin +Calamopitys +Calamospermae +Calamostachys +calamus +calander +Calandra +calandria +Calandridae +Calandrinae +Calandrinia +calangay +calantas +Calanthe +calapite +Calappa +Calappidae +Calas +calascione +calash +Calathea +calathian +calathidium +calathiform +calathiscus +calathus +Calatrava +calaverite +calbroben +calcaneal +calcaneoastragalar +calcaneoastragaloid +calcaneocuboid +calcaneofibular +calcaneonavicular +calcaneoplantar +calcaneoscaphoid +calcaneotibial +calcaneum +calcaneus +calcar +calcarate +Calcarea +calcareoargillaceous +calcareobituminous +calcareocorneous +calcareosiliceous +calcareosulphurous +calcareous +calcareously +calcareousness +calcariferous +calcariform +calcarine +calced +calceiform +calcemia +Calceolaria +calceolate +Calchaqui +Calchaquian +calcic +calciclase +calcicole +calcicolous +calcicosis +calciferol +Calciferous +calciferous +calcific +calcification +calcified +calciform +calcifugal +calcifuge +calcifugous +calcify +calcigenous +calcigerous +calcimeter +calcimine +calciminer +calcinable +calcination +calcinatory +calcine +calcined +calciner +calcinize +calciobiotite +calciocarnotite +calcioferrite +calcioscheelite +calciovolborthite +calcipexy +calciphile +calciphilia +calciphilous +calciphobe +calciphobous +calciphyre +calciprivic +calcisponge +Calcispongiae +calcite +calcitestaceous +calcitic +calcitrant +calcitrate +calcitreation +calcium +calcivorous +calcographer +calcographic +calcography +calcrete +calculability +calculable +Calculagraph +calculary +calculate +calculated +calculatedly +calculating +calculatingly +calculation +calculational +calculative +calculator +calculatory +calculi +calculiform +calculist +calculous +calculus +Calcydon +calden +caldron +calean +Caleb +Caledonia +Caledonian +caledonite +calefacient +calefaction +calefactive +calefactor +calefactory +calelectric +calelectrical +calelectricity +Calemes +calendal +calendar +calendarer +calendarial +calendarian +calendaric +calender +calenderer +calendric +calendrical +calendry +calends +Calendula +calendulin +calentural +calenture +calenturist +calepin +calescence +calescent +calf +calfbound +calfhood +calfish +calfkill +calfless +calflike +calfling +calfskin +Caliban +Calibanism +caliber +calibered +calibogus +calibrate +calibration +calibrator +calibre +Caliburn +Caliburno +calicate +calices +caliciform +calicle +calico +calicoback +calicoed +calicular +caliculate +Calicut +calid +calidity +caliduct +California +Californian +californite +californium +caliga +caligated +caliginous +caliginously +caligo +Calimeris +Calinago +calinda +calinut +caliological +caliologist +caliology +calipash +calipee +caliper +caliperer +calipers +caliph +caliphal +caliphate +caliphship +Calista +calistheneum +calisthenic +calisthenical +calisthenics +Calite +caliver +calix +Calixtin +Calixtus +calk +calkage +calker +calkin +calking +call +Calla +callable +callainite +callant +callboy +caller +callet +calli +Callianassa +Callianassidae +Calliandra +Callicarpa +Callicebus +callid +callidity +callidness +calligraph +calligrapha +calligrapher +calligraphic +calligraphical +calligraphically +calligraphist +calligraphy +calling +Callionymidae +Callionymus +Calliope +calliophone +Calliopsis +calliper +calliperer +Calliphora +calliphorid +Calliphoridae +calliphorine +callipygian +callipygous +Callirrhoe +Callisaurus +callisection +callisteia +Callistemon +Callistephus +Callithrix +callithump +callithumpian +Callitrichaceae +callitrichaceous +Callitriche +Callitrichidae +Callitris +callitype +callo +Callorhynchidae +Callorhynchus +callosal +callose +callosity +callosomarginal +callosum +callous +callously +callousness +Callovian +callow +callower +callowman +callowness +Calluna +callus +Callynteria +calm +calmant +calmative +calmer +calmierer +calmingly +calmly +calmness +calmy +Calocarpum +Calochortaceae +Calochortus +calodemon +calography +calomba +calomel +calomorphic +Calonectria +Calonyction +calool +Calophyllum +Calopogon +calor +calorescence +calorescent +caloric +caloricity +calorie +calorifacient +calorific +calorifical +calorifically +calorification +calorifics +calorifier +calorify +calorigenic +calorimeter +calorimetric +calorimetrical +calorimetrically +calorimetry +calorimotor +caloris +calorisator +calorist +Calorite +calorize +calorizer +Calosoma +Calotermes +calotermitid +Calotermitidae +Calothrix +calotte +calotype +calotypic +calotypist +caloyer +calp +calpac +calpack +calpacked +calpulli +Caltha +caltrap +caltrop +calumba +calumet +calumniate +calumniation +calumniative +calumniator +calumniatory +calumnious +calumniously +calumniousness +calumny +Calusa +calutron +Calvados +calvaria +calvarium +Calvary +Calvatia +calve +calved +calver +calves +Calvin +Calvinian +Calvinism +Calvinist +Calvinistic +Calvinistical +Calvinistically +Calvinize +calvish +calvities +calvity +calvous +calx +calycanth +Calycanthaceae +calycanthaceous +calycanthemous +calycanthemy +calycanthine +Calycanthus +calycate +Calyceraceae +calyceraceous +calyces +calyciferous +calycifloral +calyciflorate +calyciflorous +calyciform +calycinal +calycine +calycle +calycled +Calycocarpum +calycoid +calycoideous +Calycophora +Calycophorae +calycophoran +Calycozoa +calycozoan +calycozoic +calycozoon +calycular +calyculate +calyculated +calycule +calyculus +Calydon +Calydonian +Calymene +calymma +calyphyomy +calypsist +Calypso +calypso +calypsonian +calypter +Calypterae +Calyptoblastea +calyptoblastic +Calyptorhynchus +calyptra +Calyptraea +Calyptranthes +Calyptrata +Calyptratae +calyptrate +calyptriform +calyptrimorphous +calyptro +calyptrogen +Calyptrogyne +Calystegia +calyx +cam +camaca +Camacan +camagon +camail +camailed +Camaldolensian +Camaldolese +Camaldolesian +Camaldolite +Camaldule +Camaldulian +camalote +caman +camansi +camara +camaraderie +Camarasaurus +camarilla +camass +Camassia +camata +camatina +Camaxtli +camb +Camball +Cambalo +Cambarus +cambaye +camber +Cambeva +cambial +cambiform +cambiogenetic +cambism +cambist +cambistry +cambium +Cambodian +cambogia +cambrel +cambresine +Cambrian +Cambric +cambricleaf +cambuca +Cambuscan +Cambyuskan +Came +came +cameist +camel +camelback +cameleer +Camelid +Camelidae +Camelina +cameline +camelish +camelishness +camelkeeper +Camellia +Camelliaceae +camellike +camellin +Camellus +camelman +cameloid +Cameloidea +camelopard +Camelopardalis +Camelopardid +Camelopardidae +Camelopardus +camelry +Camelus +Camembert +Camenae +Camenes +cameo +cameograph +cameography +camera +cameral +cameralism +cameralist +cameralistic +cameralistics +cameraman +Camerata +camerate +camerated +cameration +camerier +Camerina +Camerinidae +camerist +camerlingo +Cameronian +Camestres +camilla +camillus +camion +camisado +Camisard +camise +camisia +camisole +camlet +camleteen +Cammarum +cammed +cammock +cammocky +camomile +camoodi +camoodie +Camorra +Camorrism +Camorrist +Camorrista +camouflage +camouflager +camp +Campa +campagna +campagnol +campaign +campaigner +campana +campane +campanero +Campanian +campaniform +campanile +campaniliform +campanilla +campanini +campanist +campanistic +campanologer +campanological +campanologically +campanologist +campanology +Campanula +Campanulaceae +campanulaceous +Campanulales +campanular +Campanularia +Campanulariae +campanularian +Campanularidae +Campanulatae +campanulate +campanulated +campanulous +Campaspe +Campbellism +Campbellite +campbellite +campcraft +Campe +Campephagidae +campephagine +Campephilus +camper +campestral +campfight +campfire +campground +camphane +camphanic +camphanone +camphanyl +camphene +camphine +camphire +campho +camphocarboxylic +camphoid +camphol +campholic +campholide +campholytic +camphor +camphoraceous +camphorate +camphoric +camphorize +camphorone +camphoronic +camphoroyl +camphorphorone +camphorwood +camphory +camphoryl +camphylene +Campignian +campimeter +campimetrical +campimetry +Campine +campion +cample +campmaster +campo +Campodea +campodeid +Campodeidae +campodeiform +campodeoid +campody +Camponotus +campoo +camporee +campshed +campshedding +campsheeting +campshot +campstool +camptodrome +camptonite +Camptosorus +campulitropal +campulitropous +campus +campward +campylite +campylodrome +campylometer +Campyloneuron +campylospermous +campylotropal +campylotropous +camshach +camshachle +camshaft +camstane +camstone +camuning +camus +camused +camwood +can +Cana +Canaan +Canaanite +Canaanitess +Canaanitic +Canaanitish +canaba +Canacee +Canada +canada +Canadian +Canadianism +Canadianization +Canadianize +canadine +canadite +canadol +canaigre +canaille +canajong +canal +canalage +canalboat +canalicular +canaliculate +canaliculated +canaliculation +canaliculi +canaliculization +canaliculus +canaliferous +canaliform +canalization +canalize +canaller +canalling +canalman +canalside +Canamary +canamo +Cananaean +Cananga +Canangium +canape +canapina +canard +Canari +canari +Canarian +canarin +Canariote +Canarium +Canarsee +canary +canasta +canaster +canaut +Canavali +Canavalia +canavalin +Canberra +cancan +cancel +cancelable +cancelation +canceleer +canceler +cancellarian +cancellate +cancellated +cancellation +cancelli +cancellous +cancellus +cancelment +cancer +cancerate +canceration +cancerdrops +cancered +cancerigenic +cancerism +cancerophobe +cancerophobia +cancerous +cancerously +cancerousness +cancerroot +cancerweed +cancerwort +canch +canchalagua +Canchi +Cancri +Cancrid +cancriform +cancrinite +cancrisocial +cancrivorous +cancrizans +cancroid +cancrophagous +cancrum +cand +Candace +candareen +candela +candelabra +candelabrum +candelilla +candent +candescence +candescent +candescently +candid +candidacy +candidate +candidateship +candidature +candidly +candidness +candied +candier +candify +Candiot +candiru +candle +candleball +candlebeam +candleberry +candlebomb +candlebox +candlefish +candleholder +candlelight +candlelighted +candlelighter +candlelighting +candlelit +candlemaker +candlemaking +Candlemas +candlenut +candlepin +candler +candlerent +candleshine +candleshrift +candlestand +candlestick +candlesticked +candlestickward +candlewaster +candlewasting +candlewick +candlewood +candlewright +candock +Candollea +Candolleaceae +candolleaceous +candor +candroy +candy +candymaker +candymaking +candys +candystick +candytuft +candyweed +cane +canebrake +canel +canelike +canella +Canellaceae +canellaceous +Canelo +canelo +caneology +canephor +canephore +canephoros +canephroi +caner +canescence +canescent +canette +canewise +canework +Canfield +canfieldite +canful +cangan +cangia +cangle +cangler +cangue +canhoop +Canichana +Canichanan +canicola +Canicula +canicular +canicule +canid +Canidae +Canidia +canille +caninal +canine +caniniform +caninity +caninus +canioned +canions +Canis +Canisiana +canistel +canister +canities +canjac +cank +canker +cankerberry +cankerbird +cankereat +cankered +cankeredly +cankeredness +cankerflower +cankerous +cankerroot +cankerweed +cankerworm +cankerwort +cankery +canmaker +canmaking +canman +Canna +canna +cannabic +Cannabinaceae +cannabinaceous +cannabine +cannabinol +Cannabis +cannabism +Cannaceae +cannaceous +cannach +canned +cannel +cannelated +cannelure +cannelured +cannequin +canner +cannery +cannet +cannibal +cannibalean +cannibalic +cannibalish +cannibalism +cannibalistic +cannibalistically +cannibality +cannibalization +cannibalize +cannibally +cannikin +cannily +canniness +canning +cannon +cannonade +cannoned +cannoneer +cannoneering +Cannonism +cannonproof +cannonry +cannot +Cannstatt +cannula +cannular +cannulate +cannulated +canny +canoe +canoeing +Canoeiro +canoeist +canoeload +canoeman +canoewood +canon +canoncito +canoness +canonic +canonical +canonically +canonicalness +canonicals +canonicate +canonicity +canonics +canonist +canonistic +canonistical +canonizant +canonization +canonize +canonizer +canonlike +canonry +canonship +canoodle +canoodler +Canopic +canopic +Canopus +canopy +canorous +canorously +canorousness +Canossa +canroy +canroyer +canso +cant +Cantab +cantabank +cantabile +Cantabri +Cantabrian +Cantabrigian +Cantabrize +cantala +cantalite +cantaloupe +cantankerous +cantankerously +cantankerousness +cantar +cantara +cantaro +cantata +Cantate +cantation +cantative +cantatory +cantboard +canted +canteen +cantefable +canter +Canterburian +Canterburianism +Canterbury +canterer +canthal +Cantharellus +Cantharidae +cantharidal +cantharidate +cantharides +cantharidian +cantharidin +cantharidism +cantharidize +cantharis +cantharophilous +cantharus +canthectomy +canthitis +cantholysis +canthoplasty +canthorrhaphy +canthotomy +canthus +cantic +canticle +cantico +cantilena +cantilene +cantilever +cantilevered +cantillate +cantillation +cantily +cantina +cantiness +canting +cantingly +cantingness +cantion +cantish +cantle +cantlet +canto +Canton +canton +cantonal +cantonalism +cantoned +cantoner +Cantonese +cantonment +cantoon +cantor +cantoral +Cantorian +cantoris +cantorous +cantorship +cantred +cantref +cantrip +cantus +cantwise +canty +Canuck +canun +canvas +canvasback +canvasman +canvass +canvassy +cany +canyon +canzon +canzonet +caoba +Caodaism +Caodaist +caoutchouc +caoutchoucin +cap +capability +capable +capableness +capably +capacious +capaciously +capaciousness +capacitance +capacitate +capacitation +capacitative +capacitativly +capacitive +capacitor +capacity +capanna +capanne +caparison +capax +capcase +Cape +cape +caped +capel +capelet +capelin +capeline +Capella +capellet +caper +caperbush +capercaillie +capercally +capercut +caperer +capering +caperingly +Capernaism +Capernaite +Capernaitic +Capernaitical +Capernaitically +Capernaitish +capernoited +capernoitie +capernoity +capersome +caperwort +capes +capeskin +Capetian +Capetonian +capeweed +capewise +capful +Caph +caph +caphar +caphite +Caphtor +Caphtorim +capias +capicha +capillaceous +capillaire +capillament +capillarectasia +capillarily +capillarimeter +capillariness +capillariomotor +capillarity +capillary +capillation +capilliculture +capilliform +capillitial +capillitium +capillose +capistrate +capital +capitaldom +capitaled +capitalism +capitalist +capitalistic +capitalistically +capitalizable +capitalization +capitalize +capitally +capitalness +capitan +capitate +capitated +capitatim +capitation +capitative +capitatum +capitellar +capitellate +capitelliform +capitellum +Capito +Capitol +Capitolian +Capitoline +Capitolium +Capitonidae +Capitoninae +capitoul +capitoulate +capitulant +capitular +capitularly +capitulary +capitulate +capitulation +capitulator +capitulatory +capituliform +capitulum +capivi +capkin +capless +caplin +capmaker +capmaking +capman +capmint +Capnodium +Capnoides +capnomancy +capocchia +capomo +capon +caponier +caponize +caponizer +caporal +capot +capote +cappadine +Cappadocian +Capparidaceae +capparidaceous +Capparis +capped +cappelenite +capper +cappie +capping +capple +cappy +Capra +caprate +Caprella +Caprellidae +caprelline +capreol +capreolar +capreolary +capreolate +capreoline +Capreolus +Capri +capric +capriccetto +capricci +capriccio +caprice +capricious +capriciously +capriciousness +Capricorn +Capricornid +Capricornus +caprid +caprificate +caprification +caprificator +caprifig +Caprifoliaceae +caprifoliaceous +Caprifolium +caprifolium +capriform +caprigenous +Caprimulgi +Caprimulgidae +Caprimulgiformes +caprimulgine +Caprimulgus +caprin +caprine +caprinic +Capriola +capriole +Capriote +capriped +capripede +caprizant +caproate +caproic +caproin +Capromys +caprone +capronic +capronyl +caproyl +capryl +caprylate +caprylene +caprylic +caprylin +caprylone +caprylyl +capsa +capsaicin +Capsella +capsheaf +capshore +Capsian +capsicin +Capsicum +capsicum +capsid +Capsidae +capsizal +capsize +capstan +capstone +capsula +capsulae +capsular +capsulate +capsulated +capsulation +capsule +capsulectomy +capsuler +capsuliferous +capsuliform +capsuligerous +capsulitis +capsulociliary +capsulogenous +capsulolenticular +capsulopupillary +capsulorrhaphy +capsulotome +capsulotomy +capsumin +captaculum +captain +captaincy +captainess +captainly +captainry +captainship +captance +captation +caption +captious +captiously +captiousness +captivate +captivately +captivating +captivatingly +captivation +captivative +captivator +captivatrix +captive +captivity +captor +captress +capturable +capture +capturer +Capuan +capuche +capuched +Capuchin +capuchin +capucine +capulet +capulin +capybara +Caquetio +car +Cara +carabao +carabeen +carabid +Carabidae +carabidan +carabideous +carabidoid +carabin +carabineer +Carabini +caraboid +Carabus +carabus +caracal +caracara +caracol +caracole +caracoler +caracoli +caracolite +caracoller +caracore +caract +Caractacus +caracter +Caradoc +carafe +Caragana +Caraguata +caraguata +Caraho +caraibe +Caraipa +caraipi +Caraja +Carajas +carajura +caramba +carambola +carambole +caramel +caramelan +caramelen +caramelin +caramelization +caramelize +caramoussal +carancha +caranda +Carandas +caranday +carane +Caranga +carangid +Carangidae +carangoid +Carangus +caranna +Caranx +Carapa +carapace +carapaced +Carapache +Carapacho +carapacic +carapato +carapax +Carapidae +carapine +carapo +Carapus +Carara +carat +caratch +caraunda +caravan +caravaneer +caravanist +caravanner +caravansary +caravanserai +caravanserial +caravel +caraway +Carayan +carbacidometer +carbamate +carbamic +carbamide +carbamido +carbamine +carbamino +carbamyl +carbanil +carbanilic +carbanilide +carbarn +carbasus +carbazic +carbazide +carbazine +carbazole +carbazylic +carbeen +carbene +carberry +carbethoxy +carbethoxyl +carbide +carbimide +carbine +carbinol +carbinyl +carbo +carboazotine +carbocinchomeronic +carbodiimide +carbodynamite +carbogelatin +carbohemoglobin +carbohydrase +carbohydrate +carbohydraturia +carbohydrazide +carbohydride +carbohydrogen +carbolate +carbolated +carbolfuchsin +carbolic +carbolineate +Carbolineum +carbolize +Carboloy +carboluria +carbolxylol +carbomethene +carbomethoxy +carbomethoxyl +carbon +carbona +carbonaceous +carbonade +carbonado +Carbonari +Carbonarism +Carbonarist +carbonatation +carbonate +carbonation +carbonatization +carbonator +carbonemia +carbonero +carbonic +carbonide +Carboniferous +carboniferous +carbonification +carbonify +carbonigenous +carbonimeter +carbonimide +carbonite +carbonitride +carbonium +carbonizable +carbonization +carbonize +carbonizer +carbonless +Carbonnieux +carbonometer +carbonometry +carbonous +carbonuria +carbonyl +carbonylene +carbonylic +carbophilous +carbora +Carborundum +carborundum +carbosilicate +carbostyril +carboxide +carboxy +Carboxydomonas +carboxyhemoglobin +carboxyl +carboxylase +carboxylate +carboxylation +carboxylic +carboy +carboyed +carbro +carbromal +carbuilder +carbuncle +carbuncled +carbuncular +carbungi +carburant +carburate +carburation +carburator +carbure +carburet +carburetant +carburetor +carburization +carburize +carburizer +carburometer +carbyl +carbylamine +carcajou +carcake +carcanet +carcaneted +carcass +Carcavelhos +carceag +carcel +carceral +carcerate +carceration +Carcharhinus +Carcharias +carchariid +Carchariidae +carcharioid +Carcharodon +carcharodont +carcinemia +carcinogen +carcinogenesis +carcinogenic +carcinoid +carcinological +carcinologist +carcinology +carcinolysin +carcinolytic +carcinoma +carcinomata +carcinomatoid +carcinomatosis +carcinomatous +carcinomorphic +carcinophagous +carcinopolypus +carcinosarcoma +carcinosarcomata +Carcinoscorpius +carcinosis +carcoon +card +cardaissin +Cardamine +cardamom +Cardanic +cardboard +cardcase +cardecu +carded +cardel +carder +cardholder +cardia +cardiac +cardiacal +Cardiacea +cardiacean +cardiagra +cardiagram +cardiagraph +cardiagraphy +cardial +cardialgia +cardialgy +cardiameter +cardiamorphia +cardianesthesia +cardianeuria +cardiant +cardiaplegia +cardiarctia +cardiasthenia +cardiasthma +cardiataxia +cardiatomy +cardiatrophia +cardiauxe +Cardiazol +cardicentesis +cardiectasis +cardiectomize +cardiectomy +cardielcosis +cardiemphraxia +cardiform +Cardigan +cardigan +Cardiidae +cardin +cardinal +cardinalate +cardinalic +Cardinalis +cardinalism +cardinalist +cardinalitial +cardinalitian +cardinally +cardinalship +cardines +carding +cardioaccelerator +cardioarterial +cardioblast +cardiocarpum +cardiocele +cardiocentesis +cardiocirrhosis +cardioclasia +cardioclasis +cardiodilator +cardiodynamics +cardiodynia +cardiodysesthesia +cardiodysneuria +cardiogenesis +cardiogenic +cardiogram +cardiograph +cardiographic +cardiography +cardiohepatic +cardioid +cardiokinetic +cardiolith +cardiological +cardiologist +cardiology +cardiolysis +cardiomalacia +cardiomegaly +cardiomelanosis +cardiometer +cardiometric +cardiometry +cardiomotility +cardiomyoliposis +cardiomyomalacia +cardioncus +cardionecrosis +cardionephric +cardioneural +cardioneurosis +cardionosus +cardioparplasis +cardiopathic +cardiopathy +cardiopericarditis +cardiophobe +cardiophobia +cardiophrenia +cardioplasty +cardioplegia +cardiopneumatic +cardiopneumograph +cardioptosis +cardiopulmonary +cardiopuncture +cardiopyloric +cardiorenal +cardiorespiratory +cardiorrhaphy +cardiorrheuma +cardiorrhexis +cardioschisis +cardiosclerosis +cardioscope +cardiospasm +Cardiospermum +cardiosphygmogram +cardiosphygmograph +cardiosymphysis +cardiotherapy +cardiotomy +cardiotonic +cardiotoxic +cardiotrophia +cardiotrophotherapy +cardiovascular +cardiovisceral +cardipaludism +cardipericarditis +cardisophistical +carditic +carditis +Cardium +cardlike +cardmaker +cardmaking +cardo +cardol +cardon +cardona +cardoncillo +cardooer +cardoon +cardophagus +cardplayer +cardroom +cardsharp +cardsharping +cardstock +Carduaceae +carduaceous +Carduelis +Carduus +care +carecloth +careen +careenage +careener +career +careerer +careering +careeringly +careerist +carefree +careful +carefully +carefulness +careless +carelessly +carelessness +carene +carer +caress +caressant +caresser +caressing +caressingly +caressive +caressively +carest +caret +caretaker +caretaking +Caretta +Carettochelydidae +careworn +Carex +carfare +carfax +carfuffle +carful +carga +cargo +cargoose +carhop +carhouse +cariacine +Cariacus +cariama +Cariamae +Carian +Carib +Caribal +Cariban +Caribbean +Caribbee +Caribi +Caribisi +caribou +Carica +Caricaceae +caricaceous +caricatura +caricaturable +caricatural +caricature +caricaturist +caricetum +caricographer +caricography +caricologist +caricology +caricous +carid +Carida +Caridea +caridean +caridoid +Caridomorpha +caries +Carijona +carillon +carillonneur +carina +carinal +Carinaria +Carinatae +carinate +carinated +carination +Cariniana +cariniform +Carinthian +cariole +carioling +cariosity +carious +cariousness +Caripuna +Cariri +Caririan +Carissa +caritative +caritive +Cariyo +cark +carking +carkingly +carkled +Carl +carl +carless +carlet +carlie +carlin +Carlina +carline +carling +carlings +carlish +carlishness +Carlisle +Carlism +Carlist +carload +carloading +carloadings +carlot +Carlovingian +carls +Carludovica +Carlylean +Carlyleian +Carlylese +Carlylesque +Carlylian +Carlylism +carmagnole +carmalum +Carman +carman +Carmanians +Carmel +Carmela +carmele +Carmelite +Carmelitess +carmeloite +Carmen +carminative +Carmine +carmine +carminette +carminic +carminite +carminophilous +carmoisin +carmot +Carnacian +carnage +carnaged +carnal +carnalism +carnalite +carnality +carnalize +carnallite +carnally +carnalness +carnaptious +Carnaria +carnassial +carnate +carnation +carnationed +carnationist +carnauba +carnaubic +carnaubyl +Carnegie +Carnegiea +carnelian +carneol +carneole +carneous +carney +carnic +carniferous +carniferrin +carnifex +carnification +carnifices +carnificial +carniform +carnify +Carniolan +carnival +carnivaler +carnivalesque +Carnivora +carnivoracity +carnivoral +carnivore +carnivorism +carnivorous +carnivorously +carnivorousness +carnose +carnosine +carnosity +carnotite +carnous +Caro +caroa +carob +caroba +caroche +Caroid +Carol +carol +Carolan +Carolean +caroler +caroli +carolin +Carolina +Caroline +caroline +Caroling +Carolingian +Carolinian +carolus +carom +carombolette +carone +caronic +caroome +caroon +carotene +carotenoid +carotic +carotid +carotidal +carotidean +carotin +carotinemia +carotinoid +caroubier +carousal +carouse +carouser +carousing +carousingly +carp +carpaine +carpal +carpale +carpalia +Carpathian +carpel +carpellary +carpellate +carpent +carpenter +Carpenteria +carpentering +carpentership +carpentry +carper +carpet +carpetbag +carpetbagger +carpetbaggery +carpetbaggism +carpetbagism +carpetbeater +carpeting +carpetlayer +carpetless +carpetmaker +carpetmaking +carpetmonger +carpetweb +carpetweed +carpetwork +carpetwoven +Carphiophiops +carpholite +Carphophis +carphosiderite +carpid +carpidium +carpincho +carping +carpingly +carpintero +Carpinus +Carpiodes +carpitis +carpium +carpocace +Carpocapsa +carpocarpal +carpocephala +carpocephalum +carpocerite +carpocervical +Carpocratian +Carpodacus +Carpodetus +carpogam +carpogamy +carpogenic +carpogenous +carpogone +carpogonial +carpogonium +Carpoidea +carpolite +carpolith +carpological +carpologically +carpologist +carpology +carpomania +carpometacarpal +carpometacarpus +carpopedal +Carpophaga +carpophagous +carpophalangeal +carpophore +carpophyll +carpophyte +carpopodite +carpopoditic +carpoptosia +carpoptosis +carport +carpos +carposperm +carposporangia +carposporangial +carposporangium +carpospore +carposporic +carposporous +carpostome +carpus +carquaise +carr +carrack +carrageen +carrageenin +Carrara +Carraran +carrel +carriable +carriage +carriageable +carriageful +carriageless +carriagesmith +carriageway +Carrick +carrick +Carrie +carried +carrier +carrion +carritch +carritches +carriwitchet +Carrizo +carrizo +carroch +carrollite +carronade +carrot +carrotage +carroter +carrotiness +carrottop +carrotweed +carrotwood +carroty +carrousel +carrow +Carry +carry +carryall +carrying +carrytale +carse +carshop +carsick +carsmith +cart +cartable +cartaceous +cartage +cartboot +cartbote +carte +cartel +cartelism +cartelist +cartelization +cartelize +carter +Cartesian +Cartesianism +cartful +Carthaginian +carthame +carthamic +carthamin +Carthamus +Carthusian +Cartier +cartilage +cartilaginean +Cartilaginei +cartilagineous +Cartilagines +cartilaginification +cartilaginoid +cartilaginous +cartisane +Cartist +cartload +cartmaker +cartmaking +cartman +cartobibliography +cartogram +cartograph +cartographer +cartographic +cartographical +cartographically +cartography +cartomancy +carton +cartonnage +cartoon +cartoonist +cartouche +cartridge +cartsale +cartulary +cartway +cartwright +cartwrighting +carty +carua +carucage +carucal +carucate +carucated +Carum +caruncle +caruncula +carunculae +caruncular +carunculate +carunculated +carunculous +carvacrol +carvacryl +carval +carve +carvel +carven +carvene +carver +carvership +carvestrene +carving +carvoepra +carvol +carvomenthene +carvone +carvyl +carwitchet +Carya +caryatic +caryatid +caryatidal +caryatidean +caryatidic +caryl +Caryocar +Caryocaraceae +caryocaraceous +Caryophyllaceae +caryophyllaceous +caryophyllene +caryophylleous +caryophyllin +caryophyllous +Caryophyllus +caryopilite +caryopses +caryopsides +caryopsis +Caryopteris +Caryota +casaba +casabe +casal +casalty +Casamarca +Casanovanic +Casasia +casate +casaun +casava +casave +casavi +casbah +cascabel +cascade +Cascadia +Cascadian +cascadite +cascado +cascalho +cascalote +cascara +cascarilla +cascaron +casco +cascol +case +Casearia +casease +caseate +caseation +casebook +casebox +cased +caseful +casefy +caseharden +caseic +casein +caseinate +caseinogen +casekeeper +Casel +caseless +caselessly +casemaker +casemaking +casemate +casemated +casement +casemented +caseolysis +caseose +caseous +caser +casern +caseum +caseweed +casewood +casework +caseworker +caseworm +cash +casha +cashable +cashableness +cashaw +cashbook +cashbox +cashboy +cashcuttee +cashel +cashew +cashgirl +Cashibo +cashier +cashierer +cashierment +cashkeeper +cashment +Cashmere +cashmere +cashmerette +Cashmirian +Casimir +Casimiroa +casing +casino +casiri +cask +casket +casking +casklike +Caslon +Caspar +Casparian +Caspian +casque +casqued +casquet +casquetel +casquette +cass +cassabanana +cassabully +cassady +Cassandra +cassareep +cassation +casse +Cassegrain +Cassegrainian +casselty +cassena +casserole +Cassia +cassia +Cassiaceae +Cassian +cassican +Cassicus +Cassida +cassideous +cassidid +Cassididae +Cassidinae +cassidony +Cassidulina +cassiduloid +Cassiduloidea +Cassie +cassie +Cassiepeia +cassimere +cassina +cassine +Cassinese +cassinette +Cassinian +cassino +cassinoid +cassioberry +Cassiope +Cassiopeia +Cassiopeian +Cassiopeid +cassiopeium +Cassis +cassis +cassiterite +Cassius +cassock +cassolette +casson +cassonade +cassoon +cassowary +cassumunar +Cassytha +Cassythaceae +cast +castable +castagnole +Castalia +Castalian +Castalides +Castalio +Castanea +castanean +castaneous +castanet +Castanopsis +Castanospermum +castaway +caste +casteless +castelet +castellan +castellano +castellanship +castellany +castellar +castellate +castellated +castellation +caster +casterless +casthouse +castice +castigable +castigate +castigation +castigative +castigator +castigatory +Castilian +Castilla +Castilleja +Castilloa +casting +castle +castled +castlelike +castlet +castlewards +castlewise +castling +castock +castoff +Castor +castor +Castores +castoreum +castorial +Castoridae +castorin +castorite +castorized +Castoroides +castory +castra +castral +castrametation +castrate +castrater +castration +castrator +castrensial +castrensian +castrum +castuli +casual +casualism +casualist +casuality +casually +casualness +casualty +Casuariidae +Casuariiformes +Casuarina +Casuarinaceae +casuarinaceous +Casuarinales +Casuarius +casuary +casuist +casuistess +casuistic +casuistical +casuistically +casuistry +casula +caswellite +Casziel +Cat +cat +catabaptist +catabases +catabasis +catabatic +catabibazon +catabiotic +catabolic +catabolically +catabolin +catabolism +catabolite +catabolize +catacaustic +catachreses +catachresis +catachrestic +catachrestical +catachrestically +catachthonian +cataclasm +cataclasmic +cataclastic +cataclinal +cataclysm +cataclysmal +cataclysmatic +cataclysmatist +cataclysmic +cataclysmically +cataclysmist +catacomb +catacorolla +catacoustics +catacromyodian +catacrotic +catacrotism +catacumbal +catadicrotic +catadicrotism +catadioptric +catadioptrical +catadioptrics +catadromous +catafalco +catafalque +catagenesis +catagenetic +catagmatic +Cataian +catakinesis +catakinetic +catakinetomer +catakinomeric +Catalan +Catalanganes +Catalanist +catalase +Catalaunian +catalecta +catalectic +catalecticant +catalepsis +catalepsy +cataleptic +cataleptiform +cataleptize +cataleptoid +catalexis +catalina +catalineta +catalinite +catallactic +catallactically +catallactics +catallum +catalogia +catalogic +catalogical +catalogist +catalogistic +catalogue +cataloguer +cataloguish +cataloguist +cataloguize +Catalonian +catalowne +Catalpa +catalpa +catalufa +catalyses +catalysis +catalyst +catalyte +catalytic +catalytical +catalytically +catalyzator +catalyze +catalyzer +catamaran +Catamarcan +Catamarenan +catamenia +catamenial +catamite +catamited +catamiting +catamount +catamountain +catan +Catananche +catapan +catapasm +catapetalous +cataphasia +cataphatic +cataphora +cataphoresis +cataphoretic +cataphoria +cataphoric +cataphract +Cataphracta +Cataphracti +cataphrenia +cataphrenic +Cataphrygian +cataphrygianism +cataphyll +cataphylla +cataphyllary +cataphyllum +cataphysical +cataplasia +cataplasis +cataplasm +catapleiite +cataplexy +catapult +catapultic +catapultier +cataract +cataractal +cataracted +cataractine +cataractous +cataractwise +cataria +catarinite +catarrh +catarrhal +catarrhally +catarrhed +Catarrhina +catarrhine +catarrhinian +catarrhous +catasarka +Catasetum +catasta +catastaltic +catastasis +catastate +catastatic +catasterism +catastrophal +catastrophe +catastrophic +catastrophical +catastrophically +catastrophism +catastrophist +catathymic +catatonia +catatoniac +catatonic +catawampous +catawampously +catawamptious +catawamptiously +catawampus +Catawba +catberry +catbird +catboat +catcall +catch +catchable +catchall +catchcry +catcher +catchfly +catchiness +catching +catchingly +catchingness +catchland +catchment +catchpenny +catchplate +catchpole +catchpolery +catchpoleship +catchpoll +catchpollery +catchup +catchwater +catchweed +catchweight +catchword +catchwork +catchy +catclaw +catdom +cate +catechesis +catechetic +catechetical +catechetically +catechin +catechism +catechismal +catechist +catechistic +catechistical +catechistically +catechizable +catechization +catechize +catechizer +catechol +catechu +catechumen +catechumenal +catechumenate +catechumenical +catechumenically +catechumenism +catechumenship +catechutannic +categorem +categorematic +categorematical +categorematically +categorial +categoric +categorical +categorically +categoricalness +categorist +categorization +categorize +category +catelectrotonic +catelectrotonus +catella +catena +catenae +catenarian +catenary +catenate +catenated +catenation +catenoid +catenulate +catepuce +cater +cateran +catercap +catercorner +caterer +caterership +cateress +caterpillar +caterpillared +caterpillarlike +caterva +caterwaul +caterwauler +caterwauling +Catesbaea +cateye +catface +catfaced +catfacing +catfall +catfish +catfoot +catfooted +catgut +Catha +Cathari +Catharina +Catharine +Catharism +Catharist +Catharistic +catharization +catharize +catharpin +catharping +Cathars +catharsis +Cathartae +Cathartes +cathartic +cathartical +cathartically +catharticalness +Cathartidae +Cathartides +Cathartolinum +Cathay +Cathayan +cathead +cathect +cathectic +cathection +cathedra +cathedral +cathedraled +cathedralesque +cathedralic +cathedrallike +cathedralwise +cathedratic +cathedratica +cathedratical +cathedratically +cathedraticum +cathepsin +Catherine +catheter +catheterism +catheterization +catheterize +catheti +cathetometer +cathetometric +cathetus +cathexion +cathexis +cathidine +cathin +cathine +cathinine +cathion +cathisma +cathodal +cathode +cathodic +cathodical +cathodically +cathodofluorescence +cathodograph +cathodography +cathodoluminescence +cathograph +cathography +cathole +catholic +catholical +catholically +catholicalness +catholicate +catholicism +catholicist +catholicity +catholicize +catholicizer +catholicly +catholicness +catholicon +catholicos +catholicus +catholyte +cathood +cathop +cathro +Catilinarian +cation +cationic +cativo +catjang +catkin +catkinate +catlap +catlike +catlin +catling +catlinite +catmalison +catmint +catnip +catoblepas +Catocala +catocalid +catocathartic +catoctin +Catodon +catodont +catogene +catogenic +Catoism +Catonian +Catonic +Catonically +Catonism +catoptric +catoptrical +catoptrically +catoptrics +catoptrite +catoptromancy +catoptromantic +Catoquina +catostomid +Catostomidae +catostomoid +Catostomus +catpiece +catpipe +catproof +Catskill +catskin +catstep +catstick +catstitch +catstitcher +catstone +catsup +cattabu +cattail +cattalo +cattery +Catti +cattily +cattimandoo +cattiness +catting +cattish +cattishly +cattishness +cattle +cattlebush +cattlegate +cattleless +cattleman +Cattleya +cattleya +cattleyak +Catty +catty +cattyman +Catullian +catvine +catwalk +catwise +catwood +catwort +caubeen +cauboge +Caucasian +Caucasic +Caucasoid +cauch +cauchillo +caucho +caucus +cauda +caudad +caudae +caudal +caudally +caudalward +Caudata +caudata +caudate +caudated +caudation +caudatolenticular +caudatory +caudatum +caudex +caudices +caudicle +caudiform +caudillism +caudle +caudocephalad +caudodorsal +caudofemoral +caudolateral +caudotibial +caudotibialis +Caughnawaga +caught +cauk +caul +cauld +cauldrife +cauldrifeness +Caulerpa +Caulerpaceae +caulerpaceous +caules +caulescent +caulicle +caulicole +caulicolous +caulicule +cauliculus +cauliferous +cauliflorous +cauliflory +cauliflower +cauliform +cauligenous +caulinar +caulinary +cauline +caulis +Caulite +caulivorous +caulocarpic +caulocarpous +caulome +caulomer +caulomic +caulophylline +Caulophyllum +Caulopteris +caulopteris +caulosarc +caulotaxis +caulotaxy +caulote +caum +cauma +caumatic +caunch +Caunos +Caunus +caup +caupo +caupones +Cauqui +caurale +Caurus +causability +causable +causal +causalgia +causality +causally +causate +causation +causational +causationism +causationist +causative +causatively +causativeness +causativity +cause +causeful +causeless +causelessly +causelessness +causer +causerie +causeway +causewayman +causey +causidical +causing +causingness +causse +causson +caustic +caustical +caustically +causticiser +causticism +causticity +causticization +causticize +causticizer +causticly +causticness +caustification +caustify +Causus +cautel +cautelous +cautelously +cautelousness +cauter +cauterant +cauterization +cauterize +cautery +caution +cautionary +cautioner +cautionry +cautious +cautiously +cautiousness +cautivo +cava +cavae +caval +cavalcade +cavalero +cavalier +cavalierish +cavalierishness +cavalierism +cavalierly +cavalierness +cavaliero +cavaliership +cavalla +cavalry +cavalryman +cavascope +cavate +cavatina +cave +caveat +caveator +cavekeeper +cavel +cavelet +cavelike +cavendish +cavern +cavernal +caverned +cavernicolous +cavernitis +cavernlike +cavernoma +cavernous +cavernously +cavernulous +cavesson +cavetto +Cavia +caviar +cavicorn +Cavicornia +Cavidae +cavie +cavil +caviler +caviling +cavilingly +cavilingness +cavillation +Cavina +caving +cavings +cavish +cavitary +cavitate +cavitation +cavitied +cavity +caviya +cavort +cavus +cavy +caw +cawk +cawky +cawney +cawquaw +caxiri +caxon +Caxton +Caxtonian +cay +Cayapa +Cayapo +Cayenne +cayenne +cayenned +Cayleyan +cayman +Cayubaba +Cayubaban +Cayuga +Cayugan +Cayuse +Cayuvava +caza +cazimi +Ccoya +ce +Ceanothus +cearin +cease +ceaseless +ceaselessly +ceaselessness +ceasmic +Cebalrai +Cebatha +cebell +cebian +cebid +Cebidae +cebil +cebine +ceboid +cebollite +cebur +Cebus +cecidiologist +cecidiology +cecidium +cecidogenous +cecidologist +cecidology +cecidomyian +cecidomyiid +Cecidomyiidae +cecidomyiidous +Cecil +Cecile +Cecilia +cecilite +cecils +Cecily +cecity +cecograph +Cecomorphae +cecomorphic +cecostomy +Cecropia +Cecrops +cecutiency +cedar +cedarbird +cedared +cedarn +cedarware +cedarwood +cedary +cede +cedent +ceder +cedilla +cedrat +cedrate +cedre +Cedrela +cedrene +Cedric +cedrin +cedrine +cedriret +cedrium +cedrol +cedron +Cedrus +cedry +cedula +cee +Ceiba +ceibo +ceil +ceile +ceiler +ceilidh +ceiling +ceilinged +ceilingward +ceilingwards +ceilometer +Celadon +celadon +celadonite +Celaeno +celandine +Celanese +Celarent +Celastraceae +celastraceous +Celastrus +celation +celative +celature +Celebesian +celebrant +celebrate +celebrated +celebratedness +celebrater +celebration +celebrative +celebrator +celebratory +celebrity +celemin +celemines +celeomorph +Celeomorphae +celeomorphic +celeriac +celerity +celery +celesta +Celeste +celeste +celestial +celestiality +celestialize +celestially +celestialness +celestina +Celestine +celestine +Celestinian +celestite +celestitude +Celia +celiac +celiadelphus +celiagra +celialgia +celibacy +celibatarian +celibate +celibatic +celibatist +celibatory +celidographer +celidography +celiectasia +celiectomy +celiemia +celiitis +celiocele +celiocentesis +celiocolpotomy +celiocyesis +celiodynia +celioelytrotomy +celioenterotomy +celiogastrotomy +celiohysterotomy +celiolymph +celiomyalgia +celiomyodynia +celiomyomectomy +celiomyomotomy +celiomyositis +celioncus +celioparacentesis +celiopyosis +celiorrhaphy +celiorrhea +celiosalpingectomy +celiosalpingotomy +celioschisis +celioscope +celioscopy +celiotomy +celite +cell +cella +cellae +cellar +cellarage +cellarer +cellaress +cellaret +cellaring +cellarless +cellarman +cellarous +cellarway +cellarwoman +cellated +celled +Cellepora +cellepore +Cellfalcicula +celliferous +celliform +cellifugal +cellipetal +cellist +Cellite +cello +cellobiose +celloid +celloidin +celloist +cellophane +cellose +Cellucotton +cellular +cellularity +cellularly +cellulase +cellulate +cellulated +cellulation +cellule +cellulicidal +celluliferous +cellulifugal +cellulifugally +cellulin +cellulipetal +cellulipetally +cellulitis +cellulocutaneous +cellulofibrous +Celluloid +celluloid +celluloided +Cellulomonadeae +Cellulomonas +cellulose +cellulosic +cellulosity +cellulotoxic +cellulous +Cellvibrio +Celosia +Celotex +celotomy +Celsia +celsian +Celsius +Celt +celt +Celtdom +Celtiberi +Celtiberian +Celtic +Celtically +Celticism +Celticist +Celticize +Celtidaceae +celtiform +Celtillyrians +Celtis +Celtish +Celtism +Celtist +celtium +Celtization +Celtologist +Celtologue +Celtomaniac +Celtophil +Celtophobe +Celtophobia +celtuce +cembalist +cembalo +cement +cemental +cementation +cementatory +cementer +cementification +cementin +cementite +cementitious +cementless +cementmaker +cementmaking +cementoblast +cementoma +cementum +cemeterial +cemetery +cenacle +cenaculum +cenanthous +cenanthy +cencerro +Cenchrus +cendre +cenobian +cenobite +cenobitic +cenobitical +cenobitically +cenobitism +cenobium +cenoby +cenogenesis +cenogenetic +cenogenetically +cenogonous +Cenomanian +cenosite +cenosity +cenospecies +cenospecific +cenospecifically +cenotaph +cenotaphic +cenotaphy +Cenozoic +cenozoology +cense +censer +censerless +censive +censor +censorable +censorate +censorial +censorious +censoriously +censoriousness +censorship +censual +censurability +censurable +censurableness +censurably +censure +censureless +censurer +censureship +census +cent +centage +cental +centare +centaur +centaurdom +Centaurea +centauress +centauri +centaurial +centaurian +centauric +Centaurid +Centauridium +Centaurium +centauromachia +centauromachy +Centaurus +centaurus +centaury +centavo +centena +centenar +centenarian +centenarianism +centenary +centenier +centenionalis +centennial +centennially +center +centerable +centerboard +centered +centerer +centering +centerless +centermost +centerpiece +centervelic +centerward +centerwise +centesimal +centesimally +centesimate +centesimation +centesimi +centesimo +centesis +Centetes +centetid +Centetidae +centgener +centiar +centiare +centibar +centifolious +centigrade +centigram +centile +centiliter +centillion +centillionth +Centiloquy +centime +centimeter +centimo +centimolar +centinormal +centipedal +centipede +centiplume +centipoise +centistere +centistoke +centner +cento +centonical +centonism +centrad +central +centrale +Centrales +centralism +centralist +centralistic +centrality +centralization +centralize +centralizer +centrally +centralness +centranth +Centranthus +centrarchid +Centrarchidae +centrarchoid +Centraxonia +centraxonial +Centrechinoida +centric +Centricae +centrical +centricality +centrically +centricalness +centricipital +centriciput +centricity +centriffed +centrifugal +centrifugalization +centrifugalize +centrifugaller +centrifugally +centrifugate +centrifugation +centrifuge +centrifugence +centriole +centripetal +centripetalism +centripetally +centripetence +centripetency +centriscid +Centriscidae +centrisciform +centriscoid +Centriscus +centrist +centroacinar +centrobaric +centrobarical +centroclinal +centrode +centrodesmose +centrodesmus +centrodorsal +centrodorsally +centroid +centroidal +centrolecithal +Centrolepidaceae +centrolepidaceous +centrolinead +centrolineal +centromere +centronucleus +centroplasm +Centropomidae +Centropomus +Centrosema +centrosome +centrosomic +Centrosoyus +Centrospermae +centrosphere +centrosymmetric +centrosymmetry +Centrotus +centrum +centry +centum +centumvir +centumviral +centumvirate +Centunculus +centuple +centuplicate +centuplication +centuply +centuria +centurial +centuriate +centuriation +centuriator +centuried +centurion +century +ceorl +ceorlish +cep +cepa +cepaceous +cepe +cephaeline +Cephaelis +Cephalacanthidae +Cephalacanthus +cephalad +cephalagra +cephalalgia +cephalalgic +cephalalgy +cephalanthium +cephalanthous +Cephalanthus +Cephalaspis +Cephalata +cephalate +cephaldemae +cephalemia +cephaletron +Cephaleuros +cephalhematoma +cephalhydrocele +cephalic +cephalin +Cephalina +cephaline +cephalism +cephalitis +cephalization +cephaloauricular +Cephalobranchiata +cephalobranchiate +cephalocathartic +cephalocaudal +cephalocele +cephalocentesis +cephalocercal +Cephalocereus +cephalochord +Cephalochorda +cephalochordal +Cephalochordata +cephalochordate +cephaloclasia +cephaloclast +cephalocone +cephaloconic +cephalocyst +cephalodiscid +Cephalodiscida +Cephalodiscus +cephalodymia +cephalodymus +cephalodynia +cephalofacial +cephalogenesis +cephalogram +cephalograph +cephalohumeral +cephalohumeralis +cephaloid +cephalology +cephalomancy +cephalomant +cephalomelus +cephalomenia +cephalomeningitis +cephalomere +cephalometer +cephalometric +cephalometry +cephalomotor +cephalomyitis +cephalon +cephalonasal +cephalopagus +cephalopathy +cephalopharyngeal +cephalophine +cephalophorous +Cephalophus +cephalophyma +cephaloplegia +cephaloplegic +cephalopod +Cephalopoda +cephalopodan +cephalopodic +cephalopodous +Cephalopterus +cephalorachidian +cephalorhachidian +cephalosome +cephalospinal +Cephalosporium +cephalostyle +Cephalotaceae +cephalotaceous +Cephalotaxus +cephalotheca +cephalothecal +cephalothoracic +cephalothoracopagus +cephalothorax +cephalotome +cephalotomy +cephalotractor +cephalotribe +cephalotripsy +cephalotrocha +Cephalotus +cephalous +Cephas +Cepheid +cephid +Cephidae +Cephus +Cepolidae +ceps +ceptor +cequi +ceraceous +cerago +ceral +ceramal +cerambycid +Cerambycidae +Ceramiaceae +ceramiaceous +ceramic +ceramicite +ceramics +ceramidium +ceramist +Ceramium +ceramographic +ceramography +cerargyrite +ceras +cerasein +cerasin +cerastes +Cerastium +Cerasus +cerata +cerate +ceratectomy +cerated +ceratiasis +ceratiid +Ceratiidae +ceratioid +ceration +ceratite +Ceratites +ceratitic +Ceratitidae +Ceratitis +ceratitoid +Ceratitoidea +Ceratium +Ceratobatrachinae +ceratoblast +ceratobranchial +ceratocricoid +Ceratodidae +Ceratodontidae +Ceratodus +ceratofibrous +ceratoglossal +ceratoglossus +ceratohyal +ceratohyoid +ceratoid +ceratomandibular +ceratomania +Ceratonia +Ceratophrys +Ceratophyllaceae +ceratophyllaceous +Ceratophyllum +Ceratophyta +ceratophyte +Ceratops +Ceratopsia +ceratopsian +ceratopsid +Ceratopsidae +Ceratopteridaceae +ceratopteridaceous +Ceratopteris +ceratorhine +Ceratosa +Ceratosaurus +Ceratospongiae +ceratospongian +Ceratostomataceae +Ceratostomella +ceratotheca +ceratothecal +Ceratozamia +ceraunia +ceraunics +ceraunogram +ceraunograph +ceraunomancy +ceraunophone +ceraunoscope +ceraunoscopy +Cerberean +Cerberic +Cerberus +cercal +cercaria +cercarial +cercarian +cercariform +cercelee +cerci +Cercidiphyllaceae +Cercis +Cercocebus +Cercolabes +Cercolabidae +cercomonad +Cercomonadidae +Cercomonas +cercopid +Cercopidae +cercopithecid +Cercopithecidae +cercopithecoid +Cercopithecus +cercopod +Cercospora +Cercosporella +cercus +Cerdonian +cere +cereal +cerealian +cerealin +cerealism +cerealist +cerealose +cerebella +cerebellar +cerebellifugal +cerebellipetal +cerebellocortex +cerebellopontile +cerebellopontine +cerebellorubral +cerebellospinal +cerebellum +cerebra +cerebral +cerebralgia +cerebralism +cerebralist +cerebralization +cerebralize +cerebrally +cerebrasthenia +cerebrasthenic +cerebrate +cerebration +cerebrational +Cerebratulus +cerebric +cerebricity +cerebriform +cerebriformly +cerebrifugal +cerebrin +cerebripetal +cerebritis +cerebrize +cerebrocardiac +cerebrogalactose +cerebroganglion +cerebroganglionic +cerebroid +cerebrology +cerebroma +cerebromalacia +cerebromedullary +cerebromeningeal +cerebromeningitis +cerebrometer +cerebron +cerebronic +cerebroparietal +cerebropathy +cerebropedal +cerebrophysiology +cerebropontile +cerebropsychosis +cerebrorachidian +cerebrosclerosis +cerebroscope +cerebroscopy +cerebrose +cerebrosensorial +cerebroside +cerebrosis +cerebrospinal +cerebrospinant +cerebrosuria +cerebrotomy +cerebrotonia +cerebrotonic +cerebrovisceral +cerebrum +cerecloth +cered +cereless +cerement +ceremonial +ceremonialism +ceremonialist +ceremonialize +ceremonially +ceremonious +ceremoniously +ceremoniousness +ceremony +cereous +cerer +ceresin +Cereus +cerevis +ceria +Cerialia +cerianthid +Cerianthidae +cerianthoid +Cerianthus +ceric +ceride +ceriferous +cerigerous +cerillo +ceriman +cerin +cerine +Cerinthe +Cerinthian +Ceriomyces +Cerion +Cerionidae +ceriops +Ceriornis +cerise +cerite +Cerithiidae +cerithioid +Cerithium +cerium +cermet +cern +cerniture +cernuous +cero +cerograph +cerographic +cerographist +cerography +ceroline +cerolite +ceroma +ceromancy +cerophilous +ceroplast +ceroplastic +ceroplastics +ceroplasty +cerotate +cerote +cerotene +cerotic +cerotin +cerotype +cerous +ceroxyle +Ceroxylon +cerrero +cerrial +cerris +certain +certainly +certainty +Certhia +Certhiidae +certie +certifiable +certifiableness +certifiably +certificate +certification +certificative +certificator +certificatory +certified +certifier +certify +certiorari +certiorate +certioration +certis +certitude +certosina +certosino +certy +cerule +cerulean +cerulein +ceruleite +ceruleolactite +ceruleous +cerulescent +ceruleum +cerulignol +cerulignone +cerumen +ceruminal +ceruminiferous +ceruminous +cerumniparous +ceruse +cerussite +Cervantist +cervantite +cervical +Cervicapra +cervicaprine +cervicectomy +cervicicardiac +cervicide +cerviciplex +cervicispinal +cervicitis +cervicoauricular +cervicoaxillary +cervicobasilar +cervicobrachial +cervicobregmatic +cervicobuccal +cervicodorsal +cervicodynia +cervicofacial +cervicohumeral +cervicolabial +cervicolingual +cervicolumbar +cervicomuscular +cerviconasal +cervicorn +cervicoscapular +cervicothoracic +cervicovaginal +cervicovesical +cervid +Cervidae +Cervinae +cervine +cervisia +cervisial +cervix +cervoid +cervuline +Cervulus +Cervus +ceryl +Cerynean +Cesare +cesarevitch +cesarolite +cesious +cesium +cespititous +cespitose +cespitosely +cespitulose +cess +cessantly +cessation +cessative +cessavit +cesser +cession +cessionaire +cessionary +cessor +cesspipe +cesspit +cesspool +cest +Cestida +Cestidae +Cestoda +Cestodaria +cestode +cestoid +Cestoidea +cestoidean +Cestracion +cestraciont +Cestraciontes +Cestraciontidae +Cestrian +Cestrum +cestrum +cestus +Cetacea +cetacean +cetaceous +cetaceum +cetane +Cete +cetene +ceterach +ceti +cetic +ceticide +Cetid +cetin +Cetiosauria +cetiosaurian +Cetiosaurus +cetological +cetologist +cetology +Cetomorpha +cetomorphic +Cetonia +cetonian +Cetoniides +Cetoniinae +cetorhinid +Cetorhinidae +cetorhinoid +Cetorhinus +cetotolite +Cetraria +cetraric +cetrarin +Cetus +cetyl +cetylene +cetylic +cevadilla +cevadilline +cevadine +Cevennian +Cevenol +Cevenole +cevine +cevitamic +ceylanite +Ceylon +Ceylonese +ceylonite +ceyssatite +Ceyx +Cezannesque +cha +chaa +chab +chabasie +chabazite +Chablis +chabot +chabouk +chabuk +chabutra +Chac +chacate +chachalaca +Chachapuya +chack +Chackchiuma +chacker +chackle +chackler +chacma +Chaco +chacona +chacte +chad +chadacryst +Chaenactis +Chaenolobus +Chaenomeles +chaeta +Chaetangiaceae +Chaetangium +Chaetetes +Chaetetidae +Chaetifera +chaetiferous +Chaetites +Chaetitidae +Chaetochloa +Chaetodon +chaetodont +chaetodontid +Chaetodontidae +chaetognath +Chaetognatha +chaetognathan +chaetognathous +Chaetophora +Chaetophoraceae +chaetophoraceous +Chaetophorales +chaetophorous +chaetopod +Chaetopoda +chaetopodan +chaetopodous +chaetopterin +Chaetopterus +chaetosema +Chaetosoma +Chaetosomatidae +Chaetosomidae +chaetotactic +chaetotaxy +Chaetura +chafe +chafer +chafery +chafewax +chafeweed +chaff +chaffcutter +chaffer +chafferer +chaffinch +chaffiness +chaffing +chaffingly +chaffless +chafflike +chaffman +chaffseed +chaffwax +chaffweed +chaffy +chaft +chafted +Chaga +chagan +Chagga +chagrin +chaguar +chagul +chahar +chai +Chailletiaceae +chain +chainage +chained +chainer +chainette +chainless +chainlet +chainmaker +chainmaking +chainman +chainon +chainsmith +chainwale +chainwork +chair +chairer +chairless +chairmaker +chairmaking +chairman +chairmanship +chairmender +chairmending +chairwarmer +chairwoman +chais +chaise +chaiseless +Chait +chaitya +chaja +chaka +chakar +chakari +Chakavski +chakazi +chakdar +chakobu +chakra +chakram +chakravartin +chaksi +chal +chalaco +chalana +chalastic +Chalastogastra +chalaza +chalazal +chalaze +chalazian +chalaziferous +chalazion +chalazogam +chalazogamic +chalazogamy +chalazoidite +chalcanthite +Chalcedonian +chalcedonic +chalcedonous +chalcedony +chalcedonyx +chalchuite +chalcid +Chalcidian +Chalcidic +chalcidicum +chalcidid +Chalcididae +chalcidiform +chalcidoid +Chalcidoidea +Chalcioecus +Chalcis +chalcites +chalcocite +chalcograph +chalcographer +chalcographic +chalcographical +chalcographist +chalcography +chalcolite +chalcolithic +chalcomancy +chalcomenite +chalcon +chalcone +chalcophanite +chalcophyllite +chalcopyrite +chalcosiderite +chalcosine +chalcostibite +chalcotrichite +chalcotript +chalcus +Chaldaei +Chaldaic +Chaldaical +Chaldaism +Chaldean +Chaldee +chalder +chaldron +chalet +chalice +chaliced +chalicosis +chalicothere +chalicotheriid +Chalicotheriidae +chalicotherioid +Chalicotherium +Chalina +Chalinidae +chalinine +Chalinitis +chalk +chalkcutter +chalker +chalkiness +chalklike +chalkography +chalkosideric +chalkstone +chalkstony +chalkworker +chalky +challah +challenge +challengeable +challengee +challengeful +challenger +challengingly +challie +challis +challote +chalmer +chalon +chalone +Chalons +chalque +chalta +Chalukya +Chalukyan +chalumeau +chalutz +chalutzim +Chalybean +chalybeate +chalybeous +Chalybes +chalybite +Cham +cham +Chama +Chamacea +Chamacoco +Chamaebatia +Chamaecistus +chamaecranial +Chamaecrista +Chamaecyparis +Chamaedaphne +Chamaeleo +Chamaeleon +Chamaeleontidae +Chamaelirium +Chamaenerion +Chamaepericlymenum +chamaeprosopic +Chamaerops +chamaerrhine +Chamaesaura +Chamaesiphon +Chamaesiphonaceae +Chamaesiphonaceous +Chamaesiphonales +Chamaesyce +chamal +Chamar +chamar +chamber +chamberdeacon +chambered +chamberer +chambering +chamberlain +chamberlainry +chamberlainship +chamberlet +chamberleted +chamberletted +chambermaid +Chambertin +chamberwoman +Chambioa +chambray +chambrel +chambul +chamecephalic +chamecephalous +chamecephalus +chamecephaly +chameleon +chameleonic +chameleonize +chameleonlike +chamfer +chamferer +chamfron +Chamian +Chamicuro +Chamidae +chamisal +chamiso +Chamite +chamite +Chamkanni +chamma +chamois +Chamoisette +chamoisite +chamoline +Chamomilla +Chamorro +Chamos +champ +Champa +champac +champaca +champacol +champagne +champagneless +champagnize +champaign +champain +champaka +champer +champertor +champertous +champerty +champignon +champion +championess +championize +championless +championlike +championship +Champlain +Champlainic +champleve +champy +Chanabal +Chanca +chance +chanceful +chancefully +chancefulness +chancel +chanceled +chanceless +chancellery +chancellor +chancellorate +chancelloress +chancellorism +chancellorship +chancer +chancery +chancewise +chanche +chanchito +chanco +chancre +chancriform +chancroid +chancroidal +chancrous +chancy +chandala +chandam +chandelier +Chandi +chandi +chandler +chandleress +chandlering +chandlery +chandoo +chandu +chandul +Chane +chanfrin +Chang +chang +changa +changar +change +changeability +changeable +changeableness +changeably +changedale +changedness +changeful +changefully +changefulness +changeless +changelessly +changelessness +changeling +changement +changer +Changoan +Changos +Changuina +Changuinan +Chanidae +chank +chankings +channel +channelbill +channeled +channeler +channeling +channelization +channelize +channelled +channeller +channelling +channelwards +channer +chanson +chansonnette +chanst +chant +chantable +chanter +chanterelle +chantership +chantey +chanteyman +chanticleer +chanting +chantingly +chantlate +chantress +chantry +chao +chaogenous +chaology +chaos +chaotic +chaotical +chaotically +chaoticness +Chaouia +chap +Chapacura +Chapacuran +chapah +Chapanec +chaparral +chaparro +chapatty +chapbook +chape +chapeau +chapeaux +chaped +chapel +chapeless +chapelet +chapelgoer +chapelgoing +chapellage +chapellany +chapelman +chapelmaster +chapelry +chapelward +chaperno +chaperon +chaperonage +chaperone +chaperonless +chapfallen +chapin +chapiter +chapitral +chaplain +chaplaincy +chaplainry +chaplainship +chapless +chaplet +chapleted +chapman +chapmanship +chapournet +chapournetted +chappaul +chapped +chapper +chappie +chappin +chapping +chappow +chappy +chaps +chapt +chaptalization +chaptalize +chapter +chapteral +chapterful +chapwoman +char +Chara +charabanc +charabancer +charac +Characeae +characeous +characetum +characin +characine +characinid +Characinidae +characinoid +character +characterful +characterial +characterical +characterism +characterist +characteristic +characteristical +characteristically +characteristicalness +characteristicness +characterizable +characterization +characterize +characterizer +characterless +characterlessness +characterological +characterologist +characterology +charactery +charade +Charadrii +Charadriidae +charadriiform +Charadriiformes +charadrine +charadrioid +Charadriomorphae +Charadrius +Charales +charas +charbon +Charca +charcoal +charcoaly +charcutier +chard +chardock +chare +charer +charet +charette +charge +chargeability +chargeable +chargeableness +chargeably +chargee +chargeless +chargeling +chargeman +charger +chargeship +charging +Charicleia +charier +charily +chariness +chariot +charioted +chariotee +charioteer +charioteership +chariotlike +chariotman +chariotry +chariotway +charism +charisma +charismatic +Charissa +charisticary +charitable +charitableness +charitably +Charites +charity +charityless +charivari +chark +charka +charkha +charkhana +charlady +charlatan +charlatanic +charlatanical +charlatanically +charlatanish +charlatanism +charlatanistic +charlatanry +charlatanship +Charles +Charleston +Charley +Charlie +charlock +Charlotte +charm +charmedly +charmel +charmer +charmful +charmfully +charmfulness +charming +charmingly +charmingness +charmless +charmlessly +charmwise +charnel +charnockite +Charon +Charonian +Charonic +Charontas +Charophyta +charpit +charpoy +charqued +charqui +charr +Charruan +Charruas +charry +charshaf +charsingha +chart +chartaceous +charter +charterable +charterage +chartered +charterer +charterhouse +Charterist +charterless +chartermaster +charthouse +charting +Chartism +Chartist +chartist +chartless +chartographist +chartology +chartometer +chartophylax +chartreuse +Chartreux +chartroom +chartula +chartulary +charuk +charwoman +chary +Charybdian +Charybdis +chasable +chase +chaseable +chaser +Chasidim +chasing +chasm +chasma +chasmal +chasmed +chasmic +chasmogamic +chasmogamous +chasmogamy +chasmophyte +chasmy +chasse +Chasselas +chassepot +chasseur +chassignite +chassis +Chastacosta +chaste +chastely +chasten +chastener +chasteness +chasteningly +chastenment +chasteweed +chastisable +chastise +chastisement +chastiser +chastity +chasuble +chasubled +chat +chataka +Chateau +chateau +chateaux +chatelain +chatelaine +chatelainry +chatellany +chathamite +chati +Chatillon +Chatino +Chatot +chatoyance +chatoyancy +chatoyant +chatsome +chatta +chattable +Chattanooga +Chattanoogan +chattation +chattel +chattelhood +chattelism +chattelization +chattelize +chattelship +chatter +chatteration +chatterbag +chatterbox +chatterer +chattering +chatteringly +chattermag +chattermagging +Chattertonian +chattery +Chatti +chattily +chattiness +chatting +chattingly +chatty +chatwood +Chaucerian +Chauceriana +Chaucerianism +Chaucerism +Chauchat +chaudron +chauffer +chauffeur +chauffeurship +Chaui +chauk +chaukidari +Chauliodes +chaulmoogra +chaulmoograte +chaulmoogric +Chauna +chaus +chausseemeile +Chautauqua +Chautauquan +chaute +chauth +chauvinism +chauvinist +chauvinistic +chauvinistically +Chavante +Chavantean +chavender +chavibetol +chavicin +chavicine +chavicol +chavish +chaw +chawan +chawbacon +chawer +Chawia +chawk +chawl +chawstick +chay +chaya +chayaroot +Chayma +Chayota +chayote +chayroot +chazan +Chazy +che +cheap +cheapen +cheapener +cheapery +cheaping +cheapish +cheaply +cheapness +Cheapside +cheat +cheatable +cheatableness +cheatee +cheater +cheatery +cheating +cheatingly +cheatrie +Chebacco +chebec +chebel +chebog +chebule +chebulinic +Chechehet +Chechen +check +checkable +checkage +checkbird +checkbite +checkbook +checked +checker +checkerbelly +checkerberry +checkerbloom +checkerboard +checkerbreast +checkered +checkerist +checkers +checkerwise +checkerwork +checkhook +checkless +checkman +checkmate +checkoff +checkrack +checkrein +checkroll +checkroom +checkrope +checkrow +checkrowed +checkrower +checkstone +checkstrap +checkstring +checkup +checkweigher +checkwork +checky +cheddaring +cheddite +cheder +chedlock +chee +cheecha +cheechako +cheek +cheekbone +cheeker +cheekily +cheekiness +cheekish +cheekless +cheekpiece +cheeky +cheep +cheeper +cheepily +cheepiness +cheepy +cheer +cheered +cheerer +cheerful +cheerfulize +cheerfully +cheerfulness +cheerfulsome +cheerily +cheeriness +cheering +cheeringly +cheerio +cheerleader +cheerless +cheerlessly +cheerlessness +cheerly +cheery +cheese +cheeseboard +cheesebox +cheeseburger +cheesecake +cheesecloth +cheesecurd +cheesecutter +cheeseflower +cheeselip +cheesemonger +cheesemongering +cheesemongerly +cheesemongery +cheeseparer +cheeseparing +cheeser +cheesery +cheesewood +cheesiness +cheesy +cheet +cheetah +cheeter +cheetie +chef +Chefrinia +chegoe +chegre +Chehalis +Cheilanthes +cheilitis +Cheilodipteridae +Cheilodipterus +Cheilostomata +cheilostomatous +cheir +cheiragra +Cheiranthus +Cheirogaleus +Cheiroglossa +cheirognomy +cheirography +cheirolin +cheirology +cheiromancy +cheiromegaly +cheiropatagium +cheiropodist +cheiropody +cheiropompholyx +Cheiroptera +cheiropterygium +cheirosophy +cheirospasm +Cheirotherium +Cheka +chekan +cheke +cheki +Chekist +chekmak +chela +chelaship +chelate +chelation +chelem +chelerythrine +chelicer +chelicera +cheliceral +chelicerate +chelicere +chelide +chelidon +chelidonate +chelidonian +chelidonic +chelidonine +Chelidonium +Chelidosaurus +Cheliferidea +cheliferous +cheliform +chelingo +cheliped +Chellean +chello +Chelodina +chelodine +chelone +Chelonia +chelonian +chelonid +Chelonidae +cheloniid +Cheloniidae +chelonin +chelophore +chelp +Cheltenham +Chelura +Chelydidae +Chelydra +Chelydridae +chelydroid +chelys +Chemakuan +chemasthenia +chemawinite +Chemehuevi +chemesthesis +chemiatric +chemiatrist +chemiatry +chemic +chemical +chemicalization +chemicalize +chemically +chemicker +chemicoastrological +chemicobiologic +chemicobiology +chemicocautery +chemicodynamic +chemicoengineering +chemicoluminescence +chemicomechanical +chemicomineralogical +chemicopharmaceutical +chemicophysical +chemicophysics +chemicophysiological +chemicovital +chemigraph +chemigraphic +chemigraphy +chemiloon +chemiluminescence +chemiotactic +chemiotaxic +chemiotaxis +chemiotropic +chemiotropism +chemiphotic +chemis +chemise +chemisette +chemism +chemisorb +chemisorption +chemist +chemistry +chemitype +chemitypy +chemoceptor +chemokinesis +chemokinetic +chemolysis +chemolytic +chemolyze +chemoreception +chemoreceptor +chemoreflex +chemoresistance +chemoserotherapy +chemosis +chemosmosis +chemosmotic +chemosynthesis +chemosynthetic +chemotactic +chemotactically +chemotaxis +chemotaxy +chemotherapeutic +chemotherapeutics +chemotherapist +chemotherapy +chemotic +chemotropic +chemotropically +chemotropism +Chemung +chemurgic +chemurgical +chemurgy +Chen +chena +chende +chenevixite +Cheney +cheng +chenica +chenille +cheniller +chenopod +Chenopodiaceae +chenopodiaceous +Chenopodiales +Chenopodium +cheoplastic +chepster +cheque +Chequers +Chera +chercock +cherem +Cheremiss +Cheremissian +cherimoya +cherish +cherishable +cherisher +cherishing +cherishingly +cherishment +Cherkess +Cherkesser +Chermes +Chermidae +Chermish +Chernomorish +chernozem +Cherokee +cheroot +cherried +cherry +cherryblossom +cherrylike +chersonese +Chersydridae +chert +cherte +cherty +cherub +cherubic +cherubical +cherubically +cherubim +cherubimic +cherubimical +cherubin +Cherusci +Chervante +chervil +chervonets +Chesapeake +Cheshire +cheson +chess +chessboard +chessdom +chessel +chesser +chessist +chessman +chessmen +chesstree +chessylite +chest +Chester +chester +chesterfield +Chesterfieldian +chesterlite +chestful +chestily +chestiness +chestnut +chestnutty +chesty +cheth +chettik +chetty +chetverik +chetvert +chevage +cheval +chevalier +chevaline +chevance +cheve +cheven +chevener +chevesaile +chevin +Cheviot +chevisance +chevise +chevon +chevrette +chevron +chevrone +chevronel +chevronelly +chevronwise +chevrony +chevrotain +chevy +chew +chewbark +chewer +chewink +chewstick +chewy +Cheyenne +cheyney +chhatri +chi +chia +Chiam +Chian +Chianti +Chiapanec +Chiapanecan +chiaroscurist +chiaroscuro +chiasm +chiasma +chiasmal +chiasmatype +chiasmatypy +chiasmic +Chiasmodon +chiasmodontid +Chiasmodontidae +chiasmus +chiastic +chiastolite +chiastoneural +chiastoneurous +chiastoneury +chiaus +Chibcha +Chibchan +chibinite +chibouk +chibrit +chic +chicane +chicaner +chicanery +chicaric +chicayote +Chicha +chichi +chichicaste +Chichimec +chichimecan +chichipate +chichipe +chichituna +chick +chickabiddy +chickadee +Chickahominy +Chickamauga +chickaree +Chickasaw +chickasaw +chickell +chicken +chickenberry +chickenbill +chickenbreasted +chickenhearted +chickenheartedly +chickenheartedness +chickenhood +chickenweed +chickenwort +chicker +chickhood +chickling +chickstone +chickweed +chickwit +chicky +chicle +chicness +Chico +chico +Chicomecoatl +chicory +chicot +chicote +chicqued +chicquer +chicquest +chicquing +chid +chidden +chide +chider +chiding +chidingly +chidingness +chidra +chief +chiefdom +chiefery +chiefess +chiefest +chiefish +chiefless +chiefling +chiefly +chiefship +chieftain +chieftaincy +chieftainess +chieftainry +chieftainship +chieftess +chield +Chien +chien +chiffer +chiffon +chiffonade +chiffonier +chiffony +chifforobe +chigetai +chiggak +chigger +chiggerweed +chignon +chignoned +chigoe +chih +chihfu +Chihuahua +chikara +chil +chilacavote +chilalgia +chilarium +chilblain +Chilcat +child +childbearing +childbed +childbirth +childcrowing +childe +childed +Childermas +childhood +childing +childish +childishly +childishness +childkind +childless +childlessness +childlike +childlikeness +childly +childness +childrenite +childridden +childship +childward +chile +Chilean +Chileanization +Chileanize +chilectropion +chilenite +chili +chiliad +chiliadal +chiliadic +chiliagon +chiliahedron +chiliarch +chiliarchia +chiliarchy +chiliasm +chiliast +chiliastic +chilicote +chilicothe +chilidium +Chilina +Chilinidae +chiliomb +Chilion +chilitis +Chilkat +chill +chilla +chillagite +chilled +chiller +chillily +chilliness +chilling +chillingly +chillish +Chilliwack +chillness +chillo +chillroom +chillsome +chillum +chillumchee +chilly +chilognath +Chilognatha +chilognathan +chilognathous +chilogrammo +chiloma +Chilomastix +chiloncus +chiloplasty +chilopod +Chilopoda +chilopodan +chilopodous +Chilopsis +Chilostoma +Chilostomata +chilostomatous +chilostome +chilotomy +Chiltern +chilver +chimaera +chimaerid +Chimaeridae +chimaeroid +Chimaeroidei +Chimakuan +Chimakum +Chimalakwe +Chimalapa +Chimane +chimango +Chimaphila +Chimarikan +Chimariko +chimble +chime +chimer +chimera +chimeric +chimerical +chimerically +chimericalness +chimesmaster +chiminage +Chimmesyan +chimney +chimneyhead +chimneyless +chimneyman +Chimonanthus +chimopeelagic +chimpanzee +Chimu +Chin +chin +china +chinaberry +chinalike +Chinaman +chinamania +chinamaniac +chinampa +chinanta +Chinantecan +Chinantecs +chinaphthol +chinar +chinaroot +Chinatown +chinaware +chinawoman +chinband +chinch +chincha +Chinchasuyu +chinchayote +chinche +chincherinchee +chinchilla +chinching +chincloth +chincough +chine +chined +Chinee +Chinese +Chinesery +ching +chingma +Chingpaw +Chinhwan +chinik +chinin +Chink +chink +chinkara +chinker +chinkerinchee +chinking +chinkle +chinks +chinky +chinless +chinnam +chinned +chinny +chino +chinoa +chinol +Chinook +Chinookan +chinotoxine +chinotti +chinpiece +chinquapin +chinse +chint +chintz +chinwood +Chiococca +chiococcine +Chiogenes +chiolite +chionablepsia +Chionanthus +Chionaspis +Chionididae +Chionis +Chionodoxa +Chiot +chiotilla +chip +chipchap +chipchop +Chipewyan +chiplet +chipling +chipmunk +chippable +chippage +chipped +Chippendale +chipper +chipping +chippy +chips +chipwood +Chiquitan +Chiquito +chiragra +chiral +chiralgia +chirality +chirapsia +chirarthritis +chirata +Chiriana +Chiricahua +Chiriguano +chirimen +Chirino +chirinola +chiripa +chirivita +chirk +chirm +chiro +chirocosmetics +chirogale +chirognomic +chirognomically +chirognomist +chirognomy +chirognostic +chirograph +chirographary +chirographer +chirographic +chirographical +chirography +chirogymnast +chirological +chirologically +chirologist +chirology +chiromance +chiromancer +chiromancist +chiromancy +chiromant +chiromantic +chiromantical +Chiromantis +chiromegaly +chirometer +Chiromyidae +Chiromys +Chiron +chironomic +chironomid +Chironomidae +Chironomus +chironomy +chironym +chiropatagium +chiroplasty +chiropod +chiropodial +chiropodic +chiropodical +chiropodist +chiropodistry +chiropodous +chiropody +chiropompholyx +chiropractic +chiropractor +chiropraxis +chiropter +Chiroptera +chiropteran +chiropterite +chiropterophilous +chiropterous +chiropterygian +chiropterygious +chiropterygium +chirosophist +chirospasm +Chirotes +chirotherian +Chirotherium +chirothesia +chirotonsor +chirotonsory +chirotony +chirotype +chirp +chirper +chirpily +chirpiness +chirping +chirpingly +chirpling +chirpy +chirr +chirrup +chirruper +chirrupy +chirurgeon +chirurgery +Chisedec +chisel +chiseled +chiseler +chisellike +chiselly +chiselmouth +chit +Chita +chitak +chital +chitchat +chitchatty +Chitimacha +Chitimachan +chitin +chitinization +chitinized +chitinocalcareous +chitinogenous +chitinoid +chitinous +chiton +chitosamine +chitosan +chitose +chitra +Chitrali +chittamwood +chitter +chitterling +chitty +chivalresque +chivalric +chivalrous +chivalrously +chivalrousness +chivalry +chive +chivey +chiviatite +Chiwere +chkalik +chladnite +chlamyd +chlamydate +chlamydeous +Chlamydobacteriaceae +chlamydobacteriaceous +Chlamydobacteriales +Chlamydomonadaceae +Chlamydomonadidae +Chlamydomonas +Chlamydosaurus +Chlamydoselachidae +Chlamydoselachus +chlamydospore +Chlamydozoa +chlamydozoan +chlamyphore +Chlamyphorus +chlamys +Chleuh +chloanthite +chloasma +Chloe +chlor +chloracetate +chloragogen +chloral +chloralformamide +chloralide +chloralism +chloralization +chloralize +chloralose +chloralum +chloramide +chloramine +chloramphenicol +chloranemia +chloranemic +chloranhydride +chloranil +Chloranthaceae +chloranthaceous +Chloranthus +chloranthy +chlorapatite +chlorastrolite +chlorate +chlorazide +chlorcosane +chlordan +chlordane +chlore +Chlorella +Chlorellaceae +chlorellaceous +chloremia +chlorenchyma +chlorhydrate +chlorhydric +chloric +chloridate +chloridation +chloride +Chloridella +Chloridellidae +chlorider +chloridize +chlorimeter +chlorimetric +chlorimetry +chlorinate +chlorination +chlorinator +chlorine +chlorinize +chlorinous +chloriodide +Chlorion +Chlorioninae +chlorite +chloritic +chloritization +chloritize +chloritoid +chlorize +chlormethane +chlormethylic +chloroacetate +chloroacetic +chloroacetone +chloroacetophenone +chloroamide +chloroamine +chloroanaemia +chloroanemia +chloroaurate +chloroauric +chloroaurite +chlorobenzene +chlorobromide +chlorocalcite +chlorocarbonate +chlorochromates +chlorochromic +chlorochrous +Chlorococcaceae +Chlorococcales +Chlorococcum +Chlorococcus +chlorocresol +chlorocruorin +chlorodize +chloroform +chloroformate +chloroformic +chloroformism +chloroformist +chloroformization +chloroformize +chlorogenic +chlorogenine +chlorohydrin +chlorohydrocarbon +chloroiodide +chloroleucite +chloroma +chloromelanite +chlorometer +chloromethane +chlorometric +chlorometry +Chloromycetin +chloronitrate +chloropal +chloropalladates +chloropalladic +chlorophane +chlorophenol +chlorophoenicite +Chlorophora +Chlorophyceae +chlorophyceous +chlorophyl +chlorophyll +chlorophyllaceous +chlorophyllan +chlorophyllase +chlorophyllian +chlorophyllide +chlorophylliferous +chlorophylligenous +chlorophylligerous +chlorophyllin +chlorophyllite +chlorophylloid +chlorophyllose +chlorophyllous +chloropia +chloropicrin +chloroplast +chloroplastic +chloroplastid +chloroplatinate +chloroplatinic +chloroplatinite +chloroplatinous +chloroprene +chloropsia +chloroquine +chlorosilicate +chlorosis +chlorospinel +chlorosulphonic +chlorotic +chlorous +chlorozincate +chlorsalol +chloryl +Chnuphis +cho +choachyte +choana +choanate +Choanephora +choanocytal +choanocyte +Choanoflagellata +choanoflagellate +Choanoflagellida +Choanoflagellidae +choanoid +choanophorous +choanosomal +choanosome +choate +choaty +chob +choca +chocard +Chocho +chocho +chock +chockablock +chocker +chockler +chockman +Choco +Chocoan +chocolate +Choctaw +choel +choenix +Choeropsis +Choes +choffer +choga +chogak +chogset +Choiak +choice +choiceful +choiceless +choicelessness +choicely +choiceness +choicy +choil +choiler +choir +choirboy +choirlike +choirman +choirmaster +choirwise +Choisya +chokage +choke +chokeberry +chokebore +chokecherry +chokedamp +choker +chokered +chokerman +chokestrap +chokeweed +chokidar +choking +chokingly +chokra +choky +Chol +chol +Chola +chola +cholagogic +cholagogue +cholalic +cholane +cholangioitis +cholangitis +cholanic +cholanthrene +cholate +chold +choleate +cholecyanine +cholecyst +cholecystalgia +cholecystectasia +cholecystectomy +cholecystenterorrhaphy +cholecystenterostomy +cholecystgastrostomy +cholecystic +cholecystitis +cholecystnephrostomy +cholecystocolostomy +cholecystocolotomy +cholecystoduodenostomy +cholecystogastrostomy +cholecystogram +cholecystography +cholecystoileostomy +cholecystojejunostomy +cholecystokinin +cholecystolithiasis +cholecystolithotripsy +cholecystonephrostomy +cholecystopexy +cholecystorrhaphy +cholecystostomy +cholecystotomy +choledoch +choledochal +choledochectomy +choledochitis +choledochoduodenostomy +choledochoenterostomy +choledocholithiasis +choledocholithotomy +choledocholithotripsy +choledochoplasty +choledochorrhaphy +choledochostomy +choledochotomy +cholehematin +choleic +choleine +choleinic +cholelith +cholelithiasis +cholelithic +cholelithotomy +cholelithotripsy +cholelithotrity +cholemia +choleokinase +cholepoietic +choler +cholera +choleraic +choleric +cholericly +cholericness +choleriform +cholerigenous +cholerine +choleroid +choleromania +cholerophobia +cholerrhagia +cholestane +cholestanol +cholesteatoma +cholesteatomatous +cholestene +cholesterate +cholesteremia +cholesteric +cholesterin +cholesterinemia +cholesterinic +cholesterinuria +cholesterol +cholesterolemia +cholesteroluria +cholesterosis +cholesteryl +choletelin +choletherapy +choleuria +choli +choliamb +choliambic +choliambist +cholic +choline +cholinergic +cholinesterase +cholinic +cholla +choller +Cholo +cholochrome +cholocyanine +Choloepus +chologenetic +choloidic +choloidinic +chololith +chololithic +Cholonan +Cholones +cholophein +cholorrhea +choloscopy +cholterheaded +cholum +choluria +Choluteca +chomp +chondral +chondralgia +chondrarsenite +chondre +chondrectomy +chondrenchyma +chondric +chondrification +chondrify +chondrigen +chondrigenous +Chondrilla +chondrin +chondrinous +chondriocont +chondriome +chondriomere +chondriomite +chondriosomal +chondriosome +chondriosphere +chondrite +chondritic +chondritis +chondroadenoma +chondroalbuminoid +chondroangioma +chondroarthritis +chondroblast +chondroblastoma +chondrocarcinoma +chondrocele +chondroclasis +chondroclast +chondrocoracoid +chondrocostal +chondrocranial +chondrocranium +chondrocyte +chondrodite +chondroditic +chondrodynia +chondrodystrophia +chondrodystrophy +chondroendothelioma +chondroepiphysis +chondrofetal +chondrofibroma +chondrofibromatous +Chondroganoidei +chondrogen +chondrogenesis +chondrogenetic +chondrogenous +chondrogeny +chondroglossal +chondroglossus +chondrography +chondroid +chondroitic +chondroitin +chondrolipoma +chondrology +chondroma +chondromalacia +chondromatous +chondromucoid +Chondromyces +chondromyoma +chondromyxoma +chondromyxosarcoma +chondropharyngeal +chondropharyngeus +chondrophore +chondrophyte +chondroplast +chondroplastic +chondroplasty +chondroprotein +chondropterygian +Chondropterygii +chondropterygious +chondrosamine +chondrosarcoma +chondrosarcomatous +chondroseptum +chondrosin +chondrosis +chondroskeleton +chondrostean +Chondrostei +chondrosteoma +chondrosteous +chondrosternal +chondrotome +chondrotomy +chondroxiphoid +chondrule +chondrus +chonolith +chonta +Chontal +Chontalan +Chontaquiro +chontawood +choop +choosable +choosableness +choose +chooser +choosing +choosingly +choosy +chop +chopa +chopboat +chopfallen +chophouse +chopin +chopine +choplogic +chopped +chopper +choppered +chopping +choppy +chopstick +Chopunnish +Chora +choragic +choragion +choragium +choragus +choragy +Chorai +choral +choralcelo +choraleon +choralist +chorally +Chorasmian +chord +chorda +Chordaceae +chordacentrous +chordacentrum +chordaceous +chordal +chordally +chordamesoderm +Chordata +chordate +chorded +Chordeiles +chorditis +chordoid +chordomesoderm +chordotomy +chordotonal +chore +chorea +choreal +choreatic +choree +choregic +choregus +choregy +choreic +choreiform +choreograph +choreographer +choreographic +choreographical +choreography +choreoid +choreomania +chorepiscopal +chorepiscopus +choreus +choreutic +chorial +choriamb +choriambic +choriambize +choriambus +choric +chorine +chorioadenoma +chorioallantoic +chorioallantoid +chorioallantois +choriocapillaris +choriocapillary +choriocarcinoma +choriocele +chorioepithelioma +chorioid +chorioidal +chorioiditis +chorioidocyclitis +chorioidoiritis +chorioidoretinitis +chorioma +chorion +chorionepithelioma +chorionic +Chorioptes +chorioptic +chorioretinal +chorioretinitis +Choripetalae +choripetalous +choriphyllous +chorisepalous +chorisis +chorism +chorist +choristate +chorister +choristership +choristic +choristoblastoma +choristoma +choristry +chorization +chorizont +chorizontal +chorizontes +chorizontic +chorizontist +chorogi +chorograph +chorographer +chorographic +chorographical +chorographically +chorography +choroid +choroidal +choroidea +choroiditis +choroidocyclitis +choroidoiritis +choroidoretinitis +chorological +chorologist +chorology +choromania +choromanic +chorometry +chorook +Chorotega +Choroti +chort +chorten +Chorti +chortle +chortler +chortosterol +chorus +choruser +choruslike +Chorwat +choryos +chose +chosen +chott +Chou +Chouan +Chouanize +chouette +chough +chouka +choultry +choup +chouquette +chous +chouse +chouser +chousingha +chow +Chowanoc +chowchow +chowder +chowderhead +chowderheaded +chowk +chowry +choya +choyroot +Chozar +chrematheism +chrematist +chrematistic +chrematistics +chreotechnics +chresmology +chrestomathic +chrestomathics +chrestomathy +chria +chrimsel +Chris +chrism +chrisma +chrismal +chrismary +chrismatine +chrismation +chrismatite +chrismatize +chrismatory +chrismon +chrisom +chrisomloosing +chrisroot +Chrissie +Christ +Christabel +Christadelphian +Christadelphianism +christcross +Christdom +Christed +christen +Christendie +Christendom +christened +christener +christening +Christenmas +Christhood +Christiad +Christian +Christiana +Christiania +Christianiadeal +Christianism +christianite +Christianity +Christianization +Christianize +Christianizer +Christianlike +Christianly +Christianness +Christianogentilism +Christianography +Christianomastix +Christianopaganism +Christicide +Christie +Christiform +Christina +Christine +Christless +Christlessness +Christlike +Christlikeness +Christliness +Christly +Christmas +Christmasberry +Christmasing +Christmastide +Christmasy +Christocentric +Christogram +Christolatry +Christological +Christologist +Christology +Christophany +Christopher +Christos +chroatol +Chrobat +chroma +chromaffin +chromaffinic +chromammine +chromaphil +chromaphore +chromascope +chromate +chromatic +chromatical +chromatically +chromatician +chromaticism +chromaticity +chromatics +chromatid +chromatin +chromatinic +Chromatioideae +chromatism +chromatist +Chromatium +chromatize +chromatocyte +chromatodysopia +chromatogenous +chromatogram +chromatograph +chromatographic +chromatography +chromatoid +chromatology +chromatolysis +chromatolytic +chromatometer +chromatone +chromatopathia +chromatopathic +chromatopathy +chromatophil +chromatophile +chromatophilia +chromatophilic +chromatophilous +chromatophobia +chromatophore +chromatophoric +chromatophorous +chromatoplasm +chromatopsia +chromatoptometer +chromatoptometry +chromatoscope +chromatoscopy +chromatosis +chromatosphere +chromatospheric +chromatrope +chromaturia +chromatype +chromazurine +chromdiagnosis +chrome +chromene +chromesthesia +chromic +chromicize +chromid +Chromidae +Chromides +chromidial +Chromididae +chromidiogamy +chromidiosome +chromidium +chromidrosis +chromiferous +chromiole +chromism +chromite +chromitite +chromium +chromo +Chromobacterieae +Chromobacterium +chromoblast +chromocenter +chromocentral +chromochalcographic +chromochalcography +chromocollograph +chromocollographic +chromocollography +chromocollotype +chromocollotypy +chromocratic +chromocyte +chromocytometer +chromodermatosis +chromodiascope +chromogen +chromogene +chromogenesis +chromogenetic +chromogenic +chromogenous +chromogram +chromograph +chromoisomer +chromoisomeric +chromoisomerism +chromoleucite +chromolipoid +chromolith +chromolithic +chromolithograph +chromolithographer +chromolithographic +chromolithography +chromolysis +chromomere +chromometer +chromone +chromonema +chromoparous +chromophage +chromophane +chromophile +chromophilic +chromophilous +chromophobic +chromophore +chromophoric +chromophorous +chromophotograph +chromophotographic +chromophotography +chromophotolithograph +chromophyll +chromoplasm +chromoplasmic +chromoplast +chromoplastid +chromoprotein +chromopsia +chromoptometer +chromoptometrical +chromosantonin +chromoscope +chromoscopic +chromoscopy +chromosomal +chromosome +chromosphere +chromospheric +chromotherapist +chromotherapy +chromotrope +chromotropic +chromotropism +chromotropy +chromotype +chromotypic +chromotypographic +chromotypography +chromotypy +chromous +chromoxylograph +chromoxylography +chromule +chromy +chromyl +chronal +chronanagram +chronaxia +chronaxie +chronaxy +chronic +chronical +chronically +chronicity +chronicle +chronicler +chronicon +chronisotherm +chronist +chronobarometer +chronocinematography +chronocrator +chronocyclegraph +chronodeik +chronogeneous +chronogenesis +chronogenetic +chronogram +chronogrammatic +chronogrammatical +chronogrammatically +chronogrammatist +chronogrammic +chronograph +chronographer +chronographic +chronographical +chronographically +chronography +chronoisothermal +chronologer +chronologic +chronological +chronologically +chronologist +chronologize +chronology +chronomancy +chronomantic +chronometer +chronometric +chronometrical +chronometrically +chronometry +chrononomy +chronopher +chronophotograph +chronophotographic +chronophotography +Chronos +chronoscope +chronoscopic +chronoscopically +chronoscopy +chronosemic +chronostichon +chronothermal +chronothermometer +chronotropic +chronotropism +Chroococcaceae +chroococcaceous +Chroococcales +chroococcoid +Chroococcus +Chrosperma +chrotta +chrysal +chrysalid +chrysalidal +chrysalides +chrysalidian +chrysaline +chrysalis +chrysaloid +chrysamine +chrysammic +chrysamminic +Chrysamphora +chrysaniline +chrysanisic +chrysanthemin +chrysanthemum +chrysanthous +Chrysaor +chrysarobin +chrysatropic +chrysazin +chrysazol +chryselectrum +chryselephantine +Chrysemys +chrysene +chrysenic +chrysid +Chrysidella +chrysidid +Chrysididae +chrysin +Chrysippus +Chrysis +chrysoaristocracy +Chrysobalanaceae +Chrysobalanus +chrysoberyl +chrysobull +chrysocarpous +chrysochlore +Chrysochloridae +Chrysochloris +chrysochlorous +chrysochrous +chrysocolla +chrysocracy +chrysoeriol +chrysogen +chrysograph +chrysographer +chrysography +chrysohermidin +chrysoidine +chrysolite +chrysolitic +chrysology +Chrysolophus +chrysomelid +Chrysomelidae +chrysomonad +Chrysomonadales +Chrysomonadina +chrysomonadine +Chrysomyia +Chrysopa +chrysopal +chrysopee +chrysophan +chrysophanic +Chrysophanus +chrysophenine +chrysophilist +chrysophilite +Chrysophlyctis +chrysophyll +Chrysophyllum +chrysopid +Chrysopidae +chrysopoeia +chrysopoetic +chrysopoetics +chrysoprase +Chrysops +Chrysopsis +chrysorin +chrysosperm +Chrysosplenium +Chrysothamnus +Chrysothrix +chrysotile +Chrysotis +chrystocrene +chthonian +chthonic +chthonophagia +chthonophagy +chub +chubbed +chubbedness +chubbily +chubbiness +chubby +Chuchona +chuck +chucker +chuckhole +chuckies +chucking +chuckingly +chuckle +chucklehead +chuckleheaded +chuckler +chucklingly +chuckrum +chuckstone +chuckwalla +chucky +Chud +chuddar +Chude +Chudic +Chueta +chufa +chuff +chuffy +chug +chugger +chuhra +Chuje +chukar +Chukchi +chukker +chukor +chulan +chullpa +chum +Chumashan +Chumawi +chummage +chummer +chummery +chummily +chummy +chump +chumpaka +chumpish +chumpishness +Chumpivilca +chumpy +chumship +Chumulu +Chun +chun +chunari +Chuncho +chunga +chunk +chunkhead +chunkily +chunkiness +chunky +chunner +chunnia +chunter +chupak +chupon +chuprassie +chuprassy +church +churchanity +churchcraft +churchdom +churchful +churchgoer +churchgoing +churchgrith +churchianity +churchified +churchiness +churching +churchish +churchism +churchite +churchless +churchlet +churchlike +churchliness +churchly +churchman +churchmanly +churchmanship +churchmaster +churchscot +churchward +churchwarden +churchwardenism +churchwardenize +churchwardenship +churchwards +churchway +churchwise +churchwoman +churchy +churchyard +churel +churinga +churl +churled +churlhood +churlish +churlishly +churlishness +churly +churm +churn +churnability +churnful +churning +churnmilk +churnstaff +Churoya +Churoyan +churr +Churrigueresque +churruck +churrus +churrworm +chut +chute +chuter +chutney +Chuvash +Chwana +chyack +chyak +chylaceous +chylangioma +chylaqueous +chyle +chylemia +chylidrosis +chylifaction +chylifactive +chylifactory +chyliferous +chylific +chylification +chylificatory +chyliform +chylify +chylocaulous +chylocauly +chylocele +chylocyst +chyloid +chylomicron +chylopericardium +chylophyllous +chylophylly +chylopoiesis +chylopoietic +chylosis +chylothorax +chylous +chyluria +chymaqueous +chymase +chyme +chymia +chymic +chymiferous +chymification +chymify +chymosin +chymosinogen +chymotrypsin +chymotrypsinogen +chymous +chypre +chytra +chytrid +Chytridiaceae +chytridiaceous +chytridial +Chytridiales +chytridiose +chytridiosis +Chytridium +Chytroi +cibarial +cibarian +cibarious +cibation +cibol +Cibola +Cibolan +Ciboney +cibophobia +ciborium +cibory +ciboule +cicad +cicada +Cicadellidae +cicadid +Cicadidae +cicala +cicatrice +cicatrices +cicatricial +cicatricle +cicatricose +cicatricula +cicatricule +cicatrisive +cicatrix +cicatrizant +cicatrizate +cicatrization +cicatrize +cicatrizer +cicatrose +Cicely +cicely +cicer +ciceronage +cicerone +ciceroni +Ciceronian +Ciceronianism +Ciceronianize +Ciceronic +Ciceronically +ciceronism +ciceronize +cichlid +Cichlidae +cichloid +cichoraceous +Cichoriaceae +cichoriaceous +Cichorium +Cicindela +cicindelid +cicindelidae +cicisbeism +ciclatoun +Ciconia +Ciconiae +ciconian +ciconiid +Ciconiidae +ciconiiform +Ciconiiformes +ciconine +ciconioid +Cicuta +cicutoxin +Cid +cidarid +Cidaridae +cidaris +Cidaroida +cider +ciderish +ciderist +ciderkin +cig +cigala +cigar +cigaresque +cigarette +cigarfish +cigarillo +cigarito +cigarless +cigua +ciguatera +cilectomy +cilia +ciliary +Ciliata +ciliate +ciliated +ciliately +ciliation +cilice +Cilician +cilicious +Cilicism +ciliella +ciliferous +ciliform +ciliiferous +ciliiform +Cilioflagellata +cilioflagellate +ciliograde +ciliolate +ciliolum +Ciliophora +cilioretinal +cilioscleral +ciliospinal +ciliotomy +cilium +cillosis +cimbia +Cimbri +Cimbrian +Cimbric +cimelia +cimex +cimicid +Cimicidae +cimicide +cimiciform +Cimicifuga +cimicifugin +cimicoid +ciminite +cimline +Cimmeria +Cimmerian +Cimmerianism +cimolite +cinch +cincher +cincholoipon +cincholoiponic +cinchomeronic +Cinchona +Cinchonaceae +cinchonaceous +cinchonamine +cinchonate +cinchonia +cinchonic +cinchonicine +cinchonidia +cinchonidine +cinchonine +cinchoninic +cinchonism +cinchonization +cinchonize +cinchonology +cinchophen +cinchotine +cinchotoxine +cincinnal +Cincinnati +Cincinnatia +Cincinnatian +cincinnus +Cinclidae +Cinclidotus +cinclis +Cinclus +cinct +cincture +cinder +Cinderella +cinderlike +cinderman +cinderous +cindery +cine +cinecamera +cinefilm +cinel +cinema +Cinemascope +cinematic +cinematical +cinematically +cinematize +cinematograph +cinematographer +cinematographic +cinematographical +cinematographically +cinematographist +cinematography +cinemelodrama +cinemize +cinemograph +cinenchyma +cinenchymatous +cinene +cinenegative +cineole +cineolic +cinephone +cinephotomicrography +cineplastics +cineplasty +cineraceous +Cinerama +Cineraria +cinerarium +cinerary +cineration +cinerator +cinerea +cinereal +cinereous +cineritious +cinevariety +cingle +cingular +cingulate +cingulated +cingulum +cinnabar +cinnabaric +cinnabarine +cinnamal +cinnamaldehyde +cinnamate +cinnamein +cinnamene +cinnamenyl +cinnamic +Cinnamodendron +cinnamol +cinnamomic +Cinnamomum +cinnamon +cinnamoned +cinnamonic +cinnamonlike +cinnamonroot +cinnamonwood +cinnamyl +cinnamylidene +cinnoline +cinnyl +cinquain +cinque +cinquecentism +cinquecentist +cinquecento +cinquefoil +cinquefoiled +cinquepace +cinter +Cinura +cinuran +cinurous +cion +cionectomy +cionitis +cionocranial +cionocranian +cionoptosis +cionorrhaphia +cionotome +cionotomy +Cipango +cipher +cipherable +cipherdom +cipherer +cipherhood +cipo +cipolin +cippus +circa +Circaea +Circaeaceae +Circaetus +Circassian +Circassic +Circe +Circean +Circensian +circinal +circinate +circinately +circination +Circinus +circiter +circle +circled +circler +circlet +circlewise +circling +circovarian +circuit +circuitable +circuital +circuiteer +circuiter +circuition +circuitman +circuitor +circuitous +circuitously +circuitousness +circuity +circulable +circulant +circular +circularism +circularity +circularization +circularize +circularizer +circularly +circularness +circularwise +circulate +circulation +circulative +circulator +circulatory +circumagitate +circumagitation +circumambages +circumambagious +circumambience +circumambiency +circumambient +circumambulate +circumambulation +circumambulator +circumambulatory +circumanal +circumantarctic +circumarctic +circumarticular +circumaviate +circumaviation +circumaviator +circumaxial +circumaxile +circumaxillary +circumbasal +circumbendibus +circumboreal +circumbuccal +circumbulbar +circumcallosal +Circumcellion +circumcenter +circumcentral +circumcinct +circumcincture +circumcircle +circumcise +circumciser +circumcision +circumclude +circumclusion +circumcolumnar +circumcone +circumconic +circumcorneal +circumcrescence +circumcrescent +circumdenudation +circumdiction +circumduce +circumduct +circumduction +circumesophagal +circumesophageal +circumference +circumferential +circumferentially +circumferentor +circumflant +circumflect +circumflex +circumflexion +circumfluence +circumfluent +circumfluous +circumforaneous +circumfulgent +circumfuse +circumfusile +circumfusion +circumgenital +circumgyrate +circumgyration +circumgyratory +circumhorizontal +circumincession +circuminsession +circuminsular +circumintestinal +circumitineration +circumjacence +circumjacency +circumjacent +circumlental +circumlitio +circumlittoral +circumlocute +circumlocution +circumlocutional +circumlocutionary +circumlocutionist +circumlocutory +circummeridian +circummeridional +circummigration +circummundane +circummure +circumnatant +circumnavigable +circumnavigate +circumnavigation +circumnavigator +circumnavigatory +circumneutral +circumnuclear +circumnutate +circumnutation +circumnutatory +circumocular +circumoesophagal +circumoral +circumorbital +circumpacific +circumpallial +circumparallelogram +circumpentagon +circumplicate +circumplication +circumpolar +circumpolygon +circumpose +circumposition +circumradius +circumrenal +circumrotate +circumrotation +circumrotatory +circumsail +circumscissile +circumscribable +circumscribe +circumscribed +circumscriber +circumscript +circumscription +circumscriptive +circumscriptively +circumscriptly +circumsinous +circumspangle +circumspatial +circumspect +circumspection +circumspective +circumspectively +circumspectly +circumspectness +circumspheral +circumstance +circumstanced +circumstantiability +circumstantiable +circumstantial +circumstantiality +circumstantially +circumstantialness +circumstantiate +circumstantiation +circumtabular +circumterraneous +circumterrestrial +circumtonsillar +circumtropical +circumumbilical +circumundulate +circumundulation +circumvallate +circumvallation +circumvascular +circumvent +circumventer +circumvention +circumventive +circumventor +circumviate +circumvolant +circumvolute +circumvolution +circumvolutory +circumvolve +circumzenithal +circus +circusy +cirque +cirrate +cirrated +Cirratulidae +Cirratulus +Cirrhopetalum +cirrhosed +cirrhosis +cirrhotic +cirrhous +cirri +cirribranch +cirriferous +cirriform +cirrigerous +cirrigrade +cirriped +Cirripedia +cirripedial +cirrolite +cirropodous +cirrose +Cirrostomi +cirrous +cirrus +cirsectomy +Cirsium +cirsocele +cirsoid +cirsomphalos +cirsophthalmia +cirsotome +cirsotomy +ciruela +cirurgian +Cisalpine +cisalpine +Cisalpinism +cisandine +cisatlantic +cisco +cise +cisele +cisgangetic +cisjurane +cisleithan +cismarine +Cismontane +cismontane +Cismontanism +cisoceanic +cispadane +cisplatine +cispontine +cisrhenane +Cissampelos +cissing +cissoid +cissoidal +Cissus +cist +cista +Cistaceae +cistaceous +cistae +cisted +Cistercian +Cistercianism +cistern +cisterna +cisternal +cistic +cistophoric +cistophorus +Cistudo +Cistus +cistvaen +cit +citable +citadel +citation +citator +citatory +cite +citee +Citellus +citer +citess +cithara +Citharexylum +citharist +citharista +citharoedi +citharoedic +citharoedus +cither +citied +citification +citified +citify +Citigradae +citigrade +citizen +citizendom +citizeness +citizenhood +citizenish +citizenism +citizenize +citizenly +citizenry +citizenship +citole +citraconate +citraconic +citral +citramide +citramontane +citrange +citrangeade +citrate +citrated +citrean +citrene +citreous +citric +citriculture +citriculturist +citril +citrin +citrination +citrine +citrinin +citrinous +citrometer +Citromyces +citron +citronade +citronella +citronellal +citronelle +citronellic +citronellol +citronin +citronwood +Citropsis +citropten +citrous +citrullin +Citrullus +Citrus +citrus +citrylidene +cittern +citua +city +citycism +citydom +cityfolk +cityful +cityish +cityless +cityness +cityscape +cityward +citywards +cive +civet +civetlike +civetone +civic +civically +civicism +civics +civil +civilian +civility +civilizable +civilization +civilizational +civilizatory +civilize +civilized +civilizedness +civilizee +civilizer +civilly +civilness +civism +Civitan +civvy +cixiid +Cixiidae +Cixo +clabber +clabbery +clachan +clack +Clackama +clackdish +clacker +clacket +clackety +clad +cladanthous +cladautoicous +cladding +cladine +cladocarpous +Cladocera +cladoceran +cladocerous +cladode +cladodial +cladodont +cladodontid +Cladodontidae +Cladodus +cladogenous +Cladonia +Cladoniaceae +cladoniaceous +cladonioid +Cladophora +Cladophoraceae +cladophoraceous +Cladophorales +cladophyll +cladophyllum +cladoptosis +cladose +Cladoselache +Cladoselachea +cladoselachian +Cladoselachidae +cladosiphonic +Cladosporium +Cladothrix +Cladrastis +cladus +clag +claggum +claggy +Claiborne +Claibornian +claim +claimable +claimant +claimer +claimless +clairaudience +clairaudient +clairaudiently +clairce +clairecole +clairecolle +clairschach +clairschacher +clairsentience +clairsentient +clairvoyance +clairvoyancy +clairvoyant +clairvoyantly +claith +claithes +claiver +Clallam +clam +clamant +clamantly +clamative +Clamatores +clamatorial +clamatory +clamb +clambake +clamber +clamberer +clamcracker +clame +clamer +clammed +clammer +clammily +clamminess +clamming +clammish +clammy +clammyweed +clamor +clamorer +clamorist +clamorous +clamorously +clamorousness +clamorsome +clamp +clamper +clamshell +clamworm +clan +clancular +clancularly +clandestine +clandestinely +clandestineness +clandestinity +clanfellow +clang +clangful +clangingly +clangor +clangorous +clangorously +Clangula +clanjamfray +clanjamfrey +clanjamfrie +clanjamphrey +clank +clankety +clanking +clankingly +clankingness +clankless +clanless +clanned +clanning +clannishly +clannishness +clansfolk +clanship +clansman +clansmanship +clanswoman +Claosaurus +clap +clapboard +clapbread +clapmatch +clapnet +clapped +clapper +clapperclaw +clapperclawer +clapperdudgeon +clappermaclaw +clapping +clapt +claptrap +clapwort +claque +claquer +Clara +clarabella +clarain +Clare +Clarence +Clarenceux +Clarenceuxship +Clarencieux +clarendon +claret +Claretian +Claribel +claribella +Clarice +clarifiant +clarification +clarifier +clarify +clarigation +clarin +Clarinda +clarinet +clarinetist +clarinettist +clarion +clarionet +Clarissa +Clarisse +Clarist +clarity +clark +clarkeite +Clarkia +claro +Claromontane +clarshech +clart +clarty +clary +clash +clasher +clashingly +clashy +clasmatocyte +clasmatosis +clasp +clasper +clasping +claspt +class +classable +classbook +classed +classer +classes +classfellow +classic +classical +classicalism +classicalist +classicality +classicalize +classically +classicalness +classicism +classicist +classicistic +classicize +classicolatry +classifiable +classific +classifically +classification +classificational +classificator +classificatory +classified +classifier +classis +classism +classman +classmanship +classmate +classroom +classwise +classwork +classy +clastic +clat +clatch +Clathraceae +clathraceous +Clathraria +clathrarian +clathrate +Clathrina +Clathrinidae +clathroid +clathrose +clathrulate +Clathrus +Clatsop +clatter +clatterer +clatteringly +clattertrap +clattery +clatty +Claude +claudent +claudetite +Claudia +Claudian +claudicant +claudicate +claudication +Claudio +Claudius +claught +clausal +clause +Clausilia +Clausiliidae +clausthalite +claustra +claustral +claustration +claustrophobia +claustrum +clausula +clausular +clausule +clausure +claut +clava +clavacin +claval +Clavaria +Clavariaceae +clavariaceous +clavate +clavated +clavately +clavation +clave +clavecin +clavecinist +clavel +clavelization +clavelize +clavellate +clavellated +claver +clavial +claviature +clavicembalo +Claviceps +clavichord +clavichordist +clavicithern +clavicle +clavicorn +clavicornate +Clavicornes +Clavicornia +clavicotomy +clavicular +clavicularium +claviculate +claviculus +clavicylinder +clavicymbal +clavicytherium +clavier +clavierist +claviform +claviger +clavigerous +claviharp +clavilux +claviol +clavipectoral +clavis +clavodeltoid +clavodeltoideus +clavola +clavolae +clavolet +clavus +clavy +claw +clawed +clawer +clawk +clawker +clawless +clay +claybank +claybrained +clayen +clayer +clayey +clayiness +clayish +claylike +clayman +claymore +Clayoquot +claypan +Claytonia +clayware +clayweed +cleach +clead +cleaded +cleading +cleam +cleamer +clean +cleanable +cleaner +cleanhanded +cleanhandedness +cleanhearted +cleaning +cleanish +cleanlily +cleanliness +cleanly +cleanness +cleanout +cleansable +cleanse +cleanser +cleansing +cleanskins +cleanup +clear +clearable +clearage +clearance +clearcole +clearedness +clearer +clearheaded +clearheadedly +clearheadedness +clearhearted +clearing +clearinghouse +clearish +clearly +clearness +clearskins +clearstarch +clearweed +clearwing +cleat +cleavability +cleavable +cleavage +cleave +cleaveful +cleavelandite +cleaver +cleavers +cleaverwort +cleaving +cleavingly +cleche +cleck +cled +cledge +cledgy +cledonism +clee +cleek +cleeked +cleeky +clef +cleft +clefted +cleg +cleidagra +cleidarthritis +cleidocostal +cleidocranial +cleidohyoid +cleidomancy +cleidomastoid +cleidorrhexis +cleidoscapular +cleidosternal +cleidotomy +cleidotripsy +cleistocarp +cleistocarpous +cleistogamic +cleistogamically +cleistogamous +cleistogamously +cleistogamy +cleistogene +cleistogenous +cleistogeny +cleistothecium +Cleistothecopsis +cleithral +cleithrum +clem +Clematis +clematite +Clemclemalats +clemence +clemency +Clement +clement +Clementina +Clementine +clemently +clench +cleoid +Cleome +Cleopatra +clep +Clepsine +clepsydra +cleptobiosis +cleptobiotic +clerestoried +clerestory +clergy +clergyable +clergylike +clergyman +clergywoman +cleric +clerical +clericalism +clericalist +clericality +clericalize +clerically +clericate +clericature +clericism +clericity +clerid +Cleridae +clerihew +clerisy +clerk +clerkage +clerkdom +clerkery +clerkess +clerkhood +clerking +clerkish +clerkless +clerklike +clerkliness +clerkly +clerkship +Clerodendron +cleromancy +cleronomy +cleruch +cleruchial +cleruchic +cleruchy +Clerus +cletch +Clethra +Clethraceae +clethraceous +cleuch +cleve +cleveite +clever +cleverality +cleverish +cleverishly +cleverly +cleverness +clevis +clew +cliack +clianthus +cliche +click +clicker +clicket +clickless +clicky +Clidastes +cliency +client +clientage +cliental +cliented +clientelage +clientele +clientless +clientry +clientship +cliff +cliffed +cliffless +clifflet +clifflike +cliffside +cliffsman +cliffweed +cliffy +clift +Cliftonia +cliftonite +clifty +clima +Climaciaceae +climaciaceous +Climacium +climacteric +climacterical +climacterically +climactic +climactical +climactically +climacus +climata +climatal +climate +climath +climatic +climatical +climatically +Climatius +climatize +climatographical +climatography +climatologic +climatological +climatologically +climatologist +climatology +climatometer +climatotherapeutics +climatotherapy +climature +climax +climb +climbable +climber +climbing +clime +climograph +clinal +clinamen +clinamina +clinandria +clinandrium +clinanthia +clinanthium +clinch +clincher +clinchingly +clinchingness +cline +cling +clinger +clingfish +clinging +clingingly +clingingness +clingstone +clingy +clinia +clinic +clinical +clinically +clinician +clinicist +clinicopathological +clinium +clink +clinker +clinkerer +clinkery +clinking +clinkstone +clinkum +clinoaxis +clinocephalic +clinocephalism +clinocephalous +clinocephalus +clinocephaly +clinochlore +clinoclase +clinoclasite +clinodiagonal +clinodomatic +clinodome +clinograph +clinographic +clinohedral +clinohedrite +clinohumite +clinoid +clinologic +clinology +clinometer +clinometric +clinometrical +clinometry +clinopinacoid +clinopinacoidal +Clinopodium +clinoprism +clinopyramid +clinopyroxene +clinorhombic +clinospore +clinostat +clinquant +clint +clinting +Clinton +Clintonia +clintonite +clinty +Clio +Cliona +Clione +clip +clipei +clipeus +clippable +clipped +clipper +clipperman +clipping +clips +clipse +clipsheet +clipsome +clipt +clique +cliquedom +cliqueless +cliquish +cliquishly +cliquishness +cliquism +cliquy +cliseometer +clisere +clishmaclaver +Clisiocampa +Clistogastra +clit +clitch +clite +clitella +clitellar +clitelliferous +clitelline +clitellum +clitellus +clites +clithe +clithral +clithridiate +clitia +clition +Clitocybe +Clitoria +clitoridauxe +clitoridean +clitoridectomy +clitoriditis +clitoridotomy +clitoris +clitorism +clitoritis +clitter +clitterclatter +clival +clive +clivers +Clivia +clivis +clivus +cloaca +cloacal +cloacaline +cloacean +cloacinal +cloacinean +cloacitis +cloak +cloakage +cloaked +cloakedly +cloaking +cloakless +cloaklet +cloakmaker +cloakmaking +cloakroom +cloakwise +cloam +cloamen +cloamer +clobber +clobberer +clochan +cloche +clocher +clochette +clock +clockbird +clockcase +clocked +clocker +clockface +clockhouse +clockkeeper +clockless +clocklike +clockmaker +clockmaking +clockmutch +clockroom +clocksmith +clockwise +clockwork +clod +clodbreaker +clodder +cloddily +cloddiness +cloddish +cloddishly +cloddishness +cloddy +clodhead +clodhopper +clodhopping +clodlet +clodpate +clodpated +clodpoll +cloff +clog +clogdogdo +clogger +cloggily +clogginess +cloggy +cloghad +cloglike +clogmaker +clogmaking +clogwood +clogwyn +cloiochoanitic +cloisonless +cloisonne +cloister +cloisteral +cloistered +cloisterer +cloisterless +cloisterlike +cloisterliness +cloisterly +cloisterwise +cloistral +cloistress +cloit +clomb +clomben +clonal +clone +clonic +clonicity +clonicotonic +clonism +clonorchiasis +Clonorchis +Clonothrix +clonus +cloof +cloop +cloot +clootie +clop +cloragen +clorargyrite +cloriodid +closable +close +closecross +closed +closefisted +closefistedly +closefistedness +closehanded +closehearted +closely +closemouth +closemouthed +closen +closeness +closer +closestool +closet +closewing +closh +closish +closter +Closterium +clostridial +Clostridium +closure +clot +clotbur +clote +cloth +clothbound +clothe +clothes +clothesbag +clothesbasket +clothesbrush +clotheshorse +clothesline +clothesman +clothesmonger +clothespin +clothespress +clothesyard +clothier +clothify +Clothilda +clothing +clothmaker +clothmaking +Clotho +clothworker +clothy +clottage +clottedness +clotter +clotty +cloture +clotweed +cloud +cloudage +cloudberry +cloudburst +cloudcap +clouded +cloudful +cloudily +cloudiness +clouding +cloudland +cloudless +cloudlessly +cloudlessness +cloudlet +cloudlike +cloudling +cloudology +cloudscape +cloudship +cloudward +cloudwards +cloudy +clough +clour +clout +clouted +clouter +clouterly +clouty +clove +cloven +clovene +clover +clovered +cloverlay +cloverleaf +cloveroot +cloverroot +clovery +clow +clown +clownade +clownage +clownery +clownheal +clownish +clownishly +clownishness +clownship +clowring +cloy +cloyedness +cloyer +cloying +cloyingly +cloyingness +cloyless +cloysome +club +clubbability +clubbable +clubbed +clubber +clubbily +clubbing +clubbish +clubbism +clubbist +clubby +clubdom +clubfellow +clubfisted +clubfoot +clubfooted +clubhand +clubhaul +clubhouse +clubionid +Clubionidae +clubland +clubman +clubmate +clubmobile +clubmonger +clubridden +clubroom +clubroot +clubstart +clubster +clubweed +clubwoman +clubwood +cluck +clue +cluff +clump +clumpish +clumproot +clumpy +clumse +clumsily +clumsiness +clumsy +clunch +clung +Cluniac +Cluniacensian +Clunisian +Clunist +clunk +clupanodonic +Clupea +clupeid +Clupeidae +clupeiform +clupeine +Clupeodei +clupeoid +cluricaune +Clusia +Clusiaceae +clusiaceous +cluster +clusterberry +clustered +clusterfist +clustering +clusteringly +clustery +clutch +clutchman +cluther +clutter +clutterer +clutterment +cluttery +cly +Clydesdale +Clydeside +Clydesider +clyer +clyfaker +clyfaking +Clymenia +clype +clypeal +Clypeaster +Clypeastridea +Clypeastrina +clypeastroid +Clypeastroida +Clypeastroidea +clypeate +clypeiform +clypeolar +clypeolate +clypeole +clypeus +clysis +clysma +clysmian +clysmic +clyster +clysterize +Clytemnestra +cnemapophysis +cnemial +cnemidium +Cnemidophorus +cnemis +Cneoraceae +cneoraceous +Cneorum +cnicin +Cnicus +cnida +Cnidaria +cnidarian +Cnidian +cnidoblast +cnidocell +cnidocil +cnidocyst +cnidophore +cnidophorous +cnidopod +cnidosac +Cnidoscolus +cnidosis +coabode +coabound +coabsume +coacceptor +coacervate +coacervation +coach +coachability +coachable +coachbuilder +coachbuilding +coachee +coacher +coachfellow +coachful +coaching +coachlet +coachmaker +coachmaking +coachman +coachmanship +coachmaster +coachsmith +coachsmithing +coachway +coachwhip +coachwise +coachwoman +coachwork +coachwright +coachy +coact +coaction +coactive +coactively +coactivity +coactor +coadamite +coadapt +coadaptation +coadequate +coadjacence +coadjacency +coadjacent +coadjacently +coadjudicator +coadjust +coadjustment +coadjutant +coadjutator +coadjute +coadjutement +coadjutive +coadjutor +coadjutorship +coadjutress +coadjutrix +coadjuvancy +coadjuvant +coadjuvate +coadminister +coadministration +coadministrator +coadministratrix +coadmiration +coadmire +coadmit +coadnate +coadore +coadsorbent +coadunate +coadunation +coadunative +coadunatively +coadunite +coadventure +coadventurer +coadvice +coaffirmation +coafforest +coaged +coagency +coagent +coaggregate +coaggregated +coaggregation +coagitate +coagitator +coagment +coagonize +coagriculturist +coagula +coagulability +coagulable +coagulant +coagulase +coagulate +coagulation +coagulative +coagulator +coagulatory +coagulin +coagulometer +coagulose +coagulum +Coahuiltecan +coaid +coaita +coak +coakum +coal +coalbag +coalbagger +coalbin +coalbox +coaldealer +coaler +coalesce +coalescence +coalescency +coalescent +coalfish +coalfitter +coalhole +coalification +coalify +Coalite +coalition +coalitional +coalitioner +coalitionist +coalize +coalizer +coalless +coalmonger +coalmouse +coalpit +coalrake +coalsack +coalternate +coalternation +coalternative +coaltitude +coaly +coalyard +coambassador +coambulant +coamiable +coaming +Coan +coanimate +coannex +coannihilate +coapostate +coapparition +coappear +coappearance +coapprehend +coapprentice +coappriser +coapprover +coapt +coaptate +coaptation +coaration +coarb +coarbiter +coarbitrator +coarctate +coarctation +coardent +coarrange +coarrangement +coarse +coarsely +coarsen +coarseness +coarsish +coascend +coassert +coasserter +coassession +coassessor +coassignee +coassist +coassistance +coassistant +coassume +coast +coastal +coastally +coaster +Coastguard +coastguardman +coasting +coastland +coastman +coastside +coastwaiter +coastward +coastwards +coastways +coastwise +coat +coated +coatee +coater +coati +coatie +coatimondie +coatimundi +coating +coatless +coatroom +coattail +coattailed +coattend +coattest +coattestation +coattestator +coaudience +coauditor +coaugment +coauthor +coauthority +coauthorship +coawareness +coax +coaxal +coaxation +coaxer +coaxial +coaxially +coaxing +coaxingly +coaxy +cob +cobaea +cobalt +cobaltammine +cobaltic +cobalticyanic +cobalticyanides +cobaltiferous +cobaltinitrite +cobaltite +cobaltocyanic +cobaltocyanide +cobaltous +cobang +cobbed +cobber +cobberer +cobbing +cobble +cobbler +cobblerfish +cobblerism +cobblerless +cobblership +cobblery +cobblestone +cobbling +cobbly +cobbra +cobby +cobcab +Cobdenism +Cobdenite +cobego +cobelief +cobeliever +cobelligerent +cobenignity +coberger +cobewail +cobhead +cobia +cobiron +cobishop +Cobitidae +Cobitis +coble +cobleman +Coblentzian +Cobleskill +cobless +cobloaf +cobnut +cobola +coboundless +cobourg +cobra +cobreathe +cobridgehead +cobriform +cobrother +cobstone +coburg +coburgess +coburgher +coburghership +Cobus +cobweb +cobwebbery +cobwebbing +cobwebby +cobwork +coca +cocaceous +cocaine +cocainism +cocainist +cocainization +cocainize +cocainomania +cocainomaniac +Cocama +Cocamama +cocamine +Cocanucos +cocarboxylase +cocash +cocashweed +cocause +cocautioner +Coccaceae +coccagee +coccal +Cocceian +Cocceianism +coccerin +cocci +coccid +Coccidae +coccidia +coccidial +coccidian +Coccidiidea +coccidioidal +Coccidioides +Coccidiomorpha +coccidiosis +coccidium +coccidology +cocciferous +cocciform +coccigenic +coccinella +coccinellid +Coccinellidae +coccionella +cocco +coccobacillus +coccochromatic +Coccogonales +coccogone +Coccogoneae +coccogonium +coccoid +coccolite +coccolith +coccolithophorid +Coccolithophoridae +Coccoloba +Coccolobis +Coccomyces +coccosphere +coccostean +coccosteid +Coccosteidae +Coccosteus +Coccothraustes +coccothraustine +Coccothrinax +coccous +coccule +cocculiferous +Cocculus +cocculus +coccus +coccydynia +coccygalgia +coccygeal +coccygean +coccygectomy +coccygerector +coccyges +coccygeus +coccygine +coccygodynia +coccygomorph +Coccygomorphae +coccygomorphic +coccygotomy +coccyodynia +coccyx +Coccyzus +cocentric +cochairman +cochal +cochief +Cochin +cochineal +cochlea +cochlear +cochleare +Cochlearia +cochlearifoliate +cochleariform +cochleate +cochleated +cochleiform +cochleitis +cochleous +cochlidiid +Cochlidiidae +cochliodont +Cochliodontidae +Cochliodus +Cochlospermaceae +cochlospermaceous +Cochlospermum +Cochranea +cochurchwarden +cocillana +cocircular +cocircularity +cocitizen +cocitizenship +cock +cockade +cockaded +Cockaigne +cockal +cockalorum +cockamaroo +cockarouse +cockateel +cockatoo +cockatrice +cockawee +cockbell +cockbill +cockbird +cockboat +cockbrain +cockchafer +cockcrow +cockcrower +cockcrowing +cocked +Cocker +cocker +cockerel +cockermeg +cockernony +cocket +cockeye +cockeyed +cockfight +cockfighting +cockhead +cockhorse +cockieleekie +cockily +cockiness +cocking +cockish +cockle +cockleboat +cocklebur +cockled +cockler +cockleshell +cocklet +cocklewife +cocklight +cockling +cockloft +cockly +cockmaster +cockmatch +cockmate +cockneian +cockneity +cockney +cockneybred +cockneydom +cockneyese +cockneyess +cockneyfication +cockneyfy +cockneyish +cockneyishly +cockneyism +cockneyize +cockneyland +cockneyship +cockpit +cockroach +cockscomb +cockscombed +cocksfoot +cockshead +cockshot +cockshut +cockshy +cockshying +cockspur +cockstone +cocksure +cocksuredom +cocksureism +cocksurely +cocksureness +cocksurety +cocktail +cockthrowing +cockup +cockweed +cocky +Cocle +coco +cocoa +cocoach +cocobolo +Coconino +coconnection +coconqueror +coconscious +coconsciously +coconsciousness +coconsecrator +coconspirator +coconstituent +cocontractor +Coconucan +Coconuco +coconut +cocoon +cocoonery +cocorico +cocoroot +Cocos +cocotte +cocovenantor +cocowood +cocowort +cocozelle +cocreate +cocreator +cocreatorship +cocreditor +cocrucify +coctile +coction +coctoantigen +coctoprecipitin +cocuisa +cocullo +cocurator +cocurrent +cocuswood +cocuyo +Cocytean +Cocytus +cod +coda +codamine +codbank +codder +codding +coddle +coddler +code +codebtor +codeclination +codecree +codefendant +codeine +codeless +codelight +codelinquency +codelinquent +codenization +codeposit +coder +coderive +codescendant +codespairer +codex +codfish +codfisher +codfishery +codger +codhead +codheaded +Codiaceae +codiaceous +Codiaeum +Codiales +codical +codices +codicil +codicilic +codicillary +codictatorship +codification +codifier +codify +codilla +codille +codiniac +codirectional +codirector +codiscoverer +codisjunct +codist +Codium +codivine +codling +codman +codo +codol +codomestication +codominant +codon +codpiece +codpitchings +Codrus +codshead +codworm +coe +coecal +coecum +coed +coeditor +coeditorship +coeducate +coeducation +coeducational +coeducationalism +coeducationalize +coeducationally +coeffect +coefficacy +coefficient +coefficiently +coeffluent +coeffluential +coelacanth +coelacanthid +Coelacanthidae +coelacanthine +Coelacanthini +coelacanthoid +coelacanthous +coelanaglyphic +coelar +coelarium +Coelastraceae +coelastraceous +Coelastrum +Coelata +coelder +coeldership +Coelebogyne +coelect +coelection +coelector +coelectron +coelelminth +Coelelminthes +coelelminthic +Coelentera +Coelenterata +coelenterate +coelenteric +coelenteron +coelestine +coelevate +coelho +coelia +coeliac +coelialgia +coelian +Coelicolae +Coelicolist +coeligenous +coelin +coeline +coeliomyalgia +coeliorrhea +coeliorrhoea +coelioscopy +coeliotomy +coeloblastic +coeloblastula +Coelococcus +coelodont +coelogastrula +Coeloglossum +Coelogyne +coelom +coeloma +Coelomata +coelomate +coelomatic +coelomatous +coelomesoblast +coelomic +Coelomocoela +coelomopore +coelonavigation +coelongated +coeloplanula +coelosperm +coelospermous +coelostat +coelozoic +coemanate +coembedded +coembody +coembrace +coeminency +coemperor +coemploy +coemployee +coemployment +coempt +coemption +coemptional +coemptionator +coemptive +coemptor +coenact +coenactor +coenaculous +coenamor +coenamorment +coenamourment +coenanthium +coendear +Coendidae +Coendou +coendure +coenenchym +coenenchyma +coenenchymal +coenenchymatous +coenenchyme +coenesthesia +coenesthesis +coenflame +coengage +coengager +coenjoy +coenobe +coenobiar +coenobic +coenobioid +coenobium +coenoblast +coenoblastic +coenocentrum +coenocyte +coenocytic +coenodioecism +coenoecial +coenoecic +coenoecium +coenogamete +coenomonoecism +coenosarc +coenosarcal +coenosarcous +coenosite +coenospecies +coenospecific +coenospecifically +coenosteal +coenosteum +coenotrope +coenotype +coenotypic +coenthrone +coenurus +coenzyme +coequal +coequality +coequalize +coequally +coequalness +coequate +coequated +coequation +coerce +coercement +coercer +coercibility +coercible +coercibleness +coercibly +coercion +coercionary +coercionist +coercitive +coercive +coercively +coerciveness +coercivity +Coerebidae +coeruleolactite +coessential +coessentiality +coessentially +coessentialness +coestablishment +coestate +coetaneity +coetaneous +coetaneously +coetaneousness +coeternal +coeternally +coeternity +coetus +coeval +coevality +coevally +coexchangeable +coexclusive +coexecutant +coexecutor +coexecutrix +coexert +coexertion +coexist +coexistence +coexistency +coexistent +coexpand +coexpanded +coexperiencer +coexpire +coexplosion +coextend +coextension +coextensive +coextensively +coextensiveness +coextent +cofactor +Cofane +cofaster +cofather +cofathership +cofeature +cofeoffee +coferment +cofermentation +coff +Coffea +coffee +coffeebush +coffeecake +coffeegrower +coffeegrowing +coffeehouse +coffeeleaf +coffeepot +coffeeroom +coffeetime +coffeeweed +coffeewood +coffer +cofferdam +cofferer +cofferfish +coffering +cofferlike +cofferwork +coffin +coffinless +coffinmaker +coffinmaking +coffle +coffret +cofighter +coforeknown +coformulator +cofounder +cofoundress +cofreighter +coft +cofunction +cog +cogence +cogency +cogener +cogeneric +cogent +cogently +cogged +cogger +coggie +cogging +coggle +coggledy +cogglety +coggly +coghle +cogitability +cogitable +cogitabund +cogitabundity +cogitabundly +cogitabundous +cogitant +cogitantly +cogitate +cogitatingly +cogitation +cogitative +cogitatively +cogitativeness +cogitativity +cogitator +coglorify +coglorious +cogman +cognac +cognate +cognateness +cognatic +cognatical +cognation +cognisable +cognisance +cognition +cognitional +cognitive +cognitively +cognitum +cognizability +cognizable +cognizableness +cognizably +cognizance +cognizant +cognize +cognizee +cognizer +cognizor +cognomen +cognominal +cognominate +cognomination +cognosce +cognoscent +cognoscibility +cognoscible +cognoscitive +cognoscitively +cogon +cogonal +cogovernment +cogovernor +cogracious +cograil +cogrediency +cogredient +cogroad +Cogswellia +coguarantor +coguardian +cogue +cogway +cogwheel +cogwood +cohabit +cohabitancy +cohabitant +cohabitation +coharmonious +coharmoniously +coharmonize +coheartedness +coheir +coheiress +coheirship +cohelper +cohelpership +Cohen +cohenite +coherald +cohere +coherence +coherency +coherent +coherently +coherer +coheretic +coheritage +coheritor +cohesibility +cohesible +cohesion +cohesive +cohesively +cohesiveness +cohibit +cohibition +cohibitive +cohibitor +coho +cohoba +cohobate +cohobation +cohobator +cohol +cohort +cohortation +cohortative +cohosh +cohune +cohusband +coidentity +coif +coifed +coiffure +coign +coigue +coil +coiled +coiler +coiling +coilsmith +coimmense +coimplicant +coimplicate +coimplore +coin +coinable +coinage +coincide +coincidence +coincidency +coincident +coincidental +coincidentally +coincidently +coincider +coinclination +coincline +coinclude +coincorporate +coindicant +coindicate +coindication +coindwelling +coiner +coinfeftment +coinfer +coinfinite +coinfinity +coinhabit +coinhabitant +coinhabitor +coinhere +coinherence +coinherent +coinheritance +coinheritor +coining +coinitial +coinmaker +coinmaking +coinmate +coinspire +coinstantaneity +coinstantaneous +coinstantaneously +coinstantaneousness +coinsurance +coinsure +cointense +cointension +cointensity +cointer +cointerest +cointersecting +cointise +Cointreau +coinventor +coinvolve +coiny +coir +coislander +coistrel +coistril +coital +coition +coiture +coitus +Coix +cojudge +cojuror +cojusticiar +coke +cokelike +cokeman +coker +cokernut +cokery +coking +coky +col +Cola +cola +colaborer +Colada +colalgia +Colan +colander +colane +colarin +colate +colation +colatitude +colatorium +colature +colauxe +colback +colberter +colbertine +Colbertism +colcannon +Colchian +Colchicaceae +colchicine +Colchicum +Colchis +colchyte +Colcine +colcothar +cold +colder +coldfinch +coldhearted +coldheartedly +coldheartedness +coldish +coldly +coldness +coldproof +coldslaw +cole +coleader +colecannon +colectomy +colegatee +colegislator +colemanite +colemouse +Coleochaetaceae +coleochaetaceous +Coleochaete +Coleophora +Coleophoridae +coleopter +Coleoptera +coleopteral +coleopteran +coleopterist +coleopteroid +coleopterological +coleopterology +coleopteron +coleopterous +coleoptile +coleoptilum +coleorhiza +Coleosporiaceae +Coleosporium +coleplant +coleseed +coleslaw +colessee +colessor +coletit +coleur +Coleus +colewort +coli +Colias +colibacillosis +colibacterin +colibri +colic +colical +colichemarde +colicky +colicolitis +colicroot +colicweed +colicwort +colicystitis +colicystopyelitis +coliform +Coliidae +Coliiformes +colilysin +Colima +colima +colin +colinear +colinephritis +coling +Colinus +coliplication +colipuncture +colipyelitis +colipyuria +colisepsis +Coliseum +coliseum +colitic +colitis +colitoxemia +coliuria +Colius +colk +coll +Colla +collaborate +collaboration +collaborationism +collaborationist +collaborative +collaboratively +collaborator +collage +collagen +collagenic +collagenous +collapse +collapsibility +collapsible +collar +collarband +collarbird +collarbone +collard +collare +collared +collaret +collarino +collarless +collarman +collatable +collate +collatee +collateral +collaterality +collaterally +collateralness +collation +collationer +collatitious +collative +collator +collatress +collaud +collaudation +colleague +colleagueship +collect +collectability +collectable +collectanea +collectarium +collected +collectedly +collectedness +collectibility +collectible +collection +collectional +collectioner +collective +collectively +collectiveness +collectivism +collectivist +collectivistic +collectivistically +collectivity +collectivization +collectivize +collector +collectorate +collectorship +collectress +colleen +collegatary +college +colleger +collegial +collegialism +collegiality +collegian +collegianer +Collegiant +collegiate +collegiately +collegiateness +collegiation +collegium +Collembola +collembolan +collembole +collembolic +collembolous +collenchyma +collenchymatic +collenchymatous +collenchyme +collencytal +collencyte +Colleri +Colleries +Collery +collery +collet +colleter +colleterial +colleterium +Colletes +Colletia +colletic +Colletidae +colletin +Colletotrichum +colletside +colley +collibert +colliculate +colliculus +collide +collidine +collie +collied +collier +colliery +collieshangie +colliform +colligate +colligation +colligative +colligible +collimate +collimation +collimator +collin +collinal +colline +collinear +collinearity +collinearly +collineate +collineation +colling +collingly +collingual +Collins +collins +Collinsia +collinsite +Collinsonia +colliquate +colliquation +colliquative +colliquativeness +collision +collisional +collisive +colloblast +collobrierite +collocal +Collocalia +collocate +collocation +collocationable +collocative +collocatory +collochemistry +collochromate +collock +collocution +collocutor +collocutory +collodiochloride +collodion +collodionization +collodionize +collodiotype +collodium +collogue +colloid +colloidal +colloidality +colloidize +colloidochemical +Collomia +collop +colloped +collophanite +collophore +colloque +colloquia +colloquial +colloquialism +colloquialist +colloquiality +colloquialize +colloquially +colloquialness +colloquist +colloquium +colloquize +colloquy +collothun +collotype +collotypic +collotypy +colloxylin +colluctation +collude +colluder +collum +collumelliaceous +collusion +collusive +collusively +collusiveness +collutorium +collutory +colluvial +colluvies +colly +collyba +Collybia +Collyridian +collyrite +collyrium +collywest +collyweston +collywobbles +colmar +colobin +colobium +coloboma +Colobus +Colocasia +colocentesis +Colocephali +colocephalous +coloclysis +colocola +colocolic +colocynth +colocynthin +colodyspepsia +coloenteritis +cologarithm +Cologne +cololite +Colombian +colombier +colombin +Colombina +colometric +colometrically +colometry +colon +colonalgia +colonate +colonel +colonelcy +colonelship +colongitude +colonial +colonialism +colonialist +colonialize +colonially +colonialness +colonic +colonist +colonitis +colonizability +colonizable +colonization +colonizationist +colonize +colonizer +colonnade +colonnaded +colonnette +colonopathy +colonopexy +colonoscope +colonoscopy +colony +colopexia +colopexotomy +colopexy +colophane +colophany +colophene +colophenic +colophon +colophonate +Colophonian +colophonic +colophonist +colophonite +colophonium +colophony +coloplication +coloproctitis +coloptosis +colopuncture +coloquintid +coloquintida +color +colorability +colorable +colorableness +colorably +Coloradan +Colorado +colorado +coloradoite +colorant +colorate +coloration +colorational +colorationally +colorative +coloratura +colorature +colorcast +colorectitis +colorectostomy +colored +colorer +colorfast +colorful +colorfully +colorfulness +colorific +colorifics +colorimeter +colorimetric +colorimetrical +colorimetrically +colorimetrics +colorimetrist +colorimetry +colorin +coloring +colorist +coloristic +colorization +colorize +colorless +colorlessly +colorlessness +colormaker +colormaking +colorman +colorrhaphy +colors +colortype +Colorum +colory +coloss +colossal +colossality +colossally +colossean +Colosseum +colossi +Colossian +Colossochelys +colossus +Colossuswise +colostomy +colostral +colostration +colostric +colostrous +colostrum +colotomy +colotyphoid +colove +colp +colpenchyma +colpeo +colpeurynter +colpeurysis +colpindach +colpitis +colpocele +colpocystocele +colpohyperplasia +colpohysterotomy +colpoperineoplasty +colpoperineorrhaphy +colpoplastic +colpoplasty +colpoptosis +colporrhagia +colporrhaphy +colporrhea +colporrhexis +colport +colportage +colporter +colporteur +colposcope +colposcopy +colpotomy +colpus +Colt +colt +colter +colthood +coltish +coltishly +coltishness +coltpixie +coltpixy +coltsfoot +coltskin +Coluber +colubrid +Colubridae +colubriform +Colubriformes +Colubriformia +Colubrina +Colubrinae +colubrine +colubroid +colugo +Columba +columbaceous +Columbae +Columban +Columbanian +columbarium +columbary +columbate +columbeion +Columbella +Columbia +columbiad +Columbian +columbic +Columbid +Columbidae +columbier +columbiferous +Columbiformes +columbin +Columbine +columbine +columbite +columbium +columbo +columboid +columbotantalate +columbotitanate +columella +columellar +columellate +Columellia +Columelliaceae +columelliform +column +columnal +columnar +columnarian +columnarity +columnated +columned +columner +columniation +columniferous +columniform +columning +columnist +columnization +columnwise +colunar +colure +Colutea +Colville +coly +Colymbidae +colymbiform +colymbion +Colymbriformes +Colymbus +colyone +colyonic +colytic +colyum +colyumist +colza +coma +comacine +comagistracy +comagmatic +comaker +comal +comamie +Coman +Comanche +Comanchean +Comandra +comanic +comart +Comarum +comate +comatose +comatosely +comatoseness +comatosity +comatous +comatula +comatulid +comb +combaron +combat +combatable +combatant +combater +combative +combatively +combativeness +combativity +combed +comber +combfish +combflower +combinable +combinableness +combinant +combinantive +combinate +combination +combinational +combinative +combinator +combinatorial +combinatory +combine +combined +combinedly +combinedness +combinement +combiner +combing +combining +comble +combless +comblessness +combmaker +combmaking +comboloio +comboy +Combretaceae +combretaceous +Combretum +combure +comburendo +comburent +comburgess +comburimeter +comburimetry +comburivorous +combust +combustibility +combustible +combustibleness +combustibly +combustion +combustive +combustor +combwise +combwright +comby +come +comeback +Comecrudo +comedial +comedian +comediant +comedic +comedical +comedienne +comedietta +comedist +comedo +comedown +comedy +comelily +comeliness +comeling +comely +comendite +comenic +comephorous +comer +comes +comestible +comet +cometarium +cometary +comether +cometic +cometical +cometlike +cometographer +cometographical +cometography +cometoid +cometology +cometwise +comeuppance +comfit +comfiture +comfort +comfortable +comfortableness +comfortably +comforter +comfortful +comforting +comfortingly +comfortless +comfortlessly +comfortlessness +comfortress +comfortroot +comfrey +comfy +Comiakin +comic +comical +comicality +comically +comicalness +comicocratic +comicocynical +comicodidactic +comicography +comicoprosaic +comicotragedy +comicotragic +comicotragical +comicry +Comid +comiferous +Cominform +coming +comingle +comino +Comintern +comism +comital +comitant +comitatensian +comitative +comitatus +comitia +comitial +Comitium +comitragedy +comity +comma +command +commandable +commandant +commandedness +commandeer +commander +commandership +commandery +commanding +commandingly +commandingness +commandless +commandment +commando +commandoman +commandress +commassation +commassee +commatic +commation +commatism +commeasurable +commeasure +commeddle +Commelina +Commelinaceae +commelinaceous +commemorable +commemorate +commemoration +commemorational +commemorative +commemoratively +commemorativeness +commemorator +commemoratory +commemorize +commence +commenceable +commencement +commencer +commend +commendable +commendableness +commendably +commendador +commendam +commendatary +commendation +commendator +commendatory +commender +commendingly +commendment +commensal +commensalism +commensalist +commensalistic +commensality +commensally +commensurability +commensurable +commensurableness +commensurably +commensurate +commensurately +commensurateness +commensuration +comment +commentarial +commentarialism +commentary +commentate +commentation +commentator +commentatorial +commentatorially +commentatorship +commenter +commerce +commerceless +commercer +commerciable +commercial +commercialism +commercialist +commercialistic +commerciality +commercialization +commercialize +commercially +commercium +commerge +commie +comminate +commination +comminative +comminator +comminatory +commingle +comminglement +commingler +comminister +comminuate +comminute +comminution +comminutor +Commiphora +commiserable +commiserate +commiseratingly +commiseration +commiserative +commiseratively +commiserator +commissar +commissarial +commissariat +commissary +commissaryship +commission +commissionaire +commissional +commissionate +commissioner +commissionership +commissionship +commissive +commissively +commissural +commissure +commissurotomy +commit +commitment +committable +committal +committee +committeeism +committeeman +committeeship +committeewoman +committent +committer +committible +committor +commix +commixt +commixtion +commixture +commodatary +commodate +commodation +commodatum +commode +commodious +commodiously +commodiousness +commoditable +commodity +commodore +common +commonable +commonage +commonality +commonalty +commoner +commonership +commoney +commonish +commonition +commonize +commonly +commonness +commonplace +commonplaceism +commonplacely +commonplaceness +commonplacer +commons +commonsensible +commonsensibly +commonsensical +commonsensically +commonty +commonweal +commonwealth +commonwealthism +commorancy +commorant +commorient +commorth +commot +commotion +commotional +commotive +commove +communa +communal +communalism +communalist +communalistic +communality +communalization +communalize +communalizer +communally +communard +commune +communer +communicability +communicable +communicableness +communicably +communicant +communicate +communicatee +communicating +communication +communicative +communicatively +communicativeness +communicator +communicatory +communion +communionist +communique +communism +communist +communistery +communistic +communistically +communital +communitarian +communitary +communitive +communitorium +community +communization +communize +commutability +commutable +commutableness +commutant +commutate +commutation +commutative +commutatively +commutator +commute +commuter +commuting +commutual +commutuality +Comnenian +comoid +comolecule +comortgagee +comose +comourn +comourner +comournful +comous +Comox +compact +compacted +compactedly +compactedness +compacter +compactible +compaction +compactly +compactness +compactor +compacture +compages +compaginate +compagination +companator +companion +companionability +companionable +companionableness +companionably +companionage +companionate +companionize +companionless +companionship +companionway +company +comparability +comparable +comparableness +comparably +comparascope +comparate +comparatival +comparative +comparatively +comparativeness +comparativist +comparator +compare +comparer +comparison +comparition +comparograph +compart +compartition +compartment +compartmental +compartmentalization +compartmentalize +compartmentally +compartmentize +compass +compassable +compasser +compasses +compassing +compassion +compassionable +compassionate +compassionately +compassionateness +compassionless +compassive +compassivity +compassless +compaternity +compatibility +compatible +compatibleness +compatibly +compatriot +compatriotic +compatriotism +compear +compearance +compearant +compeer +compel +compellable +compellably +compellation +compellative +compellent +compeller +compelling +compellingly +compend +compendency +compendent +compendia +compendiary +compendiate +compendious +compendiously +compendiousness +compendium +compenetrate +compenetration +compensable +compensate +compensating +compensatingly +compensation +compensational +compensative +compensativeness +compensator +compensatory +compense +compenser +compesce +compete +competence +competency +competent +competently +competentness +competition +competitioner +competitive +competitively +competitiveness +competitor +competitorship +competitory +competitress +competitrix +compilation +compilator +compilatory +compile +compilement +compiler +compital +Compitalia +compitum +complacence +complacency +complacent +complacential +complacentially +complacently +complain +complainable +complainant +complainer +complainingly +complainingness +complaint +complaintive +complaintiveness +complaisance +complaisant +complaisantly +complaisantness +complanar +complanate +complanation +complect +complected +complement +complemental +complementally +complementalness +complementariness +complementarism +complementary +complementation +complementative +complementer +complementoid +complete +completedness +completely +completement +completeness +completer +completion +completive +completively +completory +complex +complexedness +complexification +complexify +complexion +complexionably +complexional +complexionally +complexioned +complexionist +complexionless +complexity +complexively +complexly +complexness +complexus +compliable +compliableness +compliably +compliance +compliancy +compliant +compliantly +complicacy +complicant +complicate +complicated +complicatedly +complicatedness +complication +complicative +complice +complicitous +complicity +complier +compliment +complimentable +complimental +complimentally +complimentalness +complimentarily +complimentariness +complimentary +complimentation +complimentative +complimenter +complimentingly +complin +complot +complotter +Complutensian +compluvium +comply +compo +compoer +compole +compone +componed +componency +componendo +component +componental +componented +compony +comport +comportment +compos +compose +composed +composedly +composedness +composer +composita +Compositae +composite +compositely +compositeness +composition +compositional +compositionally +compositive +compositively +compositor +compositorial +compositous +composograph +compossibility +compossible +compost +composture +composure +compotation +compotationship +compotator +compotatory +compote +compotor +compound +compoundable +compoundedness +compounder +compounding +compoundness +comprachico +comprador +comprecation +compreg +compregnate +comprehend +comprehender +comprehendible +comprehendingly +comprehense +comprehensibility +comprehensible +comprehensibleness +comprehensibly +comprehension +comprehensive +comprehensively +comprehensiveness +comprehensor +compresbyter +compresbyterial +compresence +compresent +compress +compressed +compressedly +compressibility +compressible +compressibleness +compressingly +compression +compressional +compressive +compressively +compressometer +compressor +compressure +comprest +compriest +comprisable +comprisal +comprise +comprised +compromise +compromiser +compromising +compromisingly +compromissary +compromission +compromissorial +compromit +compromitment +comprovincial +Compsilura +Compsoa +Compsognathus +Compsothlypidae +compter +Comptometer +Comptonia +comptroller +comptrollership +compulsative +compulsatively +compulsatorily +compulsatory +compulsed +compulsion +compulsitor +compulsive +compulsively +compulsiveness +compulsorily +compulsoriness +compulsory +compunction +compunctionary +compunctionless +compunctious +compunctiously +compunctive +compurgation +compurgator +compurgatorial +compurgatory +compursion +computability +computable +computably +computation +computational +computative +computativeness +compute +computer +computist +computus +comrade +comradely +comradery +comradeship +Comsomol +comstockery +Comtian +Comtism +Comtist +comurmurer +Comus +con +conacaste +conacre +conal +conalbumin +conamed +Conant +conarial +conarium +conation +conational +conationalistic +conative +conatus +conaxial +concamerate +concamerated +concameration +concanavalin +concaptive +concassation +concatenary +concatenate +concatenation +concatenator +concausal +concause +concavation +concave +concavely +concaveness +concaver +concavity +conceal +concealable +concealed +concealedly +concealedness +concealer +concealment +concede +conceded +concededly +conceder +conceit +conceited +conceitedly +conceitedness +conceitless +conceity +conceivability +conceivable +conceivableness +conceivably +conceive +conceiver +concelebrate +concelebration +concent +concenter +concentive +concentralization +concentrate +concentrated +concentration +concentrative +concentrativeness +concentrator +concentric +concentrically +concentricity +concentual +concentus +concept +conceptacle +conceptacular +conceptaculum +conception +conceptional +conceptionist +conceptism +conceptive +conceptiveness +conceptual +conceptualism +conceptualist +conceptualistic +conceptuality +conceptualization +conceptualize +conceptually +conceptus +concern +concerned +concernedly +concernedness +concerning +concerningly +concerningness +concernment +concert +concerted +concertedly +concertgoer +concertina +concertinist +concertist +concertize +concertizer +concertmaster +concertmeister +concertment +concerto +concertstuck +concessible +concession +concessionaire +concessional +concessionary +concessioner +concessionist +concessive +concessively +concessiveness +concessor +concettism +concettist +conch +concha +conchal +conchate +conche +conched +concher +Conchifera +conchiferous +conchiform +conchinine +conchiolin +conchitic +conchitis +Conchobor +conchoid +conchoidal +conchoidally +conchological +conchologically +conchologist +conchologize +conchology +conchometer +conchometry +Conchostraca +conchotome +Conchubar +Conchucu +conchuela +conchy +conchyliated +conchyliferous +conchylium +concierge +concile +conciliable +conciliabule +conciliabulum +conciliar +conciliate +conciliating +conciliatingly +conciliation +conciliationist +conciliative +conciliator +conciliatorily +conciliatoriness +conciliatory +concilium +concinnity +concinnous +concionator +concipiency +concipient +concise +concisely +conciseness +concision +conclamant +conclamation +conclave +conclavist +concludable +conclude +concluder +concluding +concludingly +conclusion +conclusional +conclusionally +conclusive +conclusively +conclusiveness +conclusory +concoagulate +concoagulation +concoct +concocter +concoction +concoctive +concoctor +concolor +concolorous +concomitance +concomitancy +concomitant +concomitantly +conconscious +Concord +concord +concordal +concordance +concordancer +concordant +concordantial +concordantly +concordat +concordatory +concorder +concordial +concordist +concordity +concorporate +Concorrezanes +concourse +concreate +concremation +concrement +concresce +concrescence +concrescible +concrescive +concrete +concretely +concreteness +concreter +concretion +concretional +concretionary +concretism +concretive +concretively +concretize +concretor +concubinage +concubinal +concubinarian +concubinary +concubinate +concubine +concubinehood +concubitancy +concubitant +concubitous +concubitus +concupiscence +concupiscent +concupiscible +concupiscibleness +concupy +concur +concurrence +concurrency +concurrent +concurrently +concurrentness +concurring +concurringly +concursion +concurso +concursus +concuss +concussant +concussion +concussional +concussive +concutient +concyclic +concyclically +cond +Condalia +condemn +condemnable +condemnably +condemnate +condemnation +condemnatory +condemned +condemner +condemning +condemningly +condensability +condensable +condensance +condensary +condensate +condensation +condensational +condensative +condensator +condense +condensed +condensedly +condensedness +condenser +condensery +condensity +condescend +condescendence +condescendent +condescender +condescending +condescendingly +condescendingness +condescension +condescensive +condescensively +condescensiveness +condiction +condictious +condiddle +condiddlement +condign +condigness +condignity +condignly +condiment +condimental +condimentary +condisciple +condistillation +condite +condition +conditional +conditionalism +conditionalist +conditionality +conditionalize +conditionally +conditionate +conditioned +conditioner +condivision +condolatory +condole +condolement +condolence +condolent +condoler +condoling +condolingly +condominate +condominium +condonable +condonance +condonation +condonative +condone +condonement +condoner +condor +conduce +conducer +conducing +conducingly +conducive +conduciveness +conduct +conductance +conductibility +conductible +conductility +conductimeter +conductio +conduction +conductional +conductitious +conductive +conductively +conductivity +conductometer +conductometric +conductor +conductorial +conductorless +conductorship +conductory +conductress +conductus +conduit +conduplicate +conduplicated +conduplication +condurangin +condurango +condylar +condylarth +Condylarthra +condylarthrosis +condylarthrous +condyle +condylectomy +condylion +condyloid +condyloma +condylomatous +condylome +condylopod +Condylopoda +condylopodous +condylos +condylotomy +Condylura +condylure +cone +coned +coneen +coneflower +conehead +coneighboring +coneine +conelet +conemaker +conemaking +Conemaugh +conenose +conepate +coner +cones +conessine +Conestoga +confab +confabular +confabulate +confabulation +confabulator +confabulatory +confact +confarreate +confarreation +confated +confect +confection +confectionary +confectioner +confectionery +Confed +confederacy +confederal +confederalist +confederate +confederater +confederatio +confederation +confederationist +confederatism +confederative +confederatize +confederator +confelicity +conferee +conference +conferential +conferment +conferrable +conferral +conferrer +conferruminate +conferted +Conferva +Confervaceae +confervaceous +conferval +Confervales +confervoid +Confervoideae +confervous +confess +confessable +confessant +confessarius +confessary +confessedly +confesser +confessing +confessingly +confession +confessional +confessionalian +confessionalism +confessionalist +confessionary +confessionist +confessor +confessorship +confessory +confidant +confide +confidence +confidency +confident +confidential +confidentiality +confidentially +confidentialness +confidentiary +confidently +confidentness +confider +confiding +confidingly +confidingness +configural +configurate +configuration +configurational +configurationally +configurationism +configurationist +configurative +configure +confinable +confine +confineable +confined +confinedly +confinedness +confineless +confinement +confiner +confining +confinity +confirm +confirmable +confirmand +confirmation +confirmative +confirmatively +confirmatorily +confirmatory +confirmed +confirmedly +confirmedness +confirmee +confirmer +confirming +confirmingly +confirmity +confirmment +confirmor +confiscable +confiscatable +confiscate +confiscation +confiscator +confiscatory +confitent +confiteor +confiture +confix +conflagrant +conflagrate +conflagration +conflagrative +conflagrator +conflagratory +conflate +conflated +conflation +conflict +conflicting +conflictingly +confliction +conflictive +conflictory +conflow +confluence +confluent +confluently +conflux +confluxibility +confluxible +confluxibleness +confocal +conform +conformability +conformable +conformableness +conformably +conformal +conformance +conformant +conformate +conformation +conformator +conformer +conformist +conformity +confound +confoundable +confounded +confoundedly +confoundedness +confounder +confounding +confoundingly +confrater +confraternal +confraternity +confraternization +confrere +confriar +confrication +confront +confrontal +confrontation +confronte +confronter +confrontment +Confucian +Confucianism +Confucianist +confusability +confusable +confusably +confuse +confused +confusedly +confusedness +confusingly +confusion +confusional +confusticate +confustication +confutable +confutation +confutative +confutator +confute +confuter +conga +congeable +congeal +congealability +congealable +congealableness +congealedness +congealer +congealment +congee +congelation +congelative +congelifraction +congeliturbate +congeliturbation +congener +congeneracy +congeneric +congenerical +congenerous +congenerousness +congenetic +congenial +congeniality +congenialize +congenially +congenialness +congenital +congenitally +congenitalness +conger +congeree +congest +congested +congestible +congestion +congestive +congiary +congius +conglobate +conglobately +conglobation +conglobe +conglobulate +conglomerate +conglomeratic +conglomeration +conglutin +conglutinant +conglutinate +conglutination +conglutinative +Congo +Congoese +Congolese +Congoleum +congou +congratulable +congratulant +congratulate +congratulation +congratulational +congratulator +congratulatory +congredient +congreet +congregable +congreganist +congregant +congregate +congregation +congregational +congregationalism +Congregationalist +congregationalize +congregationally +Congregationer +congregationist +congregative +congregativeness +congregator +Congreso +congress +congresser +congressional +congressionalist +congressionally +congressionist +congressist +congressive +congressman +Congresso +congresswoman +Congreve +Congridae +congroid +congruence +congruency +congruent +congruential +congruently +congruism +congruist +congruistic +congruity +congruous +congruously +congruousness +conhydrine +Coniacian +conic +conical +conicality +conically +conicalness +coniceine +conichalcite +conicine +conicity +conicle +conicoid +conicopoly +conics +Conidae +conidia +conidial +conidian +conidiiferous +conidioid +conidiophore +conidiophorous +conidiospore +conidium +conifer +Coniferae +coniferin +coniferophyte +coniferous +conification +coniform +Conilurus +conima +conimene +conin +conine +Coniogramme +Coniophora +Coniopterygidae +Conioselinum +coniosis +Coniothyrium +coniroster +conirostral +Conirostres +Conium +conject +conjective +conjecturable +conjecturably +conjectural +conjecturalist +conjecturality +conjecturally +conjecture +conjecturer +conjobble +conjoin +conjoined +conjoinedly +conjoiner +conjoint +conjointly +conjointment +conjointness +conjubilant +conjugable +conjugacy +conjugal +Conjugales +conjugality +conjugally +conjugant +conjugata +Conjugatae +conjugate +conjugated +conjugately +conjugateness +conjugation +conjugational +conjugationally +conjugative +conjugator +conjugial +conjugium +conjunct +conjunction +conjunctional +conjunctionally +conjunctiva +conjunctival +conjunctive +conjunctively +conjunctiveness +conjunctivitis +conjunctly +conjunctur +conjunctural +conjuncture +conjuration +conjurator +conjure +conjurement +conjurer +conjurership +conjuror +conjury +conk +conkanee +conker +conkers +conky +conn +connach +Connaraceae +connaraceous +connarite +Connarus +connascency +connascent +connatal +connate +connately +connateness +connation +connatural +connaturality +connaturalize +connaturally +connaturalness +connature +connaught +connect +connectable +connectant +connected +connectedly +connectedness +connectible +connection +connectional +connectival +connective +connectively +connectivity +connector +connellite +conner +connex +connexion +connexionalism +connexity +connexive +connexivum +connexus +Connie +conning +conniption +connivance +connivancy +connivant +connivantly +connive +connivent +conniver +Connochaetes +connoissance +connoisseur +connoisseurship +connotation +connotative +connotatively +connote +connotive +connotively +connubial +connubiality +connubially +connubiate +connubium +connumerate +connumeration +Conocarpus +Conocephalum +Conocephalus +conoclinium +conocuneus +conodont +conoid +conoidal +conoidally +conoidic +conoidical +conoidically +Conolophus +conominee +cononintelligent +Conopholis +conopid +Conopidae +conoplain +conopodium +Conopophaga +Conopophagidae +Conor +Conorhinus +conormal +conoscope +conourish +Conoy +conphaseolin +conplane +conquedle +conquer +conquerable +conquerableness +conqueress +conquering +conqueringly +conquerment +conqueror +conquest +conquian +conquinamine +conquinine +conquistador +Conrad +conrector +conrectorship +conred +Conringia +consanguine +consanguineal +consanguinean +consanguineous +consanguineously +consanguinity +conscience +conscienceless +consciencelessly +consciencelessness +consciencewise +conscient +conscientious +conscientiously +conscientiousness +conscionable +conscionableness +conscionably +conscious +consciously +consciousness +conscribe +conscript +conscription +conscriptional +conscriptionist +conscriptive +consecrate +consecrated +consecratedness +consecrater +consecration +consecrative +consecrator +consecratory +consectary +consecute +consecution +consecutive +consecutively +consecutiveness +consecutives +consenescence +consenescency +consension +consensual +consensually +consensus +consent +consentable +consentaneity +consentaneous +consentaneously +consentaneousness +consentant +consenter +consentful +consentfully +consentience +consentient +consentiently +consenting +consentingly +consentingness +consentive +consentively +consentment +consequence +consequency +consequent +consequential +consequentiality +consequentially +consequentialness +consequently +consertal +conservable +conservacy +conservancy +conservant +conservate +conservation +conservational +conservationist +conservatism +conservatist +conservative +conservatively +conservativeness +conservatize +conservatoire +conservator +conservatorio +conservatorium +conservatorship +conservatory +conservatrix +conserve +conserver +consider +considerability +considerable +considerableness +considerably +considerance +considerate +considerately +considerateness +consideration +considerative +consideratively +considerativeness +considerator +considered +considerer +considering +consideringly +consign +consignable +consignatary +consignation +consignatory +consignee +consigneeship +consigner +consignificant +consignificate +consignification +consignificative +consignificator +consignify +consignment +consignor +consiliary +consilience +consilient +consimilar +consimilarity +consimilate +consist +consistence +consistency +consistent +consistently +consistorial +consistorian +consistory +consociate +consociation +consociational +consociationism +consociative +consocies +consol +consolable +consolableness +consolably +Consolamentum +consolation +Consolato +consolatorily +consolatoriness +consolatory +consolatrix +console +consolement +consoler +consolidant +consolidate +consolidated +consolidation +consolidationist +consolidative +consolidator +consoling +consolingly +consolute +consomme +consonance +consonancy +consonant +consonantal +consonantic +consonantism +consonantize +consonantly +consonantness +consonate +consonous +consort +consortable +consorter +consortial +consortion +consortism +consortium +consortship +consound +conspecies +conspecific +conspectus +consperse +conspersion +conspicuity +conspicuous +conspicuously +conspicuousness +conspiracy +conspirant +conspiration +conspirative +conspirator +conspiratorial +conspiratorially +conspiratory +conspiratress +conspire +conspirer +conspiring +conspiringly +conspue +constable +constablery +constableship +constabless +constablewick +constabular +constabulary +Constance +constancy +constant +constantan +Constantine +Constantinian +Constantinopolitan +constantly +constantness +constat +constatation +constate +constatory +constellate +constellation +constellatory +consternate +consternation +constipate +constipation +constituency +constituent +constituently +constitute +constituter +constitution +constitutional +constitutionalism +constitutionalist +constitutionality +constitutionalization +constitutionalize +constitutionally +constitutionary +constitutioner +constitutionist +constitutive +constitutively +constitutiveness +constitutor +constrain +constrainable +constrained +constrainedly +constrainedness +constrainer +constraining +constrainingly +constrainment +constraint +constrict +constricted +constriction +constrictive +constrictor +constringe +constringency +constringent +construability +construable +construct +constructer +constructible +construction +constructional +constructionally +constructionism +constructionist +constructive +constructively +constructiveness +constructivism +constructivist +constructor +constructorship +constructure +construe +construer +constuprate +constupration +consubsist +consubsistency +consubstantial +consubstantialism +consubstantialist +consubstantiality +consubstantially +consubstantiate +consubstantiation +consubstantiationist +consubstantive +consuete +consuetitude +consuetude +consuetudinal +consuetudinary +consul +consulage +consular +consularity +consulary +consulate +consulship +consult +consultable +consultant +consultary +consultation +consultative +consultatory +consultee +consulter +consulting +consultive +consultively +consultor +consultory +consumable +consume +consumedly +consumeless +consumer +consuming +consumingly +consumingness +consummate +consummately +consummation +consummative +consummatively +consummativeness +consummator +consummatory +consumpt +consumpted +consumptible +consumption +consumptional +consumptive +consumptively +consumptiveness +consumptivity +consute +contabescence +contabescent +contact +contactor +contactual +contactually +contagion +contagioned +contagionist +contagiosity +contagious +contagiously +contagiousness +contagium +contain +containable +container +containment +contakion +contaminable +contaminant +contaminate +contamination +contaminative +contaminator +contaminous +contangential +contango +conte +contect +contection +contemn +contemner +contemnible +contemnibly +contemning +contemningly +contemnor +contemper +contemperate +contemperature +contemplable +contemplamen +contemplant +contemplate +contemplatingly +contemplation +contemplatist +contemplative +contemplatively +contemplativeness +contemplator +contemplature +contemporanean +contemporaneity +contemporaneous +contemporaneously +contemporaneousness +contemporarily +contemporariness +contemporary +contemporize +contempt +contemptful +contemptibility +contemptible +contemptibleness +contemptibly +contemptuous +contemptuously +contemptuousness +contendent +contender +contending +contendingly +contendress +content +contentable +contented +contentedly +contentedness +contentful +contention +contentional +contentious +contentiously +contentiousness +contentless +contently +contentment +contentness +contents +conter +conterminal +conterminant +contermine +conterminous +conterminously +conterminousness +contest +contestable +contestableness +contestably +contestant +contestation +contestee +contester +contestingly +contestless +context +contextive +contextual +contextually +contextural +contexture +contextured +conticent +contignation +contiguity +contiguous +contiguously +contiguousness +continence +continency +continent +continental +Continentaler +continentalism +continentalist +continentality +Continentalize +continentally +continently +contingence +contingency +contingent +contingential +contingentialness +contingently +contingentness +continuable +continual +continuality +continually +continualness +continuance +continuancy +continuando +continuant +continuantly +continuate +continuately +continuateness +continuation +continuative +continuatively +continuativeness +continuator +continue +continued +continuedly +continuedness +continuer +continuingly +continuist +continuity +continuous +continuously +continuousness +continuum +contise +contline +conto +contorniate +contorsive +contort +Contortae +contorted +contortedly +contortedness +contortion +contortional +contortionate +contortioned +contortionist +contortionistic +contortive +contour +contourne +contra +contraband +contrabandage +contrabandery +contrabandism +contrabandist +contrabandista +contrabass +contrabassist +contrabasso +contracapitalist +contraception +contraceptionist +contraceptive +contracivil +contraclockwise +contract +contractable +contractant +contractation +contracted +contractedly +contractedness +contractee +contracter +contractibility +contractible +contractibleness +contractibly +contractile +contractility +contraction +contractional +contractionist +contractive +contractively +contractiveness +contractor +contractual +contractually +contracture +contractured +contradebt +contradict +contradictable +contradictedness +contradicter +contradiction +contradictional +contradictious +contradictiously +contradictiousness +contradictive +contradictively +contradictiveness +contradictor +contradictorily +contradictoriness +contradictory +contradiscriminate +contradistinct +contradistinction +contradistinctive +contradistinctively +contradistinctly +contradistinguish +contradivide +contrafacture +contrafagotto +contrafissura +contraflexure +contraflow +contrafocal +contragredience +contragredient +contrahent +contrail +contraindicate +contraindication +contraindicative +contralateral +contralto +contramarque +contranatural +contrantiscion +contraoctave +contraparallelogram +contraplex +contrapolarization +contrapone +contraponend +Contraposaune +contrapose +contraposit +contraposita +contraposition +contrapositive +contraprogressist +contraprop +contraproposal +contraption +contraptious +contrapuntal +contrapuntalist +contrapuntally +contrapuntist +contrapunto +contrarational +contraregular +contraregularity +contraremonstrance +contraremonstrant +contrarevolutionary +contrariant +contrariantly +contrariety +contrarily +contrariness +contrarious +contrariously +contrariousness +contrariwise +contrarotation +contrary +contrascriptural +contrast +contrastable +contrastably +contrastedly +contrastimulant +contrastimulation +contrastimulus +contrastingly +contrastive +contrastively +contrastment +contrasty +contrasuggestible +contratabular +contrate +contratempo +contratenor +contravalence +contravallation +contravariant +contravene +contravener +contravention +contraversion +contravindicate +contravindication +contrawise +contrayerva +contrectation +contreface +contrefort +contretemps +contributable +contribute +contribution +contributional +contributive +contributively +contributiveness +contributor +contributorial +contributorship +contributory +contrite +contritely +contriteness +contrition +contriturate +contrivance +contrivancy +contrive +contrivement +contriver +control +controllability +controllable +controllableness +controllably +controller +controllership +controlless +controllingly +controlment +controversial +controversialism +controversialist +controversialize +controversially +controversion +controversional +controversionalism +controversionalist +controversy +controvert +controverter +controvertible +controvertibly +controvertist +contubernal +contubernial +contubernium +contumacious +contumaciously +contumaciousness +contumacity +contumacy +contumelious +contumeliously +contumeliousness +contumely +contund +conturbation +contuse +contusion +contusioned +contusive +conubium +Conularia +conumerary +conumerous +conundrum +conundrumize +conurbation +conure +Conuropsis +Conurus +conus +conusable +conusance +conusant +conusee +conusor +conutrition +conuzee +conuzor +convalesce +convalescence +convalescency +convalescent +convalescently +convallamarin +Convallaria +Convallariaceae +convallariaceous +convallarin +convect +convection +convectional +convective +convectively +convector +convenable +convenably +convene +convenee +convener +convenership +convenience +conveniency +convenient +conveniently +convenientness +convent +conventical +conventically +conventicle +conventicler +conventicular +convention +conventional +conventionalism +conventionalist +conventionality +conventionalization +conventionalize +conventionally +conventionary +conventioner +conventionism +conventionist +conventionize +conventual +conventually +converge +convergement +convergence +convergency +convergent +convergescence +converging +conversable +conversableness +conversably +conversance +conversancy +conversant +conversantly +conversation +conversationable +conversational +conversationalist +conversationally +conversationism +conversationist +conversationize +conversative +converse +conversely +converser +conversibility +conversible +conversion +conversional +conversionism +conversionist +conversive +convert +converted +convertend +converter +convertibility +convertible +convertibleness +convertibly +converting +convertingness +convertise +convertism +convertite +convertive +convertor +conveth +convex +convexed +convexedly +convexedness +convexity +convexly +convexness +convey +conveyable +conveyal +conveyance +conveyancer +conveyancing +conveyer +convict +convictable +conviction +convictional +convictism +convictive +convictively +convictiveness +convictment +convictor +convince +convinced +convincedly +convincedness +convincement +convincer +convincibility +convincible +convincing +convincingly +convincingness +convival +convive +convivial +convivialist +conviviality +convivialize +convivially +convocant +convocate +convocation +convocational +convocationally +convocationist +convocative +convocator +convoke +convoker +Convoluta +convolute +convoluted +convolutely +convolution +convolutional +convolutionary +convolutive +convolve +convolvement +Convolvulaceae +convolvulaceous +convolvulad +convolvuli +convolvulic +convolvulin +convolvulinic +convolvulinolic +Convolvulus +convoy +convulsant +convulse +convulsedly +convulsibility +convulsible +convulsion +convulsional +convulsionary +convulsionism +convulsionist +convulsive +convulsively +convulsiveness +cony +conycatcher +conyrine +coo +cooba +coodle +cooee +cooer +coof +Coohee +cooing +cooingly +cooja +cook +cookable +cookbook +cookdom +cookee +cookeite +cooker +cookery +cookhouse +cooking +cookish +cookishly +cookless +cookmaid +cookout +cookroom +cookshack +cookshop +cookstove +cooky +cool +coolant +coolen +cooler +coolerman +coolheaded +coolheadedly +coolheadedness +coolhouse +coolibah +coolie +cooling +coolingly +coolingness +coolish +coolly +coolness +coolth +coolung +coolweed +coolwort +cooly +coom +coomb +coomy +coon +cooncan +coonily +cooniness +coonroot +coonskin +coontail +coontie +coony +coop +cooper +cooperage +Cooperia +coopering +coopery +cooree +Coorg +coorie +cooruptibly +Coos +cooser +coost +Coosuc +coot +cooter +cootfoot +coothay +cootie +cop +copa +copable +copacetic +copaene +copaiba +copaibic +Copaifera +Copaiva +copaivic +copaiye +copal +copalche +copalcocote +copaliferous +copalite +copalm +coparallel +coparcenary +coparcener +coparceny +coparent +copart +copartaker +copartner +copartnership +copartnery +coparty +copassionate +copastor +copastorate +copatain +copatentee +copatriot +copatron +copatroness +cope +Copehan +copei +Copelata +Copelatae +copelate +copellidine +copeman +copemate +copen +copending +copenetrate +Copeognatha +copepod +Copepoda +copepodan +copepodous +coper +coperception +coperiodic +Copernican +Copernicanism +Copernicia +coperta +copesman +copesmate +copestone +copetitioner +cophasal +Cophetua +cophosis +copiability +copiable +copiapite +copied +copier +copilot +coping +copiopia +copiopsia +copiosity +copious +copiously +copiousness +copis +copist +copita +coplaintiff +coplanar +coplanarity +copleased +coplotter +coploughing +coplowing +copolar +copolymer +copolymerization +copolymerize +coppaelite +copped +copper +copperas +copperbottom +copperer +copperhead +copperheadism +coppering +copperish +copperization +copperize +copperleaf +coppernose +coppernosed +copperplate +copperproof +coppersidesman +copperskin +coppersmith +coppersmithing +copperware +copperwing +copperworks +coppery +copperytailed +coppet +coppice +coppiced +coppicing +coppin +copping +copple +copplecrown +coppled +coppy +copr +copra +coprecipitate +coprecipitation +copremia +copremic +copresbyter +copresence +copresent +Coprides +Coprinae +coprincipal +coprincipate +Coprinus +coprisoner +coprodaeum +coproduce +coproducer +coprojector +coprolagnia +coprolagnist +coprolalia +coprolaliac +coprolite +coprolith +coprolitic +coprology +copromisor +copromoter +coprophagan +coprophagia +coprophagist +coprophagous +coprophagy +coprophilia +coprophiliac +coprophilic +coprophilism +coprophilous +coprophyte +coproprietor +coproprietorship +coprose +Coprosma +coprostasis +coprosterol +coprozoic +copse +copsewood +copsewooded +copsing +copsy +Copt +copter +Coptic +Coptis +copula +copulable +copular +copularium +copulate +copulation +copulative +copulatively +copulatory +copunctal +copurchaser +copus +copy +copybook +copycat +copygraph +copygraphed +copyhold +copyholder +copyholding +copyism +copyist +copyman +copyreader +copyright +copyrightable +copyrighter +copywise +coque +coquecigrue +coquelicot +coqueluche +coquet +coquetoon +coquetry +coquette +coquettish +coquettishly +coquettishness +coquicken +coquilla +Coquille +coquille +coquimbite +coquina +coquita +Coquitlam +coquito +cor +Cora +cora +Corabeca +Corabecan +corach +Coraciae +coracial +Coracias +Coracii +Coraciidae +coraciiform +Coraciiformes +coracine +coracle +coracler +coracoacromial +coracobrachial +coracobrachialis +coracoclavicular +coracocostal +coracohumeral +coracohyoid +coracoid +coracoidal +coracomandibular +coracomorph +Coracomorphae +coracomorphic +coracopectoral +coracoprocoracoid +coracoradialis +coracoscapular +coracovertebral +coradical +coradicate +corah +coraise +coral +coralberry +coralbush +coraled +coralflower +coralist +corallet +Corallian +corallic +Corallidae +corallidomous +coralliferous +coralliform +Coralligena +coralligenous +coralligerous +corallike +Corallina +Corallinaceae +corallinaceous +coralline +corallite +Corallium +coralloid +coralloidal +Corallorhiza +corallum +Corallus +coralroot +coralwort +coram +Corambis +coranto +corban +corbeau +corbeil +corbel +corbeling +corbicula +corbiculate +corbiculum +corbie +corbiestep +corbovinum +corbula +corcass +Corchorus +corcir +corcopali +Corcyraean +cord +cordage +Cordaitaceae +cordaitaceous +cordaitalean +Cordaitales +cordaitean +Cordaites +cordant +cordate +cordately +cordax +Cordeau +corded +cordel +Cordelia +Cordelier +cordeliere +cordelle +corder +Cordery +cordewane +Cordia +cordial +cordiality +cordialize +cordially +cordialness +cordiceps +cordicole +cordierite +cordies +cordiform +cordigeri +cordillera +cordilleran +cordiner +cording +cordite +corditis +cordleaf +cordmaker +cordoba +cordon +cordonnet +Cordovan +Cordula +corduroy +corduroyed +cordwain +cordwainer +cordwainery +cordwood +cordy +Cordyceps +cordyl +Cordylanthus +Cordyline +core +corebel +coreceiver +coreciprocal +corectome +corectomy +corector +cored +coredeem +coredeemer +coredemptress +coreductase +Coree +coreflexed +coregence +coregency +coregent +coregnancy +coregnant +coregonid +Coregonidae +coregonine +coregonoid +Coregonus +coreid +Coreidae +coreign +coreigner +corejoice +corelate +corelated +corelation +corelative +corelatively +coreless +coreligionist +corella +corelysis +Corema +coremaker +coremaking +coremium +coremorphosis +corenounce +coreometer +Coreopsis +coreplastic +coreplasty +corer +coresidence +coresidual +coresign +coresonant +coresort +corespect +corespondency +corespondent +coretomy +coreveler +coreveller +corevolve +corf +Corfiote +Corflambo +corge +corgi +coriaceous +corial +coriamyrtin +coriander +coriandrol +Coriandrum +Coriaria +Coriariaceae +coriariaceous +coriin +Corimelaena +Corimelaenidae +Corin +corindon +Corineus +coring +Corinna +corinne +Corinth +Corinthian +Corinthianesque +Corinthianism +Corinthianize +Coriolanus +coriparian +corium +Corixa +Corixidae +cork +corkage +corkboard +corke +corked +corker +corkiness +corking +corkish +corkite +corkmaker +corkmaking +corkscrew +corkscrewy +corkwing +corkwood +corky +corm +Cormac +cormel +cormidium +cormoid +Cormophyta +cormophyte +cormophytic +cormorant +cormous +cormus +corn +Cornaceae +cornaceous +cornage +cornbell +cornberry +cornbin +cornbinks +cornbird +cornbole +cornbottle +cornbrash +corncake +corncob +corncracker +corncrib +corncrusher +corndodger +cornea +corneagen +corneal +cornein +corneitis +cornel +Cornelia +cornelian +Cornelius +cornemuse +corneocalcareous +corneosclerotic +corneosiliceous +corneous +corner +cornerbind +cornered +cornerer +cornerpiece +cornerstone +cornerways +cornerwise +cornet +cornetcy +cornettino +cornettist +corneule +corneum +cornfield +cornfloor +cornflower +corngrower +cornhouse +cornhusk +cornhusker +cornhusking +cornic +cornice +cornicle +corniculate +corniculer +corniculum +Corniferous +cornific +cornification +cornified +corniform +cornigerous +cornin +corning +corniplume +Cornish +Cornishman +cornland +cornless +cornloft +cornmaster +cornmonger +cornopean +cornpipe +cornrick +cornroot +cornstalk +cornstarch +cornstook +cornu +cornual +cornuate +cornuated +cornubianite +cornucopia +Cornucopiae +cornucopian +cornucopiate +cornule +cornulite +Cornulites +cornupete +Cornus +cornute +cornuted +cornutine +cornuto +cornwallis +cornwallite +corny +coroa +Coroado +corocleisis +corodiary +corodiastasis +corodiastole +corody +corol +corolla +corollaceous +corollarial +corollarially +corollary +corollate +corollated +corolliferous +corolliform +corollike +corolline +corollitic +corometer +corona +coronach +coronad +coronadite +coronae +coronagraph +coronagraphic +coronal +coronale +coronaled +coronally +coronamen +coronary +coronate +coronated +coronation +coronatorial +coroner +coronership +coronet +coroneted +coronetted +coronetty +coroniform +Coronilla +coronillin +coronion +coronitis +coronium +coronize +coronobasilar +coronofacial +coronofrontal +coronoid +Coronopus +coronule +coroparelcysis +coroplast +coroplasta +coroplastic +Coropo +coroscopy +corotomy +corozo +corp +corpora +corporal +corporalism +corporality +corporally +corporalship +corporas +corporate +corporately +corporateness +corporation +corporational +corporationer +corporationism +corporative +corporator +corporature +corporeal +corporealist +corporeality +corporealization +corporealize +corporeally +corporealness +corporeals +corporeity +corporeous +corporification +corporify +corporosity +corposant +corps +corpsbruder +corpse +corpsman +corpulence +corpulency +corpulent +corpulently +corpulentness +corpus +corpuscle +corpuscular +corpuscularian +corpuscularity +corpusculated +corpuscule +corpusculous +corpusculum +corrade +corradial +corradiate +corradiation +corral +corrasion +corrasive +Correa +correal +correality +correct +correctable +correctant +corrected +correctedness +correctible +correcting +correctingly +correction +correctional +correctionalist +correctioner +correctitude +corrective +correctively +correctiveness +correctly +correctness +corrector +correctorship +correctress +correctrice +corregidor +correlatable +correlate +correlated +correlation +correlational +correlative +correlatively +correlativeness +correlativism +correlativity +correligionist +corrente +correption +corresol +correspond +correspondence +correspondency +correspondent +correspondential +correspondentially +correspondently +correspondentship +corresponder +corresponding +correspondingly +corresponsion +corresponsive +corresponsively +corridor +corridored +corrie +Corriedale +corrige +corrigenda +corrigendum +corrigent +corrigibility +corrigible +corrigibleness +corrigibly +Corrigiola +Corrigiolaceae +corrival +corrivality +corrivalry +corrivalship +corrivate +corrivation +corrobboree +corroborant +corroborate +corroboration +corroborative +corroboratively +corroborator +corroboratorily +corroboratory +corroboree +corrode +corrodent +Corrodentia +corroder +corrodiary +corrodibility +corrodible +corrodier +corroding +corrosibility +corrosible +corrosibleness +corrosion +corrosional +corrosive +corrosively +corrosiveness +corrosivity +corrugate +corrugated +corrugation +corrugator +corrupt +corrupted +corruptedly +corruptedness +corrupter +corruptful +corruptibility +corruptible +corruptibleness +corrupting +corruptingly +corruption +corruptionist +corruptive +corruptively +corruptly +corruptness +corruptor +corruptress +corsac +corsage +corsaint +corsair +corse +corselet +corsepresent +corsesque +corset +corseting +corsetless +corsetry +Corsican +corsie +corsite +corta +Cortaderia +cortege +Cortes +cortex +cortez +cortical +cortically +corticate +corticated +corticating +cortication +cortices +corticiferous +corticiform +corticifugal +corticifugally +corticipetal +corticipetally +Corticium +corticoafferent +corticoefferent +corticoline +corticopeduncular +corticose +corticospinal +corticosterone +corticostriate +corticous +cortin +cortina +cortinarious +Cortinarius +cortinate +cortisone +cortlandtite +Corton +coruco +coruler +Coruminacan +corundophilite +corundum +corupay +coruscant +coruscate +coruscation +corver +corvette +corvetto +Corvidae +corviform +corvillosum +corvina +Corvinae +corvine +corvoid +Corvus +Corybant +Corybantian +corybantiasm +Corybantic +corybantic +Corybantine +corybantish +corybulbin +corybulbine +corycavamine +corycavidin +corycavidine +corycavine +Corycia +Corycian +corydalin +corydaline +Corydalis +corydine +Corydon +coryl +Corylaceae +corylaceous +corylin +Corylopsis +Corylus +corymb +corymbed +corymbiate +corymbiated +corymbiferous +corymbiform +corymbose +corymbous +corynebacterial +Corynebacterium +Coryneum +corynine +Corynocarpaceae +corynocarpaceous +Corynocarpus +Corypha +Coryphaena +coryphaenid +Coryphaenidae +coryphaenoid +Coryphaenoididae +coryphaeus +coryphee +coryphene +Coryphodon +coryphodont +coryphylly +corytuberine +coryza +cos +cosalite +cosaque +cosavior +coscet +Coscinodiscaceae +Coscinodiscus +coscinomancy +coscoroba +coseasonal +coseat +cosec +cosecant +cosech +cosectarian +cosectional +cosegment +coseism +coseismal +coseismic +cosenator +cosentiency +cosentient +coservant +cosession +coset +cosettler +cosh +cosharer +cosheath +cosher +cosherer +coshering +coshery +cosignatory +cosigner +cosignitary +cosily +cosinage +cosine +cosiness +cosingular +cosinusoid +Cosmati +cosmecology +cosmesis +cosmetic +cosmetical +cosmetically +cosmetician +cosmetiste +cosmetological +cosmetologist +cosmetology +cosmic +cosmical +cosmicality +cosmically +cosmism +cosmist +cosmocracy +cosmocrat +cosmocratic +cosmogenesis +cosmogenetic +cosmogenic +cosmogeny +cosmogonal +cosmogoner +cosmogonic +cosmogonical +cosmogonist +cosmogonize +cosmogony +cosmographer +cosmographic +cosmographical +cosmographically +cosmographist +cosmography +cosmolabe +cosmolatry +cosmologic +cosmological +cosmologically +cosmologist +cosmology +cosmometry +cosmopathic +cosmoplastic +cosmopoietic +cosmopolicy +cosmopolis +cosmopolitan +cosmopolitanism +cosmopolitanization +cosmopolitanize +cosmopolitanly +cosmopolite +cosmopolitic +cosmopolitical +cosmopolitics +cosmopolitism +cosmorama +cosmoramic +cosmorganic +cosmos +cosmoscope +cosmosophy +cosmosphere +cosmotellurian +cosmotheism +cosmotheist +cosmotheistic +cosmothetic +cosmotron +cosmozoan +cosmozoic +cosmozoism +cosonant +cosounding +cosovereign +cosovereignty +cospecies +cospecific +cosphered +cosplendor +cosplendour +coss +Cossack +Cossaean +cossas +cosse +cosset +cossette +cossid +Cossidae +cossnent +cossyrite +cost +costa +Costaea +costal +costalgia +costally +costander +Costanoan +costar +costard +Costata +costate +costated +costean +costeaning +costectomy +costellate +coster +costerdom +costermonger +costicartilage +costicartilaginous +costicervical +costiferous +costiform +costing +costipulator +costispinal +costive +costively +costiveness +costless +costlessness +costliness +costly +costmary +costoabdominal +costoapical +costocentral +costochondral +costoclavicular +costocolic +costocoracoid +costodiaphragmatic +costogenic +costoinferior +costophrenic +costopleural +costopneumopexy +costopulmonary +costoscapular +costosternal +costosuperior +costothoracic +costotome +costotomy +costotrachelian +costotransversal +costotransverse +costovertebral +costoxiphoid +costraight +costrel +costula +costulation +costume +costumer +costumery +costumic +costumier +costumiere +costuming +costumist +costusroot +cosubject +cosubordinate +cosuffer +cosufferer +cosuggestion +cosuitor +cosurety +cosustain +coswearer +cosy +cosymmedian +cot +cotangent +cotangential +cotarius +cotarnine +cotch +cote +coteful +coteline +coteller +cotemporane +cotemporanean +cotemporaneous +cotemporaneously +cotemporary +cotenancy +cotenant +cotenure +coterell +coterie +coterminous +Cotesian +coth +cothamore +cothe +cotheorist +cothish +cothon +cothurn +cothurnal +cothurnate +cothurned +cothurnian +cothurnus +cothy +cotidal +cotillage +cotillion +Cotinga +cotingid +Cotingidae +cotingoid +Cotinus +cotise +cotitular +cotland +cotman +coto +cotoin +Cotonam +Cotoneaster +cotonier +cotorment +cotoro +cotorture +Cotoxo +cotquean +cotraitor +cotransfuse +cotranslator +cotranspire +cotransubstantiate +cotrine +cotripper +cotrustee +cotset +cotsetla +cotsetle +cotta +cottabus +cottage +cottaged +cottager +cottagers +cottagey +cotte +cotted +cotter +cotterel +cotterite +cotterway +cottid +Cottidae +cottier +cottierism +cottiform +cottoid +cotton +cottonade +cottonbush +cottonee +cottoneer +cottoner +Cottonian +cottonization +cottonize +cottonless +cottonmouth +cottonocracy +Cottonopolis +cottonseed +cottontail +cottontop +cottonweed +cottonwood +cottony +Cottus +cotty +cotuit +cotula +cotunnite +Coturnix +cotutor +cotwin +cotwinned +cotwist +cotyla +cotylar +cotyledon +cotyledonal +cotyledonar +cotyledonary +cotyledonous +cotyliform +cotyligerous +cotyliscus +cotyloid +Cotylophora +cotylophorous +cotylopubic +cotylosacral +cotylosaur +Cotylosauria +cotylosaurian +cotype +Cotys +Cotyttia +couac +coucal +couch +couchancy +couchant +couched +couchee +coucher +couching +couchmaker +couchmaking +couchmate +couchy +coude +coudee +coue +Coueism +cougar +cough +cougher +coughroot +coughweed +coughwort +cougnar +coul +could +couldron +coulee +coulisse +coulomb +coulometer +coulterneb +coulure +couma +coumalic +coumalin +coumara +coumaran +coumarate +coumaric +coumarilic +coumarin +coumarinic +coumarone +coumarou +Coumarouna +council +councilist +councilman +councilmanic +councilor +councilorship +councilwoman +counderstand +counite +couniversal +counsel +counselable +counselee +counselful +counselor +counselorship +count +countable +countableness +countably +countdom +countenance +countenancer +counter +counterabut +counteraccusation +counteracquittance +counteract +counteractant +counteracter +counteracting +counteractingly +counteraction +counteractive +counteractively +counteractivity +counteractor +counteraddress +counteradvance +counteradvantage +counteradvice +counteradvise +counteraffirm +counteraffirmation +counteragency +counteragent +counteragitate +counteragitation +counteralliance +counterambush +counterannouncement +counteranswer +counterappeal +counterappellant +counterapproach +counterapse +counterarch +counterargue +counterargument +counterartillery +counterassertion +counterassociation +counterassurance +counterattack +counterattestation +counterattired +counterattraction +counterattractive +counterattractively +counteraverment +counteravouch +counteravouchment +counterbalance +counterbarrage +counterbase +counterbattery +counterbeating +counterbend +counterbewitch +counterbid +counterblast +counterblow +counterbond +counterborder +counterbore +counterboycott +counterbrace +counterbranch +counterbrand +counterbreastwork +counterbuff +counterbuilding +countercampaign +countercarte +countercause +counterchange +counterchanged +countercharge +countercharm +countercheck +countercheer +counterclaim +counterclaimant +counterclockwise +countercolored +countercommand +countercompetition +countercomplaint +countercompony +countercondemnation +counterconquest +counterconversion +countercouchant +countercoupe +countercourant +countercraft +countercriticism +countercross +countercry +countercurrent +countercurrently +countercurrentwise +counterdance +counterdash +counterdecision +counterdeclaration +counterdecree +counterdefender +counterdemand +counterdemonstration +counterdeputation +counterdesire +counterdevelopment +counterdifficulty +counterdigged +counterdike +counterdiscipline +counterdisengage +counterdisengagement +counterdistinction +counterdistinguish +counterdoctrine +counterdogmatism +counterdraft +counterdrain +counterdrive +counterearth +counterefficiency +countereffort +counterembattled +counterembowed +counterenamel +counterend +counterenergy +counterengagement +counterengine +counterenthusiasm +counterentry +counterequivalent +counterermine +counterespionage +counterestablishment +counterevidence +counterexaggeration +counterexcitement +counterexcommunication +counterexercise +counterexplanation +counterexposition +counterexpostulation +counterextend +counterextension +counterfact +counterfallacy +counterfaller +counterfeit +counterfeiter +counterfeitly +counterfeitment +counterfeitness +counterferment +counterfessed +counterfire +counterfix +counterflange +counterflashing +counterflight +counterflory +counterflow +counterflux +counterfoil +counterforce +counterformula +counterfort +counterfugue +countergabble +countergabion +countergambit +countergarrison +countergauge +countergauger +countergift +countergirded +counterglow +counterguard +counterhaft +counterhammering +counterhypothesis +counteridea +counterideal +counterimagination +counterimitate +counterimitation +counterimpulse +counterindentation +counterindented +counterindicate +counterindication +counterinfluence +counterinsult +counterintelligence +counterinterest +counterinterpretation +counterintrigue +counterinvective +counterirritant +counterirritate +counterirritation +counterjudging +counterjumper +counterlath +counterlathing +counterlatration +counterlaw +counterleague +counterlegislation +counterlife +counterlocking +counterlode +counterlove +counterly +countermachination +counterman +countermand +countermandable +countermaneuver +countermanifesto +countermarch +countermark +countermarriage +countermeasure +countermeet +countermessage +countermigration +countermine +countermission +countermotion +countermount +countermove +countermovement +countermure +countermutiny +counternaiant +counternarrative +counternatural +counternecromancy +counternoise +counternotice +counterobjection +counterobligation +counteroffensive +counteroffer +counteropening +counteropponent +counteropposite +counterorator +counterorder +counterorganization +counterpaled +counterpaly +counterpane +counterpaned +counterparadox +counterparallel +counterparole +counterparry +counterpart +counterpassant +counterpassion +counterpenalty +counterpendent +counterpetition +counterpicture +counterpillar +counterplan +counterplay +counterplayer +counterplea +counterplead +counterpleading +counterplease +counterplot +counterpoint +counterpointe +counterpointed +counterpoise +counterpoison +counterpole +counterponderate +counterpose +counterposition +counterposting +counterpotence +counterpotency +counterpotent +counterpractice +counterpray +counterpreach +counterpreparation +counterpressure +counterprick +counterprinciple +counterprocess +counterproject +counterpronunciamento +counterproof +counterpropaganda +counterpropagandize +counterprophet +counterproposal +counterproposition +counterprotection +counterprotest +counterprove +counterpull +counterpunch +counterpuncture +counterpush +counterquartered +counterquarterly +counterquery +counterquestion +counterquip +counterradiation +counterraid +counterraising +counterrampant +counterrate +counterreaction +counterreason +counterreckoning +counterrecoil +counterreconnaissance +counterrefer +counterreflected +counterreform +counterreformation +counterreligion +counterremonstrant +counterreply +counterreprisal +counterresolution +counterrestoration +counterretreat +counterrevolution +counterrevolutionary +counterrevolutionist +counterrevolutionize +counterriposte +counterroll +counterround +counterruin +countersale +countersalient +counterscale +counterscalloped +counterscarp +counterscoff +countersconce +counterscrutiny +countersea +counterseal +countersecure +countersecurity +counterselection +countersense +counterservice +countershade +countershaft +countershafting +countershear +countershine +countershout +counterside +countersiege +countersign +countersignal +countersignature +countersink +countersleight +counterslope +countersmile +countersnarl +counterspying +counterstain +counterstamp +counterstand +counterstatant +counterstatement +counterstatute +counterstep +counterstimulate +counterstimulation +counterstimulus +counterstock +counterstratagem +counterstream +counterstrike +counterstroke +counterstruggle +countersubject +countersuggestion +countersuit +countersun +countersunk +countersurprise +counterswing +countersworn +countersympathy +countersynod +countertack +countertail +countertally +countertaste +countertechnicality +countertendency +countertenor +counterterm +counterterror +countertheme +countertheory +counterthought +counterthreat +counterthrust +counterthwarting +countertierce +countertime +countertouch +countertraction +countertrades +countertransference +countertranslation +countertraverse +countertreason +countertree +countertrench +countertrespass +countertrippant +countertripping +countertruth +countertug +counterturn +counterturned +countertype +countervail +countervair +countervairy +countervallation +countervaunt +countervene +countervengeance +countervenom +countervibration +counterview +countervindication +countervolition +countervolley +countervote +counterwager +counterwall +counterwarmth +counterwave +counterweigh +counterweight +counterweighted +counterwheel +counterwill +counterwilling +counterwind +counterwitness +counterword +counterwork +counterworker +counterwrite +countess +countfish +counting +countinghouse +countless +countor +countrified +countrifiedness +country +countryfolk +countryman +countrypeople +countryseat +countryside +countryward +countrywoman +countship +county +coup +coupage +coupe +couped +coupee +coupelet +couper +couple +coupled +couplement +coupler +coupleress +couplet +coupleteer +coupling +coupon +couponed +couponless +coupstick +coupure +courage +courageous +courageously +courageousness +courager +courant +courante +courap +couratari +courb +courbache +courbaril +courbash +courge +courida +courier +couril +courlan +Cours +course +coursed +courser +coursing +court +courtbred +courtcraft +courteous +courteously +courteousness +courtepy +courter +courtesan +courtesanry +courtesanship +courtesy +courtezanry +courtezanship +courthouse +courtier +courtierism +courtierly +courtiership +courtin +courtless +courtlet +courtlike +courtliness +courtling +courtly +courtman +courtroom +courtship +courtyard +courtzilite +couscous +couscousou +couseranite +cousin +cousinage +cousiness +cousinhood +cousinly +cousinry +cousinship +cousiny +coussinet +coustumier +coutel +coutelle +couter +Coutet +couth +couthie +couthily +couthiness +couthless +coutil +coutumier +couvade +couxia +covado +covalence +covalent +Covarecan +Covarecas +covariable +covariance +covariant +covariation +covassal +cove +coved +covelline +covellite +covenant +covenantal +covenanted +covenantee +Covenanter +covenanter +covenanting +covenantor +covent +coventrate +coventrize +Coventry +cover +coverage +coveralls +coverchief +covercle +covered +coverer +covering +coverless +coverlet +coverlid +coversed +coverside +coversine +coverslut +covert +covertical +covertly +covertness +coverture +covet +covetable +coveter +coveting +covetingly +covetiveness +covetous +covetously +covetousness +covey +covibrate +covibration +covid +Coviello +covillager +Covillea +covin +coving +covinous +covinously +covisit +covisitor +covite +covolume +covotary +cow +cowal +Cowan +coward +cowardice +cowardliness +cowardly +cowardness +cowardy +cowbane +cowbell +cowberry +cowbind +cowbird +cowboy +cowcatcher +cowdie +coween +cower +cowfish +cowgate +cowgram +cowhage +cowheart +cowhearted +cowheel +cowherb +cowherd +cowhide +cowhiding +cowhorn +Cowichan +cowish +cowitch +cowkeeper +cowl +cowle +cowled +cowleech +cowleeching +cowlick +cowlicks +cowlike +cowling +Cowlitz +cowlstaff +cowman +cowpath +cowpea +cowpen +Cowperian +cowperitis +cowpock +cowpox +cowpuncher +cowquake +cowrie +cowroid +cowshed +cowskin +cowslip +cowslipped +cowsucker +cowtail +cowthwort +cowtongue +cowweed +cowwheat +cowy +cowyard +cox +coxa +coxal +coxalgia +coxalgic +coxankylometer +coxarthritis +coxarthrocace +coxarthropathy +coxbones +coxcomb +coxcombess +coxcombhood +coxcombic +coxcombical +coxcombicality +coxcombically +coxcombity +coxcombry +coxcomby +coxcomical +coxcomically +coxite +coxitis +coxocerite +coxoceritic +coxodynia +coxofemoral +coxopodite +coxswain +coxy +coy +coyan +coydog +coyish +coyishness +coyly +coyness +coynye +coyo +coyol +coyote +Coyotero +coyotillo +coyoting +coypu +coyure +coz +coze +cozen +cozenage +cozener +cozening +cozeningly +cozier +cozily +coziness +cozy +crab +crabbed +crabbedly +crabbedness +crabber +crabbery +crabbing +crabby +crabcatcher +crabeater +craber +crabhole +crablet +crablike +crabman +crabmill +crabsidle +crabstick +crabweed +crabwise +crabwood +Cracca +Cracidae +Cracinae +crack +crackable +crackajack +crackbrain +crackbrained +crackbrainedness +crackdown +cracked +crackedness +cracker +crackerberry +crackerjack +crackers +crackhemp +crackiness +cracking +crackjaw +crackle +crackled +crackless +crackleware +crackling +crackly +crackmans +cracknel +crackpot +crackskull +cracksman +cracky +cracovienne +craddy +cradge +cradle +cradleboard +cradlechild +cradlefellow +cradleland +cradlelike +cradlemaker +cradlemaking +cradleman +cradlemate +cradler +cradleside +cradlesong +cradletime +cradling +Cradock +craft +craftily +craftiness +craftless +craftsman +craftsmanship +craftsmaster +craftswoman +craftwork +craftworker +crafty +crag +craggan +cragged +craggedness +craggily +cragginess +craggy +craglike +cragsman +cragwork +craichy +craigmontite +crain +craisey +craizey +crajuru +crake +crakefeet +crakow +cram +cramasie +crambambulee +crambambuli +Crambe +crambe +cramberry +crambid +Crambidae +Crambinae +cramble +crambly +crambo +Crambus +crammer +cramp +cramped +crampedness +cramper +crampet +crampfish +cramping +crampingly +crampon +cramponnee +crampy +cran +cranage +cranberry +crance +crandall +crandallite +crane +cranelike +craneman +craner +cranesman +craneway +craney +Crania +crania +craniacromial +craniad +cranial +cranially +cranian +Craniata +craniate +cranic +craniectomy +craniocele +craniocerebral +cranioclasis +cranioclasm +cranioclast +cranioclasty +craniodidymus +craniofacial +craniognomic +craniognomy +craniognosy +craniograph +craniographer +craniography +craniological +craniologically +craniologist +craniology +craniomalacia +craniomaxillary +craniometer +craniometric +craniometrical +craniometrically +craniometrist +craniometry +craniopagus +craniopathic +craniopathy +craniopharyngeal +craniophore +cranioplasty +craniopuncture +craniorhachischisis +craniosacral +cranioschisis +cranioscopical +cranioscopist +cranioscopy +craniospinal +craniostenosis +craniostosis +Craniota +craniotabes +craniotome +craniotomy +craniotopography +craniotympanic +craniovertebral +cranium +crank +crankbird +crankcase +cranked +cranker +crankery +crankily +crankiness +crankle +crankless +crankly +crankman +crankous +crankpin +crankshaft +crankum +cranky +crannage +crannied +crannock +crannog +crannoger +cranny +cranreuch +crantara +crants +crap +crapaud +crapaudine +crape +crapefish +crapehanger +crapelike +crappie +crappin +crapple +crappo +craps +crapshooter +crapulate +crapulence +crapulent +crapulous +crapulously +crapulousness +crapy +craquelure +crare +crash +crasher +crasis +craspedal +craspedodromous +craspedon +Craspedota +craspedotal +craspedote +crass +crassamentum +crassier +crassilingual +Crassina +crassitude +crassly +crassness +Crassula +Crassulaceae +crassulaceous +Crataegus +Crataeva +cratch +cratchens +cratches +crate +crateful +cratemaker +cratemaking +crateman +crater +crateral +cratered +Craterellus +Craterid +crateriform +crateris +craterkin +craterless +craterlet +craterlike +craterous +craticular +Cratinean +cratometer +cratometric +cratometry +craunch +craunching +craunchingly +cravat +crave +craven +Cravenette +cravenette +cravenhearted +cravenly +cravenness +craver +craving +cravingly +cravingness +cravo +craw +crawberry +crawdad +crawfish +crawfoot +crawful +crawl +crawler +crawlerize +crawley +crawleyroot +crawling +crawlingly +crawlsome +crawly +crawm +crawtae +Crawthumper +Crax +crayer +crayfish +crayon +crayonist +crayonstone +craze +crazed +crazedly +crazedness +crazily +craziness +crazingmill +crazy +crazycat +crazyweed +crea +creagh +creaght +creak +creaker +creakily +creakiness +creakingly +creaky +cream +creambush +creamcake +creamcup +creamer +creamery +creameryman +creamfruit +creamily +creaminess +creamless +creamlike +creammaker +creammaking +creamometer +creamsacs +creamware +creamy +creance +creancer +creant +crease +creaseless +creaser +creashaks +creasing +creasy +creat +creatable +create +createdness +creatic +creatine +creatinephosphoric +creatinine +creatininemia +creatinuria +creation +creational +creationary +creationism +creationist +creationistic +creative +creatively +creativeness +creativity +creatophagous +creator +creatorhood +creatorrhea +creatorship +creatotoxism +creatress +creatrix +creatural +creature +creaturehood +creatureless +creatureliness +creatureling +creaturely +creatureship +creaturize +crebricostate +crebrisulcate +crebrity +crebrous +creche +creddock +credence +credencive +credenciveness +credenda +credensive +credensiveness +credent +credential +credently +credenza +credibility +credible +credibleness +credibly +credit +creditability +creditable +creditableness +creditably +creditive +creditless +creditor +creditorship +creditress +creditrix +crednerite +Credo +credulity +credulous +credulously +credulousness +Cree +cree +creed +creedal +creedalism +creedalist +creeded +creedist +creedite +creedless +creedlessness +creedmore +creedsman +Creek +creek +creeker +creekfish +creekside +creekstuff +creeky +creel +creeler +creem +creen +creep +creepage +creeper +creepered +creeperless +creephole +creepie +creepiness +creeping +creepingly +creepmouse +creepmousy +creepy +creese +creesh +creeshie +creeshy +creirgist +cremaster +cremasterial +cremasteric +cremate +cremation +cremationism +cremationist +cremator +crematorial +crematorium +crematory +crembalum +cremnophobia +cremocarp +cremometer +cremone +cremor +cremorne +cremule +crena +crenate +crenated +crenately +crenation +crenature +crenel +crenelate +crenelated +crenelation +crenele +creneled +crenelet +crenellate +crenellation +crenic +crenitic +crenology +crenotherapy +Crenothrix +crenula +crenulate +crenulated +crenulation +creodont +Creodonta +creole +creoleize +creolian +Creolin +creolism +creolization +creolize +creophagia +creophagism +creophagist +creophagous +creophagy +creosol +creosote +creosoter +creosotic +crepance +crepe +crepehanger +Crepidula +crepine +crepiness +Crepis +crepitaculum +crepitant +crepitate +crepitation +crepitous +crepitus +crepon +crept +crepuscle +crepuscular +crepuscule +crepusculine +crepusculum +crepy +cresamine +crescendo +crescent +crescentade +crescentader +Crescentia +crescentic +crescentiform +crescentlike +crescentoid +crescentwise +crescive +crescograph +crescographic +cresegol +cresol +cresolin +cresorcinol +cresotate +cresotic +cresotinic +cresoxide +cresoxy +cresphontes +cress +cressed +cresselle +cresset +Cressida +cresson +cressweed +cresswort +cressy +crest +crested +crestfallen +crestfallenly +crestfallenness +cresting +crestless +crestline +crestmoreite +cresyl +cresylate +cresylene +cresylic +cresylite +creta +Cretaceous +cretaceous +cretaceously +Cretacic +Cretan +Crete +cretefaction +Cretic +cretic +cretification +cretify +cretin +cretinic +cretinism +cretinization +cretinize +cretinoid +cretinous +cretion +cretionary +Cretism +cretonne +crevalle +crevasse +crevice +creviced +crew +crewel +crewelist +crewellery +crewelwork +crewer +crewless +crewman +Crex +crib +cribbage +cribber +cribbing +cribble +cribellum +cribo +cribral +cribrate +cribrately +cribration +cribriform +cribrose +cribwork +cric +Cricetidae +cricetine +Cricetus +crick +cricket +cricketer +cricketing +crickety +crickey +crickle +cricoarytenoid +cricoid +cricopharyngeal +cricothyreoid +cricothyreotomy +cricothyroid +cricothyroidean +cricotomy +cricotracheotomy +Cricotus +cried +crier +criey +crig +crile +crime +Crimean +crimeful +crimeless +crimelessness +crimeproof +criminal +criminaldom +criminalese +criminalism +criminalist +criminalistic +criminalistician +criminalistics +criminality +criminally +criminalness +criminaloid +criminate +crimination +criminative +criminator +criminatory +crimine +criminogenesis +criminogenic +criminologic +criminological +criminologist +criminology +criminosis +criminous +criminously +criminousness +crimogenic +crimp +crimpage +crimper +crimping +crimple +crimpness +crimpy +crimson +crimsonly +crimsonness +crimsony +crin +crinal +crinanite +crinated +crinatory +crine +crined +crinet +cringe +cringeling +cringer +cringing +cringingly +cringingness +cringle +crinicultural +criniculture +criniferous +Criniger +crinigerous +criniparous +crinite +crinitory +crinivorous +crink +crinkle +crinkleroot +crinkly +crinoid +crinoidal +Crinoidea +crinoidean +crinoline +crinose +crinosity +crinula +Crinum +criobolium +criocephalus +Crioceras +crioceratite +crioceratitic +Crioceris +criophore +Criophoros +criosphinx +cripes +crippingly +cripple +crippledom +crippleness +crippler +crippling +cripply +crises +crisic +crisis +crisp +crispate +crispated +crispation +crispature +crisped +crisper +crispily +Crispin +crispine +crispiness +crisping +crisply +crispness +crispy +criss +crissal +crisscross +crissum +crista +cristate +Cristatella +cristiform +Cristineaux +Cristino +Cristispira +Cristivomer +cristobalite +critch +criteria +criteriology +criterion +criterional +criterium +crith +Crithidia +crithmene +crithomancy +critic +critical +criticality +critically +criticalness +criticaster +criticasterism +criticastry +criticisable +criticism +criticist +criticizable +criticize +criticizer +criticizingly +critickin +criticship +criticule +critique +critling +crizzle +cro +croak +Croaker +croaker +croakily +croakiness +croaky +Croat +Croatan +Croatian +croc +Crocanthemum +crocard +croceic +crocein +croceine +croceous +crocetin +croche +crochet +crocheter +crocheting +croci +crocidolite +Crocidura +crocin +crock +crocker +crockery +crockeryware +crocket +crocketed +crocky +crocodile +Crocodilia +crocodilian +Crocodilidae +crocodiline +crocodilite +crocodiloid +Crocodilus +Crocodylidae +Crocodylus +crocoisite +crocoite +croconate +croconic +Crocosmia +Crocus +crocus +crocused +croft +crofter +crofterization +crofterize +crofting +croftland +croisette +croissante +Crokinole +Crom +cromaltite +crome +Cromer +Cromerian +cromfordite +cromlech +cromorna +cromorne +Cromwell +Cromwellian +Cronartium +crone +croneberry +cronet +Cronian +cronish +cronk +cronkness +cronstedtite +crony +crood +croodle +crook +crookback +crookbacked +crookbill +crookbilled +crooked +crookedly +crookedness +crooken +crookesite +crookfingered +crookheaded +crookkneed +crookle +crooklegged +crookneck +crooknecked +crooknosed +crookshouldered +crooksided +crooksterned +crooktoothed +crool +Croomia +croon +crooner +crooning +crooningly +crop +crophead +cropland +cropman +croppa +cropper +croppie +cropplecrown +croppy +cropshin +cropsick +cropsickness +cropweed +croquet +croquette +crore +crosa +Crosby +crosier +crosiered +crosnes +cross +crossability +crossable +crossarm +crossband +crossbar +crossbeak +crossbeam +crossbelt +crossbill +crossbolt +crossbolted +crossbones +crossbow +crossbowman +crossbred +crossbreed +crosscurrent +crosscurrented +crosscut +crosscutter +crosscutting +crosse +crossed +crosser +crossette +crossfall +crossfish +crossflow +crossflower +crossfoot +crosshackle +crosshand +crosshatch +crosshaul +crosshauling +crosshead +crossing +crossite +crossjack +crosslegs +crosslet +crossleted +crosslight +crosslighted +crossline +crossly +crossness +crossopodia +crossopterygian +Crossopterygii +Crossosoma +Crossosomataceae +crossosomataceous +crossover +crosspatch +crosspath +crosspiece +crosspoint +crossrail +crossroad +crossroads +crossrow +crossruff +crosstail +crosstie +crosstied +crosstoes +crosstrack +crosstree +crosswalk +crossway +crossways +crossweb +crossweed +crosswise +crossword +crosswort +crostarie +crotal +Crotalaria +crotalic +Crotalidae +crotaliform +Crotalinae +crotaline +crotalism +crotalo +crotaloid +crotalum +Crotalus +crotaphic +crotaphion +crotaphite +crotaphitic +Crotaphytus +crotch +crotched +crotchet +crotcheteer +crotchetiness +crotchety +crotchy +crotin +Croton +crotonaldehyde +crotonate +crotonic +crotonization +crotonyl +crotonylene +Crotophaga +crottels +crottle +crotyl +crouch +crouchant +crouched +croucher +crouching +crouchingly +crounotherapy +croup +croupade +croupal +croupe +crouperbush +croupier +croupily +croupiness +croupous +croupy +crouse +crousely +crout +croute +crouton +crow +crowbait +crowbar +crowberry +crowbill +crowd +crowded +crowdedly +crowdedness +crowder +crowdweed +crowdy +crower +crowflower +crowfoot +crowfooted +crowhop +crowing +crowingly +crowkeeper +crowl +crown +crownbeard +crowned +crowner +crownless +crownlet +crownling +crownmaker +crownwork +crownwort +crowshay +crowstep +crowstepped +crowstick +crowstone +crowtoe +croy +croyden +croydon +croze +crozer +crozzle +crozzly +crubeen +cruce +cruces +crucethouse +cruche +crucial +cruciality +crucially +crucian +Crucianella +cruciate +cruciately +cruciation +crucible +Crucibulum +crucifer +Cruciferae +cruciferous +crucificial +crucified +crucifier +crucifix +crucifixion +cruciform +cruciformity +cruciformly +crucify +crucigerous +crucilly +crucily +cruck +crude +crudely +crudeness +crudity +crudwort +cruel +cruelhearted +cruelize +cruelly +cruelness +cruels +cruelty +cruent +cruentation +cruet +cruety +cruise +cruiser +cruisken +cruive +cruller +crum +crumb +crumbable +crumbcloth +crumber +crumble +crumblement +crumblet +crumbliness +crumblingness +crumblings +crumbly +crumby +crumen +crumenal +crumlet +crummie +crummier +crummiest +crummock +crummy +crump +crumper +crumpet +crumple +crumpled +crumpler +crumpling +crumply +crumpy +crunch +crunchable +crunchiness +crunching +crunchingly +crunchingness +crunchweed +crunchy +crunk +crunkle +crunodal +crunode +crunt +cruor +crupper +crural +crureus +crurogenital +cruroinguinal +crurotarsal +crus +crusade +crusader +crusado +Crusca +cruse +crush +crushability +crushable +crushed +crusher +crushing +crushingly +crusie +crusily +crust +crusta +Crustacea +crustaceal +crustacean +crustaceological +crustaceologist +crustaceology +crustaceous +crustade +crustal +crustalogical +crustalogist +crustalogy +crustate +crustated +crustation +crusted +crustedly +cruster +crustific +crustification +crustily +crustiness +crustless +crustose +crustosis +crusty +crutch +crutched +crutcher +crutching +crutchlike +cruth +crutter +crux +cruzeiro +cry +cryable +cryaesthesia +cryalgesia +cryanesthesia +crybaby +cryesthesia +crying +cryingly +crymodynia +crymotherapy +cryoconite +cryogen +cryogenic +cryogenics +cryogeny +cryohydrate +cryohydric +cryolite +cryometer +cryophile +cryophilic +cryophoric +cryophorus +cryophyllite +cryophyte +cryoplankton +cryoscope +cryoscopic +cryoscopy +cryosel +cryostase +cryostat +crypt +crypta +cryptal +cryptamnesia +cryptamnesic +cryptanalysis +cryptanalyst +cryptarch +cryptarchy +crypted +Crypteronia +Crypteroniaceae +cryptesthesia +cryptesthetic +cryptic +cryptical +cryptically +cryptoagnostic +cryptobatholithic +cryptobranch +Cryptobranchia +Cryptobranchiata +cryptobranchiate +Cryptobranchidae +Cryptobranchus +cryptocarp +cryptocarpic +cryptocarpous +Cryptocarya +Cryptocephala +cryptocephalous +Cryptocerata +cryptocerous +cryptoclastic +Cryptocleidus +cryptococci +cryptococcic +Cryptococcus +cryptococcus +cryptocommercial +cryptocrystalline +cryptocrystallization +cryptodeist +Cryptodira +cryptodiran +cryptodire +cryptodirous +cryptodouble +cryptodynamic +cryptogam +Cryptogamia +cryptogamian +cryptogamic +cryptogamical +cryptogamist +cryptogamous +cryptogamy +cryptogenetic +cryptogenic +cryptogenous +Cryptoglaux +cryptoglioma +cryptogram +Cryptogramma +cryptogrammatic +cryptogrammatical +cryptogrammatist +cryptogrammic +cryptograph +cryptographal +cryptographer +cryptographic +cryptographical +cryptographically +cryptographist +cryptography +cryptoheresy +cryptoheretic +cryptoinflationist +cryptolite +cryptologist +cryptology +cryptolunatic +cryptomere +Cryptomeria +cryptomerous +cryptomnesia +cryptomnesic +cryptomonad +Cryptomonadales +Cryptomonadina +cryptonema +Cryptonemiales +cryptoneurous +cryptonym +cryptonymous +cryptopapist +cryptoperthite +Cryptophagidae +cryptophthalmos +Cryptophyceae +cryptophyte +cryptopine +cryptoporticus +Cryptoprocta +cryptoproselyte +cryptoproselytism +cryptopyic +cryptopyrrole +cryptorchid +cryptorchidism +cryptorchis +Cryptorhynchus +cryptorrhesis +cryptorrhetic +cryptoscope +cryptoscopy +cryptosplenetic +Cryptostegia +cryptostoma +Cryptostomata +cryptostomate +cryptostome +Cryptotaenia +cryptous +cryptovalence +cryptovalency +cryptozonate +Cryptozonia +cryptozygosity +cryptozygous +Crypturi +Crypturidae +crystal +crystallic +crystalliferous +crystalliform +crystalligerous +crystallin +crystalline +crystallinity +crystallite +crystallitic +crystallitis +crystallizability +crystallizable +crystallization +crystallize +crystallized +crystallizer +crystalloblastic +crystallochemical +crystallochemistry +crystallogenesis +crystallogenetic +crystallogenic +crystallogenical +crystallogeny +crystallogram +crystallographer +crystallographic +crystallographical +crystallographically +crystallography +crystalloid +crystalloidal +crystallology +crystalloluminescence +crystallomagnetic +crystallomancy +crystallometric +crystallometry +crystallophyllian +crystallose +crystallurgy +crystalwort +crystic +crystograph +crystoleum +Crystolon +crystosphene +csardas +Ctenacanthus +ctene +ctenidial +ctenidium +cteniform +Ctenocephalus +ctenocyst +ctenodactyl +Ctenodipterini +ctenodont +Ctenodontidae +Ctenodus +ctenoid +ctenoidean +Ctenoidei +ctenoidian +ctenolium +Ctenophora +ctenophoral +ctenophoran +ctenophore +ctenophoric +ctenophorous +Ctenoplana +Ctenostomata +ctenostomatous +ctenostome +ctetology +cuadra +Cuailnge +cuapinole +cuarenta +cuarta +cuarteron +cuartilla +cuartillo +cub +Cuba +cubage +Cuban +cubangle +cubanite +Cubanize +cubatory +cubature +cubbing +cubbish +cubbishly +cubbishness +cubby +cubbyhole +cubbyhouse +cubbyyew +cubdom +cube +cubeb +cubelet +Cubelium +cuber +cubhood +cubi +cubic +cubica +cubical +cubically +cubicalness +cubicity +cubicle +cubicly +cubicone +cubicontravariant +cubicovariant +cubicular +cubiculum +cubiform +cubism +cubist +cubit +cubital +cubitale +cubited +cubitiere +cubito +cubitocarpal +cubitocutaneous +cubitodigital +cubitometacarpal +cubitopalmar +cubitoplantar +cubitoradial +cubitus +cubmaster +cubocalcaneal +cuboctahedron +cubocube +cubocuneiform +cubododecahedral +cuboid +cuboidal +cuboides +cubomancy +Cubomedusae +cubomedusan +cubometatarsal +cubonavicular +Cuchan +Cuchulainn +cuck +cuckhold +cuckold +cuckoldom +cuckoldry +cuckoldy +cuckoo +cuckooflower +cuckoomaid +cuckoopint +cuckoopintle +cuckstool +cucoline +Cucujid +Cucujidae +Cucujus +Cuculi +Cuculidae +cuculiform +Cuculiformes +cuculine +cuculla +cucullaris +cucullate +cucullately +cuculliform +cucullus +cuculoid +Cuculus +Cucumaria +Cucumariidae +cucumber +cucumiform +Cucumis +cucurbit +Cucurbita +Cucurbitaceae +cucurbitaceous +cucurbite +cucurbitine +cud +cudava +cudbear +cudden +cuddle +cuddleable +cuddlesome +cuddly +Cuddy +cuddy +cuddyhole +cudgel +cudgeler +cudgerie +cudweed +cue +cueball +cueca +cueist +cueman +cuemanship +cuerda +cuesta +Cueva +cuff +cuffer +cuffin +cuffy +cuffyism +cuggermugger +cuichunchulli +cuinage +cuir +cuirass +cuirassed +cuirassier +cuisinary +cuisine +cuissard +cuissart +cuisse +cuissen +cuisten +Cuitlateco +cuittikin +Cujam +cuke +Culavamsa +culbut +Culdee +culebra +culet +culeus +Culex +culgee +culicid +Culicidae +culicidal +culicide +culiciform +culicifugal +culicifuge +Culicinae +culicine +Culicoides +culilawan +culinarily +culinary +cull +culla +cullage +Cullen +culler +cullet +culling +cullion +cullis +cully +culm +culmen +culmicolous +culmiferous +culmigenous +culminal +culminant +culminate +culmination +culmy +culotte +culottes +culottic +culottism +culpa +culpability +culpable +culpableness +culpably +culpatory +culpose +culprit +cult +cultch +cultellation +cultellus +culteranismo +cultic +cultigen +cultirostral +Cultirostres +cultish +cultism +cultismo +cultist +cultivability +cultivable +cultivably +cultivar +cultivatability +cultivatable +cultivate +cultivated +cultivation +cultivator +cultrate +cultrated +cultriform +cultrirostral +Cultrirostres +cultual +culturable +cultural +culturally +culture +cultured +culturine +culturist +culturization +culturize +culturological +culturologically +culturologist +culturology +cultus +culver +culverfoot +culverhouse +culverin +culverineer +culverkey +culvert +culvertage +culverwort +cum +Cumacea +cumacean +cumaceous +Cumaean +cumal +cumaldehyde +Cumanagoto +cumaphyte +cumaphytic +cumaphytism +Cumar +cumay +cumbent +cumber +cumberer +cumberlandite +cumberless +cumberment +cumbersome +cumbersomely +cumbersomeness +cumberworld +cumbha +cumbly +cumbraite +cumbrance +cumbre +Cumbrian +cumbrous +cumbrously +cumbrousness +cumbu +cumene +cumengite +cumenyl +cumflutter +cumhal +cumic +cumidin +cumidine +cumin +cuminal +cuminic +cuminoin +cuminol +cuminole +cuminseed +cuminyl +cummer +cummerbund +cummin +cummingtonite +cumol +cump +cumshaw +cumulant +cumular +cumulate +cumulately +cumulation +cumulatist +cumulative +cumulatively +cumulativeness +cumuli +cumuliform +cumulite +cumulophyric +cumulose +cumulous +cumulus +cumyl +Cuna +cunabular +Cunan +Cunarder +Cunas +cunctation +cunctatious +cunctative +cunctator +cunctatorship +cunctatury +cunctipotent +cundeamor +cuneal +cuneate +cuneately +cuneatic +cuneator +cuneiform +cuneiformist +cuneocuboid +cuneonavicular +cuneoscaphoid +cunette +cuneus +cungeboi +cunicular +cuniculus +cunila +cunjah +cunjer +cunjevoi +cunner +cunnilinctus +cunnilingus +cunning +Cunninghamia +cunningly +cunningness +Cunonia +Cunoniaceae +cunoniaceous +cunye +Cunza +Cuon +cuorin +cup +Cupania +cupay +cupbearer +cupboard +cupcake +cupel +cupeler +cupellation +cupflower +cupful +Cuphea +cuphead +cupholder +Cupid +cupidinous +cupidity +cupidon +cupidone +cupless +cupmaker +cupmaking +cupman +cupmate +cupola +cupolaman +cupolar +cupolated +cupped +cupper +cupping +cuppy +cuprammonia +cuprammonium +cupreine +cuprene +cupreous +Cupressaceae +cupressineous +Cupressinoxylon +Cupressus +cupric +cupride +cupriferous +cuprite +cuproammonium +cuprobismutite +cuprocyanide +cuprodescloizite +cuproid +cuproiodargyrite +cupromanganese +cupronickel +cuproplumbite +cuproscheelite +cuprose +cuprosilicon +cuprotungstite +cuprous +cuprum +cupseed +cupstone +cupula +cupulate +cupule +Cupuliferae +cupuliferous +cupuliform +cur +curability +curable +curableness +curably +curacao +curacy +curare +curarine +curarization +curarize +curassow +curatage +curate +curatel +curateship +curatess +curatial +curatic +curation +curative +curatively +curativeness +curatize +curatolatry +curator +curatorial +curatorium +curatorship +curatory +curatrix +Curavecan +curb +curbable +curber +curbing +curbless +curblike +curbstone +curbstoner +curby +curcas +curch +curcuddoch +Curculio +curculionid +Curculionidae +curculionist +Curcuma +curcumin +curd +curdiness +curdle +curdler +curdly +curdwort +curdy +cure +cureless +curelessly +curemaster +curer +curettage +curette +curettement +curfew +curial +curialism +curialist +curialistic +curiality +curiate +Curiatii +curiboca +curie +curiescopy +curietherapy +curin +curine +curing +curio +curiologic +curiologically +curiologics +curiology +curiomaniac +curiosa +curiosity +curioso +curious +curiously +curiousness +curite +Curitis +curium +curl +curled +curledly +curledness +curler +curlew +curlewberry +curlicue +curliewurly +curlike +curlily +curliness +curling +curlingly +curlpaper +curly +curlycue +curlyhead +curlylocks +curmudgeon +curmudgeonery +curmudgeonish +curmudgeonly +curmurring +curn +curney +curnock +curple +curr +currach +currack +curragh +currant +curratow +currawang +currency +current +currently +currentness +currentwise +curricle +curricula +curricular +curricularization +curricularize +curriculum +curried +currier +curriery +currish +currishly +currishness +curry +currycomb +curryfavel +Cursa +cursal +curse +cursed +cursedly +cursedness +curser +curship +cursitor +cursive +cursively +cursiveness +cursor +cursorary +Cursores +Cursoria +cursorial +Cursoriidae +cursorily +cursoriness +cursorious +Cursorius +cursory +curst +curstful +curstfully +curstly +curstness +cursus +curt +curtail +curtailed +curtailedly +curtailer +curtailment +curtain +curtaining +curtainless +curtainwise +curtal +Curtana +curtate +curtation +curtesy +curtilage +Curtise +curtly +curtness +curtsy +curua +curuba +Curucaneca +Curucanecan +curucucu +curule +Curuminaca +Curuminacan +Curupira +cururo +curvaceous +curvaceousness +curvacious +curvant +curvate +curvation +curvature +curve +curved +curvedly +curvedness +curver +curvesome +curvesomeness +curvet +curvicaudate +curvicostate +curvidentate +curvifoliate +curviform +curvilineal +curvilinear +curvilinearity +curvilinearly +curvimeter +curvinervate +curvinerved +curvirostral +Curvirostres +curviserial +curvital +curvity +curvograph +curvometer +curvous +curvulate +curvy +curwhibble +curwillet +cuscohygrine +cusconine +Cuscus +cuscus +Cuscuta +Cuscutaceae +cuscutaceous +cusec +cuselite +cush +cushag +cushat +cushaw +cushewbird +cushion +cushioned +cushionflower +cushionless +cushionlike +cushiony +Cushite +Cushitic +cushlamochree +cushy +cusie +cusinero +cusk +cusp +cuspal +cusparidine +cusparine +cuspate +cusped +cuspid +cuspidal +cuspidate +cuspidation +cuspidine +cuspidor +cuspule +cuss +cussed +cussedly +cussedness +cusser +cusso +custard +custerite +custodee +custodes +custodial +custodiam +custodian +custodianship +custodier +custody +custom +customable +customarily +customariness +customary +customer +customhouse +customs +custumal +cut +cutaneal +cutaneous +cutaneously +cutaway +cutback +cutch +cutcher +cutcherry +cute +cutely +cuteness +Cuterebra +Cuthbert +cutheal +cuticle +cuticolor +cuticula +cuticular +cuticularization +cuticularize +cuticulate +cutidure +cutie +cutification +cutigeral +cutin +cutinization +cutinize +cutireaction +cutis +cutisector +Cutiterebra +cutitis +cutization +cutlass +cutler +cutleress +Cutleria +Cutleriaceae +cutleriaceous +Cutleriales +cutlery +cutlet +cutling +cutlips +cutocellulose +cutoff +cutout +cutover +cutpurse +cuttable +cuttage +cuttail +cuttanee +cutted +cutter +cutterhead +cutterman +cutthroat +cutting +cuttingly +cuttingness +cuttle +cuttlebone +cuttlefish +cuttler +cuttoo +cutty +cuttyhunk +cutup +cutwater +cutweed +cutwork +cutworm +cuvette +Cuvierian +cuvy +cuya +Cuzceno +cwierc +cwm +cyamelide +Cyamus +cyan +cyanacetic +cyanamide +cyananthrol +Cyanastraceae +Cyanastrum +cyanate +cyanaurate +cyanauric +cyanbenzyl +cyancarbonic +Cyanea +cyanean +cyanemia +cyaneous +cyanephidrosis +cyanformate +cyanformic +cyanhidrosis +cyanhydrate +cyanhydric +cyanhydrin +cyanic +cyanicide +cyanidation +cyanide +cyanidin +cyanidine +cyanidrosis +cyanimide +cyanin +cyanine +cyanite +cyanize +cyanmethemoglobin +cyanoacetate +cyanoacetic +cyanoaurate +cyanoauric +cyanobenzene +cyanocarbonic +cyanochlorous +cyanochroia +cyanochroic +Cyanocitta +cyanocrystallin +cyanoderma +cyanogen +cyanogenesis +cyanogenetic +cyanogenic +cyanoguanidine +cyanohermidin +cyanohydrin +cyanol +cyanole +cyanomaclurin +cyanometer +cyanomethaemoglobin +cyanomethemoglobin +cyanometric +cyanometry +cyanopathic +cyanopathy +cyanophile +cyanophilous +cyanophoric +cyanophose +Cyanophyceae +cyanophycean +cyanophyceous +cyanophycin +cyanopia +cyanoplastid +cyanoplatinite +cyanoplatinous +cyanopsia +cyanose +cyanosed +cyanosis +Cyanospiza +cyanotic +cyanotrichite +cyanotype +cyanuramide +cyanurate +cyanuret +cyanuric +cyanurine +cyanus +cyaphenine +cyath +Cyathaspis +Cyathea +Cyatheaceae +cyatheaceous +cyathiform +cyathium +cyathoid +cyatholith +Cyathophyllidae +cyathophylline +cyathophylloid +Cyathophyllum +cyathos +cyathozooid +cyathus +cybernetic +cyberneticist +cybernetics +Cybister +cycad +Cycadaceae +cycadaceous +Cycadales +cycadean +cycadeoid +Cycadeoidea +cycadeous +cycadiform +cycadlike +cycadofilicale +Cycadofilicales +Cycadofilices +cycadofilicinean +Cycadophyta +Cycas +Cycladic +cyclamen +cyclamin +cyclamine +cyclammonium +cyclane +Cyclanthaceae +cyclanthaceous +Cyclanthales +Cyclanthus +cyclar +cyclarthrodial +cyclarthrsis +cyclas +cycle +cyclecar +cycledom +cyclene +cycler +cyclesmith +Cycliae +cyclian +cyclic +cyclical +cyclically +cyclicism +cyclide +cycling +cyclism +cyclist +cyclistic +cyclitic +cyclitis +cyclization +cyclize +cycloalkane +Cyclobothra +cyclobutane +cyclocoelic +cyclocoelous +Cycloconium +cyclodiolefin +cycloganoid +Cycloganoidei +cyclogram +cyclograph +cyclographer +cycloheptane +cycloheptanone +cyclohexane +cyclohexanol +cyclohexanone +cyclohexene +cyclohexyl +cycloid +cycloidal +cycloidally +cycloidean +Cycloidei +cycloidian +cycloidotrope +cyclolith +Cycloloma +cyclomania +cyclometer +cyclometric +cyclometrical +cyclometry +Cyclomyaria +cyclomyarian +cyclonal +cyclone +cyclonic +cyclonical +cyclonically +cyclonist +cyclonite +cyclonologist +cyclonology +cyclonometer +cyclonoscope +cycloolefin +cycloparaffin +cyclope +Cyclopean +cyclopean +cyclopedia +cyclopedic +cyclopedical +cyclopedically +cyclopedist +cyclopentadiene +cyclopentane +cyclopentanone +cyclopentene +Cyclopes +cyclopes +cyclophoria +cyclophoric +Cyclophorus +cyclophrenia +cyclopia +Cyclopic +cyclopism +cyclopite +cycloplegia +cycloplegic +cyclopoid +cyclopropane +Cyclops +Cyclopteridae +cyclopteroid +cyclopterous +cyclopy +cyclorama +cycloramic +Cyclorrhapha +cyclorrhaphous +cycloscope +cyclose +cyclosis +cyclospermous +Cyclospondyli +cyclospondylic +cyclospondylous +Cyclosporales +Cyclosporeae +Cyclosporinae +cyclosporous +Cyclostoma +Cyclostomata +cyclostomate +Cyclostomatidae +cyclostomatous +cyclostome +Cyclostomes +Cyclostomi +Cyclostomidae +cyclostomous +cyclostrophic +cyclostyle +Cyclotella +cyclothem +cyclothure +cyclothurine +Cyclothurus +cyclothyme +cyclothymia +cyclothymiac +cyclothymic +cyclotome +cyclotomic +cyclotomy +Cyclotosaurus +cyclotron +cyclovertebral +cyclus +Cydippe +cydippian +cydippid +Cydippida +Cydonia +Cydonian +cydonium +cyesiology +cyesis +cygneous +cygnet +Cygnid +Cygninae +cygnine +Cygnus +cyke +cylinder +cylindered +cylinderer +cylinderlike +cylindraceous +cylindrarthrosis +Cylindrella +cylindrelloid +cylindrenchyma +cylindric +cylindrical +cylindricality +cylindrically +cylindricalness +cylindricity +cylindricule +cylindriform +cylindrite +cylindrocellular +cylindrocephalic +cylindroconical +cylindroconoidal +cylindrocylindric +cylindrodendrite +cylindrograph +cylindroid +cylindroidal +cylindroma +cylindromatous +cylindrometric +cylindroogival +Cylindrophis +Cylindrosporium +cylindruria +cylix +Cyllenian +Cyllenius +cyllosis +cyma +cymagraph +cymaphen +cymaphyte +cymaphytic +cymaphytism +cymar +cymation +cymatium +cymba +cymbaeform +cymbal +Cymbalaria +cymbaleer +cymbaler +cymbaline +cymbalist +cymballike +cymbalo +cymbalon +cymbate +Cymbella +cymbiform +Cymbium +cymbling +cymbocephalic +cymbocephalous +cymbocephaly +Cymbopogon +cyme +cymelet +cymene +cymiferous +cymling +Cymodoceaceae +cymogene +cymograph +cymographic +cymoid +Cymoidium +cymometer +cymophane +cymophanous +cymophenol +cymoscope +cymose +cymosely +cymotrichous +cymotrichy +cymous +Cymraeg +Cymric +Cymry +cymule +cymulose +cynanche +Cynanchum +cynanthropy +Cynara +cynaraceous +cynarctomachy +cynareous +cynaroid +cynebot +cynegetic +cynegetics +cynegild +cynhyena +Cynias +cyniatria +cyniatrics +cynic +cynical +cynically +cynicalness +cynicism +cynicist +cynipid +Cynipidae +cynipidous +cynipoid +Cynipoidea +Cynips +cynism +cynocephalic +cynocephalous +cynocephalus +cynoclept +Cynocrambaceae +cynocrambaceous +Cynocrambe +Cynodon +cynodont +Cynodontia +Cynogale +cynogenealogist +cynogenealogy +Cynoglossum +Cynognathus +cynography +cynoid +Cynoidea +cynology +Cynomoriaceae +cynomoriaceous +Cynomorium +Cynomorpha +cynomorphic +cynomorphous +Cynomys +cynophile +cynophilic +cynophilist +cynophobe +cynophobia +Cynopithecidae +cynopithecoid +cynopodous +cynorrhodon +Cynosarges +Cynoscion +Cynosura +cynosural +cynosure +Cynosurus +cynotherapy +Cynoxylon +Cynthia +Cynthian +Cynthiidae +Cynthius +cyp +Cyperaceae +cyperaceous +Cyperus +cyphella +cyphellate +Cyphomandra +cyphonautes +cyphonism +Cypraea +cypraeid +Cypraeidae +cypraeiform +cypraeoid +cypre +cypres +cypress +cypressed +cypressroot +Cypria +Cyprian +Cyprididae +Cypridina +Cypridinidae +cypridinoid +Cyprina +cyprine +cyprinid +Cyprinidae +cypriniform +cyprinine +cyprinodont +Cyprinodontes +Cyprinodontidae +cyprinodontoid +cyprinoid +Cyprinoidea +cyprinoidean +Cyprinus +Cypriote +Cypripedium +Cypris +cypsela +Cypseli +Cypselid +Cypselidae +cypseliform +Cypseliformes +cypseline +cypseloid +cypselomorph +Cypselomorphae +cypselomorphic +cypselous +Cypselus +cyptozoic +Cyrano +Cyrenaic +Cyrenaicism +Cyrenian +Cyril +Cyrilla +Cyrillaceae +cyrillaceous +Cyrillian +Cyrillianism +Cyrillic +cyriologic +cyriological +Cyrtandraceae +Cyrtidae +cyrtoceracone +Cyrtoceras +cyrtoceratite +cyrtoceratitic +cyrtograph +cyrtolite +cyrtometer +Cyrtomium +cyrtopia +cyrtosis +Cyrus +cyrus +cyst +cystadenoma +cystadenosarcoma +cystal +cystalgia +cystamine +cystaster +cystatrophia +cystatrophy +cystectasia +cystectasy +cystectomy +cysted +cysteine +cysteinic +cystelcosis +cystenchyma +cystenchymatous +cystencyte +cysterethism +cystic +cysticarpic +cysticarpium +cysticercoid +cysticercoidal +cysticercosis +cysticercus +cysticolous +cystid +Cystidea +cystidean +cystidicolous +cystidium +cystiferous +cystiform +cystigerous +Cystignathidae +cystignathine +cystine +cystinuria +cystirrhea +cystis +cystitis +cystitome +cystoadenoma +cystocarcinoma +cystocarp +cystocarpic +cystocele +cystocolostomy +cystocyte +cystodynia +cystoelytroplasty +cystoenterocele +cystoepiplocele +cystoepithelioma +cystofibroma +Cystoflagellata +cystoflagellate +cystogenesis +cystogenous +cystogram +cystoid +Cystoidea +cystoidean +cystolith +cystolithectomy +cystolithiasis +cystolithic +cystoma +cystomatous +cystomorphous +cystomyoma +cystomyxoma +Cystonectae +cystonectous +cystonephrosis +cystoneuralgia +cystoparalysis +Cystophora +cystophore +cystophotography +cystophthisis +cystoplasty +cystoplegia +cystoproctostomy +Cystopteris +cystoptosis +Cystopus +cystopyelitis +cystopyelography +cystopyelonephritis +cystoradiography +cystorrhagia +cystorrhaphy +cystorrhea +cystosarcoma +cystoschisis +cystoscope +cystoscopic +cystoscopy +cystose +cystospasm +cystospastic +cystospore +cystostomy +cystosyrinx +cystotome +cystotomy +cystotrachelotomy +cystoureteritis +cystourethritis +cystous +cytase +cytasic +Cytherea +Cytherean +Cytherella +Cytherellidae +Cytinaceae +cytinaceous +Cytinus +cytioderm +cytisine +Cytisus +cytitis +cytoblast +cytoblastema +cytoblastemal +cytoblastematous +cytoblastemic +cytoblastemous +cytochemistry +cytochrome +cytochylema +cytocide +cytoclasis +cytoclastic +cytococcus +cytocyst +cytode +cytodendrite +cytoderm +cytodiagnosis +cytodieresis +cytodieretic +cytogamy +cytogene +cytogenesis +cytogenetic +cytogenetical +cytogenetically +cytogeneticist +cytogenetics +cytogenic +cytogenous +cytogeny +cytoglobin +cytohyaloplasm +cytoid +cytokinesis +cytolist +cytologic +cytological +cytologically +cytologist +cytology +cytolymph +cytolysin +cytolysis +cytolytic +cytoma +cytomere +cytometer +cytomicrosome +cytomitome +cytomorphosis +cyton +cytoparaplastin +cytopathologic +cytopathological +cytopathologically +cytopathology +Cytophaga +cytophagous +cytophagy +cytopharynx +cytophil +cytophysics +cytophysiology +cytoplasm +cytoplasmic +cytoplast +cytoplastic +cytoproct +cytopyge +cytoreticulum +cytoryctes +cytosine +cytosome +Cytospora +Cytosporina +cytost +cytostomal +cytostome +cytostroma +cytostromatic +cytotactic +cytotaxis +cytotoxic +cytotoxin +cytotrophoblast +cytotrophy +cytotropic +cytotropism +cytozoic +cytozoon +cytozymase +cytozyme +cytula +Cyzicene +cyzicene +czar +czardas +czardom +czarevitch +czarevna +czarian +czaric +czarina +czarinian +czarish +czarism +czarist +czaristic +czaritza +czarowitch +czarowitz +czarship +Czech +Czechic +Czechish +Czechization +Czechoslovak +Czechoslovakian +D +d +da +daalder +dab +dabb +dabba +dabber +dabble +dabbler +dabbling +dabblingly +dabblingness +dabby +dabchick +Dabih +Dabitis +dablet +daboia +daboya +dabster +dace +Dacelo +Daceloninae +dacelonine +dachshound +dachshund +Dacian +dacite +dacitic +dacker +dacoit +dacoitage +dacoity +dacryadenalgia +dacryadenitis +dacryagogue +dacrycystalgia +Dacrydium +dacryelcosis +dacryoadenalgia +dacryoadenitis +dacryoblenorrhea +dacryocele +dacryocyst +dacryocystalgia +dacryocystitis +dacryocystoblennorrhea +dacryocystocele +dacryocystoptosis +dacryocystorhinostomy +dacryocystosyringotomy +dacryocystotome +dacryocystotomy +dacryohelcosis +dacryohemorrhea +dacryolite +dacryolith +dacryolithiasis +dacryoma +dacryon +dacryops +dacryopyorrhea +dacryopyosis +dacryosolenitis +dacryostenosis +dacryosyrinx +dacryuria +Dactyl +dactyl +dactylar +dactylate +dactylic +dactylically +dactylioglyph +dactylioglyphic +dactylioglyphist +dactylioglyphtic +dactylioglyphy +dactyliographer +dactyliographic +dactyliography +dactyliology +dactyliomancy +dactylion +dactyliotheca +Dactylis +dactylist +dactylitic +dactylitis +dactylogram +dactylograph +dactylographic +dactylography +dactyloid +dactylology +dactylomegaly +dactylonomy +dactylopatagium +Dactylopius +dactylopodite +dactylopore +Dactylopteridae +Dactylopterus +dactylorhiza +dactyloscopic +dactyloscopy +dactylose +dactylosternal +dactylosymphysis +dactylotheca +dactylous +dactylozooid +dactylus +Dacus +dacyorrhea +dad +Dada +dada +Dadaism +Dadaist +dadap +Dadayag +dadder +daddle +daddock +daddocky +daddy +daddynut +dade +dadenhudd +dado +Dadoxylon +Dadu +daduchus +Dadupanthi +dae +Daedal +daedal +Daedalea +Daedalean +Daedalian +Daedalic +Daedalidae +Daedalist +daedaloid +Daedalus +daemon +Daemonelix +daemonic +daemonurgist +daemonurgy +daemony +daer +daff +daffery +daffing +daffish +daffle +daffodil +daffodilly +daffy +daffydowndilly +Dafla +daft +daftberry +daftlike +daftly +daftness +dag +dagaba +dagame +dagassa +Dagbamba +Dagbane +dagesh +Dagestan +dagga +dagger +daggerbush +daggered +daggerlike +daggerproof +daggers +daggle +daggletail +daggletailed +daggly +daggy +daghesh +daglock +Dagmar +Dago +dagoba +Dagomba +dags +Daguerrean +daguerreotype +daguerreotyper +daguerreotypic +daguerreotypist +daguerreotypy +dah +dahabeah +Dahlia +Dahoman +Dahomeyan +dahoon +Daibutsu +daidle +daidly +Daijo +daiker +daikon +Dail +Dailamite +dailiness +daily +daimen +daimiate +daimio +daimon +daimonic +daimonion +daimonistic +daimonology +dain +daincha +dainteth +daintify +daintihood +daintily +daintiness +daintith +dainty +Daira +daira +dairi +dairy +dairying +dairymaid +dairyman +dairywoman +dais +daisied +daisy +daisybush +daitya +daiva +dak +daker +Dakhini +dakir +Dakota +daktylon +daktylos +dal +dalar +Dalarnian +Dalbergia +Dalcassian +dale +Dalea +Dalecarlian +daleman +daler +dalesfolk +dalesman +dalespeople +daleswoman +daleth +dali +Dalibarda +dalk +dallack +dalle +dalles +dalliance +dallier +dally +dallying +dallyingly +Dalmania +Dalmanites +Dalmatian +Dalmatic +dalmatic +Dalradian +dalt +dalteen +dalton +Daltonian +Daltonic +Daltonism +Daltonist +dam +dama +damage +damageability +damageable +damageableness +damageably +damagement +damager +damages +damagingly +daman +Damara +Damascene +damascene +damascened +damascener +damascenine +Damascus +damask +damaskeen +damasse +damassin +Damayanti +dambonitol +dambose +dambrod +dame +damenization +damewort +Damgalnunna +Damia +damiana +Damianist +damie +damier +damine +damkjernite +damlike +dammar +Dammara +damme +dammer +dammish +damn +damnability +damnable +damnableness +damnably +damnation +damnatory +damned +damner +damnification +damnify +Damnii +damning +damningly +damningness +damnonians +Damnonii +damnous +damnously +Damoclean +Damocles +Damoetas +damoiseau +Damon +damonico +damourite +damp +dampang +damped +dampen +dampener +damper +damping +dampish +dampishly +dampishness +damply +dampness +dampproof +dampproofer +dampproofing +dampy +damsel +damselfish +damselhood +damson +Dan +dan +Danaan +Danagla +Danai +Danaid +danaid +Danaidae +danaide +Danaidean +Danainae +danaine +Danais +danaite +Danakil +danalite +danburite +dancalite +dance +dancer +danceress +dancery +dancette +dancing +dancingly +dand +danda +dandelion +dander +dandiacal +dandiacally +dandically +dandification +dandify +dandilly +dandily +dandiprat +dandizette +dandle +dandler +dandling +dandlingly +dandruff +dandruffy +dandy +dandydom +dandyish +dandyism +dandyize +dandyling +Dane +Daneball +Daneflower +Danegeld +Danelaw +Daneweed +Danewort +dang +danger +dangerful +dangerfully +dangerless +dangerous +dangerously +dangerousness +dangersome +dangle +dangleberry +danglement +dangler +danglin +dangling +danglingly +Danian +Danic +danicism +Daniel +Danielic +Daniglacial +danio +Danish +Danism +Danite +Danization +Danize +dank +Dankali +dankish +dankishness +dankly +dankness +danli +Dannebrog +dannemorite +danner +dannock +danoranja +dansant +danseuse +danta +Dantean +Dantesque +Danthonia +Dantist +Dantology +Dantomania +danton +Dantonesque +Dantonist +Dantophilist +Dantophily +Danube +Danubian +Danuri +Danzig +Danziger +dao +daoine +dap +Dapedium +Dapedius +Daphnaceae +Daphne +Daphnean +Daphnephoria +daphnetin +Daphnia +daphnin +daphnioid +Daphnis +daphnoid +dapicho +dapico +dapifer +dapper +dapperling +dapperly +dapperness +dapple +dappled +dar +darabukka +darac +daraf +Darapti +darat +darbha +darby +Darbyism +Darbyite +Dard +Dardan +dardanarius +Dardani +dardanium +dardaol +Dardic +Dardistan +dare +dareall +daredevil +daredevilism +daredevilry +daredeviltry +dareful +darer +Dares +daresay +darg +dargah +darger +Darghin +Dargo +dargsman +dargue +dari +daribah +daric +Darien +Darii +daring +daringly +daringness +dariole +Darius +Darjeeling +dark +darken +darkener +darkening +darkful +darkhearted +darkheartedness +darkish +darkishness +darkle +darkling +darklings +darkly +darkmans +darkness +darkroom +darkskin +darksome +darksomeness +darky +darling +darlingly +darlingness +Darlingtonia +darn +darnation +darned +darnel +darner +darnex +darning +daroga +daroo +darr +darrein +darshana +Darsonval +Darsonvalism +darst +dart +Dartagnan +dartars +dartboard +darter +darting +dartingly +dartingness +dartle +dartlike +dartman +Dartmoor +dartoic +dartoid +dartos +dartre +dartrose +dartrous +darts +dartsman +Darwinian +Darwinical +Darwinically +Darwinism +Darwinist +Darwinistic +Darwinite +Darwinize +darzee +das +Daschagga +dash +dashboard +dashed +dashedly +dashee +dasheen +dasher +dashing +dashingly +dashmaker +Dashnak +Dashnakist +Dashnaktzutiun +dashplate +dashpot +dashwheel +dashy +dasi +Dasiphora +dasnt +dassie +dassy +dastard +dastardize +dastardliness +dastardly +dastur +dasturi +Dasya +Dasyatidae +Dasyatis +Dasycladaceae +dasycladaceous +Dasylirion +dasymeter +dasypaedal +dasypaedes +dasypaedic +Dasypeltis +dasyphyllous +Dasypodidae +dasypodoid +Dasyprocta +Dasyproctidae +dasyproctine +Dasypus +Dasystephana +dasyure +Dasyuridae +dasyurine +dasyuroid +Dasyurus +Dasyus +data +datable +datableness +datably +dataria +datary +datch +datcha +date +dateless +datemark +dater +datil +dating +dation +Datisca +Datiscaceae +datiscaceous +datiscetin +datiscin +datiscoside +Datisi +Datism +datival +dative +datively +dativogerundial +datolite +datolitic +dattock +datum +Datura +daturic +daturism +daub +daube +Daubentonia +Daubentoniidae +dauber +daubery +daubing +daubingly +daubreeite +daubreelite +daubster +dauby +Daucus +daud +daughter +daughterhood +daughterkin +daughterless +daughterlike +daughterliness +daughterling +daughterly +daughtership +Daulias +daunch +dauncy +Daunii +daunt +daunter +daunting +dauntingly +dauntingness +dauntless +dauntlessly +dauntlessness +daunton +dauphin +dauphine +dauphiness +Daur +Dauri +daut +dautie +dauw +davach +Davallia +Dave +daven +davenport +daver +daverdy +David +Davidian +Davidic +Davidical +Davidist +davidsonite +Daviesia +daviesite +davit +davoch +Davy +davy +davyne +daw +dawdle +dawdler +dawdling +dawdlingly +dawdy +dawish +dawkin +dawn +dawning +dawnlight +dawnlike +dawnstreak +dawnward +dawny +Dawsonia +Dawsoniaceae +dawsoniaceous +dawsonite +dawtet +dawtit +dawut +day +dayabhaga +Dayakker +dayal +daybeam +dayberry +dayblush +daybook +daybreak +daydawn +daydream +daydreamer +daydreamy +daydrudge +dayflower +dayfly +daygoing +dayless +daylight +daylit +daylong +dayman +daymare +daymark +dayroom +days +dayshine +daysman +dayspring +daystar +daystreak +daytale +daytide +daytime +daytimes +dayward +daywork +dayworker +daywrit +Daza +daze +dazed +dazedly +dazedness +dazement +dazingly +dazy +dazzle +dazzlement +dazzler +dazzlingly +de +deacetylate +deacetylation +deacidification +deacidify +deacon +deaconal +deaconate +deaconess +deaconhood +deaconize +deaconry +deaconship +deactivate +deactivation +dead +deadbeat +deadborn +deadcenter +deaden +deadener +deadening +deader +deadeye +deadfall +deadhead +deadheadism +deadhearted +deadheartedly +deadheartedness +deadhouse +deading +deadish +deadishly +deadishness +deadlatch +deadlight +deadlily +deadline +deadliness +deadlock +deadly +deadman +deadmelt +deadness +deadpan +deadpay +deadtongue +deadwood +deadwort +deaerate +deaeration +deaerator +deaf +deafen +deafening +deafeningly +deafforest +deafforestation +deafish +deafly +deafness +deair +deal +dealable +dealate +dealated +dealation +dealbate +dealbation +dealbuminize +dealcoholist +dealcoholization +dealcoholize +dealer +dealerdom +dealership +dealfish +dealing +dealkalize +dealkylate +dealkylation +dealt +deambulation +deambulatory +deamidase +deamidate +deamidation +deamidization +deamidize +deaminase +deaminate +deamination +deaminization +deaminize +deammonation +dean +deanathematize +deaner +deanery +deaness +deanimalize +deanship +deanthropomorphic +deanthropomorphism +deanthropomorphization +deanthropomorphize +deappetizing +deaquation +dear +dearborn +dearie +dearly +dearness +dearomatize +dearsenicate +dearsenicator +dearsenicize +dearth +dearthfu +dearticulation +dearworth +dearworthily +dearworthiness +deary +deash +deasil +deaspirate +deaspiration +deassimilation +death +deathbed +deathblow +deathday +deathful +deathfully +deathfulness +deathify +deathin +deathiness +deathless +deathlessly +deathlessness +deathlike +deathliness +deathling +deathly +deathroot +deathshot +deathsman +deathtrap +deathward +deathwards +deathwatch +deathweed +deathworm +deathy +deave +deavely +Deb +deb +debacle +debadge +debamboozle +debar +debarbarization +debarbarize +debark +debarkation +debarkment +debarment +debarrance +debarrass +debarration +debase +debasedness +debasement +debaser +debasingly +debatable +debate +debateful +debatefully +debatement +debater +debating +debatingly +debauch +debauched +debauchedly +debauchedness +debauchee +debaucher +debauchery +debauchment +Debby +debby +debeige +debellate +debellation +debellator +deben +debenture +debentured +debenzolize +debile +debilissima +debilitant +debilitate +debilitated +debilitation +debilitative +debility +debind +debit +debiteuse +debituminization +debituminize +deblaterate +deblateration +deboistly +deboistness +debonair +debonaire +debonairity +debonairly +debonairness +debonnaire +Deborah +debord +debordment +debosh +deboshed +debouch +debouchment +debride +debrief +debris +debrominate +debromination +debruise +debt +debtee +debtful +debtless +debtor +debtorship +debullition +debunk +debunker +debunkment +debus +Debussyan +Debussyanize +debut +debutant +debutante +decachord +decad +decadactylous +decadal +decadally +decadarch +decadarchy +decadary +decadation +decade +decadence +decadency +decadent +decadentism +decadently +decadescent +decadianome +decadic +decadist +decadrachm +decadrachma +decaesarize +decaffeinate +decaffeinize +decafid +decagon +decagonal +decagram +decagramme +decahedral +decahedron +decahydrate +decahydrated +decahydronaphthalene +Decaisnea +decal +decalcification +decalcifier +decalcify +decalcomania +decalcomaniac +decalescence +decalescent +Decalin +decaliter +decalitre +decalobate +Decalogist +Decalogue +decalvant +decalvation +decameral +Decameron +Decameronic +decamerous +decameter +decametre +decamp +decampment +decan +decanal +decanally +decanate +decane +decangular +decani +decanically +decannulation +decanonization +decanonize +decant +decantate +decantation +decanter +decantherous +decap +decapetalous +decaphyllous +decapitable +decapitalization +decapitalize +decapitate +decapitation +decapitator +decapod +Decapoda +decapodal +decapodan +decapodiform +decapodous +decapper +decapsulate +decapsulation +decarbonate +decarbonator +decarbonization +decarbonize +decarbonized +decarbonizer +decarboxylate +decarboxylation +decarboxylization +decarboxylize +decarburation +decarburization +decarburize +decarch +decarchy +decardinalize +decare +decarhinus +decarnate +decarnated +decart +decasemic +decasepalous +decaspermal +decaspermous +decast +decastellate +decastere +decastich +decastyle +decasualization +decasualize +decasyllabic +decasyllable +decasyllabon +decate +decathlon +decatholicize +decatize +decatizer +decatoic +decator +decatyl +decaudate +decaudation +decay +decayable +decayed +decayedness +decayer +decayless +decease +deceased +decedent +deceit +deceitful +deceitfully +deceitfulness +deceivability +deceivable +deceivableness +deceivably +deceive +deceiver +deceiving +deceivingly +decelerate +deceleration +decelerator +decelerometer +December +Decemberish +Decemberly +Decembrist +decemcostate +decemdentate +decemfid +decemflorous +decemfoliate +decemfoliolate +decemjugate +decemlocular +decempartite +decempeda +decempedal +decempedate +decempennate +decemplex +decemplicate +decempunctate +decemstriate +decemuiri +decemvir +decemviral +decemvirate +decemvirship +decenary +decence +decency +decene +decennal +decennary +decennia +decenniad +decennial +decennially +decennium +decennoval +decent +decenter +decently +decentness +decentralism +decentralist +decentralization +decentralize +decentration +decentre +decenyl +decephalization +deceptibility +deceptible +deception +deceptious +deceptiously +deceptitious +deceptive +deceptively +deceptiveness +deceptivity +decerebrate +decerebration +decerebrize +decern +decerniture +decernment +decess +decession +dechemicalization +dechemicalize +dechenite +Dechlog +dechlore +dechlorination +dechoralize +dechristianization +dechristianize +Decian +deciare +deciatine +decibel +deciceronize +decidable +decide +decided +decidedly +decidedness +decider +decidingly +decidua +decidual +deciduary +Deciduata +deciduate +deciduitis +deciduoma +deciduous +deciduously +deciduousness +decigram +decigramme +decil +decile +deciliter +decillion +decillionth +decima +decimal +decimalism +decimalist +decimalization +decimalize +decimally +decimate +decimation +decimator +decimestrial +decimeter +decimolar +decimole +decimosexto +Decimus +decinormal +decipher +decipherability +decipherable +decipherably +decipherer +decipherment +decipium +decipolar +decision +decisional +decisive +decisively +decisiveness +decistere +decitizenize +Decius +decivilization +decivilize +deck +decke +decked +deckel +decker +deckhead +deckhouse +deckie +decking +deckle +deckload +deckswabber +declaim +declaimant +declaimer +declamation +declamatoriness +declamatory +declarable +declarant +declaration +declarative +declaratively +declarator +declaratorily +declaratory +declare +declared +declaredly +declaredness +declarer +declass +declassicize +declassify +declension +declensional +declensionally +declericalize +declimatize +declinable +declinal +declinate +declination +declinational +declinatory +declinature +decline +declined +declinedness +decliner +declinograph +declinometer +declivate +declive +declivitous +declivity +declivous +declutch +decoagulate +decoagulation +decoat +decocainize +decoct +decoctible +decoction +decoctive +decoctum +decode +Decodon +decohere +decoherence +decoherer +decohesion +decoic +decoke +decollate +decollated +decollation +decollator +decolletage +decollete +decolor +decolorant +decolorate +decoloration +decolorimeter +decolorization +decolorize +decolorizer +decolour +decommission +decompensate +decompensation +decomplex +decomponible +decomposability +decomposable +decompose +decomposed +decomposer +decomposite +decomposition +decomposure +decompound +decompoundable +decompoundly +decompress +decompressing +decompression +decompressive +deconcatenate +deconcentrate +deconcentration +deconcentrator +decongestive +deconsecrate +deconsecration +deconsider +deconsideration +decontaminate +decontamination +decontrol +deconventionalize +decopperization +decopperize +decorability +decorable +decorably +decorament +decorate +decorated +decoration +decorationist +decorative +decoratively +decorativeness +decorator +decoratory +decorist +decorous +decorously +decorousness +decorrugative +decorticate +decortication +decorticator +decorticosis +decorum +decostate +decoy +decoyer +decoyman +decrassify +decream +decrease +decreaseless +decreasing +decreasingly +decreation +decreative +decree +decreeable +decreement +decreer +decreet +decrement +decrementless +decremeter +decrepit +decrepitate +decrepitation +decrepitly +decrepitness +decrepitude +decrescence +decrescendo +decrescent +decretal +decretalist +decrete +decretist +decretive +decretively +decretorial +decretorily +decretory +decretum +decrew +decrial +decried +decrier +decrown +decrudescence +decrustation +decry +decrystallization +decubital +decubitus +decultivate +deculturate +decuman +decumana +decumanus +Decumaria +decumary +decumbence +decumbency +decumbent +decumbently +decumbiture +decuple +decuplet +decuria +decurion +decurionate +decurrence +decurrency +decurrent +decurrently +decurring +decursion +decursive +decursively +decurtate +decurvation +decurvature +decurve +decury +decus +decussate +decussated +decussately +decussation +decussis +decussorium +decyl +decylene +decylenic +decylic +decyne +Dedan +Dedanim +Dedanite +dedecorate +dedecoration +dedecorous +dedendum +dedentition +dedicant +dedicate +dedicatee +dedication +dedicational +dedicative +dedicator +dedicatorial +dedicatorily +dedicatory +dedicature +dedifferentiate +dedifferentiation +dedimus +deditician +dediticiancy +dedition +dedo +dedoggerelize +dedogmatize +dedolation +deduce +deducement +deducibility +deducible +deducibleness +deducibly +deducive +deduct +deductible +deduction +deductive +deductively +deductory +deduplication +dee +deed +deedbox +deedeed +deedful +deedfully +deedily +deediness +deedless +deedy +deem +deemer +deemie +deemster +deemstership +deep +deepen +deepener +deepening +deepeningly +Deepfreeze +deeping +deepish +deeplier +deeply +deepmost +deepmouthed +deepness +deepsome +deepwater +deepwaterman +deer +deerberry +deerdog +deerdrive +deerfood +deerhair +deerherd +deerhorn +deerhound +deerlet +deermeat +deerskin +deerstalker +deerstalking +deerstand +deerstealer +deertongue +deerweed +deerwood +deeryard +deevey +deevilick +deface +defaceable +defacement +defacer +defacing +defacingly +defalcate +defalcation +defalcator +defalk +defamation +defamatory +defame +defamed +defamer +defamingly +defassa +defat +default +defaultant +defaulter +defaultless +defaulture +defeasance +defeasanced +defease +defeasibility +defeasible +defeasibleness +defeat +defeater +defeatism +defeatist +defeatment +defeature +defecant +defecate +defecation +defecator +defect +defectibility +defectible +defection +defectionist +defectious +defective +defectively +defectiveness +defectless +defectology +defector +defectoscope +defedation +defeminize +defence +defend +defendable +defendant +defender +defendress +defenestration +defensative +defense +defenseless +defenselessly +defenselessness +defensibility +defensible +defensibleness +defensibly +defension +defensive +defensively +defensiveness +defensor +defensorship +defensory +defer +deferable +deference +deferent +deferentectomy +deferential +deferentiality +deferentially +deferentitis +deferment +deferrable +deferral +deferred +deferrer +deferrization +deferrize +defervesce +defervescence +defervescent +defeudalize +defiable +defial +defiance +defiant +defiantly +defiantness +defiber +defibrinate +defibrination +defibrinize +deficience +deficiency +deficient +deficiently +deficit +defier +defiguration +defilade +defile +defiled +defiledness +defilement +defiler +defiliation +defiling +defilingly +definability +definable +definably +define +defined +definedly +definement +definer +definiendum +definiens +definite +definitely +definiteness +definition +definitional +definitiones +definitive +definitively +definitiveness +definitization +definitize +definitor +definitude +deflagrability +deflagrable +deflagrate +deflagration +deflagrator +deflate +deflation +deflationary +deflationist +deflator +deflect +deflectable +deflected +deflection +deflectionization +deflectionize +deflective +deflectometer +deflector +deflesh +deflex +deflexibility +deflexible +deflexion +deflexure +deflocculant +deflocculate +deflocculation +deflocculator +deflorate +defloration +deflorescence +deflower +deflowerer +defluent +defluous +defluvium +defluxion +defoedation +defog +defoliage +defoliate +defoliated +defoliation +defoliator +deforce +deforcement +deforceor +deforcer +deforciant +deforest +deforestation +deforester +deform +deformability +deformable +deformalize +deformation +deformational +deformative +deformed +deformedly +deformedness +deformer +deformeter +deformism +deformity +defortify +defoul +defraud +defraudation +defrauder +defraudment +defray +defrayable +defrayal +defrayer +defrayment +defreeze +defrication +defrock +defrost +defroster +deft +defterdar +deftly +deftness +defunct +defunction +defunctionalization +defunctionalize +defunctness +defuse +defusion +defy +defyingly +deg +deganglionate +degarnish +degas +degasification +degasifier +degasify +degasser +degauss +degelatinize +degelation +degeneracy +degeneralize +degenerate +degenerately +degenerateness +degeneration +degenerationist +degenerative +degenerescence +degenerescent +degentilize +degerm +degerminate +degerminator +degged +degger +deglaciation +deglaze +deglutinate +deglutination +deglutition +deglutitious +deglutitive +deglutitory +deglycerin +deglycerine +degorge +degradable +degradand +degradation +degradational +degradative +degrade +degraded +degradedly +degradedness +degradement +degrader +degrading +degradingly +degradingness +degraduate +degraduation +degrain +degrease +degreaser +degree +degreeless +degreewise +degression +degressive +degressively +degu +Deguelia +deguelin +degum +degummer +degust +degustation +dehair +dehairer +Dehaites +deheathenize +dehematize +dehepatize +Dehgan +dehisce +dehiscence +dehiscent +dehistoricize +Dehkan +dehnstufe +dehonestate +dehonestation +dehorn +dehorner +dehors +dehort +dehortation +dehortative +dehortatory +dehorter +dehull +dehumanization +dehumanize +dehumidification +dehumidifier +dehumidify +dehusk +Dehwar +dehydrant +dehydrase +dehydrate +dehydration +dehydrator +dehydroascorbic +dehydrocorydaline +dehydrofreezing +dehydrogenase +dehydrogenate +dehydrogenation +dehydrogenization +dehydrogenize +dehydromucic +dehydrosparteine +dehypnotize +deice +deicer +deicidal +deicide +deictic +deictical +deictically +deidealize +Deidesheimer +deific +deifical +deification +deificatory +deifier +deiform +deiformity +deify +deign +Deimos +deincrustant +deindividualization +deindividualize +deindividuate +deindustrialization +deindustrialize +deink +Deino +Deinocephalia +Deinoceras +Deinodon +Deinodontidae +deinos +Deinosauria +Deinotherium +deinsularize +deintellectualization +deintellectualize +deionize +Deipara +deiparous +Deiphobus +deipnodiplomatic +deipnophobia +deipnosophism +deipnosophist +deipnosophistic +deipotent +deiseal +deisidaimonia +deism +deist +deistic +deistical +deistically +deisticalness +deity +deityship +deject +dejecta +dejected +dejectedly +dejectedness +dejectile +dejection +dejectly +dejectory +dejecture +dejerate +dejeration +dejerator +dejeune +dejeuner +dejunkerize +Dekabrist +dekaparsec +dekapode +dekko +dekle +deknight +delabialization +delabialize +delacrimation +delactation +delaine +delaminate +delamination +delapse +delapsion +delate +delater +delatinization +delatinize +delation +delator +delatorian +Delaware +Delawarean +delawn +delay +delayable +delayage +delayer +delayful +delaying +delayingly +dele +delead +delectability +delectable +delectableness +delectably +delectate +delectation +delectus +delegable +delegacy +delegalize +delegant +delegate +delegatee +delegateship +delegation +delegative +delegator +delegatory +delenda +Delesseria +Delesseriaceae +delesseriaceous +delete +deleterious +deleteriously +deleteriousness +deletion +deletive +deletory +delf +delft +delftware +Delhi +Delia +Delian +deliberalization +deliberalize +deliberant +deliberate +deliberately +deliberateness +deliberation +deliberative +deliberatively +deliberativeness +deliberator +delible +delicacy +delicate +delicately +delicateness +delicatesse +delicatessen +delicense +Delichon +delicioso +Delicious +delicious +deliciously +deliciousness +delict +delictum +deligated +deligation +delight +delightable +delighted +delightedly +delightedness +delighter +delightful +delightfully +delightfulness +delighting +delightingly +delightless +delightsome +delightsomely +delightsomeness +delignate +delignification +Delilah +delime +delimit +delimitate +delimitation +delimitative +delimiter +delimitize +delineable +delineament +delineate +delineation +delineative +delineator +delineatory +delineature +delinquence +delinquency +delinquent +delinquently +delint +delinter +deliquesce +deliquescence +deliquescent +deliquium +deliracy +delirament +deliration +deliriant +delirifacient +delirious +deliriously +deliriousness +delirium +delitescence +delitescency +delitescent +deliver +deliverable +deliverance +deliverer +deliveress +deliveror +delivery +deliveryman +dell +Della +dellenite +Delobranchiata +delocalization +delocalize +delomorphic +delomorphous +deloul +delouse +delphacid +Delphacidae +Delphian +Delphin +Delphinapterus +delphine +delphinic +Delphinid +Delphinidae +delphinin +delphinine +delphinite +Delphinium +Delphinius +delphinoid +Delphinoidea +delphinoidine +Delphinus +delphocurarine +Delsarte +Delsartean +Delsartian +Delta +delta +deltafication +deltaic +deltal +deltarium +deltation +delthyrial +delthyrium +deltic +deltidial +deltidium +deltiology +deltohedron +deltoid +deltoidal +delubrum +deludable +delude +deluder +deludher +deluding +deludingly +deluge +deluminize +delundung +delusion +delusional +delusionist +delusive +delusively +delusiveness +delusory +deluster +deluxe +delve +delver +demagnetizable +demagnetization +demagnetize +demagnetizer +demagog +demagogic +demagogical +demagogically +demagogism +demagogue +demagoguery +demagogy +demal +demand +demandable +demandant +demander +demanding +demandingly +demanganization +demanganize +demantoid +demarcate +demarcation +demarcator +demarch +demarchy +demargarinate +demark +demarkation +demast +dematerialization +dematerialize +Dematiaceae +dematiaceous +deme +demean +demeanor +demegoric +demency +dement +dementate +dementation +demented +dementedly +dementedness +dementholize +dementia +demephitize +demerit +demeritorious +demeritoriously +Demerol +demersal +demersed +demersion +demesman +demesmerize +demesne +demesnial +demetallize +demethylate +demethylation +Demetrian +demetricize +demi +demiadult +demiangel +demiassignation +demiatheism +demiatheist +demibarrel +demibastion +demibastioned +demibath +demibeast +demibelt +demibob +demibombard +demibrassart +demibrigade +demibrute +demibuckram +demicadence +demicannon +demicanon +demicanton +demicaponier +demichamfron +demicircle +demicircular +demicivilized +demicolumn +demicoronal +demicritic +demicuirass +demiculverin +demicylinder +demicylindrical +demidandiprat +demideify +demideity +demidevil +demidigested +demidistance +demiditone +demidoctor +demidog +demidolmen +demidome +demieagle +demifarthing +demifigure +demiflouncing +demifusion +demigardebras +demigauntlet +demigentleman +demiglobe +demigod +demigoddess +demigoddessship +demigorge +demigriffin +demigroat +demihag +demihearse +demiheavenly +demihigh +demihogshead +demihorse +demihuman +demijambe +demijohn +demikindred +demiking +demilance +demilancer +demilawyer +demilegato +demilion +demilitarization +demilitarize +demiliterate +demilune +demiluster +demilustre +demiman +demimark +demimentoniere +demimetope +demimillionaire +demimondaine +demimonde +demimonk +deminatured +demineralization +demineralize +deminude +deminudity +demioctagonal +demioctangular +demiofficial +demiorbit +demiourgoi +demiowl +demiox +demipagan +demiparallel +demipauldron +demipectinate +demipesade +demipike +demipillar +demipique +demiplacate +demiplate +demipomada +demipremise +demipremiss +demipriest +demipronation +demipuppet +demiquaver +demiracle +demiram +demirelief +demirep +demirevetment +demirhumb +demirilievo +demirobe +demisability +demisable +demisacrilege +demisang +demisangue +demisavage +demise +demiseason +demisecond +demisemiquaver +demisemitone +demisheath +demishirt +demisovereign +demisphere +demiss +demission +demissionary +demissly +demissness +demissory +demisuit +demit +demitasse +demitint +demitoilet +demitone +demitrain +demitranslucence +demitube +demiturned +demiurge +demiurgeous +demiurgic +demiurgical +demiurgically +demiurgism +demivambrace +demivirgin +demivoice +demivol +demivolt +demivotary +demiwivern +demiwolf +demnition +demob +demobilization +demobilize +democracy +democrat +democratian +democratic +democratical +democratically +democratifiable +democratism +democratist +democratization +democratize +demodectic +demoded +Demodex +Demodicidae +Demodocus +demodulation +demodulator +demogenic +Demogorgon +demographer +demographic +demographical +demographically +demographist +demography +demoid +demoiselle +demolish +demolisher +demolishment +demolition +demolitionary +demolitionist +demological +demology +Demon +demon +demonastery +demoness +demonetization +demonetize +demoniac +demoniacal +demoniacally +demoniacism +demonial +demonian +demonianism +demoniast +demonic +demonical +demonifuge +demonish +demonism +demonist +demonize +demonkind +demonland +demonlike +demonocracy +demonograph +demonographer +demonography +demonolater +demonolatrous +demonolatrously +demonolatry +demonologer +demonologic +demonological +demonologically +demonologist +demonology +demonomancy +demonophobia +demonry +demonship +demonstrability +demonstrable +demonstrableness +demonstrably +demonstrant +demonstratable +demonstrate +demonstratedly +demonstrater +demonstration +demonstrational +demonstrationist +demonstrative +demonstratively +demonstrativeness +demonstrator +demonstratorship +demonstratory +demophil +demophilism +demophobe +Demophon +Demophoon +demoralization +demoralize +demoralizer +demorphinization +demorphism +demos +Demospongiae +Demosthenean +Demosthenic +demote +demotic +demotics +demotion +demotist +demount +demountability +demountable +dempster +demulce +demulcent +demulsibility +demulsify +demulsion +demure +demurely +demureness +demurity +demurrable +demurrage +demurral +demurrant +demurrer +demurring +demurringly +demutization +demy +demyship +den +denarcotization +denarcotize +denarius +denaro +denary +denat +denationalization +denationalize +denaturalization +denaturalize +denaturant +denaturate +denaturation +denature +denaturization +denaturize +denaturizer +denazify +denda +dendrachate +dendral +Dendraspis +dendraxon +dendric +dendriform +dendrite +Dendrites +dendritic +dendritical +dendritically +dendritiform +Dendrium +Dendrobates +Dendrobatinae +dendrobe +Dendrobium +Dendrocalamus +Dendroceratina +dendroceratine +Dendrochirota +dendrochronological +dendrochronologist +dendrochronology +dendroclastic +Dendrocoela +dendrocoelan +dendrocoele +dendrocoelous +Dendrocolaptidae +dendrocolaptine +Dendroctonus +Dendrocygna +dendrodont +Dendrodus +Dendroeca +Dendrogaea +Dendrogaean +dendrograph +dendrography +Dendrohyrax +Dendroica +dendroid +dendroidal +Dendroidea +Dendrolagus +dendrolatry +Dendrolene +dendrolite +dendrologic +dendrological +dendrologist +dendrologous +dendrology +Dendromecon +dendrometer +dendron +dendrophil +dendrophile +dendrophilous +Dendropogon +Dene +dene +Deneb +Denebola +denegate +denegation +denehole +denervate +denervation +deneutralization +dengue +deniable +denial +denicotinize +denier +denierage +denierer +denigrate +denigration +denigrator +denim +Denis +denitrate +denitration +denitrator +denitrificant +denitrification +denitrificator +denitrifier +denitrify +denitrize +denization +denizen +denizenation +denizenize +denizenship +dennet +Dennis +Dennstaedtia +denominable +denominate +denomination +denominational +denominationalism +denominationalist +denominationalize +denominationally +denominative +denominatively +denominator +denotable +denotation +denotative +denotatively +denotativeness +denotatum +denote +denotement +denotive +denouement +denounce +denouncement +denouncer +dense +densely +densen +denseness +denshare +densher +denshire +densification +densifier +densify +densimeter +densimetric +densimetrically +densimetry +densitometer +density +dent +dentagra +dental +dentale +dentalgia +Dentaliidae +dentalism +dentality +Dentalium +dentalization +dentalize +dentally +dentaphone +Dentaria +dentary +dentata +dentate +dentated +dentately +dentation +dentatoangulate +dentatocillitate +dentatocostate +dentatocrenate +dentatoserrate +dentatosetaceous +dentatosinuate +dentel +dentelated +dentelle +dentelure +denter +dentex +dentical +denticate +Denticeti +denticle +denticular +denticulate +denticulately +denticulation +denticule +dentiferous +dentification +dentiform +dentifrice +dentigerous +dentil +dentilabial +dentilated +dentilation +dentile +dentilingual +dentiloquist +dentiloquy +dentimeter +dentin +dentinal +dentinalgia +dentinasal +dentine +dentinitis +dentinoblast +dentinocemental +dentinoid +dentinoma +dentiparous +dentiphone +dentiroster +dentirostral +dentirostrate +Dentirostres +dentiscalp +dentist +dentistic +dentistical +dentistry +dentition +dentoid +dentolabial +dentolingual +dentonasal +dentosurgical +dentural +denture +denty +denucleate +denudant +denudate +denudation +denudative +denude +denuder +denumerable +denumerably +denumeral +denumerant +denumerantive +denumeration +denumerative +denunciable +denunciant +denunciate +denunciation +denunciative +denunciatively +denunciator +denunciatory +denutrition +deny +denyingly +deobstruct +deobstruent +deoccidentalize +deoculate +deodand +deodara +deodorant +deodorization +deodorize +deodorizer +deontological +deontologist +deontology +deoperculate +deoppilant +deoppilate +deoppilation +deoppilative +deordination +deorganization +deorganize +deorientalize +deorsumvergence +deorsumversion +deorusumduction +deossification +deossify +deota +deoxidant +deoxidate +deoxidation +deoxidative +deoxidator +deoxidization +deoxidize +deoxidizer +deoxygenate +deoxygenation +deoxygenization +deozonization +deozonize +deozonizer +depa +depaganize +depaint +depancreatization +depancreatize +depark +deparliament +depart +departed +departer +departisanize +departition +department +departmental +departmentalism +departmentalization +departmentalize +departmentally +departmentization +departmentize +departure +depas +depascent +depass +depasturable +depasturage +depasturation +depasture +depatriate +depauperate +depauperation +depauperization +depauperize +depencil +depend +dependability +dependable +dependableness +dependably +dependence +dependency +dependent +dependently +depender +depending +dependingly +depeople +deperdite +deperditely +deperition +depersonalization +depersonalize +depersonize +depetalize +depeter +depetticoat +dephase +dephilosophize +dephlegmate +dephlegmation +dephlegmatize +dephlegmator +dephlegmatory +dephlegmedness +dephlogisticate +dephlogisticated +dephlogistication +dephosphorization +dephosphorize +dephysicalization +dephysicalize +depickle +depict +depicter +depiction +depictive +depicture +depiedmontize +depigment +depigmentate +depigmentation +depigmentize +depilate +depilation +depilator +depilatory +depilitant +depilous +deplaceable +deplane +deplasmolysis +deplaster +deplenish +deplete +deplethoric +depletion +depletive +depletory +deploitation +deplorability +deplorable +deplorableness +deplorably +deploration +deplore +deplored +deploredly +deploredness +deplorer +deploringly +deploy +deployment +deplumate +deplumated +deplumation +deplume +deplump +depoetize +depoh +depolarization +depolarize +depolarizer +depolish +depolishing +depolymerization +depolymerize +depone +deponent +depopularize +depopulate +depopulation +depopulative +depopulator +deport +deportable +deportation +deportee +deporter +deportment +deposable +deposal +depose +deposer +deposit +depositary +depositation +depositee +deposition +depositional +depositive +depositor +depository +depositum +depositure +depot +depotentiate +depotentiation +depravation +deprave +depraved +depravedly +depravedness +depraver +depravingly +depravity +deprecable +deprecate +deprecatingly +deprecation +deprecative +deprecator +deprecatorily +deprecatoriness +deprecatory +depreciable +depreciant +depreciate +depreciatingly +depreciation +depreciative +depreciatively +depreciator +depreciatoriness +depreciatory +depredate +depredation +depredationist +depredator +depredatory +depress +depressant +depressed +depressibility +depressible +depressing +depressingly +depressingness +depression +depressive +depressively +depressiveness +depressomotor +depressor +depreter +deprint +depriorize +deprivable +deprival +deprivate +deprivation +deprivative +deprive +deprivement +depriver +deprovincialize +depside +depth +depthen +depthing +depthless +depthometer +depthwise +depullulation +depurant +depurate +depuration +depurative +depurator +depuratory +depursement +deputable +deputation +deputational +deputationist +deputationize +deputative +deputatively +deputator +depute +deputize +deputy +deputyship +dequeen +derabbinize +deracialize +deracinate +deracination +deradelphus +deradenitis +deradenoncus +derah +deraign +derail +derailer +derailment +derange +derangeable +deranged +derangement +deranger +derat +derate +derater +derationalization +derationalize +deratization +deray +Derbend +Derby +derby +derbylite +dere +deregister +deregulationize +dereism +dereistic +dereistically +derelict +dereliction +derelictly +derelictness +dereligion +dereligionize +derencephalocele +derencephalus +deresinate +deresinize +deric +deride +derider +deridingly +Deringa +Deripia +derisible +derision +derisive +derisively +derisiveness +derisory +derivability +derivable +derivably +derival +derivant +derivate +derivately +derivation +derivational +derivationally +derivationist +derivatist +derivative +derivatively +derivativeness +derive +derived +derivedly +derivedness +deriver +derm +derma +Dermacentor +dermad +dermahemia +dermal +dermalgia +dermalith +dermamyiasis +dermanaplasty +dermapostasis +Dermaptera +dermapteran +dermapterous +dermaskeleton +dermasurgery +dermatagra +dermatalgia +dermataneuria +dermatatrophia +dermatauxe +dermathemia +dermatic +dermatine +dermatitis +Dermatobia +dermatocele +dermatocellulitis +dermatoconiosis +Dermatocoptes +dermatocoptic +dermatocyst +dermatodynia +dermatogen +dermatoglyphics +dermatograph +dermatographia +dermatography +dermatoheteroplasty +dermatoid +dermatological +dermatologist +dermatology +dermatolysis +dermatoma +dermatome +dermatomere +dermatomic +dermatomuscular +dermatomyces +dermatomycosis +dermatomyoma +dermatoneural +dermatoneurology +dermatoneurosis +dermatonosus +dermatopathia +dermatopathic +dermatopathology +dermatopathophobia +Dermatophagus +dermatophobia +dermatophone +dermatophony +dermatophyte +dermatophytic +dermatophytosis +dermatoplasm +dermatoplast +dermatoplastic +dermatoplasty +dermatopnagic +dermatopsy +Dermatoptera +dermatoptic +dermatorrhagia +dermatorrhea +dermatorrhoea +dermatosclerosis +dermatoscopy +dermatosis +dermatoskeleton +dermatotherapy +dermatotome +dermatotomy +dermatotropic +dermatoxerasia +dermatozoon +dermatozoonosis +dermatrophia +dermatrophy +dermenchysis +Dermestes +dermestid +Dermestidae +dermestoid +dermic +dermis +dermitis +dermoblast +Dermobranchia +dermobranchiata +dermobranchiate +Dermochelys +dermochrome +dermococcus +dermogastric +dermographia +dermographic +dermographism +dermography +dermohemal +dermohemia +dermohumeral +dermoid +dermoidal +dermoidectomy +dermol +dermolysis +dermomuscular +dermomycosis +dermoneural +dermoneurosis +dermonosology +dermoosseous +dermoossification +dermopathic +dermopathy +dermophlebitis +dermophobe +dermophyte +dermophytic +dermoplasty +Dermoptera +dermopteran +dermopterous +dermoreaction +Dermorhynchi +dermorhynchous +dermosclerite +dermoskeletal +dermoskeleton +dermostenosis +dermostosis +dermosynovitis +dermotropic +dermovaccine +dermutation +dern +dernier +derodidymus +derogate +derogately +derogation +derogative +derogatively +derogator +derogatorily +derogatoriness +derogatory +Derotrema +Derotremata +derotremate +derotrematous +derotreme +derout +Derrick +derrick +derricking +derrickman +derride +derries +derringer +Derris +derry +dertrotheca +dertrum +deruinate +deruralize +derust +dervish +dervishhood +dervishism +dervishlike +desaccharification +desacralization +desacralize +desalt +desamidization +desand +desaturate +desaturation +desaurin +descale +descant +descanter +descantist +descend +descendable +descendance +descendant +descendence +descendent +descendental +descendentalism +descendentalist +descendentalistic +descender +descendibility +descendible +descending +descendingly +descension +descensional +descensionist +descensive +descent +Deschampsia +descloizite +descort +describability +describable +describably +describe +describer +descrier +descript +description +descriptionist +descriptionless +descriptive +descriptively +descriptiveness +descriptory +descrive +descry +deseasonalize +desecrate +desecrater +desecration +desectionalize +deseed +desegmentation +desegmented +desensitization +desensitize +desensitizer +desentimentalize +deseret +desert +deserted +desertedly +desertedness +deserter +desertful +desertfully +desertic +deserticolous +desertion +desertism +desertless +desertlessly +desertlike +desertness +desertress +desertrice +desertward +deserve +deserved +deservedly +deservedness +deserveless +deserver +deserving +deservingly +deservingness +desex +desexualization +desexualize +deshabille +desi +desiccant +desiccate +desiccation +desiccative +desiccator +desiccatory +desiderant +desiderata +desiderate +desideration +desiderative +desideratum +desight +desightment +design +designable +designate +designation +designative +designator +designatory +designatum +designed +designedly +designedness +designee +designer +designful +designfully +designfulness +designing +designingly +designless +designlessly +designlessness +desilicate +desilicification +desilicify +desiliconization +desiliconize +desilver +desilverization +desilverize +desilverizer +desinence +desinent +desiodothyroxine +desipience +desipiency +desipient +desirability +desirable +desirableness +desirably +desire +desired +desiredly +desiredness +desireful +desirefulness +desireless +desirer +desiringly +desirous +desirously +desirousness +desist +desistance +desistive +desition +desize +desk +desklike +deslime +desma +desmachymatous +desmachyme +desmacyte +desman +Desmanthus +Desmarestia +Desmarestiaceae +desmarestiaceous +Desmatippus +desmectasia +desmepithelium +desmic +desmid +Desmidiaceae +desmidiaceous +Desmidiales +desmidiologist +desmidiology +desmine +desmitis +desmocyte +desmocytoma +Desmodactyli +Desmodium +desmodont +Desmodontidae +Desmodus +desmodynia +desmogen +desmogenous +Desmognathae +desmognathism +desmognathous +desmography +desmohemoblast +desmoid +desmology +desmoma +Desmomyaria +desmon +Desmoncus +desmoneoplasm +desmonosology +desmopathologist +desmopathology +desmopathy +desmopelmous +desmopexia +desmopyknosis +desmorrhexis +Desmoscolecidae +Desmoscolex +desmosis +desmosite +Desmothoraca +desmotomy +desmotrope +desmotropic +desmotropism +desocialization +desocialize +desolate +desolately +desolateness +desolater +desolating +desolatingly +desolation +desolative +desonation +desophisticate +desophistication +desorption +desoxalate +desoxyanisoin +desoxybenzoin +desoxycinchonine +desoxycorticosterone +desoxymorphine +desoxyribonucleic +despair +despairer +despairful +despairfully +despairfulness +despairing +despairingly +despairingness +despecialization +despecialize +despecificate +despecification +despect +desperacy +desperado +desperadoism +desperate +desperately +desperateness +desperation +despicability +despicable +despicableness +despicably +despiritualization +despiritualize +despisable +despisableness +despisal +despise +despisedness +despisement +despiser +despisingly +despite +despiteful +despitefully +despitefulness +despiteous +despiteously +despoil +despoiler +despoilment +despoliation +despond +despondence +despondency +despondent +despondently +desponder +desponding +despondingly +despot +despotat +Despotes +despotic +despotically +despoticalness +despoticly +despotism +despotist +despotize +despumate +despumation +desquamate +desquamation +desquamative +desquamatory +dess +dessa +dessert +dessertspoon +dessertspoonful +dessiatine +dessil +destabilize +destain +destandardize +desterilization +desterilize +destinate +destination +destine +destinezite +destinism +destinist +destiny +destitute +destitutely +destituteness +destitution +destour +destress +destrier +destroy +destroyable +destroyer +destroyingly +destructibility +destructible +destructibleness +destruction +destructional +destructionism +destructionist +destructive +destructively +destructiveness +destructivism +destructivity +destructor +destructuralize +desubstantiate +desucration +desuete +desuetude +desugar +desugarize +Desulfovibrio +desulphur +desulphurate +desulphuration +desulphurization +desulphurize +desulphurizer +desultor +desultorily +desultoriness +desultorious +desultory +desuperheater +desyatin +desyl +desynapsis +desynaptic +desynonymization +desynonymize +detach +detachability +detachable +detachableness +detachably +detached +detachedly +detachedness +detacher +detachment +detail +detailed +detailedly +detailedness +detailer +detailism +detailist +detain +detainable +detainal +detainer +detainingly +detainment +detar +detassel +detax +detect +detectability +detectable +detectably +detectaphone +detecter +detectible +detection +detective +detectivism +detector +detenant +detent +detention +detentive +deter +deterge +detergence +detergency +detergent +detergible +deteriorate +deterioration +deteriorationist +deteriorative +deteriorator +deteriorism +deteriority +determent +determinability +determinable +determinableness +determinably +determinacy +determinant +determinantal +determinate +determinately +determinateness +determination +determinative +determinatively +determinativeness +determinator +determine +determined +determinedly +determinedness +determiner +determinism +determinist +deterministic +determinoid +deterrence +deterrent +detersion +detersive +detersively +detersiveness +detest +detestability +detestable +detestableness +detestably +detestation +detester +dethronable +dethrone +dethronement +dethroner +dethyroidism +detin +detinet +detinue +detonable +detonate +detonation +detonative +detonator +detorsion +detour +detoxicant +detoxicate +detoxication +detoxicator +detoxification +detoxify +detract +detracter +detractingly +detraction +detractive +detractively +detractiveness +detractor +detractory +detractress +detrain +detrainment +detribalization +detribalize +detriment +detrimental +detrimentality +detrimentally +detrimentalness +detrital +detrited +detrition +detritus +Detroiter +detrude +detruncate +detruncation +detrusion +detrusive +detrusor +detubation +detumescence +detune +detur +deuce +deuced +deucedly +deul +deurbanize +deutencephalic +deutencephalon +deuteragonist +deuteranomal +deuteranomalous +deuteranope +deuteranopia +deuteranopic +deuteric +deuteride +deuterium +deuteroalbumose +deuterocanonical +deuterocasease +deuterocone +deuteroconid +deuterodome +deuteroelastose +deuterofibrinose +deuterogamist +deuterogamy +deuterogelatose +deuterogenic +deuteroglobulose +deuteromorphic +Deuteromycetes +deuteromyosinose +deuteron +Deuteronomic +Deuteronomical +Deuteronomist +Deuteronomistic +Deuteronomy +deuteropathic +deuteropathy +deuteroplasm +deuteroprism +deuteroproteose +deuteroscopic +deuteroscopy +deuterostoma +Deuterostomata +deuterostomatous +deuterotokous +deuterotoky +deuterotype +deuterovitellose +deuterozooid +deutobromide +deutocarbonate +deutochloride +deutomala +deutomalal +deutomalar +deutomerite +deuton +deutonephron +deutonymph +deutonymphal +deutoplasm +deutoplasmic +deutoplastic +deutoscolex +deutoxide +Deutzia +dev +deva +devachan +devadasi +devall +devaloka +devalorize +devaluate +devaluation +devalue +devance +devaporate +devaporation +devast +devastate +devastating +devastatingly +devastation +devastative +devastator +devastavit +devaster +devata +develin +develop +developability +developable +developedness +developer +developist +development +developmental +developmentalist +developmentally +developmentarian +developmentary +developmentist +developoid +devertebrated +devest +deviability +deviable +deviancy +deviant +deviate +deviation +deviationism +deviationist +deviative +deviator +deviatory +device +deviceful +devicefully +devicefulness +devil +devilbird +devildom +deviled +deviler +deviless +devilet +devilfish +devilhood +deviling +devilish +devilishly +devilishness +devilism +devilize +devilkin +devillike +devilman +devilment +devilmonger +devilry +devilship +deviltry +devilward +devilwise +devilwood +devily +devious +deviously +deviousness +devirginate +devirgination +devirginator +devirilize +devisable +devisal +deviscerate +devisceration +devise +devisee +deviser +devisor +devitalization +devitalize +devitalized +devitaminize +devitrification +devitrify +devocalization +devocalize +devoice +devoid +devoir +devolatilize +devolute +devolution +devolutionary +devolutionist +devolve +devolvement +Devon +Devonian +Devonic +devonite +devonport +devonshire +devorative +devote +devoted +devotedly +devotedness +devotee +devoteeism +devotement +devoter +devotion +devotional +devotionalism +devotionalist +devotionality +devotionally +devotionalness +devotionate +devotionist +devour +devourable +devourer +devouress +devouring +devouringly +devouringness +devourment +devout +devoutless +devoutlessly +devoutlessness +devoutly +devoutness +devow +devulcanization +devulcanize +devulgarize +devvel +dew +dewan +dewanee +dewanship +dewater +dewaterer +dewax +dewbeam +dewberry +dewclaw +dewclawed +dewcup +dewdamp +dewdrop +dewdropper +dewer +deweylite +dewfall +dewflower +dewily +dewiness +dewlap +dewlapped +dewless +dewlight +dewlike +dewool +deworm +dewret +dewtry +dewworm +dewy +dexiocardia +dexiotrope +dexiotropic +dexiotropism +dexiotropous +Dexter +dexter +dexterical +dexterity +dexterous +dexterously +dexterousness +dextrad +dextral +dextrality +dextrally +dextran +dextraural +dextrin +dextrinase +dextrinate +dextrinize +dextrinous +dextro +dextroaural +dextrocardia +dextrocardial +dextrocerebral +dextrocular +dextrocularity +dextroduction +dextroglucose +dextrogyrate +dextrogyration +dextrogyratory +dextrogyrous +dextrolactic +dextrolimonene +dextropinene +dextrorotary +dextrorotatary +dextrorotation +dextrorsal +dextrorse +dextrorsely +dextrosazone +dextrose +dextrosinistral +dextrosinistrally +dextrosuria +dextrotartaric +dextrotropic +dextrotropous +dextrous +dextrously +dextrousness +dextroversion +dey +deyhouse +deyship +deywoman +Dezaley +dezinc +dezincation +dezincification +dezincify +dezymotize +dha +dhabb +dhai +dhak +dhamnoo +dhan +dhangar +dhanuk +dhanush +Dhanvantari +dharana +dharani +dharma +dharmakaya +dharmashastra +dharmasmriti +dharmasutra +dharmsala +dharna +dhaura +dhauri +dhava +dhaw +Dheneb +dheri +dhobi +dhole +dhoni +dhoon +dhoti +dhoul +dhow +Dhritarashtra +dhu +dhunchee +dhunchi +Dhundia +dhurra +dhyal +dhyana +di +diabase +diabasic +diabetes +diabetic +diabetogenic +diabetogenous +diabetometer +diablerie +diabolarch +diabolarchy +diabolatry +diabolepsy +diaboleptic +diabolic +diabolical +diabolically +diabolicalness +diabolification +diabolify +diabolism +diabolist +diabolization +diabolize +diabological +diabology +diabolology +diabrosis +diabrotic +Diabrotica +diacanthous +diacaustic +diacetamide +diacetate +diacetic +diacetin +diacetine +diacetonuria +diaceturia +diacetyl +diacetylene +diachoretic +diachronic +diachylon +diachylum +diacid +diacipiperazine +diaclase +diaclasis +diaclastic +diacle +diaclinal +diacodion +diacoele +diacoelia +diaconal +diaconate +diaconia +diaconicon +diaconicum +diacope +diacranterian +diacranteric +diacrisis +diacritic +diacritical +diacritically +Diacromyodi +diacromyodian +diact +diactin +diactinal +diactinic +diactinism +Diadelphia +diadelphian +diadelphic +diadelphous +diadem +Diadema +Diadematoida +diaderm +diadermic +diadoche +Diadochi +Diadochian +diadochite +diadochokinesia +diadochokinetic +diadromous +diadumenus +diaene +diaereses +diaeresis +diaeretic +diaetetae +diagenesis +diagenetic +diageotropic +diageotropism +diaglyph +diaglyphic +diagnosable +diagnose +diagnoseable +diagnoses +diagnosis +diagnostic +diagnostically +diagnosticate +diagnostication +diagnostician +diagnostics +diagometer +diagonal +diagonality +diagonalize +diagonally +diagonalwise +diagonic +diagram +diagrammatic +diagrammatical +diagrammatician +diagrammatize +diagrammeter +diagrammitically +diagraph +diagraphic +diagraphical +diagraphics +diagredium +diagrydium +Diaguitas +Diaguite +diaheliotropic +diaheliotropically +diaheliotropism +diakinesis +dial +dialcohol +dialdehyde +dialect +dialectal +dialectalize +dialectally +dialectic +dialectical +dialectically +dialectician +dialecticism +dialecticize +dialectics +dialectologer +dialectological +dialectologist +dialectology +dialector +dialer +dialin +dialing +dialist +Dialister +dialkyl +dialkylamine +diallage +diallagic +diallagite +diallagoid +diallel +diallelon +diallelus +diallyl +dialogic +dialogical +dialogically +dialogism +dialogist +dialogistic +dialogistical +dialogistically +dialogite +dialogize +dialogue +dialoguer +Dialonian +dialuric +dialycarpous +Dialypetalae +dialypetalous +dialyphyllous +dialysepalous +dialysis +dialystaminous +dialystelic +dialystely +dialytic +dialytically +dialyzability +dialyzable +dialyzate +dialyzation +dialyzator +dialyze +dialyzer +diamagnet +diamagnetic +diamagnetically +diamagnetism +diamantiferous +diamantine +diamantoid +diamb +diambic +diamesogamous +diameter +diametral +diametrally +diametric +diametrical +diametrically +diamicton +diamide +diamidogen +diamine +diaminogen +diaminogene +diammine +diamminobromide +diamminonitrate +diammonium +diamond +diamondback +diamonded +diamondiferous +diamondize +diamondlike +diamondwise +diamondwork +diamorphine +diamylose +Dian +dian +Diana +Diancecht +diander +Diandria +diandrian +diandrous +dianetics +Dianil +dianilid +dianilide +dianisidin +dianisidine +dianite +dianodal +dianoetic +dianoetical +dianoetically +Dianthaceae +Dianthera +Dianthus +diapalma +diapase +diapasm +diapason +diapasonal +diapause +diapedesis +diapedetic +Diapensia +Diapensiaceae +diapensiaceous +diapente +diaper +diapering +diaphane +diaphaneity +diaphanie +diaphanometer +diaphanometric +diaphanometry +diaphanoscope +diaphanoscopy +diaphanotype +diaphanous +diaphanously +diaphanousness +diaphany +diaphone +diaphonia +diaphonic +diaphonical +diaphony +diaphoresis +diaphoretic +diaphoretical +diaphorite +diaphote +diaphototropic +diaphototropism +diaphragm +diaphragmal +diaphragmatic +diaphragmatically +diaphtherin +diaphysial +diaphysis +diaplasma +diaplex +diaplexal +diaplexus +diapnoic +diapnotic +diapophysial +diapophysis +Diaporthe +diapositive +diapsid +Diapsida +diapsidan +diapyesis +diapyetic +diarch +diarchial +diarchic +diarchy +diarhemia +diarial +diarian +diarist +diaristic +diarize +diarrhea +diarrheal +diarrheic +diarrhetic +diarsenide +diarthric +diarthrodial +diarthrosis +diarticular +diary +diaschisis +diaschisma +diaschistic +Diascia +diascope +diascopy +diascord +diascordium +diaskeuasis +diaskeuast +Diaspidinae +diaspidine +Diaspinae +diaspine +diaspirin +Diaspora +diaspore +diastaltic +diastase +diastasic +diastasimetry +diastasis +diastataxic +diastataxy +diastatic +diastatically +diastem +diastema +diastematic +diastematomyelia +diaster +diastole +diastolic +diastomatic +diastral +diastrophe +diastrophic +diastrophism +diastrophy +diasynthesis +diasyrm +diatessaron +diathermacy +diathermal +diathermancy +diathermaneity +diathermanous +diathermic +diathermize +diathermometer +diathermotherapy +diathermous +diathermy +diathesic +diathesis +diathetic +diatom +Diatoma +Diatomaceae +diatomacean +diatomaceoid +diatomaceous +Diatomales +Diatomeae +diatomean +diatomic +diatomicity +diatomiferous +diatomin +diatomist +diatomite +diatomous +diatonic +diatonical +diatonically +diatonous +diatoric +diatreme +diatribe +diatribist +diatropic +diatropism +Diatryma +Diatrymiformes +Diau +diaulic +diaulos +diaxial +diaxon +diazenithal +diazeuctic +diazeuxis +diazide +diazine +diazoamine +diazoamino +diazoaminobenzene +diazoanhydride +diazoate +diazobenzene +diazohydroxide +diazoic +diazoimide +diazoimido +diazole +diazoma +diazomethane +diazonium +diazotate +diazotic +diazotizability +diazotizable +diazotization +diazotize +diazotype +dib +dibase +dibasic +dibasicity +dibatag +Dibatis +dibber +dibble +dibbler +dibbuk +dibenzophenazine +dibenzopyrrole +dibenzoyl +dibenzyl +dibhole +diblastula +diborate +Dibothriocephalus +dibrach +dibranch +Dibranchia +Dibranchiata +dibranchiate +dibranchious +dibrom +dibromid +dibromide +dibromoacetaldehyde +dibromobenzene +dibs +dibstone +dibutyrate +dibutyrin +dicacodyl +Dicaeidae +dicaeology +dicalcic +dicalcium +dicarbonate +dicarbonic +dicarboxylate +dicarboxylic +dicarpellary +dicaryon +dicaryophase +dicaryophyte +dicaryotic +dicast +dicastery +dicastic +dicatalectic +dicatalexis +Diccon +dice +diceboard +dicebox +dicecup +dicellate +diceman +Dicentra +dicentrine +dicephalism +dicephalous +dicephalus +diceplay +dicer +Diceras +Diceratidae +dicerion +dicerous +dicetyl +dich +Dichapetalaceae +Dichapetalum +dichas +dichasial +dichasium +dichastic +Dichelyma +dichlamydeous +dichloramine +dichlorhydrin +dichloride +dichloroacetic +dichlorohydrin +dichloromethane +dichocarpism +dichocarpous +dichogamous +dichogamy +Dichondra +Dichondraceae +dichopodial +dichoptic +dichord +dichoree +Dichorisandra +dichotic +dichotomal +dichotomic +dichotomically +dichotomist +dichotomistic +dichotomization +dichotomize +dichotomous +dichotomously +dichotomy +dichroic +dichroiscope +dichroism +dichroite +dichroitic +dichromasy +dichromat +dichromate +dichromatic +dichromatism +dichromic +dichromism +dichronous +dichrooscope +dichroous +dichroscope +dichroscopic +Dichter +dicing +dick +dickcissel +dickens +Dickensian +Dickensiana +dicker +dickey +dickeybird +dickinsonite +Dicksonia +dicky +Diclidantheraceae +diclinic +diclinism +diclinous +Diclytra +dicoccous +dicodeine +dicoelious +dicolic +dicolon +dicondylian +dicot +dicotyl +dicotyledon +dicotyledonary +Dicotyledones +dicotyledonous +Dicotyles +Dicotylidae +dicotylous +dicoumarin +Dicranaceae +dicranaceous +dicranoid +dicranterian +Dicranum +Dicrostonyx +dicrotal +dicrotic +dicrotism +dicrotous +Dicruridae +dicta +Dictaen +Dictamnus +Dictaphone +dictate +dictatingly +dictation +dictational +dictative +dictator +dictatorial +dictatorialism +dictatorially +dictatorialness +dictatorship +dictatory +dictatress +dictatrix +dictature +dictic +diction +dictionary +Dictograph +dictum +dictynid +Dictynidae +Dictyoceratina +dictyoceratine +dictyodromous +dictyogen +dictyogenous +Dictyograptus +dictyoid +Dictyonema +Dictyonina +dictyonine +Dictyophora +dictyopteran +Dictyopteris +Dictyosiphon +Dictyosiphonaceae +dictyosiphonaceous +dictyosome +dictyostele +dictyostelic +Dictyota +Dictyotaceae +dictyotaceous +Dictyotales +dictyotic +Dictyoxylon +dicyanide +dicyanine +dicyanodiamide +dicyanogen +dicycle +dicyclic +Dicyclica +dicyclist +Dicyema +Dicyemata +dicyemid +Dicyemida +Dicyemidae +Dicynodon +dicynodont +Dicynodontia +Dicynodontidae +did +Didache +Didachist +didactic +didactical +didacticality +didactically +didactician +didacticism +didacticity +didactics +didactive +didactyl +didactylism +didactylous +didapper +didascalar +didascaliae +didascalic +didascalos +didascaly +didder +diddle +diddler +diddy +didelph +Didelphia +didelphian +didelphic +didelphid +Didelphidae +didelphine +Didelphis +didelphoid +didelphous +Didelphyidae +didepsid +didepside +Dididae +didie +didine +Didinium +didle +didna +didnt +Dido +didodecahedral +didodecahedron +didrachma +didrachmal +didromy +didst +diductor +Didunculidae +Didunculinae +Didunculus +Didus +didym +didymate +didymia +didymitis +didymium +didymoid +didymolite +didymous +didymus +Didynamia +didynamian +didynamic +didynamous +didynamy +die +dieb +dieback +diectasis +diedral +diedric +Dieffenbachia +Diego +Diegueno +diehard +dielectric +dielectrically +dielike +Dielytra +diem +diemaker +diemaking +diencephalic +diencephalon +diene +dier +Dieri +Diervilla +diesel +dieselization +dieselize +diesinker +diesinking +diesis +diestock +diet +dietal +dietarian +dietary +dieter +dietetic +dietetically +dietetics +dietetist +diethanolamine +diethyl +diethylamine +diethylenediamine +diethylstilbestrol +dietic +dietician +dietics +dietine +dietist +dietitian +dietotherapeutics +dietotherapy +dietotoxic +dietotoxicity +dietrichite +dietzeite +diewise +Dieyerie +diezeugmenon +Difda +diferrion +diffame +diffarreation +differ +difference +differencingly +different +differentia +differentiable +differential +differentialize +differentially +differentiant +differentiate +differentiation +differentiator +differently +differentness +differingly +difficile +difficileness +difficult +difficultly +difficultness +difficulty +diffidation +diffide +diffidence +diffident +diffidently +diffidentness +diffinity +diffluence +diffluent +Difflugia +difform +difformed +difformity +diffract +diffraction +diffractive +diffractively +diffractiveness +diffractometer +diffrangibility +diffrangible +diffugient +diffusate +diffuse +diffused +diffusedly +diffusely +diffuseness +diffuser +diffusibility +diffusible +diffusibleness +diffusibly +diffusimeter +diffusiometer +diffusion +diffusionism +diffusionist +diffusive +diffusively +diffusiveness +diffusivity +diffusor +diformin +dig +digallate +digallic +digametic +digamist +digamma +digammated +digammic +digamous +digamy +digastric +Digenea +digeneous +digenesis +digenetic +Digenetica +digenic +digenous +digeny +digerent +digest +digestant +digested +digestedly +digestedness +digester +digestibility +digestible +digestibleness +digestibly +digestion +digestional +digestive +digestively +digestiveness +digestment +diggable +digger +digging +diggings +dight +dighter +digit +digital +digitalein +digitalin +digitalis +digitalism +digitalization +digitalize +digitally +Digitaria +digitate +digitated +digitately +digitation +digitiform +Digitigrada +digitigrade +digitigradism +digitinervate +digitinerved +digitipinnate +digitize +digitizer +digitogenin +digitonin +digitoplantar +digitorium +digitoxin +digitoxose +digitule +digitus +digladiate +digladiation +digladiator +diglossia +diglot +diglottic +diglottism +diglottist +diglucoside +diglyceride +diglyph +diglyphic +digmeat +dignification +dignified +dignifiedly +dignifiedness +dignify +dignitarial +dignitarian +dignitary +dignity +digoneutic +digoneutism +digonoporous +digonous +Digor +digram +digraph +digraphic +digredience +digrediency +digredient +digress +digressingly +digression +digressional +digressionary +digressive +digressively +digressiveness +digressory +digs +diguanide +Digynia +digynian +digynous +dihalide +dihalo +dihalogen +dihedral +dihedron +dihexagonal +dihexahedral +dihexahedron +dihybrid +dihybridism +dihydrate +dihydrated +dihydrazone +dihydric +dihydride +dihydrite +dihydrocupreine +dihydrocuprin +dihydrogen +dihydrol +dihydronaphthalene +dihydronicotine +dihydrotachysterol +dihydroxy +dihydroxysuccinic +dihydroxytoluene +dihysteria +diiamb +diiambus +diiodide +diiodo +diiodoform +diipenates +Diipolia +diisatogen +dijudicate +dijudication +dika +dikage +dikamali +dikaryon +dikaryophase +dikaryophasic +dikaryophyte +dikaryophytic +dikaryotic +Dike +dike +dikegrave +dikelocephalid +Dikelocephalus +diker +dikereeve +dikeside +diketo +diketone +dikkop +diktyonite +dilacerate +dilaceration +dilambdodont +dilamination +Dilantin +dilapidate +dilapidated +dilapidation +dilapidator +dilatability +dilatable +dilatableness +dilatably +dilatancy +dilatant +dilatate +dilatation +dilatative +dilatator +dilatatory +dilate +dilated +dilatedly +dilatedness +dilater +dilatingly +dilation +dilative +dilatometer +dilatometric +dilatometry +dilator +dilatorily +dilatoriness +dilatory +dildo +dilection +Dilemi +Dilemite +dilemma +dilemmatic +dilemmatical +dilemmatically +dilettant +dilettante +dilettanteish +dilettanteism +dilettanteship +dilettanti +dilettantish +dilettantism +dilettantist +diligence +diligency +diligent +diligentia +diligently +diligentness +dilker +dill +Dillenia +Dilleniaceae +dilleniaceous +dilleniad +dilli +dillier +dilligrout +dilling +dillseed +dillue +dilluer +dillweed +dilly +dillydallier +dillydally +dillyman +dilo +dilogy +diluent +dilute +diluted +dilutedly +dilutedness +dilutee +dilutely +diluteness +dilutent +diluter +dilution +dilutive +dilutor +diluvia +diluvial +diluvialist +diluvian +diluvianism +diluvion +diluvium +dim +dimagnesic +dimanganion +dimanganous +Dimaris +dimastigate +Dimatis +dimber +dimberdamber +dimble +dime +dimensible +dimension +dimensional +dimensionality +dimensionally +dimensioned +dimensionless +dimensive +dimer +Dimera +dimeran +dimercuric +dimercurion +dimercury +dimeric +dimeride +dimerism +dimerization +dimerlie +dimerous +dimetallic +dimeter +dimethoxy +dimethyl +dimethylamine +dimethylamino +dimethylaniline +dimethylbenzene +dimetria +dimetric +dimication +dimidiate +dimidiation +diminish +diminishable +diminishableness +diminisher +diminishingly +diminishment +diminuendo +diminutal +diminute +diminution +diminutival +diminutive +diminutively +diminutiveness +diminutivize +dimiss +dimission +dimissorial +dimissory +dimit +Dimittis +dimity +dimly +dimmed +dimmedness +dimmer +dimmest +dimmet +dimmish +Dimna +dimness +dimolecular +dimoric +dimorph +dimorphic +dimorphism +Dimorphotheca +dimorphous +dimple +dimplement +dimply +dimps +dimpsy +Dimyaria +dimyarian +dimyaric +din +Dinah +dinamode +Dinantian +dinaphthyl +dinar +Dinaric +Dinarzade +dinder +dindle +Dindymene +Dindymus +dine +diner +dinergate +dineric +dinero +dinette +dineuric +ding +dingar +dingbat +dingdong +dinge +dingee +dinghee +dinghy +dingily +dinginess +dingle +dingleberry +dinglebird +dingledangle +dingly +dingmaul +dingo +dingus +Dingwall +dingy +dinheiro +dinic +dinical +Dinichthys +dining +dinitrate +dinitril +dinitrile +dinitro +dinitrobenzene +dinitrocellulose +dinitrophenol +dinitrotoluene +dink +Dinka +dinkey +dinkum +dinky +dinmont +dinner +dinnerless +dinnerly +dinnertime +dinnerware +dinnery +Dinobryon +Dinoceras +Dinocerata +dinoceratan +dinoceratid +Dinoceratidae +Dinoflagellata +Dinoflagellatae +dinoflagellate +Dinoflagellida +dinomic +Dinomys +Dinophilea +Dinophilus +Dinophyceae +Dinornis +Dinornithes +dinornithic +dinornithid +Dinornithidae +Dinornithiformes +dinornithine +dinornithoid +dinosaur +Dinosauria +dinosaurian +dinothere +Dinotheres +dinotherian +Dinotheriidae +Dinotherium +dinsome +dint +dintless +dinus +diobely +diobol +diocesan +diocese +Diocletian +dioctahedral +Dioctophyme +diode +Diodia +Diodon +diodont +Diodontidae +Dioecia +dioecian +dioeciodimorphous +dioeciopolygamous +dioecious +dioeciously +dioeciousness +dioecism +dioecy +dioestrous +dioestrum +dioestrus +Diogenean +Diogenic +diogenite +dioicous +diol +diolefin +diolefinic +Diomedea +Diomedeidae +Dionaea +Dionaeaceae +Dione +dionise +dionym +dionymal +Dionysia +Dionysiac +Dionysiacal +Dionysiacally +Dioon +Diophantine +Diopsidae +diopside +Diopsis +dioptase +diopter +Dioptidae +dioptograph +dioptometer +dioptometry +dioptoscopy +dioptra +dioptral +dioptrate +dioptric +dioptrical +dioptrically +dioptrics +dioptrometer +dioptrometry +dioptroscopy +dioptry +diorama +dioramic +diordinal +diorite +dioritic +diorthosis +diorthotic +Dioscorea +Dioscoreaceae +dioscoreaceous +dioscorein +dioscorine +Dioscuri +Dioscurian +diose +Diosma +diosmin +diosmose +diosmosis +diosmotic +diosphenol +Diospyraceae +diospyraceous +Diospyros +diota +diotic +Diotocardia +diovular +dioxane +dioxide +dioxime +dioxindole +dioxy +dip +Dipala +diparentum +dipartite +dipartition +dipaschal +dipentene +dipeptid +dipeptide +dipetalous +dipetto +diphase +diphaser +diphasic +diphead +diphenol +diphenyl +diphenylamine +diphenylchloroarsine +diphenylene +diphenylenimide +diphenylguanidine +diphenylmethane +diphenylquinomethane +diphenylthiourea +diphosgene +diphosphate +diphosphide +diphosphoric +diphosphothiamine +diphrelatic +diphtheria +diphtherial +diphtherian +diphtheric +diphtheritic +diphtheritically +diphtheritis +diphtheroid +diphtheroidal +diphtherotoxin +diphthong +diphthongal +diphthongalize +diphthongally +diphthongation +diphthongic +diphthongization +diphthongize +diphycercal +diphycercy +Diphyes +diphygenic +diphyletic +Diphylla +Diphylleia +Diphyllobothrium +diphyllous +diphyodont +diphyozooid +Diphysite +Diphysitism +diphyzooid +dipicrate +dipicrylamin +dipicrylamine +Diplacanthidae +Diplacanthus +diplacusis +Dipladenia +diplanar +diplanetic +diplanetism +diplantidian +diplarthrism +diplarthrous +diplasiasmus +diplasic +diplasion +diplegia +dipleidoscope +dipleura +dipleural +dipleurogenesis +dipleurogenetic +diplex +diplobacillus +diplobacterium +diploblastic +diplocardia +diplocardiac +Diplocarpon +diplocaulescent +diplocephalous +diplocephalus +diplocephaly +diplochlamydeous +diplococcal +diplococcemia +diplococcic +diplococcoid +diplococcus +diploconical +diplocoria +Diplodia +Diplodocus +Diplodus +diploe +diploetic +diplogangliate +diplogenesis +diplogenetic +diplogenic +Diploglossata +diploglossate +diplograph +diplographic +diplographical +diplography +diplohedral +diplohedron +diploic +diploid +diploidic +diploidion +diploidy +diplois +diplokaryon +diploma +diplomacy +diplomat +diplomate +diplomatic +diplomatical +diplomatically +diplomatics +diplomatism +diplomatist +diplomatize +diplomatology +diplomyelia +diplonema +diplonephridia +diploneural +diplont +diploperistomic +diplophase +diplophyte +diplopia +diplopic +diploplacula +diploplacular +diploplaculate +diplopod +Diplopoda +diplopodic +Diploptera +diplopterous +Diplopteryga +diplopy +diplosis +diplosome +diplosphenal +diplosphene +Diplospondyli +diplospondylic +diplospondylism +diplostemonous +diplostemony +diplostichous +Diplotaxis +diplotegia +diplotene +Diplozoon +diplumbic +Dipneumona +Dipneumones +dipneumonous +dipneustal +Dipneusti +dipnoan +Dipnoi +dipnoid +dipnoous +dipode +dipodic +Dipodidae +Dipodomyinae +Dipodomys +dipody +dipolar +dipolarization +dipolarize +dipole +diporpa +dipotassic +dipotassium +dipped +dipper +dipperful +dipping +diprimary +diprismatic +dipropargyl +dipropyl +Diprotodon +diprotodont +Diprotodontia +Dipsacaceae +dipsacaceous +Dipsaceae +dipsaceous +Dipsacus +Dipsadinae +dipsas +dipsetic +dipsey +dipsomania +dipsomaniac +dipsomaniacal +Dipsosaurus +dipsosis +dipter +Diptera +Dipteraceae +dipteraceous +dipterad +dipteral +dipteran +dipterist +dipterocarp +Dipterocarpaceae +dipterocarpaceous +dipterocarpous +Dipterocarpus +dipterocecidium +dipterological +dipterologist +dipterology +dipteron +dipteros +dipterous +Dipteryx +diptote +diptych +Dipus +dipware +dipygus +dipylon +dipyre +dipyrenous +dipyridyl +Dirca +Dircaean +dird +dirdum +dire +direct +directable +directed +directer +direction +directional +directionally +directionless +directitude +directive +directively +directiveness +directivity +directly +directness +Directoire +director +directoral +directorate +directorial +directorially +directorship +directory +directress +directrices +directrix +direful +direfully +direfulness +direly +dirempt +diremption +direness +direption +dirge +dirgeful +dirgelike +dirgeman +dirgler +dirhem +Dirian +Dirichletian +dirigent +dirigibility +dirigible +dirigomotor +diriment +dirk +dirl +dirndl +dirt +dirtbird +dirtboard +dirten +dirtily +dirtiness +dirtplate +dirty +dis +Disa +disability +disable +disabled +disablement +disabusal +disabuse +disacceptance +disaccharide +disaccharose +disaccommodate +disaccommodation +disaccord +disaccordance +disaccordant +disaccustom +disaccustomed +disaccustomedness +disacidify +disacknowledge +disacknowledgement +disacquaint +disacquaintance +disadjust +disadorn +disadvance +disadvantage +disadvantageous +disadvantageously +disadvantageousness +disadventure +disadventurous +disadvise +disaffect +disaffectation +disaffected +disaffectedly +disaffectedness +disaffection +disaffectionate +disaffiliate +disaffiliation +disaffirm +disaffirmance +disaffirmation +disaffirmative +disafforest +disafforestation +disafforestment +disagglomeration +disaggregate +disaggregation +disaggregative +disagio +disagree +disagreeability +disagreeable +disagreeableness +disagreeably +disagreed +disagreement +disagreer +disalicylide +disalign +disalignment +disalike +disallow +disallowable +disallowableness +disallowance +disally +disamenity +Disamis +disanagrammatize +disanalogous +disangularize +disanimal +disanimate +disanimation +disannex +disannexation +disannul +disannuller +disannulment +disanoint +disanswerable +disapostle +disapparel +disappear +disappearance +disappearer +disappearing +disappoint +disappointed +disappointedly +disappointer +disappointing +disappointingly +disappointingness +disappointment +disappreciate +disappreciation +disapprobation +disapprobative +disapprobatory +disappropriate +disappropriation +disapprovable +disapproval +disapprove +disapprover +disapprovingly +disaproned +disarchbishop +disarm +disarmament +disarmature +disarmed +disarmer +disarming +disarmingly +disarrange +disarrangement +disarray +disarticulate +disarticulation +disarticulator +disasinate +disasinize +disassemble +disassembly +disassimilate +disassimilation +disassimilative +disassociate +disassociation +disaster +disastimeter +disastrous +disastrously +disastrousness +disattaint +disattire +disattune +disauthenticate +disauthorize +disavow +disavowable +disavowal +disavowedly +disavower +disavowment +disawa +disazo +disbalance +disbalancement +disband +disbandment +disbar +disbark +disbarment +disbelief +disbelieve +disbeliever +disbelieving +disbelievingly +disbench +disbenchment +disbloom +disbody +disbosom +disbowel +disbrain +disbranch +disbud +disbudder +disburden +disburdenment +disbursable +disburse +disbursement +disburser +disburthen +disbury +disbutton +disc +discage +discal +discalceate +discalced +discanonization +discanonize +discanter +discantus +discapacitate +discard +discardable +discarder +discardment +discarnate +discarnation +discase +discastle +discept +disceptation +disceptator +discern +discerner +discernible +discernibleness +discernibly +discerning +discerningly +discernment +discerp +discerpibility +discerpible +discerpibleness +discerptibility +discerptible +discerptibleness +discerption +discharacter +discharge +dischargeable +dischargee +discharger +discharging +discharity +discharm +dischase +Disciflorae +discifloral +disciform +discigerous +Discina +discinct +discinoid +disciple +disciplelike +discipleship +disciplinability +disciplinable +disciplinableness +disciplinal +disciplinant +disciplinarian +disciplinarianism +disciplinarily +disciplinary +disciplinative +disciplinatory +discipline +discipliner +discipular +discircumspection +discission +discitis +disclaim +disclaimant +disclaimer +disclamation +disclamatory +disclass +disclassify +disclike +disclimax +discloister +disclose +disclosed +discloser +disclosive +disclosure +discloud +discoach +discoactine +discoblastic +discoblastula +discobolus +discocarp +discocarpium +discocarpous +discocephalous +discodactyl +discodactylous +discogastrula +discoglossid +Discoglossidae +discoglossoid +discographical +discography +discohexaster +discoid +discoidal +Discoidea +Discoideae +discolichen +discolith +discolor +discolorate +discoloration +discolored +discoloredness +discolorization +discolorment +discolourization +Discomedusae +discomedusan +discomedusoid +discomfit +discomfiter +discomfiture +discomfort +discomfortable +discomfortableness +discomforting +discomfortingly +discommend +discommendable +discommendableness +discommendably +discommendation +discommender +discommode +discommodious +discommodiously +discommodiousness +discommodity +discommon +discommons +discommunity +discomorula +discompliance +discompose +discomposed +discomposedly +discomposedness +discomposing +discomposingly +discomposure +discomycete +Discomycetes +discomycetous +Disconanthae +disconanthous +disconcert +disconcerted +disconcertedly +disconcertedness +disconcerting +disconcertingly +disconcertingness +disconcertion +disconcertment +disconcord +disconduce +disconducive +Disconectae +disconform +disconformable +disconformity +discongruity +disconjure +disconnect +disconnected +disconnectedly +disconnectedness +disconnecter +disconnection +disconnective +disconnectiveness +disconnector +disconsider +disconsideration +disconsolate +disconsolately +disconsolateness +disconsolation +disconsonancy +disconsonant +discontent +discontented +discontentedly +discontentedness +discontentful +discontenting +discontentive +discontentment +discontiguity +discontiguous +discontiguousness +discontinuable +discontinuance +discontinuation +discontinue +discontinuee +discontinuer +discontinuity +discontinuor +discontinuous +discontinuously +discontinuousness +disconula +disconvenience +disconvenient +disconventicle +discophile +Discophora +discophoran +discophore +discophorous +discoplacenta +discoplacental +Discoplacentalia +discoplacentalian +discoplasm +discopodous +discord +discordance +discordancy +discordant +discordantly +discordantness +discordful +Discordia +discording +discorporate +discorrespondency +discorrespondent +discount +discountable +discountenance +discountenancer +discounter +discouple +discourage +discourageable +discouragement +discourager +discouraging +discouragingly +discouragingness +discourse +discourseless +discourser +discoursive +discoursively +discoursiveness +discourteous +discourteously +discourteousness +discourtesy +discous +discovenant +discover +discoverability +discoverable +discoverably +discovered +discoverer +discovert +discoverture +discovery +discreate +discreation +discredence +discredit +discreditability +discreditable +discreet +discreetly +discreetness +discrepance +discrepancy +discrepant +discrepantly +discrepate +discrepation +discrested +discrete +discretely +discreteness +discretion +discretional +discretionally +discretionarily +discretionary +discretive +discretively +discretiveness +discriminability +discriminable +discriminal +discriminant +discriminantal +discriminate +discriminately +discriminateness +discriminating +discriminatingly +discrimination +discriminational +discriminative +discriminatively +discriminator +discriminatory +discrown +disculpate +disculpation +disculpatory +discumber +discursative +discursativeness +discursify +discursion +discursive +discursively +discursiveness +discursory +discursus +discurtain +discus +discuss +discussable +discussant +discusser +discussible +discussion +discussional +discussionism +discussionist +discussive +discussment +discutable +discutient +disdain +disdainable +disdainer +disdainful +disdainfully +disdainfulness +disdainly +disdeceive +disdenominationalize +disdiaclast +disdiaclastic +disdiapason +disdiazo +disdiplomatize +disdodecahedroid +disdub +disease +diseased +diseasedly +diseasedness +diseaseful +diseasefulness +disecondary +disedge +disedification +disedify +diseducate +diselder +diselectrification +diselectrify +diselenide +disematism +disembargo +disembark +disembarkation +disembarkment +disembarrass +disembarrassment +disembattle +disembed +disembellish +disembitter +disembocation +disembodiment +disembody +disembogue +disemboguement +disembosom +disembowel +disembowelment +disembower +disembroil +disemburden +diseme +disemic +disemplane +disemploy +disemployment +disempower +disenable +disenablement +disenact +disenactment +disenamor +disenamour +disenchain +disenchant +disenchanter +disenchantingly +disenchantment +disenchantress +disencharm +disenclose +disencumber +disencumberment +disencumbrance +disendow +disendower +disendowment +disenfranchise +disenfranchisement +disengage +disengaged +disengagedness +disengagement +disengirdle +disenjoy +disenjoyment +disenmesh +disennoble +disennui +disenshroud +disenslave +disensoul +disensure +disentail +disentailment +disentangle +disentanglement +disentangler +disenthral +disenthrall +disenthrallment +disenthralment +disenthrone +disenthronement +disentitle +disentomb +disentombment +disentrain +disentrainment +disentrammel +disentrance +disentrancement +disentwine +disenvelop +disepalous +disequalize +disequalizer +disequilibrate +disequilibration +disequilibrium +disestablish +disestablisher +disestablishment +disestablishmentarian +disesteem +disesteemer +disestimation +disexcommunicate +disfaith +disfame +disfashion +disfavor +disfavorer +disfeature +disfeaturement +disfellowship +disfen +disfiguration +disfigurative +disfigure +disfigurement +disfigurer +disfiguringly +disflesh +disfoliage +disforest +disforestation +disfranchise +disfranchisement +disfranchiser +disfrequent +disfriar +disfrock +disfurnish +disfurnishment +disgarland +disgarnish +disgarrison +disgavel +disgeneric +disgenius +disgig +disglorify +disglut +disgood +disgorge +disgorgement +disgorger +disgospel +disgown +disgrace +disgraceful +disgracefully +disgracefulness +disgracement +disgracer +disgracious +disgradation +disgrade +disgregate +disgregation +disgruntle +disgruntlement +disguisable +disguisal +disguise +disguised +disguisedly +disguisedness +disguiseless +disguisement +disguiser +disguising +disgulf +disgust +disgusted +disgustedly +disgustedness +disguster +disgustful +disgustfully +disgustfulness +disgusting +disgustingly +disgustingness +dish +dishabilitate +dishabilitation +dishabille +dishabituate +dishallow +dishallucination +disharmonic +disharmonical +disharmonious +disharmonism +disharmonize +disharmony +dishboard +dishcloth +dishclout +disheart +dishearten +disheartener +disheartening +dishearteningly +disheartenment +disheaven +dished +dishellenize +dishelm +disher +disherent +disherison +disherit +disheritment +dishevel +disheveled +dishevelment +dishexecontahedroid +dishful +Dishley +dishlike +dishling +dishmaker +dishmaking +dishmonger +dishome +dishonest +dishonestly +dishonor +dishonorable +dishonorableness +dishonorably +dishonorary +dishonorer +dishorn +dishorner +dishorse +dishouse +dishpan +dishpanful +dishrag +dishumanize +dishwasher +dishwashing +dishwashings +dishwater +dishwatery +dishwiper +dishwiping +disidentify +disilane +disilicane +disilicate +disilicic +disilicid +disilicide +disillude +disilluminate +disillusion +disillusionist +disillusionize +disillusionizer +disillusionment +disillusive +disimagine +disimbitter +disimitate +disimitation +disimmure +disimpark +disimpassioned +disimprison +disimprisonment +disimprove +disimprovement +disincarcerate +disincarceration +disincarnate +disincarnation +disinclination +disincline +disincorporate +disincorporation +disincrust +disincrustant +disincrustion +disindividualize +disinfect +disinfectant +disinfecter +disinfection +disinfective +disinfector +disinfest +disinfestation +disinfeudation +disinflame +disinflate +disinflation +disingenuity +disingenuous +disingenuously +disingenuousness +disinherison +disinherit +disinheritable +disinheritance +disinhume +disinsulation +disinsure +disintegrable +disintegrant +disintegrate +disintegration +disintegrationist +disintegrative +disintegrator +disintegratory +disintegrity +disintegrous +disintensify +disinter +disinterest +disinterested +disinterestedly +disinterestedness +disinteresting +disinterment +disintertwine +disintrench +disintricate +disinvagination +disinvest +disinvestiture +disinvigorate +disinvite +disinvolve +disjasked +disject +disjection +disjoin +disjoinable +disjoint +disjointed +disjointedly +disjointedness +disjointly +disjointure +disjunct +disjunction +disjunctive +disjunctively +disjunctor +disjuncture +disjune +disk +diskelion +diskless +disklike +dislaurel +disleaf +dislegitimate +dislevelment +dislicense +dislikable +dislike +dislikelihood +disliker +disliking +dislimn +dislink +dislip +disload +dislocability +dislocable +dislocate +dislocated +dislocatedly +dislocatedness +dislocation +dislocator +dislocatory +dislodge +dislodgeable +dislodgement +dislove +disloyal +disloyalist +disloyally +disloyalty +disluster +dismain +dismal +dismality +dismalize +dismally +dismalness +disman +dismantle +dismantlement +dismantler +dismarble +dismark +dismarket +dismask +dismast +dismastment +dismay +dismayable +dismayed +dismayedness +dismayful +dismayfully +dismayingly +disme +dismember +dismembered +dismemberer +dismemberment +dismembrate +dismembrator +disminion +disminister +dismiss +dismissable +dismissal +dismissible +dismissingly +dismission +dismissive +dismissory +dismoded +dismount +dismountable +dismutation +disna +disnaturalization +disnaturalize +disnature +disnest +disnew +disniche +disnosed +disnumber +disobedience +disobedient +disobediently +disobey +disobeyal +disobeyer +disobligation +disoblige +disobliger +disobliging +disobligingly +disobligingness +disoccupation +disoccupy +disodic +disodium +disomatic +disomatous +disomic +disomus +disoperculate +disorb +disorchard +disordained +disorder +disordered +disorderedly +disorderedness +disorderer +disorderliness +disorderly +disordinated +disordination +disorganic +disorganization +disorganize +disorganizer +disorient +disorientate +disorientation +disown +disownable +disownment +disoxygenate +disoxygenation +disozonize +dispapalize +disparage +disparageable +disparagement +disparager +disparaging +disparagingly +disparate +disparately +disparateness +disparation +disparity +dispark +dispart +dispartment +dispassionate +dispassionately +dispassionateness +dispassioned +dispatch +dispatcher +dispatchful +dispatriated +dispauper +dispauperize +dispeace +dispeaceful +dispel +dispeller +dispend +dispender +dispendious +dispendiously +dispenditure +dispensability +dispensable +dispensableness +dispensary +dispensate +dispensation +dispensational +dispensative +dispensatively +dispensator +dispensatorily +dispensatory +dispensatress +dispensatrix +dispense +dispenser +dispensingly +dispeople +dispeoplement +dispeopler +dispergate +dispergation +dispergator +dispericraniate +disperiwig +dispermic +dispermous +dispermy +dispersal +dispersant +disperse +dispersed +dispersedly +dispersedness +dispersement +disperser +dispersibility +dispersible +dispersion +dispersity +dispersive +dispersively +dispersiveness +dispersoid +dispersoidological +dispersoidology +dispersonalize +dispersonate +dispersonification +dispersonify +dispetal +disphenoid +dispiece +dispireme +dispirit +dispirited +dispiritedly +dispiritedness +dispiritingly +dispiritment +dispiteous +dispiteously +dispiteousness +displace +displaceability +displaceable +displacement +displacency +displacer +displant +display +displayable +displayed +displayer +displease +displeased +displeasedly +displeaser +displeasing +displeasingly +displeasingness +displeasurable +displeasurably +displeasure +displeasurement +displenish +displicency +displume +displuviate +dispondaic +dispondee +dispone +disponee +disponent +disponer +dispope +dispopularize +disporous +disport +disportive +disportment +Disporum +disposability +disposable +disposableness +disposal +dispose +disposed +disposedly +disposedness +disposer +disposingly +disposition +dispositional +dispositioned +dispositive +dispositively +dispossess +dispossession +dispossessor +dispossessory +dispost +disposure +dispowder +dispractice +dispraise +dispraiser +dispraisingly +dispread +dispreader +disprejudice +disprepare +disprince +disprison +disprivacied +disprivilege +disprize +disprobabilization +disprobabilize +disprobative +dispromise +disproof +disproportion +disproportionable +disproportionableness +disproportionably +disproportional +disproportionality +disproportionally +disproportionalness +disproportionate +disproportionately +disproportionateness +disproportionation +disprovable +disproval +disprove +disprovement +disproven +disprover +dispulp +dispunct +dispunishable +dispunitive +disputability +disputable +disputableness +disputably +disputant +disputation +disputatious +disputatiously +disputatiousness +disputative +disputatively +disputativeness +disputator +dispute +disputeless +disputer +disqualification +disqualify +disquantity +disquiet +disquieted +disquietedly +disquietedness +disquieten +disquieter +disquieting +disquietingly +disquietly +disquietness +disquietude +disquiparancy +disquiparant +disquiparation +disquisite +disquisition +disquisitional +disquisitionary +disquisitive +disquisitively +disquisitor +disquisitorial +disquisitory +disquixote +disrank +disrate +disrealize +disrecommendation +disregard +disregardable +disregardance +disregardant +disregarder +disregardful +disregardfully +disregardfulness +disrelated +disrelation +disrelish +disrelishable +disremember +disrepair +disreputability +disreputable +disreputableness +disreputably +disreputation +disrepute +disrespect +disrespecter +disrespectful +disrespectfully +disrespectfulness +disrestore +disring +disrobe +disrobement +disrober +disroof +disroost +disroot +disrudder +disrump +disrupt +disruptability +disruptable +disrupter +disruption +disruptionist +disruptive +disruptively +disruptiveness +disruptment +disruptor +disrupture +diss +dissatisfaction +dissatisfactoriness +dissatisfactory +dissatisfied +dissatisfiedly +dissatisfiedness +dissatisfy +dissaturate +disscepter +disseat +dissect +dissected +dissectible +dissecting +dissection +dissectional +dissective +dissector +disseize +disseizee +disseizin +disseizor +disseizoress +disselboom +dissemblance +dissemble +dissembler +dissemblingly +dissembly +dissemilative +disseminate +dissemination +disseminative +disseminator +disseminule +dissension +dissensualize +dissent +dissentaneous +dissentaneousness +dissenter +dissenterism +dissentience +dissentiency +dissentient +dissenting +dissentingly +dissentious +dissentiously +dissentism +dissentment +dissepiment +dissepimental +dissert +dissertate +dissertation +dissertational +dissertationist +dissertative +dissertator +disserve +disservice +disserviceable +disserviceableness +disserviceably +dissettlement +dissever +disseverance +disseverment +disshadow +dissheathe +disshroud +dissidence +dissident +dissidently +dissight +dissightly +dissiliency +dissilient +dissimilar +dissimilarity +dissimilarly +dissimilars +dissimilate +dissimilation +dissimilatory +dissimile +dissimilitude +dissimulate +dissimulation +dissimulative +dissimulator +dissimule +dissimuler +dissipable +dissipate +dissipated +dissipatedly +dissipatedness +dissipater +dissipation +dissipative +dissipativity +dissipator +dissociability +dissociable +dissociableness +dissocial +dissociality +dissocialize +dissociant +dissociate +dissociation +dissociative +dissoconch +dissogeny +dissogony +dissolubility +dissoluble +dissolubleness +dissolute +dissolutely +dissoluteness +dissolution +dissolutional +dissolutionism +dissolutionist +dissolutive +dissolvable +dissolvableness +dissolve +dissolveability +dissolvent +dissolver +dissolving +dissolvingly +dissonance +dissonancy +dissonant +dissonantly +dissonous +dissoul +dissuade +dissuader +dissuasion +dissuasive +dissuasively +dissuasiveness +dissuasory +dissuit +dissuitable +dissuited +dissyllabic +dissyllabification +dissyllabify +dissyllabism +dissyllabize +dissyllable +dissymmetric +dissymmetrical +dissymmetrically +dissymmetry +dissympathize +dissympathy +distad +distaff +distain +distal +distale +distally +distalwards +distance +distanceless +distancy +distannic +distant +distantly +distantness +distaste +distasted +distasteful +distastefully +distastefulness +distater +distemonous +distemper +distemperature +distempered +distemperedly +distemperedness +distemperer +distenant +distend +distendedly +distender +distensibility +distensible +distensive +distent +distention +disthene +disthrall +disthrone +distich +Distichlis +distichous +distichously +distill +distillable +distillage +distilland +distillate +distillation +distillatory +distilled +distiller +distillery +distilling +distillmint +distinct +distinctify +distinction +distinctional +distinctionless +distinctive +distinctively +distinctiveness +distinctly +distinctness +distingue +distinguish +distinguishability +distinguishable +distinguishableness +distinguishably +distinguished +distinguishedly +distinguisher +distinguishing +distinguishingly +distinguishment +distoclusion +Distoma +Distomatidae +distomatosis +distomatous +distome +distomian +distomiasis +Distomidae +Distomum +distort +distorted +distortedly +distortedness +distorter +distortion +distortional +distortionist +distortionless +distortive +distract +distracted +distractedly +distractedness +distracter +distractibility +distractible +distractingly +distraction +distractive +distractively +distrain +distrainable +distrainee +distrainer +distrainment +distrainor +distraint +distrait +distraite +distraught +distress +distressed +distressedly +distressedness +distressful +distressfully +distressfulness +distressing +distressingly +distributable +distributary +distribute +distributed +distributedly +distributee +distributer +distribution +distributional +distributionist +distributival +distributive +distributively +distributiveness +distributor +distributress +district +distrouser +distrust +distruster +distrustful +distrustfully +distrustfulness +distrustingly +distune +disturb +disturbance +disturbative +disturbed +disturbedly +disturber +disturbing +disturbingly +disturn +disturnpike +disubstituted +disubstitution +disulfonic +disulfuric +disulphate +disulphide +disulphonate +disulphone +disulphonic +disulphoxide +disulphuret +disulphuric +disuniform +disuniformity +disunify +disunion +disunionism +disunionist +disunite +disuniter +disunity +disusage +disusance +disuse +disutility +disutilize +disvaluation +disvalue +disvertebrate +disvisage +disvoice +disvulnerability +diswarren +diswench +diswood +disworth +disyllabic +disyllable +disyoke +dit +dita +dital +ditch +ditchbank +ditchbur +ditchdigger +ditchdown +ditcher +ditchless +ditchside +ditchwater +dite +diter +diterpene +ditertiary +ditetragonal +dithalous +dithecal +ditheism +ditheist +ditheistic +ditheistical +dithematic +dither +dithery +dithiobenzoic +dithioglycol +dithioic +dithion +dithionate +dithionic +dithionite +dithionous +dithymol +dithyramb +dithyrambic +dithyrambically +Dithyrambos +Dithyrambus +ditokous +ditolyl +ditone +ditrematous +ditremid +Ditremidae +ditrichotomous +ditriglyph +ditriglyphic +ditrigonal +ditrigonally +Ditrocha +ditrochean +ditrochee +ditrochous +ditroite +dittamy +dittander +dittany +dittay +dittied +ditto +dittogram +dittograph +dittographic +dittography +dittology +ditty +diumvirate +diuranate +diureide +diuresis +diuretic +diuretically +diureticalness +Diurna +diurnal +diurnally +diurnalness +diurnation +diurne +diurnule +diuturnal +diuturnity +div +diva +divagate +divagation +divalence +divalent +divan +divariant +divaricate +divaricately +divaricating +divaricatingly +divarication +divaricator +divata +dive +divekeeper +divel +divellent +divellicate +diver +diverge +divergement +divergence +divergency +divergent +divergently +diverging +divergingly +divers +diverse +diversely +diverseness +diversicolored +diversifiability +diversifiable +diversification +diversified +diversifier +diversiflorate +diversiflorous +diversifoliate +diversifolious +diversiform +diversify +diversion +diversional +diversionary +diversipedate +diversisporous +diversity +diversly +diversory +divert +divertedly +diverter +divertibility +divertible +diverticle +diverticular +diverticulate +diverticulitis +diverticulosis +diverticulum +diverting +divertingly +divertingness +divertisement +divertive +divertor +divest +divestible +divestitive +divestiture +divestment +divesture +dividable +dividableness +divide +divided +dividedly +dividedness +dividend +divider +dividing +dividingly +dividual +dividualism +dividually +dividuity +dividuous +divinable +divinail +divination +divinator +divinatory +divine +divinely +divineness +diviner +divineress +diving +divinify +divining +diviningly +divinity +divinityship +divinization +divinize +divinyl +divisibility +divisible +divisibleness +divisibly +division +divisional +divisionally +divisionary +divisionism +divisionist +divisionistic +divisive +divisively +divisiveness +divisor +divisorial +divisory +divisural +divorce +divorceable +divorcee +divorcement +divorcer +divorcible +divorcive +divot +divoto +divulgate +divulgater +divulgation +divulgatory +divulge +divulgement +divulgence +divulger +divulse +divulsion +divulsive +divulsor +divus +Divvers +divvy +diwata +dixenite +Dixie +dixie +Dixiecrat +dixit +dixy +dizain +dizen +dizenment +dizoic +dizygotic +dizzard +dizzily +dizziness +dizzy +Djagatay +djasakid +djave +djehad +djerib +djersa +Djuka +do +doab +doable +doarium +doat +doated +doater +doating +doatish +Dob +dob +dobbed +dobber +dobbin +dobbing +dobby +dobe +dobla +doblon +dobra +dobrao +dobson +doby +doc +docent +docentship +Docetae +Docetic +Docetically +Docetism +Docetist +Docetistic +Docetize +dochmiac +dochmiacal +dochmiasis +dochmius +docibility +docible +docibleness +docile +docilely +docility +docimasia +docimastic +docimastical +docimasy +docimology +docity +dock +dockage +docken +docker +docket +dockhead +dockhouse +dockization +dockize +dockland +dockmackie +dockman +dockmaster +dockside +dockyard +dockyardman +docmac +Docoglossa +docoglossan +docoglossate +docosane +doctor +doctoral +doctorally +doctorate +doctorbird +doctordom +doctoress +doctorfish +doctorhood +doctorial +doctorially +doctorization +doctorize +doctorless +doctorlike +doctorly +doctorship +doctress +doctrinaire +doctrinairism +doctrinal +doctrinalism +doctrinalist +doctrinality +doctrinally +doctrinarian +doctrinarianism +doctrinarily +doctrinarity +doctrinary +doctrinate +doctrine +doctrinism +doctrinist +doctrinization +doctrinize +doctrix +document +documental +documentalist +documentarily +documentary +documentation +documentize +dod +dodd +doddart +dodded +dodder +doddered +dodderer +doddering +doddery +doddie +dodding +doddle +doddy +doddypoll +Dode +dodecade +dodecadrachm +dodecafid +dodecagon +dodecagonal +dodecahedral +dodecahedric +dodecahedron +dodecahydrate +dodecahydrated +dodecamerous +dodecane +Dodecanesian +dodecanoic +dodecant +dodecapartite +dodecapetalous +dodecarch +dodecarchy +dodecasemic +dodecastyle +dodecastylos +dodecasyllabic +dodecasyllable +dodecatemory +Dodecatheon +dodecatoic +dodecatyl +dodecatylic +dodecuplet +dodecyl +dodecylene +dodecylic +dodge +dodgeful +dodger +dodgery +dodgily +dodginess +dodgy +dodkin +dodlet +dodman +dodo +dodoism +Dodona +Dodonaea +Dodonaeaceae +Dodonaean +Dodonean +Dodonian +dodrans +doe +doebird +Doedicurus +Doeg +doeglic +doegling +doer +does +doeskin +doesnt +doest +doff +doffer +doftberry +dog +dogal +dogate +dogbane +Dogberry +dogberry +Dogberrydom +Dogberryism +dogbite +dogblow +dogboat +dogbolt +dogbush +dogcart +dogcatcher +dogdom +doge +dogedom +dogeless +dogeship +dogface +dogfall +dogfight +dogfish +dogfoot +dogged +doggedly +doggedness +dogger +doggerel +doggereler +doggerelism +doggerelist +doggerelize +doggerelizer +doggery +doggess +doggish +doggishly +doggishness +doggo +doggone +doggoned +doggrel +doggrelize +doggy +doghead +doghearted +doghole +doghood +doghouse +dogie +dogless +doglike +dogly +dogma +dogman +dogmata +dogmatic +dogmatical +dogmatically +dogmaticalness +dogmatician +dogmatics +dogmatism +dogmatist +dogmatization +dogmatize +dogmatizer +dogmouth +dogplate +dogproof +Dogra +Dogrib +dogs +dogship +dogshore +dogskin +dogsleep +dogstone +dogtail +dogtie +dogtooth +dogtoothing +dogtrick +dogtrot +dogvane +dogwatch +dogwood +dogy +doigt +doiled +doily +doina +doing +doings +doit +doited +doitkin +doitrified +doke +Doketic +Doketism +dokhma +dokimastic +Dokmarok +Doko +Dol +dola +dolabra +dolabrate +dolabriform +dolcan +dolcian +dolciano +dolcino +doldrum +doldrums +dole +dolefish +doleful +dolefully +dolefulness +dolefuls +dolent +dolently +dolerite +doleritic +dolerophanite +dolesman +dolesome +dolesomely +dolesomeness +doless +doli +dolia +dolichoblond +dolichocephal +dolichocephali +dolichocephalic +dolichocephalism +dolichocephalize +dolichocephalous +dolichocephaly +dolichocercic +dolichocnemic +dolichocranial +dolichofacial +Dolichoglossus +dolichohieric +Dolicholus +dolichopellic +dolichopodous +dolichoprosopic +Dolichopsyllidae +Dolichos +dolichos +dolichosaur +Dolichosauri +Dolichosauria +Dolichosaurus +Dolichosoma +dolichostylous +dolichotmema +dolichuric +dolichurus +Doliidae +dolina +doline +dolioform +Doliolidae +Doliolum +dolium +doll +dollar +dollarbird +dollardee +dollardom +dollarfish +dollarleaf +dollbeer +dolldom +dollface +dollfish +dollhood +dollhouse +dollier +dolliness +dollish +dollishly +dollishness +dollmaker +dollmaking +dollop +dollship +dolly +dollyman +dollyway +dolman +dolmen +dolmenic +Dolomedes +dolomite +dolomitic +dolomitization +dolomitize +dolomization +dolomize +dolor +Dolores +doloriferous +dolorific +dolorifuge +dolorous +dolorously +dolorousness +dolose +dolous +Dolph +dolphin +dolphinlike +Dolphus +dolt +dolthead +doltish +doltishly +doltishness +dom +domain +domainal +domal +domanial +domatium +domatophobia +domba +Dombeya +Domdaniel +dome +domelike +doment +domer +domesday +domestic +domesticable +domesticality +domestically +domesticate +domestication +domesticative +domesticator +domesticity +domesticize +domett +domeykite +domic +domical +domically +Domicella +domicile +domicilement +domiciliar +domiciliary +domiciliate +domiciliation +dominance +dominancy +dominant +dominantly +dominate +dominated +dominatingly +domination +dominative +dominator +domine +domineer +domineerer +domineering +domineeringly +domineeringness +dominial +Dominic +dominical +dominicale +Dominican +dominie +dominion +dominionism +dominionist +Dominique +dominium +domino +dominus +domitable +domite +Domitian +domitic +domn +domnei +domoid +dompt +domy +Don +don +donable +Donacidae +donaciform +Donald +Donar +donary +donatary +donate +donated +donatee +Donatiaceae +donation +Donatism +Donatist +Donatistic +Donatistical +donative +donatively +donator +donatory +donatress +donax +doncella +Dondia +done +donee +Donet +doney +dong +donga +Dongola +Dongolese +dongon +Donia +donjon +donkey +donkeyback +donkeyish +donkeyism +donkeyman +donkeywork +Donmeh +donna +donnered +donnert +donnish +donnishness +donnism +donnot +donor +donorship +donought +donship +donsie +dont +donum +doob +doocot +doodab +doodad +Doodia +doodle +doodlebug +doodler +doodlesack +doohickey +doohickus +doohinkey +doohinkus +dooja +dook +dooket +dookit +dool +doolee +dooley +dooli +doolie +dooly +doom +doomage +doombook +doomer +doomful +dooms +doomsday +doomsman +doomstead +doon +door +doorba +doorbell +doorboy +doorbrand +doorcase +doorcheek +doored +doorframe +doorhead +doorjamb +doorkeeper +doorknob +doorless +doorlike +doormaid +doormaker +doormaking +doorman +doornail +doorplate +doorpost +doorsill +doorstead +doorstep +doorstone +doorstop +doorward +doorway +doorweed +doorwise +dooryard +dop +dopa +dopamelanin +dopaoxidase +dopatta +dope +dopebook +doper +dopester +dopey +doppelkummel +Dopper +dopper +doppia +Doppler +dopplerite +Dor +dor +Dora +dorab +dorad +Doradidae +dorado +doraphobia +Dorask +Doraskean +dorbeetle +Dorcas +dorcastry +Dorcatherium +Dorcopsis +doree +dorestane +dorhawk +doria +Dorian +Doric +Dorical +Doricism +Doricize +Dorididae +Dorine +Doris +Dorism +Dorize +dorje +Dorking +dorlach +dorlot +dorm +dormancy +dormant +dormer +dormered +dormie +dormient +dormilona +dormition +dormitive +dormitory +dormouse +dormy +dorn +dorneck +dornic +dornick +dornock +Dorobo +Doronicum +Dorosoma +Dorothea +Dorothy +dorp +dorsabdominal +dorsabdominally +dorsad +dorsal +dorsale +dorsalgia +dorsalis +dorsally +dorsalmost +dorsalward +dorsalwards +dorsel +dorser +dorsibranch +Dorsibranchiata +dorsibranchiate +dorsicollar +dorsicolumn +dorsicommissure +dorsicornu +dorsiduct +dorsiferous +dorsifixed +dorsiflex +dorsiflexion +dorsiflexor +dorsigrade +dorsilateral +dorsilumbar +dorsimedian +dorsimesal +dorsimeson +dorsiparous +dorsispinal +dorsiventral +dorsiventrality +dorsiventrally +dorsoabdominal +dorsoanterior +dorsoapical +Dorsobranchiata +dorsocaudad +dorsocaudal +dorsocentral +dorsocephalad +dorsocephalic +dorsocervical +dorsocervically +dorsodynia +dorsoepitrochlear +dorsointercostal +dorsointestinal +dorsolateral +dorsolumbar +dorsomedial +dorsomedian +dorsomesal +dorsonasal +dorsonuchal +dorsopleural +dorsoposteriad +dorsoposterior +dorsoradial +dorsosacral +dorsoscapular +dorsosternal +dorsothoracic +dorsoventrad +dorsoventral +dorsoventrally +Dorstenia +dorsulum +dorsum +dorsumbonal +dorter +dortiness +dortiship +dorts +dorty +doruck +dory +Doryanthes +Dorylinae +doryphorus +dos +dosa +dosadh +dosage +dose +doser +dosimeter +dosimetric +dosimetrician +dosimetrist +dosimetry +Dosinia +dosiology +dosis +Dositheans +dosology +doss +dossal +dossel +dosser +dosseret +dossier +dossil +dossman +Dot +dot +dotage +dotal +dotard +dotardism +dotardly +dotardy +dotate +dotation +dotchin +dote +doted +doter +Dothideacea +dothideaceous +Dothideales +Dothidella +dothienenteritis +Dothiorella +dotiness +doting +dotingly +dotingness +dotish +dotishness +dotkin +dotless +dotlike +Doto +Dotonidae +dotriacontane +dotted +dotter +dotterel +dottily +dottiness +dotting +dottle +dottler +Dottore +Dotty +dotty +doty +douar +double +doubled +doubledamn +doubleganger +doublegear +doublehanded +doublehandedly +doublehandedness +doublehatching +doublehearted +doubleheartedness +doublehorned +doubleleaf +doublelunged +doubleness +doubler +doublet +doubleted +doubleton +doubletone +doubletree +doublets +doubling +doubloon +doubly +doubt +doubtable +doubtably +doubtedly +doubter +doubtful +doubtfully +doubtfulness +doubting +doubtingly +doubtingness +doubtless +doubtlessly +doubtlessness +doubtmonger +doubtous +doubtsome +douc +douce +doucely +douceness +doucet +douche +doucin +doucine +doudle +dough +doughbird +doughboy +doughface +doughfaceism +doughfoot +doughhead +doughiness +doughlike +doughmaker +doughmaking +doughman +doughnut +dought +doughtily +doughtiness +doughty +doughy +doulocracy +doum +doundake +doup +douping +dour +dourine +dourly +dourness +douse +douser +dout +douter +doutous +douzepers +douzieme +dove +dovecot +doveflower +dovefoot +dovehouse +dovekey +dovekie +dovelet +dovelike +doveling +dover +dovetail +dovetailed +dovetailer +dovetailwise +doveweed +dovewood +dovish +Dovyalis +dow +dowable +dowager +dowagerism +dowcet +dowd +dowdily +dowdiness +dowdy +dowdyish +dowdyism +dowed +dowel +dower +doweral +doweress +dowerless +dowery +dowf +dowie +Dowieism +Dowieite +dowily +dowiness +dowitch +dowitcher +dowl +dowlas +dowless +down +downbear +downbeard +downbeat +downby +downcast +downcastly +downcastness +downcome +downcomer +downcoming +downcry +downcurved +downcut +downdale +downdraft +downer +downface +downfall +downfallen +downfalling +downfeed +downflow +downfold +downfolded +downgate +downgone +downgrade +downgrowth +downhanging +downhaul +downheaded +downhearted +downheartedly +downheartedness +downhill +downily +downiness +Downing +Downingia +downland +downless +downlie +downlier +downligging +downlike +downline +downlooked +downlooker +downlying +downmost +downness +downpour +downpouring +downright +downrightly +downrightness +downrush +downrushing +downset +downshare +downshore +downside +downsinking +downsitting +downsliding +downslip +downslope +downsman +downspout +downstage +downstairs +downstate +downstater +downstream +downstreet +downstroke +downswing +downtake +downthrow +downthrown +downthrust +Downton +downtown +downtrampling +downtreading +downtrend +downtrodden +downtroddenness +downturn +downward +downwardly +downwardness +downway +downweed +downweigh +downweight +downweighted +downwind +downwith +downy +dowp +dowry +dowsabel +dowse +dowser +dowset +doxa +Doxantha +doxastic +doxasticon +doxographer +doxographical +doxography +doxological +doxologically +doxologize +doxology +doxy +doze +dozed +dozen +dozener +dozenth +dozer +dozily +doziness +dozy +dozzled +drab +Draba +drabbet +drabbish +drabble +drabbler +drabbletail +drabbletailed +drabby +drably +drabness +Dracaena +Dracaenaceae +drachm +drachma +drachmae +drachmai +drachmal +dracma +Draco +Dracocephalum +Draconian +Draconianism +Draconic +draconic +Draconically +Draconid +Draconis +Draconism +draconites +draconitic +dracontian +dracontiasis +dracontic +dracontine +dracontites +Dracontium +dracunculus +draegerman +draff +draffman +draffy +draft +draftage +draftee +drafter +draftily +draftiness +drafting +draftman +draftmanship +draftproof +draftsman +draftsmanship +draftswoman +draftswomanship +draftwoman +drafty +drag +dragade +dragbar +dragbolt +dragged +dragger +draggily +dragginess +dragging +draggingly +draggle +draggletail +draggletailed +draggletailedly +draggletailedness +draggly +draggy +draghound +dragline +dragman +dragnet +drago +dragoman +dragomanate +dragomanic +dragomanish +dragon +dragonesque +dragoness +dragonet +dragonfish +dragonfly +dragonhead +dragonhood +dragonish +dragonism +dragonize +dragonkind +dragonlike +dragonnade +dragonroot +dragontail +dragonwort +dragoon +dragoonable +dragoonade +dragoonage +dragooner +dragrope +dragsaw +dragsawing +dragsman +dragstaff +drail +drain +drainable +drainage +drainboard +draine +drained +drainer +drainerman +drainless +drainman +drainpipe +draintile +draisine +drake +drakestone +drakonite +dram +drama +dramalogue +Dramamine +dramatic +dramatical +dramatically +dramaticism +dramatics +dramaticule +dramatism +dramatist +dramatizable +dramatization +dramatize +dramatizer +dramaturge +dramaturgic +dramaturgical +dramaturgist +dramaturgy +dramm +drammage +dramme +drammed +drammer +dramming +drammock +dramseller +dramshop +drang +drank +drant +drapable +Draparnaldia +drape +drapeable +draper +draperess +draperied +drapery +drapetomania +drapping +drassid +Drassidae +drastic +drastically +drat +dratchell +drate +dratted +dratting +draught +draughtboard +draughthouse +draughtman +draughtmanship +draughts +draughtsman +draughtsmanship +draughtswoman +draughtswomanship +Dravida +Dravidian +Dravidic +dravya +draw +drawable +drawarm +drawback +drawbar +drawbeam +drawbench +drawboard +drawbolt +drawbore +drawboy +drawbridge +Drawcansir +drawcut +drawdown +drawee +drawer +drawers +drawfile +drawfiling +drawgate +drawgear +drawglove +drawhead +drawhorse +drawing +drawk +drawknife +drawknot +drawl +drawlatch +drawler +drawling +drawlingly +drawlingness +drawlink +drawloom +drawly +drawn +drawnet +drawoff +drawout +drawplate +drawpoint +drawrod +drawshave +drawsheet +drawspan +drawspring +drawstop +drawstring +drawtongs +drawtube +dray +drayage +drayman +drazel +dread +dreadable +dreader +dreadful +dreadfully +dreadfulness +dreadingly +dreadless +dreadlessly +dreadlessness +dreadly +dreadness +dreadnought +dream +dreamage +dreamer +dreamery +dreamful +dreamfully +dreamfulness +dreamhole +dreamily +dreaminess +dreamingly +dreamish +dreamland +dreamless +dreamlessly +dreamlessness +dreamlet +dreamlike +dreamlit +dreamlore +dreamsily +dreamsiness +dreamsy +dreamt +dreamtide +dreamwhile +dreamwise +dreamworld +dreamy +drear +drearfully +drearily +dreariment +dreariness +drearisome +drearly +drearness +dreary +dredge +dredgeful +dredger +dredging +dree +dreep +dreepiness +dreepy +dreg +dreggily +dregginess +dreggish +dreggy +dregless +dregs +dreiling +Dreissensia +dreissiger +drench +drencher +drenching +drenchingly +dreng +drengage +Drepanaspis +Drepanidae +Drepanididae +drepaniform +Drepanis +drepanium +drepanoid +Dreparnaudia +dress +dressage +dressed +dresser +dressership +dressily +dressiness +dressing +dressline +dressmaker +dressmakership +dressmakery +dressmaking +dressy +drest +drew +drewite +Dreyfusism +Dreyfusist +drias +drib +dribble +dribblement +dribbler +driblet +driddle +dried +drier +drierman +driest +drift +driftage +driftbolt +drifter +drifting +driftingly +driftland +driftless +driftlessness +driftlet +driftman +driftpiece +driftpin +driftway +driftweed +driftwind +driftwood +drifty +drightin +drill +driller +drillet +drilling +drillman +drillmaster +drillstock +Drimys +dringle +drink +drinkability +drinkable +drinkableness +drinkably +drinker +drinking +drinkless +drinkproof +drinn +drip +dripper +dripping +dripple +dripproof +drippy +dripstick +dripstone +drisheen +drisk +drivable +drivage +drive +driveaway +driveboat +drivebolt +drivehead +drivel +driveler +drivelingly +driven +drivepipe +driver +driverless +drivership +drivescrew +driveway +drivewell +driving +drivingly +drizzle +drizzly +drochuil +droddum +drofland +drogh +drogher +drogherman +drogue +droit +droitsman +droitural +droiturel +Drokpa +droll +drollery +drollingly +drollish +drollishness +drollist +drollness +drolly +Dromaeognathae +dromaeognathism +dromaeognathous +Dromaeus +drome +dromedarian +dromedarist +dromedary +drometer +Dromiacea +dromic +Dromiceiidae +Dromiceius +Dromicia +dromograph +dromomania +dromometer +dromond +Dromornis +dromos +dromotropic +drona +dronage +drone +dronepipe +droner +drongo +droningly +dronish +dronishly +dronishness +dronkgrass +drony +drool +droop +drooper +drooping +droopingly +droopingness +droopt +droopy +drop +dropberry +dropcloth +dropflower +drophead +droplet +droplight +droplike +dropling +dropman +dropout +dropper +dropping +droppingly +droppy +dropseed +dropsical +dropsically +dropsicalness +dropsied +dropsy +dropsywort +dropt +dropwise +dropworm +dropwort +Droschken +Drosera +Droseraceae +droseraceous +droshky +drosky +drosograph +drosometer +Drosophila +Drosophilidae +Drosophyllum +dross +drossel +drosser +drossiness +drossless +drossy +drostdy +droud +drought +droughtiness +droughty +drouk +drove +drover +drovy +drow +drown +drowner +drowningly +drowse +drowsily +drowsiness +drowsy +drub +drubber +drubbing +drubbly +drucken +drudge +drudger +drudgery +drudgingly +drudgism +druery +drug +drugeteria +drugger +druggery +drugget +druggeting +druggist +druggister +druggy +drugless +drugman +drugshop +drugstore +druid +druidess +druidic +druidical +druidism +druidry +druith +Drukpa +drum +drumbeat +drumble +drumbledore +drumbler +drumfire +drumfish +drumhead +drumheads +drumlike +drumlin +drumline +drumlinoid +drumloid +drumloidal +drumly +drummer +drumming +drummy +drumskin +drumstick +drumwood +drung +drungar +drunk +drunkard +drunken +drunkenly +drunkenness +drunkensome +drunkenwise +drunkery +Drupa +Drupaceae +drupaceous +drupal +drupe +drupel +drupelet +drupeole +drupetum +drupiferous +Druse +druse +Drusean +Drusedom +drusy +druxiness +druxy +dry +dryad +dryadetum +dryadic +dryas +dryasdust +drybeard +drybrained +drycoal +Drydenian +Drydenism +dryfoot +drygoodsman +dryhouse +drying +dryish +dryly +Drynaria +dryness +Dryobalanops +Dryope +Dryopes +Dryophyllum +Dryopians +dryopithecid +Dryopithecinae +dryopithecine +Dryopithecus +Dryops +Dryopteris +dryopteroid +drysalter +drysaltery +dryster +dryth +dryworker +Dschubba +duad +duadic +dual +Duala +duali +dualin +dualism +dualist +dualistic +dualistically +duality +dualization +dualize +dually +Dualmutef +dualogue +duarch +duarchy +dub +dubash +dubb +dubba +dubbah +dubbeltje +dubber +dubbing +dubby +Dubhe +Dubhgall +dubiety +dubiocrystalline +dubiosity +dubious +dubiously +dubiousness +dubitable +dubitably +dubitancy +dubitant +dubitate +dubitatingly +dubitation +dubitative +dubitatively +Duboisia +duboisin +duboisine +Dubonnet +dubs +ducal +ducally +ducamara +ducape +ducat +ducato +ducatoon +ducdame +duces +Duchesnea +Duchess +duchess +duchesse +duchesslike +duchy +duck +duckbill +duckblind +duckboard +duckboat +ducker +duckery +duckfoot +duckhearted +duckhood +duckhouse +duckhunting +duckie +ducking +duckling +ducklingship +duckmeat +duckpin +duckpond +duckstone +duckweed +duckwife +duckwing +Duco +duct +ducted +ductibility +ductible +ductile +ductilely +ductileness +ductilimeter +ductility +ductilize +duction +ductless +ductor +ductule +Ducula +Duculinae +dud +dudaim +dudder +duddery +duddies +dude +dudeen +dudgeon +dudine +dudish +dudishness +dudism +dudler +dudley +Dudleya +dudleyite +dudman +due +duel +dueler +dueling +duelist +duelistic +duello +dueness +duenna +duennadom +duennaship +duer +Duessa +duet +duettist +duff +duffadar +duffel +duffer +dufferdom +duffing +dufoil +dufrenite +dufrenoysite +dufter +dufterdar +duftery +dug +dugal +dugdug +duggler +dugong +Dugongidae +dugout +dugway +duhat +Duhr +duiker +duikerbok +duim +Duit +duit +dujan +duke +dukedom +dukeling +dukely +dukery +dukeship +dukhn +dukker +dukkeripen +Dulanganes +Dulat +dulbert +dulcet +dulcetly +dulcetness +dulcian +dulciana +dulcification +dulcifluous +dulcify +dulcigenic +dulcimer +Dulcin +Dulcinea +Dulcinist +dulcitol +dulcitude +dulcose +duledge +duler +dulia +dull +dullard +dullardism +dullardness +dullbrained +duller +dullery +dullhead +dullhearted +dullification +dullify +dullish +dullity +dullness +dullpate +dullsome +dully +dulosis +dulotic +dulse +dulseman +dult +dultie +dulwilly +duly +dum +duma +dumaist +dumb +dumba +dumbbell +dumbbeller +dumbcow +dumbfounder +dumbfounderment +dumbhead +dumbledore +dumbly +dumbness +dumdum +dumetose +dumfound +dumfounder +dumfounderment +dummel +dummered +dumminess +dummy +dummyism +dummyweed +Dumontia +Dumontiaceae +dumontite +dumortierite +dumose +dumosity +dump +dumpage +dumpcart +dumper +dumpily +dumpiness +dumping +dumpish +dumpishly +dumpishness +dumple +dumpling +dumpoke +dumpy +dumsola +dun +dunair +dunal +dunbird +Duncan +dunce +duncedom +duncehood +duncery +dunch +Dunciad +duncical +duncify +duncish +duncishly +duncishness +dundasite +dunder +dunderhead +dunderheaded +dunderheadedness +dunderpate +dune +dunelike +dunfish +dung +Dungan +dungannonite +dungaree +dungbeck +dungbird +dungbred +dungeon +dungeoner +dungeonlike +dunger +dunghill +dunghilly +dungol +dungon +dungy +dungyard +dunite +dunk +dunkadoo +Dunkard +Dunker +dunker +Dunkirk +Dunkirker +Dunlap +dunlin +Dunlop +dunnage +dunne +dunner +dunness +dunnish +dunnite +dunnock +dunny +dunpickle +Duns +dunst +dunstable +dunt +duntle +duny +dunziekte +duo +duocosane +duodecahedral +duodecahedron +duodecane +duodecennial +duodecillion +duodecimal +duodecimality +duodecimally +duodecimfid +duodecimo +duodecimole +duodecuple +duodena +duodenal +duodenary +duodenate +duodenation +duodene +duodenectomy +duodenitis +duodenocholangitis +duodenocholecystostomy +duodenocholedochotomy +duodenocystostomy +duodenoenterostomy +duodenogram +duodenojejunal +duodenojejunostomy +duodenopancreatectomy +duodenoscopy +duodenostomy +duodenotomy +duodenum +duodrama +duograph +duogravure +duole +duoliteral +duologue +duomachy +duopod +duopolistic +duopoly +duopsonistic +duopsony +duosecant +duotone +duotriacontane +duotype +dup +dupability +dupable +dupe +dupedom +duper +dupery +dupion +dupla +duplation +duple +duplet +duplex +duplexity +duplicability +duplicable +duplicand +duplicate +duplication +duplicative +duplicator +duplicature +duplicia +duplicident +Duplicidentata +duplicidentate +duplicipennate +duplicitas +duplicity +duplification +duplify +duplone +dupondius +duppy +dura +durability +durable +durableness +durably +durain +dural +Duralumin +duramatral +duramen +durance +Durandarte +durangite +Durango +Durani +durant +Duranta +duraplasty +duraquara +duraspinalis +duration +durational +durationless +durative +durax +durbachite +Durban +durbar +durdenite +dure +durene +durenol +duress +duressor +durgan +Durham +durian +duridine +Durindana +during +duringly +Durio +durity +durmast +durn +duro +Duroc +durometer +duroquinone +durra +durrie +durrin +durry +durst +durukuli +durwaun +duryl +Duryodhana +Durzada +dusack +duscle +dush +dusio +dusk +dusken +duskily +duskiness +duskingtide +duskish +duskishly +duskishness +duskly +duskness +dusky +dust +dustbin +dustbox +dustcloth +dustee +duster +dusterman +dustfall +dustily +dustiness +dusting +dustless +dustlessness +dustman +dustpan +dustproof +dustuck +dustwoman +dusty +dustyfoot +Dusun +Dutch +dutch +Dutcher +Dutchify +Dutchman +Dutchy +duteous +duteously +duteousness +dutiability +dutiable +dutied +dutiful +dutifully +dutifulness +dutra +duty +dutymonger +duumvir +duumviral +duumvirate +duvet +duvetyn +dux +duyker +dvaita +dvandva +dwale +dwalm +Dwamish +dwang +dwarf +dwarfish +dwarfishly +dwarfishness +dwarfism +dwarfling +dwarfness +dwarfy +dwayberry +dwell +dwelled +dweller +dwelling +dwelt +dwindle +dwindlement +dwine +Dwyka +dyad +dyadic +Dyak +dyakisdodecahedron +Dyakish +dyarchic +dyarchical +dyarchy +Dyas +Dyassic +dyaster +Dyaus +dyce +dye +dyeable +dyehouse +dyeing +dyeleaves +dyemaker +dyemaking +dyer +dyester +dyestuff +dyeware +dyeweed +dyewood +dygogram +dying +dyingly +dyingness +dyke +dykehopper +dyker +dykereeve +dynagraph +dynameter +dynametric +dynametrical +dynamic +dynamical +dynamically +dynamics +dynamis +dynamism +dynamist +dynamistic +dynamitard +dynamite +dynamiter +dynamitic +dynamitical +dynamitically +dynamiting +dynamitish +dynamitism +dynamitist +dynamization +dynamize +dynamo +dynamoelectric +dynamoelectrical +dynamogenesis +dynamogenic +dynamogenous +dynamogenously +dynamogeny +dynamometamorphic +dynamometamorphism +dynamometamorphosed +dynamometer +dynamometric +dynamometrical +dynamometry +dynamomorphic +dynamoneure +dynamophone +dynamostatic +dynamotor +dynast +Dynastes +dynastical +dynastically +dynasticism +dynastid +dynastidan +Dynastides +Dynastinae +dynasty +dynatron +dyne +dyophone +Dyophysite +Dyophysitic +Dyophysitical +Dyophysitism +dyotheism +Dyothelete +Dyotheletian +Dyotheletic +Dyotheletical +Dyotheletism +Dyothelism +dyphone +dysacousia +dysacousis +dysanalyte +dysaphia +dysarthria +dysarthric +dysarthrosis +dysbulia +dysbulic +dyschiria +dyschroa +dyschroia +dyschromatopsia +dyschromatoptic +dyschronous +dyscrasia +dyscrasial +dyscrasic +dyscrasite +dyscratic +dyscrystalline +dysenteric +dysenterical +dysentery +dysepulotic +dysepulotical +dyserethisia +dysergasia +dysergia +dysesthesia +dysesthetic +dysfunction +dysgenesic +dysgenesis +dysgenetic +dysgenic +dysgenical +dysgenics +dysgeogenous +dysgnosia +dysgraphia +dysidrosis +dyskeratosis +dyskinesia +dyskinetic +dyslalia +dyslexia +dyslogia +dyslogistic +dyslogistically +dyslogy +dysluite +dyslysin +dysmenorrhea +dysmenorrheal +dysmerism +dysmeristic +dysmerogenesis +dysmerogenetic +dysmeromorph +dysmeromorphic +dysmetria +dysmnesia +dysmorphism +dysmorphophobia +dysneuria +dysnomy +dysodile +dysodontiasis +dysorexia +dysorexy +dysoxidation +dysoxidizable +dysoxidize +dyspathetic +dyspathy +dyspepsia +dyspepsy +dyspeptic +dyspeptical +dyspeptically +dysphagia +dysphagic +dysphasia +dysphasic +dysphemia +dysphonia +dysphonic +dysphoria +dysphoric +dysphotic +dysphrasia +dysphrenia +dyspituitarism +dysplasia +dysplastic +dyspnea +dyspneal +dyspneic +dyspnoic +dysprosia +dysprosium +dysraphia +dyssnite +Dyssodia +dysspermatism +dyssynergia +dyssystole +dystaxia +dystectic +dysteleological +dysteleologist +dysteleology +dysthyroidism +dystocia +dystocial +dystome +dystomic +dystomous +dystrophia +dystrophic +dystrophy +dysuria +dysuric +dysyntribite +dytiscid +Dytiscidae +Dytiscus +dzeren +Dzungar +E +e +ea +each +eachwhere +eager +eagerly +eagerness +eagle +eaglelike +eagless +eaglestone +eaglet +eaglewood +eagre +ean +ear +earache +earbob +earcap +earcockle +eardrop +eardropper +eardrum +eared +earflower +earful +earhole +earing +earjewel +earl +earlap +earldom +earless +earlet +earlike +earliness +earlish +earlock +earlship +early +earmark +earn +earner +earnest +earnestly +earnestness +earnful +earning +earnings +earphone +earpick +earpiece +earplug +earreach +earring +earringed +earscrew +earshot +earsore +earsplitting +eartab +earth +earthboard +earthborn +earthbred +earthdrake +earthed +earthen +earthenhearted +earthenware +earthfall +earthfast +earthgall +earthgrubber +earthian +earthiness +earthkin +earthless +earthlight +earthlike +earthliness +earthling +earthly +earthmaker +earthmaking +earthnut +earthpea +earthquake +earthquaked +earthquaken +earthquaking +Earthshaker +earthshine +earthshock +earthslide +earthsmoke +earthstar +earthtongue +earthwall +earthward +earthwards +earthwork +earthworm +earthy +earwax +earwig +earwigginess +earwiggy +earwitness +earworm +earwort +ease +easeful +easefully +easefulness +easel +easeless +easement +easer +easier +easiest +easily +easiness +easing +east +eastabout +eastbound +Easter +easter +easterling +easterly +Eastern +eastern +easterner +Easternism +Easternly +easternmost +Eastertide +easting +Eastlake +eastland +eastmost +Eastre +eastward +eastwardly +easy +easygoing +easygoingness +eat +eatability +eatable +eatableness +eatage +Eatanswill +eatberry +eaten +eater +eatery +eating +eats +eave +eaved +eavedrop +eaver +eaves +eavesdrop +eavesdropper +eavesdropping +ebb +ebbman +Eben +Ebenaceae +ebenaceous +Ebenales +ebeneous +Ebenezer +Eberthella +Ebionism +Ebionite +Ebionitic +Ebionitism +Ebionize +Eboe +eboe +ebon +ebonist +ebonite +ebonize +ebony +ebracteate +ebracteolate +ebriate +ebriety +ebriosity +ebrious +ebriously +ebullate +ebullience +ebulliency +ebullient +ebulliently +ebulliometer +ebullioscope +ebullioscopic +ebullioscopy +ebullition +ebullitive +ebulus +eburated +eburine +Eburna +eburnated +eburnation +eburnean +eburneoid +eburneous +eburnian +eburnification +ecad +ecalcarate +ecanda +ecardinal +Ecardines +ecarinate +ecarte +Ecaudata +ecaudate +Ecballium +ecbatic +ecblastesis +ecbole +ecbolic +Ecca +eccaleobion +eccentrate +eccentric +eccentrical +eccentrically +eccentricity +eccentring +eccentrometer +ecchondroma +ecchondrosis +ecchondrotome +ecchymoma +ecchymose +ecchymosis +ecclesia +ecclesial +ecclesiarch +ecclesiarchy +ecclesiast +Ecclesiastes +ecclesiastic +ecclesiastical +ecclesiastically +ecclesiasticism +ecclesiasticize +ecclesiastics +Ecclesiasticus +ecclesiastry +ecclesioclastic +ecclesiography +ecclesiolater +ecclesiolatry +ecclesiologic +ecclesiological +ecclesiologically +ecclesiologist +ecclesiology +ecclesiophobia +eccoprotic +eccoproticophoric +eccrinology +eccrisis +eccritic +eccyclema +eccyesis +ecdemic +ecdemite +ecderon +ecderonic +ecdysiast +ecdysis +ecesic +ecesis +ecgonine +eche +echea +echelette +echelon +echelonment +Echeloot +Echeneidae +echeneidid +Echeneididae +echeneidoid +Echeneis +Echeveria +echidna +Echidnidae +Echimys +Echinacea +echinal +echinate +echinid +Echinidea +echinital +echinite +Echinocactus +Echinocaris +Echinocereus +Echinochloa +echinochrome +echinococcus +Echinoderes +Echinoderidae +echinoderm +Echinoderma +echinodermal +Echinodermata +echinodermatous +echinodermic +Echinodorus +echinoid +Echinoidea +echinologist +echinology +Echinomys +Echinopanax +Echinops +echinopsine +Echinorhinidae +Echinorhinus +Echinorhynchus +Echinospermum +Echinosphaerites +Echinosphaeritidae +Echinostoma +Echinostomatidae +echinostome +echinostomiasis +Echinozoa +echinulate +echinulated +echinulation +echinuliform +echinus +Echis +echitamine +Echites +Echium +echiurid +Echiurida +echiuroid +Echiuroidea +Echiurus +echo +echoer +echoic +echoingly +echoism +echoist +echoize +echolalia +echolalic +echoless +echometer +echopractic +echopraxia +echowise +Echuca +eciliate +Eciton +ecize +Eckehart +ecklein +eclair +eclampsia +eclamptic +eclat +eclectic +eclectical +eclectically +eclecticism +eclecticize +Eclectics +eclectism +eclectist +eclegm +eclegma +eclipsable +eclipsareon +eclipsation +eclipse +eclipser +eclipsis +ecliptic +ecliptical +ecliptically +eclogite +eclogue +eclosion +ecmnesia +ecoid +ecole +ecologic +ecological +ecologically +ecologist +ecology +econometer +econometric +econometrician +econometrics +economic +economical +economically +economics +economism +economist +Economite +economization +economize +economizer +economy +ecophene +ecophobia +ecorticate +ecospecies +ecospecific +ecospecifically +ecostate +ecosystem +ecotonal +ecotone +ecotype +ecotypic +ecotypically +ecphonesis +ecphorable +ecphore +ecphoria +ecphorization +ecphorize +ecphrasis +ecrasite +ecru +ecrustaceous +ecstasis +ecstasize +ecstasy +ecstatic +ecstatica +ecstatical +ecstatically +ecstaticize +ecstrophy +ectad +ectadenia +ectal +ectally +ectasia +ectasis +ectatic +ectene +ectental +ectepicondylar +ectethmoid +ectethmoidal +Ecthesis +ecthetically +ecthlipsis +ecthyma +ectiris +ectobatic +ectoblast +ectoblastic +ectobronchium +ectocardia +Ectocarpaceae +ectocarpaceous +Ectocarpales +ectocarpic +ectocarpous +Ectocarpus +ectocinerea +ectocinereal +ectocoelic +ectocondylar +ectocondyle +ectocondyloid +ectocornea +ectocranial +ectocuneiform +ectocuniform +ectocyst +ectodactylism +ectoderm +ectodermal +ectodermic +ectodermoidal +ectodermosis +ectodynamomorphic +ectoentad +ectoenzyme +ectoethmoid +ectogenesis +ectogenic +ectogenous +ectoglia +Ectognatha +ectolecithal +ectoloph +ectomere +ectomeric +ectomesoblast +ectomorph +ectomorphic +ectomorphy +ectonephridium +ectoparasite +ectoparasitic +Ectoparasitica +ectopatagium +ectophloic +ectophyte +ectophytic +ectopia +ectopic +Ectopistes +ectoplacenta +ectoplasm +ectoplasmatic +ectoplasmic +ectoplastic +ectoplasy +Ectoprocta +ectoproctan +ectoproctous +ectopterygoid +ectopy +ectoretina +ectorganism +ectorhinal +ectosarc +ectosarcous +ectoskeleton +ectosomal +ectosome +ectosphenoid +ectosphenotic +ectosphere +ectosteal +ectosteally +ectostosis +ectotheca +ectotoxin +Ectotrophi +ectotrophic +ectozoa +ectozoan +ectozoic +ectozoon +ectrodactylia +ectrodactylism +ectrodactyly +ectrogenic +ectrogeny +ectromelia +ectromelian +ectromelic +ectromelus +ectropion +ectropium +ectropometer +ectrosyndactyly +ectypal +ectype +ectypography +Ecuadoran +Ecuadorian +ecuelling +ecumenic +ecumenical +ecumenicalism +ecumenicality +ecumenically +ecumenicity +ecyphellate +eczema +eczematization +eczematoid +eczematosis +eczematous +Ed +edacious +edaciously +edaciousness +edacity +Edana +edaphic +edaphology +edaphon +Edaphosauria +Edaphosaurus +Edda +Eddaic +edder +Eddic +Eddie +eddish +eddo +eddy +eddyroot +edea +edeagra +edeitis +edelweiss +edema +edematous +edemic +Eden +Edenic +edenite +Edenization +Edenize +edental +edentalous +Edentata +edentate +edentulate +edentulous +edeodynia +edeology +edeomania +edeoscopy +edeotomy +Edessan +edestan +edestin +Edestosaurus +Edgar +edge +edgebone +edged +edgeless +edgemaker +edgemaking +edgeman +edger +edgerman +edgeshot +edgestone +edgeways +edgeweed +edgewise +edginess +edging +edgingly +edgrew +edgy +edh +edibility +edible +edibleness +edict +edictal +edictally +edicule +edificable +edification +edificator +edificatory +edifice +edificial +edifier +edify +edifying +edifyingly +edifyingness +edingtonite +edit +edital +Edith +edition +editor +editorial +editorialize +editorially +editorship +editress +Ediya +Edmund +Edna +Edo +Edomite +Edomitish +Edoni +Edriasteroidea +Edrioasteroid +Edrioasteroidea +Edriophthalma +edriophthalmatous +edriophthalmian +edriophthalmic +edriophthalmous +Educabilia +educabilian +educability +educable +educand +educatable +educate +educated +educatee +education +educationable +educational +educationalism +educationalist +educationally +educationary +educationist +educative +educator +educatory +educatress +educe +educement +educible +educive +educt +eduction +eductive +eductor +edulcorate +edulcoration +edulcorative +edulcorator +Eduskunta +Edward +Edwardean +Edwardeanism +Edwardian +Edwardine +Edwardsia +Edwardsiidae +Edwin +Edwina +eegrass +eel +eelboat +eelbob +eelbobber +eelcake +eelcatcher +eeler +eelery +eelfare +eelfish +eelgrass +eellike +eelpot +eelpout +eelshop +eelskin +eelspear +eelware +eelworm +eely +eer +eerie +eerily +eeriness +eerisome +effable +efface +effaceable +effacement +effacer +effect +effecter +effectful +effectible +effective +effectively +effectiveness +effectivity +effectless +effector +effects +effectual +effectuality +effectualize +effectually +effectualness +effectuate +effectuation +effeminacy +effeminate +effeminately +effeminateness +effemination +effeminatize +effeminization +effeminize +effendi +efferent +effervesce +effervescence +effervescency +effervescent +effervescible +effervescingly +effervescive +effete +effeteness +effetman +efficacious +efficaciously +efficaciousness +efficacity +efficacy +efficience +efficiency +efficient +efficiently +Effie +effigial +effigiate +effigiation +effigurate +effiguration +effigy +efflate +efflation +effloresce +efflorescence +efflorescency +efflorescent +efflower +effluence +effluency +effluent +effluvia +effluvial +effluviate +effluviography +effluvious +effluvium +efflux +effluxion +effodient +Effodientia +efform +efformation +efformative +effort +effortful +effortless +effortlessly +effossion +effraction +effranchise +effranchisement +effrontery +effulge +effulgence +effulgent +effulgently +effund +effuse +effusiometer +effusion +effusive +effusively +effusiveness +Efik +eflagelliferous +efoliolate +efoliose +efoveolate +eft +eftest +eftsoons +egad +egalitarian +egalitarianism +egality +Egba +Egbert +Egbo +egence +egeran +Egeria +egest +egesta +egestion +egestive +egg +eggberry +eggcup +eggcupful +eggeater +egger +eggfish +eggfruit +egghead +egghot +egging +eggler +eggless +egglike +eggnog +eggplant +eggshell +eggy +egilops +egipto +Eglamore +eglandular +eglandulose +eglantine +eglatere +eglestonite +egma +ego +egocentric +egocentricity +egocentrism +Egocerus +egohood +egoism +egoist +egoistic +egoistical +egoistically +egoity +egoize +egoizer +egol +egolatrous +egomania +egomaniac +egomaniacal +egomism +egophonic +egophony +egosyntonic +egotheism +egotism +egotist +egotistic +egotistical +egotistically +egotize +egregious +egregiously +egregiousness +egress +egression +egressive +egressor +egret +Egretta +egrimony +egueiite +egurgitate +eguttulate +Egypt +Egyptian +Egyptianism +Egyptianization +Egyptianize +Egyptize +Egyptologer +Egyptologic +Egyptological +Egyptologist +Egyptology +eh +Ehatisaht +eheu +ehlite +Ehretia +Ehretiaceae +ehrwaldite +ehuawa +eichbergite +Eichhornia +eichwaldite +eicosane +eident +eidently +eider +eidetic +eidograph +eidolic +eidolism +eidology +eidolology +eidolon +eidoptometry +eidouranion +eigenfunction +eigenvalue +eight +eighteen +eighteenfold +eighteenmo +eighteenth +eighteenthly +eightfoil +eightfold +eighth +eighthly +eightieth +eightling +eightpenny +eightscore +eightsman +eightsome +eighty +eightyfold +eigne +Eikonogen +eikonology +Eileen +Eimak +eimer +Eimeria +einkorn +Einsteinian +Eireannach +Eirene +eiresione +eisegesis +eisegetical +eisodic +eisteddfod +eisteddfodic +eisteddfodism +either +ejaculate +ejaculation +ejaculative +ejaculator +ejaculatory +Ejam +eject +ejecta +ejectable +ejection +ejective +ejectively +ejectivity +ejectment +ejector +ejicient +ejoo +ekaboron +ekacaesium +ekaha +ekamanganese +ekasilicon +ekatantalum +eke +ekebergite +eker +ekerite +eking +ekka +Ekoi +ekphore +Ekron +Ekronite +ektene +ektenes +ektodynamorphic +el +elaborate +elaborately +elaborateness +elaboration +elaborative +elaborator +elaboratory +elabrate +Elachista +Elachistaceae +elachistaceous +Elaeagnaceae +elaeagnaceous +Elaeagnus +Elaeis +elaeoblast +elaeoblastic +Elaeocarpaceae +elaeocarpaceous +Elaeocarpus +Elaeococca +Elaeodendron +elaeodochon +elaeomargaric +elaeometer +elaeoptene +elaeosaccharum +elaeothesium +elaidate +elaidic +elaidin +elaidinic +elain +Elaine +elaine +elaioleucite +elaioplast +elaiosome +Elamite +Elamitic +Elamitish +elance +eland +elanet +Elanus +Elaphe +Elaphebolion +elaphine +Elaphodus +Elaphoglossum +Elaphomyces +Elaphomycetaceae +Elaphrium +elaphure +elaphurine +Elaphurus +elapid +Elapidae +Elapinae +elapine +elapoid +Elaps +elapse +Elapsoidea +elasmobranch +elasmobranchian +elasmobranchiate +Elasmobranchii +elasmosaur +Elasmosaurus +elasmothere +Elasmotherium +elastance +elastic +elastica +elastically +elastician +elasticin +elasticity +elasticize +elasticizer +elasticness +elastin +elastivity +elastomer +elastomeric +elastometer +elastometry +elastose +elatcha +elate +elated +elatedly +elatedness +elater +elaterid +Elateridae +elaterin +elaterite +elaterium +elateroid +Elatha +Elatinaceae +elatinaceous +Elatine +elation +elative +elator +elatrometer +elb +Elbert +Elberta +elbow +elbowboard +elbowbush +elbowchair +elbowed +elbower +elbowpiece +elbowroom +elbowy +elcaja +elchee +eld +elder +elderberry +elderbrotherhood +elderbrotherish +elderbrotherly +elderbush +elderhood +elderliness +elderly +elderman +eldership +eldersisterly +elderwoman +elderwood +elderwort +eldest +eldin +elding +Eldred +eldress +eldritch +Elean +Eleanor +Eleatic +Eleaticism +Eleazar +elecampane +elect +electable +electee +electicism +election +electionary +electioneer +electioneerer +elective +electively +electiveness +electivism +electivity +electly +elector +electoral +electorally +electorate +electorial +electorship +Electra +electragist +electragy +electralize +electrepeter +electress +electret +electric +electrical +electricalize +electrically +electricalness +electrician +electricity +electricize +electrics +electriferous +electrifiable +electrification +electrifier +electrify +electrion +electrionic +electrizable +electrization +electrize +electrizer +electro +electroacoustic +electroaffinity +electroamalgamation +electroanalysis +electroanalytic +electroanalytical +electroanesthesia +electroballistic +electroballistics +electrobath +electrobiological +electrobiologist +electrobiology +electrobioscopy +electroblasting +electrobrasser +electrobus +electrocapillarity +electrocapillary +electrocardiogram +electrocardiograph +electrocardiographic +electrocardiography +electrocatalysis +electrocatalytic +electrocataphoresis +electrocataphoretic +electrocauterization +electrocautery +electroceramic +electrochemical +electrochemically +electrochemist +electrochemistry +electrochronograph +electrochronographic +electrochronometer +electrochronometric +electrocoagulation +electrocoating +electrocolloidal +electrocontractility +electrocorticogram +electroculture +electrocute +electrocution +electrocutional +electrocutioner +electrocystoscope +electrode +electrodeless +electrodentistry +electrodeposit +electrodepositable +electrodeposition +electrodepositor +electrodesiccate +electrodesiccation +electrodiagnosis +electrodialysis +electrodialyze +electrodialyzer +electrodiplomatic +electrodispersive +electrodissolution +electrodynamic +electrodynamical +electrodynamics +electrodynamism +electrodynamometer +electroencephalogram +electroencephalograph +electroencephalography +electroendosmose +electroendosmosis +electroendosmotic +electroengrave +electroengraving +electroergometer +electroetching +electroethereal +electroextraction +electroform +electroforming +electrofuse +electrofused +electrofusion +electrogalvanic +electrogalvanize +electrogenesis +electrogenetic +electrogild +electrogilding +electrogilt +electrograph +electrographic +electrographite +electrography +electroharmonic +electrohemostasis +electrohomeopathy +electrohorticulture +electrohydraulic +electroimpulse +electroindustrial +electroionic +electroirrigation +electrokinematics +electrokinetic +electrokinetics +electrolier +electrolithotrity +electrologic +electrological +electrologist +electrology +electroluminescence +electroluminescent +electrolysis +electrolyte +electrolytic +electrolytical +electrolytically +electrolyzability +electrolyzable +electrolyzation +electrolyze +electrolyzer +electromagnet +electromagnetic +electromagnetical +electromagnetically +electromagnetics +electromagnetism +electromagnetist +electromassage +electromechanical +electromechanics +electromedical +electromer +electromeric +electromerism +electrometallurgical +electrometallurgist +electrometallurgy +electrometer +electrometric +electrometrical +electrometrically +electrometry +electromobile +electromobilism +electromotion +electromotive +electromotivity +electromotograph +electromotor +electromuscular +electromyographic +electron +electronarcosis +electronegative +electronervous +electronic +electronics +electronographic +electrooptic +electrooptical +electrooptically +electrooptics +electroosmosis +electroosmotic +electroosmotically +electrootiatrics +electropathic +electropathology +electropathy +electropercussive +electrophobia +electrophone +electrophore +electrophoresis +electrophoretic +electrophoric +Electrophoridae +electrophorus +electrophotometer +electrophotometry +electrophototherapy +electrophrenic +electrophysics +electrophysiological +electrophysiologist +electrophysiology +electropism +electroplate +electroplater +electroplating +electroplax +electropneumatic +electropneumatically +electropoion +electropolar +electropositive +electropotential +electropower +electropsychrometer +electropult +electropuncturation +electropuncture +electropuncturing +electropyrometer +electroreceptive +electroreduction +electrorefine +electroscission +electroscope +electroscopic +electrosherardizing +electroshock +electrosmosis +electrostatic +electrostatical +electrostatically +electrostatics +electrosteel +electrostenolysis +electrostenolytic +electrostereotype +electrostriction +electrosurgery +electrosurgical +electrosynthesis +electrosynthetic +electrosynthetically +electrotactic +electrotautomerism +electrotaxis +electrotechnic +electrotechnical +electrotechnician +electrotechnics +electrotechnology +electrotelegraphic +electrotelegraphy +electrotelethermometer +electrotellurograph +electrotest +electrothanasia +electrothanatosis +electrotherapeutic +electrotherapeutical +electrotherapeutics +electrotherapeutist +electrotherapist +electrotherapy +electrothermal +electrothermancy +electrothermic +electrothermics +electrothermometer +electrothermostat +electrothermostatic +electrothermotic +electrotitration +electrotonic +electrotonicity +electrotonize +electrotonus +electrotrephine +electrotropic +electrotropism +electrotype +electrotyper +electrotypic +electrotyping +electrotypist +electrotypy +electrovalence +electrovalency +electrovection +electroviscous +electrovital +electrowin +electrum +electuary +eleemosynarily +eleemosynariness +eleemosynary +elegance +elegancy +elegant +elegantly +elegiac +elegiacal +elegiambic +elegiambus +elegiast +elegist +elegit +elegize +elegy +eleidin +element +elemental +elementalism +elementalist +elementalistic +elementalistically +elementality +elementalize +elementally +elementarily +elementariness +elementary +elementoid +elemi +elemicin +elemin +elench +elenchi +elenchic +elenchical +elenchically +elenchize +elenchtic +elenchtical +elenctic +elenge +eleoblast +Eleocharis +eleolite +eleomargaric +eleometer +eleonorite +eleoptene +eleostearate +eleostearic +elephant +elephanta +elephantiac +elephantiasic +elephantiasis +elephantic +elephanticide +Elephantidae +elephantine +elephantlike +elephantoid +elephantoidal +Elephantopus +elephantous +elephantry +Elephas +Elettaria +Eleusine +Eleusinia +Eleusinian +Eleusinion +Eleut +eleutherarch +Eleutheri +Eleutheria +Eleutherian +Eleutherios +eleutherism +eleutherodactyl +Eleutherodactyli +Eleutherodactylus +eleutheromania +eleutheromaniac +eleutheromorph +eleutheropetalous +eleutherophyllous +eleutherosepalous +Eleutherozoa +eleutherozoan +elevate +elevated +elevatedly +elevatedness +elevating +elevatingly +elevation +elevational +elevator +elevatory +eleven +elevener +elevenfold +eleventh +eleventhly +elevon +elf +elfenfolk +elfhood +elfic +elfin +elfinwood +elfish +elfishly +elfishness +elfkin +elfland +elflike +elflock +elfship +elfwife +elfwort +Eli +Elia +Elian +Elianic +Elias +eliasite +elicit +elicitable +elicitate +elicitation +elicitor +elicitory +elide +elidible +eligibility +eligible +eligibleness +eligibly +Elihu +Elijah +eliminable +eliminand +eliminant +eliminate +elimination +eliminative +eliminator +eliminatory +Elinor +Elinvar +Eliphalet +eliquate +eliquation +Elisha +Elishah +elision +elisor +Elissa +elite +elixir +Eliza +Elizabeth +Elizabethan +Elizabethanism +Elizabethanize +elk +Elkanah +Elkdom +Elkesaite +elkhorn +elkhound +Elkoshite +elkslip +Elkuma +elkwood +ell +Ella +ellachick +ellagate +ellagic +ellagitannin +Ellasar +elle +elleck +Ellen +ellenyard +Ellerian +ellfish +Ellice +Ellick +ellipse +ellipses +ellipsis +ellipsograph +ellipsoid +ellipsoidal +ellipsone +ellipsonic +elliptic +elliptical +elliptically +ellipticalness +ellipticity +elliptograph +elliptoid +ellops +ellwand +elm +Elmer +elmy +Eloah +elocular +elocute +elocution +elocutionary +elocutioner +elocutionist +elocutionize +elod +Elodea +Elodeaceae +Elodes +eloge +elogium +Elohim +Elohimic +Elohism +Elohist +Elohistic +eloign +eloigner +eloignment +Eloise +Elon +elongate +elongated +elongation +elongative +Elonite +elope +elopement +eloper +Elopidae +elops +eloquence +eloquent +eloquential +eloquently +eloquentness +Elotherium +elotillo +elpasolite +elpidite +els +Elsa +else +elsehow +elsewards +elseways +elsewhen +elsewhere +elsewheres +elsewhither +elsewise +Elsholtzia +elsin +elt +eluate +elucidate +elucidation +elucidative +elucidator +elucidatory +elucubrate +elucubration +elude +eluder +elusion +elusive +elusively +elusiveness +elusoriness +elusory +elute +elution +elutor +elutriate +elutriation +elutriator +eluvial +eluviate +eluviation +eluvium +elvan +elvanite +elvanitic +elver +elves +elvet +Elvira +elvish +elvishly +elydoric +Elymi +Elymus +Elysee +Elysia +elysia +Elysian +Elysiidae +Elysium +elytral +elytriferous +elytriform +elytrigerous +elytrin +elytrocele +elytroclasia +elytroid +elytron +elytroplastic +elytropolypus +elytroposis +elytrorhagia +elytrorrhagia +elytrorrhaphy +elytrostenosis +elytrotomy +elytrous +elytrum +Elzevir +Elzevirian +Em +em +emaciate +emaciation +emajagua +emanant +emanate +emanation +emanational +emanationism +emanationist +emanatism +emanatist +emanatistic +emanativ +emanative +emanatively +emanator +emanatory +emancipate +emancipation +emancipationist +emancipatist +emancipative +emancipator +emancipatory +emancipatress +emancipist +emandibulate +emanium +emarcid +emarginate +emarginately +emargination +Emarginula +emasculate +emasculation +emasculative +emasculator +emasculatory +Embadomonas +emball +emballonurid +Emballonuridae +emballonurine +embalm +embalmer +embalmment +embank +embankment +embannered +embar +embargo +embargoist +embark +embarkation +embarkment +embarras +embarrass +embarrassed +embarrassedly +embarrassing +embarrassingly +embarrassment +embarrel +embassage +embassy +embastioned +embathe +embatholithic +embattle +embattled +embattlement +embay +embayment +Embden +embed +embedment +embeggar +Embelia +embelic +embellish +embellisher +embellishment +ember +embergoose +Emberiza +emberizidae +Emberizinae +emberizine +embezzle +embezzlement +embezzler +Embiidae +Embiidina +embind +Embiodea +Embioptera +embiotocid +Embiotocidae +embiotocoid +embira +embitter +embitterer +embitterment +emblaze +emblazer +emblazon +emblazoner +emblazonment +emblazonry +emblem +emblema +emblematic +emblematical +emblematically +emblematicalness +emblematicize +emblematist +emblematize +emblematology +emblement +emblemist +emblemize +emblemology +emblic +emblossom +embodier +embodiment +embody +embog +emboitement +embolden +emboldener +embole +embolectomy +embolemia +embolic +emboliform +embolism +embolismic +embolismus +embolite +embolium +embolize +embolo +embololalia +Embolomeri +embolomerism +embolomerous +embolomycotic +embolum +embolus +emboly +emborder +emboscata +embosom +emboss +embossage +embosser +embossing +embossman +embossment +embosture +embottle +embouchure +embound +embow +embowed +embowel +emboweler +embowelment +embower +embowerment +embowment +embox +embrace +embraceable +embraceably +embracement +embraceor +embracer +embracery +embracing +embracingly +embracingness +embracive +embrail +embranchment +embrangle +embranglement +embrasure +embreathe +embreathement +Embrica +embright +embrittle +embrittlement +embroaden +embrocate +embrocation +embroider +embroiderer +embroideress +embroidery +embroil +embroiler +embroilment +embronze +embrown +embryectomy +embryo +embryocardia +embryoctonic +embryoctony +embryoferous +embryogenesis +embryogenetic +embryogenic +embryogeny +embryogony +embryographer +embryographic +embryography +embryoid +embryoism +embryologic +embryological +embryologically +embryologist +embryology +embryoma +embryon +embryonal +embryonary +embryonate +embryonated +embryonic +embryonically +embryoniferous +embryoniform +embryony +embryopathology +embryophagous +embryophore +Embryophyta +embryophyte +embryoplastic +embryoscope +embryoscopic +embryotega +embryotic +embryotome +embryotomy +embryotrophic +embryotrophy +embryous +embryulcia +embryulcus +embubble +embuia +embus +embusk +embuskin +emcee +eme +emeer +emeership +Emeline +emend +emendable +emendandum +emendate +emendation +emendator +emendatory +emender +emerald +emeraldine +emeraude +emerge +emergence +emergency +emergent +emergently +emergentness +Emerita +emerited +emeritus +emerize +emerse +emersed +emersion +Emersonian +Emersonianism +Emery +emery +Emesa +Emesidae +emesis +emetatrophia +emetic +emetically +emetine +emetocathartic +emetology +emetomorphine +emgalla +emication +emiction +emictory +emigrant +emigrate +emigration +emigrational +emigrationist +emigrative +emigrator +emigratory +emigree +Emil +Emilia +Emily +Emim +eminence +eminency +eminent +eminently +emir +emirate +emirship +emissarium +emissary +emissaryship +emissile +emission +emissive +emissivity +emit +emittent +emitter +Emm +Emma +emma +Emmanuel +emmarble +emmarvel +emmenagogic +emmenagogue +emmenic +emmeniopathy +emmenology +emmensite +Emmental +emmer +emmergoose +emmet +emmetrope +emmetropia +emmetropic +emmetropism +emmetropy +emodin +emollescence +emolliate +emollient +emoloa +emolument +emolumental +emolumentary +emote +emotion +emotionable +emotional +emotionalism +emotionalist +emotionality +emotionalization +emotionalize +emotionally +emotioned +emotionist +emotionize +emotionless +emotionlessness +emotive +emotively +emotiveness +emotivity +empacket +empaistic +empall +empanel +empanelment +empanoply +empaper +emparadise +emparchment +empark +empasm +empathic +empathically +empathize +empathy +Empedoclean +empeirema +Empeo +emperor +emperorship +empery +Empetraceae +empetraceous +Empetrum +emphases +emphasis +emphasize +emphatic +emphatical +emphatically +emphaticalness +emphlysis +emphractic +emphraxis +emphysema +emphysematous +emphyteusis +emphyteuta +emphyteutic +empicture +Empididae +Empidonax +empiecement +Empire +empire +empirema +empiric +empirical +empiricalness +empiricism +empiricist +empirics +empiriocritcism +empiriocritical +empiriological +empirism +empiristic +emplace +emplacement +emplane +emplastic +emplastration +emplastrum +emplectite +empleomania +employ +employability +employable +employed +employee +employer +employless +employment +emplume +empocket +empodium +empoison +empoisonment +emporetic +emporeutic +emporia +emporial +emporium +empower +empowerment +empress +emprise +emprosthotonic +emprosthotonos +emprosthotonus +empt +emptier +emptily +emptiness +emptings +emptins +emption +emptional +emptor +empty +emptyhearted +emptysis +empurple +Empusa +empyema +empyemic +empyesis +empyocele +empyreal +empyrean +empyreuma +empyreumatic +empyreumatical +empyreumatize +empyromancy +emu +emulable +emulant +emulate +emulation +emulative +emulatively +emulator +emulatory +emulatress +emulgence +emulgent +emulous +emulously +emulousness +emulsibility +emulsible +emulsifiability +emulsifiable +emulsification +emulsifier +emulsify +emulsin +emulsion +emulsionize +emulsive +emulsoid +emulsor +emunctory +emundation +emyd +Emydea +emydian +Emydidae +Emydinae +Emydosauria +emydosaurian +Emys +en +enable +enablement +enabler +enact +enactable +enaction +enactive +enactment +enactor +enactory +enaena +enage +Enajim +enalid +Enaliornis +enaliosaur +Enaliosauria +enaliosaurian +enallachrome +enallage +enaluron +enam +enamber +enambush +enamdar +enamel +enameler +enameling +enamelist +enamelless +enamellist +enameloma +enamelware +enamor +enamorato +enamored +enamoredness +enamorment +enamourment +enanguish +enanthem +enanthema +enanthematous +enanthesis +enantiobiosis +enantioblastic +enantioblastous +enantiomer +enantiomeride +enantiomorph +enantiomorphic +enantiomorphism +enantiomorphous +enantiomorphously +enantiomorphy +enantiopathia +enantiopathic +enantiopathy +enantiosis +enantiotropic +enantiotropy +enantobiosis +enapt +enarbor +enarbour +enarch +enarched +enargite +enarm +enarme +enarthrodia +enarthrodial +enarthrosis +enate +enatic +enation +enbrave +encaenia +encage +encake +encalendar +encallow +encamp +encampment +encanker +encanthis +encapsulate +encapsulation +encapsule +encarditis +encarnadine +encarnalize +encarpium +encarpus +encase +encasement +encash +encashable +encashment +encasserole +encastage +encatarrhaphy +encauma +encaustes +encaustic +encaustically +encave +encefalon +Encelia +encell +encenter +encephala +encephalalgia +Encephalartos +encephalasthenia +encephalic +encephalin +encephalitic +encephalitis +encephalocele +encephalocoele +encephalodialysis +encephalogram +encephalograph +encephalography +encephaloid +encephalolith +encephalology +encephaloma +encephalomalacia +encephalomalacosis +encephalomalaxis +encephalomeningitis +encephalomeningocele +encephalomere +encephalomeric +encephalometer +encephalometric +encephalomyelitis +encephalomyelopathy +encephalon +encephalonarcosis +encephalopathia +encephalopathic +encephalopathy +encephalophyma +encephalopsychesis +encephalopyosis +encephalorrhagia +encephalosclerosis +encephaloscope +encephaloscopy +encephalosepsis +encephalospinal +encephalothlipsis +encephalotome +encephalotomy +encephalous +enchain +enchainment +enchair +enchalice +enchannel +enchant +enchanter +enchanting +enchantingly +enchantingness +enchantment +enchantress +encharge +encharnel +enchase +enchaser +enchasten +Enchelycephali +enchequer +enchest +enchilada +enchiridion +Enchodontid +Enchodontidae +Enchodontoid +Enchodus +enchondroma +enchondromatous +enchondrosis +enchorial +enchurch +enchylema +enchylematous +enchymatous +enchytrae +enchytraeid +Enchytraeidae +Enchytraeus +encina +encinal +encincture +encinder +encinillo +encipher +encircle +encirclement +encircler +encist +encitadel +enclaret +enclasp +enclave +enclavement +enclisis +enclitic +enclitical +enclitically +encloak +encloister +enclose +encloser +enclosure +enclothe +encloud +encoach +encode +encoffin +encoignure +encoil +encolden +encollar +encolor +encolpion +encolumn +encomendero +encomia +encomiast +encomiastic +encomiastical +encomiastically +encomic +encomienda +encomiologic +encomium +encommon +encompass +encompasser +encompassment +encoop +encorbelment +encore +encoronal +encoronate +encoronet +encounter +encounterable +encounterer +encourage +encouragement +encourager +encouraging +encouragingly +encowl +encraal +encradle +encranial +encratic +Encratism +Encratite +encraty +encreel +encrimson +encrinal +encrinic +Encrinidae +encrinidae +encrinital +encrinite +encrinitic +encrinitical +encrinoid +Encrinoidea +Encrinus +encrisp +encroach +encroacher +encroachingly +encroachment +encrotchet +encrown +encrownment +encrust +encrustment +encrypt +encryption +encuirassed +encumber +encumberer +encumberingly +encumberment +encumbrance +encumbrancer +encup +encurl +encurtain +encushion +encyclic +encyclical +encyclopedia +encyclopediac +encyclopediacal +encyclopedial +encyclopedian +encyclopediast +encyclopedic +encyclopedically +encyclopedism +encyclopedist +encyclopedize +encyrtid +Encyrtidae +encyst +encystation +encystment +end +endable +endamage +endamageable +endamagement +endamask +endameba +endamebic +Endamoeba +endamoebiasis +endamoebic +Endamoebidae +endanger +endangerer +endangerment +endangium +endaortic +endaortitis +endarch +endarchy +endarterial +endarteritis +endarterium +endaspidean +endaze +endboard +endbrain +endear +endearance +endeared +endearedly +endearedness +endearing +endearingly +endearingness +endearment +endeavor +endeavorer +ended +endeictic +endellionite +endemial +endemic +endemically +endemicity +endemiological +endemiology +endemism +endenizen +ender +endere +endermatic +endermic +endermically +enderon +enderonic +endevil +endew +endgate +endiadem +endiaper +ending +endite +endive +endless +endlessly +endlessness +endlichite +endlong +endmatcher +endmost +endoabdominal +endoangiitis +endoaortitis +endoappendicitis +endoarteritis +endoauscultation +endobatholithic +endobiotic +endoblast +endoblastic +endobronchial +endobronchially +endobronchitis +endocannibalism +endocardiac +endocardial +endocarditic +endocarditis +endocardium +endocarp +endocarpal +endocarpic +endocarpoid +endocellular +endocentric +Endoceras +Endoceratidae +endoceratite +endoceratitic +endocervical +endocervicitis +endochondral +endochorion +endochorionic +endochrome +endochylous +endoclinal +endocline +endocoelar +endocoele +endocoeliac +endocolitis +endocolpitis +endocondensation +endocone +endoconidium +endocorpuscular +endocortex +endocranial +endocranium +endocrinal +endocrine +endocrinic +endocrinism +endocrinological +endocrinologist +endocrinology +endocrinopathic +endocrinopathy +endocrinotherapy +endocrinous +endocritic +endocycle +endocyclic +endocyemate +endocyst +endocystitis +endoderm +endodermal +endodermic +endodermis +endodontia +endodontic +endodontist +endodynamomorphic +endoenteritis +endoenzyme +endoesophagitis +endofaradism +endogalvanism +endogamic +endogamous +endogamy +endogastric +endogastrically +endogastritis +endogen +Endogenae +endogenesis +endogenetic +endogenic +endogenous +endogenously +endogeny +endoglobular +endognath +endognathal +endognathion +endogonidium +endointoxication +endokaryogamy +endolabyrinthitis +endolaryngeal +endolemma +endolumbar +endolymph +endolymphangial +endolymphatic +endolymphic +endolysin +endomastoiditis +endome +endomesoderm +endometrial +endometritis +endometrium +endometry +endomitosis +endomitotic +endomixis +endomorph +endomorphic +endomorphism +endomorphy +Endomyces +Endomycetaceae +endomysial +endomysium +endoneurial +endoneurium +endonuclear +endonucleolus +endoparasite +endoparasitic +Endoparasitica +endopathic +endopelvic +endopericarditis +endoperidial +endoperidium +endoperitonitis +endophagous +endophagy +endophasia +endophasic +endophlebitis +endophragm +endophragmal +Endophyllaceae +endophyllous +Endophyllum +endophytal +endophyte +endophytic +endophytically +endophytous +endoplasm +endoplasma +endoplasmic +endoplast +endoplastron +endoplastular +endoplastule +endopleura +endopleural +endopleurite +endopleuritic +endopod +endopodite +endopoditic +endoproct +Endoprocta +endoproctous +endopsychic +Endopterygota +endopterygote +endopterygotic +endopterygotism +endopterygotous +endorachis +endoral +endore +endorhinitis +endorsable +endorsation +endorse +endorsed +endorsee +endorsement +endorser +endorsingly +endosalpingitis +endosarc +endosarcode +endosarcous +endosclerite +endoscope +endoscopic +endoscopy +endosecretory +endosepsis +endosiphon +endosiphonal +endosiphonate +endosiphuncle +endoskeletal +endoskeleton +endosmometer +endosmometric +endosmosic +endosmosis +endosmotic +endosmotically +endosome +endosperm +endospermic +endospore +endosporium +endosporous +endoss +endosteal +endosteally +endosteitis +endosteoma +endosternite +endosternum +endosteum +endostitis +endostoma +endostome +endostosis +endostracal +endostracum +endostylar +endostyle +endostylic +endotheca +endothecal +endothecate +endothecial +endothecium +endothelia +endothelial +endothelioblastoma +endotheliocyte +endothelioid +endotheliolysin +endotheliolytic +endothelioma +endotheliomyoma +endotheliomyxoma +endotheliotoxin +endothelium +endothermal +endothermic +endothermous +endothermy +Endothia +endothoracic +endothorax +Endothrix +endothys +endotoxic +endotoxin +endotoxoid +endotracheitis +endotrachelitis +Endotrophi +endotrophic +endotys +endovaccination +endovasculitis +endovenous +endow +endower +endowment +endozoa +endpiece +Endromididae +Endromis +endue +enduement +endungeon +endura +endurability +endurable +endurableness +endurably +endurance +endurant +endure +endurer +enduring +enduringly +enduringness +endways +endwise +endyma +endymal +Endymion +endysis +Eneas +eneclann +enema +enemy +enemylike +enemyship +enepidermic +energeia +energesis +energetic +energetical +energetically +energeticalness +energeticist +energetics +energetistic +energic +energical +energid +energism +energist +energize +energizer +energumen +energumenon +energy +enervate +enervation +enervative +enervator +eneuch +eneugh +enface +enfacement +enfamous +enfasten +enfatico +enfeature +enfeeble +enfeeblement +enfeebler +enfelon +enfeoff +enfeoffment +enfester +enfetter +enfever +enfigure +enfilade +enfilading +enfile +enfiled +enflagellate +enflagellation +enflesh +enfleurage +enflower +enfoil +enfold +enfolden +enfolder +enfoldment +enfonced +enforce +enforceability +enforceable +enforced +enforcedly +enforcement +enforcer +enforcibility +enforcible +enforcingly +enfork +enfoul +enframe +enframement +enfranchisable +enfranchise +enfranchisement +enfranchiser +enfree +enfrenzy +enfuddle +enfurrow +engage +engaged +engagedly +engagedness +engagement +engager +engaging +engagingly +engagingness +engaol +engarb +engarble +engarland +engarment +engarrison +engastrimyth +engastrimythic +engaud +engaze +Engelmannia +engem +engender +engenderer +engenderment +engerminate +enghosted +engild +engine +engineer +engineering +engineership +enginehouse +engineless +enginelike +engineman +enginery +enginous +engird +engirdle +engirt +engjateigur +englacial +englacially +englad +engladden +Englander +Engler +Englerophoenix +Englifier +Englify +English +Englishable +Englisher +Englishhood +Englishism +Englishize +Englishly +Englishman +Englishness +Englishry +Englishwoman +englobe +englobement +engloom +englory +englut +englyn +engnessang +engobe +engold +engolden +engore +engorge +engorgement +engouled +engrace +engraff +engraft +engraftation +engrafter +engraftment +engrail +engrailed +engrailment +engrain +engrained +engrainedly +engrainer +engram +engramma +engrammatic +engrammic +engrandize +engrandizement +engraphia +engraphic +engraphically +engraphy +engrapple +engrasp +Engraulidae +Engraulis +engrave +engraved +engravement +engraver +engraving +engreen +engrieve +engroove +engross +engrossed +engrossedly +engrosser +engrossing +engrossingly +engrossingness +engrossment +enguard +engulf +engulfment +engyscope +engysseismology +Engystomatidae +enhallow +enhalo +enhamper +enhance +enhanced +enhancement +enhancer +enhancive +enharmonic +enharmonical +enharmonically +enhat +enhaunt +enhearse +enheart +enhearten +enhedge +enhelm +enhemospore +enherit +enheritage +enheritance +enhorror +enhunger +enhusk +Enhydra +Enhydrinae +Enhydris +enhydrite +enhydritic +enhydros +enhydrous +enhypostasia +enhypostasis +enhypostatic +enhypostatize +eniac +Enicuridae +Enid +Enif +enigma +enigmatic +enigmatical +enigmatically +enigmaticalness +enigmatist +enigmatization +enigmatize +enigmatographer +enigmatography +enigmatology +enisle +enjail +enjamb +enjambed +enjambment +enjelly +enjeopard +enjeopardy +enjewel +enjoin +enjoinder +enjoiner +enjoinment +enjoy +enjoyable +enjoyableness +enjoyably +enjoyer +enjoying +enjoyingly +enjoyment +enkerchief +enkernel +Enki +Enkidu +enkindle +enkindler +enkraal +enlace +enlacement +enlard +enlarge +enlargeable +enlargeableness +enlarged +enlargedly +enlargedness +enlargement +enlarger +enlarging +enlargingly +enlaurel +enleaf +enleague +enlevement +enlief +enlife +enlight +enlighten +enlightened +enlightenedly +enlightenedness +enlightener +enlightening +enlighteningly +enlightenment +enlink +enlinkment +enlist +enlisted +enlister +enlistment +enliven +enlivener +enlivening +enliveningly +enlivenment +enlock +enlodge +enlodgement +enmarble +enmask +enmass +enmesh +enmeshment +enmist +enmity +enmoss +enmuffle +enneacontahedral +enneacontahedron +ennead +enneadianome +enneadic +enneagon +enneagynous +enneahedral +enneahedria +enneahedron +enneapetalous +enneaphyllous +enneasemic +enneasepalous +enneaspermous +enneastyle +enneastylos +enneasyllabic +enneateric +enneatic +enneatical +ennerve +enniche +ennoble +ennoblement +ennobler +ennobling +ennoblingly +ennoic +ennomic +ennui +Enoch +Enochic +enocyte +enodal +enodally +enoil +enol +enolate +enolic +enolizable +enolization +enolize +enomania +enomaniac +enomotarch +enomoty +enophthalmos +enophthalmus +Enopla +enoplan +enoptromancy +enorganic +enorm +enormity +enormous +enormously +enormousness +Enos +enostosis +enough +enounce +enouncement +enow +enphytotic +enplane +enquicken +enquire +enquirer +enquiry +enrace +enrage +enraged +enragedly +enragement +enrange +enrank +enrapt +enrapture +enrapturer +enravish +enravishingly +enravishment +enray +enregiment +enregister +enregistration +enregistry +enrib +enrich +enricher +enriching +enrichingly +enrichment +enring +enrive +enrobe +enrobement +enrober +enrockment +enrol +enroll +enrolled +enrollee +enroller +enrollment +enrolment +enroot +enrough +enruin +enrut +ens +ensaffron +ensaint +ensample +ensand +ensandal +ensanguine +ensate +enscene +ensconce +enscroll +ensculpture +ense +enseam +enseat +enseem +ensellure +ensemble +ensepulcher +ensepulchre +enseraph +enserf +ensete +enshade +enshadow +enshawl +ensheathe +enshell +enshelter +enshield +enshrine +enshrinement +enshroud +Ensiferi +ensiform +ensign +ensigncy +ensignhood +ensignment +ensignry +ensignship +ensilage +ensilate +ensilation +ensile +ensilist +ensilver +ensisternum +ensky +enslave +enslavedness +enslavement +enslaver +ensmall +ensnare +ensnarement +ensnarer +ensnaring +ensnaringly +ensnarl +ensnow +ensorcelize +ensorcell +ensoul +enspell +ensphere +enspirit +enstamp +enstar +enstate +enstatite +enstatitic +enstatolite +ensteel +enstool +enstore +enstrengthen +ensuable +ensuance +ensuant +ensue +ensuer +ensuingly +ensulphur +ensure +ensurer +enswathe +enswathement +ensweep +entablature +entablatured +entablement +entach +entad +Entada +entail +entailable +entailer +entailment +ental +entame +Entamoeba +entamoebiasis +entamoebic +entangle +entangled +entangledly +entangledness +entanglement +entangler +entangling +entanglingly +entapophysial +entapophysis +entarthrotic +entasia +entasis +entelam +entelechy +entellus +Entelodon +entelodont +entempest +entemple +entente +Ententophil +entepicondylar +enter +enterable +enteraden +enteradenographic +enteradenography +enteradenological +enteradenology +enteral +enteralgia +enterate +enterauxe +enterclose +enterectomy +enterer +entergogenic +enteria +enteric +entericoid +entering +enteritidis +enteritis +entermete +enteroanastomosis +enterobiliary +enterocele +enterocentesis +enterochirurgia +enterochlorophyll +enterocholecystostomy +enterocinesia +enterocinetic +enterocleisis +enteroclisis +enteroclysis +Enterocoela +enterocoele +enterocoelic +enterocoelous +enterocolitis +enterocolostomy +enterocrinin +enterocyst +enterocystoma +enterodynia +enteroepiplocele +enterogastritis +enterogastrone +enterogenous +enterogram +enterograph +enterography +enterohelcosis +enterohemorrhage +enterohepatitis +enterohydrocele +enteroid +enterointestinal +enteroischiocele +enterokinase +enterokinesia +enterokinetic +enterolith +enterolithiasis +Enterolobium +enterology +enteromegalia +enteromegaly +enteromere +enteromesenteric +Enteromorpha +enteromycosis +enteromyiasis +enteron +enteroneuritis +enteroparalysis +enteroparesis +enteropathy +enteropexia +enteropexy +enterophthisis +enteroplasty +enteroplegia +enteropneust +Enteropneusta +enteropneustan +enteroptosis +enteroptotic +enterorrhagia +enterorrhaphy +enterorrhea +enteroscope +enterosepsis +enterospasm +enterostasis +enterostenosis +enterostomy +enterosyphilis +enterotome +enterotomy +enterotoxemia +enterotoxication +enterozoa +enterozoan +enterozoic +enterprise +enterpriseless +enterpriser +enterprising +enterprisingly +enterritoriality +entertain +entertainable +entertainer +entertaining +entertainingly +entertainingness +entertainment +enthalpy +entheal +enthelmintha +enthelminthes +enthelminthic +enthetic +enthral +enthraldom +enthrall +enthralldom +enthraller +enthralling +enthrallingly +enthrallment +enthralment +enthrone +enthronement +enthronization +enthronize +enthuse +enthusiasm +enthusiast +enthusiastic +enthusiastical +enthusiastically +enthusiastly +enthymematic +enthymematical +enthymeme +entia +entice +enticeable +enticeful +enticement +enticer +enticing +enticingly +enticingness +entifical +entification +entify +entincture +entire +entirely +entireness +entirety +entiris +entitative +entitatively +entitle +entitlement +entity +entoblast +entoblastic +entobranchiate +entobronchium +entocalcaneal +entocarotid +entocele +entocnemial +entocoele +entocoelic +entocondylar +entocondyle +entocondyloid +entocone +entoconid +entocornea +entocranial +entocuneiform +entocuniform +entocyemate +entocyst +entoderm +entodermal +entodermic +entogastric +entogenous +entoglossal +entohyal +entoil +entoilment +Entoloma +entomb +entombment +entomere +entomeric +entomic +entomical +entomion +entomogenous +entomoid +entomologic +entomological +entomologically +entomologist +entomologize +entomology +Entomophaga +entomophagan +entomophagous +Entomophila +entomophilous +entomophily +Entomophthora +Entomophthoraceae +entomophthoraceous +Entomophthorales +entomophthorous +entomophytous +Entomosporium +Entomostraca +entomostracan +entomostracous +entomotaxy +entomotomist +entomotomy +entone +entonement +entoolitic +entoparasite +entoparasitic +entoperipheral +entophytal +entophyte +entophytic +entophytically +entophytous +entopic +entopical +entoplasm +entoplastic +entoplastral +entoplastron +entopopliteal +Entoprocta +entoproctous +entopterygoid +entoptic +entoptical +entoptically +entoptics +entoptoscope +entoptoscopic +entoptoscopy +entoretina +entorganism +entosarc +entosclerite +entosphenal +entosphenoid +entosphere +entosternal +entosternite +entosternum +entothorax +entotic +Entotrophi +entotympanic +entourage +entozoa +entozoal +entozoan +entozoarian +entozoic +entozoological +entozoologically +entozoologist +entozoology +entozoon +entracte +entrail +entrails +entrain +entrainer +entrainment +entrammel +entrance +entrancedly +entrancement +entranceway +entrancing +entrancingly +entrant +entrap +entrapment +entrapper +entrappingly +entreasure +entreat +entreating +entreatingly +entreatment +entreaty +entree +entremets +entrench +entrenchment +entrepas +entrepot +entrepreneur +entrepreneurial +entrepreneurship +entresol +entrochite +entrochus +entropion +entropionize +entropium +entropy +entrough +entrust +entrustment +entry +entryman +entryway +enturret +entwine +entwinement +entwist +Entyloma +enucleate +enucleation +enucleator +Enukki +enumerable +enumerate +enumeration +enumerative +enumerator +enunciability +enunciable +enunciate +enunciation +enunciative +enunciatively +enunciator +enunciatory +enure +enuresis +enuretic +enurny +envapor +envapour +envassal +envassalage +envault +enveil +envelop +envelope +enveloper +envelopment +envenom +envenomation +enverdure +envermeil +enviable +enviableness +enviably +envied +envier +envineyard +envious +enviously +enviousness +environ +environage +environal +environic +environment +environmental +environmentalism +environmentalist +environmentally +environs +envisage +envisagement +envision +envolume +envoy +envoyship +envy +envying +envyingly +enwallow +enwiden +enwind +enwisen +enwoman +enwomb +enwood +enworthed +enwound +enwrap +enwrapment +enwreathe +enwrite +enwrought +enzone +enzootic +enzooty +enzym +enzymatic +enzyme +enzymic +enzymically +enzymologist +enzymology +enzymolysis +enzymolytic +enzymosis +enzymotic +eoan +Eoanthropus +Eocarboniferous +Eocene +Eodevonian +Eogaea +Eogaean +Eoghanacht +Eohippus +eolation +eolith +eolithic +Eomecon +eon +eonism +Eopalaeozoic +Eopaleozoic +eophyte +eophytic +eophyton +eorhyolite +eosate +Eosaurus +eoside +eosin +eosinate +eosinic +eosinoblast +eosinophile +eosinophilia +eosinophilic +eosinophilous +eosphorite +Eozoic +eozoon +eozoonal +epacmaic +epacme +epacrid +Epacridaceae +epacridaceous +Epacris +epact +epactal +epagoge +epagogic +epagomenae +epagomenal +epagomenic +epagomenous +epaleaceous +epalpate +epanadiplosis +Epanagoge +epanalepsis +epanaleptic +epanaphora +epanaphoral +epanastrophe +epanisognathism +epanisognathous +epanodos +epanody +Epanorthidae +epanorthosis +epanorthotic +epanthous +epapillate +epappose +eparch +eparchate +Eparchean +eparchial +eparchy +eparcuale +eparterial +epaule +epaulement +epaulet +epauleted +epauletted +epauliere +epaxial +epaxially +epedaphic +epee +epeeist +Epeira +epeiric +epeirid +Epeiridae +epeirogenesis +epeirogenetic +epeirogenic +epeirogeny +epeisodion +epembryonic +epencephal +epencephalic +epencephalon +ependyma +ependymal +ependyme +ependymitis +ependymoma +ependytes +epenthesis +epenthesize +epenthetic +epephragmal +epepophysial +epepophysis +epergne +eperotesis +Eperua +epexegesis +epexegetic +epexegetical +epexegetically +epha +ephah +epharmonic +epharmony +ephebe +ephebeion +ephebeum +ephebic +ephebos +ephebus +ephectic +Ephedra +Ephedraceae +ephedrine +ephelcystic +ephelis +Ephemera +ephemera +ephemerae +ephemeral +ephemerality +ephemerally +ephemeralness +ephemeran +ephemerid +Ephemerida +Ephemeridae +ephemerides +ephemeris +ephemerist +ephemeromorph +ephemeromorphic +ephemeron +Ephemeroptera +ephemerous +Ephesian +Ephesine +ephetae +ephete +ephetic +ephialtes +ephidrosis +ephippial +ephippium +ephod +ephor +ephoral +ephoralty +ephorate +ephoric +ephorship +ephorus +ephphatha +Ephraim +Ephraimite +Ephraimitic +Ephraimitish +Ephraitic +Ephrathite +Ephthalite +Ephthianura +ephthianure +Ephydra +ephydriad +ephydrid +Ephydridae +ephymnium +ephyra +ephyrula +epibasal +Epibaterium +epibatholithic +epibenthic +epibenthos +epiblast +epiblastema +epiblastic +epiblema +epibole +epibolic +epibolism +epiboly +epiboulangerite +epibranchial +epic +epical +epically +epicalyx +epicanthic +epicanthus +epicardia +epicardiac +epicardial +epicardium +epicarid +epicaridan +Epicaridea +Epicarides +epicarp +Epicauta +epicede +epicedial +epicedian +epicedium +epicele +epicene +epicenism +epicenity +epicenter +epicentral +epicentrum +Epiceratodus +epicerebral +epicheirema +epichil +epichile +epichilium +epichindrotic +epichirema +epichondrosis +epichordal +epichorial +epichoric +epichorion +epichoristic +Epichristian +epicism +epicist +epiclastic +epicleidian +epicleidium +epiclesis +epiclidal +epiclinal +epicly +epicnemial +Epicoela +epicoelar +epicoele +epicoelia +epicoeliac +epicoelian +epicoeloma +epicoelous +epicolic +epicondylar +epicondyle +epicondylian +epicondylic +epicontinental +epicoracohumeral +epicoracoid +epicoracoidal +epicormic +epicorolline +epicortical +epicostal +epicotyl +epicotyleal +epicotyledonary +epicranial +epicranium +epicranius +Epicrates +epicrisis +epicritic +epicrystalline +Epictetian +epicure +Epicurean +Epicureanism +epicurish +epicurishly +Epicurism +Epicurize +epicycle +epicyclic +epicyclical +epicycloid +epicycloidal +epicyemate +epicyesis +epicystotomy +epicyte +epideictic +epideictical +epideistic +epidemic +epidemical +epidemically +epidemicalness +epidemicity +epidemiographist +epidemiography +epidemiological +epidemiologist +epidemiology +epidemy +epidendral +epidendric +Epidendron +Epidendrum +epiderm +epiderma +epidermal +epidermatic +epidermatoid +epidermatous +epidermic +epidermical +epidermically +epidermidalization +epidermis +epidermization +epidermoid +epidermoidal +epidermolysis +epidermomycosis +Epidermophyton +epidermophytosis +epidermose +epidermous +epidesmine +epidialogue +epidiascope +epidiascopic +epidictic +epidictical +epididymal +epididymectomy +epididymis +epididymite +epididymitis +epididymodeferentectomy +epididymodeferential +epididymovasostomy +epidiorite +epidiorthosis +epidosite +epidote +epidotic +epidotiferous +epidotization +epidural +epidymides +epifascial +epifocal +epifolliculitis +Epigaea +epigamic +epigaster +epigastraeum +epigastral +epigastrial +epigastric +epigastrical +epigastriocele +epigastrium +epigastrocele +epigeal +epigean +epigeic +epigene +epigenesis +epigenesist +epigenetic +epigenetically +epigenic +epigenist +epigenous +epigeous +epiglottal +epiglottic +epiglottidean +epiglottiditis +epiglottis +epiglottitis +epignathous +epigonal +epigonation +epigone +Epigoni +epigonic +Epigonichthyidae +Epigonichthys +epigonium +epigonos +epigonous +Epigonus +epigram +epigrammatic +epigrammatical +epigrammatically +epigrammatism +epigrammatist +epigrammatize +epigrammatizer +epigraph +epigrapher +epigraphic +epigraphical +epigraphically +epigraphist +epigraphy +epiguanine +epigyne +epigynous +epigynum +epigyny +Epihippus +epihyal +epihydric +epihydrinic +epikeia +epiklesis +Epikouros +epilabrum +Epilachna +Epilachnides +epilamellar +epilaryngeal +epilate +epilation +epilatory +epilegomenon +epilemma +epilemmal +epilepsy +epileptic +epileptically +epileptiform +epileptogenic +epileptogenous +epileptoid +epileptologist +epileptology +epilimnion +epilobe +Epilobiaceae +Epilobium +epilogation +epilogic +epilogical +epilogist +epilogistic +epilogize +epilogue +Epimachinae +epimacus +epimandibular +epimanikia +Epimedium +Epimenidean +epimer +epimeral +epimere +epimeric +epimeride +epimerite +epimeritic +epimeron +epimerum +epimorphic +epimorphosis +epimysium +epimyth +epinaos +epinastic +epinastically +epinasty +epineolithic +Epinephelidae +Epinephelus +epinephrine +epinette +epineural +epineurial +epineurium +epinglette +epinicial +epinician +epinicion +epinine +epiopticon +epiotic +Epipactis +epipaleolithic +epiparasite +epiparodos +epipastic +epiperipheral +epipetalous +epiphanous +Epiphany +epipharyngeal +epipharynx +Epiphegus +epiphenomenal +epiphenomenalism +epiphenomenalist +epiphenomenon +epiphloedal +epiphloedic +epiphloeum +epiphonema +epiphora +epiphragm +epiphylline +epiphyllous +Epiphyllum +epiphysary +epiphyseal +epiphyseolysis +epiphysial +epiphysis +epiphysitis +epiphytal +epiphyte +epiphytic +epiphytical +epiphytically +epiphytism +epiphytology +epiphytotic +epiphytous +epipial +epiplankton +epiplanktonic +epiplasm +epiplasmic +epiplastral +epiplastron +epiplectic +epipleura +epipleural +epiplexis +epiploce +epiplocele +epiploic +epiploitis +epiploon +epiplopexy +epipodial +epipodiale +epipodite +epipoditic +epipodium +epipolic +epipolism +epipolize +epiprecoracoid +Epipsychidion +epipteric +epipterous +epipterygoid +epipubic +epipubis +epirhizous +epirogenic +epirogeny +Epirote +Epirotic +epirotulian +epirrhema +epirrhematic +epirrheme +episarcine +episcenium +episclera +episcleral +episcleritis +episcopable +episcopacy +Episcopal +episcopal +episcopalian +Episcopalianism +Episcopalianize +episcopalism +episcopality +Episcopally +episcopally +episcopate +episcopature +episcope +episcopicide +episcopization +episcopize +episcopolatry +episcotister +episematic +episepalous +episiocele +episiohematoma +episioplasty +episiorrhagia +episiorrhaphy +episiostenosis +episiotomy +episkeletal +episkotister +episodal +episode +episodial +episodic +episodical +episodically +epispadiac +epispadias +epispastic +episperm +epispermic +epispinal +episplenitis +episporangium +epispore +episporium +epistapedial +epistasis +epistatic +epistaxis +epistemic +epistemolog +epistemological +epistemologically +epistemologist +epistemology +epistemonic +epistemonical +epistemophilia +epistemophiliac +epistemophilic +episternal +episternalia +episternite +episternum +epistilbite +epistlar +epistle +epistler +epistolarian +epistolarily +epistolary +epistolatory +epistoler +epistolet +epistolic +epistolical +epistolist +epistolizable +epistolization +epistolize +epistolizer +epistolographer +epistolographic +epistolographist +epistolography +epistoma +epistomal +epistome +epistomian +epistroma +epistrophe +epistropheal +epistropheus +epistrophic +epistrophy +epistylar +epistyle +Epistylis +episyllogism +episynaloephe +episynthetic +episyntheton +epitactic +epitaph +epitapher +epitaphial +epitaphian +epitaphic +epitaphical +epitaphist +epitaphize +epitaphless +epitasis +epitela +epitendineum +epitenon +epithalamia +epithalamial +epithalamiast +epithalamic +epithalamion +epithalamium +epithalamize +epithalamus +epithalamy +epithalline +epitheca +epithecal +epithecate +epithecium +epithelia +epithelial +epithelioblastoma +epithelioceptor +epitheliogenetic +epithelioglandular +epithelioid +epitheliolysin +epitheliolysis +epitheliolytic +epithelioma +epitheliomatous +epitheliomuscular +epitheliosis +epitheliotoxin +epithelium +epithelization +epithelize +epitheloid +epithem +epithesis +epithet +epithetic +epithetical +epithetically +epithetician +epithetize +epitheton +epithumetic +epithyme +epithymetic +epithymetical +epitimesis +epitoke +epitomator +epitomatory +epitome +epitomic +epitomical +epitomically +epitomist +epitomization +epitomize +epitomizer +epitonic +Epitoniidae +epitonion +Epitonium +epitoxoid +epitrachelion +epitrichial +epitrichium +epitrite +epitritic +epitrochlea +epitrochlear +epitrochoid +epitrochoidal +epitrope +epitrophic +epitrophy +epituberculosis +epituberculous +epitympanic +epitympanum +epityphlitis +epityphlon +epiural +epivalve +epixylous +epizeuxis +Epizoa +epizoa +epizoal +epizoan +epizoarian +epizoic +epizoicide +epizoon +epizootic +epizootiology +epoch +epocha +epochal +epochally +epochism +epochist +epode +epodic +epollicate +Epomophorus +eponychium +eponym +eponymic +eponymism +eponymist +eponymize +eponymous +eponymus +eponymy +epoophoron +epopee +epopoean +epopoeia +epopoeist +epopt +epoptes +epoptic +epoptist +epornitic +epornitically +epos +Eppie +Eppy +Eproboscidea +epruinose +epsilon +Epsom +epsomite +Eptatretidae +Eptatretus +epulary +epulation +epulis +epulo +epuloid +epulosis +epulotic +epupillate +epural +epurate +epuration +epyllion +equability +equable +equableness +equably +equaeval +equal +equalable +equaling +equalist +equalitarian +equalitarianism +equality +equalization +equalize +equalizer +equalizing +equalling +equally +equalness +equangular +equanimity +equanimous +equanimously +equanimousness +equant +equatable +equate +equation +equational +equationally +equationism +equationist +equator +equatorial +equatorially +equatorward +equatorwards +equerry +equerryship +equestrial +equestrian +equestrianism +equestrianize +equestrianship +equestrienne +equianchorate +equiangle +equiangular +equiangularity +equianharmonic +equiarticulate +equiatomic +equiaxed +equiaxial +equibalance +equibiradiate +equicellular +equichangeable +equicohesive +equiconvex +equicostate +equicrural +equicurve +equid +equidense +equidensity +equidiagonal +equidifferent +equidimensional +equidistance +equidistant +equidistantial +equidistantly +equidistribution +equidiurnal +equidivision +equidominant +equidurable +equielliptical +equiexcellency +equiform +equiformal +equiformity +equiglacial +equigranular +equijacent +equilateral +equilaterally +equilibrant +equilibrate +equilibration +equilibrative +equilibrator +equilibratory +equilibria +equilibrial +equilibriate +equilibrio +equilibrious +equilibrist +equilibristat +equilibristic +equilibrity +equilibrium +equilibrize +equilobate +equilobed +equilocation +equilucent +equimodal +equimolar +equimolecular +equimomental +equimultiple +equinate +equine +equinecessary +equinely +equinia +equinity +equinoctial +equinoctially +equinovarus +equinox +equinumerally +equinus +equiomnipotent +equip +equipaga +equipage +equiparant +equiparate +equiparation +equipartile +equipartisan +equipartition +equiped +equipedal +equiperiodic +equipluve +equipment +equipoise +equipollence +equipollency +equipollent +equipollently +equipollentness +equiponderance +equiponderancy +equiponderant +equiponderate +equiponderation +equipostile +equipotent +equipotential +equipotentiality +equipper +equiprobabilism +equiprobabilist +equiprobability +equiproducing +equiproportional +equiproportionality +equiradial +equiradiate +equiradical +equirotal +equisegmented +Equisetaceae +equisetaceous +Equisetales +equisetic +Equisetum +equisided +equisignal +equisized +equison +equisonance +equisonant +equispaced +equispatial +equisufficiency +equisurface +equitable +equitableness +equitably +equitangential +equitant +equitation +equitative +equitemporal +equitemporaneous +equites +equitist +equitriangular +equity +equivalence +equivalenced +equivalency +equivalent +equivalently +equivaliant +equivalue +equivaluer +equivalve +equivalved +equivalvular +equivelocity +equivocacy +equivocal +equivocality +equivocally +equivocalness +equivocate +equivocatingly +equivocation +equivocator +equivocatory +equivoluminal +equivoque +equivorous +equivote +equoid +equoidean +equuleus +Equus +er +era +erade +eradiate +eradiation +eradicable +eradicant +eradicate +eradication +eradicative +eradicator +eradicatory +eradiculose +Eragrostis +eral +eranist +Eranthemum +Eranthis +erasable +erase +erased +erasement +eraser +erasion +Erasmian +Erasmus +Erastian +Erastianism +Erastianize +Erastus +erasure +Erava +erbia +erbium +erd +erdvark +ere +Erechtheum +Erechtheus +Erechtites +erect +erectable +erecter +erectile +erectility +erecting +erection +erective +erectly +erectness +erectopatent +erector +erelong +eremacausis +Eremian +eremic +eremital +eremite +eremiteship +eremitic +eremitical +eremitish +eremitism +Eremochaeta +eremochaetous +eremology +eremophyte +Eremopteris +Eremurus +erenach +erenow +erepsin +erept +ereptase +ereptic +ereption +erethic +erethisia +erethism +erethismic +erethistic +erethitic +Erethizon +Erethizontidae +Eretrian +erewhile +erewhiles +erg +ergal +ergamine +Ergane +ergasia +ergasterion +ergastic +ergastoplasm +ergastoplasmic +ergastulum +ergatandromorph +ergatandromorphic +ergatandrous +ergatandry +ergates +ergatocracy +ergatocrat +ergatogyne +ergatogynous +ergatogyny +ergatoid +ergatomorph +ergatomorphic +ergatomorphism +ergmeter +ergodic +ergogram +ergograph +ergographic +ergoism +ergology +ergomaniac +ergometer +ergometric +ergometrine +ergon +ergonovine +ergophile +ergophobia +ergophobiac +ergoplasm +ergostat +ergosterin +ergosterol +ergot +ergotamine +ergotaminine +ergoted +ergothioneine +ergotic +ergotin +ergotinine +ergotism +ergotist +ergotization +ergotize +ergotoxin +ergotoxine +ergusia +eria +Erian +Erianthus +Eric +eric +Erica +Ericaceae +ericaceous +ericad +erical +Ericales +ericetal +ericeticolous +ericetum +erichthus +erichtoid +ericineous +ericius +ericoid +ericolin +ericophyte +Eridanid +Erie +Erigenia +Erigeron +erigible +Eriglossa +eriglossate +erika +erikite +Erinaceidae +erinaceous +Erinaceus +erineum +erinite +Erinize +erinose +Eriobotrya +Eriocaulaceae +eriocaulaceous +Eriocaulon +Eriocomi +Eriodendron +Eriodictyon +erioglaucine +Eriogonum +eriometer +erionite +Eriophorum +Eriophyes +Eriophyidae +eriophyllous +Eriosoma +Eriphyle +Eristalis +eristic +eristical +eristically +Erithacus +Eritrean +erizo +erlking +Erma +Ermanaric +Ermani +Ermanrich +ermelin +ermine +ermined +erminee +ermines +erminites +erminois +erne +Ernest +Ernestine +erode +eroded +erodent +erodible +Erodium +erogeneity +erogenesis +erogenetic +erogenic +erogenous +erogeny +Eros +eros +erose +erosely +erosible +erosion +erosional +erosionist +erosive +erostrate +eroteme +erotesis +erotetic +erotic +erotica +erotical +erotically +eroticism +eroticize +eroticomania +erotism +erotogenesis +erotogenetic +erotogenic +erotogenicity +erotomania +erotomaniac +erotopath +erotopathic +erotopathy +Erotylidae +Erpetoichthys +erpetologist +err +errability +errable +errableness +errabund +errancy +errand +errant +Errantia +errantly +errantness +errantry +errata +erratic +erratical +erratically +erraticalness +erraticism +erraticness +erratum +errhine +erring +erringly +errite +erroneous +erroneously +erroneousness +error +errorful +errorist +errorless +ers +Ersar +ersatz +Erse +Ertebolle +erth +erthen +erthling +erthly +erubescence +erubescent +erubescite +eruc +Eruca +eruca +erucic +eruciform +erucin +erucivorous +eruct +eructance +eructation +eructative +eruction +erudit +erudite +eruditely +eruditeness +eruditical +erudition +eruditional +eruditionist +erugate +erugation +erugatory +erumpent +erupt +eruption +eruptional +eruptive +eruptively +eruptiveness +eruptivity +ervenholder +Ervipiame +Ervum +Erwinia +eryhtrism +Erymanthian +Eryngium +eryngo +Eryon +Eryops +Erysibe +Erysimum +erysipelas +erysipelatoid +erysipelatous +erysipeloid +Erysipelothrix +erysipelous +Erysiphaceae +Erysiphe +Erythea +erythema +erythematic +erythematous +erythemic +Erythraea +Erythraean +Erythraeidae +erythrasma +erythrean +erythremia +erythremomelalgia +erythrene +erythrin +Erythrina +erythrine +Erythrinidae +Erythrinus +erythrismal +erythristic +erythrite +erythritic +erythritol +erythroblast +erythroblastic +erythroblastosis +erythrocarpous +erythrocatalysis +Erythrochaete +erythrochroic +erythrochroism +erythroclasis +erythroclastic +erythrocyte +erythrocytic +erythrocytoblast +erythrocytolysin +erythrocytolysis +erythrocytolytic +erythrocytometer +erythrocytorrhexis +erythrocytoschisis +erythrocytosis +erythrodegenerative +erythrodermia +erythrodextrin +erythrogenesis +erythrogenic +erythroglucin +erythrogonium +erythroid +erythrol +erythrolein +erythrolitmin +erythrolysin +erythrolysis +erythrolytic +erythromelalgia +erythron +erythroneocytosis +Erythronium +erythronium +erythropenia +erythrophage +erythrophagous +erythrophilous +erythrophleine +erythrophobia +erythrophore +erythrophyll +erythrophyllin +erythropia +erythroplastid +erythropoiesis +erythropoietic +erythropsia +erythropsin +erythrorrhexis +erythroscope +erythrose +erythrosiderite +erythrosin +erythrosinophile +erythrosis +Erythroxylaceae +erythroxylaceous +erythroxyline +Erythroxylon +Erythroxylum +erythrozincite +erythrozyme +erythrulose +Eryx +es +esca +escadrille +escalade +escalader +escalado +escalan +escalate +Escalator +escalator +escalin +Escallonia +Escalloniaceae +escalloniaceous +escalop +escaloped +escambio +escambron +escapable +escapade +escapage +escape +escapee +escapeful +escapeless +escapement +escaper +escapingly +escapism +escapist +escarbuncle +escargatoire +escarole +escarp +escarpment +eschalot +eschar +eschara +escharine +escharoid +escharotic +eschatocol +eschatological +eschatologist +eschatology +escheat +escheatable +escheatage +escheatment +escheator +escheatorship +Escherichia +eschew +eschewal +eschewance +eschewer +Eschscholtzia +eschynite +esclavage +escoba +escobadura +escobilla +escobita +escolar +esconson +escopette +Escorial +escort +escortage +escortee +escortment +escribe +escritoire +escritorial +escrol +escropulo +escrow +escruage +escudo +Esculapian +esculent +esculetin +esculin +escutcheon +escutcheoned +escutellate +esdragol +Esdras +Esebrias +esemplastic +esemplasy +eseptate +esere +eserine +esexual +eshin +esiphonal +esker +Eskimauan +Eskimo +Eskimoic +Eskimoid +Eskimoized +Eskualdun +Eskuara +Esmeralda +Esmeraldan +esmeraldite +esne +esoanhydride +esocataphoria +Esocidae +esociform +esocyclic +esodic +esoenteritis +esoethmoiditis +esogastritis +esonarthex +esoneural +esophagal +esophagalgia +esophageal +esophagean +esophagectasia +esophagectomy +esophagi +esophagism +esophagismus +esophagitis +esophago +esophagocele +esophagodynia +esophagogastroscopy +esophagogastrostomy +esophagomalacia +esophagometer +esophagomycosis +esophagopathy +esophagoplasty +esophagoplegia +esophagoplication +esophagoptosis +esophagorrhagia +esophagoscope +esophagoscopy +esophagospasm +esophagostenosis +esophagostomy +esophagotome +esophagotomy +esophagus +esophoria +esophoric +Esopus +esoteric +esoterica +esoterical +esoterically +esotericism +esotericist +esoterics +esoterism +esoterist +esoterize +esotery +esothyropexy +esotrope +esotropia +esotropic +Esox +espacement +espadon +espalier +espantoon +esparcet +esparsette +esparto +espathate +espave +especial +especially +especialness +esperance +Esperantic +Esperantidist +Esperantido +Esperantism +Esperantist +Esperanto +espial +espichellite +espier +espinal +espingole +espinillo +espino +espionage +esplanade +esplees +esponton +espousal +espouse +espousement +espouser +Espriella +espringal +espundia +espy +esquamate +esquamulose +Esquiline +esquire +esquirearchy +esquiredom +esquireship +ess +essang +essay +essayer +essayette +essayical +essayish +essayism +essayist +essayistic +essayistical +essaylet +essed +Essedones +Esselen +Esselenian +essence +essency +Essene +Essenian +Essenianism +Essenic +Essenical +Essenis +Essenism +Essenize +essentia +essential +essentialism +essentialist +essentiality +essentialize +essentially +essentialness +essenwood +Essex +essexite +Essie +essling +essoin +essoinee +essoiner +essoinment +essonite +essorant +establish +establishable +established +establisher +establishment +establishmentarian +establishmentarianism +establishmentism +estacade +estadal +estadio +estado +estafette +estafetted +estamene +estamp +estampage +estampede +estampedero +estate +estatesman +esteem +esteemable +esteemer +Estella +ester +esterase +esterellite +esteriferous +esterification +esterify +esterization +esterize +esterlin +esterling +estevin +Esth +Esthacyte +esthematology +Esther +Estheria +estherian +Estheriidae +esthesia +esthesio +esthesioblast +esthesiogen +esthesiogenic +esthesiogeny +esthesiography +esthesiology +esthesiometer +esthesiometric +esthesiometry +esthesioneurosis +esthesiophysiology +esthesis +esthetology +esthetophore +esthiomene +estimable +estimableness +estimably +estimate +estimatingly +estimation +estimative +estimator +estipulate +estivage +estival +estivate +estivation +estivator +estmark +estoc +estoile +Estonian +estop +estoppage +estoppel +Estotiland +estovers +estrade +estradiol +estradiot +estragole +estrange +estrangedness +estrangement +estranger +estrapade +estray +estre +estreat +estrepe +estrepement +estriate +estriche +estrin +estriol +estrogen +estrogenic +estrone +estrous +estrual +estruate +estruation +estuarial +estuarine +estuary +estufa +estuous +estus +esugarization +esurience +esurient +esuriently +eta +etaballi +etacism +etacist +etalon +Etamin +etamine +etch +Etchareottine +etcher +Etchimin +etching +Eteoclus +Eteocretes +Eteocreton +eternal +eternalism +eternalist +eternalization +eternalize +eternally +eternalness +eternity +eternization +eternize +etesian +ethal +ethaldehyde +Ethan +ethanal +ethanamide +ethane +ethanedial +ethanediol +ethanedithiol +ethanethial +ethanethiol +Ethanim +ethanol +ethanolamine +ethanolysis +ethanoyl +Ethel +ethel +ethene +Etheneldeli +ethenic +ethenoid +ethenoidal +ethenol +ethenyl +Etheostoma +Etheostomidae +Etheostominae +etheostomoid +ether +etherate +ethereal +etherealism +ethereality +etherealization +etherealize +ethereally +etherealness +etherean +ethered +ethereous +Etheria +etheric +etherification +etheriform +etherify +Etheriidae +etherin +etherion +etherism +etherization +etherize +etherizer +etherolate +etherous +ethic +ethical +ethicalism +ethicality +ethically +ethicalness +ethician +ethicism +ethicist +ethicize +ethicoaesthetic +ethicophysical +ethicopolitical +ethicoreligious +ethicosocial +ethics +ethid +ethide +ethidene +ethine +ethiodide +ethionic +Ethiop +Ethiopia +Ethiopian +Ethiopic +ethiops +ethmofrontal +ethmoid +ethmoidal +ethmoiditis +ethmolachrymal +ethmolith +ethmomaxillary +ethmonasal +ethmopalatal +ethmopalatine +ethmophysal +ethmopresphenoidal +ethmosphenoid +ethmosphenoidal +ethmoturbinal +ethmoturbinate +ethmovomer +ethmovomerine +ethmyphitis +ethnal +ethnarch +ethnarchy +ethnic +ethnical +ethnically +ethnicism +ethnicist +ethnicize +ethnicon +ethnize +ethnobiological +ethnobiology +ethnobotanic +ethnobotanical +ethnobotanist +ethnobotany +ethnocentric +ethnocentrism +ethnocracy +ethnodicy +ethnoflora +ethnogenic +ethnogeny +ethnogeographer +ethnogeographic +ethnogeographical +ethnogeographically +ethnogeography +ethnographer +ethnographic +ethnographical +ethnographically +ethnographist +ethnography +ethnologer +ethnologic +ethnological +ethnologically +ethnologist +ethnology +ethnomaniac +ethnopsychic +ethnopsychological +ethnopsychology +ethnos +ethnotechnics +ethnotechnography +ethnozoological +ethnozoology +ethography +etholide +ethologic +ethological +ethology +ethonomic +ethonomics +ethopoeia +ethos +ethoxide +ethoxycaffeine +ethoxyl +ethrog +ethyl +ethylamide +ethylamine +ethylate +ethylation +ethylene +ethylenediamine +ethylenic +ethylenimine +ethylenoid +ethylhydrocupreine +ethylic +ethylidene +ethylidyne +ethylin +ethylmorphine +ethylsulphuric +ethyne +ethynyl +etiogenic +etiolate +etiolation +etiolin +etiolize +etiological +etiologically +etiologist +etiologue +etiology +etiophyllin +etioporphyrin +etiotropic +etiotropically +etiquette +etiquettical +etna +Etnean +Etonian +Etrurian +Etruscan +Etruscologist +Etruscology +Etta +Ettarre +ettle +etua +etude +etui +etym +etymic +etymography +etymologer +etymologic +etymological +etymologically +etymologicon +etymologist +etymologization +etymologize +etymology +etymon +etymonic +etypic +etypical +etypically +eu +Euahlayi +euangiotic +Euascomycetes +euaster +Eubacteriales +eubacterium +Eubasidii +Euboean +Euboic +Eubranchipus +eucaine +eucairite +eucalypt +eucalypteol +eucalyptian +eucalyptic +eucalyptography +eucalyptol +eucalyptole +Eucalyptus +eucalyptus +Eucarida +eucatropine +eucephalous +Eucharis +Eucharist +eucharistial +eucharistic +eucharistical +Eucharistically +eucharistically +eucharistize +Eucharitidae +Euchite +Euchlaena +euchlorhydria +euchloric +euchlorine +Euchlorophyceae +euchological +euchologion +euchology +Euchorda +euchre +euchred +euchroic +euchroite +euchromatic +euchromatin +euchrome +euchromosome +euchrone +Eucirripedia +euclase +Euclea +Eucleidae +Euclid +Euclidean +Euclideanism +Eucnemidae +eucolite +Eucommia +Eucommiaceae +eucone +euconic +Euconjugatae +Eucopepoda +Eucosia +eucosmid +Eucosmidae +eucrasia +eucrasite +eucrasy +eucrite +Eucryphia +Eucryphiaceae +eucryphiaceous +eucryptite +eucrystalline +euctical +eucyclic +eudaemon +eudaemonia +eudaemonic +eudaemonical +eudaemonics +eudaemonism +eudaemonist +eudaemonistic +eudaemonistical +eudaemonistically +eudaemonize +eudaemony +eudaimonia +eudaimonism +eudaimonist +Eudemian +Eudendrium +Eudeve +eudiagnostic +eudialyte +eudiaphoresis +eudidymite +eudiometer +eudiometric +eudiometrical +eudiometrically +eudiometry +eudipleural +Eudist +Eudora +Eudorina +Eudoxian +Eudromias +Eudyptes +Euergetes +euge +Eugene +eugenesic +eugenesis +eugenetic +Eugenia +eugenic +eugenical +eugenically +eugenicist +eugenics +Eugenie +eugenism +eugenist +eugenol +eugenolate +eugeny +Euglandina +Euglena +Euglenaceae +Euglenales +Euglenida +Euglenidae +Euglenineae +euglenoid +Euglenoidina +euglobulin +eugranitic +Eugregarinida +Eugubine +Eugubium +euharmonic +euhedral +euhemerism +euhemerist +euhemeristic +euhemeristically +euhemerize +euhyostylic +euhyostyly +euktolite +eulachon +Eulalia +eulalia +eulamellibranch +Eulamellibranchia +Eulamellibranchiata +Eulima +Eulimidae +eulogia +eulogic +eulogical +eulogically +eulogious +eulogism +eulogist +eulogistic +eulogistical +eulogistically +eulogium +eulogization +eulogize +eulogizer +eulogy +eulysite +eulytine +eulytite +Eumenes +eumenid +Eumenidae +Eumenidean +Eumenides +eumenorrhea +eumerism +eumeristic +eumerogenesis +eumerogenetic +eumeromorph +eumeromorphic +eumitosis +eumitotic +eumoiriety +eumoirous +Eumolpides +Eumolpus +eumorphous +eumycete +Eumycetes +eumycetic +Eunectes +Eunice +eunicid +Eunicidae +Eunomia +Eunomian +Eunomianism +eunomy +eunuch +eunuchal +eunuchism +eunuchize +eunuchoid +eunuchoidism +eunuchry +euomphalid +Euomphalus +euonym +euonymin +euonymous +Euonymus +euonymy +Euornithes +euornithic +Euorthoptera +euosmite +euouae +eupad +Eupanorthidae +Eupanorthus +eupathy +eupatoriaceous +eupatorin +Eupatorium +eupatory +eupatrid +eupatridae +eupepsia +eupepsy +eupeptic +eupepticism +eupepticity +Euphausia +Euphausiacea +euphausiid +Euphausiidae +Euphemia +euphemian +euphemious +euphemiously +euphemism +euphemist +euphemistic +euphemistical +euphemistically +euphemize +euphemizer +euphemous +euphemy +euphon +euphone +euphonetic +euphonetics +euphonia +euphonic +euphonical +euphonically +euphonicalness +euphonious +euphoniously +euphoniousness +euphonism +euphonium +euphonize +euphonon +euphonous +euphony +euphonym +Euphorbia +Euphorbiaceae +euphorbiaceous +euphorbium +euphoria +euphoric +euphory +Euphrasia +euphrasy +Euphratean +euphroe +Euphrosyne +Euphues +euphuism +euphuist +euphuistic +euphuistical +euphuistically +euphuize +Euphyllopoda +eupione +eupittonic +euplastic +Euplectella +Euplexoptera +Euplocomi +Euploeinae +euploid +euploidy +eupnea +Eupolidean +Eupolyzoa +eupolyzoan +Eupomatia +Eupomatiaceae +eupractic +eupraxia +Euprepia +Euproctis +eupsychics +Euptelea +Eupterotidae +eupyrchroite +eupyrene +eupyrion +Eurafric +Eurafrican +Euraquilo +Eurasian +Eurasianism +Eurasiatic +eureka +eurhodine +eurhodol +Eurindic +Euripidean +euripus +eurite +Euroaquilo +eurobin +Euroclydon +Europa +Europasian +European +Europeanism +Europeanization +Europeanize +Europeanly +Europeward +europium +Europocentric +Eurus +Euryalae +Euryale +Euryaleae +euryalean +Euryalida +euryalidan +Euryalus +eurybathic +eurybenthic +eurycephalic +eurycephalous +Eurycerotidae +Euryclea +Eurydice +Eurygaea +Eurygaean +eurygnathic +eurygnathism +eurygnathous +euryhaline +Eurylaimi +Eurylaimidae +eurylaimoid +Eurylaimus +Eurymus +euryon +Eurypelma +Eurypharyngidae +Eurypharynx +euryprognathous +euryprosopic +eurypterid +Eurypterida +eurypteroid +Eurypteroidea +Eurypterus +Eurypyga +Eurypygae +Eurypygidae +eurypylous +euryscope +Eurystheus +eurystomatous +eurythermal +eurythermic +eurythmic +eurythmical +eurythmics +eurythmy +eurytomid +Eurytomidae +Eurytus +euryzygous +Euscaro +Eusebian +Euselachii +Euskaldun +Euskara +Euskarian +Euskaric +Euskera +eusol +Euspongia +eusporangiate +Eustace +Eustachian +eustachium +Eustathian +eustatic +Eusthenopteron +eustomatous +eustyle +Eusuchia +eusuchian +eusynchite +Eutaenia +eutannin +eutaxic +eutaxite +eutaxitic +eutaxy +eutechnic +eutechnics +eutectic +eutectoid +Euterpe +Euterpean +eutexia +Euthamia +euthanasia +euthanasy +euthenics +euthenist +Eutheria +eutherian +euthermic +Euthycomi +euthycomic +Euthyneura +euthyneural +euthyneurous +euthytatic +euthytropic +eutomous +eutony +Eutopia +Eutopian +eutrophic +eutrophy +eutropic +eutropous +Eutychian +Eutychianism +euxanthate +euxanthic +euxanthone +euxenite +Euxine +Eva +evacuant +evacuate +evacuation +evacuative +evacuator +evacue +evacuee +evadable +evade +evader +evadingly +Evadne +evagation +evaginable +evaginate +evagination +evaluable +evaluate +evaluation +evaluative +evalue +Evan +evanesce +evanescence +evanescency +evanescent +evanescently +evanescible +evangel +evangelary +evangelian +evangeliarium +evangeliary +evangelical +evangelicalism +evangelicality +evangelically +evangelicalness +evangelican +evangelicism +evangelicity +Evangeline +evangelion +evangelism +evangelist +evangelistarion +evangelistarium +evangelistary +evangelistic +evangelistically +evangelistics +evangelistship +evangelium +evangelization +evangelize +evangelizer +Evaniidae +evanish +evanishment +evanition +evansite +evaporability +evaporable +evaporate +evaporation +evaporative +evaporativity +evaporator +evaporimeter +evaporize +evaporometer +evase +evasible +evasion +evasional +evasive +evasively +evasiveness +Eve +eve +Evea +evechurr +evection +evectional +Evehood +evejar +Eveless +evelight +Evelina +Eveline +evelong +Evelyn +even +evenblush +evendown +evener +evenfall +evenforth +evenglow +evenhanded +evenhandedly +evenhandedness +evening +evenlight +evenlong +evenly +evenmete +evenminded +evenmindedness +evenness +evens +evensong +event +eventful +eventfully +eventfulness +eventide +eventime +eventless +eventlessly +eventlessness +eventognath +Eventognathi +eventognathous +eventration +eventual +eventuality +eventualize +eventually +eventuate +eventuation +evenwise +evenworthy +eveque +ever +Everard +everbearer +everbearing +everbloomer +everblooming +everduring +everglade +evergreen +evergreenery +evergreenite +everlasting +everlastingly +everlastingness +everliving +evermore +Evernia +evernioid +eversible +eversion +eversive +eversporting +evert +evertebral +Evertebrata +evertebrate +evertile +evertor +everwhich +everwho +every +everybody +everyday +everydayness +everyhow +everylike +Everyman +everyman +everyness +everyone +everything +everywhen +everywhence +everywhere +everywhereness +everywheres +everywhither +evestar +evetide +eveweed +evict +eviction +evictor +evidence +evidencive +evident +evidential +evidentially +evidentiary +evidently +evidentness +evil +evildoer +evilhearted +evilly +evilmouthed +evilness +evilproof +evilsayer +evilspeaker +evilspeaking +evilwishing +evince +evincement +evincible +evincibly +evincingly +evincive +evirate +eviration +eviscerate +evisceration +evisite +evitable +evitate +evitation +evittate +evocable +evocate +evocation +evocative +evocatively +evocator +evocatory +evocatrix +Evodia +evoe +evoke +evoker +evolute +evolution +evolutional +evolutionally +evolutionary +evolutionism +evolutionist +evolutionize +evolutive +evolutoid +evolvable +evolve +evolvement +evolvent +evolver +Evonymus +evovae +evulgate +evulgation +evulse +evulsion +evzone +ewder +Ewe +ewe +ewelease +ewer +ewerer +ewery +ewry +ex +exacerbate +exacerbation +exacerbescence +exacerbescent +exact +exactable +exacter +exacting +exactingly +exactingness +exaction +exactitude +exactive +exactiveness +exactly +exactment +exactness +exactor +exactress +exadversum +exaggerate +exaggerated +exaggeratedly +exaggerating +exaggeratingly +exaggeration +exaggerative +exaggeratively +exaggerativeness +exaggerator +exaggeratory +exagitate +exagitation +exairesis +exalate +exalbuminose +exalbuminous +exallotriote +exalt +exaltation +exaltative +exalted +exaltedly +exaltedness +exalter +exam +examen +examinability +examinable +examinant +examinate +examination +examinational +examinationism +examinationist +examinative +examinator +examinatorial +examinatory +examine +examinee +examiner +examinership +examining +examiningly +example +exampleless +exampleship +exanimate +exanimation +exanthem +exanthema +exanthematic +exanthematous +exappendiculate +exarate +exaration +exarch +exarchal +exarchate +exarchateship +Exarchic +Exarchist +exarchist +exarchy +exareolate +exarillate +exaristate +exarteritis +exarticulate +exarticulation +exasperate +exasperated +exasperatedly +exasperater +exasperating +exasperatingly +exasperation +exasperative +exaspidean +Exaudi +exaugurate +exauguration +excalate +excalation +excalcarate +excalceate +excalceation +Excalibur +excamb +excamber +excambion +excandescence +excandescency +excandescent +excantation +excarnate +excarnation +excathedral +excaudate +excavate +excavation +excavationist +excavator +excavatorial +excavatory +excave +excecate +excecation +excedent +exceed +exceeder +exceeding +exceedingly +exceedingness +excel +excelente +excellence +excellency +excellent +excellently +excelsin +Excelsior +excelsior +excelsitude +excentral +excentric +excentrical +excentricity +except +exceptant +excepting +exception +exceptionable +exceptionableness +exceptionably +exceptional +exceptionality +exceptionally +exceptionalness +exceptionary +exceptionless +exceptious +exceptiousness +exceptive +exceptively +exceptiveness +exceptor +excerebration +excerpt +excerptible +excerption +excerptive +excerptor +excess +excessive +excessively +excessiveness +excessman +exchange +exchangeability +exchangeable +exchangeably +exchanger +Exchangite +Exchequer +exchequer +excide +excipient +exciple +Excipulaceae +excipular +excipule +excipuliform +excipulum +excircle +excisable +excise +exciseman +excisemanship +excision +excisor +excitability +excitable +excitableness +excitancy +excitant +excitation +excitative +excitator +excitatory +excite +excited +excitedly +excitedness +excitement +exciter +exciting +excitingly +excitive +excitoglandular +excitometabolic +excitomotion +excitomotor +excitomotory +excitomuscular +excitonutrient +excitor +excitory +excitosecretory +excitovascular +exclaim +exclaimer +exclaiming +exclaimingly +exclamation +exclamational +exclamative +exclamatively +exclamatorily +exclamatory +exclave +exclosure +excludable +exclude +excluder +excluding +excludingly +exclusion +exclusionary +exclusioner +exclusionism +exclusionist +exclusive +exclusively +exclusiveness +exclusivism +exclusivist +exclusivity +exclusory +Excoecaria +excogitable +excogitate +excogitation +excogitative +excogitator +excommunicable +excommunicant +excommunicate +excommunication +excommunicative +excommunicator +excommunicatory +exconjugant +excoriable +excoriate +excoriation +excoriator +excorticate +excortication +excrement +excremental +excrementary +excrementitial +excrementitious +excrementitiously +excrementitiousness +excrementive +excresce +excrescence +excrescency +excrescent +excrescential +excreta +excretal +excrete +excreter +excretes +excretion +excretionary +excretitious +excretive +excretory +excriminate +excruciable +excruciate +excruciating +excruciatingly +excruciation +excruciator +excubant +excudate +exculpable +exculpate +exculpation +exculpative +exculpatorily +exculpatory +excurrent +excurse +excursion +excursional +excursionary +excursioner +excursionism +excursionist +excursionize +excursive +excursively +excursiveness +excursory +excursus +excurvate +excurvated +excurvation +excurvature +excurved +excusability +excusable +excusableness +excusably +excusal +excusative +excusator +excusatory +excuse +excuseful +excusefully +excuseless +excuser +excusing +excusingly +excusive +excuss +excyst +excystation +excysted +excystment +exdelicto +exdie +exeat +execrable +execrableness +execrably +execrate +execration +execrative +execratively +execrator +execratory +executable +executancy +executant +execute +executed +executer +execution +executional +executioneering +executioner +executioneress +executionist +executive +executively +executiveness +executiveship +executor +executorial +executorship +executory +executress +executrices +executrix +executrixship +executry +exedent +exedra +exegeses +exegesis +exegesist +exegete +exegetic +exegetical +exegetically +exegetics +exegetist +exemplar +exemplaric +exemplarily +exemplariness +exemplarism +exemplarity +exemplary +exemplifiable +exemplification +exemplificational +exemplificative +exemplificator +exemplifier +exemplify +exempt +exemptible +exemptile +exemption +exemptionist +exemptive +exencephalia +exencephalic +exencephalous +exencephalus +exendospermic +exendospermous +exenterate +exenteration +exequatur +exequial +exequy +exercisable +exercise +exerciser +exercitant +exercitation +exercitor +exercitorial +exercitorian +exeresis +exergual +exergue +exert +exertion +exertionless +exertive +exes +exeunt +exfiguration +exfigure +exfiltration +exflagellate +exflagellation +exflect +exfodiate +exfodiation +exfoliate +exfoliation +exfoliative +exfoliatory +exgorgitation +exhalable +exhalant +exhalation +exhalatory +exhale +exhaust +exhausted +exhaustedly +exhaustedness +exhauster +exhaustibility +exhaustible +exhausting +exhaustingly +exhaustion +exhaustive +exhaustively +exhaustiveness +exhaustless +exhaustlessly +exhaustlessness +exheredate +exheredation +exhibit +exhibitable +exhibitant +exhibiter +exhibition +exhibitional +exhibitioner +exhibitionism +exhibitionist +exhibitionistic +exhibitionize +exhibitive +exhibitively +exhibitor +exhibitorial +exhibitorship +exhibitory +exhilarant +exhilarate +exhilarating +exhilaratingly +exhilaration +exhilarative +exhilarator +exhilaratory +exhort +exhortation +exhortative +exhortatively +exhortator +exhortatory +exhorter +exhortingly +exhumate +exhumation +exhumator +exhumatory +exhume +exhumer +exigence +exigency +exigent +exigenter +exigently +exigible +exiguity +exiguous +exiguously +exiguousness +exilarch +exilarchate +exile +exiledom +exilement +exiler +exilian +exilic +exility +eximious +eximiously +eximiousness +exinanite +exinanition +exindusiate +exinguinal +exist +existability +existence +existent +existential +existentialism +existentialist +existentialistic +existentialize +existentially +existently +exister +existibility +existible +existlessness +exit +exite +exition +exitus +exlex +exmeridian +Exmoor +exoarteritis +Exoascaceae +exoascaceous +Exoascales +Exoascus +Exobasidiaceae +Exobasidiales +Exobasidium +exocannibalism +exocardia +exocardiac +exocardial +exocarp +exocataphoria +exoccipital +exocentric +Exochorda +exochorion +exoclinal +exocline +exocoelar +exocoele +exocoelic +exocoelom +Exocoetidae +Exocoetus +exocolitis +exocone +exocrine +exoculate +exoculation +exocyclic +Exocyclica +Exocycloida +exode +exoderm +exodermis +exodic +exodist +exodontia +exodontist +exodos +exodromic +exodromy +exodus +exody +exoenzyme +exoenzymic +exoerythrocytic +exogamic +exogamous +exogamy +exogastric +exogastrically +exogastritis +exogen +Exogenae +exogenetic +exogenic +exogenous +exogenously +exogeny +exognathion +exognathite +Exogonium +Exogyra +exolemma +exometritis +exomion +exomis +exomologesis +exomorphic +exomorphism +exomphalos +exomphalous +exomphalus +Exon +exon +exonarthex +exoner +exonerate +exoneration +exonerative +exonerator +exoneural +Exonian +exonship +exopathic +exoperidium +exophagous +exophagy +exophasia +exophasic +exophoria +exophoric +exophthalmic +exophthalmos +exoplasm +exopod +exopodite +exopoditic +Exopterygota +exopterygotic +exopterygotism +exopterygotous +exorability +exorable +exorableness +exorbital +exorbitance +exorbitancy +exorbitant +exorbitantly +exorbitate +exorbitation +exorcisation +exorcise +exorcisement +exorciser +exorcism +exorcismal +exorcisory +exorcist +exorcistic +exorcistical +exordia +exordial +exordium +exordize +exorganic +exorhason +exormia +exornation +exosepsis +exoskeletal +exoskeleton +exosmic +exosmose +exosmosis +exosmotic +exosperm +exosporal +exospore +exosporium +exosporous +Exostema +exostome +exostosed +exostosis +exostotic +exostra +exostracism +exostracize +exoteric +exoterical +exoterically +exotericism +exoterics +exotheca +exothecal +exothecate +exothecium +exothermal +exothermic +exothermous +exotic +exotically +exoticalness +exoticism +exoticist +exoticity +exoticness +exotism +exotospore +exotoxic +exotoxin +exotropia +exotropic +exotropism +expalpate +expand +expanded +expandedly +expandedness +expander +expanding +expandingly +expanse +expansibility +expansible +expansibleness +expansibly +expansile +expansion +expansional +expansionary +expansionism +expansionist +expansive +expansively +expansiveness +expansivity +expansometer +expansure +expatiate +expatiater +expatiatingly +expatiation +expatiative +expatiator +expatiatory +expatriate +expatriation +expect +expectable +expectance +expectancy +expectant +expectantly +expectation +expectative +expectedly +expecter +expectingly +expective +expectorant +expectorate +expectoration +expectorative +expectorator +expede +expediate +expedience +expediency +expedient +expediential +expedientially +expedientist +expediently +expeditate +expeditation +expedite +expedited +expeditely +expediteness +expediter +expedition +expeditionary +expeditionist +expeditious +expeditiously +expeditiousness +expel +expellable +expellant +expellee +expeller +expend +expendability +expendable +expender +expendible +expenditor +expenditrix +expenditure +expense +expenseful +expensefully +expensefulness +expenseless +expensilation +expensive +expensively +expensiveness +expenthesis +expergefacient +expergefaction +experience +experienceable +experienced +experienceless +experiencer +experiencible +experient +experiential +experientialism +experientialist +experientially +experiment +experimental +experimentalism +experimentalist +experimentalize +experimentally +experimentarian +experimentation +experimentative +experimentator +experimented +experimentee +experimenter +experimentist +experimentize +experimently +expert +expertism +expertize +expertly +expertness +expertship +expiable +expiate +expiation +expiational +expiatist +expiative +expiator +expiatoriness +expiatory +expilate +expilation +expilator +expirable +expirant +expirate +expiration +expirator +expiratory +expire +expiree +expirer +expiring +expiringly +expiry +expiscate +expiscation +expiscator +expiscatory +explain +explainable +explainer +explaining +explainingly +explanate +explanation +explanative +explanatively +explanator +explanatorily +explanatoriness +explanatory +explant +explantation +explement +explemental +expletive +expletively +expletiveness +expletory +explicable +explicableness +explicate +explication +explicative +explicatively +explicator +explicatory +explicit +explicitly +explicitness +explodable +explode +exploded +explodent +exploder +exploit +exploitable +exploitage +exploitation +exploitationist +exploitative +exploiter +exploitive +exploiture +explorable +exploration +explorational +explorative +exploratively +explorativeness +explorator +exploratory +explore +explorement +explorer +exploring +exploringly +explosibility +explosible +explosion +explosionist +explosive +explosively +explosiveness +expone +exponence +exponency +exponent +exponential +exponentially +exponentiation +exponible +export +exportability +exportable +exportation +exporter +exposal +expose +exposed +exposedness +exposer +exposit +exposition +expositional +expositionary +expositive +expositively +expositor +expositorial +expositorially +expositorily +expositoriness +expository +expositress +expostulate +expostulating +expostulatingly +expostulation +expostulative +expostulatively +expostulator +expostulatory +exposure +expound +expoundable +expounder +express +expressable +expressage +expressed +expresser +expressibility +expressible +expressibly +expression +expressionable +expressional +expressionful +expressionism +expressionist +expressionistic +expressionless +expressionlessly +expressionlessness +expressive +expressively +expressiveness +expressivism +expressivity +expressless +expressly +expressman +expressness +expressway +exprimable +exprobrate +exprobration +exprobratory +expromission +expromissor +expropriable +expropriate +expropriation +expropriator +expugn +expugnable +expuition +expulsatory +expulse +expulser +expulsion +expulsionist +expulsive +expulsory +expunction +expunge +expungeable +expungement +expunger +expurgate +expurgation +expurgative +expurgator +expurgatorial +expurgatory +expurge +exquisite +exquisitely +exquisiteness +exquisitism +exquisitively +exradio +exradius +exrupeal +exsanguinate +exsanguination +exsanguine +exsanguineous +exsanguinity +exsanguinous +exsanguious +exscind +exscissor +exscriptural +exsculptate +exscutellate +exsect +exsectile +exsection +exsector +exsequatur +exsert +exserted +exsertile +exsertion +exship +exsibilate +exsibilation +exsiccant +exsiccatae +exsiccate +exsiccation +exsiccative +exsiccator +exsiliency +exsomatic +exspuition +exsputory +exstipulate +exstrophy +exsuccous +exsuction +exsufflate +exsufflation +exsufflicate +exsurge +exsurgent +extant +extemporal +extemporally +extemporalness +extemporaneity +extemporaneous +extemporaneously +extemporaneousness +extemporarily +extemporariness +extemporary +extempore +extemporization +extemporize +extemporizer +extend +extended +extendedly +extendedness +extender +extendibility +extendible +extending +extense +extensibility +extensible +extensibleness +extensile +extensimeter +extension +extensional +extensionist +extensity +extensive +extensively +extensiveness +extensometer +extensor +extensory +extensum +extent +extenuate +extenuating +extenuatingly +extenuation +extenuative +extenuator +extenuatory +exter +exterior +exteriorate +exterioration +exteriority +exteriorization +exteriorize +exteriorly +exteriorness +exterminable +exterminate +extermination +exterminative +exterminator +exterminatory +exterminatress +exterminatrix +exterminist +extern +external +externalism +externalist +externalistic +externality +externalization +externalize +externally +externals +externate +externation +externe +externity +externization +externize +externomedian +externum +exteroceptist +exteroceptive +exteroceptor +exterraneous +exterrestrial +exterritorial +exterritoriality +exterritorialize +exterritorially +extima +extinct +extinction +extinctionist +extinctive +extinctor +extine +extinguish +extinguishable +extinguishant +extinguished +extinguisher +extinguishment +extipulate +extirpate +extirpation +extirpationist +extirpative +extirpator +extirpatory +extispex +extispicious +extispicy +extogenous +extol +extoll +extollation +extoller +extollingly +extollment +extolment +extoolitic +extorsive +extorsively +extort +extorter +extortion +extortionary +extortionate +extortionately +extortioner +extortionist +extortive +extra +extrabold +extrabranchial +extrabronchial +extrabuccal +extrabulbar +extrabureau +extraburghal +extracalendar +extracalicular +extracanonical +extracapsular +extracardial +extracarpal +extracathedral +extracellular +extracellularly +extracerebral +extracivic +extracivically +extraclassroom +extraclaustral +extracloacal +extracollegiate +extracolumella +extraconscious +extraconstellated +extraconstitutional +extracorporeal +extracorpuscular +extracosmic +extracosmical +extracostal +extracranial +extract +extractable +extractant +extracted +extractible +extractiform +extraction +extractive +extractor +extractorship +extracultural +extracurial +extracurricular +extracurriculum +extracutaneous +extracystic +extradecretal +extradialectal +extraditable +extradite +extradition +extradomestic +extrados +extradosed +extradotal +extraduction +extradural +extraembryonic +extraenteric +extraepiphyseal +extraequilibrium +extraessential +extraessentially +extrafascicular +extrafloral +extrafocal +extrafoliaceous +extraforaneous +extraformal +extragalactic +extragastric +extrait +extrajudicial +extrajudicially +extralateral +extralite +extrality +extramarginal +extramatrical +extramedullary +extramental +extrameridian +extrameridional +extrametaphysical +extrametrical +extrametropolitan +extramodal +extramolecular +extramorainal +extramorainic +extramoral +extramoralist +extramundane +extramural +extramurally +extramusical +extranational +extranatural +extranean +extraneity +extraneous +extraneously +extraneousness +extranidal +extranormal +extranuclear +extraocular +extraofficial +extraoral +extraorbital +extraorbitally +extraordinarily +extraordinariness +extraordinary +extraorganismal +extraovate +extraovular +extraparenchymal +extraparental +extraparietal +extraparliamentary +extraparochial +extraparochially +extrapatriarchal +extrapelvic +extraperineal +extraperiodic +extraperiosteal +extraperitoneal +extraphenomenal +extraphysical +extraphysiological +extrapituitary +extraplacental +extraplanetary +extrapleural +extrapoetical +extrapolar +extrapolate +extrapolation +extrapolative +extrapolator +extrapopular +extraprofessional +extraprostatic +extraprovincial +extrapulmonary +extrapyramidal +extraquiz +extrared +extraregarding +extraregular +extraregularly +extrarenal +extraretinal +extrarhythmical +extrasacerdotal +extrascholastic +extraschool +extrascientific +extrascriptural +extrascripturality +extrasensible +extrasensory +extrasensuous +extraserous +extrasocial +extrasolar +extrasomatic +extraspectral +extraspherical +extraspinal +extrastapedial +extrastate +extrasterile +extrastomachal +extrasyllabic +extrasyllogistic +extrasyphilitic +extrasystole +extrasystolic +extratabular +extratarsal +extratellurian +extratelluric +extratemporal +extratension +extratensive +extraterrene +extraterrestrial +extraterritorial +extraterritoriality +extraterritorially +extrathecal +extratheistic +extrathermodynamic +extrathoracic +extratorrid +extratracheal +extratribal +extratropical +extratubal +extratympanic +extrauterine +extravagance +extravagancy +extravagant +Extravagantes +extravagantly +extravagantness +extravaganza +extravagate +extravaginal +extravasate +extravasation +extravascular +extraventricular +extraversion +extravert +extravillar +extraviolet +extravisceral +extrazodiacal +extreme +extremeless +extremely +extremeness +extremism +extremist +extremistic +extremital +extremity +extricable +extricably +extricate +extricated +extrication +extrinsic +extrinsical +extrinsicality +extrinsically +extrinsicalness +extrinsicate +extrinsication +extroitive +extropical +extrorsal +extrorse +extrorsely +extrospect +extrospection +extrospective +extroversion +extroversive +extrovert +extrovertish +extrude +extruder +extruding +extrusile +extrusion +extrusive +extrusory +extubate +extubation +extumescence +extund +extusion +exuberance +exuberancy +exuberant +exuberantly +exuberantness +exuberate +exuberation +exudate +exudation +exudative +exude +exudence +exulcerate +exulceration +exulcerative +exulceratory +exult +exultance +exultancy +exultant +exultantly +exultation +exultet +exultingly +exululate +exumbral +exumbrella +exumbrellar +exundance +exundancy +exundate +exundation +exuviability +exuviable +exuviae +exuvial +exuviate +exuviation +exzodiacal +ey +eyah +eyalet +eyas +eye +eyeball +eyebalm +eyebar +eyebeam +eyeberry +eyeblink +eyebolt +eyebree +eyebridled +eyebright +eyebrow +eyecup +eyed +eyedness +eyedot +eyedrop +eyeflap +eyeful +eyeglance +eyeglass +eyehole +Eyeish +eyelash +eyeless +eyelessness +eyelet +eyeleteer +eyeletter +eyelid +eyelight +eyelike +eyeline +eyemark +eyen +eyepiece +eyepit +eyepoint +eyer +eyereach +eyeroot +eyesalve +eyeseed +eyeservant +eyeserver +eyeservice +eyeshade +eyeshield +eyeshot +eyesight +eyesome +eyesore +eyespot +eyestalk +eyestone +eyestrain +eyestring +eyetooth +eyewaiter +eyewash +eyewater +eyewear +eyewink +eyewinker +eyewitness +eyewort +eyey +eying +eyn +eyne +eyot +eyoty +eyra +eyre +eyrie +eyrir +ezba +Ezekiel +Ezra +F +f +fa +Faba +Fabaceae +fabaceous +fabella +fabes +Fabian +Fabianism +Fabianist +fabiform +fable +fabled +fabledom +fableist +fableland +fablemaker +fablemonger +fablemongering +fabler +fabliau +fabling +Fabraea +fabric +fabricant +fabricate +fabrication +fabricative +fabricator +fabricatress +Fabrikoid +fabrikoid +Fabronia +Fabroniaceae +fabular +fabulist +fabulosity +fabulous +fabulously +fabulousness +faburden +facadal +facade +face +faceable +facebread +facecloth +faced +faceless +facellite +facemaker +facemaking +faceman +facemark +facepiece +faceplate +facer +facet +facete +faceted +facetely +faceteness +facetiae +facetiation +facetious +facetiously +facetiousness +facewise +facework +facia +facial +facially +faciation +faciend +facient +facies +facile +facilely +facileness +facilitate +facilitation +facilitative +facilitator +facility +facing +facingly +facinorous +facinorousness +faciobrachial +faciocervical +faciolingual +facioplegia +facioscapulohumeral +fack +fackeltanz +fackings +fackins +facks +facsimile +facsimilist +facsimilize +fact +factable +factabling +factful +Factice +facticide +faction +factional +factionalism +factionary +factioneer +factionist +factionistism +factious +factiously +factiousness +factish +factitial +factitious +factitiously +factitive +factitively +factitude +factive +factor +factorability +factorable +factorage +factordom +factoress +factorial +factorially +factorist +factorization +factorize +factorship +factory +factoryship +factotum +factrix +factual +factuality +factually +factualness +factum +facture +facty +facula +facular +faculous +facultate +facultative +facultatively +facultied +facultize +faculty +facund +facy +fad +fadable +faddiness +faddish +faddishness +faddism +faddist +faddle +faddy +fade +fadeaway +faded +fadedly +fadedness +fadeless +faden +fader +fadge +fading +fadingly +fadingness +fadmonger +fadmongering +fadmongery +fadridden +fady +fae +faerie +Faeroe +faery +faeryland +faff +faffle +faffy +fag +Fagaceae +fagaceous +fagald +Fagales +Fagara +fage +Fagelia +fager +fagger +faggery +fagging +faggingly +fagine +fagopyrism +fagopyrismus +Fagopyrum +fagot +fagoter +fagoting +fagottino +fagottist +fagoty +Fagus +faham +fahlerz +fahlore +fahlunite +Fahrenheit +faience +fail +failing +failingly +failingness +faille +failure +fain +fainaigue +fainaiguer +faineance +faineancy +faineant +faineantism +fainly +fainness +fains +faint +fainter +faintful +faintheart +fainthearted +faintheartedly +faintheartedness +fainting +faintingly +faintish +faintishness +faintly +faintness +faints +fainty +faipule +fair +fairer +fairfieldite +fairgoer +fairgoing +fairgrass +fairground +fairily +fairing +fairish +fairishly +fairkeeper +fairlike +fairling +fairly +fairm +fairness +fairstead +fairtime +fairwater +fairway +fairy +fairydom +fairyfolk +fairyhood +fairyish +fairyism +fairyland +fairylike +fairyologist +fairyology +fairyship +faith +faithbreach +faithbreaker +faithful +faithfully +faithfulness +faithless +faithlessly +faithlessness +faithwise +faithworthiness +faithworthy +faitour +fake +fakement +faker +fakery +fakiness +fakir +fakirism +Fakofo +faky +falanaka +Falange +Falangism +Falangist +Falasha +falbala +falcade +Falcata +falcate +falcated +falcation +falcer +falces +falchion +falcial +Falcidian +falciform +Falcinellus +falciparum +Falco +falcon +falconbill +falconelle +falconer +Falcones +falconet +Falconidae +Falconiformes +Falconinae +falconine +falconlike +falconoid +falconry +falcopern +falcula +falcular +falculate +Falcunculus +faldage +falderal +faldfee +faldstool +Falerian +Falernian +Falerno +Faliscan +Falisci +Falkland +fall +fallace +fallacious +fallaciously +fallaciousness +fallacy +fallage +fallation +fallaway +fallback +fallectomy +fallen +fallenness +faller +fallfish +fallibility +fallible +fallibleness +fallibly +falling +Fallopian +fallostomy +fallotomy +fallow +fallowist +fallowness +falltime +fallway +fally +falsary +false +falsehearted +falseheartedly +falseheartedness +falsehood +falsely +falsen +falseness +falser +falsettist +falsetto +falsework +falsidical +falsie +falsifiable +falsificate +falsification +falsificator +falsifier +falsify +falsism +Falstaffian +faltboat +faltche +falter +falterer +faltering +falteringly +Falunian +Faluns +falutin +falx +fam +Fama +famatinite +famble +fame +fameflower +fameful +fameless +famelessly +famelessness +Fameuse +fameworthy +familia +familial +familiar +familiarism +familiarity +familiarization +familiarize +familiarizer +familiarizingly +familiarly +familiarness +familism +familist +familistery +familistic +familistical +family +familyish +famine +famish +famishment +famous +famously +famousness +famulary +famulus +Fan +fan +fana +fanal +fanam +fanatic +fanatical +fanatically +fanaticalness +fanaticism +fanaticize +fanback +fanbearer +fanciable +fancical +fancied +fancier +fanciful +fancifully +fancifulness +fancify +fanciless +fancy +fancymonger +fancysick +fancywork +fand +fandangle +fandango +fandom +fanega +fanegada +fanfarade +Fanfare +fanfare +fanfaron +fanfaronade +fanfaronading +fanflower +fanfoot +fang +fanged +fangle +fangled +fanglement +fangless +fanglet +fanglomerate +fangot +fangy +fanhouse +faniente +fanion +fanioned +fanlight +fanlike +fanmaker +fanmaking +fanman +fannel +fanner +Fannia +fannier +fanning +Fanny +fanon +fant +fantail +fantasia +fantasie +fantasied +fantasist +fantasque +fantassin +fantast +fantastic +fantastical +fantasticality +fantastically +fantasticalness +fantasticate +fantastication +fantasticism +fantasticly +fantasticness +fantastico +fantastry +fantasy +Fanti +fantigue +fantoccini +fantocine +fantod +fantoddish +Fanwe +fanweed +fanwise +fanwork +fanwort +fanwright +Fany +faon +Fapesmo +far +farad +faradaic +faraday +faradic +faradism +faradization +faradize +faradizer +faradmeter +faradocontractility +faradomuscular +faradonervous +faradopalpation +farandole +farasula +faraway +farawayness +farce +farcelike +farcer +farcetta +farcial +farcialize +farcical +farcicality +farcically +farcicalness +farcied +farcify +farcing +farcinoma +farcist +farctate +farcy +farde +fardel +fardelet +fardh +fardo +fare +farer +farewell +farfara +farfel +farfetched +farfetchedness +Farfugium +fargoing +fargood +farina +farinaceous +farinaceously +faring +farinometer +farinose +farinosely +farinulent +Farish +farish +farkleberry +farl +farleu +farm +farmable +farmage +farmer +farmeress +farmerette +farmerlike +farmership +farmery +farmhold +farmhouse +farmhousey +farming +farmost +farmplace +farmstead +farmsteading +farmtown +farmy +farmyard +farmyardy +farnesol +farness +Farnovian +faro +Faroeish +Faroese +farolito +farraginous +farrago +farrand +farrandly +farrantly +farreate +farreation +farrier +farrierlike +farriery +farrisite +farrow +farruca +farsalah +farse +farseeing +farseeingness +farseer +farset +Farsi +farsighted +farsightedly +farsightedness +farther +farthermost +farthest +farthing +farthingale +farthingless +farweltered +fasces +fascet +fascia +fascial +fasciate +fasciated +fasciately +fasciation +fascicle +fascicled +fascicular +fascicularly +fasciculate +fasciculated +fasciculately +fasciculation +fascicule +fasciculus +fascinate +fascinated +fascinatedly +fascinating +fascinatingly +fascination +fascinative +fascinator +fascinatress +fascine +fascinery +Fascio +fasciodesis +fasciola +fasciolar +Fasciolaria +Fasciolariidae +fasciole +fasciolet +fascioliasis +Fasciolidae +fascioloid +fascioplasty +fasciotomy +fascis +fascism +fascist +Fascista +Fascisti +fascisticization +fascisticize +fascistization +fascistize +fash +fasher +fashery +fashion +fashionability +fashionable +fashionableness +fashionably +fashioned +fashioner +fashionist +fashionize +fashionless +fashionmonger +fashionmonging +fashious +fashiousness +fasibitikite +fasinite +fass +fassalite +fast +fasten +fastener +fastening +faster +fastgoing +fasthold +fastidiosity +fastidious +fastidiously +fastidiousness +fastidium +fastigate +fastigated +fastigiate +fastigium +fasting +fastingly +fastish +fastland +fastness +fastuous +fastuously +fastuousness +fastus +fat +Fatagaga +fatal +fatalism +fatalist +fatalistic +fatalistically +fatality +fatalize +fatally +fatalness +fatbird +fatbrained +fate +fated +fateful +fatefully +fatefulness +fatelike +fathead +fatheaded +fatheadedness +fathearted +father +fathercraft +fathered +fatherhood +fatherland +fatherlandish +fatherless +fatherlessness +fatherlike +fatherliness +fatherling +fatherly +fathership +fathmur +fathom +fathomable +fathomage +fathomer +Fathometer +fathomless +fathomlessly +fathomlessness +fatidic +fatidical +fatidically +fatiferous +fatigability +fatigable +fatigableness +fatigue +fatigueless +fatiguesome +fatiguing +fatiguingly +fatiha +fatil +fatiloquent +Fatima +Fatimid +fatiscence +fatiscent +fatless +fatling +fatly +fatness +fatsia +fattable +fatten +fattenable +fattener +fatter +fattily +fattiness +fattish +fattishness +fattrels +fatty +fatuism +fatuitous +fatuitousness +fatuity +fatuoid +fatuous +fatuously +fatuousness +fatwood +faucal +faucalize +fauces +faucet +fauchard +faucial +faucitis +faucre +faugh +faujasite +fauld +Faulkland +fault +faultage +faulter +faultfind +faultfinder +faultfinding +faultful +faultfully +faultily +faultiness +faulting +faultless +faultlessly +faultlessness +faultsman +faulty +faun +Fauna +faunal +faunally +faunated +faunish +faunist +faunistic +faunistical +faunistically +faunlike +faunological +faunology +faunule +fause +faussebraie +faussebrayed +faust +Faustian +fauterer +fautor +fautorship +fauve +Fauvism +Fauvist +favaginous +favella +favellidium +favelloid +Faventine +faveolate +faveolus +faviform +favilla +favillous +favism +favissa +favn +favonian +Favonius +favor +favorable +favorableness +favorably +favored +favoredly +favoredness +favorer +favoress +favoring +favoringly +favorite +favoritism +favorless +favose +favosely +favosite +Favosites +Favositidae +favositoid +favous +favus +fawn +fawner +fawnery +fawning +fawningly +fawningness +fawnlike +fawnskin +fawny +fay +Fayal +fayalite +Fayettism +fayles +Fayumic +faze +fazenda +fe +feaberry +feague +feak +feal +fealty +fear +fearable +feared +fearedly +fearedness +fearer +fearful +fearfully +fearfulness +fearingly +fearless +fearlessly +fearlessness +fearnought +fearsome +fearsomely +fearsomeness +feasance +feasibility +feasible +feasibleness +feasibly +feasor +feast +feasten +feaster +feastful +feastfully +feastless +feat +feather +featherback +featherbed +featherbedding +featherbird +featherbone +featherbrain +featherbrained +featherdom +feathered +featheredge +featheredged +featherer +featherfew +featherfoil +featherhead +featherheaded +featheriness +feathering +featherleaf +featherless +featherlessness +featherlet +featherlike +featherman +feathermonger +featherpate +featherpated +featherstitch +featherstitching +feathertop +featherway +featherweed +featherweight +featherwing +featherwise +featherwood +featherwork +featherworker +feathery +featliness +featly +featness +featous +featural +featurally +feature +featured +featureful +featureless +featureliness +featurely +featy +feaze +feazings +febricant +febricide +febricity +febricula +febrifacient +febriferous +febrific +febrifugal +febrifuge +febrile +febrility +Febronian +Febronianism +Februarius +February +februation +fecal +fecalith +fecaloid +feces +Fechnerian +feck +feckful +feckfully +feckless +fecklessly +fecklessness +feckly +fecula +feculence +feculency +feculent +fecund +fecundate +fecundation +fecundative +fecundator +fecundatory +fecundify +fecundity +fecundize +fed +feddan +federacy +Federal +federal +federalism +federalist +federalization +federalize +federally +federalness +federate +federation +federationist +federatist +federative +federatively +federator +Fedia +Fedora +fee +feeable +feeble +feeblebrained +feeblehearted +feebleheartedly +feebleheartedness +feebleness +feebling +feeblish +feebly +feed +feedable +feedback +feedbin +feedboard +feedbox +feeder +feedhead +feeding +feedman +feedsman +feedstuff +feedway +feedy +feel +feelable +feeler +feeless +feeling +feelingful +feelingless +feelinglessly +feelingly +feelingness +feer +feere +feering +feetage +feetless +feeze +fefnicute +fegary +Fegatella +Fehmic +fei +feif +feigher +feign +feigned +feignedly +feignedness +feigner +feigning +feigningly +Feijoa +feil +feint +feis +feist +feisty +Felapton +feldsher +feldspar +feldsparphyre +feldspathic +feldspathization +feldspathoid +Felichthys +felicide +felicific +felicitate +felicitation +felicitator +felicitous +felicitously +felicitousness +felicity +felid +Felidae +feliform +Felinae +feline +felinely +felineness +felinity +felinophile +felinophobe +Felis +Felix +fell +fellable +fellage +fellah +fellaheen +fellahin +Fellani +Fellata +Fellatah +fellatio +fellation +fellen +feller +fellic +felliducous +fellifluous +felling +fellingbird +fellinic +fellmonger +fellmongering +fellmongery +fellness +felloe +fellow +fellowcraft +fellowess +fellowheirship +fellowless +fellowlike +fellowship +fellside +fellsman +felly +feloid +felon +feloness +felonious +feloniously +feloniousness +felonry +felonsetter +felonsetting +felonweed +felonwood +felonwort +felony +fels +felsite +felsitic +felsobanyite +felsophyre +felsophyric +felsosphaerite +felstone +felt +felted +felter +felting +feltlike +feltmaker +feltmaking +feltmonger +feltness +feltwork +feltwort +felty +feltyfare +felucca +Felup +felwort +female +femalely +femaleness +femality +femalize +Feme +feme +femerell +femic +femicide +feminacy +feminal +feminality +feminate +femineity +feminie +feminility +feminin +feminine +femininely +feminineness +femininism +femininity +feminism +feminist +feministic +feministics +feminity +feminization +feminize +feminologist +feminology +feminophobe +femora +femoral +femorocaudal +femorocele +femorococcygeal +femorofibular +femoropopliteal +femororotulian +femorotibial +femur +fen +fenbank +fenberry +fence +fenceful +fenceless +fencelessness +fencelet +fenceplay +fencer +fenceress +fenchene +fenchone +fenchyl +fencible +fencing +fend +fendable +fender +fendering +fenderless +fendillate +fendillation +fendy +feneration +fenestella +Fenestellidae +fenestra +fenestral +fenestrate +fenestrated +fenestration +fenestrato +fenestrule +Fenian +Fenianism +fenite +fenks +fenland +fenlander +fenman +fennec +fennel +fennelflower +fennig +fennish +Fennoman +fenny +fenouillet +Fenrir +fensive +fent +fenter +fenugreek +Fenzelia +feod +feodal +feodality +feodary +feodatory +feoff +feoffee +feoffeeship +feoffment +feoffor +feower +feracious +feracity +Ferae +Ferahan +feral +feralin +Feramorz +ferash +ferberite +Ferdiad +ferdwit +feretory +feretrum +ferfathmur +ferfet +ferganite +Fergus +fergusite +Ferguson +fergusonite +feria +ferial +feridgi +ferie +ferine +ferinely +ferineness +Feringi +Ferio +Ferison +ferity +ferk +ferling +ferly +fermail +Fermatian +ferme +ferment +fermentability +fermentable +fermentarian +fermentation +fermentative +fermentatively +fermentativeness +fermentatory +fermenter +fermentescible +fermentitious +fermentive +fermentology +fermentor +fermentum +fermerer +fermery +fermila +fermorite +fern +fernandinite +Fernando +fernbird +fernbrake +ferned +fernery +ferngale +ferngrower +fernland +fernleaf +fernless +fernlike +fernshaw +fernsick +ferntickle +ferntickled +fernwort +ferny +Ferocactus +ferocious +ferociously +ferociousness +ferocity +feroher +Feronia +ferrado +ferrament +Ferrara +Ferrarese +ferrate +ferrated +ferrateen +ferratin +ferrean +ferreous +ferret +ferreter +ferreting +ferretto +ferrety +ferri +ferriage +ferric +ferrichloride +ferricyanate +ferricyanhydric +ferricyanic +ferricyanide +ferricyanogen +ferrier +ferriferous +ferrihydrocyanic +ferriprussiate +ferriprussic +ferrite +ferritization +ferritungstite +ferrivorous +ferroalloy +ferroaluminum +ferroboron +ferrocalcite +ferrocerium +ferrochrome +ferrochromium +ferroconcrete +ferroconcretor +ferrocyanate +ferrocyanhydric +ferrocyanic +ferrocyanide +ferrocyanogen +ferroglass +ferrogoslarite +ferrohydrocyanic +ferroinclave +ferromagnesian +ferromagnetic +ferromagnetism +ferromanganese +ferromolybdenum +ferronatrite +ferronickel +ferrophosphorus +ferroprint +ferroprussiate +ferroprussic +ferrosilicon +ferrotitanium +ferrotungsten +ferrotype +ferrotyper +ferrous +ferrovanadium +ferrozirconium +ferruginate +ferrugination +ferruginean +ferruginous +ferrule +ferruler +ferrum +ferruminate +ferrumination +ferry +ferryboat +ferryhouse +ferryman +ferryway +ferthumlungur +Fertil +fertile +fertilely +fertileness +fertility +fertilizable +fertilization +fertilizational +fertilize +fertilizer +feru +ferula +ferulaceous +ferule +ferulic +fervanite +fervency +fervent +fervently +ferventness +fervescence +fervescent +fervid +fervidity +fervidly +fervidness +Fervidor +fervor +fervorless +Fesapo +Fescennine +fescenninity +fescue +fess +fessely +fesswise +fest +festal +festally +Feste +fester +festerment +festilogy +festinance +festinate +festinately +festination +festine +Festino +festival +festivally +festive +festively +festiveness +festivity +festivous +festology +festoon +festoonery +festoony +festuca +festucine +fet +fetal +fetalism +fetalization +fetation +fetch +fetched +fetcher +fetching +fetchingly +feteless +feterita +fetial +fetiales +fetichmonger +feticidal +feticide +fetid +fetidity +fetidly +fetidness +fetiferous +fetiparous +fetish +fetisheer +fetishic +fetishism +fetishist +fetishistic +fetishization +fetishize +fetishmonger +fetishry +fetlock +fetlocked +fetlow +fetography +fetometry +fetoplacental +fetor +fetter +fetterbush +fetterer +fetterless +fetterlock +fetticus +fettle +fettler +fettling +fetus +feu +feuage +feuar +feucht +feud +feudal +feudalism +feudalist +feudalistic +feudality +feudalizable +feudalization +feudalize +feudally +feudatorial +feudatory +feudee +feudist +feudovassalism +feued +Feuillants +feuille +feuilletonism +feuilletonist +feuilletonistic +feulamort +fever +feverberry +feverbush +fevercup +feveret +feverfew +fevergum +feverish +feverishly +feverishness +feverless +feverlike +feverous +feverously +feverroot +fevertrap +fevertwig +fevertwitch +feverweed +feverwort +few +fewness +fewsome +fewter +fewterer +fewtrils +fey +feyness +fez +Fezzan +fezzed +Fezziwig +fezzy +fi +fiacre +fiance +fiancee +fianchetto +Fianna +fiar +fiard +fiasco +fiat +fiatconfirmatio +fib +fibber +fibbery +fibdom +Fiber +fiber +fiberboard +fibered +Fiberglas +fiberize +fiberizer +fiberless +fiberware +fibration +fibreless +fibreware +fibriform +fibril +fibrilla +fibrillar +fibrillary +fibrillate +fibrillated +fibrillation +fibrilled +fibrilliferous +fibrilliform +fibrillose +fibrillous +fibrin +fibrinate +fibrination +fibrine +fibrinemia +fibrinoalbuminous +fibrinocellular +fibrinogen +fibrinogenetic +fibrinogenic +fibrinogenous +fibrinolysin +fibrinolysis +fibrinolytic +fibrinoplastic +fibrinoplastin +fibrinopurulent +fibrinose +fibrinosis +fibrinous +fibrinuria +fibroadenia +fibroadenoma +fibroadipose +fibroangioma +fibroareolar +fibroblast +fibroblastic +fibrobronchitis +fibrocalcareous +fibrocarcinoma +fibrocartilage +fibrocartilaginous +fibrocaseose +fibrocaseous +fibrocellular +fibrochondritis +fibrochondroma +fibrochondrosteal +fibrocrystalline +fibrocyst +fibrocystic +fibrocystoma +fibrocyte +fibroelastic +fibroenchondroma +fibrofatty +fibroferrite +fibroglia +fibroglioma +fibrohemorrhagic +fibroid +fibroin +fibrointestinal +fibroligamentous +fibrolipoma +fibrolipomatous +fibrolite +fibrolitic +fibroma +fibromata +fibromatoid +fibromatosis +fibromatous +fibromembrane +fibromembranous +fibromucous +fibromuscular +fibromyectomy +fibromyitis +fibromyoma +fibromyomatous +fibromyomectomy +fibromyositis +fibromyotomy +fibromyxoma +fibromyxosarcoma +fibroneuroma +fibronuclear +fibronucleated +fibropapilloma +fibropericarditis +fibroplastic +fibropolypus +fibropsammoma +fibropurulent +fibroreticulate +fibrosarcoma +fibrose +fibroserous +fibrosis +fibrositis +Fibrospongiae +fibrotic +fibrotuberculosis +fibrous +fibrously +fibrousness +fibrovasal +fibrovascular +fibry +fibster +fibula +fibulae +fibular +fibulare +fibulocalcaneal +Ficaria +ficary +fice +ficelle +fiche +Fichtean +Fichteanism +fichtelite +fichu +ficiform +fickle +ficklehearted +fickleness +ficklety +ficklewise +fickly +fico +ficoid +Ficoidaceae +Ficoideae +ficoides +fictation +fictile +fictileness +fictility +fiction +fictional +fictionalize +fictionally +fictionary +fictioneer +fictioner +fictionist +fictionistic +fictionization +fictionize +fictionmonger +fictious +fictitious +fictitiously +fictitiousness +fictive +fictively +Ficula +Ficus +fid +Fidac +fidalgo +fidate +fidation +fiddle +fiddleback +fiddlebrained +fiddlecome +fiddledeedee +fiddlefaced +fiddlehead +fiddleheaded +fiddler +fiddlerfish +fiddlery +fiddlestick +fiddlestring +fiddlewood +fiddley +fiddling +fide +fideicommiss +fideicommissary +fideicommission +fideicommissioner +fideicommissor +fideicommissum +fideism +fideist +fidejussion +fidejussionary +fidejussor +fidejussory +Fidele +Fidelia +Fidelio +fidelity +fidepromission +fidepromissor +Fides +Fidessa +fidfad +fidge +fidget +fidgeter +fidgetily +fidgetiness +fidgeting +fidgetingly +fidgety +Fidia +fidicinal +fidicinales +fidicula +Fido +fiducia +fiducial +fiducially +fiduciarily +fiduciary +fiducinales +fie +fiedlerite +fiefdom +field +fieldball +fieldbird +fielded +fielder +fieldfare +fieldish +fieldman +fieldpiece +fieldsman +fieldward +fieldwards +fieldwork +fieldworker +fieldwort +fieldy +fiend +fiendful +fiendfully +fiendhead +fiendish +fiendishly +fiendishness +fiendism +fiendlike +fiendliness +fiendly +fiendship +fient +Fierabras +Fierasfer +fierasferid +Fierasferidae +fierasferoid +fierce +fiercehearted +fiercely +fiercen +fierceness +fierding +fierily +fieriness +fiery +fiesta +fieulamort +Fife +fife +fifer +fifie +fifish +fifo +fifteen +fifteener +fifteenfold +fifteenth +fifteenthly +fifth +fifthly +fiftieth +fifty +fiftyfold +fig +figaro +figbird +figeater +figent +figged +figgery +figging +figgle +figgy +fight +fightable +fighter +fighteress +fighting +fightingly +fightwite +Figitidae +figless +figlike +figment +figmental +figpecker +figshell +figulate +figulated +figuline +figurability +figurable +figural +figurant +figurante +figurate +figurately +figuration +figurative +figuratively +figurativeness +figure +figured +figuredly +figurehead +figureheadless +figureheadship +figureless +figurer +figuresome +figurette +figurial +figurine +figurism +figurist +figurize +figury +figworm +figwort +Fiji +Fijian +fike +fikie +filace +filaceous +filacer +Filago +filament +filamentar +filamentary +filamented +filamentiferous +filamentoid +filamentose +filamentous +filamentule +filander +filanders +filao +filar +Filaria +filaria +filarial +filarian +filariasis +filaricidal +filariform +filariid +Filariidae +filarious +filasse +filate +filator +filature +filbert +filch +filcher +filchery +filching +filchingly +file +filefish +filelike +filemaker +filemaking +filemot +filer +filesmith +filet +filial +filiality +filially +filialness +filiate +filiation +filibeg +filibranch +Filibranchia +filibranchiate +filibuster +filibusterer +filibusterism +filibusterous +filical +Filicales +filicauline +Filices +filicic +filicidal +filicide +filiciform +filicin +Filicineae +filicinean +filicite +Filicites +filicologist +filicology +Filicornia +filiety +filiferous +filiform +filiformed +Filigera +filigerous +filigree +filing +filings +filionymic +filiopietistic +filioque +Filipendula +filipendulous +Filipina +Filipiniana +Filipinization +Filipinize +Filipino +filippo +filipuncture +filite +Filix +fill +fillable +filled +fillemot +filler +fillercap +fillet +filleter +filleting +filletlike +filletster +filleul +filling +fillingly +fillingness +fillip +fillipeen +fillister +fillmass +fillock +fillowite +filly +film +filmable +filmdom +filmet +filmgoer +filmgoing +filmic +filmiform +filmily +filminess +filmish +filmist +filmize +filmland +filmlike +filmogen +filmslide +filmstrip +filmy +filo +filoplumaceous +filoplume +filopodium +Filosa +filose +filoselle +fils +filter +filterability +filterable +filterableness +filterer +filtering +filterman +filth +filthify +filthily +filthiness +filthless +filthy +filtrability +filtrable +filtratable +filtrate +filtration +fimble +fimbria +fimbrial +fimbriate +fimbriated +fimbriation +fimbriatum +fimbricate +fimbricated +fimbrilla +fimbrillate +fimbrilliferous +fimbrillose +fimbriodentate +Fimbristylis +fimetarious +fimicolous +Fin +fin +finable +finableness +finagle +finagler +final +finale +finalism +finalist +finality +finalize +finally +finance +financial +financialist +financially +financier +financiery +financist +finback +finch +finchbacked +finched +finchery +find +findability +findable +findal +finder +findfault +finding +findjan +fine +fineable +finebent +fineish +fineleaf +fineless +finely +finement +fineness +finer +finery +finespun +finesse +finesser +finestill +finestiller +finetop +finfish +finfoot +Fingal +Fingall +Fingallian +fingent +finger +fingerable +fingerberry +fingerbreadth +fingered +fingerer +fingerfish +fingerflower +fingerhold +fingerhook +fingering +fingerleaf +fingerless +fingerlet +fingerlike +fingerling +fingernail +fingerparted +fingerprint +fingerprinting +fingerroot +fingersmith +fingerspin +fingerstall +fingerstone +fingertip +fingerwise +fingerwork +fingery +fingrigo +Fingu +finial +finialed +finical +finicality +finically +finicalness +finicism +finick +finickily +finickiness +finicking +finickingly +finickingness +finific +finify +Finiglacial +finikin +finiking +fining +finis +finish +finishable +finished +finisher +finishing +finite +finitely +finiteness +finitesimal +finitive +finitude +finity +finjan +fink +finkel +finland +Finlander +finless +finlet +finlike +Finmark +Finn +finnac +finned +finner +finnesko +Finnic +Finnicize +finnip +Finnish +finny +finochio +Fionnuala +fiord +fiorded +Fioretti +fiorin +fiorite +Fiot +fip +fipenny +fipple +fique +fir +Firbolg +firca +fire +fireable +firearm +firearmed +fireback +fireball +firebird +fireblende +fireboard +fireboat +firebolt +firebolted +firebote +firebox +fireboy +firebrand +firebrat +firebreak +firebrick +firebug +fireburn +firecoat +firecracker +firecrest +fired +firedamp +firedog +firedrake +firefall +firefang +firefanged +fireflaught +fireflirt +fireflower +firefly +fireguard +firehouse +fireless +firelight +firelike +fireling +firelit +firelock +fireman +firemanship +firemaster +fireplace +fireplug +firepower +fireproof +fireproofing +fireproofness +firer +fireroom +firesafe +firesafeness +firesafety +fireshaft +fireshine +fireside +firesider +firesideship +firespout +firestone +firestopping +firetail +firetop +firetrap +firewarden +firewater +fireweed +firewood +firework +fireworkless +fireworky +fireworm +firing +firk +firker +firkin +firlot +firm +firmament +firmamental +firman +firmance +firmer +firmhearted +firmisternal +Firmisternia +firmisternial +firmisternous +firmly +firmness +firn +Firnismalerei +Firoloida +firring +firry +first +firstcomer +firsthand +firstling +firstly +firstness +firstship +firth +fisc +fiscal +fiscalify +fiscalism +fiscalization +fiscalize +fiscally +fischerite +fise +fisetin +fish +fishable +fishback +fishbed +fishberry +fishbolt +fishbone +fisheater +fished +fisher +fisherboat +fisherboy +fisheress +fisherfolk +fishergirl +fisherman +fisherpeople +fisherwoman +fishery +fishet +fisheye +fishfall +fishful +fishgarth +fishgig +fishhood +fishhook +fishhooks +fishhouse +fishify +fishily +fishiness +fishing +fishingly +fishless +fishlet +fishlike +fishline +fishling +fishman +fishmonger +fishmouth +fishplate +fishpond +fishpool +fishpot +fishpotter +fishpound +fishskin +fishtail +fishway +fishweed +fishweir +fishwife +fishwoman +fishwood +fishworker +fishworks +fishworm +fishy +fishyard +fisnoga +fissate +fissicostate +fissidactyl +Fissidens +Fissidentaceae +fissidentaceous +fissile +fissileness +fissilingual +Fissilinguia +fissility +fission +fissionable +fissipalmate +fissipalmation +fissiparation +fissiparism +fissiparity +fissiparous +fissiparously +fissiparousness +fissiped +Fissipeda +fissipedal +fissipedate +Fissipedia +fissipedial +Fissipes +fissirostral +fissirostrate +Fissirostres +fissive +fissural +fissuration +fissure +fissureless +Fissurella +Fissurellidae +fissuriform +fissury +fist +fisted +fister +fistful +fistiana +fistic +fistical +fisticuff +fisticuffer +fisticuffery +fistify +fistiness +fisting +fistlike +fistmele +fistnote +fistuca +fistula +Fistulana +fistular +Fistularia +Fistulariidae +fistularioid +fistulate +fistulated +fistulatome +fistulatous +fistule +fistuliform +Fistulina +fistulize +fistulose +fistulous +fistwise +fisty +fit +fitch +fitched +fitchee +fitcher +fitchery +fitchet +fitchew +fitful +fitfully +fitfulness +fitly +fitment +fitness +fitout +fitroot +fittable +fittage +fitted +fittedness +fitten +fitter +fitters +fittily +fittiness +fitting +fittingly +fittingness +Fittonia +fitty +fittyfied +fittyways +fittywise +fitweed +Fitzclarence +Fitzroy +Fitzroya +Fiuman +five +fivebar +fivefold +fivefoldness +fiveling +fivepence +fivepenny +fivepins +fiver +fives +fivescore +fivesome +fivestones +fix +fixable +fixage +fixate +fixatif +fixation +fixative +fixator +fixature +fixed +fixedly +fixedness +fixer +fixidity +fixing +fixity +fixture +fixtureless +fixure +fizelyite +fizgig +fizz +fizzer +fizzle +fizzy +fjarding +fjeld +fjerding +Fjorgyn +flabbergast +flabbergastation +flabbily +flabbiness +flabby +flabellarium +flabellate +flabellation +flabellifoliate +flabelliform +flabellinerved +flabellum +flabrum +flaccid +flaccidity +flaccidly +flaccidness +flacherie +Flacian +Flacianism +Flacianist +flack +flacked +flacker +flacket +Flacourtia +Flacourtiaceae +flacourtiaceous +flaff +flaffer +flag +flagboat +flagellant +flagellantism +flagellar +Flagellaria +Flagellariaceae +flagellariaceous +Flagellata +Flagellatae +flagellate +flagellated +flagellation +flagellative +flagellator +flagellatory +flagelliferous +flagelliform +flagellist +flagellosis +flagellula +flagellum +flageolet +flagfall +flagger +flaggery +flaggily +flagginess +flagging +flaggingly +flaggish +flaggy +flagitate +flagitation +flagitious +flagitiously +flagitiousness +flagleaf +flagless +flaglet +flaglike +flagmaker +flagmaking +flagman +flagon +flagonet +flagonless +flagpole +flagrance +flagrancy +flagrant +flagrantly +flagrantness +flagroot +flagship +flagstaff +flagstick +flagstone +flagworm +flail +flaillike +flair +flaith +flaithship +flajolotite +flak +flakage +flake +flakeless +flakelet +flaker +flakily +flakiness +flaky +flam +Flamandization +Flamandize +flamant +flamb +flambeau +flambeaux +flamberg +flamboyance +flamboyancy +flamboyant +flamboyantism +flamboyantize +flamboyantly +flamboyer +flame +flamed +flameflower +flameless +flamelet +flamelike +flamen +flamenco +flamenship +flameproof +flamer +flamfew +flamineous +flaming +Flamingant +flamingly +flamingo +Flaminian +flaminica +flaminical +flammability +flammable +flammeous +flammiferous +flammulated +flammulation +flammule +flamy +flan +flancard +flanch +flanched +flanconade +flandan +flandowser +flane +flange +flangeless +flanger +flangeway +flank +flankard +flanked +flanker +flanking +flankwise +flanky +flannel +flannelbush +flanneled +flannelette +flannelflower +flannelleaf +flannelly +flannelmouth +flannelmouthed +flannels +flanque +flap +flapcake +flapdock +flapdoodle +flapdragon +flapjack +flapmouthed +flapper +flapperdom +flapperhood +flapperish +flapperism +flare +flareback +flareboard +flareless +flaring +flaringly +flary +flaser +flash +flashboard +flasher +flashet +flashily +flashiness +flashing +flashingly +flashlight +flashlike +flashly +flashness +flashover +flashpan +flashproof +flashtester +flashy +flask +flasker +flasket +flasklet +flasque +flat +flatboat +flatbottom +flatcap +flatcar +flatdom +flated +flatfish +flatfoot +flathat +flathead +flatiron +flatland +flatlet +flatling +flatly +flatman +flatness +flatnose +flatten +flattener +flattening +flatter +flatterable +flattercap +flatterdock +flatterer +flattering +flatteringly +flatteringness +flattery +flattie +flatting +flattish +flattop +flatulence +flatulency +flatulent +flatulently +flatulentness +flatus +flatware +flatway +flatways +flatweed +flatwise +flatwoods +flatwork +flatworm +Flaubertian +flaught +flaughter +flaunt +flaunter +flauntily +flauntiness +flaunting +flauntingly +flaunty +flautino +flautist +flavanilin +flavaniline +flavanthrene +flavanthrone +flavedo +Flaveria +flavescence +flavescent +Flavia +Flavian +flavic +flavicant +flavid +flavin +flavine +Flavius +flavo +Flavobacterium +flavone +flavoprotein +flavopurpurin +flavor +flavored +flavorer +flavorful +flavoring +flavorless +flavorous +flavorsome +flavory +flavour +flaw +flawed +flawflower +flawful +flawless +flawlessly +flawlessness +flawn +flawy +flax +flaxboard +flaxbush +flaxdrop +flaxen +flaxlike +flaxman +flaxseed +flaxtail +flaxweed +flaxwench +flaxwife +flaxwoman +flaxwort +flaxy +flay +flayer +flayflint +flea +fleabane +fleabite +fleadock +fleam +fleaseed +fleaweed +fleawood +fleawort +fleay +flebile +fleche +flechette +fleck +flecken +flecker +fleckiness +fleckled +fleckless +flecklessly +flecky +flecnodal +flecnode +flection +flectional +flectionless +flector +fled +fledge +fledgeless +fledgling +fledgy +flee +fleece +fleeceable +fleeced +fleeceflower +fleeceless +fleecelike +fleecer +fleech +fleechment +fleecily +fleeciness +fleecy +fleer +fleerer +fleering +fleeringly +fleet +fleeter +fleetful +fleeting +fleetingly +fleetingness +fleetings +fleetly +fleetness +fleetwing +Flem +Fleming +Flemish +flemish +flench +flense +flenser +flerry +flesh +fleshbrush +fleshed +fleshen +flesher +fleshful +fleshhood +fleshhook +fleshiness +fleshing +fleshings +fleshless +fleshlike +fleshlily +fleshliness +fleshly +fleshment +fleshmonger +fleshpot +fleshy +flet +Fleta +fletch +fletcher +Fletcherism +Fletcherite +Fletcherize +flether +fleuret +fleurettee +fleuronnee +fleury +flew +flewed +flewit +flews +flex +flexanimous +flexed +flexibility +flexible +flexibleness +flexibly +flexile +flexility +flexion +flexionless +flexor +flexuose +flexuosity +flexuous +flexuously +flexuousness +flexural +flexure +flexured +fley +fleyedly +fleyedness +fleyland +fleysome +flibbertigibbet +flicflac +flick +flicker +flickering +flickeringly +flickerproof +flickertail +flickery +flicky +flidder +flier +fligger +flight +flighted +flighter +flightful +flightily +flightiness +flighting +flightless +flightshot +flighty +flimflam +flimflammer +flimflammery +flimmer +flimp +flimsily +flimsiness +flimsy +flinch +flincher +flinching +flinchingly +flinder +Flindersia +flindosa +flindosy +fling +flinger +flingy +flinkite +flint +flinter +flinthearted +flintify +flintily +flintiness +flintless +flintlike +flintlock +flintwood +flintwork +flintworker +flinty +flioma +flip +flipe +flipjack +flippancy +flippant +flippantly +flippantness +flipper +flipperling +flippery +flirt +flirtable +flirtation +flirtational +flirtationless +flirtatious +flirtatiously +flirtatiousness +flirter +flirtigig +flirting +flirtingly +flirtish +flirtishness +flirtling +flirty +flisk +flisky +flit +flitch +flitchen +flite +flitfold +fliting +flitter +flitterbat +flittermouse +flittern +flitting +flittingly +flitwite +flivver +flix +flixweed +Flo +float +floatability +floatable +floatage +floatation +floatative +floatboard +floater +floatiness +floating +floatingly +floative +floatless +floatmaker +floatman +floatplane +floatsman +floatstone +floaty +flob +flobby +floc +floccillation +floccipend +floccose +floccosely +flocculable +flocculant +floccular +flocculate +flocculation +flocculator +floccule +flocculence +flocculency +flocculent +flocculently +flocculose +flocculus +floccus +flock +flocker +flocking +flockless +flocklike +flockman +flockmaster +flockowner +flockwise +flocky +flocoon +flodge +floe +floeberg +Floerkea +floey +flog +floggable +flogger +flogging +floggingly +flogmaster +flogster +flokite +flong +flood +floodable +floodage +floodboard +floodcock +flooded +flooder +floodgate +flooding +floodless +floodlet +floodlight +floodlighting +floodlike +floodmark +floodometer +floodproof +floodtime +floodwater +floodway +floodwood +floody +floor +floorage +floorcloth +floorer +floorhead +flooring +floorless +floorman +floorwalker +floorward +floorway +floorwise +floozy +flop +flophouse +flopover +flopper +floppers +floppily +floppiness +floppy +flopwing +Flora +flora +floral +Floralia +floralize +florally +floramor +floran +florate +floreal +floreate +Florence +florence +florent +Florentine +Florentinism +florentium +flores +florescence +florescent +floressence +floret +floreted +floretum +floriate +floriated +floriation +florican +floricin +floricultural +floriculturally +floriculture +floriculturist +florid +Florida +Floridan +Florideae +floridean +florideous +Floridian +floridity +floridly +floridness +floriferous +floriferously +floriferousness +florification +floriform +florigen +florigenic +florigraphy +florikan +floriken +florilegium +florimania +florimanist +florin +Florinda +floriparous +floripondio +floriscope +Florissant +florist +floristic +floristically +floristics +floristry +florisugent +florivorous +floroon +floroscope +florula +florulent +flory +floscular +Floscularia +floscularian +Flosculariidae +floscule +flosculose +flosculous +flosh +floss +flosser +flossflower +Flossie +flossification +flossing +flossy +flot +flota +flotage +flotant +flotation +flotative +flotilla +flotorial +flotsam +flounce +flouncey +flouncing +flounder +floundering +flounderingly +flour +flourish +flourishable +flourisher +flourishing +flourishingly +flourishment +flourishy +flourlike +floury +flouse +flout +flouter +flouting +floutingly +flow +flowable +flowage +flower +flowerage +flowered +flowerer +floweret +flowerful +flowerily +floweriness +flowering +flowerist +flowerless +flowerlessness +flowerlet +flowerlike +flowerpecker +flowerpot +flowerwork +flowery +flowing +flowingly +flowingness +flowmanostat +flowmeter +flown +flowoff +flu +fluate +fluavil +flub +flubdub +flubdubbery +flucan +fluctiferous +fluctigerous +fluctisonant +fluctisonous +fluctuability +fluctuable +fluctuant +fluctuate +fluctuation +fluctuosity +fluctuous +flue +flued +flueless +fluellen +fluellite +flueman +fluency +fluent +fluently +fluentness +fluer +fluework +fluey +fluff +fluffer +fluffily +fluffiness +fluffy +Flugelhorn +flugelman +fluible +fluid +fluidacetextract +fluidal +fluidally +fluidextract +fluidglycerate +fluidible +fluidic +fluidification +fluidifier +fluidify +fluidimeter +fluidism +fluidist +fluidity +fluidization +fluidize +fluidly +fluidness +fluidram +fluigram +fluitant +fluke +fluked +flukeless +flukeworm +flukewort +flukily +flukiness +fluking +fluky +flumdiddle +flume +flumerin +fluminose +flummadiddle +flummer +flummery +flummox +flummydiddle +flump +flung +flunk +flunker +flunkeydom +flunkeyhood +flunkeyish +flunkeyize +flunky +flunkydom +flunkyhood +flunkyish +flunkyism +flunkyistic +flunkyite +flunkyize +fluoaluminate +fluoaluminic +fluoarsenate +fluoborate +fluoboric +fluoborid +fluoboride +fluoborite +fluobromide +fluocarbonate +fluocerine +fluocerite +fluochloride +fluohydric +fluophosphate +fluor +fluoran +fluoranthene +fluorapatite +fluorate +fluorbenzene +fluorene +fluorenyl +fluoresage +fluoresce +fluorescein +fluorescence +fluorescent +fluorescigenic +fluorescigenous +fluorescin +fluorhydric +fluoric +fluoridate +fluoridation +fluoride +fluoridization +fluoridize +fluorimeter +fluorinate +fluorination +fluorindine +fluorine +fluorite +fluormeter +fluorobenzene +fluoroborate +fluoroform +fluoroformol +fluorogen +fluorogenic +fluorography +fluoroid +fluorometer +fluoroscope +fluoroscopic +fluoroscopy +fluorosis +fluorotype +fluorspar +fluoryl +fluosilicate +fluosilicic +fluotantalate +fluotantalic +fluotitanate +fluotitanic +fluozirconic +flurn +flurr +flurried +flurriedly +flurriment +flurry +flush +flushboard +flusher +flusherman +flushgate +flushing +flushingly +flushness +flushy +flusk +flusker +fluster +flusterate +flusteration +flusterer +flusterment +flustery +Flustra +flustrine +flustroid +flustrum +flute +flutebird +fluted +flutelike +flutemouth +fluter +flutework +Flutidae +flutina +fluting +flutist +flutter +flutterable +flutteration +flutterer +fluttering +flutteringly +flutterless +flutterment +fluttersome +fluttery +fluty +fluvial +fluvialist +fluviatic +fluviatile +fluvicoline +fluvioglacial +fluviograph +fluviolacustrine +fluviology +fluviomarine +fluviometer +fluviose +fluvioterrestrial +fluviovolcanic +flux +fluxation +fluxer +fluxibility +fluxible +fluxibleness +fluxibly +fluxile +fluxility +fluxion +fluxional +fluxionally +fluxionary +fluxionist +fluxmeter +fluxroot +fluxweed +fly +flyable +flyaway +flyback +flyball +flybane +flybelt +flyblow +flyblown +flyboat +flyboy +flycatcher +flyeater +flyer +flyflap +flyflapper +flyflower +flying +flyingly +flyleaf +flyless +flyman +flyness +flypaper +flype +flyproof +Flysch +flyspeck +flytail +flytier +flytrap +flyway +flyweight +flywheel +flywinch +flywort +Fo +foal +foalfoot +foalhood +foaly +foam +foambow +foamer +foamflower +foamily +foaminess +foaming +foamingly +foamless +foamlike +foamy +fob +focal +focalization +focalize +focally +focaloid +foci +focimeter +focimetry +focoids +focometer +focometry +focsle +focus +focusable +focuser +focusless +fod +fodda +fodder +fodderer +foddering +fodderless +foder +fodge +fodgel +fodient +Fodientia +foe +foehn +foehnlike +foeish +foeless +foelike +foeman +foemanship +Foeniculum +foenngreek +foeship +foetalization +fog +fogbound +fogbow +fogdog +fogdom +fogeater +fogey +fogfruit +foggage +fogged +fogger +foggily +fogginess +foggish +foggy +foghorn +fogle +fogless +fogman +fogo +fogon +fogou +fogproof +fogram +fogramite +fogramity +fogscoffer +fogus +fogy +fogydom +fogyish +fogyism +fohat +foible +foil +foilable +foiler +foiling +foilsman +foining +foiningly +Foism +foison +foisonless +Foist +foist +foister +foistiness +foisty +foiter +Fokker +fold +foldable +foldage +foldboat +foldcourse +folded +foldedly +folden +folder +folding +foldless +foldskirt +foldure +foldwards +foldy +fole +folgerite +folia +foliaceous +foliaceousness +foliage +foliaged +foliageous +folial +foliar +foliary +foliate +foliated +foliation +foliature +folie +foliicolous +foliiferous +foliiform +folio +foliobranch +foliobranchiate +foliocellosis +foliolate +foliole +folioliferous +foliolose +foliose +foliosity +foliot +folious +foliously +folium +folk +folkcraft +folkfree +folkland +folklore +folkloric +folklorish +folklorism +folklorist +folkloristic +folkmoot +folkmooter +folkmot +folkmote +folkmoter +folkright +folksiness +folksy +Folkvang +Folkvangr +folkway +folky +folles +folletage +follicle +follicular +folliculate +folliculated +follicule +folliculin +Folliculina +folliculitis +folliculose +folliculosis +folliculous +folliful +follis +follow +followable +follower +followership +following +followingly +folly +follyproof +Fomalhaut +foment +fomentation +fomenter +fomes +fomites +Fon +fondak +fondant +fondish +fondle +fondler +fondlesome +fondlike +fondling +fondlingly +fondly +fondness +fondu +fondue +fonduk +fonly +fonnish +fono +fons +font +Fontainea +fontal +fontally +fontanel +fontange +fonted +fontful +fonticulus +fontinal +Fontinalaceae +fontinalaceous +Fontinalis +fontlet +foo +Foochow +Foochowese +food +fooder +foodful +foodless +foodlessness +foodstuff +foody +foofaraw +fool +fooldom +foolery +fooless +foolfish +foolhardihood +foolhardily +foolhardiness +foolhardiship +foolhardy +fooling +foolish +foolishly +foolishness +foollike +foolocracy +foolproof +foolproofness +foolscap +foolship +fooner +fooster +foosterer +foot +footage +footback +football +footballer +footballist +footband +footblower +footboard +footboy +footbreadth +footbridge +footcloth +footed +footeite +footer +footfall +footfarer +footfault +footfolk +footful +footganger +footgear +footgeld +foothalt +foothill +foothold +foothook +foothot +footing +footingly +footings +footle +footler +footless +footlicker +footlight +footlights +footling +footlining +footlock +footmaker +footman +footmanhood +footmanry +footmanship +footmark +footnote +footnoted +footpace +footpad +footpaddery +footpath +footpick +footplate +footprint +footrail +footrest +footrill +footroom +footrope +foots +footscald +footslog +footslogger +footsore +footsoreness +footstalk +footstall +footstep +footstick +footstock +footstone +footstool +footwalk +footwall +footway +footwear +footwork +footworn +footy +fooyoung +foozle +foozler +fop +fopling +foppery +foppish +foppishly +foppishness +foppy +fopship +For +for +fora +forage +foragement +forager +foralite +foramen +foraminated +foramination +foraminifer +Foraminifera +foraminiferal +foraminiferan +foraminiferous +foraminose +foraminous +foraminulate +foraminule +foraminulose +foraminulous +forane +foraneen +foraneous +forasmuch +foray +forayer +forb +forbade +forbar +forbathe +forbear +forbearable +forbearance +forbearant +forbearantly +forbearer +forbearing +forbearingly +forbearingness +forbesite +forbid +forbiddable +forbiddal +forbiddance +forbidden +forbiddenly +forbiddenness +forbidder +forbidding +forbiddingly +forbiddingness +forbit +forbled +forblow +forbore +forborne +forbow +forby +force +forceable +forced +forcedly +forcedness +forceful +forcefully +forcefulness +forceless +forcemeat +forcement +forceps +forcepslike +forcer +forchase +forche +forcibility +forcible +forcibleness +forcibly +forcing +forcingly +forcipate +forcipated +forcipes +forcipiform +forcipressure +Forcipulata +forcipulate +forcleave +forconceit +ford +fordable +fordableness +fordays +Fordicidia +fording +fordless +fordo +fordone +fordwine +fordy +fore +foreaccounting +foreaccustom +foreacquaint +foreact +foreadapt +foreadmonish +foreadvertise +foreadvice +foreadvise +foreallege +foreallot +foreannounce +foreannouncement +foreanswer +foreappoint +foreappointment +forearm +foreassign +foreassurance +forebackwardly +forebay +forebear +forebemoan +forebemoaned +forebespeak +forebitt +forebitten +forebitter +forebless +foreboard +forebode +forebodement +foreboder +foreboding +forebodingly +forebodingness +forebody +foreboot +forebowels +forebowline +forebrace +forebrain +forebreast +forebridge +foreburton +forebush +forecar +forecarriage +forecast +forecaster +forecasting +forecastingly +forecastle +forecastlehead +forecastleman +forecatching +forecatharping +forechamber +forechase +forechoice +forechoose +forechurch +forecited +foreclaw +foreclosable +foreclose +foreclosure +forecome +forecomingness +forecommend +foreconceive +foreconclude +forecondemn +foreconscious +foreconsent +foreconsider +forecontrive +forecool +forecooler +forecounsel +forecount +forecourse +forecourt +forecover +forecovert +foredate +foredawn +foreday +foredeck +foredeclare +foredecree +foredeep +foredefeated +foredefine +foredenounce +foredescribe +foredeserved +foredesign +foredesignment +foredesk +foredestine +foredestiny +foredetermination +foredetermine +foredevised +foredevote +forediscern +foredispose +foredivine +foredone +foredoom +foredoomer +foredoor +foreface +forefather +forefatherly +forefault +forefeel +forefeeling +forefeelingly +forefelt +forefield +forefigure +forefin +forefinger +forefit +foreflank +foreflap +foreflipper +forefoot +forefront +foregallery +foregame +foreganger +foregate +foregift +foregirth +foreglance +foregleam +foreglimpse +foreglow +forego +foregoer +foregoing +foregone +foregoneness +foreground +foreguess +foreguidance +forehalf +forehall +forehammer +forehand +forehanded +forehandedness +forehandsel +forehard +forehatch +forehatchway +forehead +foreheaded +forehear +forehearth +foreheater +forehill +forehinting +forehold +forehood +forehoof +forehook +foreign +foreigneering +foreigner +foreignership +foreignism +foreignization +foreignize +foreignly +foreignness +foreimagination +foreimagine +foreimpressed +foreimpression +foreinclined +foreinstruct +foreintend +foreiron +forejudge +forejudgment +forekeel +foreking +foreknee +foreknow +foreknowable +foreknower +foreknowing +foreknowingly +foreknowledge +forel +forelady +foreland +forelay +foreleech +foreleg +forelimb +forelive +forellenstein +forelock +forelook +foreloop +forelooper +foreloper +foremade +foreman +foremanship +foremarch +foremark +foremartyr +foremast +foremasthand +foremastman +foremean +foremeant +foremelt +foremention +forementioned +foremessenger +foremilk +foremisgiving +foremistress +foremost +foremostly +foremother +forename +forenamed +forenews +forenight +forenoon +forenote +forenoted +forenotice +forenotion +forensal +forensic +forensical +forensicality +forensically +foreordain +foreordainment +foreorder +foreordinate +foreordination +foreorlop +forepad +forepale +foreparents +forepart +forepassed +forepast +forepaw +forepayment +forepeak +foreperiod +forepiece +foreplace +foreplan +foreplanting +forepole +foreporch +forepossessed +forepost +forepredicament +forepreparation +foreprepare +forepretended +foreproduct +foreproffer +forepromise +forepromised +foreprovided +foreprovision +forepurpose +forequarter +forequoted +foreran +forerank +forereach +forereaching +foreread +forereading +forerecited +forereckon +forerehearsed +foreremembered +forereport +forerequest +forerevelation +forerib +forerigging +foreright +foreroom +foreroyal +forerun +forerunner +forerunnership +forerunnings +foresaddle +foresaid +foresail +foresay +forescene +forescent +foreschool +foreschooling +forescript +foreseason +foreseat +foresee +foreseeability +foreseeable +foreseeingly +foreseer +foreseize +foresend +foresense +foresentence +foreset +foresettle +foresettled +foreshadow +foreshadower +foreshaft +foreshank +foreshape +foresheet +foreshift +foreship +foreshock +foreshoe +foreshop +foreshore +foreshorten +foreshortening +foreshot +foreshoulder +foreshow +foreshower +foreshroud +foreside +foresight +foresighted +foresightedness +foresightful +foresightless +foresign +foresignify +foresin +foresing +foresinger +foreskin +foreskirt +foresleeve +foresound +forespeak +forespecified +forespeed +forespencer +forest +forestaff +forestage +forestair +forestal +forestall +forestaller +forestallment +forestarling +forestate +forestation +forestay +forestaysail +forestcraft +forested +foresteep +forestem +forestep +forester +forestership +forestful +forestial +Forestian +forestick +Forestiera +forestine +forestish +forestless +forestlike +forestology +forestral +forestress +forestry +forestside +forestudy +forestwards +foresty +foresummer +foresummon +foresweat +foretack +foretackle +foretalk +foretalking +foretaste +foretaster +foretell +foretellable +foreteller +forethink +forethinker +forethought +forethoughted +forethoughtful +forethoughtfully +forethoughtfulness +forethoughtless +forethrift +foretime +foretimed +foretoken +foretold +foretop +foretopman +foretrace +foretrysail +foreturn +foretype +foretypified +foreuse +foreutter +forevalue +forever +forevermore +foreview +forevision +forevouch +forevouched +forevow +forewarm +forewarmer +forewarn +forewarner +forewarning +forewarningly +forewaters +foreween +foreweep +foreweigh +forewing +forewinning +forewisdom +forewish +forewoman +forewonted +foreword +foreworld +foreworn +forewritten +forewrought +foreyard +foreyear +forfairn +forfar +forfare +forfars +forfault +forfaulture +forfeit +forfeiter +forfeits +forfeiture +forfend +forficate +forficated +forfication +forficiform +Forficula +forficulate +Forficulidae +forfouchten +forfoughen +forfoughten +forgainst +forgather +forge +forgeability +forgeable +forged +forgedly +forgeful +forgeman +forger +forgery +forget +forgetful +forgetfully +forgetfulness +forgetive +forgetness +forgettable +forgetter +forgetting +forgettingly +forgie +forging +forgivable +forgivableness +forgivably +forgive +forgiveless +forgiveness +forgiver +forgiving +forgivingly +forgivingness +forgo +forgoer +forgot +forgotten +forgottenness +forgrow +forgrown +forhoo +forhooy +forhow +forinsec +forint +forisfamiliate +forisfamiliation +forjesket +forjudge +forjudger +fork +forkable +forkbeard +forked +forkedly +forkedness +forker +forkful +forkhead +forkiness +forkless +forklike +forkman +forksmith +forktail +forkwise +forky +forleft +forlet +forlorn +forlornity +forlornly +forlornness +form +formability +formable +formably +formagen +formagenic +formal +formalazine +formaldehyde +formaldehydesulphoxylate +formaldehydesulphoxylic +formaldoxime +formalesque +Formalin +formalism +formalist +formalistic +formalith +formality +formalization +formalize +formalizer +formally +formalness +formamide +formamidine +formamido +formamidoxime +formanilide +formant +format +formate +formation +formational +formative +formatively +formativeness +formature +formazyl +forme +formed +formedon +formee +formel +formene +formenic +former +formeret +formerly +formerness +formful +formiate +formic +Formica +formican +Formicariae +formicarian +Formicariidae +formicarioid +formicarium +formicaroid +formicary +formicate +formication +formicative +formicicide +formicid +Formicidae +formicide +Formicina +Formicinae +formicine +Formicivora +formicivorous +Formicoidea +formidability +formidable +formidableness +formidably +formin +forminate +forming +formless +formlessly +formlessness +Formol +formolite +formonitrile +Formosan +formose +formoxime +formula +formulable +formulae +formulaic +formular +formularism +formularist +formularistic +formularization +formularize +formulary +formulate +formulation +formulator +formulatory +formule +formulism +formulist +formulistic +formulization +formulize +formulizer +formwork +formy +formyl +formylal +formylate +formylation +fornacic +Fornax +fornaxid +fornenst +fornent +fornical +fornicate +fornicated +fornication +fornicator +fornicatress +fornicatrix +forniciform +forninst +fornix +forpet +forpine +forpit +forprise +forrad +forrard +forride +forrit +forritsome +forrue +forsake +forsaken +forsakenly +forsakenness +forsaker +forset +forslow +forsooth +forspeak +forspend +forspread +Forst +forsterite +forswear +forswearer +forsworn +forswornness +Forsythia +fort +fortalice +forte +fortescue +fortescure +forth +forthbring +forthbringer +forthcome +forthcomer +forthcoming +forthcomingness +forthcut +forthfare +forthfigured +forthgaze +forthgo +forthgoing +forthink +forthputting +forthright +forthrightly +forthrightness +forthrights +forthtell +forthteller +forthwith +forthy +forties +fortieth +fortifiable +fortification +fortifier +fortify +fortifying +fortifyingly +fortin +fortis +fortissimo +fortitude +fortitudinous +fortlet +fortnight +fortnightly +fortravail +fortread +fortress +fortuitism +fortuitist +fortuitous +fortuitously +fortuitousness +fortuity +fortunate +fortunately +fortunateness +fortune +fortuned +fortuneless +Fortunella +fortunetell +fortuneteller +fortunetelling +fortunite +forty +fortyfold +forum +forumize +forwander +forward +forwardal +forwardation +forwarder +forwarding +forwardly +forwardness +forwards +forwean +forweend +forwent +forwoden +forworden +fosh +fosie +Fosite +fossa +fossage +fossane +fossarian +fosse +fossed +fossette +fossick +fossicker +fossiform +fossil +fossilage +fossilated +fossilation +fossildom +fossiled +fossiliferous +fossilification +fossilify +fossilism +fossilist +fossilizable +fossilization +fossilize +fossillike +fossilogist +fossilogy +fossilological +fossilologist +fossilology +fossor +Fossores +Fossoria +fossorial +fossorious +fossula +fossulate +fossule +fossulet +fostell +Foster +foster +fosterable +fosterage +fosterer +fosterhood +fostering +fosteringly +fosterite +fosterland +fosterling +fostership +fostress +fot +fotch +fother +Fothergilla +fotmal +fotui +fou +foud +foudroyant +fouette +fougade +fougasse +fought +foughten +foughty +foujdar +foujdary +foul +foulage +foulard +fouler +fouling +foulish +foully +foulmouthed +foulmouthedly +foulmouthedness +foulness +foulsome +foumart +foun +found +foundation +foundational +foundationally +foundationary +foundationed +foundationer +foundationless +foundationlessness +founder +founderous +foundership +foundery +founding +foundling +foundress +foundry +foundryman +fount +fountain +fountained +fountaineer +fountainhead +fountainless +fountainlet +fountainous +fountainously +fountainwise +fountful +Fouquieria +Fouquieriaceae +fouquieriaceous +four +fourble +fourche +fourchee +fourcher +fourchette +fourchite +fourer +fourflusher +fourfold +Fourierian +Fourierism +Fourierist +Fourieristic +Fourierite +fourling +fourpence +fourpenny +fourpounder +fourre +fourrier +fourscore +foursome +foursquare +foursquarely +foursquareness +fourstrand +fourteen +fourteener +fourteenfold +fourteenth +fourteenthly +fourth +fourther +fourthly +foussa +foute +fouter +fouth +fovea +foveal +foveate +foveated +foveation +foveiform +foveola +foveolarious +foveolate +foveolated +foveole +foveolet +fow +fowk +fowl +fowler +fowlerite +fowlery +fowlfoot +fowling +fox +foxbane +foxberry +foxchop +foxer +foxery +foxfeet +foxfinger +foxfish +foxglove +foxhole +foxhound +foxily +foxiness +foxing +foxish +foxlike +foxproof +foxship +foxskin +foxtail +foxtailed +foxtongue +foxwood +foxy +foy +foyaite +foyaitic +foyboat +foyer +foziness +fozy +fra +frab +frabbit +frabjous +frabjously +frabous +fracas +fracedinous +frache +frack +fractable +fractabling +fracted +Fracticipita +fractile +fraction +fractional +fractionalism +fractionalize +fractionally +fractionary +fractionate +fractionating +fractionation +fractionator +fractionization +fractionize +fractionlet +fractious +fractiously +fractiousness +fractocumulus +fractonimbus +fractostratus +fractuosity +fracturable +fractural +fracture +fractureproof +frae +Fragaria +fraghan +Fragilaria +Fragilariaceae +fragile +fragilely +fragileness +fragility +fragment +fragmental +fragmentally +fragmentarily +fragmentariness +fragmentary +fragmentation +fragmented +fragmentist +fragmentitious +fragmentize +fragrance +fragrancy +fragrant +fragrantly +fragrantness +fraid +fraik +frail +frailejon +frailish +frailly +frailness +frailty +fraise +fraiser +Fram +framable +framableness +frambesia +frame +framea +frameable +frameableness +framed +frameless +framer +framesmith +framework +framing +frammit +frampler +frampold +franc +Frances +franchisal +franchise +franchisement +franchiser +Francic +Francis +francisc +francisca +Franciscan +Franciscanism +francium +Francize +franco +francolin +francolite +Francomania +Franconian +Francophile +Francophilism +Francophobe +Francophobia +frangent +Frangi +frangibility +frangible +frangibleness +frangipane +frangipani +frangula +Frangulaceae +frangulic +frangulin +frangulinic +Frank +frank +frankability +frankable +frankalmoign +Frankenia +Frankeniaceae +frankeniaceous +Frankenstein +franker +frankfurter +frankhearted +frankheartedly +frankheartedness +Frankify +frankincense +frankincensed +franking +Frankish +Frankist +franklandite +Franklin +franklin +Franklinia +Franklinian +Frankliniana +Franklinic +Franklinism +Franklinist +franklinite +Franklinization +frankly +frankmarriage +frankness +frankpledge +frantic +frantically +franticly +franticness +franzy +frap +frappe +frapping +frasco +frase +Frasera +frasier +frass +frat +fratch +fratched +fratcheous +fratcher +fratchety +fratchy +frater +Fratercula +fraternal +fraternalism +fraternalist +fraternality +fraternally +fraternate +fraternation +fraternism +fraternity +fraternization +fraternize +fraternizer +fratery +Fraticelli +Fraticellian +fratority +Fratricelli +fratricidal +fratricide +fratry +fraud +fraudful +fraudfully +fraudless +fraudlessly +fraudlessness +fraudproof +fraudulence +fraudulency +fraudulent +fraudulently +fraudulentness +fraughan +fraught +frawn +fraxetin +fraxin +fraxinella +Fraxinus +fray +frayed +frayedly +frayedness +fraying +frayn +frayproof +fraze +frazer +frazil +frazzle +frazzling +freak +freakdom +freakery +freakful +freakily +freakiness +freakish +freakishly +freakishness +freaky +fream +freath +freck +frecken +freckened +frecket +freckle +freckled +freckledness +freckleproof +freckling +frecklish +freckly +Fred +Freddie +Freddy +Frederic +Frederica +Frederick +frederik +fredricite +free +freeboard +freeboot +freebooter +freebootery +freebooting +freeborn +Freechurchism +freed +freedman +freedom +freedwoman +freehand +freehanded +freehandedly +freehandedness +freehearted +freeheartedly +freeheartedness +freehold +freeholder +freeholdership +freeholding +freeing +freeish +Freekirker +freelage +freeloving +freelovism +freely +freeman +freemanship +freemartin +freemason +freemasonic +freemasonical +freemasonism +freemasonry +freen +freend +freeness +freer +Freesia +freesilverism +freesilverite +freestanding +freestone +freet +freethinker +freethinking +freetrader +freety +freeward +freeway +freewheel +freewheeler +freewheeling +freewill +freewoman +freezable +freeze +freezer +freezing +freezingly +Fregata +Fregatae +Fregatidae +freibergite +freieslebenite +freight +freightage +freighter +freightless +freightment +freir +freit +freity +fremd +fremdly +fremdness +fremescence +fremescent +fremitus +Fremontia +Fremontodendron +frenal +Frenatae +frenate +French +frenched +Frenchification +frenchification +Frenchify +frenchify +Frenchily +Frenchiness +frenching +Frenchism +Frenchize +Frenchless +Frenchly +Frenchman +Frenchness +Frenchwise +Frenchwoman +Frenchy +frenetic +frenetical +frenetically +Frenghi +frenular +frenulum +frenum +frenzelite +frenzied +frenziedly +frenzy +Freon +frequence +frequency +frequent +frequentable +frequentage +frequentation +frequentative +frequenter +frequently +frequentness +frescade +fresco +frescoer +frescoist +fresh +freshen +freshener +freshet +freshhearted +freshish +freshly +freshman +freshmanhood +freshmanic +freshmanship +freshness +freshwoman +Fresison +fresnel +fresno +fret +fretful +fretfully +fretfulness +fretless +fretsome +frett +frettage +frettation +frette +fretted +fretter +fretting +frettingly +fretty +fretum +fretways +fretwise +fretwork +fretworked +Freudian +Freudianism +Freudism +Freudist +Freya +freyalite +Freycinetia +Freyja +Freyr +friability +friable +friableness +friand +friandise +friar +friarbird +friarhood +friarling +friarly +friary +frib +fribble +fribbleism +fribbler +fribblery +fribbling +fribblish +fribby +fricandeau +fricandel +fricassee +frication +fricative +fricatrice +friction +frictionable +frictional +frictionally +frictionize +frictionless +frictionlessly +frictionproof +Friday +Fridila +fridstool +fried +Frieda +friedcake +friedelite +friedrichsdor +friend +friended +friendless +friendlessness +friendlike +friendlily +friendliness +friendliwise +friendly +friendship +frier +frieseite +Friesian +Friesic +Friesish +frieze +friezer +friezy +frig +frigate +frigatoon +friggle +fright +frightable +frighten +frightenable +frightened +frightenedly +frightenedness +frightener +frightening +frighteningly +frighter +frightful +frightfully +frightfulness +frightless +frightment +frighty +frigid +Frigidaire +frigidarium +frigidity +frigidly +frigidness +frigiferous +frigolabile +frigoric +frigorific +frigorifical +frigorify +frigorimeter +frigostable +frigotherapy +Frija +frijol +frijolillo +frijolito +frike +frill +frillback +frilled +friller +frillery +frillily +frilliness +frilling +frilly +frim +Frimaire +fringe +fringed +fringeflower +fringeless +fringelet +fringent +fringepod +Fringetail +Fringilla +fringillaceous +Fringillidae +fringilliform +Fringilliformes +fringilline +fringilloid +fringing +fringy +fripperer +frippery +frisca +Frisesomorum +frisette +Frisian +Frisii +frisk +frisker +frisket +friskful +friskily +friskiness +frisking +friskingly +frisky +frisolee +frison +frist +frisure +frit +frith +frithborh +frithbot +frithles +frithsoken +frithstool +frithwork +Fritillaria +fritillary +fritt +fritter +fritterer +Fritz +Friulian +frivol +frivoler +frivolism +frivolist +frivolity +frivolize +frivolous +frivolously +frivolousness +frixion +friz +frize +frizer +frizz +frizzer +frizzily +frizziness +frizzing +frizzle +frizzler +frizzly +frizzy +fro +frock +frocking +frockless +frocklike +frockmaker +froe +Froebelian +Froebelism +Froebelist +frog +frogbit +frogeater +frogeye +frogface +frogfish +frogflower +frogfoot +frogged +froggery +frogginess +frogging +froggish +froggy +froghood +froghopper +frogland +frogleaf +frogleg +froglet +froglike +frogling +frogman +frogmouth +frognose +frogskin +frogstool +frogtongue +frogwort +froise +frolic +frolicful +frolicker +frolicky +frolicly +frolicness +frolicsome +frolicsomely +frolicsomeness +from +fromward +fromwards +frond +frondage +fronded +frondent +frondesce +frondescence +frondescent +frondiferous +frondiform +frondigerous +frondivorous +frondlet +frondose +frondosely +frondous +front +frontad +frontage +frontager +frontal +frontalis +frontality +frontally +frontbencher +fronted +fronter +frontier +frontierlike +frontierman +frontiersman +Frontignan +fronting +frontingly +Frontirostria +frontispiece +frontless +frontlessly +frontlessness +frontlet +frontoauricular +frontoethmoid +frontogenesis +frontolysis +frontomallar +frontomaxillary +frontomental +frontonasal +frontooccipital +frontoorbital +frontoparietal +frontopontine +frontosphenoidal +frontosquamosal +frontotemporal +frontozygomatic +frontpiece +frontsman +frontstall +frontward +frontways +frontwise +froom +frore +frory +frosh +frost +frostation +frostbird +frostbite +frostbow +frosted +froster +frostfish +frostflower +frostily +frostiness +frosting +frostless +frostlike +frostproof +frostproofing +frostroot +frostweed +frostwork +frostwort +frosty +frot +froth +frother +Frothi +frothily +frothiness +frothing +frothless +frothsome +frothy +frotton +froufrou +frough +froughy +frounce +frounceless +frow +froward +frowardly +frowardness +frower +frowl +frown +frowner +frownful +frowning +frowningly +frownless +frowny +frowst +frowstily +frowstiness +frowsty +frowy +frowze +frowzily +frowziness +frowzled +frowzly +frowzy +froze +frozen +frozenhearted +frozenly +frozenness +fruchtschiefer +fructed +fructescence +fructescent +fructicultural +fructiculture +Fructidor +fructiferous +fructiferously +fructification +fructificative +fructifier +fructiform +fructify +fructiparous +fructivorous +fructose +fructoside +fructuary +fructuosity +fructuous +fructuously +fructuousness +frugal +frugalism +frugalist +frugality +frugally +frugalness +fruggan +Frugivora +frugivorous +fruit +fruitade +fruitage +fruitarian +fruitarianism +fruitcake +fruited +fruiter +fruiterer +fruiteress +fruitery +fruitful +fruitfullness +fruitfully +fruitgrower +fruitgrowing +fruitiness +fruiting +fruition +fruitist +fruitive +fruitless +fruitlessly +fruitlessness +fruitlet +fruitling +fruitstalk +fruittime +fruitwise +fruitwoman +fruitwood +fruitworm +fruity +frumentaceous +frumentarious +frumentation +frumenty +frump +frumpery +frumpily +frumpiness +frumpish +frumpishly +frumpishness +frumple +frumpy +frush +frustrate +frustrately +frustrater +frustration +frustrative +frustratory +frustule +frustulent +frustulose +frustum +frutescence +frutescent +fruticetum +fruticose +fruticous +fruticulose +frutify +fry +fryer +fu +fub +fubby +fubsy +Fucaceae +fucaceous +Fucales +fucate +fucation +fucatious +Fuchsia +Fuchsian +fuchsin +fuchsine +fuchsinophil +fuchsinophilous +fuchsite +fuchsone +fuci +fucinita +fuciphagous +fucoid +fucoidal +Fucoideae +fucosan +fucose +fucous +fucoxanthin +fucus +fud +fuddle +fuddler +fuder +fudge +fudger +fudgy +Fuegian +fuel +fueler +fuelizer +fuerte +fuff +fuffy +fugacious +fugaciously +fugaciousness +fugacity +fugal +fugally +fuggy +fugient +fugitate +fugitation +fugitive +fugitively +fugitiveness +fugitivism +fugitivity +fugle +fugleman +fuglemanship +fugler +fugu +fugue +fuguist +fuidhir +fuirdays +Fuirena +fuji +Fulah +fulciform +fulcral +fulcrate +fulcrum +fulcrumage +fulfill +fulfiller +fulfillment +Fulfulde +fulgent +fulgently +fulgentness +fulgid +fulgide +fulgidity +fulgor +Fulgora +fulgorid +Fulgoridae +Fulgoroidea +fulgorous +Fulgur +fulgural +fulgurant +fulgurantly +fulgurata +fulgurate +fulgurating +fulguration +fulgurator +fulgurite +fulgurous +fulham +Fulica +Fulicinae +fulicine +fuliginosity +fuliginous +fuliginously +fuliginousness +Fuligula +Fuligulinae +fuliguline +fulk +full +fullam +fullback +fuller +fullering +fullery +fullface +fullhearted +fulling +fullish +fullmouth +fullmouthed +fullmouthedly +fullness +fullom +Fullonian +fully +fulmar +Fulmarus +fulmicotton +fulminancy +fulminant +fulminate +fulminating +fulmination +fulminator +fulminatory +fulmine +fulmineous +fulminic +fulminous +fulminurate +fulminuric +fulsome +fulsomely +fulsomeness +fulth +Fultz +Fulup +fulvene +fulvescent +fulvid +fulvidness +fulvous +fulwa +fulyie +fulzie +fum +fumacious +fumado +fumage +fumagine +Fumago +fumarate +Fumaria +Fumariaceae +fumariaceous +fumaric +fumarine +fumarium +fumaroid +fumaroidal +fumarole +fumarolic +fumaryl +fumatorium +fumatory +fumble +fumbler +fumbling +fume +fumeless +fumer +fumeroot +fumet +fumette +fumewort +fumiduct +fumiferous +fumigant +fumigate +fumigation +fumigator +fumigatorium +fumigatory +fumily +fuminess +fuming +fumingly +fumistery +fumitory +fumose +fumosity +fumous +fumously +fumy +fun +funambulate +funambulation +funambulator +funambulatory +funambulic +funambulism +funambulist +funambulo +Funaria +Funariaceae +funariaceous +function +functional +functionalism +functionalist +functionality +functionalize +functionally +functionarism +functionary +functionate +functionation +functionize +functionless +fund +fundable +fundal +fundament +fundamental +fundamentalism +fundamentalist +fundamentality +fundamentally +fundamentalness +fundatorial +fundatrix +funded +funder +fundholder +fundi +fundic +fundiform +funditor +fundless +fundmonger +fundmongering +funds +Fundulinae +funduline +Fundulus +fundungi +fundus +funebrial +funeral +funeralize +funerary +funereal +funereally +funest +fungaceous +fungal +Fungales +fungate +fungation +fungi +Fungia +fungian +fungibility +fungible +fungic +fungicidal +fungicide +fungicolous +fungiferous +fungiform +fungilliform +fungin +fungistatic +fungivorous +fungo +fungoid +fungoidal +fungological +fungologist +fungology +fungose +fungosity +fungous +fungus +fungused +funguslike +fungusy +funicle +funicular +funiculate +funicule +funiculitis +funiculus +funiform +funipendulous +funis +Funje +funk +funker +Funkia +funkiness +funky +funmaker +funmaking +funnel +funneled +funnelform +funnellike +funnelwise +funnily +funniment +funniness +funny +funnyman +funori +funt +Funtumia +Fur +fur +furacious +furaciousness +furacity +fural +furaldehyde +furan +furanoid +furazan +furazane +furbelow +furbish +furbishable +furbisher +furbishment +furca +furcal +furcate +furcately +furcation +Furcellaria +furcellate +furciferine +furciferous +furciform +Furcraea +furcula +furcular +furculum +furdel +Furfooz +furfur +furfuraceous +furfuraceously +furfural +furfuralcohol +furfuraldehyde +furfuramide +furfuran +furfuration +furfurine +furfuroid +furfurole +furfurous +furfuryl +furfurylidene +furiant +furibund +furied +Furies +furify +furil +furilic +furiosa +furiosity +furioso +furious +furiously +furiousness +furison +furl +furlable +Furlan +furler +furless +furlong +furlough +furnace +furnacelike +furnaceman +furnacer +furnacite +furnage +Furnariidae +Furnariides +Furnarius +furner +furnish +furnishable +furnished +furnisher +furnishing +furnishment +furniture +furnitureless +furodiazole +furoic +furoid +furoin +furole +furomethyl +furomonazole +furor +furore +furphy +furred +furrier +furriered +furriery +furrily +furriness +furring +furrow +furrower +furrowless +furrowlike +furrowy +furry +furstone +further +furtherance +furtherer +furtherest +furtherly +furthermore +furthermost +furthersome +furthest +furtive +furtively +furtiveness +Furud +furuncle +furuncular +furunculoid +furunculosis +furunculous +fury +furyl +furze +furzechat +furzed +furzeling +furzery +furzetop +furzy +fusain +fusarial +fusariose +fusariosis +Fusarium +fusarole +fusate +fusc +fuscescent +fuscin +fuscohyaline +fuscous +fuse +fuseboard +fused +fusee +fuselage +fuseplug +fusht +fusibility +fusible +fusibleness +fusibly +Fusicladium +Fusicoccum +fusiform +Fusiformis +fusil +fusilier +fusillade +fusilly +fusinist +fusion +fusional +fusionism +fusionist +fusionless +fusoid +fuss +fusser +fussification +fussify +fussily +fussiness +fussock +fussy +fust +fustanella +fustee +fusteric +fustet +fustian +fustianish +fustianist +fustianize +fustic +fustigate +fustigation +fustigator +fustigatory +fustilugs +fustily +fustin +fustiness +fustle +fusty +Fusulina +fusuma +fusure +Fusus +fut +futchel +fute +futhorc +futile +futilely +futileness +futilitarian +futilitarianism +futility +futilize +futtermassel +futtock +futural +future +futureless +futureness +futuric +futurism +futurist +futuristic +futurition +futurity +futurize +futwa +fuye +fuze +fuzz +fuzzball +fuzzily +fuzziness +fuzzy +fyke +fylfot +fyrd +G +g +Ga +ga +gab +gabardine +gabbard +gabber +gabble +gabblement +gabbler +gabbro +gabbroic +gabbroid +gabbroitic +gabby +Gabe +gabelle +gabelled +gabelleman +gabeller +gaberdine +gaberlunzie +gabgab +gabi +gabion +gabionade +gabionage +gabioned +gablatores +gable +gableboard +gablelike +gablet +gablewise +gablock +Gaboon +Gabriel +Gabriella +Gabrielrache +Gabunese +gaby +Gad +gad +Gadaba +gadabout +Gadarene +Gadaria +gadbee +gadbush +Gaddang +gadded +gadder +Gaddi +gaddi +gadding +gaddingly +gaddish +gaddishness +gade +gadfly +gadge +gadger +gadget +gadid +Gadidae +gadinine +Gaditan +gadling +gadman +gadoid +Gadoidea +gadolinia +gadolinic +gadolinite +gadolinium +gadroon +gadroonage +Gadsbodikins +Gadsbud +Gadslid +gadsman +Gadswoons +gaduin +Gadus +gadwall +Gadzooks +Gael +Gaeldom +Gaelic +Gaelicism +Gaelicist +Gaelicization +Gaelicize +Gaeltacht +gaen +Gaertnerian +gaet +Gaetulan +Gaetuli +Gaetulian +gaff +gaffe +gaffer +Gaffkya +gaffle +gaffsman +gag +gagate +gage +gageable +gagee +gageite +gagelike +gager +gagership +gagger +gaggery +gaggle +gaggler +gagman +gagor +gagroot +gagtooth +gahnite +Gahrwali +Gaia +gaiassa +Gaidropsaridae +gaiety +Gail +Gaillardia +gaily +gain +gainable +gainage +gainbirth +gaincall +gaincome +gaine +gainer +gainful +gainfully +gainfulness +gaining +gainless +gainlessness +gainliness +gainly +gains +gainsay +gainsayer +gainset +gainsome +gainspeaker +gainspeaking +gainst +gainstrive +gainturn +gaintwist +gainyield +gair +gairfish +gaisling +gait +gaited +gaiter +gaiterless +gaiting +gaize +gaj +gal +gala +Galacaceae +galactagogue +galactagoguic +galactan +galactase +galactemia +galacthidrosis +Galactia +galactic +galactidrosis +galactite +galactocele +galactodendron +galactodensimeter +galactogenetic +galactohemia +galactoid +galactolipide +galactolipin +galactolysis +galactolytic +galactoma +galactometer +galactometry +galactonic +galactopathy +galactophagist +galactophagous +galactophlebitis +galactophlysis +galactophore +galactophoritis +galactophorous +galactophthysis +galactophygous +galactopoiesis +galactopoietic +galactopyra +galactorrhea +galactorrhoea +galactoscope +galactose +galactoside +galactosis +galactostasis +galactosuria +galactotherapy +galactotrophy +galacturia +galagala +Galaginae +Galago +galah +galanas +galanga +galangin +galant +Galanthus +galantine +galany +galapago +Galatae +galatea +Galatian +Galatic +galatotrophic +Galax +galaxian +Galaxias +Galaxiidae +galaxy +galban +galbanum +Galbula +Galbulae +Galbulidae +Galbulinae +galbulus +Galcha +Galchic +gale +galea +galeage +galeate +galeated +galee +galeeny +Galega +galegine +Galei +galeid +Galeidae +galeiform +galempung +Galen +galena +Galenian +Galenic +galenic +Galenical +galenical +Galenism +Galenist +galenite +galenobismutite +galenoid +Galeodes +Galeodidae +galeoid +Galeopithecus +Galeopsis +Galeorchis +Galeorhinidae +Galeorhinus +galeproof +galera +galericulate +galerum +galerus +Galesaurus +galet +Galeus +galewort +galey +Galga +galgal +Galgulidae +gali +Galibi +Galician +Galictis +Galidia +Galidictis +Galik +Galilean +galilee +galimatias +galingale +Galinsoga +galiongee +galiot +galipidine +galipine +galipoidin +galipoidine +galipoipin +galipot +Galium +gall +Galla +galla +gallacetophenone +gallah +gallanilide +gallant +gallantize +gallantly +gallantness +gallantry +gallate +gallature +gallberry +gallbush +galleass +galled +Gallegan +gallein +galleon +galler +Galleria +gallerian +galleried +Galleriidae +gallery +gallerylike +gallet +galley +galleylike +galleyman +galleyworm +gallflower +gallfly +Galli +galliambic +galliambus +Gallian +galliard +galliardise +galliardly +galliardness +Gallic +gallic +Gallican +Gallicanism +Gallicism +Gallicization +Gallicize +Gallicizer +gallicola +Gallicolae +gallicole +gallicolous +galliferous +Gallification +gallification +galliform +Galliformes +Gallify +galligaskin +gallimaufry +Gallinaceae +gallinacean +Gallinacei +gallinaceous +Gallinae +Gallinago +gallinazo +galline +galling +gallingly +gallingness +gallinipper +Gallinula +gallinule +Gallinulinae +gallinuline +gallipot +Gallirallus +gallisin +gallium +gallivant +gallivanter +gallivat +gallivorous +galliwasp +gallnut +gallocyanin +gallocyanine +galloflavine +galloglass +Galloman +Gallomania +Gallomaniac +gallon +gallonage +galloner +galloon +gallooned +gallop +gallopade +galloper +Galloperdix +Gallophile +Gallophilism +Gallophobe +Gallophobia +galloping +galloptious +gallotannate +gallotannic +gallotannin +gallous +Gallovidian +Galloway +galloway +gallowglass +gallows +gallowsmaker +gallowsness +gallowsward +gallstone +Gallus +galluses +gallweed +gallwort +gally +gallybagger +gallybeggar +gallycrow +Galoisian +galoot +galop +galore +galosh +galp +galravage +galravitch +galt +Galtonia +Galtonian +galuchat +galumph +galumptious +Galusha +galuth +galvanic +galvanical +galvanically +galvanism +galvanist +galvanization +galvanize +galvanized +galvanizer +galvanocauterization +galvanocautery +galvanocontractility +galvanofaradization +galvanoglyph +galvanoglyphy +galvanograph +galvanographic +galvanography +galvanologist +galvanology +galvanolysis +galvanomagnet +galvanomagnetic +galvanomagnetism +galvanometer +galvanometric +galvanometrical +galvanometrically +galvanometry +galvanoplastic +galvanoplastical +galvanoplastically +galvanoplastics +galvanoplasty +galvanopsychic +galvanopuncture +galvanoscope +galvanoscopic +galvanoscopy +galvanosurgery +galvanotactic +galvanotaxis +galvanotherapy +galvanothermometer +galvanothermy +galvanotonic +galvanotropic +galvanotropism +galvayne +galvayning +Galways +Galwegian +galyac +galyak +galziekte +gam +gamahe +Gamaliel +gamashes +gamasid +Gamasidae +Gamasoidea +gamb +gamba +gambade +gambado +gambang +gambeer +gambeson +gambet +gambette +gambia +gambier +gambist +gambit +gamble +gambler +gamblesome +gamblesomeness +gambling +gambodic +gamboge +gambogian +gambogic +gamboised +gambol +gambrel +gambreled +gambroon +Gambusia +gamdeboo +game +gamebag +gameball +gamecock +gamecraft +gameful +gamekeeper +gamekeeping +gamelang +gameless +gamelike +Gamelion +gamelotte +gamely +gamene +gameness +gamesome +gamesomely +gamesomeness +gamester +gamestress +gametal +gametange +gametangium +gamete +gametic +gametically +gametocyst +gametocyte +gametogenesis +gametogenic +gametogenous +gametogeny +gametogonium +gametogony +gametoid +gametophagia +gametophore +gametophyll +gametophyte +gametophytic +gamic +gamily +gamin +gaminesque +gaminess +gaming +gaminish +gamma +gammacism +gammacismus +gammadion +gammarid +Gammaridae +gammarine +gammaroid +Gammarus +gammation +gammelost +gammer +gammerel +gammerstang +Gammexane +gammick +gammock +gammon +gammoner +gammoning +gammy +gamobium +gamodesmic +gamodesmy +gamogenesis +gamogenetic +gamogenetical +gamogenetically +gamogony +Gamolepis +gamomania +gamont +Gamopetalae +gamopetalous +gamophagia +gamophagy +gamophyllous +gamori +gamosepalous +gamostele +gamostelic +gamostely +gamotropic +gamotropism +gamp +gamphrel +gamut +gamy +gan +ganam +ganancial +Ganapati +ganch +Ganda +gander +ganderess +gandergoose +gandermooner +ganderteeth +Gandhara +Gandharva +Gandhiism +Gandhism +Gandhist +gandul +gandum +gandurah +gane +ganef +gang +Ganga +ganga +Gangamopteris +gangan +gangava +gangboard +gangdom +gange +ganger +Gangetic +ganggang +ganging +gangism +gangland +ganglander +ganglia +gangliac +ganglial +gangliar +gangliasthenia +gangliate +gangliated +gangliectomy +gangliform +gangliitis +gangling +ganglioblast +gangliocyte +ganglioform +ganglioid +ganglioma +ganglion +ganglionary +ganglionate +ganglionectomy +ganglioneural +ganglioneure +ganglioneuroma +ganglioneuron +ganglionic +ganglionitis +ganglionless +ganglioplexus +gangly +gangman +gangmaster +gangplank +gangrel +gangrene +gangrenescent +gangrenous +gangsman +gangster +gangsterism +gangtide +gangue +Ganguela +gangway +gangwayman +ganister +ganja +ganner +gannet +Ganocephala +ganocephalan +ganocephalous +ganodont +Ganodonta +Ganodus +ganoid +ganoidal +ganoidean +Ganoidei +ganoidian +ganoin +ganomalite +ganophyllite +ganosis +Ganowanian +gansel +gansey +gansy +gant +ganta +gantang +gantlet +gantline +ganton +gantries +gantry +gantryman +gantsl +Ganymede +Ganymedes +ganza +ganzie +gaol +gaolbird +gaoler +Gaon +Gaonate +Gaonic +gap +Gapa +gapa +gape +gaper +gapes +gapeseed +gapeworm +gaping +gapingly +gapingstock +gapo +gappy +gapy +gar +gara +garabato +garad +garage +garageman +Garamond +garance +garancine +garapata +garava +garavance +garawi +garb +garbage +garbardine +garbel +garbell +garbill +garble +garbleable +garbler +garbless +garbling +garboard +garboil +garbure +garce +Garcinia +gardant +gardeen +garden +gardenable +gardencraft +gardened +gardener +gardenership +gardenesque +gardenful +gardenhood +Gardenia +gardenin +gardening +gardenize +gardenless +gardenlike +gardenly +gardenmaker +gardenmaking +gardenwards +gardenwise +gardeny +garderobe +gardevin +gardy +gardyloo +gare +garefowl +gareh +garetta +garewaite +garfish +garganey +Gargantua +Gargantuan +garget +gargety +gargle +gargol +gargoyle +gargoyled +gargoyley +gargoylish +gargoylishly +gargoylism +Garhwali +garial +gariba +garibaldi +Garibaldian +garish +garishly +garishness +garland +garlandage +garlandless +garlandlike +garlandry +garlandwise +garle +garlic +garlicky +garliclike +garlicmonger +garlicwort +garment +garmentless +garmentmaker +garmenture +garmentworker +garn +garnel +garner +garnerage +garnet +garnetberry +garneter +garnetiferous +garnets +garnett +garnetter +garnetwork +garnetz +garnice +garniec +garnierite +garnish +garnishable +garnished +garnishee +garnisheement +garnisher +garnishment +garnishry +garniture +Garo +garoo +garookuh +garrafa +garran +Garret +garret +garreted +garreteer +garretmaster +garrison +Garrisonian +Garrisonism +garrot +garrote +garroter +Garrulinae +garruline +garrulity +garrulous +garrulously +garrulousness +Garrulus +garrupa +Garrya +Garryaceae +garse +Garshuni +garsil +garston +garten +garter +gartered +gartering +garterless +garth +garthman +Garuda +garum +garvanzo +garvey +garvock +gas +Gasan +gasbag +gascoigny +Gascon +gasconade +gasconader +Gasconism +gascromh +gaseity +gaselier +gaseosity +gaseous +gaseousness +gasfiring +gash +gashes +gashful +gashliness +gashly +gasholder +gashouse +gashy +gasifiable +gasification +gasifier +gasiform +gasify +gasket +gaskin +gasking +gaskins +gasless +gaslight +gaslighted +gaslighting +gaslit +gaslock +gasmaker +gasman +gasogenic +gasoliery +gasoline +gasolineless +gasoliner +gasometer +gasometric +gasometrical +gasometry +gasp +Gaspar +gasparillo +gasper +gaspereau +gaspergou +gaspiness +gasping +gaspingly +gasproof +gaspy +gasser +Gasserian +gassiness +gassing +gassy +gast +gastaldite +gastaldo +gaster +gasteralgia +Gasterolichenes +gasteromycete +Gasteromycetes +gasteromycetous +Gasterophilus +gasteropod +Gasteropoda +gasterosteid +Gasterosteidae +gasterosteiform +gasterosteoid +Gasterosteus +gasterotheca +gasterothecal +Gasterotricha +gasterotrichan +gasterozooid +gastight +gastightness +Gastornis +Gastornithidae +gastradenitis +gastraea +gastraead +Gastraeadae +gastraeal +gastraeum +gastral +gastralgia +gastralgic +gastralgy +gastraneuria +gastrasthenia +gastratrophia +gastrectasia +gastrectasis +gastrectomy +gastrelcosis +gastric +gastricism +gastrilegous +gastriloquial +gastriloquism +gastriloquist +gastriloquous +gastriloquy +gastrin +gastritic +gastritis +gastroadenitis +gastroadynamic +gastroalbuminorrhea +gastroanastomosis +gastroarthritis +gastroatonia +gastroatrophia +gastroblennorrhea +gastrocatarrhal +gastrocele +gastrocentrous +Gastrochaena +Gastrochaenidae +gastrocnemial +gastrocnemian +gastrocnemius +gastrocoel +gastrocolic +gastrocoloptosis +gastrocolostomy +gastrocolotomy +gastrocolpotomy +gastrocystic +gastrocystis +gastrodialysis +gastrodiaphanoscopy +gastrodidymus +gastrodisk +gastroduodenal +gastroduodenitis +gastroduodenoscopy +gastroduodenotomy +gastrodynia +gastroelytrotomy +gastroenteralgia +gastroenteric +gastroenteritic +gastroenteritis +gastroenteroanastomosis +gastroenterocolitis +gastroenterocolostomy +gastroenterological +gastroenterologist +gastroenterology +gastroenteroptosis +gastroenterostomy +gastroenterotomy +gastroepiploic +gastroesophageal +gastroesophagostomy +gastrogastrotomy +gastrogenital +gastrograph +gastrohelcosis +gastrohepatic +gastrohepatitis +gastrohydrorrhea +gastrohyperneuria +gastrohypertonic +gastrohysterectomy +gastrohysteropexy +gastrohysterorrhaphy +gastrohysterotomy +gastroid +gastrointestinal +gastrojejunal +gastrojejunostomy +gastrolater +gastrolatrous +gastrolienal +gastrolith +Gastrolobium +gastrologer +gastrological +gastrologist +gastrology +gastrolysis +gastrolytic +gastromalacia +gastromancy +gastromelus +gastromenia +gastromyces +gastromycosis +gastromyxorrhea +gastronephritis +gastronome +gastronomer +gastronomic +gastronomical +gastronomically +gastronomist +gastronomy +gastronosus +gastropancreatic +gastropancreatitis +gastroparalysis +gastroparesis +gastroparietal +gastropathic +gastropathy +gastroperiodynia +gastropexy +gastrophile +gastrophilism +gastrophilist +gastrophilite +Gastrophilus +gastrophrenic +gastrophthisis +gastroplasty +gastroplenic +gastropleuritis +gastroplication +gastropneumatic +gastropneumonic +gastropod +Gastropoda +gastropodan +gastropodous +gastropore +gastroptosia +gastroptosis +gastropulmonary +gastropulmonic +gastropyloric +gastrorrhagia +gastrorrhaphy +gastrorrhea +gastroschisis +gastroscope +gastroscopic +gastroscopy +gastrosoph +gastrosopher +gastrosophy +gastrospasm +gastrosplenic +gastrostaxis +gastrostegal +gastrostege +gastrostenosis +gastrostomize +Gastrostomus +gastrostomy +gastrosuccorrhea +gastrotheca +gastrothecal +gastrotome +gastrotomic +gastrotomy +Gastrotricha +gastrotrichan +gastrotubotomy +gastrotympanites +gastrovascular +gastroxynsis +gastrozooid +gastrula +gastrular +gastrulate +gastrulation +gasworker +gasworks +gat +gata +gatch +gatchwork +gate +gateado +gateage +gated +gatehouse +gatekeeper +gateless +gatelike +gatemaker +gateman +gatepost +gater +gatetender +gateward +gatewards +gateway +gatewayman +gatewise +gatewoman +gateworks +gatewright +Gatha +gather +gatherable +gatherer +gathering +Gathic +gating +gator +gatter +gatteridge +gau +gaub +gauby +gauche +gauchely +gaucheness +gaucherie +Gaucho +gaud +gaudery +Gaudete +gaudful +gaudily +gaudiness +gaudless +gaudsman +gaudy +gaufer +gauffer +gauffered +gauffre +gaufre +gaufrette +gauge +gaugeable +gauger +gaugership +gauging +Gaul +gaulding +gauleiter +Gaulic +gaulin +Gaulish +Gaullism +Gaullist +Gault +gault +gaulter +gaultherase +Gaultheria +gaultherin +gaum +gaumish +gaumless +gaumlike +gaumy +gaun +gaunt +gaunted +gauntlet +gauntleted +gauntly +gauntness +gauntry +gaunty +gaup +gaupus +gaur +Gaura +Gaurian +gaus +gauss +gaussage +gaussbergite +Gaussian +gauster +gausterer +gaut +gauteite +gauze +gauzelike +gauzewing +gauzily +gauziness +gauzy +gavall +gave +gavel +gaveler +gavelkind +gavelkinder +gavelman +gavelock +Gavia +Gaviae +gavial +Gavialis +gavialoid +Gaviiformes +gavotte +gavyuti +gaw +gawby +gawcie +gawk +gawkhammer +gawkihood +gawkily +gawkiness +gawkish +gawkishly +gawkishness +gawky +gawm +gawn +gawney +gawsie +gay +gayal +gayatri +gaybine +gaycat +gaydiang +gayish +Gaylussacia +gaylussite +gayment +gayness +Gaypoo +gaysome +gaywings +gayyou +gaz +gazabo +gazangabin +Gazania +gaze +gazebo +gazee +gazehound +gazel +gazeless +Gazella +gazelle +gazelline +gazement +gazer +gazettal +gazette +gazetteer +gazetteerage +gazetteerish +gazetteership +gazi +gazing +gazingly +gazingstock +gazogene +gazon +gazophylacium +gazy +gazzetta +Ge +ge +Geadephaga +geadephagous +geal +gean +geanticlinal +geanticline +gear +gearbox +geared +gearing +gearksutite +gearless +gearman +gearset +gearshift +gearwheel +gease +geason +Geaster +Geat +geat +Geatas +gebang +gebanga +gebbie +gebur +Gecarcinidae +Gecarcinus +geck +gecko +geckoid +geckotian +geckotid +Geckotidae +geckotoid +Ged +ged +gedackt +gedanite +gedder +gedeckt +gedecktwork +Gederathite +Gederite +gedrite +Gee +gee +geebong +geebung +Geechee +geejee +geek +geelbec +geeldikkop +geelhout +geepound +geerah +geest +geet +Geez +geezer +Gegenschein +gegg +geggee +gegger +geggery +Geheimrat +Gehenna +gehlenite +Geikia +geikielite +gein +geira +Geisenheimer +geisha +geison +geisotherm +geisothermal +Geissoloma +Geissolomataceae +Geissolomataceous +Geissorhiza +geissospermin +geissospermine +geitjie +geitonogamous +geitonogamy +Gekko +Gekkones +gekkonid +Gekkonidae +gekkonoid +Gekkota +gel +gelable +gelada +gelandejump +gelandelaufer +gelandesprung +Gelasian +Gelasimus +gelastic +Gelastocoridae +gelatification +gelatigenous +gelatin +gelatinate +gelatination +gelatined +gelatiniferous +gelatiniform +gelatinify +gelatinigerous +gelatinity +gelatinizability +gelatinizable +gelatinization +gelatinize +gelatinizer +gelatinobromide +gelatinochloride +gelatinoid +gelatinotype +gelatinous +gelatinously +gelatinousness +gelation +gelatose +geld +geldability +geldable +geldant +gelder +gelding +Gelechia +gelechiid +Gelechiidae +Gelfomino +gelid +Gelidiaceae +gelidity +Gelidium +gelidly +gelidness +gelignite +gelilah +gelinotte +gell +Gellert +gelly +gelogenic +gelong +geloscopy +gelose +gelosin +gelotherapy +gelotometer +gelotoscopy +gelototherapy +gelsemic +gelsemine +gelseminic +gelseminine +Gelsemium +gelt +gem +Gemara +Gemaric +Gemarist +gematria +gematrical +gemauve +gemel +gemeled +gemellione +gemellus +geminate +geminated +geminately +gemination +geminative +Gemini +Geminid +geminiflorous +geminiform +geminous +Gemitores +gemitorial +gemless +gemlike +Gemma +gemma +gemmaceous +gemmae +gemmate +gemmation +gemmative +gemmeous +gemmer +gemmiferous +gemmiferousness +gemmification +gemmiform +gemmily +gemminess +Gemmingia +gemmipara +gemmipares +gemmiparity +gemmiparous +gemmiparously +gemmoid +gemmology +gemmula +gemmulation +gemmule +gemmuliferous +gemmy +gemot +gemsbok +gemsbuck +gemshorn +gemul +gemuti +gemwork +gen +gena +genal +genapp +genapper +genarch +genarcha +genarchaship +genarchship +gendarme +gendarmery +gender +genderer +genderless +Gene +gene +genealogic +genealogical +genealogically +genealogist +genealogize +genealogizer +genealogy +genear +geneat +genecologic +genecological +genecologically +genecologist +genecology +geneki +genep +genera +generability +generable +generableness +general +generalate +generalcy +generale +generalia +Generalidad +generalific +generalism +generalissima +generalissimo +generalist +generalistic +generality +generalizable +generalization +generalize +generalized +generalizer +generall +generally +generalness +generalship +generalty +generant +generate +generating +generation +generational +generationism +generative +generatively +generativeness +generator +generatrix +generic +generical +generically +genericalness +generification +generosity +generous +generously +generousness +Genesee +geneserine +Genesiac +Genesiacal +genesial +genesic +genesiology +genesis +Genesitic +genesiurgic +genet +genethliac +genethliacal +genethliacally +genethliacon +genethliacs +genethlialogic +genethlialogical +genethlialogy +genethlic +genetic +genetical +genetically +geneticism +geneticist +genetics +genetmoil +genetous +Genetrix +genetrix +Genetta +Geneura +Geneva +geneva +Genevan +Genevese +Genevieve +Genevois +genevoise +genial +geniality +genialize +genially +genialness +genian +genic +genicular +geniculate +geniculated +geniculately +geniculation +geniculum +genie +genii +genin +genioglossal +genioglossi +genioglossus +geniohyoglossal +geniohyoglossus +geniohyoid +geniolatry +genion +genioplasty +genip +Genipa +genipa +genipap +genipapada +genisaro +Genista +genista +genistein +genital +genitalia +genitals +genitival +genitivally +genitive +genitocrural +genitofemoral +genitor +genitorial +genitory +genitourinary +geniture +genius +genizah +genizero +Genny +Genoa +genoblast +genoblastic +genocidal +genocide +Genoese +genoese +genom +genome +genomic +genonema +genos +genotype +genotypic +genotypical +genotypically +Genoveva +genovino +genre +genro +gens +genson +gent +genteel +genteelish +genteelism +genteelize +genteelly +genteelness +gentes +genthite +gentian +Gentiana +Gentianaceae +gentianaceous +Gentianales +gentianella +gentianic +gentianin +gentianose +gentianwort +gentile +gentiledom +gentilesse +gentilic +gentilism +gentilitial +gentilitian +gentilitious +gentility +gentilization +gentilize +gentiobiose +gentiopicrin +gentisein +gentisic +gentisin +gentle +gentlefolk +gentlehearted +gentleheartedly +gentleheartedness +gentlehood +gentleman +gentlemanhood +gentlemanism +gentlemanize +gentlemanlike +gentlemanlikeness +gentlemanliness +gentlemanly +gentlemanship +gentlemens +gentlemouthed +gentleness +gentlepeople +gentleship +gentlewoman +gentlewomanhood +gentlewomanish +gentlewomanlike +gentlewomanliness +gentlewomanly +gently +gentman +Gentoo +gentrice +gentry +genty +genu +genua +genual +genuclast +genuflect +genuflection +genuflector +genuflectory +genuflex +genuflexuous +genuine +genuinely +genuineness +genus +genyantrum +Genyophrynidae +genyoplasty +genys +geo +geoaesthesia +geoagronomic +geobiologic +geobiology +geobiont +geobios +geoblast +geobotanic +geobotanical +geobotanist +geobotany +geocarpic +geocentric +geocentrical +geocentrically +geocentricism +geocerite +geochemical +geochemist +geochemistry +geochronic +geochronology +geochrony +Geococcyx +geocoronium +geocratic +geocronite +geocyclic +geodaesia +geodal +geode +geodesic +geodesical +geodesist +geodesy +geodete +geodetic +geodetical +geodetically +geodetician +geodetics +geodiatropism +geodic +geodiferous +geodist +geoduck +geodynamic +geodynamical +geodynamics +geoethnic +Geoffrey +geoffroyin +geoffroyine +geoform +geogenesis +geogenetic +geogenic +geogenous +geogeny +Geoglossaceae +Geoglossum +geoglyphic +geognosis +geognosist +geognost +geognostic +geognostical +geognostically +geognosy +geogonic +geogonical +geogony +geographer +geographic +geographical +geographically +geographics +geographism +geographize +geography +geohydrologist +geohydrology +geoid +geoidal +geoisotherm +geolatry +geologer +geologian +geologic +geological +geologically +geologician +geologist +geologize +geology +geomagnetic +geomagnetician +geomagnetics +geomagnetist +geomalic +geomalism +geomaly +geomance +geomancer +geomancy +geomant +geomantic +geomantical +geomantically +geometer +geometric +geometrical +geometrically +geometrician +geometricize +geometrid +Geometridae +geometriform +Geometrina +geometrine +geometrize +geometroid +Geometroidea +geometry +geomoroi +geomorphic +geomorphist +geomorphogenic +geomorphogenist +geomorphogeny +geomorphological +geomorphology +geomorphy +geomyid +Geomyidae +Geomys +Geon +geonavigation +geonegative +Geonic +Geonim +Geonoma +geonoma +geonyctinastic +geonyctitropic +geoparallelotropic +geophagia +geophagism +geophagist +geophagous +geophagy +Geophila +geophilid +Geophilidae +geophilous +Geophilus +Geophone +geophone +geophysical +geophysicist +geophysics +geophyte +geophytic +geoplagiotropism +Geoplana +Geoplanidae +geopolar +geopolitic +geopolitical +geopolitically +geopolitician +geopolitics +Geopolitik +geoponic +geoponical +geoponics +geopony +geopositive +Geoprumnon +georama +Geordie +George +Georgemas +Georgette +Georgia +georgiadesite +Georgian +Georgiana +georgic +Georgie +geoscopic +geoscopy +geoselenic +geosid +geoside +geosphere +Geospiza +geostatic +geostatics +geostrategic +geostrategist +geostrategy +geostrophic +geosynclinal +geosyncline +geotactic +geotactically +geotaxis +geotaxy +geotechnic +geotechnics +geotectology +geotectonic +geotectonics +Geoteuthis +geotherm +geothermal +geothermic +geothermometer +Geothlypis +geotic +geotical +geotilla +geotonic +geotonus +geotropic +geotropically +geotropism +geotropy +geoty +Gepeoo +Gephyrea +gephyrean +gephyrocercal +gephyrocercy +Gepidae +ger +gerah +Gerald +Geraldine +Geraniaceae +geraniaceous +geranial +Geraniales +geranic +geraniol +Geranium +geranium +geranomorph +Geranomorphae +geranomorphic +geranyl +Gerard +gerardia +Gerasene +gerastian +gerate +gerated +geratic +geratologic +geratologous +geratology +geraty +gerb +gerbe +Gerbera +Gerberia +gerbil +Gerbillinae +Gerbillus +gercrow +gereagle +gerefa +gerenda +gerendum +gerent +gerenuk +gerfalcon +gerhardtite +geriatric +geriatrician +geriatrics +gerim +gerip +germ +germal +German +german +germander +germane +germanely +germaneness +Germanesque +Germanhood +Germania +Germanic +germanic +Germanical +Germanically +Germanics +Germanification +Germanify +germanious +Germanish +Germanism +Germanist +Germanistic +germanite +Germanity +germanity +germanium +Germanization +germanization +Germanize +germanize +Germanizer +Germanly +Germanness +Germanocentric +Germanomania +Germanomaniac +Germanophile +Germanophilist +Germanophobe +Germanophobia +Germanophobic +Germanophobist +germanous +Germantown +germanyl +germarium +germen +germfree +germicidal +germicide +germifuge +germigenous +germin +germina +germinability +germinable +Germinal +germinal +germinally +germinance +germinancy +germinant +germinate +germination +germinative +germinatively +germinator +germing +germinogony +germiparity +germless +germlike +germling +germon +germproof +germule +germy +gernitz +gerocomia +gerocomical +gerocomy +geromorphism +Geronomite +geront +gerontal +gerontes +gerontic +gerontine +gerontism +geronto +gerontocracy +gerontocrat +gerontocratic +gerontogeous +gerontology +gerontophilia +gerontoxon +Gerres +gerrhosaurid +Gerrhosauridae +Gerridae +gerrymander +gerrymanderer +gers +gersdorffite +Gershom +Gershon +Gershonite +gersum +Gertie +Gertrude +gerund +gerundial +gerundially +gerundival +gerundive +gerundively +gerusia +Gervais +gervao +Gervas +Gervase +Gerygone +gerygone +Geryonia +geryonid +Geryonidae +Geryoniidae +Ges +Gesan +Geshurites +gesith +gesithcund +gesithcundman +Gesnera +Gesneraceae +gesneraceous +Gesneria +gesneria +Gesneriaceae +gesneriaceous +Gesnerian +gesning +gessamine +gesso +gest +Gestalt +gestalter +gestaltist +gestant +Gestapo +gestate +gestation +gestational +gestative +gestatorial +gestatorium +gestatory +geste +gested +gesten +gestening +gestic +gestical +gesticulacious +gesticulant +gesticular +gesticularious +gesticulate +gesticulation +gesticulative +gesticulatively +gesticulator +gesticulatory +gestion +gestning +gestural +gesture +gestureless +gesturer +get +geta +Getae +getah +getaway +gether +Gethsemane +gethsemane +Gethsemanic +gethsemanic +Getic +getling +getpenny +Getsul +gettable +getter +getting +getup +Geullah +Geum +geum +gewgaw +gewgawed +gewgawish +gewgawry +gewgawy +gey +geyan +geyerite +geyser +geyseral +geyseric +geyserine +geyserish +geyserite +gez +ghafir +ghaist +ghalva +Ghan +gharial +gharnao +gharry +Ghassanid +ghastily +ghastlily +ghastliness +ghastly +ghat +ghatti +ghatwal +ghatwazi +ghazi +ghazism +Ghaznevid +Gheber +ghebeta +Ghedda +ghee +Gheg +Ghegish +gheleem +Ghent +gherkin +ghetchoo +ghetti +ghetto +ghettoization +ghettoize +Ghibelline +Ghibellinism +Ghilzai +Ghiordes +ghizite +ghoom +ghost +ghostcraft +ghostdom +ghoster +ghostess +ghostfish +ghostflower +ghosthood +ghostified +ghostily +ghostish +ghostism +ghostland +ghostless +ghostlet +ghostlify +ghostlike +ghostlily +ghostliness +ghostly +ghostmonger +ghostology +ghostship +ghostweed +ghostwrite +ghosty +ghoul +ghoulery +ghoulish +ghoulishly +ghoulishness +ghrush +ghurry +Ghuz +Gi +Giansar +giant +giantesque +giantess +gianthood +giantish +giantism +giantize +giantkind +giantlike +giantly +giantry +giantship +Giardia +giardia +giardiasis +giarra +giarre +Gib +gib +gibaro +gibbals +gibbed +gibber +Gibberella +gibbergunyah +gibberish +gibberose +gibberosity +gibbet +gibbetwise +Gibbi +gibblegabble +gibblegabbler +gibbles +gibbon +gibbose +gibbosity +gibbous +gibbously +gibbousness +gibbsite +gibbus +gibby +gibe +gibel +gibelite +Gibeonite +giber +gibing +gibingly +gibleh +giblet +giblets +Gibraltar +Gibson +gibstaff +gibus +gid +giddap +giddea +giddify +giddily +giddiness +giddy +giddyberry +giddybrain +giddyhead +giddyish +Gideon +Gideonite +gidgee +gie +gied +gien +Gienah +gieseckite +gif +giffgaff +Gifola +gift +gifted +giftedly +giftedness +giftie +giftless +giftling +giftware +gig +gigantean +gigantesque +gigantic +gigantical +gigantically +giganticidal +giganticide +giganticness +gigantism +gigantize +gigantoblast +gigantocyte +gigantolite +gigantological +gigantology +gigantomachy +Gigantopithecus +Gigantosaurus +Gigantostraca +gigantostracan +gigantostracous +Gigartina +Gigartinaceae +gigartinaceous +Gigartinales +gigback +gigelira +gigeria +gigerium +gigful +gigger +giggish +giggit +giggle +giggledom +gigglement +giggler +gigglesome +giggling +gigglingly +gigglish +giggly +giglet +gigliato +giglot +gigman +gigmaness +gigmanhood +gigmania +gigmanic +gigmanically +gigmanism +gigmanity +gignate +gignitive +gigolo +gigot +gigsman +gigster +gigtree +gigunu +Gil +Gila +Gilaki +Gilbert +gilbert +gilbertage +Gilbertese +Gilbertian +Gilbertianism +gilbertite +gild +gildable +gilded +gilden +gilder +gilding +Gileadite +Gileno +Giles +gilguy +Gilia +gilia +Giliak +gilim +gill +gillaroo +gillbird +gilled +Gillenia +giller +gillflirt +gillhooter +Gillian +gillie +gilliflirt +gilling +gilliver +gillotage +gillotype +gillstoup +gilly +gillyflower +gillygaupus +gilo +gilpy +gilravage +gilravager +gilse +gilsonite +gilt +giltcup +gilthead +gilttail +gim +gimbal +gimbaled +gimbaljawed +gimberjawed +gimble +gimcrack +gimcrackery +gimcrackiness +gimcracky +gimel +Gimirrai +gimlet +gimleteyed +gimlety +gimmal +gimmer +gimmerpet +gimmick +gimp +gimped +gimper +gimping +gin +ging +ginger +gingerade +gingerberry +gingerbread +gingerbready +gingerin +gingerleaf +gingerline +gingerliness +gingerly +gingerness +gingernut +gingerol +gingerous +gingerroot +gingersnap +gingerspice +gingerwork +gingerwort +gingery +gingham +ginghamed +gingili +gingiva +gingivae +gingival +gingivalgia +gingivectomy +gingivitis +gingivoglossitis +gingivolabial +ginglyform +ginglymoarthrodia +ginglymoarthrodial +Ginglymodi +ginglymodian +ginglymoid +ginglymoidal +Ginglymostoma +ginglymostomoid +ginglymus +ginglyni +ginhouse +gink +Ginkgo +ginkgo +Ginkgoaceae +ginkgoaceous +Ginkgoales +ginned +ginner +ginners +ginnery +ginney +ginning +ginnle +ginny +ginseng +ginward +gio +giobertite +giornata +giornatate +Giottesque +Giovanni +gip +gipon +gipper +Gippy +gipser +gipsire +gipsyweed +Giraffa +giraffe +giraffesque +Giraffidae +giraffine +giraffoid +girandola +girandole +girasol +girasole +girba +gird +girder +girderage +girderless +girding +girdingly +girdle +girdlecake +girdlelike +girdler +girdlestead +girdling +girdlingly +Girella +Girellidae +Girgashite +Girgasite +girl +girleen +girlery +girlfully +girlhood +girlie +girliness +girling +girlish +girlishly +girlishness +girlism +girllike +girly +girn +girny +giro +giroflore +Girondin +Girondism +Girondist +girouette +girouettism +girr +girse +girsh +girsle +girt +girth +girtline +gisarme +gish +gisla +gisler +gismondine +gismondite +gist +git +gitaligenin +gitalin +Gitanemuck +gith +Gitksan +gitonin +gitoxigenin +gitoxin +gittern +Gittite +gittith +Giuseppe +giustina +give +giveable +giveaway +given +givenness +giver +givey +giving +gizz +gizzard +gizzen +gizzern +glabella +glabellae +glabellar +glabellous +glabellum +glabrate +glabrescent +glabrous +glace +glaceed +glaceing +glaciable +glacial +glacialism +glacialist +glacialize +glacially +glaciaria +glaciarium +glaciate +glaciation +glacier +glaciered +glacieret +glacierist +glacification +glacioaqueous +glaciolacustrine +glaciological +glaciologist +glaciology +glaciomarine +glaciometer +glacionatant +glacis +glack +glad +gladden +gladdener +gladdon +gladdy +glade +gladelike +gladeye +gladful +gladfully +gladfulness +gladhearted +gladiate +gladiator +gladiatorial +gladiatorism +gladiatorship +gladiatrix +gladify +gladii +gladiola +gladiolar +gladiole +gladioli +gladiolus +gladius +gladkaite +gladless +gladly +gladness +gladsome +gladsomely +gladsomeness +Gladstone +Gladstonian +Gladstonianism +glady +Gladys +glaga +Glagol +Glagolic +Glagolitic +Glagolitsa +glaieul +glaik +glaiket +glaiketness +glair +glaireous +glairiness +glairy +glaister +glaive +glaived +glaked +glaky +glam +glamberry +glamorize +glamorous +glamorously +glamour +glamoury +glance +glancer +glancing +glancingly +gland +glandaceous +glandarious +glandered +glanderous +glanders +glandes +glandiferous +glandiform +glandless +glandlike +glandular +glandularly +glandule +glanduliferous +glanduliform +glanduligerous +glandulose +glandulosity +glandulous +glandulousness +Glaniostomi +glans +glar +glare +glareless +Glareola +glareole +Glareolidae +glareous +glareproof +glareworm +glarily +glariness +glaring +glaringly +glaringness +glarry +glary +Glaserian +glaserite +glashan +glass +glassen +glasser +glasses +glassfish +glassful +glasshouse +glassie +glassily +glassine +glassiness +Glassite +glassless +glasslike +glassmaker +glassmaking +glassman +glassophone +glassrope +glassteel +glassware +glassweed +glasswork +glassworker +glassworking +glassworks +glasswort +glassy +Glaswegian +Glathsheim +Glathsheimr +glauberite +glaucescence +glaucescent +Glaucidium +glaucin +glaucine +Glaucionetta +Glaucium +glaucochroite +glaucodot +glaucolite +glaucoma +glaucomatous +Glaucomys +Glauconia +glauconiferous +Glauconiidae +glauconite +glauconitic +glauconitization +glaucophane +glaucophanite +glaucophanization +glaucophanize +glaucophyllous +Glaucopis +glaucosuria +glaucous +glaucously +Glauke +glaum +glaumrie +glaur +glaury +Glaux +glaver +glaze +glazed +glazen +glazer +glazework +glazier +glaziery +glazily +glaziness +glazing +glazy +gleam +gleamily +gleaminess +gleaming +gleamingly +gleamless +gleamy +glean +gleanable +gleaner +gleaning +gleary +gleba +glebal +glebe +glebeless +glebous +Glecoma +glede +Gleditsia +gledy +glee +gleed +gleeful +gleefully +gleefulness +gleeishly +gleek +gleemaiden +gleeman +gleesome +gleesomely +gleesomeness +gleet +gleety +gleewoman +gleg +glegly +glegness +glen +Glengarry +glenohumeral +glenoid +glenoidal +glent +glessite +gleyde +glia +gliadin +glial +glib +glibbery +glibly +glibness +glidder +gliddery +glide +glideless +glideness +glider +gliderport +glidewort +gliding +glidingly +gliff +gliffing +glime +glimmer +glimmering +glimmeringly +glimmerite +glimmerous +glimmery +glimpse +glimpser +glink +glint +glioma +gliomatous +gliosa +gliosis +Glires +Gliridae +gliriform +Gliriformia +glirine +Glis +glisk +glisky +glissade +glissader +glissando +glissette +glisten +glistening +glisteningly +glister +glisteringly +Glitnir +glitter +glitterance +glittering +glitteringly +glittersome +glittery +gloam +gloaming +gloat +gloater +gloating +gloatingly +global +globally +globate +globated +globe +globed +globefish +globeflower +globeholder +globelet +Globicephala +globiferous +Globigerina +globigerine +Globigerinidae +globin +Globiocephalus +globoid +globose +globosely +globoseness +globosite +globosity +globosphaerite +globous +globously +globousness +globular +Globularia +Globulariaceae +globulariaceous +globularity +globularly +globularness +globule +globulet +globulicidal +globulicide +globuliferous +globuliform +globulimeter +globulin +globulinuria +globulite +globulitic +globuloid +globulolysis +globulose +globulous +globulousness +globulysis +globy +glochid +glochideous +glochidia +glochidial +glochidian +glochidiate +glochidium +glochis +glockenspiel +gloea +gloeal +Gloeocapsa +gloeocapsoid +gloeosporiose +Gloeosporium +Gloiopeltis +Gloiosiphonia +Gloiosiphoniaceae +glom +glome +glomerate +glomeration +Glomerella +glomeroporphyritic +glomerular +glomerulate +glomerule +glomerulitis +glomerulonephritis +glomerulose +glomerulus +glommox +glomus +glonoin +glonoine +gloom +gloomful +gloomfully +gloomily +gloominess +glooming +gloomingly +gloomless +gloomth +gloomy +glop +gloppen +glor +glore +Gloria +Gloriana +gloriation +gloriette +glorifiable +glorification +glorifier +glorify +gloriole +Gloriosa +gloriosity +glorious +gloriously +gloriousness +glory +gloryful +glorying +gloryingly +gloryless +gloss +glossa +glossagra +glossal +glossalgia +glossalgy +glossanthrax +glossarial +glossarially +glossarian +glossarist +glossarize +glossary +Glossata +glossate +glossator +glossatorial +glossectomy +glossed +glosser +glossic +glossily +Glossina +glossiness +glossing +glossingly +Glossiphonia +Glossiphonidae +glossist +glossitic +glossitis +glossless +glossmeter +glossocarcinoma +glossocele +glossocoma +glossocomon +glossodynamometer +glossodynia +glossoepiglottic +glossoepiglottidean +glossograph +glossographer +glossographical +glossography +glossohyal +glossoid +glossokinesthetic +glossolabial +glossolabiolaryngeal +glossolabiopharyngeal +glossolalia +glossolalist +glossolaly +glossolaryngeal +glossological +glossologist +glossology +glossolysis +glossoncus +glossopalatine +glossopalatinus +glossopathy +glossopetra +Glossophaga +glossophagine +glossopharyngeal +glossopharyngeus +Glossophora +glossophorous +glossophytia +glossoplasty +glossoplegia +glossopode +glossopodium +Glossopteris +glossoptosis +glossopyrosis +glossorrhaphy +glossoscopia +glossoscopy +glossospasm +glossosteresis +Glossotherium +glossotomy +glossotype +glossy +glost +glottal +glottalite +glottalize +glottic +glottid +glottidean +glottis +glottiscope +glottogonic +glottogonist +glottogony +glottologic +glottological +glottologist +glottology +Gloucester +glout +glove +gloveless +glovelike +glovemaker +glovemaking +glover +gloveress +glovey +gloving +glow +glower +glowerer +glowering +gloweringly +glowfly +glowing +glowingly +glowworm +Gloxinia +gloy +gloze +glozing +glozingly +glub +glucase +glucemia +glucid +glucide +glucidic +glucina +glucine +glucinic +glucinium +glucinum +gluck +glucofrangulin +glucokinin +glucolipid +glucolipide +glucolipin +glucolipine +glucolysis +glucosaemia +glucosamine +glucosan +glucosane +glucosazone +glucose +glucosemia +glucosic +glucosid +glucosidal +glucosidase +glucoside +glucosidic +glucosidically +glucosin +glucosine +glucosone +glucosuria +glucuronic +glue +glued +gluemaker +gluemaking +gluepot +gluer +gluey +glueyness +glug +gluish +gluishness +glum +gluma +Glumaceae +glumaceous +glumal +Glumales +glume +glumiferous +Glumiflorae +glumly +glummy +glumness +glumose +glumosity +glump +glumpily +glumpiness +glumpish +glumpy +glunch +Gluneamie +glusid +gluside +glut +glutamic +glutamine +glutaminic +glutaric +glutathione +glutch +gluteal +glutelin +gluten +glutenin +glutenous +gluteofemoral +gluteoinguinal +gluteoperineal +gluteus +glutin +glutinate +glutination +glutinative +glutinize +glutinose +glutinosity +glutinous +glutinously +glutinousness +glutition +glutoid +glutose +glutter +gluttery +glutting +gluttingly +glutton +gluttoness +gluttonish +gluttonism +gluttonize +gluttonous +gluttonously +gluttonousness +gluttony +glyceraldehyde +glycerate +Glyceria +glyceric +glyceride +glycerin +glycerinate +glycerination +glycerine +glycerinize +glycerite +glycerize +glycerizin +glycerizine +glycerogel +glycerogelatin +glycerol +glycerolate +glycerole +glycerolize +glycerophosphate +glycerophosphoric +glycerose +glyceroxide +glyceryl +glycid +glycide +glycidic +glycidol +Glycine +glycine +glycinin +glycocholate +glycocholic +glycocin +glycocoll +glycogelatin +glycogen +glycogenesis +glycogenetic +glycogenic +glycogenize +glycogenolysis +glycogenous +glycogeny +glycohaemia +glycohemia +glycol +glycolaldehyde +glycolate +glycolic +glycolide +glycolipid +glycolipide +glycolipin +glycolipine +glycoluric +glycoluril +glycolyl +glycolylurea +glycolysis +glycolytic +glycolytically +Glyconian +Glyconic +glyconic +glyconin +glycoproteid +glycoprotein +glycosaemia +glycose +glycosemia +glycosin +glycosine +glycosuria +glycosuric +glycuresis +glycuronic +glycyl +glycyphyllin +Glycyrrhiza +glycyrrhizin +glyoxal +glyoxalase +glyoxalic +glyoxalin +glyoxaline +glyoxim +glyoxime +glyoxyl +glyoxylic +glyph +glyphic +glyphograph +glyphographer +glyphographic +glyphography +glyptic +glyptical +glyptician +Glyptodon +glyptodont +Glyptodontidae +glyptodontoid +glyptograph +glyptographer +glyptographic +glyptography +glyptolith +glyptological +glyptologist +glyptology +glyptotheca +Glyptotherium +glyster +Gmelina +gmelinite +gnabble +Gnaeus +gnaphalioid +Gnaphalium +gnar +gnarl +gnarled +gnarliness +gnarly +gnash +gnashingly +gnat +gnatcatcher +gnatflower +gnathal +gnathalgia +gnathic +gnathidium +gnathion +gnathism +gnathite +gnathitis +Gnatho +gnathobase +gnathobasic +Gnathobdellae +Gnathobdellida +gnathometer +gnathonic +gnathonical +gnathonically +gnathonism +gnathonize +gnathophorous +gnathoplasty +gnathopod +Gnathopoda +gnathopodite +gnathopodous +gnathostegite +Gnathostoma +Gnathostomata +gnathostomatous +gnathostome +Gnathostomi +gnathostomous +gnathotheca +gnatling +gnatproof +gnatsnap +gnatsnapper +gnatter +gnatty +gnatworm +gnaw +gnawable +gnawer +gnawing +gnawingly +gnawn +gneiss +gneissic +gneissitic +gneissoid +gneissose +gneissy +Gnetaceae +gnetaceous +Gnetales +Gnetum +gnocchetti +gnome +gnomed +gnomesque +gnomic +gnomical +gnomically +gnomide +gnomish +gnomist +gnomologic +gnomological +gnomologist +gnomology +gnomon +Gnomonia +Gnomoniaceae +gnomonic +gnomonical +gnomonics +gnomonological +gnomonologically +gnomonology +gnosiological +gnosiology +gnosis +Gnostic +gnostic +gnostical +gnostically +Gnosticism +gnosticity +gnosticize +gnosticizer +gnostology +gnu +go +goa +goad +goadsman +goadster +goaf +Goajiro +goal +Goala +goalage +goalee +goalie +goalkeeper +goalkeeping +goalless +goalmouth +Goan +Goanese +goanna +Goasila +goat +goatbeard +goatbrush +goatbush +goatee +goateed +goatfish +goatherd +goatherdess +goatish +goatishly +goatishness +goatland +goatlike +goatling +goatly +goatroot +goatsbane +goatsbeard +goatsfoot +goatskin +goatstone +goatsucker +goatweed +goaty +goave +gob +goback +goban +gobang +gobbe +gobber +gobbet +gobbin +gobbing +gobble +gobbledygook +gobbler +gobby +Gobelin +gobelin +gobernadora +gobi +Gobia +Gobian +gobiesocid +Gobiesocidae +gobiesociform +Gobiesox +gobiid +Gobiidae +gobiiform +Gobiiformes +Gobinism +Gobinist +Gobio +gobioid +Gobioidea +Gobioidei +goblet +gobleted +gobletful +goblin +gobline +goblinesque +goblinish +goblinism +goblinize +goblinry +gobmouthed +gobo +gobonated +gobony +gobstick +goburra +goby +gobylike +gocart +Goclenian +God +god +godchild +Goddam +Goddard +goddard +goddaughter +godded +goddess +goddesshood +goddessship +goddikin +goddize +gode +godet +Godetia +godfather +godfatherhood +godfathership +Godforsaken +Godfrey +Godful +godhead +godhood +Godiva +godkin +godless +godlessly +godlessness +godlet +godlike +godlikeness +godlily +godliness +godling +godly +godmaker +godmaking +godmamma +godmother +godmotherhood +godmothership +godown +godpapa +godparent +Godsake +godsend +godship +godson +godsonship +Godspeed +Godward +Godwin +Godwinian +godwit +goeduck +goel +goelism +Goemagot +Goemot +goer +goes +Goetae +Goethian +goetia +goetic +goetical +goety +goff +goffer +goffered +gofferer +goffering +goffle +gog +gogga +goggan +goggle +goggled +goggler +gogglers +goggly +goglet +Gogo +gogo +Gohila +goi +goiabada +Goidel +Goidelic +going +goitcho +goiter +goitered +goitral +goitrogen +goitrogenic +goitrous +Gokuraku +gol +gola +golach +goladar +golandaas +golandause +Golaseccan +Golconda +Gold +gold +goldbeater +goldbeating +Goldbird +goldbrick +goldbricker +goldbug +goldcrest +goldcup +golden +goldenback +goldeneye +goldenfleece +goldenhair +goldenknop +goldenlocks +goldenly +Goldenmouth +goldenmouthed +goldenness +goldenpert +goldenrod +goldenseal +goldentop +goldenwing +golder +goldfielder +goldfinch +goldfinny +goldfish +goldflower +goldhammer +goldhead +Goldi +Goldic +goldie +goldilocks +goldin +goldish +goldless +goldlike +Goldonian +goldseed +goldsinny +goldsmith +goldsmithery +goldsmithing +goldspink +goldstone +goldtail +goldtit +goldwater +goldweed +goldwork +goldworker +Goldy +goldy +golee +golem +golf +golfdom +golfer +Golgi +Golgotha +goli +goliard +goliardery +goliardic +Goliath +goliath +goliathize +golkakra +Goll +golland +gollar +golliwogg +golly +Golo +goloe +golpe +Goma +gomari +Gomarian +Gomarist +Gomarite +gomart +gomashta +gomavel +gombay +gombeen +gombeenism +gombroon +Gomeisa +gomer +gomeral +gomlah +gommelin +Gomontia +Gomorrhean +Gomphocarpus +gomphodont +Gompholobium +gomphosis +Gomphrena +gomuti +gon +Gona +gonad +gonadal +gonadial +gonadic +gonadotropic +gonadotropin +gonaduct +gonagra +gonakie +gonal +gonalgia +gonangial +gonangium +gonapod +gonapophysal +gonapophysial +gonapophysis +gonarthritis +Gond +gondang +Gondi +gondite +gondola +gondolet +gondolier +gone +goneness +goneoclinic +gonepoiesis +gonepoietic +goner +Goneril +gonesome +gonfalcon +gonfalonier +gonfalonierate +gonfaloniership +gonfanon +gong +gongman +Gongoresque +Gongorism +Gongorist +gongoristic +gonia +goniac +gonial +goniale +Goniaster +goniatite +Goniatites +goniatitic +goniatitid +Goniatitidae +goniatitoid +gonid +gonidangium +gonidia +gonidial +gonidic +gonidiferous +gonidiogenous +gonidioid +gonidiophore +gonidiose +gonidiospore +gonidium +gonimic +gonimium +gonimolobe +gonimous +goniocraniometry +Goniodoridae +Goniodorididae +Goniodoris +goniometer +goniometric +goniometrical +goniometrically +goniometry +gonion +Goniopholidae +Goniopholis +goniostat +goniotropous +gonitis +Gonium +gonium +gonnardite +gonne +gonoblast +gonoblastic +gonoblastidial +gonoblastidium +gonocalycine +gonocalyx +gonocheme +gonochorism +gonochorismal +gonochorismus +gonochoristic +gonococcal +gonococcic +gonococcoid +gonococcus +gonocoel +gonocyte +gonoecium +Gonolobus +gonomere +gonomery +gonophore +gonophoric +gonophorous +gonoplasm +gonopoietic +gonorrhea +gonorrheal +gonorrheic +gonosomal +gonosome +gonosphere +gonostyle +gonotheca +gonothecal +gonotokont +gonotome +gonotype +gonozooid +gony +gonyalgia +gonydeal +gonydial +gonyocele +gonyoncus +gonys +Gonystylaceae +gonystylaceous +Gonystylus +gonytheca +Gonzalo +goo +goober +good +Goodenia +Goodeniaceae +goodeniaceous +Goodenoviaceae +goodhearted +goodheartedly +goodheartedness +gooding +goodish +goodishness +goodlihead +goodlike +goodliness +goodly +goodman +goodmanship +goodness +goods +goodsome +goodwife +goodwill +goodwillit +goodwilly +goody +goodyear +Goodyera +goodyish +goodyism +goodyness +goodyship +goof +goofer +goofily +goofiness +goofy +googly +googol +googolplex +googul +gook +gool +goolah +gools +gooma +goon +goondie +goonie +Goop +goosander +goose +goosebeak +gooseberry +goosebill +goosebird +goosebone +gooseboy +goosecap +goosefish +gooseflower +goosefoot +goosegirl +goosegog +gooseherd +goosehouse +gooselike +goosemouth +gooseneck +goosenecked +gooserumped +goosery +goosetongue +gooseweed +goosewing +goosewinged +goosish +goosishly +goosishness +goosy +gopher +gopherberry +gopherroot +gopherwood +gopura +Gor +gor +gora +goracco +goral +goran +gorb +gorbal +gorbellied +gorbelly +gorbet +gorble +gorblimy +gorce +gorcock +gorcrow +Gordiacea +gordiacean +gordiaceous +Gordian +Gordiidae +Gordioidea +Gordius +gordolobo +Gordonia +gordunite +Gordyaean +gore +gorer +gorevan +gorfly +gorge +gorgeable +gorged +gorgedly +gorgelet +gorgeous +gorgeously +gorgeousness +gorger +gorgerin +gorget +gorgeted +gorglin +Gorgon +Gorgonacea +gorgonacean +gorgonaceous +gorgonesque +gorgoneum +Gorgonia +Gorgoniacea +gorgoniacean +gorgoniaceous +Gorgonian +gorgonian +gorgonin +gorgonize +gorgonlike +Gorgonzola +Gorgosaurus +gorhen +goric +gorilla +gorillaship +gorillian +gorilline +gorilloid +gorily +goriness +goring +Gorkhali +Gorkiesque +gorlin +gorlois +gormandize +gormandizer +gormaw +gormed +gorra +gorraf +gorry +gorse +gorsebird +gorsechat +gorsedd +gorsehatch +gorsy +Gortonian +Gortonite +gory +gos +gosain +goschen +gosh +goshawk +Goshen +goshenite +goslarite +goslet +gosling +gosmore +gospel +gospeler +gospelist +gospelize +gospellike +gospelly +gospelmonger +gospelwards +Gosplan +gospodar +gosport +gossamer +gossamered +gossamery +gossampine +gossan +gossaniferous +gossard +gossip +gossipdom +gossipee +gossiper +gossiphood +gossipiness +gossiping +gossipingly +gossipmonger +gossipred +gossipry +gossipy +gossoon +gossy +gossypine +Gossypium +gossypol +gossypose +got +gotch +gote +Goth +Gotha +Gotham +Gothamite +Gothic +Gothically +Gothicism +Gothicist +Gothicity +Gothicize +Gothicizer +Gothicness +Gothish +Gothism +gothite +Gothlander +Gothonic +Gotiglacial +gotra +gotraja +gotten +Gottfried +Gottlieb +gouaree +Gouda +Goudy +gouge +gouger +goujon +goulash +goumi +goup +Goura +gourami +gourd +gourde +gourdful +gourdhead +gourdiness +gourdlike +gourdworm +gourdy +Gourinae +gourmand +gourmander +gourmanderie +gourmandism +gourmet +gourmetism +gourounut +goustrous +gousty +gout +goutify +goutily +goutiness +goutish +goutte +goutweed +goutwort +gouty +gove +govern +governability +governable +governableness +governably +governail +governance +governess +governessdom +governesshood +governessy +governing +governingly +government +governmental +governmentalism +governmentalist +governmentalize +governmentally +governmentish +governor +governorate +governorship +gowan +gowdnie +gowf +gowfer +gowiddie +gowk +gowked +gowkedly +gowkedness +gowkit +gowl +gown +gownlet +gownsman +gowpen +goy +Goyana +goyazite +Goyetian +goyim +goyin +goyle +gozell +gozzard +gra +Graafian +grab +grabbable +grabber +grabble +grabbler +grabbling +grabbots +graben +grabhook +grabouche +grace +graceful +gracefully +gracefulness +graceless +gracelessly +gracelessness +gracelike +gracer +Gracilaria +gracilariid +Gracilariidae +gracile +gracileness +gracilescent +gracilis +gracility +graciosity +gracioso +gracious +graciously +graciousness +grackle +Graculus +grad +gradable +gradal +gradate +gradation +gradational +gradationally +gradationately +gradative +gradatively +gradatory +graddan +grade +graded +gradefinder +gradely +grader +Gradgrind +gradgrind +Gradgrindian +Gradgrindish +Gradgrindism +gradient +gradienter +Gradientia +gradin +gradine +grading +gradiometer +gradiometric +gradometer +gradual +gradualism +gradualist +gradualistic +graduality +gradually +gradualness +graduand +graduate +graduated +graduateship +graduatical +graduating +graduation +graduator +gradus +Graeae +Graeculus +graff +graffage +graffer +Graffias +graffito +grafship +graft +graftage +graftdom +grafted +grafter +grafting +graftonite +graftproof +graham +grahamite +Graian +grail +grailer +grailing +grain +grainage +grained +grainedness +grainer +grainering +grainery +grainfield +graininess +graining +grainland +grainless +grainman +grainsick +grainsickness +grainsman +grainways +grainy +graip +graisse +graith +Grallae +Grallatores +grallatorial +grallatory +grallic +Grallina +gralline +gralloch +gram +grama +gramarye +gramashes +grame +gramenite +gramicidin +Graminaceae +graminaceous +Gramineae +gramineal +gramineous +gramineousness +graminicolous +graminiferous +graminifolious +graminiform +graminin +graminivore +graminivorous +graminological +graminology +graminous +grammalogue +grammar +grammarian +grammarianism +grammarless +grammatic +grammatical +grammatically +grammaticalness +grammaticaster +grammaticism +grammaticize +grammatics +grammatist +grammatistical +grammatite +grammatolator +grammatolatry +Grammatophyllum +gramme +Grammontine +gramoches +Gramophone +gramophone +gramophonic +gramophonical +gramophonically +gramophonist +gramp +grampa +grampus +granada +granadilla +granadillo +Granadine +granage +granary +granate +granatum +granch +grand +grandam +grandame +grandaunt +grandchild +granddad +granddaddy +granddaughter +granddaughterly +grandee +grandeeism +grandeeship +grandesque +grandeur +grandeval +grandfather +grandfatherhood +grandfatherish +grandfatherless +grandfatherly +grandfathership +grandfer +grandfilial +grandiloquence +grandiloquent +grandiloquently +grandiloquous +grandiose +grandiosely +grandiosity +grandisonant +Grandisonian +Grandisonianism +grandisonous +grandly +grandma +grandmaternal +Grandmontine +grandmother +grandmotherhood +grandmotherism +grandmotherliness +grandmotherly +grandnephew +grandness +grandniece +grandpa +grandparent +grandparentage +grandparental +grandpaternal +grandsire +grandson +grandsonship +grandstand +grandstander +granduncle +grane +grange +granger +grangerism +grangerite +grangerization +grangerize +grangerizer +Grangousier +graniform +granilla +granite +granitelike +graniteware +granitic +granitical +graniticoline +granitiferous +granitification +granitiform +granitite +granitization +granitize +granitoid +granivore +granivorous +granjeno +grank +grannom +granny +grannybush +grano +granoblastic +granodiorite +granogabbro +granolite +granolith +granolithic +granomerite +granophyre +granophyric +granose +granospherite +grant +grantable +grantedly +grantee +granter +Granth +Grantha +Grantia +Grantiidae +grantor +granula +granular +granularity +granularly +granulary +granulate +granulated +granulater +granulation +granulative +granulator +granule +granulet +granuliferous +granuliform +granulite +granulitic +granulitis +granulitization +granulitize +granulize +granuloadipose +granulocyte +granuloma +granulomatous +granulometric +granulosa +granulose +granulous +granza +granzita +grape +graped +grapeflower +grapefruit +grapeful +grapeless +grapelet +grapelike +grapenuts +graperoot +grapery +grapeshot +grapeskin +grapestalk +grapestone +grapevine +grapewise +grapewort +graph +graphalloy +graphic +graphical +graphically +graphicalness +graphicly +graphicness +graphics +Graphidiaceae +Graphiola +graphiological +graphiologist +graphiology +Graphis +graphite +graphiter +graphitic +graphitization +graphitize +graphitoid +graphitoidal +Graphium +graphologic +graphological +graphologist +graphology +graphomania +graphomaniac +graphometer +graphometric +graphometrical +graphometry +graphomotor +Graphophone +graphophone +graphophonic +graphorrhea +graphoscope +graphospasm +graphostatic +graphostatical +graphostatics +graphotype +graphotypic +graphy +graping +grapnel +grappa +grapple +grappler +grappling +Grapsidae +grapsoid +Grapsus +Grapta +graptolite +Graptolitha +Graptolithida +Graptolithina +graptolitic +Graptolitoidea +Graptoloidea +graptomancy +grapy +grasp +graspable +grasper +grasping +graspingly +graspingness +graspless +grass +grassant +grassation +grassbird +grasschat +grasscut +grasscutter +grassed +grasser +grasset +grassflat +grassflower +grasshop +grasshopper +grasshopperdom +grasshopperish +grasshouse +grassiness +grassing +grassland +grassless +grasslike +grassman +grassnut +grassplot +grassquit +grasswards +grassweed +grasswidowhood +grasswork +grassworm +grassy +grat +grate +grateful +gratefully +gratefulness +grateless +grateman +grater +gratewise +grather +Gratia +Gratiano +graticulate +graticulation +graticule +gratification +gratified +gratifiedly +gratifier +gratify +gratifying +gratifyingly +gratility +gratillity +gratinate +grating +Gratiola +gratiolin +gratiosolin +gratis +gratitude +gratten +grattoir +gratuitant +gratuitous +gratuitously +gratuitousness +gratuity +gratulant +gratulate +gratulation +gratulatorily +gratulatory +graupel +gravamen +gravamina +grave +graveclod +gravecloth +graveclothes +graved +gravedigger +gravegarth +gravel +graveless +gravelike +graveling +gravelish +gravelliness +gravelly +gravelroot +gravelstone +gravelweed +gravely +gravemaker +gravemaking +graveman +gravemaster +graven +graveness +Gravenstein +graveolence +graveolency +graveolent +graver +Graves +graveship +graveside +gravestead +gravestone +graveward +gravewards +graveyard +gravic +gravicembalo +gravid +gravidity +gravidly +gravidness +Gravigrada +gravigrade +gravimeter +gravimetric +gravimetrical +gravimetrically +gravimetry +graving +gravitate +gravitater +gravitation +gravitational +gravitationally +gravitative +gravitometer +gravity +gravure +gravy +grawls +gray +grayback +graybeard +graycoat +grayfish +grayfly +grayhead +grayish +graylag +grayling +grayly +graymalkin +graymill +grayness +graypate +graywacke +grayware +graywether +grazable +graze +grazeable +grazer +grazier +grazierdom +graziery +grazing +grazingly +grease +greasebush +greasehorn +greaseless +greaselessness +greaseproof +greaseproofness +greaser +greasewood +greasily +greasiness +greasy +great +greatcoat +greatcoated +greaten +greater +greathead +greatheart +greathearted +greatheartedness +greatish +greatly +greatmouthed +greatness +greave +greaved +greaves +grebe +Grebo +grece +Grecian +Grecianize +Grecism +Grecize +Grecomania +Grecomaniac +Grecophil +gree +greed +greedily +greediness +greedless +greedsome +greedy +greedygut +greedyguts +Greek +Greekdom +Greekery +Greekess +Greekish +Greekism +Greekist +Greekize +Greekless +Greekling +green +greenable +greenage +greenalite +greenback +Greenbacker +Greenbackism +greenbark +greenbone +greenbrier +Greencloth +greencoat +greener +greenery +greeney +greenfinch +greenfish +greengage +greengill +greengrocer +greengrocery +greenhead +greenheaded +greenheart +greenhearted +greenhew +greenhide +greenhood +greenhorn +greenhornism +greenhouse +greening +greenish +greenishness +greenkeeper +greenkeeping +Greenland +Greenlander +Greenlandic +Greenlandish +greenlandite +Greenlandman +greenleek +greenless +greenlet +greenling +greenly +greenness +greenockite +greenovite +greenroom +greensand +greensauce +greenshank +greensick +greensickness +greenside +greenstone +greenstuff +greensward +greenswarded +greentail +greenth +greenuk +greenweed +Greenwich +greenwing +greenwithe +greenwood +greenwort +greeny +greenyard +greet +greeter +greeting +greetingless +greetingly +greffier +greffotome +gregal +gregale +gregaloid +gregarian +gregarianism +Gregarina +Gregarinae +Gregarinaria +gregarine +Gregarinida +gregarinidal +gregariniform +Gregarinina +Gregarinoidea +gregarinosis +gregarinous +gregarious +gregariously +gregariousness +gregaritic +grege +greggle +grego +Gregorian +Gregorianist +Gregorianize +Gregorianizer +Gregory +greige +grein +greisen +gremial +gremlin +grenade +Grenadian +grenadier +grenadierial +grenadierly +grenadiership +grenadin +grenadine +Grendel +Grenelle +Gressoria +gressorial +gressorious +Greta +Gretchen +Gretel +greund +Grevillea +grew +grewhound +Grewia +grey +greyhound +Greyiaceae +greyly +greyness +gribble +grice +grid +griddle +griddlecake +griddler +gride +gridelin +gridiron +griece +grieced +grief +griefful +grieffully +griefless +grieflessness +grieshoch +grievance +grieve +grieved +grievedly +griever +grieveship +grieving +grievingly +grievous +grievously +grievousness +griff +griffade +griffado +griffaun +griffe +griffin +griffinage +griffinesque +griffinhood +griffinish +griffinism +Griffith +griffithite +Griffon +griffon +griffonage +griffonne +grift +grifter +grig +griggles +grignet +grigri +grihastha +grihyasutra +grike +grill +grillade +grillage +grille +grilled +griller +grillroom +grillwork +grilse +grim +grimace +grimacer +grimacier +grimacing +grimacingly +grimalkin +grime +grimful +grimgribber +grimily +griminess +grimliness +grimly +grimme +Grimmia +Grimmiaceae +grimmiaceous +grimmish +grimness +grimp +grimy +grin +grinagog +grinch +grind +grindable +Grindelia +grinder +grinderman +grindery +grinding +grindingly +grindle +grindstone +gringo +gringolee +gringophobia +Grinnellia +grinner +grinning +grinningly +grinny +grintern +grip +gripe +gripeful +griper +gripgrass +griphite +Griphosaurus +griping +gripingly +gripless +gripman +gripment +grippal +grippe +gripper +grippiness +gripping +grippingly +grippingness +gripple +grippleness +grippotoxin +grippy +gripsack +gripy +Griqua +griquaite +Griqualander +gris +grisaille +grisard +Griselda +griseous +grisette +grisettish +grisgris +griskin +grisliness +grisly +Grison +grison +grisounite +grisoutine +Grissel +grissens +grissons +grist +gristbite +grister +Gristhorbia +gristle +gristliness +gristly +gristmill +gristmiller +gristmilling +gristy +grit +grith +grithbreach +grithman +gritless +gritrock +grits +gritstone +gritten +gritter +grittily +grittiness +grittle +gritty +grivet +grivna +Grizel +Grizzel +grizzle +grizzled +grizzler +grizzly +grizzlyman +groan +groaner +groanful +groaning +groaningly +groat +groats +groatsworth +grobian +grobianism +grocer +grocerdom +groceress +grocerly +grocerwise +grocery +groceryman +Groenendael +groff +grog +groggery +groggily +grogginess +groggy +grogram +grogshop +groin +groined +groinery +groining +Grolier +Grolieresque +gromatic +gromatics +Gromia +grommet +gromwell +groom +groomer +groomish +groomishly +groomlet +groomling +groomsman +groomy +groop +groose +groot +grooty +groove +grooveless +groovelike +groover +grooverhead +grooviness +grooving +groovy +grope +groper +groping +gropingly +gropple +grorudite +gros +grosbeak +groschen +groser +groset +grosgrain +grosgrained +gross +grossart +grossen +grosser +grossification +grossify +grossly +grossness +grosso +grossulaceous +grossular +Grossularia +grossularia +Grossulariaceae +grossulariaceous +grossularious +grossularite +grosz +groszy +grot +grotesque +grotesquely +grotesqueness +grotesquerie +grothine +grothite +Grotian +Grotianism +grottesco +grotto +grottoed +grottolike +grottowork +grouch +grouchily +grouchiness +grouchingly +grouchy +grouf +grough +ground +groundable +groundably +groundage +groundberry +groundbird +grounded +groundedly +groundedness +groundenell +grounder +groundflower +grounding +groundless +groundlessly +groundlessness +groundliness +groundling +groundly +groundman +groundmass +groundneedle +groundnut +groundplot +grounds +groundsel +groundsill +groundsman +groundward +groundwood +groundwork +groundy +group +groupage +groupageness +grouped +grouper +grouping +groupist +grouplet +groupment +groupwise +grouse +grouseberry +grouseless +grouser +grouseward +grousewards +grousy +grout +grouter +grouthead +grouts +grouty +grouze +grove +groved +grovel +groveler +groveless +groveling +grovelingly +grovelings +grovy +grow +growable +growan +growed +grower +growing +growingly +growingupness +growl +growler +growlery +growling +growlingly +growly +grown +grownup +growse +growsome +growth +growthful +growthiness +growthless +growthy +grozart +grozet +grr +grub +grubbed +grubber +grubbery +grubbily +grubbiness +grubby +grubhood +grubless +grubroot +grubs +grubstake +grubstaker +Grubstreet +grubstreet +grubworm +grudge +grudgeful +grudgefully +grudgekin +grudgeless +grudger +grudgery +grudging +grudgingly +grudgingness +grudgment +grue +gruel +grueler +grueling +gruelly +Grues +gruesome +gruesomely +gruesomeness +gruff +gruffily +gruffiness +gruffish +gruffly +gruffness +gruffs +gruffy +grufted +grugru +Gruidae +gruiform +Gruiformes +gruine +Gruis +grum +grumble +grumbler +grumblesome +Grumbletonian +grumbling +grumblingly +grumbly +grume +Grumium +grumly +grummel +grummels +grummet +grummeter +grumness +grumose +grumous +grumousness +grump +grumph +grumphie +grumphy +grumpily +grumpiness +grumpish +grumpy +grun +Grundified +Grundlov +grundy +Grundyism +Grundyist +Grundyite +grunerite +gruneritization +grunion +grunt +grunter +Grunth +grunting +gruntingly +gruntle +gruntled +gruntling +Grus +grush +grushie +Grusian +Grusinian +gruss +grutch +grutten +gryde +grylli +gryllid +Gryllidae +gryllos +Gryllotalpa +Gryllus +gryllus +grypanian +Gryphaea +Gryphosaurus +gryposis +Grypotherium +grysbok +guaba +guacacoa +guachamaca +guacharo +guachipilin +Guacho +Guacico +guacimo +guacin +guaco +guaconize +Guadagnini +guadalcazarite +Guaharibo +Guahiban +Guahibo +Guahivo +guaiac +guaiacol +guaiacolize +guaiaconic +guaiacum +guaiaretic +guaiasanol +guaiol +guaka +Gualaca +guama +guan +Guana +guana +guanabana +guanabano +guanaco +guanajuatite +guanamine +guanase +guanay +Guanche +guaneide +guango +guanidine +guanidopropionic +guaniferous +guanine +guanize +guano +guanophore +guanosine +guanyl +guanylic +guao +guapena +guapilla +guapinol +Guaque +guar +guara +guarabu +guaracha +guaraguao +guarana +Guarani +guarani +Guaranian +guaranine +guarantee +guaranteeship +guarantor +guarantorship +guaranty +guarapucu +Guaraunan +Guarauno +guard +guardable +guardant +guarded +guardedly +guardedness +guardeen +guarder +guardfish +guardful +guardfully +guardhouse +guardian +guardiancy +guardianess +guardianless +guardianly +guardianship +guarding +guardingly +guardless +guardlike +guardo +guardrail +guardroom +guardship +guardsman +guardstone +Guarea +guariba +guarinite +guarneri +Guarnerius +Guarnieri +Guarrau +guarri +Guaruan +guasa +Guastalline +guatambu +Guatemalan +Guatemaltecan +guativere +Guato +Guatoan +Guatusan +Guatuso +Guauaenok +guava +guavaberry +guavina +guayaba +guayabi +guayabo +guayacan +Guayaqui +Guaycuru +Guaycuruan +Guaymie +guayroto +guayule +guaza +Guazuma +gubbertush +Gubbin +gubbo +gubernacula +gubernacular +gubernaculum +gubernative +gubernator +gubernatorial +gubernatrix +guberniya +gucki +gud +gudame +guddle +gude +gudebrother +gudefather +gudemother +gudesake +gudesakes +gudesire +gudewife +gudge +gudgeon +gudget +gudok +gue +guebucu +guejarite +Guelph +Guelphic +Guelphish +Guelphism +guemal +guenepe +guenon +guepard +guerdon +guerdonable +guerdoner +guerdonless +guereza +Guerickian +Guerinet +Guernsey +guernsey +guernseyed +guerrilla +guerrillaism +guerrillaship +Guesdism +Guesdist +guess +guessable +guesser +guessing +guessingly +guesswork +guessworker +guest +guestchamber +guesten +guester +guesthouse +guesting +guestive +guestless +Guestling +guestling +guestmaster +guestship +guestwise +Guetar +Guetare +gufa +guff +guffaw +guffer +guffin +guffy +gugal +guggle +gugglet +guglet +guglia +guglio +gugu +Guha +Guhayna +guhr +Guiana +Guianan +Guianese +guib +guiba +guidable +guidage +guidance +guide +guideboard +guidebook +guidebookish +guidecraft +guideless +guideline +guidepost +guider +guideress +guidership +guideship +guideway +guidman +guidon +Guidonian +guidwilly +guige +Guignardia +guignol +guijo +Guilandina +guild +guilder +guildhall +guildic +guildry +guildship +guildsman +guile +guileful +guilefully +guilefulness +guileless +guilelessly +guilelessness +guilery +guillemet +guillemot +guillevat +guilloche +guillochee +guillotinade +guillotine +guillotinement +guillotiner +guillotinism +guillotinist +guilt +guiltily +guiltiness +guiltless +guiltlessly +guiltlessness +guiltsick +guilty +guily +guimbard +guimpe +Guinea +guinea +Guineaman +Guinean +Guinevere +guipure +Guisard +guisard +guise +guiser +Guisian +guising +guitar +guitarfish +guitarist +guitermanite +guitguit +Guittonian +Gujar +Gujarati +Gujrati +gul +gula +gulae +gulaman +gulancha +Gulanganes +gular +gularis +gulch +gulden +guldengroschen +gule +gules +Gulf +gulf +gulflike +gulfside +gulfwards +gulfweed +gulfy +gulgul +gulinula +gulinulae +gulinular +gulix +gull +Gullah +gullery +gullet +gulleting +gullibility +gullible +gullibly +gullion +gullish +gullishly +gullishness +gully +gullyhole +Gulo +gulonic +gulose +gulosity +gulp +gulper +gulpin +gulping +gulpingly +gulpy +gulravage +gulsach +Gum +gum +gumbo +gumboil +gumbotil +gumby +gumchewer +gumdigger +gumdigging +gumdrop +gumfield +gumflower +gumihan +gumless +gumlike +gumly +gumma +gummage +gummaker +gummaking +gummata +gummatous +gummed +gummer +gummiferous +gumminess +gumming +gummite +gummose +gummosis +gummosity +gummous +gummy +gump +gumphion +gumption +gumptionless +gumptious +gumpus +gumshoe +gumweed +gumwood +gun +guna +gunate +gunation +gunbearer +gunboat +gunbright +gunbuilder +guncotton +gundi +gundy +gunebo +gunfire +gunflint +gunge +gunhouse +Gunite +gunite +gunj +gunk +gunl +gunless +gunlock +gunmaker +gunmaking +gunman +gunmanship +gunnage +gunne +gunnel +gunner +Gunnera +Gunneraceae +gunneress +gunnership +gunnery +gunnies +gunning +gunnung +gunny +gunocracy +gunong +gunpaper +gunplay +gunpowder +gunpowderous +gunpowdery +gunpower +gunrack +gunreach +gunrunner +gunrunning +gunsel +gunshop +gunshot +gunsman +gunsmith +gunsmithery +gunsmithing +gunster +gunstick +gunstock +gunstocker +gunstocking +gunstone +gunter +Gunther +gunwale +gunyah +gunyang +gunyeh +Gunz +Gunzian +gup +guppy +guptavidya +gur +Guran +gurdfish +gurdle +gurdwara +gurge +gurgeon +gurgeons +gurges +gurgitation +gurgle +gurglet +gurgling +gurglingly +gurgly +gurgoyle +gurgulation +Gurian +Guric +Gurish +Gurjara +gurjun +gurk +Gurkha +gurl +gurly +Gurmukhi +gurnard +gurnet +gurnetty +Gurneyite +gurniad +gurr +gurrah +gurry +gurt +guru +guruship +Gus +gush +gusher +gushet +gushily +gushiness +gushing +gushingly +gushingness +gushy +gusla +gusle +guss +gusset +Gussie +gussie +gust +gustable +gustation +gustative +gustativeness +gustatory +Gustavus +gustful +gustfully +gustfulness +gustily +gustiness +gustless +gusto +gustoish +Gustus +gusty +gut +Guti +Gutium +gutless +gutlike +gutling +Gutnic +Gutnish +gutt +gutta +guttable +guttate +guttated +guttatim +guttation +gutte +gutter +Guttera +gutterblood +guttering +gutterlike +gutterling +gutterman +guttersnipe +guttersnipish +gutterspout +gutterwise +guttery +gutti +guttide +guttie +Guttiferae +guttiferal +Guttiferales +guttiferous +guttiform +guttiness +guttle +guttler +guttula +guttulae +guttular +guttulate +guttule +guttural +gutturalism +gutturality +gutturalization +gutturalize +gutturally +gutturalness +gutturize +gutturonasal +gutturopalatal +gutturopalatine +gutturotetany +guttus +gutty +gutweed +gutwise +gutwort +guvacine +guvacoline +Guy +guy +Guyandot +guydom +guyer +guytrash +guz +guze +Guzmania +guzmania +Guzul +guzzle +guzzledom +guzzler +gwag +gweduc +gweed +gweeon +gwely +Gwen +Gwendolen +gwine +gwyniad +Gyarung +gyascutus +Gyges +Gygis +gyle +gym +gymel +gymkhana +Gymnadenia +Gymnadeniopsis +Gymnanthes +gymnanthous +Gymnarchidae +Gymnarchus +gymnasia +gymnasial +gymnasiarch +gymnasiarchy +gymnasiast +gymnasic +gymnasium +gymnast +gymnastic +gymnastically +gymnastics +gymnemic +gymnetrous +gymnic +gymnical +gymnics +gymnite +Gymnoblastea +gymnoblastic +Gymnocalycium +gymnocarpic +gymnocarpous +Gymnocerata +gymnoceratous +gymnocidium +Gymnocladus +Gymnoconia +Gymnoderinae +Gymnodiniaceae +gymnodiniaceous +Gymnodiniidae +Gymnodinium +gymnodont +Gymnodontes +gymnogen +gymnogenous +Gymnoglossa +gymnoglossate +gymnogynous +Gymnogyps +Gymnolaema +Gymnolaemata +gymnolaematous +Gymnonoti +Gymnopaedes +gymnopaedic +gymnophiona +gymnoplast +Gymnorhina +gymnorhinal +Gymnorhininae +gymnosoph +gymnosophist +gymnosophy +gymnosperm +Gymnospermae +gymnospermal +gymnospermic +gymnospermism +Gymnospermous +gymnospermy +Gymnosporangium +gymnospore +gymnosporous +Gymnostomata +Gymnostomina +gymnostomous +Gymnothorax +gymnotid +Gymnotidae +Gymnotoka +gymnotokous +Gymnotus +Gymnura +gymnure +Gymnurinae +gymnurine +gympie +gyn +gynaecea +gynaeceum +gynaecocoenic +gynander +gynandrarchic +gynandrarchy +Gynandria +gynandria +gynandrian +gynandrism +gynandroid +gynandromorph +gynandromorphic +gynandromorphism +gynandromorphous +gynandromorphy +gynandrophore +gynandrosporous +gynandrous +gynandry +gynantherous +gynarchic +gynarchy +gyne +gynecic +gynecidal +gynecide +gynecocentric +gynecocracy +gynecocrat +gynecocratic +gynecocratical +gynecoid +gynecolatry +gynecologic +gynecological +gynecologist +gynecology +gynecomania +gynecomastia +gynecomastism +gynecomasty +gynecomazia +gynecomorphous +gyneconitis +gynecopathic +gynecopathy +gynecophore +gynecophoric +gynecophorous +gynecotelic +gynecratic +gyneocracy +gyneolater +gyneolatry +gynephobia +Gynerium +gynethusia +gyniatrics +gyniatry +gynic +gynics +gynobase +gynobaseous +gynobasic +gynocardia +gynocardic +gynocracy +gynocratic +gynodioecious +gynodioeciously +gynodioecism +gynoecia +gynoecium +gynogenesis +gynomonecious +gynomonoeciously +gynomonoecism +gynophagite +gynophore +gynophoric +gynosporangium +gynospore +gynostegia +gynostegium +gynostemium +Gynura +gyp +Gypaetus +gype +gypper +Gyppo +Gyps +gyps +gypseian +gypseous +gypsiferous +gypsine +gypsiologist +gypsite +gypsography +gypsologist +gypsology +Gypsophila +gypsophila +gypsophilous +gypsophily +gypsoplast +gypsous +gypster +gypsum +Gypsy +gypsy +gypsydom +gypsyesque +gypsyfy +gypsyhead +gypsyhood +gypsyish +gypsyism +gypsylike +gypsyry +gypsyweed +gypsywise +gypsywort +Gyracanthus +gyral +gyrally +gyrant +gyrate +gyration +gyrational +gyrator +gyratory +gyre +Gyrencephala +gyrencephalate +gyrencephalic +gyrencephalous +gyrene +gyrfalcon +gyri +gyric +gyrinid +Gyrinidae +Gyrinus +gyro +gyrocar +gyroceracone +gyroceran +Gyroceras +gyrochrome +gyrocompass +Gyrodactylidae +Gyrodactylus +gyrogonite +gyrograph +gyroidal +gyroidally +gyrolite +gyrolith +gyroma +gyromagnetic +gyromancy +gyromele +gyrometer +Gyromitra +gyron +gyronny +Gyrophora +Gyrophoraceae +Gyrophoraceous +gyrophoric +gyropigeon +gyroplane +gyroscope +gyroscopic +gyroscopically +gyroscopics +gyrose +gyrostabilizer +Gyrostachys +gyrostat +gyrostatic +gyrostatically +gyrostatics +Gyrotheca +gyrous +gyrovagi +gyrovagues +gyrowheel +gyrus +gyte +gytling +gyve +H +h +ha +haab +haaf +Habab +habanera +Habbe +habble +habdalah +Habe +habeas +habena +habenal +habenar +Habenaria +habendum +habenula +habenular +haberdash +haberdasher +haberdasheress +haberdashery +haberdine +habergeon +habilable +habilatory +habile +habiliment +habilimentation +habilimented +habilitate +habilitation +habilitator +hability +habille +Habiri +Habiru +habit +habitability +habitable +habitableness +habitably +habitacle +habitacule +habitally +habitan +habitance +habitancy +habitant +habitat +habitate +habitation +habitational +habitative +habited +habitual +habituality +habitualize +habitually +habitualness +habituate +habituation +habitude +habitudinal +habitue +habitus +habnab +haboob +Habronema +habronemiasis +habronemic +habu +habutai +habutaye +hache +Hachiman +hachure +hacienda +hack +hackamatak +hackamore +hackbarrow +hackberry +hackbolt +hackbush +hackbut +hackbuteer +hacked +hackee +hacker +hackery +hackin +hacking +hackingly +hackle +hackleback +hackler +hacklog +hackly +hackmack +hackman +hackmatack +hackney +hackneyed +hackneyer +hackneyism +hackneyman +hacksaw +hacksilber +hackster +hackthorn +hacktree +hackwood +hacky +had +Hadassah +hadbot +hadden +haddie +haddo +haddock +haddocker +hade +Hadean +Hadendoa +Hadendowa +hadentomoid +Hadentomoidea +Hades +Hadhramautian +hading +Hadith +hadj +Hadjemi +hadji +hadland +Hadramautian +hadrome +Hadromerina +hadromycosis +hadrosaur +Hadrosaurus +haec +haecceity +Haeckelian +Haeckelism +haem +Haemamoeba +Haemanthus +Haemaphysalis +haemaspectroscope +haematherm +haemathermal +haemathermous +haematinon +haematinum +haematite +Haematobranchia +haematobranchiate +Haematocrya +haematocryal +Haematophilina +haematophiline +Haematopus +haematorrhachis +haematosepsis +Haematotherma +haematothermal +haematoxylic +haematoxylin +Haematoxylon +haemoconcentration +haemodilution +Haemodoraceae +haemodoraceous +haemoglobin +haemogram +Haemogregarina +Haemogregarinidae +haemonchiasis +haemonchosis +Haemonchus +haemony +haemophile +Haemoproteus +haemorrhage +haemorrhagia +haemorrhagic +haemorrhoid +haemorrhoidal +haemosporid +Haemosporidia +haemosporidian +Haemosporidium +Haemulidae +haemuloid +haeremai +haet +haff +haffet +haffkinize +haffle +Hafgan +hafiz +hafnium +hafnyl +haft +hafter +hag +Haganah +Hagarite +hagberry +hagboat +hagborn +hagbush +hagdon +hageen +Hagenia +hagfish +haggada +haggaday +haggadic +haggadical +haggadist +haggadistic +haggard +haggardly +haggardness +hagged +hagger +haggis +haggish +haggishly +haggishness +haggister +haggle +haggler +haggly +haggy +hagi +hagia +hagiarchy +hagiocracy +Hagiographa +hagiographal +hagiographer +hagiographic +hagiographical +hagiographist +hagiography +hagiolater +hagiolatrous +hagiolatry +hagiologic +hagiological +hagiologist +hagiology +hagiophobia +hagioscope +hagioscopic +haglet +haglike +haglin +hagride +hagrope +hagseed +hagship +hagstone +hagtaper +hagweed +hagworm +hah +Hahnemannian +Hahnemannism +Haiathalah +Haida +Haidan +Haidee +haidingerite +Haiduk +haik +haikai +haikal +Haikh +haikwan +hail +hailer +hailproof +hailse +hailshot +hailstone +hailstorm +hailweed +haily +Haimavati +hain +Hainai +Hainan +Hainanese +hainberry +haine +hair +hairband +hairbeard +hairbird +hairbrain +hairbreadth +hairbrush +haircloth +haircut +haircutter +haircutting +hairdo +hairdress +hairdresser +hairdressing +haire +haired +hairen +hairhoof +hairhound +hairif +hairiness +hairlace +hairless +hairlessness +hairlet +hairline +hairlock +hairmeal +hairmonger +hairpin +hairsplitter +hairsplitting +hairspring +hairstone +hairstreak +hairtail +hairup +hairweed +hairwood +hairwork +hairworm +hairy +Haisla +Haithal +Haitian +haje +hajib +hajilij +hak +hakam +hakdar +hake +Hakea +hakeem +hakenkreuz +Hakenkreuzler +hakim +Hakka +hako +haku +hala +halakah +halakic +halakist +halakistic +halal +halalcor +halation +Halawi +halazone +halberd +halberdier +halberdman +halberdsman +halbert +halch +halcyon +halcyonian +halcyonic +Halcyonidae +Halcyoninae +halcyonine +Haldanite +hale +halebi +Halecomorphi +haleness +Halenia +haler +halerz +Halesia +halesome +half +halfback +halfbeak +halfer +halfheaded +halfhearted +halfheartedly +halfheartedness +halfling +halfman +halfness +halfpace +halfpaced +halfpenny +halfpennyworth +halfway +halfwise +Haliaeetus +halibios +halibiotic +halibiu +halibut +halibuter +Halicarnassean +Halicarnassian +Halichondriae +halichondrine +halichondroid +Halicore +Halicoridae +halide +halidom +halieutic +halieutically +halieutics +Haligonian +Halimeda +halimous +halinous +haliographer +haliography +Haliotidae +Haliotis +haliotoid +haliplankton +haliplid +Haliplidae +Haliserites +halisteresis +halisteretic +halite +Halitheriidae +Halitherium +halitosis +halituosity +halituous +halitus +hall +hallabaloo +hallage +hallah +hallan +hallanshaker +hallebardier +hallecret +halleflinta +halleflintoid +hallel +hallelujah +hallelujatic +hallex +Halleyan +halliblash +halling +hallman +hallmark +hallmarked +hallmarker +hallmoot +halloo +Hallopididae +hallopodous +Hallopus +hallow +Hallowday +hallowed +hallowedly +hallowedness +Halloween +hallower +Hallowmas +Hallowtide +halloysite +Hallstatt +Hallstattian +hallucal +hallucinate +hallucination +hallucinational +hallucinative +hallucinator +hallucinatory +hallucined +hallucinosis +hallux +hallway +halma +halmalille +halmawise +halo +Haloa +Halobates +halobios +halobiotic +halochromism +halochromy +Halocynthiidae +haloesque +halogen +halogenate +halogenation +halogenoid +halogenous +Halogeton +halohydrin +haloid +halolike +halolimnic +halomancy +halometer +halomorphic +halophile +halophilism +halophilous +halophyte +halophytic +halophytism +Halopsyche +Halopsychidae +Haloragidaceae +haloragidaceous +Halosauridae +Halosaurus +haloscope +Halosphaera +halotrichite +haloxene +hals +halse +halsen +halsfang +halt +halter +halterbreak +halteres +Halteridium +halterproof +Haltica +halting +haltingly +haltingness +haltless +halucket +halukkah +halurgist +halurgy +halutz +halvaner +halvans +halve +halved +halvelings +halver +halves +halyard +Halysites +ham +hamacratic +Hamadan +hamadryad +Hamal +hamal +hamald +Hamamelidaceae +hamamelidaceous +Hamamelidanthemum +hamamelidin +Hamamelidoxylon +hamamelin +Hamamelis +Hamamelites +hamartiologist +hamartiology +hamartite +hamate +hamated +Hamathite +hamatum +hambergite +hamble +hambroline +hamburger +hame +hameil +hamel +Hamelia +hamesucken +hamewith +hamfat +hamfatter +hami +Hamidian +Hamidieh +hamiform +Hamilton +Hamiltonian +Hamiltonianism +Hamiltonism +hamingja +hamirostrate +Hamital +Hamite +Hamites +Hamitic +Hamiticized +Hamitism +Hamitoid +hamlah +hamlet +hamleted +hamleteer +hamletization +hamletize +hamlinite +hammada +hammam +hammer +hammerable +hammerbird +hammercloth +hammerdress +hammerer +hammerfish +hammerhead +hammerheaded +hammering +hammeringly +hammerkop +hammerless +hammerlike +hammerman +hammersmith +hammerstone +hammertoe +hammerwise +hammerwork +hammerwort +hammochrysos +hammock +hammy +hamose +hamous +hamper +hamperedly +hamperedness +hamperer +hamperman +Hampshire +hamrongite +hamsa +hamshackle +hamster +hamstring +hamular +hamulate +hamule +Hamulites +hamulose +hamulus +hamus +hamza +han +Hanafi +Hanafite +hanaper +hanaster +Hanbalite +hanbury +hance +hanced +hanch +hancockite +hand +handbag +handball +handballer +handbank +handbanker +handbarrow +handbill +handblow +handbolt +handbook +handbow +handbreadth +handcar +handcart +handclap +handclasp +handcloth +handcraft +handcraftman +handcraftsman +handcuff +handed +handedness +Handelian +hander +handersome +handfast +handfasting +handfastly +handfastness +handflower +handful +handgrasp +handgravure +handgrip +handgriping +handgun +handhaving +handhold +handhole +handicap +handicapped +handicapper +handicraft +handicraftship +handicraftsman +handicraftsmanship +handicraftswoman +handicuff +handily +handiness +handistroke +handiwork +handkercher +handkerchief +handkerchiefful +handlaid +handle +handleable +handled +handleless +handler +handless +handlike +handling +handmade +handmaid +handmaiden +handmaidenly +handout +handpost +handprint +handrail +handrailing +handreader +handreading +handsale +handsaw +handsbreadth +handscrape +handsel +handseller +handset +handshake +handshaker +handshaking +handsmooth +handsome +handsomeish +handsomely +handsomeness +handspade +handspike +handspoke +handspring +handstaff +handstand +handstone +handstroke +handwear +handwheel +handwhile +handwork +handworkman +handwrist +handwrite +handwriting +handy +handyblow +handybook +handygrip +hangability +hangable +hangalai +hangar +hangbird +hangby +hangdog +hange +hangee +hanger +hangfire +hangie +hanging +hangingly +hangkang +hangle +hangman +hangmanship +hangment +hangnail +hangnest +hangout +hangul +hangwoman +hangworm +hangworthy +hanif +hanifism +hanifite +hanifiya +hank +hanker +hankerer +hankering +hankeringly +hankie +hankle +hanksite +hanky +hanna +hannayite +Hannibal +Hannibalian +Hannibalic +Hano +Hanoverian +Hanoverianize +Hanoverize +hansa +Hansard +Hansardization +Hansardize +Hanse +hanse +Hanseatic +hansel +hansgrave +hansom +hant +hantle +Hanukkah +Hanuman +hao +haole +haoma +haori +hap +Hapale +Hapalidae +hapalote +Hapalotis +hapaxanthous +haphazard +haphazardly +haphazardness +haphtarah +Hapi +hapless +haplessly +haplessness +haplite +haplocaulescent +haplochlamydeous +Haplodoci +Haplodon +haplodont +haplodonty +haplography +haploid +haploidic +haploidy +haplolaly +haplologic +haplology +haploma +Haplomi +haplomid +haplomous +haplont +haploperistomic +haploperistomous +haplopetalous +haplophase +haplophyte +haploscope +haploscopic +haplosis +haplostemonous +haplotype +haply +happen +happening +happenstance +happier +happiest +happify +happiless +happily +happiness +happing +happy +hapten +haptene +haptenic +haptere +hapteron +haptic +haptics +haptometer +haptophor +haptophoric +haptophorous +haptotropic +haptotropically +haptotropism +hapu +hapuku +haqueton +harakeke +harangue +harangueful +haranguer +Hararese +Harari +harass +harassable +harassedly +harasser +harassingly +harassment +haratch +Haratin +Haraya +Harb +harbergage +harbi +harbinge +harbinger +harbingership +harbingery +harbor +harborage +harborer +harborless +harborous +harborside +harborward +hard +hardanger +hardback +hardbake +hardbeam +hardberry +harden +hardenable +Hardenbergia +hardener +hardening +hardenite +harder +Harderian +hardfern +hardfist +hardfisted +hardfistedness +hardhack +hardhanded +hardhandedness +hardhead +hardheaded +hardheadedly +hardheadedness +hardhearted +hardheartedly +hardheartedness +hardihood +hardily +hardim +hardiment +hardiness +hardish +hardishrew +hardly +hardmouth +hardmouthed +hardness +hardock +hardpan +hardship +hardstand +hardstanding +hardtack +hardtail +hardware +hardwareman +Hardwickia +hardwood +hardy +hardystonite +hare +harebell +harebottle +harebrain +harebrained +harebrainedly +harebrainedness +harebur +harefoot +harefooted +harehearted +harehound +Harelda +harelike +harelip +harelipped +harem +haremism +haremlik +harengiform +harfang +haricot +harigalds +hariolate +hariolation +hariolize +harish +hark +harka +harl +Harleian +Harlemese +Harlemite +harlequin +harlequina +harlequinade +harlequinery +harlequinesque +harlequinic +harlequinism +harlequinize +harling +harlock +harlot +harlotry +harm +Harmachis +harmal +harmala +harmaline +harman +harmattan +harmel +harmer +harmful +harmfully +harmfulness +harmine +harminic +harmless +harmlessly +harmlessness +harmonia +harmoniacal +harmonial +harmonic +harmonica +harmonical +harmonically +harmonicalness +harmonichord +harmonici +harmonicism +harmonicon +harmonics +harmonious +harmoniously +harmoniousness +harmoniphon +harmoniphone +harmonist +harmonistic +harmonistically +Harmonite +harmonium +harmonizable +harmonization +harmonize +harmonizer +harmonogram +harmonograph +harmonometer +harmony +harmost +harmotome +harmotomic +harmproof +harn +harness +harnesser +harnessry +harnpan +harp +Harpa +harpago +harpagon +Harpagornis +Harpalides +Harpalinae +Harpalus +harper +harperess +Harpidae +harpier +harpings +harpist +harpless +harplike +Harpocrates +harpoon +harpooner +Harporhynchus +harpress +harpsichord +harpsichordist +harpula +Harpullia +harpwaytuning +harpwise +Harpy +Harpyia +harpylike +harquebus +harquebusade +harquebusier +harr +harrateen +harridan +harrier +Harrisia +harrisite +Harrovian +harrow +harrower +harrowing +harrowingly +harrowingness +harrowment +harry +harsh +harshen +harshish +harshly +harshness +harshweed +harstigite +hart +hartal +hartberry +hartebeest +hartin +hartite +Hartleian +Hartleyan +Hartmannia +Hartogia +hartshorn +hartstongue +harttite +Hartungen +haruspex +haruspical +haruspicate +haruspication +haruspice +haruspices +haruspicy +Harvard +Harvardian +Harvardize +Harveian +harvest +harvestbug +harvester +harvestless +harvestman +harvestry +harvesttime +Harvey +Harveyize +harzburgite +hasan +hasenpfeffer +hash +hashab +hasher +Hashimite +hashish +Hashiya +hashy +Hasidean +Hasidic +Hasidim +Hasidism +Hasinai +hask +Haskalah +haskness +hasky +haslet +haslock +Hasmonaean +hasp +hassar +hassel +hassle +hassock +hassocky +hasta +hastate +hastately +hastati +hastatolanceolate +hastatosagittate +haste +hasteful +hastefully +hasteless +hastelessness +hasten +hastener +hasteproof +haster +hastilude +hastily +hastiness +hastings +hastingsite +hastish +hastler +hasty +hat +hatable +hatband +hatbox +hatbrim +hatbrush +hatch +hatchability +hatchable +hatchel +hatcheler +hatcher +hatchery +hatcheryman +hatchet +hatchetback +hatchetfish +hatchetlike +hatchetman +hatchettine +hatchettolite +hatchety +hatchgate +hatching +hatchling +hatchman +hatchment +hatchminder +hatchway +hatchwayman +hate +hateable +hateful +hatefully +hatefulness +hateless +hatelessness +hater +hatful +hath +hatherlite +hathi +Hathor +Hathoric +Hati +Hatikvah +hatless +hatlessness +hatlike +hatmaker +hatmaking +hatpin +hatrack +hatrail +hatred +hatress +hatstand +hatt +hatted +Hattemist +hatter +Hatteria +hattery +Hatti +Hattic +Hattie +hatting +Hattism +Hattize +hattock +Hatty +hatty +hau +hauberget +hauberk +hauchecornite +hauerite +haugh +haughland +haught +haughtily +haughtiness +haughtly +haughtness +haughtonite +haughty +haul +haulabout +haulage +haulageway +haulback +hauld +hauler +haulier +haulm +haulmy +haulster +haunch +haunched +hauncher +haunching +haunchless +haunchy +haunt +haunter +hauntingly +haunty +Hauranitic +hauriant +haurient +Hausa +hause +hausen +hausmannite +hausse +Haussmannization +Haussmannize +haustellate +haustellated +haustellous +haustellum +haustement +haustorial +haustorium +haustral +haustrum +hautboy +hautboyist +hauteur +hauynite +hauynophyre +havage +Havaiki +Havaikian +Havana +Havanese +have +haveable +haveage +havel +haveless +havelock +haven +havenage +havener +havenership +havenet +havenful +havenless +havent +havenward +haver +havercake +haverel +haverer +havergrass +havermeal +havers +haversack +Haversian +haversine +havier +havildar +havingness +havoc +havocker +haw +Hawaiian +hawaiite +hawbuck +hawcubite +hawer +hawfinch +Hawiya +hawk +hawkbill +hawkbit +hawked +hawker +hawkery +Hawkeye +hawkie +hawking +hawkish +hawklike +hawknut +hawkweed +hawkwise +hawky +hawm +hawok +Haworthia +hawse +hawsehole +hawseman +hawsepiece +hawsepipe +hawser +hawserwise +hawthorn +hawthorned +hawthorny +hay +haya +hayband +haybird +haybote +haycap +haycart +haycock +haydenite +hayey +hayfield +hayfork +haygrower +haylift +hayloft +haymaker +haymaking +haymarket +haymow +hayrack +hayrake +hayraker +hayrick +hayseed +haysel +haystack +haysuck +haytime +hayward +hayweed +haywire +hayz +Hazara +hazard +hazardable +hazarder +hazardful +hazardize +hazardless +hazardous +hazardously +hazardousness +hazardry +haze +hazel +hazeled +hazeless +hazelly +hazelnut +hazelwood +hazelwort +hazen +hazer +hazily +haziness +hazing +hazle +haznadar +hazy +hazzan +he +head +headache +headachy +headband +headbander +headboard +headborough +headcap +headchair +headcheese +headchute +headcloth +headdress +headed +headender +header +headfirst +headforemost +headframe +headful +headgear +headily +headiness +heading +headkerchief +headland +headledge +headless +headlessness +headlight +headlighting +headlike +headline +headliner +headlock +headlong +headlongly +headlongs +headlongwise +headman +headmark +headmaster +headmasterly +headmastership +headmistress +headmistressship +headmold +headmost +headnote +headpenny +headphone +headpiece +headplate +headpost +headquarter +headquarters +headrace +headrail +headreach +headrent +headrest +headright +headring +headroom +headrope +headsail +headset +headshake +headship +headsill +headskin +headsman +headspring +headstall +headstand +headstick +headstock +headstone +headstream +headstrong +headstrongly +headstrongness +headwaiter +headwall +headward +headwark +headwater +headway +headwear +headwork +headworker +headworking +heady +heaf +heal +healable +heald +healder +healer +healful +healing +healingly +healless +healsome +healsomeness +health +healthcraft +healthful +healthfully +healthfulness +healthguard +healthily +healthiness +healthless +healthlessness +healthsome +healthsomely +healthsomeness +healthward +healthy +heap +heaper +heaps +heapstead +heapy +hear +hearable +hearer +hearing +hearingless +hearken +hearkener +hearsay +hearse +hearsecloth +hearselike +hearst +heart +heartache +heartaching +heartbeat +heartbird +heartblood +heartbreak +heartbreaker +heartbreaking +heartbreakingly +heartbroken +heartbrokenly +heartbrokenness +heartburn +heartburning +heartdeep +heartease +hearted +heartedly +heartedness +hearten +heartener +heartening +hearteningly +heartfelt +heartful +heartfully +heartfulness +heartgrief +hearth +hearthless +hearthman +hearthpenny +hearthrug +hearthstead +hearthstone +hearthward +hearthwarming +heartikin +heartily +heartiness +hearting +heartland +heartleaf +heartless +heartlessly +heartlessness +heartlet +heartling +heartly +heartnut +heartpea +heartquake +heartroot +hearts +heartscald +heartsease +heartseed +heartsette +heartsick +heartsickening +heartsickness +heartsome +heartsomely +heartsomeness +heartsore +heartstring +heartthrob +heartward +heartwater +heartweed +heartwise +heartwood +heartwort +hearty +heat +heatable +heatdrop +heatedly +heater +heaterman +heatful +heath +heathberry +heathbird +heathen +heathendom +heatheness +heathenesse +heathenhood +heathenish +heathenishly +heathenishness +heathenism +heathenize +heathenness +heathenry +heathenship +heather +heathered +heatheriness +heathery +heathless +heathlike +heathwort +heathy +heating +heatingly +heatless +heatlike +heatmaker +heatmaking +heatproof +heatronic +heatsman +heatstroke +heaume +heaumer +heautarit +heautomorphism +Heautontimorumenos +heautophany +heave +heaveless +heaven +Heavenese +heavenful +heavenhood +heavenish +heavenishly +heavenize +heavenless +heavenlike +heavenliness +heavenly +heavens +heavenward +heavenwardly +heavenwardness +heavenwards +heaver +heavies +heavily +heaviness +heaving +heavisome +heavity +heavy +heavyback +heavyhanded +heavyhandedness +heavyheaded +heavyhearted +heavyheartedness +heavyweight +hebamic +hebdomad +hebdomadal +hebdomadally +hebdomadary +hebdomader +hebdomarian +hebdomary +hebeanthous +hebecarpous +hebecladous +hebegynous +hebenon +hebeosteotomy +hebepetalous +hebephrenia +hebephrenic +hebetate +hebetation +hebetative +hebete +hebetic +hebetomy +hebetude +hebetudinous +Hebraean +Hebraic +Hebraica +Hebraical +Hebraically +Hebraicize +Hebraism +Hebraist +Hebraistic +Hebraistical +Hebraistically +Hebraization +Hebraize +Hebraizer +Hebrew +Hebrewdom +Hebrewess +Hebrewism +Hebrician +Hebridean +Hebronite +hebronite +hecastotheism +Hecate +Hecatean +Hecatic +Hecatine +hecatomb +Hecatombaeon +hecatomped +hecatompedon +hecatonstylon +hecatontarchy +hecatontome +hecatophyllous +hech +Hechtia +heck +heckelphone +Heckerism +heckimal +heckle +heckler +hectare +hecte +hectic +hectical +hectically +hecticly +hecticness +hectocotyl +hectocotyle +hectocotyliferous +hectocotylization +hectocotylize +hectocotylus +hectogram +hectograph +hectographic +hectography +hectoliter +hectometer +Hector +hector +Hectorean +Hectorian +hectoringly +hectorism +hectorly +hectorship +hectostere +hectowatt +heddle +heddlemaker +heddler +hedebo +hedenbergite +Hedeoma +heder +Hedera +hederaceous +hederaceously +hederated +hederic +hederiferous +hederiform +hederigerent +hederin +hederose +hedge +hedgeberry +hedgeborn +hedgebote +hedgebreaker +hedgehog +hedgehoggy +hedgehop +hedgehopper +hedgeless +hedgemaker +hedgemaking +hedger +hedgerow +hedgesmith +hedgeweed +hedgewise +hedgewood +hedging +hedgingly +hedgy +hedonic +hedonical +hedonically +hedonics +hedonism +hedonist +hedonistic +hedonistically +hedonology +hedriophthalmous +hedrocele +hedrumite +Hedychium +hedyphane +Hedysarum +heed +heeder +heedful +heedfully +heedfulness +heedily +heediness +heedless +heedlessly +heedlessness +heedy +heehaw +heel +heelball +heelband +heelcap +heeled +heeler +heelgrip +heelless +heelmaker +heelmaking +heelpath +heelpiece +heelplate +heelpost +heelprint +heelstrap +heeltap +heeltree +heemraad +heer +heeze +heezie +heezy +heft +hefter +heftily +heftiness +hefty +hegari +Hegelian +Hegelianism +Hegelianize +Hegelizer +hegemon +hegemonic +hegemonical +hegemonist +hegemonizer +hegemony +hegira +hegumen +hegumene +Hehe +hei +heiau +heifer +heiferhood +heigh +heighday +height +heighten +heightener +heii +Heikum +Heiltsuk +heimin +Heinesque +Heinie +heinous +heinously +heinousness +heintzite +heir +heirdom +heiress +heiressdom +heiresshood +heirless +heirloom +heirship +heirskip +heitiki +Hejazi +Hejazian +hekteus +helbeh +helcoid +helcology +helcoplasty +helcosis +helcotic +heldentenor +helder +Helderbergian +hele +Helen +Helena +helenin +helenioid +Helenium +Helenus +helepole +heliacal +heliacally +Heliaea +heliaean +Heliamphora +Heliand +helianthaceous +Helianthemum +helianthic +helianthin +Helianthium +Helianthoidea +Helianthoidean +Helianthus +heliast +heliastic +heliazophyte +helical +helically +heliced +helices +helichryse +helichrysum +Helicidae +heliciform +helicin +Helicina +helicine +Helicinidae +helicitic +helicline +helicograph +helicogyrate +helicogyre +helicoid +helicoidal +helicoidally +helicometry +helicon +Heliconia +Heliconian +Heliconiidae +Heliconiinae +heliconist +Heliconius +helicoprotein +helicopter +helicorubin +helicotrema +Helicteres +helictite +helide +Heligmus +heling +helio +heliocentric +heliocentrical +heliocentrically +heliocentricism +heliocentricity +heliochrome +heliochromic +heliochromoscope +heliochromotype +heliochromy +helioculture +heliodon +heliodor +helioelectric +helioengraving +heliofugal +Heliogabalize +Heliogabalus +heliogram +heliograph +heliographer +heliographic +heliographical +heliographically +heliography +heliogravure +helioid +heliolater +heliolatrous +heliolatry +heliolite +Heliolites +heliolithic +Heliolitidae +heliologist +heliology +heliometer +heliometric +heliometrical +heliometrically +heliometry +heliomicrometer +Helion +heliophilia +heliophiliac +heliophilous +heliophobe +heliophobia +heliophobic +heliophobous +heliophotography +heliophyllite +heliophyte +Heliopora +Helioporidae +Heliopsis +heliopticon +Heliornis +Heliornithes +Heliornithidae +Helios +helioscope +helioscopic +helioscopy +heliosis +heliostat +heliostatic +heliotactic +heliotaxis +heliotherapy +heliothermometer +Heliothis +heliotrope +heliotroper +Heliotropiaceae +heliotropian +heliotropic +heliotropical +heliotropically +heliotropine +heliotropism +Heliotropium +heliotropy +heliotype +heliotypic +heliotypically +heliotypography +heliotypy +Heliozoa +heliozoan +heliozoic +heliport +Helipterum +helispheric +helispherical +helium +helix +helizitic +hell +Helladian +Helladic +Helladotherium +hellandite +hellanodic +hellbender +hellborn +hellbox +hellbred +hellbroth +hellcat +helldog +helleboraceous +helleboraster +hellebore +helleborein +helleboric +helleborin +Helleborine +helleborism +Helleborus +Hellelt +Hellen +Hellene +Hellenian +Hellenic +Hellenically +Hellenicism +Hellenism +Hellenist +Hellenistic +Hellenistical +Hellenistically +Hellenisticism +Hellenization +Hellenize +Hellenizer +Hellenocentric +Hellenophile +heller +helleri +Hellespont +Hellespontine +hellgrammite +hellhag +hellhole +hellhound +hellicat +hellier +hellion +hellish +hellishly +hellishness +hellkite +hellness +hello +hellroot +hellship +helluo +hellward +hellweed +helly +helm +helmage +helmed +helmet +helmeted +helmetlike +helmetmaker +helmetmaking +Helmholtzian +helminth +helminthagogic +helminthagogue +Helminthes +helminthiasis +helminthic +helminthism +helminthite +Helminthocladiaceae +helminthoid +helminthologic +helminthological +helminthologist +helminthology +helminthosporiose +Helminthosporium +helminthosporoid +helminthous +helmless +helmsman +helmsmanship +helobious +heloderm +Heloderma +Helodermatidae +helodermatoid +helodermatous +helodes +heloe +heloma +Helonias +helonin +helosis +Helot +helotage +helotism +helotize +helotomy +helotry +help +helpable +helper +helpful +helpfully +helpfulness +helping +helpingly +helpless +helplessly +helplessness +helply +helpmate +helpmeet +helpsome +helpworthy +helsingkite +helve +helvell +Helvella +Helvellaceae +helvellaceous +Helvellales +helvellic +helver +Helvetia +Helvetian +Helvetic +Helvetii +Helvidian +helvite +hem +hemabarometer +hemachate +hemachrome +hemachrosis +hemacite +hemad +hemadrometer +hemadrometry +hemadromograph +hemadromometer +hemadynameter +hemadynamic +hemadynamics +hemadynamometer +hemafibrite +hemagglutinate +hemagglutination +hemagglutinative +hemagglutinin +hemagogic +hemagogue +hemal +hemalbumen +hemamoeba +hemangioma +hemangiomatosis +hemangiosarcoma +hemaphein +hemapod +hemapodous +hemapoiesis +hemapoietic +hemapophyseal +hemapophysial +hemapophysis +hemarthrosis +hemase +hemaspectroscope +hemastatics +hematachometer +hematachometry +hematal +hematein +hematemesis +hematemetic +hematencephalon +hematherapy +hematherm +hemathermal +hemathermous +hemathidrosis +hematic +hematid +hematidrosis +hematimeter +hematin +hematinic +hematinometer +hematinometric +hematinuria +hematite +hematitic +hematobic +hematobious +hematobium +hematoblast +hematobranchiate +hematocatharsis +hematocathartic +hematocele +hematochezia +hematochrome +hematochyluria +hematoclasia +hematoclasis +hematocolpus +hematocrit +hematocryal +hematocrystallin +hematocyanin +hematocyst +hematocystis +hematocyte +hematocytoblast +hematocytogenesis +hematocytometer +hematocytotripsis +hematocytozoon +hematocyturia +hematodynamics +hematodynamometer +hematodystrophy +hematogen +hematogenesis +hematogenetic +hematogenic +hematogenous +hematoglobulin +hematography +hematohidrosis +hematoid +hematoidin +hematolin +hematolite +hematological +hematologist +hematology +hematolymphangioma +hematolysis +hematolytic +hematoma +hematomancy +hematometer +hematometra +hematometry +hematomphalocele +hematomyelia +hematomyelitis +hematonephrosis +hematonic +hematopathology +hematopericardium +hematopexis +hematophobia +hematophyte +hematoplast +hematoplastic +hematopoiesis +hematopoietic +hematoporphyrin +hematoporphyrinuria +hematorrhachis +hematorrhea +hematosalpinx +hematoscope +hematoscopy +hematose +hematosepsis +hematosin +hematosis +hematospectrophotometer +hematospectroscope +hematospermatocele +hematospermia +hematostibiite +hematotherapy +hematothermal +hematothorax +hematoxic +hematozoal +hematozoan +hematozoic +hematozoon +hematozymosis +hematozymotic +hematuresis +hematuria +hematuric +hemautogram +hemautograph +hemautographic +hemautography +heme +hemellitene +hemellitic +hemelytral +hemelytron +hemen +hemera +hemeralope +hemeralopia +hemeralopic +Hemerobaptism +Hemerobaptist +Hemerobian +Hemerobiid +Hemerobiidae +Hemerobius +Hemerocallis +hemerologium +hemerology +hemerythrin +hemiablepsia +hemiacetal +hemiachromatopsia +hemiageusia +hemiageustia +hemialbumin +hemialbumose +hemialbumosuria +hemialgia +hemiamaurosis +hemiamb +hemiamblyopia +hemiamyosthenia +hemianacusia +hemianalgesia +hemianatropous +hemianesthesia +hemianopia +hemianopic +hemianopsia +hemianoptic +hemianosmia +hemiapraxia +Hemiascales +Hemiasci +Hemiascomycetes +hemiasynergia +hemiataxia +hemiataxy +hemiathetosis +hemiatrophy +hemiazygous +Hemibasidiales +Hemibasidii +Hemibasidiomycetes +hemibasidium +hemibathybian +hemibenthic +hemibenthonic +hemibranch +hemibranchiate +Hemibranchii +hemic +hemicanities +hemicardia +hemicardiac +hemicarp +hemicatalepsy +hemicataleptic +hemicellulose +hemicentrum +hemicephalous +hemicerebrum +Hemichorda +hemichordate +hemichorea +hemichromatopsia +hemicircle +hemicircular +hemiclastic +hemicollin +hemicrane +hemicrania +hemicranic +hemicrany +hemicrystalline +hemicycle +hemicyclic +hemicyclium +hemicylindrical +hemidactylous +Hemidactylus +hemidemisemiquaver +hemidiapente +hemidiaphoresis +hemiditone +hemidomatic +hemidome +hemidrachm +hemidysergia +hemidysesthesia +hemidystrophy +hemiekton +hemielliptic +hemiepilepsy +hemifacial +hemiform +Hemigale +Hemigalus +Hemiganus +hemigastrectomy +hemigeusia +hemiglossal +hemiglossitis +hemiglyph +hemignathous +hemihdry +hemihedral +hemihedrally +hemihedric +hemihedrism +hemihedron +hemiholohedral +hemihydrate +hemihydrated +hemihydrosis +hemihypalgesia +hemihyperesthesia +hemihyperidrosis +hemihypertonia +hemihypertrophy +hemihypesthesia +hemihypoesthesia +hemihypotonia +hemikaryon +hemikaryotic +hemilaminectomy +hemilaryngectomy +Hemileia +hemilethargy +hemiligulate +hemilingual +hemimellitene +hemimellitic +hemimelus +Hemimeridae +Hemimerus +Hemimetabola +hemimetabole +hemimetabolic +hemimetabolism +hemimetabolous +hemimetaboly +hemimetamorphic +hemimetamorphosis +hemimetamorphous +hemimorph +hemimorphic +hemimorphism +hemimorphite +hemimorphy +Hemimyaria +hemin +hemina +hemine +heminee +hemineurasthenia +hemiobol +hemiolia +hemiolic +hemionus +hemiope +hemiopia +hemiopic +hemiorthotype +hemiparalysis +hemiparanesthesia +hemiparaplegia +hemiparasite +hemiparasitic +hemiparasitism +hemiparesis +hemiparesthesia +hemiparetic +hemipenis +hemipeptone +hemiphrase +hemipic +hemipinnate +hemiplane +hemiplankton +hemiplegia +hemiplegic +hemiplegy +hemipodan +hemipode +Hemipodii +Hemipodius +hemiprism +hemiprismatic +hemiprotein +hemipter +Hemiptera +hemipteral +hemipteran +hemipteroid +hemipterological +hemipterology +hemipteron +hemipterous +hemipyramid +hemiquinonoid +hemiramph +Hemiramphidae +Hemiramphinae +hemiramphine +Hemiramphus +hemisaprophyte +hemisaprophytic +hemiscotosis +hemisect +hemisection +hemispasm +hemispheral +hemisphere +hemisphered +hemispherical +hemispherically +hemispheroid +hemispheroidal +hemispherule +hemistater +hemistich +hemistichal +hemistrumectomy +hemisymmetrical +hemisymmetry +hemisystole +hemiterata +hemiteratic +hemiteratics +hemiteria +hemiterpene +hemitery +hemithyroidectomy +hemitone +hemitremor +hemitrichous +hemitriglyph +hemitropal +hemitrope +hemitropic +hemitropism +hemitropous +hemitropy +hemitype +hemitypic +hemivagotony +heml +hemlock +hemmel +hemmer +hemoalkalimeter +hemoblast +hemochromatosis +hemochrome +hemochromogen +hemochromometer +hemochromometry +hemoclasia +hemoclasis +hemoclastic +hemocoel +hemocoele +hemocoelic +hemocoelom +hemoconcentration +hemoconia +hemoconiosis +hemocry +hemocrystallin +hemoculture +hemocyanin +hemocyte +hemocytoblast +hemocytogenesis +hemocytolysis +hemocytometer +hemocytotripsis +hemocytozoon +hemocyturia +hemodiagnosis +hemodilution +hemodrometer +hemodrometry +hemodromograph +hemodromometer +hemodynameter +hemodynamic +hemodynamics +hemodystrophy +hemoerythrin +hemoflagellate +hemofuscin +hemogastric +hemogenesis +hemogenetic +hemogenic +hemogenous +hemoglobic +hemoglobin +hemoglobinemia +hemoglobiniferous +hemoglobinocholia +hemoglobinometer +hemoglobinophilic +hemoglobinous +hemoglobinuria +hemoglobinuric +hemoglobulin +hemogram +hemogregarine +hemoid +hemokonia +hemokoniosis +hemol +hemoleucocyte +hemoleucocytic +hemologist +hemology +hemolymph +hemolymphatic +hemolysin +hemolysis +hemolytic +hemolyze +hemomanometer +hemometer +hemometry +hemonephrosis +hemopathology +hemopathy +hemopericardium +hemoperitoneum +hemopexis +hemophage +hemophagia +hemophagocyte +hemophagocytosis +hemophagous +hemophagy +hemophile +Hemophileae +hemophilia +hemophiliac +hemophilic +Hemophilus +hemophobia +hemophthalmia +hemophthisis +hemopiezometer +hemoplasmodium +hemoplastic +hemopneumothorax +hemopod +hemopoiesis +hemopoietic +hemoproctia +hemoptoe +hemoptysis +hemopyrrole +hemorrhage +hemorrhagic +hemorrhagin +hemorrhea +hemorrhodin +hemorrhoid +hemorrhoidal +hemorrhoidectomy +hemosalpinx +hemoscope +hemoscopy +hemosiderin +hemosiderosis +hemospasia +hemospastic +hemospermia +hemosporid +hemosporidian +hemostasia +hemostasis +hemostat +hemostatic +hemotachometer +hemotherapeutics +hemotherapy +hemothorax +hemotoxic +hemotoxin +hemotrophe +hemotropic +hemozoon +hemp +hempbush +hempen +hemplike +hempseed +hempstring +hempweed +hempwort +hempy +hemstitch +hemstitcher +hen +henad +henbane +henbill +henbit +hence +henceforth +henceforward +henceforwards +henchboy +henchman +henchmanship +hencoop +hencote +hend +hendecacolic +hendecagon +hendecagonal +hendecahedron +hendecane +hendecasemic +hendecasyllabic +hendecasyllable +hendecatoic +hendecoic +hendecyl +hendiadys +hendly +hendness +heneicosane +henequen +henfish +henhearted +henhouse +henhussy +henism +henlike +henmoldy +henna +Hennebique +hennery +hennin +hennish +henny +henogeny +henotheism +henotheist +henotheistic +henotic +henpeck +henpen +Henrician +Henrietta +henroost +Henry +henry +hent +Hentenian +henter +hentriacontane +henware +henwife +henwise +henwoodite +henyard +heortological +heortologion +heortology +hep +hepar +heparin +heparinize +hepatalgia +hepatatrophia +hepatatrophy +hepatauxe +hepatectomy +hepatic +Hepatica +hepatica +Hepaticae +hepatical +hepaticoduodenostomy +hepaticoenterostomy +hepaticogastrostomy +hepaticologist +hepaticology +hepaticopulmonary +hepaticostomy +hepaticotomy +hepatite +hepatitis +hepatization +hepatize +hepatocele +hepatocirrhosis +hepatocolic +hepatocystic +hepatoduodenal +hepatoduodenostomy +hepatodynia +hepatodysentery +hepatoenteric +hepatoflavin +hepatogastric +hepatogenic +hepatogenous +hepatography +hepatoid +hepatolenticular +hepatolith +hepatolithiasis +hepatolithic +hepatological +hepatologist +hepatology +hepatolysis +hepatolytic +hepatoma +hepatomalacia +hepatomegalia +hepatomegaly +hepatomelanosis +hepatonephric +hepatopathy +hepatoperitonitis +hepatopexia +hepatopexy +hepatophlebitis +hepatophlebotomy +hepatophyma +hepatopneumonic +hepatoportal +hepatoptosia +hepatoptosis +hepatopulmonary +hepatorenal +hepatorrhagia +hepatorrhaphy +hepatorrhea +hepatorrhexis +hepatorrhoea +hepatoscopy +hepatostomy +hepatotherapy +hepatotomy +hepatotoxemia +hepatoumbilical +hepcat +Hephaesteum +Hephaestian +Hephaestic +Hephaestus +hephthemimer +hephthemimeral +hepialid +Hepialidae +Hepialus +heppen +hepper +heptacapsular +heptace +heptachord +heptachronous +heptacolic +heptacosane +heptad +heptadecane +heptadecyl +heptaglot +heptagon +heptagonal +heptagynous +heptahedral +heptahedrical +heptahedron +heptahexahedral +heptahydrate +heptahydrated +heptahydric +heptahydroxy +heptal +heptameride +Heptameron +heptamerous +heptameter +heptamethylene +heptametrical +heptanaphthene +Heptanchus +heptandrous +heptane +Heptanesian +heptangular +heptanoic +heptanone +heptapetalous +heptaphyllous +heptaploid +heptaploidy +heptapodic +heptapody +heptarch +heptarchal +heptarchic +heptarchical +heptarchist +heptarchy +heptasemic +heptasepalous +heptaspermous +heptastich +heptastrophic +heptastylar +heptastyle +heptasulphide +heptasyllabic +Heptateuch +heptatomic +heptatonic +Heptatrema +heptavalent +heptene +hepteris +heptine +heptite +heptitol +heptoic +heptorite +heptose +heptoxide +Heptranchias +heptyl +heptylene +heptylic +heptyne +her +Heraclean +Heracleidan +Heracleonite +Heracleopolitan +Heracleopolite +Heracleum +Heraclid +Heraclidae +Heraclidan +Heraclitean +Heracliteanism +Heraclitic +Heraclitical +Heraclitism +Herakles +herald +heraldess +heraldic +heraldical +heraldically +heraldist +heraldize +heraldress +heraldry +heraldship +herapathite +Herat +herb +herbaceous +herbaceously +herbage +herbaged +herbager +herbagious +herbal +herbalism +herbalist +herbalize +herbane +herbaria +herbarial +herbarian +herbarism +herbarist +herbarium +herbarize +Herbartian +Herbartianism +herbary +Herbert +herbescent +herbicidal +herbicide +herbicolous +herbiferous +herbish +herbist +Herbivora +herbivore +herbivority +herbivorous +herbless +herblet +herblike +herbman +herborist +herborization +herborize +herborizer +herbose +herbosity +herbous +herbwife +herbwoman +herby +hercogamous +hercogamy +Herculanean +Herculanensian +Herculanian +Herculean +Hercules +Herculid +Hercynian +hercynite +herd +herdbook +herdboy +herder +herderite +herdic +herding +herdship +herdsman +herdswoman +herdwick +here +hereabout +hereadays +hereafter +hereafterward +hereamong +hereat +hereaway +hereaways +herebefore +hereby +heredipetous +heredipety +hereditability +hereditable +hereditably +hereditament +hereditarian +hereditarianism +hereditarily +hereditariness +hereditarist +hereditary +hereditation +hereditative +hereditism +hereditist +hereditivity +heredity +heredium +heredofamilial +heredolues +heredoluetic +heredosyphilis +heredosyphilitic +heredosyphilogy +heredotuberculosis +Hereford +herefrom +heregeld +herein +hereinabove +hereinafter +hereinbefore +hereinto +herem +hereness +hereniging +hereof +hereon +hereright +Herero +heresiarch +heresimach +heresiographer +heresiography +heresiologer +heresiologist +heresiology +heresy +heresyphobia +heresyproof +heretic +heretical +heretically +hereticalness +hereticate +heretication +hereticator +hereticide +hereticize +hereto +heretoch +heretofore +heretoforetime +heretoga +heretrix +hereunder +hereunto +hereupon +hereward +herewith +herewithal +herile +heriot +heriotable +herisson +heritability +heritable +heritably +heritage +heritance +Heritiera +heritor +heritress +heritrix +herl +herling +herma +hermaean +hermaic +hermaphrodite +hermaphroditic +hermaphroditical +hermaphroditically +hermaphroditish +hermaphroditism +hermaphroditize +Hermaphroditus +hermeneut +hermeneutic +hermeneutical +hermeneutically +hermeneutics +hermeneutist +Hermes +Hermesian +Hermesianism +Hermetic +hermetic +hermetical +hermetically +hermeticism +Hermetics +Hermetism +Hermetist +hermidin +Herminone +Hermione +Hermit +hermit +hermitage +hermitary +hermitess +hermitic +hermitical +hermitically +hermitish +hermitism +hermitize +hermitry +hermitship +Hermo +hermodact +hermodactyl +Hermogenian +hermoglyphic +hermoglyphist +hermokopid +hern +Hernandia +Hernandiaceae +hernandiaceous +hernanesell +hernani +hernant +herne +hernia +hernial +Herniaria +herniarin +herniary +herniate +herniated +herniation +hernioenterotomy +hernioid +herniology +herniopuncture +herniorrhaphy +herniotome +herniotomist +herniotomy +hero +heroarchy +Herodian +herodian +Herodianic +Herodii +Herodiones +herodionine +heroess +herohead +herohood +heroic +heroical +heroically +heroicalness +heroicity +heroicly +heroicness +heroicomic +heroicomical +heroid +Heroides +heroify +Heroin +heroin +heroine +heroineship +heroinism +heroinize +heroism +heroistic +heroization +heroize +herolike +heromonger +heron +heroner +heronite +heronry +heroogony +heroologist +heroology +Herophile +Herophilist +heroship +herotheism +herpes +Herpestes +Herpestinae +herpestine +herpetic +herpetiform +herpetism +herpetography +herpetoid +herpetologic +herpetological +herpetologically +herpetologist +herpetology +herpetomonad +Herpetomonas +herpetophobia +herpetotomist +herpetotomy +herpolhode +Herpotrichia +herrengrundite +Herrenvolk +herring +herringbone +herringer +Herrnhuter +hers +Herschelian +herschelite +herse +hersed +herself +hership +hersir +hertz +hertzian +Heruli +Herulian +Hervati +Herzegovinian +Hesiodic +Hesione +Hesionidae +hesitance +hesitancy +hesitant +hesitantly +hesitate +hesitater +hesitating +hesitatingly +hesitatingness +hesitation +hesitative +hesitatively +hesitatory +Hesper +Hespera +Hesperia +Hesperian +Hesperic +Hesperid +hesperid +hesperidate +hesperidene +hesperideous +Hesperides +Hesperidian +hesperidin +hesperidium +hesperiid +Hesperiidae +hesperinon +Hesperis +hesperitin +Hesperornis +Hesperornithes +hesperornithid +Hesperornithiformes +hesperornithoid +Hesperus +Hessian +hessite +hessonite +hest +Hester +hestern +hesternal +Hesther +hesthogenous +Hesychasm +Hesychast +hesychastic +het +hetaera +hetaeria +hetaeric +hetaerism +Hetaerist +hetaerist +hetaeristic +hetaerocracy +hetaerolite +hetaery +heteradenia +heteradenic +heterakid +Heterakis +Heteralocha +heterandrous +heterandry +heteratomic +heterauxesis +heteraxial +heteric +heterically +hetericism +hetericist +heterism +heterization +heterize +hetero +heteroagglutinin +heteroalbumose +heteroauxin +heteroblastic +heteroblastically +heteroblasty +heterocarpism +heterocarpous +Heterocarpus +heterocaseose +heterocellular +heterocentric +heterocephalous +Heterocera +heterocerc +heterocercal +heterocercality +heterocercy +heterocerous +heterochiral +heterochlamydeous +Heterochloridales +heterochromatic +heterochromatin +heterochromatism +heterochromatization +heterochromatized +heterochrome +heterochromia +heterochromic +heterochromosome +heterochromous +heterochromy +heterochronic +heterochronism +heterochronistic +heterochronous +heterochrony +heterochrosis +heterochthon +heterochthonous +heterocline +heteroclinous +heteroclital +heteroclite +heteroclitica +heteroclitous +Heterocoela +heterocoelous +Heterocotylea +heterocycle +heterocyclic +heterocyst +heterocystous +heterodactyl +Heterodactylae +heterodactylous +Heterodera +Heterodon +heterodont +Heterodonta +Heterodontidae +heterodontism +heterodontoid +Heterodontus +heterodox +heterodoxal +heterodoxical +heterodoxly +heterodoxness +heterodoxy +heterodromous +heterodromy +heterodyne +heteroecious +heteroeciously +heteroeciousness +heteroecism +heteroecismal +heteroecy +heteroepic +heteroepy +heteroerotic +heteroerotism +heterofermentative +heterofertilization +heterogalactic +heterogamete +heterogametic +heterogametism +heterogamety +heterogamic +heterogamous +heterogamy +heterogangliate +heterogen +heterogene +heterogeneal +heterogenean +heterogeneity +heterogeneous +heterogeneously +heterogeneousness +heterogenesis +heterogenetic +heterogenic +heterogenicity +heterogenist +heterogenous +heterogeny +heteroglobulose +heterognath +Heterognathi +heterogone +heterogonism +heterogonous +heterogonously +heterogony +heterograft +heterographic +heterographical +heterography +Heterogyna +heterogynal +heterogynous +heteroicous +heteroimmune +heteroinfection +heteroinoculable +heteroinoculation +heterointoxication +heterokaryon +heterokaryosis +heterokaryotic +heterokinesis +heterokinetic +Heterokontae +heterokontan +heterolalia +heterolateral +heterolecithal +heterolith +heterolobous +heterologic +heterological +heterologically +heterologous +heterology +heterolysin +heterolysis +heterolytic +heteromallous +heteromastigate +heteromastigote +Heteromeles +Heteromera +heteromeral +Heteromeran +Heteromeri +heteromeric +heteromerous +Heterometabola +heterometabole +heterometabolic +heterometabolism +heterometabolous +heterometaboly +heterometric +Heteromi +Heteromita +Heteromorpha +Heteromorphae +heteromorphic +heteromorphism +heteromorphite +heteromorphosis +heteromorphous +heteromorphy +Heteromya +Heteromyaria +heteromyarian +Heteromyidae +Heteromys +heteronereid +heteronereis +Heteroneura +heteronomous +heteronomously +heteronomy +heteronuclear +heteronym +heteronymic +heteronymous +heteronymously +heteronymy +heteroousia +Heteroousian +heteroousian +Heteroousiast +heteroousious +heteropathic +heteropathy +heteropelmous +heteropetalous +Heterophaga +Heterophagi +heterophagous +heterophasia +heterophemism +heterophemist +heterophemistic +heterophemize +heterophemy +heterophile +heterophoria +heterophoric +heterophylesis +heterophyletic +heterophyllous +heterophylly +heterophyly +heterophyte +heterophytic +Heteropia +Heteropidae +heteroplasia +heteroplasm +heteroplastic +heteroplasty +heteroploid +heteroploidy +heteropod +Heteropoda +heteropodal +heteropodous +heteropolar +heteropolarity +heteropoly +heteroproteide +heteroproteose +heteropter +Heteroptera +heteropterous +heteroptics +heteropycnosis +Heterorhachis +heteroscope +heteroscopy +heterosexual +heterosexuality +heteroside +Heterosiphonales +heterosis +Heterosomata +Heterosomati +heterosomatous +heterosome +Heterosomi +heterosomous +Heterosporeae +heterosporic +Heterosporium +heterosporous +heterospory +heterostatic +heterostemonous +Heterostraca +heterostracan +Heterostraci +heterostrophic +heterostrophous +heterostrophy +heterostyled +heterostylism +heterostylous +heterostyly +heterosuggestion +heterosyllabic +heterotactic +heterotactous +heterotaxia +heterotaxic +heterotaxis +heterotaxy +heterotelic +heterothallic +heterothallism +heterothermal +heterothermic +heterotic +heterotopia +heterotopic +heterotopism +heterotopous +heterotopy +heterotransplant +heterotransplantation +heterotrich +Heterotricha +Heterotrichales +Heterotrichida +heterotrichosis +heterotrichous +heterotropal +heterotroph +heterotrophic +heterotrophy +heterotropia +heterotropic +heterotropous +heterotype +heterotypic +heterotypical +heteroxanthine +heteroxenous +heterozetesis +heterozygosis +heterozygosity +heterozygote +heterozygotic +heterozygous +heterozygousness +hething +hetman +hetmanate +hetmanship +hetter +hetterly +Hettie +Hetty +heuau +Heuchera +heugh +heulandite +heumite +heuretic +heuristic +heuristically +Hevea +hevi +hew +hewable +hewel +hewer +hewettite +hewhall +hewn +hewt +hex +hexa +hexabasic +Hexabiblos +hexabiose +hexabromide +hexacanth +hexacanthous +hexacapsular +hexacarbon +hexace +hexachloride +hexachlorocyclohexane +hexachloroethane +hexachord +hexachronous +hexacid +hexacolic +Hexacoralla +hexacorallan +Hexacorallia +hexacosane +hexacosihedroid +hexact +hexactinal +hexactine +hexactinellid +Hexactinellida +hexactinellidan +hexactinelline +hexactinian +hexacyclic +hexad +hexadactyle +hexadactylic +hexadactylism +hexadactylous +hexadactyly +hexadecahedroid +hexadecane +hexadecanoic +hexadecene +hexadecyl +hexadic +hexadiene +hexadiyne +hexafoil +hexaglot +hexagon +hexagonal +hexagonally +hexagonial +hexagonical +hexagonous +hexagram +Hexagrammidae +hexagrammoid +Hexagrammos +hexagyn +Hexagynia +hexagynian +hexagynous +hexahedral +hexahedron +hexahydrate +hexahydrated +hexahydric +hexahydride +hexahydrite +hexahydrobenzene +hexahydroxy +hexakisoctahedron +hexakistetrahedron +hexameral +hexameric +hexamerism +hexameron +hexamerous +hexameter +hexamethylenamine +hexamethylene +hexamethylenetetramine +hexametral +hexametric +hexametrical +hexametrist +hexametrize +hexametrographer +Hexamita +hexamitiasis +hexammine +hexammino +hexanaphthene +Hexanchidae +Hexanchus +Hexandria +hexandric +hexandrous +hexandry +hexane +hexanedione +hexangular +hexangularly +hexanitrate +hexanitrodiphenylamine +hexapartite +hexaped +hexapetaloid +hexapetaloideous +hexapetalous +hexaphyllous +hexapla +hexaplar +hexaplarian +hexaplaric +hexaploid +hexaploidy +hexapod +Hexapoda +hexapodal +hexapodan +hexapodous +hexapody +hexapterous +hexaradial +hexarch +hexarchy +hexaseme +hexasemic +hexasepalous +hexaspermous +hexastemonous +hexaster +hexastich +hexastichic +hexastichon +hexastichous +hexastichy +hexastigm +hexastylar +hexastyle +hexastylos +hexasulphide +hexasyllabic +hexatetrahedron +Hexateuch +Hexateuchal +hexathlon +hexatomic +hexatriacontane +hexatriose +hexavalent +hexecontane +hexenbesen +hexene +hexer +hexerei +hexeris +hexestrol +hexicological +hexicology +hexine +hexiological +hexiology +hexis +hexitol +hexoctahedral +hexoctahedron +hexode +hexoestrol +hexogen +hexoic +hexokinase +hexone +hexonic +hexosamine +hexosaminic +hexosan +hexose +hexosediphosphoric +hexosemonophosphoric +hexosephosphatase +hexosephosphoric +hexoylene +hexpartite +hexyl +hexylene +hexylic +hexylresorcinol +hexyne +hey +heyday +Hezron +Hezronites +hi +hia +Hianakoto +hiant +hiatal +hiate +hiation +hiatus +Hibbertia +hibbin +hibernacle +hibernacular +hibernaculum +hibernal +hibernate +hibernation +hibernator +Hibernia +Hibernian +Hibernianism +Hibernic +Hibernical +Hibernically +Hibernicism +Hibernicize +Hibernization +Hibernize +Hibernologist +Hibernology +Hibiscus +Hibito +Hibitos +Hibunci +hic +hicatee +hiccup +hick +hickey +hickory +Hicksite +hickwall +Hicoria +hidable +hidage +hidalgism +hidalgo +hidalgoism +hidated +hidation +Hidatsa +hidden +hiddenite +hiddenly +hiddenmost +hiddenness +hide +hideaway +hidebind +hidebound +hideboundness +hided +hideland +hideless +hideling +hideosity +hideous +hideously +hideousness +hider +hidling +hidlings +hidradenitis +hidrocystoma +hidromancy +hidropoiesis +hidrosis +hidrotic +hie +hieder +hielaman +hield +hielmite +hiemal +hiemation +Hieracian +Hieracium +hieracosphinx +hierapicra +hierarch +hierarchal +hierarchic +hierarchical +hierarchically +hierarchism +hierarchist +hierarchize +hierarchy +hieratic +hieratical +hieratically +hieraticism +hieratite +Hierochloe +hierocracy +hierocratic +hierocratical +hierodule +hierodulic +Hierofalco +hierogamy +hieroglyph +hieroglypher +hieroglyphic +hieroglyphical +hieroglyphically +hieroglyphist +hieroglyphize +hieroglyphology +hieroglyphy +hierogram +hierogrammat +hierogrammate +hierogrammateus +hierogrammatic +hierogrammatical +hierogrammatist +hierograph +hierographer +hierographic +hierographical +hierography +hierolatry +hierologic +hierological +hierologist +hierology +hieromachy +hieromancy +hieromnemon +hieromonach +hieron +Hieronymic +Hieronymite +hieropathic +hierophancy +hierophant +hierophantes +hierophantic +hierophantically +hierophanticly +hieros +hieroscopy +Hierosolymitan +Hierosolymite +hierurgical +hierurgy +hifalutin +higdon +higgaion +higginsite +higgle +higglehaggle +higgler +higglery +high +highball +highbelia +highbinder +highborn +highboy +highbred +higher +highermost +highest +highfalutin +highfaluting +highfalutinism +highflying +highhanded +highhandedly +highhandedness +highhearted +highheartedly +highheartedness +highish +highjack +highjacker +highland +highlander +highlandish +Highlandman +Highlandry +highlight +highliving +highly +highman +highmoor +highmost +highness +highroad +hight +hightoby +hightop +highway +highwayman +higuero +hijack +hike +hiker +Hilaria +hilarious +hilariously +hilariousness +hilarity +Hilary +Hilarymas +Hilarytide +hilasmic +hilch +Hilda +Hildebrand +Hildebrandian +Hildebrandic +Hildebrandine +Hildebrandism +Hildebrandist +Hildebrandslied +Hildegarde +hilding +hiliferous +hill +hillberry +hillbilly +hillculture +hillebrandite +Hillel +hiller +hillet +Hillhousia +hilliness +hillman +hillock +hillocked +hillocky +hillsale +hillsalesman +hillside +hillsman +hilltop +hilltrot +hillward +hillwoman +hilly +hilsa +hilt +hiltless +hilum +hilus +him +Hima +Himalaya +Himalayan +Himantopus +himation +himp +himself +himward +himwards +Himyaric +Himyarite +Himyaritic +hin +hinau +Hinayana +hinch +hind +hindberry +hindbrain +hindcast +hinddeck +hinder +hinderance +hinderer +hinderest +hinderful +hinderfully +hinderingly +hinderlands +hinderlings +hinderlins +hinderly +hinderment +hindermost +hindersome +hindhand +hindhead +Hindi +hindmost +hindquarter +hindrance +hindsaddle +hindsight +Hindu +Hinduism +Hinduize +Hindustani +hindward +hing +hinge +hingecorner +hingeflower +hingeless +hingelike +hinger +hingeways +hingle +hinney +hinnible +Hinnites +hinny +hinoid +hinoideous +hinoki +hinsdalite +hint +hintedly +hinter +hinterland +hintingly +hintproof +hintzeite +Hiodon +hiodont +Hiodontidae +hiortdahlite +hip +hipbone +hipe +hiper +hiphalt +hipless +hipmold +Hippa +hippalectryon +hipparch +Hipparion +Hippeastrum +hipped +Hippelates +hippen +Hippia +hippian +hippiater +hippiatric +hippiatrical +hippiatrics +hippiatrist +hippiatry +hippic +Hippidae +Hippidion +Hippidium +hipping +hippish +hipple +hippo +Hippobosca +hippoboscid +Hippoboscidae +hippocamp +hippocampal +hippocampi +hippocampine +hippocampus +Hippocastanaceae +hippocastanaceous +hippocaust +hippocentaur +hippocentauric +hippocerf +hippocoprosterol +hippocras +Hippocratea +Hippocrateaceae +hippocrateaceous +Hippocratian +Hippocratic +Hippocratical +Hippocratism +Hippocrene +Hippocrenian +hippocrepian +hippocrepiform +Hippodamia +hippodamous +hippodrome +hippodromic +hippodromist +hippogastronomy +Hippoglosinae +Hippoglossidae +Hippoglossus +hippogriff +hippogriffin +hippoid +hippolite +hippolith +hippological +hippologist +hippology +Hippolytan +Hippolyte +Hippolytidae +Hippolytus +hippomachy +hippomancy +hippomanes +Hippomedon +hippomelanin +Hippomenes +hippometer +hippometric +hippometry +Hipponactean +hipponosological +hipponosology +hippopathological +hippopathology +hippophagi +hippophagism +hippophagist +hippophagistical +hippophagous +hippophagy +hippophile +hippophobia +hippopod +hippopotami +hippopotamian +hippopotamic +Hippopotamidae +hippopotamine +hippopotamoid +hippopotamus +Hipposelinum +hippotigrine +Hippotigris +hippotomical +hippotomist +hippotomy +hippotragine +Hippotragus +hippurate +hippuric +hippurid +Hippuridaceae +Hippuris +hippurite +Hippurites +hippuritic +Hippuritidae +hippuritoid +hippus +hippy +hipshot +hipwort +hirable +hiragana +Hiram +Hiramite +hircarra +hircine +hircinous +hircocerf +hircocervus +hircosity +hire +hired +hireless +hireling +hireman +Hiren +hirer +hirmologion +hirmos +Hirneola +hiro +hirondelle +hirple +hirrient +hirse +hirsel +hirsle +hirsute +hirsuteness +hirsuties +hirsutism +hirsutulous +Hirtella +hirtellous +Hirudin +hirudine +Hirudinea +hirudinean +hirudiniculture +Hirudinidae +hirudinize +hirudinoid +Hirudo +hirundine +Hirundinidae +hirundinous +Hirundo +his +hish +hisingerite +hisn +Hispa +Hispania +Hispanic +Hispanicism +Hispanicize +hispanidad +Hispaniolate +Hispaniolize +Hispanist +Hispanize +Hispanophile +Hispanophobe +hispid +hispidity +hispidulate +hispidulous +Hispinae +hiss +hisser +hissing +hissingly +hissproof +hist +histaminase +histamine +histaminic +histidine +histie +histiocyte +histiocytic +histioid +histiology +Histiophoridae +Histiophorus +histoblast +histochemic +histochemical +histochemistry +histoclastic +histocyte +histodiagnosis +histodialysis +histodialytic +histogen +histogenesis +histogenetic +histogenetically +histogenic +histogenous +histogeny +histogram +histographer +histographic +histographical +histography +histoid +histologic +histological +histologically +histologist +histology +histolysis +histolytic +histometabasis +histomorphological +histomorphologically +histomorphology +histon +histonal +histone +histonomy +histopathologic +histopathological +histopathologist +histopathology +histophyly +histophysiological +histophysiology +Histoplasma +histoplasmin +histoplasmosis +historial +historian +historiated +historic +historical +historically +historicalness +historician +historicism +historicity +historicize +historicocabbalistical +historicocritical +historicocultural +historicodogmatic +historicogeographical +historicophilosophica +historicophysical +historicopolitical +historicoprophetic +historicoreligious +historics +historicus +historied +historier +historiette +historify +historiograph +historiographer +historiographership +historiographic +historiographical +historiographically +historiography +historiological +historiology +historiometric +historiometry +historionomer +historious +historism +historize +history +histotherapist +histotherapy +histotome +histotomy +histotrophic +histotrophy +histotropic +histozoic +histozyme +histrio +Histriobdella +Histriomastix +histrion +histrionic +histrionical +histrionically +histrionicism +histrionism +hit +hitch +hitcher +hitchhike +hitchhiker +hitchily +hitchiness +Hitchiti +hitchproof +hitchy +hithe +hither +hithermost +hitherto +hitherward +Hitlerism +Hitlerite +hitless +hittable +hitter +Hittite +Hittitics +Hittitology +Hittology +hive +hiveless +hiver +hives +hiveward +Hivite +hizz +Hler +Hlidhskjalf +Hlithskjalf +Hlorrithi +Ho +ho +hoar +hoard +hoarder +hoarding +hoardward +hoarfrost +hoarhead +hoarheaded +hoarhound +hoarily +hoariness +hoarish +hoarness +hoarse +hoarsely +hoarsen +hoarseness +hoarstone +hoarwort +hoary +hoaryheaded +hoast +hoastman +hoatzin +hoax +hoaxee +hoaxer +hoaxproof +hob +hobber +Hobbesian +hobbet +Hobbian +hobbil +Hobbism +Hobbist +Hobbistical +hobble +hobblebush +hobbledehoy +hobbledehoydom +hobbledehoyhood +hobbledehoyish +hobbledehoyishness +hobbledehoyism +hobbledygee +hobbler +hobbling +hobblingly +hobbly +hobby +hobbyhorse +hobbyhorsical +hobbyhorsically +hobbyism +hobbyist +hobbyless +hobgoblin +hoblike +hobnail +hobnailed +hobnailer +hobnob +hobo +hoboism +Hobomoco +hobthrush +hocco +Hochelaga +Hochheimer +hock +Hockday +hockelty +hocker +hocket +hockey +hockshin +Hocktide +hocky +hocus +hod +hodden +hodder +hoddle +hoddy +hodening +hodful +hodgepodge +Hodgkin +hodgkinsonite +hodiernal +hodman +hodmandod +hodograph +hodometer +hodometrical +hoe +hoecake +hoedown +hoeful +hoer +hoernesite +Hoffmannist +Hoffmannite +hog +hoga +hogan +Hogarthian +hogback +hogbush +hogfish +hogframe +hogged +hogger +hoggerel +hoggery +hogget +hoggie +hoggin +hoggish +hoggishly +hoggishness +hoggism +hoggy +hogherd +hoghide +hoghood +hoglike +hogling +hogmace +hogmanay +Hogni +hognose +hognut +hogpen +hogreeve +hogrophyte +hogshead +hogship +hogshouther +hogskin +hogsty +hogward +hogwash +hogweed +hogwort +hogyard +Hohe +Hohenzollern +Hohenzollernism +Hohokam +hoi +hoick +hoin +hoise +hoist +hoistaway +hoister +hoisting +hoistman +hoistway +hoit +hoju +Hokan +hokey +hokeypokey +hokum +holagogue +holarctic +holard +holarthritic +holarthritis +holaspidean +holcad +holcodont +Holconoti +Holcus +hold +holdable +holdall +holdback +holden +holdenite +holder +holdership +holdfast +holdfastness +holding +holdingly +holdout +holdover +holdsman +holdup +hole +holeable +Holectypina +holectypoid +holeless +holeman +holeproof +holer +holethnic +holethnos +holewort +holey +holia +holiday +holidayer +holidayism +holidaymaker +holidaymaking +holily +holiness +holing +holinight +holism +holistic +holistically +holl +holla +hollaite +Holland +hollandaise +Hollander +Hollandish +hollandite +Hollands +Hollantide +holler +hollin +holliper +hollo +hollock +hollong +hollow +hollower +hollowfaced +hollowfoot +hollowhearted +hollowheartedness +hollowly +hollowness +holluschick +holly +hollyhock +Hollywood +Hollywooder +Hollywoodize +holm +holmberry +holmgang +holmia +holmic +holmium +holmos +holobaptist +holobenthic +holoblastic +holoblastically +holobranch +holocaine +holocarpic +holocarpous +holocaust +holocaustal +holocaustic +Holocene +holocentrid +Holocentridae +holocentroid +Holocentrus +Holocephala +holocephalan +Holocephali +holocephalian +holocephalous +Holochoanites +holochoanitic +holochoanoid +Holochoanoida +holochoanoidal +holochordate +holochroal +holoclastic +holocrine +holocryptic +holocrystalline +holodactylic +holodedron +Holodiscus +hologamous +hologamy +hologastrula +hologastrular +Holognatha +holognathous +hologonidium +holograph +holographic +holographical +holohedral +holohedric +holohedrism +holohemihedral +holohyaline +holomastigote +Holometabola +holometabole +holometabolian +holometabolic +holometabolism +holometabolous +holometaboly +holometer +holomorph +holomorphic +holomorphism +holomorphosis +holomorphy +Holomyaria +holomyarian +Holomyarii +holoparasite +holoparasitic +Holophane +holophane +holophotal +holophote +holophotometer +holophrase +holophrasis +holophrasm +holophrastic +holophyte +holophytic +holoplankton +holoplanktonic +holoplexia +holopneustic +holoproteide +holoptic +holoptychian +holoptychiid +Holoptychiidae +Holoptychius +holoquinoid +holoquinoidal +holoquinonic +holoquinonoid +holorhinal +holosaprophyte +holosaprophytic +holosericeous +holoside +holosiderite +Holosiphona +holosiphonate +Holosomata +holosomatous +holospondaic +holostean +Holostei +holosteous +holosteric +Holosteum +Holostomata +holostomate +holostomatous +holostome +holostomous +holostylic +holosymmetric +holosymmetrical +holosymmetry +holosystematic +holosystolic +holothecal +holothoracic +Holothuria +holothurian +Holothuridea +holothurioid +Holothurioidea +holotonia +holotonic +holotony +holotrich +Holotricha +holotrichal +Holotrichida +holotrichous +holotype +holour +holozoic +Holstein +holster +holstered +holt +holy +holyday +holyokeite +holystone +holytide +homage +homageable +homager +Homalocenchrus +homalogonatous +homalographic +homaloid +homaloidal +Homalonotus +Homalopsinae +Homaloptera +Homalopterous +homalosternal +Homalosternii +Homam +Homaridae +homarine +homaroid +Homarus +homatomic +homaxial +homaxonial +homaxonic +Homburg +home +homebody +homeborn +homebound +homebred +homecomer +homecraft +homecroft +homecrofter +homecrofting +homefarer +homefelt +homegoer +homekeeper +homekeeping +homeland +homelander +homeless +homelessly +homelessness +homelet +homelike +homelikeness +homelily +homeliness +homeling +homely +homelyn +homemade +homemaker +homemaking +homeoblastic +homeochromatic +homeochromatism +homeochronous +homeocrystalline +homeogenic +homeogenous +homeoid +homeoidal +homeoidality +homeokinesis +homeokinetic +homeomerous +homeomorph +homeomorphic +homeomorphism +homeomorphous +homeomorphy +homeopath +homeopathic +homeopathically +homeopathician +homeopathicity +homeopathist +homeopathy +homeophony +homeoplasia +homeoplastic +homeoplasy +homeopolar +homeosis +homeostasis +homeostatic +homeotic +homeotransplant +homeotransplantation +homeotype +homeotypic +homeotypical +homeowner +homeozoic +Homer +homer +Homerian +Homeric +Homerical +Homerically +Homerid +Homeridae +Homeridian +Homerist +Homerologist +Homerology +Homeromastix +homeseeker +homesick +homesickly +homesickness +homesite +homesome +homespun +homestall +homestead +homesteader +homester +homestretch +homeward +homewardly +homework +homeworker +homewort +homey +homeyness +homicidal +homicidally +homicide +homicidious +homiculture +homilete +homiletic +homiletical +homiletically +homiletics +homiliarium +homiliary +homilist +homilite +homilize +homily +hominal +hominess +Hominian +hominid +Hominidae +hominiform +hominify +hominine +hominisection +hominivorous +hominoid +hominy +homish +homishness +homo +homoanisaldehyde +homoanisic +homoarecoline +homobaric +homoblastic +homoblasty +homocarpous +homocategoric +homocentric +homocentrical +homocentrically +homocerc +homocercal +homocercality +homocercy +homocerebrin +homochiral +homochlamydeous +homochromatic +homochromatism +homochrome +homochromic +homochromosome +homochromous +homochromy +homochronous +homoclinal +homocline +Homocoela +homocoelous +homocreosol +homocyclic +homodermic +homodermy +homodont +homodontism +homodox +homodoxian +homodromal +homodrome +homodromous +homodromy +homodynamic +homodynamous +homodynamy +homodyne +Homoean +Homoeanism +homoecious +homoeoarchy +homoeoblastic +homoeochromatic +homoeochronous +homoeocrystalline +homoeogenic +homoeogenous +homoeography +homoeokinesis +homoeomerae +Homoeomeri +homoeomeria +homoeomerian +homoeomerianism +homoeomeric +homoeomerical +homoeomerous +homoeomery +homoeomorph +homoeomorphic +homoeomorphism +homoeomorphous +homoeomorphy +homoeopath +homoeopathic +homoeopathically +homoeopathician +homoeopathicity +homoeopathist +homoeopathy +homoeophony +homoeophyllous +homoeoplasia +homoeoplastic +homoeoplasy +homoeopolar +homoeosis +homoeotel +homoeoteleutic +homoeoteleuton +homoeotic +homoeotopy +homoeotype +homoeotypic +homoeotypical +homoeozoic +homoerotic +homoerotism +homofermentative +homogametic +homogamic +homogamous +homogamy +homogangliate +homogen +homogenate +homogene +homogeneal +homogenealness +homogeneate +homogeneity +homogeneization +homogeneize +homogeneous +homogeneously +homogeneousness +homogenesis +homogenetic +homogenetical +homogenic +homogenization +homogenize +homogenizer +homogenous +homogentisic +homogeny +homoglot +homogone +homogonous +homogonously +homogony +homograft +homograph +homographic +homography +homohedral +homoiotherm +homoiothermal +homoiothermic +homoiothermism +homoiothermous +homoiousia +Homoiousian +homoiousian +Homoiousianism +homoiousious +homolateral +homolecithal +homolegalis +homologate +homologation +homologic +homological +homologically +homologist +homologize +homologizer +homologon +homologoumena +homologous +homolographic +homolography +homologue +homology +homolosine +homolysin +homolysis +homomallous +homomeral +homomerous +homometrical +homometrically +homomorph +Homomorpha +homomorphic +homomorphism +homomorphosis +homomorphous +homomorphy +Homoneura +homonomous +homonomy +homonuclear +homonym +homonymic +homonymous +homonymously +homonymy +homoousia +Homoousian +Homoousianism +Homoousianist +Homoousiast +Homoousion +homoousious +homopathy +homoperiodic +homopetalous +homophene +homophenous +homophone +homophonic +homophonous +homophony +homophthalic +homophylic +homophyllous +homophyly +homopiperonyl +homoplasis +homoplasmic +homoplasmy +homoplast +homoplastic +homoplasy +homopolar +homopolarity +homopolic +homopter +Homoptera +homopteran +homopteron +homopterous +Homorelaps +homorganic +homoseismal +homosexual +homosexualism +homosexualist +homosexuality +homosporous +homospory +Homosteus +homostyled +homostylic +homostylism +homostylous +homostyly +homosystemic +homotactic +homotatic +homotaxeous +homotaxia +homotaxial +homotaxially +homotaxic +homotaxis +homotaxy +homothallic +homothallism +homothetic +homothety +homotonic +homotonous +homotonously +homotony +homotopic +homotransplant +homotransplantation +homotropal +homotropous +homotypal +homotype +homotypic +homotypical +homotypy +homovanillic +homovanillin +homoveratric +homoveratrole +homozygosis +homozygosity +homozygote +homozygous +homozygousness +homrai +homuncle +homuncular +homunculus +homy +honda +hondo +Honduran +Honduranean +Honduranian +Hondurean +Hondurian +hone +honest +honestly +honestness +honestone +honesty +honewort +honey +honeybee +honeyberry +honeybind +honeyblob +honeybloom +honeycomb +honeycombed +honeydew +honeydewed +honeydrop +honeyed +honeyedly +honeyedness +honeyfall +honeyflower +honeyfogle +honeyful +honeyhearted +honeyless +honeylike +honeylipped +honeymoon +honeymooner +honeymoonlight +honeymoonshine +honeymoonstruck +honeymoony +honeymouthed +honeypod +honeypot +honeystone +honeysuck +honeysucker +honeysuckle +honeysuckled +honeysweet +honeyware +Honeywood +honeywood +honeywort +hong +honied +honily +honk +honker +honor +Honora +honorability +honorable +honorableness +honorableship +honorably +honorance +honoraria +honorarily +honorarium +honorary +honoree +honorer +honoress +honorific +honorifically +honorless +honorous +honorsman +honorworthy +hontish +hontous +hooch +hoochinoo +hood +hoodcap +hooded +hoodedness +hoodful +hoodie +hoodless +hoodlike +hoodlum +hoodlumish +hoodlumism +hoodlumize +hoodman +hoodmold +hoodoo +hoodsheaf +hoodshy +hoodshyness +hoodwink +hoodwinkable +hoodwinker +hoodwise +hoodwort +hooey +hoof +hoofbeat +hoofbound +hoofed +hoofer +hoofiness +hoofish +hoofless +hooflet +hooflike +hoofmark +hoofprint +hoofrot +hoofs +hoofworm +hoofy +hook +hookah +hookaroon +hooked +hookedness +hookedwise +hooker +Hookera +hookerman +hookers +hookheal +hookish +hookless +hooklet +hooklike +hookmaker +hookmaking +hookman +hooknose +hooksmith +hooktip +hookum +hookup +hookweed +hookwise +hookworm +hookwormer +hookwormy +hooky +hooligan +hooliganism +hooliganize +hoolock +hooly +hoon +hoonoomaun +hoop +hooped +hooper +hooping +hoopla +hoople +hoopless +hooplike +hoopmaker +hoopman +hoopoe +hoopstick +hoopwood +hoose +hoosegow +hoosh +Hoosier +Hoosierdom +Hoosierese +Hoosierize +hoot +hootay +hooter +hootingly +hoove +hooven +Hooverism +Hooverize +hoovey +hop +hopbine +hopbush +Hopcalite +hopcrease +hope +hoped +hopeful +hopefully +hopefulness +hopeite +hopeless +hopelessly +hopelessness +hoper +Hopi +hopi +hopingly +Hopkinsian +Hopkinsianism +Hopkinsonian +hoplite +hoplitic +hoplitodromos +Hoplocephalus +hoplology +hoplomachic +hoplomachist +hoplomachos +hoplomachy +Hoplonemertea +hoplonemertean +hoplonemertine +Hoplonemertini +hopoff +hopped +hopper +hopperburn +hopperdozer +hopperette +hoppergrass +hopperings +hopperman +hoppers +hoppestere +hoppet +hoppingly +hoppity +hopple +hoppy +hopscotch +hopscotcher +hoptoad +hopvine +hopyard +hora +horal +horary +Horatian +Horatio +Horatius +horbachite +hordarian +hordary +horde +hordeaceous +hordeiform +hordein +hordenine +Hordeum +horehound +Horim +horismology +horizometer +horizon +horizonless +horizontal +horizontalism +horizontality +horizontalization +horizontalize +horizontally +horizontalness +horizontic +horizontical +horizontically +horizonward +horme +hormic +hormigo +hormion +hormist +hormogon +Hormogonales +Hormogoneae +Hormogoneales +hormogonium +hormogonous +hormonal +hormone +hormonic +hormonize +hormonogenesis +hormonogenic +hormonology +hormonopoiesis +hormonopoietic +hormos +horn +hornbeam +hornbill +hornblende +hornblendic +hornblendite +hornblendophyre +hornblower +hornbook +horned +hornedness +horner +hornerah +hornet +hornety +hornfair +hornfels +hornfish +hornful +horngeld +Hornie +hornify +hornily +horniness +horning +hornish +hornist +hornito +hornless +hornlessness +hornlet +hornlike +hornotine +hornpipe +hornplant +hornsman +hornstay +hornstone +hornswoggle +horntail +hornthumb +horntip +hornwood +hornwork +hornworm +hornwort +horny +hornyhanded +hornyhead +horograph +horographer +horography +horokaka +horologe +horologer +horologic +horological +horologically +horologiography +horologist +horologium +horologue +horology +horometrical +horometry +Horonite +horopito +horopter +horopteric +horoptery +horoscopal +horoscope +horoscoper +horoscopic +horoscopical +horoscopist +horoscopy +Horouta +horrendous +horrendously +horrent +horrescent +horreum +horribility +horrible +horribleness +horribly +horrid +horridity +horridly +horridness +horrific +horrifically +horrification +horrify +horripilant +horripilate +horripilation +horrisonant +horror +horrorful +horrorish +horrorist +horrorize +horrormonger +horrormongering +horrorous +horrorsome +horse +horseback +horsebacker +horseboy +horsebreaker +horsecar +horsecloth +horsecraft +horsedom +horsefair +horsefettler +horsefight +horsefish +horseflesh +horsefly +horsefoot +horsegate +horsehair +horsehaired +horsehead +horseherd +horsehide +horsehood +horsehoof +horsejockey +horsekeeper +horselaugh +horselaugher +horselaughter +horseleech +horseless +horselike +horseload +horseman +horsemanship +horsemastership +horsemint +horsemonger +horseplay +horseplayful +horsepond +horsepower +horsepox +horser +horseshoe +horseshoer +horsetail +horsetongue +Horsetown +horsetree +horseway +horseweed +horsewhip +horsewhipper +horsewoman +horsewomanship +horsewood +horsfordite +horsify +horsily +horsiness +horsing +horst +horsy +horsyism +hortation +hortative +hortatively +hortator +hortatorily +hortatory +Hortense +Hortensia +hortensial +Hortensian +hortensian +horticultural +horticulturally +horticulture +horticulturist +hortite +hortonolite +hortulan +Horvatian +hory +Hosackia +hosanna +hose +hosed +hosel +hoseless +hoselike +hoseman +hosier +hosiery +hosiomartyr +hospice +hospitable +hospitableness +hospitably +hospitage +hospital +hospitalary +hospitaler +hospitalism +hospitality +hospitalization +hospitalize +hospitant +hospitate +hospitation +hospitator +hospitious +hospitium +hospitize +hospodar +hospodariat +hospodariate +host +Hosta +hostage +hostager +hostageship +hostel +hosteler +hostelry +hoster +hostess +hostie +hostile +hostilely +hostileness +hostility +hostilize +hosting +hostler +hostlership +hostlerwife +hostless +hostly +hostry +hostship +hot +hotbed +hotblood +hotbox +hotbrained +hotch +hotchpot +hotchpotch +hotchpotchly +hotel +hoteldom +hotelhood +hotelier +hotelization +hotelize +hotelkeeper +hotelless +hotelward +hotfoot +hothead +hotheaded +hotheadedly +hotheadedness +hothearted +hotheartedly +hotheartedness +hothouse +hoti +hotly +hotmouthed +hotness +hotspur +hotspurred +Hottentot +Hottentotese +Hottentotic +Hottentotish +Hottentotism +hotter +hottery +hottish +Hottonia +houbara +Houdan +hough +houghband +hougher +houghite +houghmagandy +Houghton +hounce +hound +hounder +houndfish +hounding +houndish +houndlike +houndman +houndsbane +houndsberry +houndshark +houndy +houppelande +hour +hourful +hourglass +houri +hourless +hourly +housage +housal +Housatonic +house +houseball +houseboat +houseboating +housebote +housebound +houseboy +housebreak +housebreaker +housebreaking +housebroke +housebroken +housebug +housebuilder +housebuilding +housecarl +housecoat +housecraft +housefast +housefather +housefly +houseful +housefurnishings +household +householder +householdership +householding +householdry +housekeep +housekeeper +housekeeperlike +housekeeperly +housekeeping +housel +houseleek +houseless +houselessness +houselet +houseline +houseling +housemaid +housemaidenly +housemaiding +housemaidy +houseman +housemaster +housemastership +housemate +housemating +houseminder +housemistress +housemother +housemotherly +houseowner +houser +houseridden +houseroom +housesmith +housetop +houseward +housewares +housewarm +housewarmer +housewarming +housewear +housewife +housewifeliness +housewifely +housewifery +housewifeship +housewifish +housewive +housework +housewright +housing +Houstonia +housty +housy +houtou +houvari +Hova +hove +hovedance +hovel +hoveler +hoven +Hovenia +hover +hoverer +hovering +hoveringly +hoverly +how +howadji +Howard +howardite +howbeit +howdah +howder +howdie +howdy +howe +Howea +howel +however +howff +howish +howitzer +howk +howkit +howl +howler +howlet +howling +howlingly +howlite +howso +howsoever +howsomever +hox +hoy +Hoya +hoyden +hoydenhood +hoydenish +hoydenism +hoyle +hoyman +Hrimfaxi +Hrothgar +Hu +huaca +huaco +huajillo +huamuchil +huantajayite +huaracho +Huari +huarizo +Huastec +Huastecan +Huave +Huavean +hub +hubb +hubba +hubber +Hubbite +hubble +hubbly +hubbub +hubbuboo +hubby +Hubert +hubmaker +hubmaking +hubnerite +hubristic +hubshi +huccatoon +huchen +Huchnom +hucho +huck +huckaback +huckle +huckleback +hucklebacked +huckleberry +hucklebone +huckmuck +huckster +hucksterage +hucksterer +hucksteress +hucksterize +huckstery +hud +huddle +huddledom +huddlement +huddler +huddling +huddlingly +huddock +huddroun +huddup +Hudibras +Hudibrastic +Hudibrastically +Hudsonia +Hudsonian +hudsonite +hue +hued +hueful +hueless +huelessness +huer +huff +huffier +huffily +huffiness +huffingly +huffish +huffishly +huffishness +huffle +huffler +huffy +hug +huge +Hugelia +hugelite +hugely +hugeness +hugeous +hugeously +hugeousness +huggable +hugger +huggermugger +huggermuggery +Huggin +hugging +huggingly +huggle +Hugh +Hughoc +Hugo +Hugoesque +hugsome +Huguenot +Huguenotic +Huguenotism +huh +huia +huipil +huisache +huiscoyol +huitain +Huk +Hukbalahap +huke +hula +Huldah +huldee +hulk +hulkage +hulking +hulky +hull +hullabaloo +huller +hullock +hulloo +hulotheism +Hulsean +hulsite +hulster +hulu +hulver +hulverhead +hulverheaded +hum +Huma +human +humane +humanely +humaneness +humanhood +humanics +humanification +humaniform +humaniformian +humanify +humanish +humanism +humanist +humanistic +humanistical +humanistically +humanitarian +humanitarianism +humanitarianist +humanitarianize +humanitary +humanitian +humanity +humanitymonger +humanization +humanize +humanizer +humankind +humanlike +humanly +humanness +humanoid +humate +humble +humblebee +humblehearted +humblemouthed +humbleness +humbler +humblie +humblingly +humbly +humbo +humboldtilite +humboldtine +humboldtite +humbug +humbugability +humbugable +humbugger +humbuggery +humbuggism +humbuzz +humdinger +humdrum +humdrumminess +humdrummish +humdrummishness +humdudgeon +Humean +humect +humectant +humectate +humectation +humective +humeral +humeri +humeroabdominal +humerocubital +humerodigital +humerodorsal +humerometacarpal +humeroradial +humeroscapular +humeroulnar +humerus +humet +humetty +humhum +humic +humicubation +humid +humidate +humidification +humidifier +humidify +humidistat +humidity +humidityproof +humidly +humidness +humidor +humific +humification +humifuse +humify +humiliant +humiliate +humiliating +humiliatingly +humiliation +humiliative +humiliator +humiliatory +humilific +humilitude +humility +humin +Humiria +Humiriaceae +Humiriaceous +Humism +Humist +humistratous +humite +humlie +hummel +hummeler +hummer +hummie +humming +hummingbird +hummock +hummocky +humor +humoral +humoralism +humoralist +humoralistic +humoresque +humoresquely +humorful +humorific +humorism +humorist +humoristic +humoristical +humorize +humorless +humorlessness +humorology +humorous +humorously +humorousness +humorproof +humorsome +humorsomely +humorsomeness +humourful +humous +hump +humpback +humpbacked +humped +humph +Humphrey +humpiness +humpless +humpty +humpy +humstrum +humulene +humulone +Humulus +humus +humuslike +Hun +Hunanese +hunch +Hunchakist +hunchback +hunchbacked +hunchet +hunchy +hundi +hundred +hundredal +hundredary +hundreder +hundredfold +hundredman +hundredpenny +hundredth +hundredweight +hundredwork +hung +Hungaria +Hungarian +hungarite +hunger +hungerer +hungeringly +hungerless +hungerly +hungerproof +hungerweed +hungrify +hungrily +hungriness +hungry +hunh +hunk +Hunker +hunker +Hunkerism +hunkerous +hunkerousness +hunkers +hunkies +Hunkpapa +hunks +hunky +Hunlike +Hunnian +Hunnic +Hunnican +Hunnish +Hunnishness +hunt +huntable +huntedly +Hunterian +hunterlike +huntilite +hunting +huntress +huntsman +huntsmanship +huntswoman +Hunyak +hup +Hupa +hupaithric +Hura +hura +hurcheon +hurdies +hurdis +hurdle +hurdleman +hurdler +hurdlewise +hurds +hure +hureaulite +hureek +hurgila +hurkle +hurl +hurlbarrow +hurled +hurler +hurley +hurleyhouse +hurling +hurlock +hurly +Huron +huron +Huronian +hurr +hurrah +Hurri +Hurrian +hurricane +hurricanize +hurricano +hurried +hurriedly +hurriedness +hurrier +hurrisome +hurrock +hurroo +hurroosh +hurry +hurryingly +hurryproof +hursinghar +hurst +hurt +hurtable +hurted +hurter +hurtful +hurtfully +hurtfulness +hurting +hurtingest +hurtle +hurtleberry +hurtless +hurtlessly +hurtlessness +hurtlingly +hurtsome +hurty +husband +husbandable +husbandage +husbander +husbandfield +husbandhood +husbandland +husbandless +husbandlike +husbandliness +husbandly +husbandman +husbandress +husbandry +husbandship +huse +hush +hushable +hushaby +hushcloth +hushedly +husheen +hushel +husher +hushful +hushfully +hushing +hushingly +hushion +husho +husk +huskanaw +husked +huskened +husker +huskershredder +huskily +huskiness +husking +huskroot +huskwort +Husky +husky +huso +huspil +huss +hussar +Hussite +Hussitism +hussy +hussydom +hussyness +husting +hustle +hustlecap +hustlement +hustler +hut +hutch +hutcher +hutchet +Hutchinsonian +Hutchinsonianism +hutchinsonite +Huterian +huthold +hutholder +hutia +hutkeeper +hutlet +hutment +Hutsulian +Hutterites +Huttonian +Huttonianism +huttoning +huttonweed +hutukhtu +huvelyk +Huxleian +Huygenian +huzoor +Huzvaresh +huzz +huzza +huzzard +hyacinth +Hyacinthia +hyacinthian +hyacinthine +Hyacinthus +Hyades +hyaena +Hyaenanche +Hyaenarctos +Hyaenidae +Hyaenodon +hyaenodont +hyaenodontoid +Hyakume +hyalescence +hyalescent +hyaline +hyalinization +hyalinize +hyalinocrystalline +hyalinosis +hyalite +hyalitis +hyaloandesite +hyalobasalt +hyalocrystalline +hyalodacite +hyalogen +hyalograph +hyalographer +hyalography +hyaloid +hyaloiditis +hyaloliparite +hyalolith +hyalomelan +hyalomucoid +Hyalonema +hyalophagia +hyalophane +hyalophyre +hyalopilitic +hyaloplasm +hyaloplasma +hyaloplasmic +hyalopsite +hyalopterous +hyalosiderite +Hyalospongia +hyalotekite +hyalotype +hyaluronic +hyaluronidase +Hybanthus +Hybla +Hyblaea +Hyblaean +Hyblan +hybodont +Hybodus +hybosis +hybrid +hybridal +hybridation +hybridism +hybridist +hybridity +hybridizable +hybridization +hybridize +hybridizer +hybridous +hydantoate +hydantoic +hydantoin +hydathode +hydatid +hydatidiform +hydatidinous +hydatidocele +hydatiform +hydatigenous +Hydatina +hydatogenesis +hydatogenic +hydatogenous +hydatoid +hydatomorphic +hydatomorphism +hydatopneumatic +hydatopneumatolytic +hydatopyrogenic +hydatoscopy +Hydnaceae +hydnaceous +hydnocarpate +hydnocarpic +Hydnocarpus +hydnoid +Hydnora +Hydnoraceae +hydnoraceous +Hydnum +Hydra +hydracetin +Hydrachna +hydrachnid +Hydrachnidae +hydracid +hydracoral +hydracrylate +hydracrylic +Hydractinia +hydractinian +Hydradephaga +hydradephagan +hydradephagous +hydragogue +hydragogy +hydramine +hydramnion +hydramnios +Hydrangea +Hydrangeaceae +hydrangeaceous +hydrant +hydranth +hydrarch +hydrargillite +hydrargyrate +hydrargyria +hydrargyriasis +hydrargyric +hydrargyrism +hydrargyrosis +hydrargyrum +hydrarthrosis +hydrarthrus +hydrastine +Hydrastis +hydrate +hydrated +hydration +hydrator +hydratropic +hydraucone +hydraulic +hydraulically +hydraulician +hydraulicity +hydraulicked +hydraulicon +hydraulics +hydraulist +hydraulus +hydrazide +hydrazidine +hydrazimethylene +hydrazine +hydrazino +hydrazo +hydrazoate +hydrazobenzene +hydrazoic +hydrazone +hydrazyl +hydremia +hydremic +hydrencephalocele +hydrencephaloid +hydrencephalus +hydria +hydriatric +hydriatrist +hydriatry +hydric +hydrically +Hydrid +hydride +hydriform +hydrindene +hydriodate +hydriodic +hydriodide +hydriotaphia +Hydriote +hydro +hydroa +hydroadipsia +hydroaeric +hydroalcoholic +hydroaromatic +hydroatmospheric +hydroaviation +hydrobarometer +Hydrobates +Hydrobatidae +hydrobenzoin +hydrobilirubin +hydrobiological +hydrobiologist +hydrobiology +hydrobiosis +hydrobiplane +hydrobomb +hydroboracite +hydroborofluoric +hydrobranchiate +hydrobromate +hydrobromic +hydrobromide +hydrocarbide +hydrocarbon +hydrocarbonaceous +hydrocarbonate +hydrocarbonic +hydrocarbonous +hydrocarbostyril +hydrocardia +Hydrocaryaceae +hydrocaryaceous +hydrocatalysis +hydrocauline +hydrocaulus +hydrocele +hydrocellulose +hydrocephalic +hydrocephalocele +hydrocephaloid +hydrocephalous +hydrocephalus +hydrocephaly +hydroceramic +hydrocerussite +Hydrocharidaceae +hydrocharidaceous +Hydrocharis +Hydrocharitaceae +hydrocharitaceous +Hydrochelidon +hydrochemical +hydrochemistry +hydrochlorate +hydrochlorauric +hydrochloric +hydrochloride +hydrochlorplatinic +hydrochlorplatinous +Hydrochoerus +hydrocholecystis +hydrocinchonine +hydrocinnamic +hydrocirsocele +hydrocladium +hydroclastic +Hydrocleis +hydroclimate +hydrocobalticyanic +hydrocoele +hydrocollidine +hydroconion +Hydrocorallia +Hydrocorallinae +hydrocoralline +Hydrocores +Hydrocorisae +hydrocorisan +hydrocotarnine +Hydrocotyle +hydrocoumaric +hydrocupreine +hydrocyanate +hydrocyanic +hydrocyanide +hydrocycle +hydrocyclic +hydrocyclist +Hydrocyon +hydrocyst +hydrocystic +Hydrodamalidae +Hydrodamalis +Hydrodictyaceae +Hydrodictyon +hydrodrome +Hydrodromica +hydrodromican +hydrodynamic +hydrodynamical +hydrodynamics +hydrodynamometer +hydroeconomics +hydroelectric +hydroelectricity +hydroelectrization +hydroergotinine +hydroextract +hydroextractor +hydroferricyanic +hydroferrocyanate +hydroferrocyanic +hydrofluate +hydrofluoboric +hydrofluoric +hydrofluorid +hydrofluoride +hydrofluosilicate +hydrofluosilicic +hydrofluozirconic +hydrofoil +hydroforming +hydrofranklinite +hydrofuge +hydrogalvanic +hydrogel +hydrogen +hydrogenase +hydrogenate +hydrogenation +hydrogenator +hydrogenic +hydrogenide +hydrogenium +hydrogenization +hydrogenize +hydrogenolysis +Hydrogenomonas +hydrogenous +hydrogeological +hydrogeology +hydroglider +hydrognosy +hydrogode +hydrograph +hydrographer +hydrographic +hydrographical +hydrographically +hydrography +hydrogymnastics +hydrohalide +hydrohematite +hydrohemothorax +hydroid +Hydroida +Hydroidea +hydroidean +hydroiodic +hydrokinetic +hydrokinetical +hydrokinetics +hydrol +hydrolase +hydrolatry +Hydrolea +Hydroleaceae +hydrolize +hydrologic +hydrological +hydrologically +hydrologist +hydrology +hydrolysis +hydrolyst +hydrolyte +hydrolytic +hydrolyzable +hydrolyzate +hydrolyzation +hydrolyze +hydromagnesite +hydromancer +hydromancy +hydromania +hydromaniac +hydromantic +hydromantical +hydromantically +hydrome +hydromechanical +hydromechanics +hydromedusa +Hydromedusae +hydromedusan +hydromedusoid +hydromel +hydromeningitis +hydromeningocele +hydrometallurgical +hydrometallurgically +hydrometallurgy +hydrometamorphism +hydrometeor +hydrometeorological +hydrometeorology +hydrometer +hydrometra +hydrometric +hydrometrical +hydrometrid +Hydrometridae +hydrometry +hydromica +hydromicaceous +hydromonoplane +hydromorph +hydromorphic +hydromorphous +hydromorphy +hydromotor +hydromyelia +hydromyelocele +hydromyoma +Hydromys +hydrone +hydronegative +hydronephelite +hydronephrosis +hydronephrotic +hydronitric +hydronitroprussic +hydronitrous +hydronium +hydroparacoumaric +Hydroparastatae +hydropath +hydropathic +hydropathical +hydropathist +hydropathy +hydropericarditis +hydropericardium +hydroperiod +hydroperitoneum +hydroperitonitis +hydroperoxide +hydrophane +hydrophanous +hydrophid +Hydrophidae +hydrophil +hydrophile +hydrophilic +hydrophilid +Hydrophilidae +hydrophilism +hydrophilite +hydrophiloid +hydrophilous +hydrophily +Hydrophinae +Hydrophis +hydrophobe +hydrophobia +hydrophobic +hydrophobical +hydrophobist +hydrophobophobia +hydrophobous +hydrophoby +hydrophoid +hydrophone +Hydrophora +hydrophoran +hydrophore +hydrophoria +hydrophorous +hydrophthalmia +hydrophthalmos +hydrophthalmus +hydrophylacium +hydrophyll +Hydrophyllaceae +hydrophyllaceous +hydrophylliaceous +hydrophyllium +Hydrophyllum +hydrophysometra +hydrophyte +hydrophytic +hydrophytism +hydrophyton +hydrophytous +hydropic +hydropical +hydropically +hydropigenous +hydroplane +hydroplanula +hydroplatinocyanic +hydroplutonic +hydropneumatic +hydropneumatosis +hydropneumopericardium +hydropneumothorax +hydropolyp +hydroponic +hydroponicist +hydroponics +hydroponist +hydropositive +hydropot +Hydropotes +hydropropulsion +hydrops +hydropsy +Hydropterideae +hydroptic +hydropult +hydropultic +hydroquinine +hydroquinol +hydroquinoline +hydroquinone +hydrorachis +hydrorhiza +hydrorhizal +hydrorrhachis +hydrorrhachitis +hydrorrhea +hydrorrhoea +hydrorubber +hydrosalpinx +hydrosalt +hydrosarcocele +hydroscope +hydroscopic +hydroscopical +hydroscopicity +hydroscopist +hydroselenic +hydroselenide +hydroselenuret +hydroseparation +hydrosilicate +hydrosilicon +hydrosol +hydrosomal +hydrosomatous +hydrosome +hydrosorbic +hydrosphere +hydrospire +hydrospiric +hydrostat +hydrostatic +hydrostatical +hydrostatically +hydrostatician +hydrostatics +hydrostome +hydrosulphate +hydrosulphide +hydrosulphite +hydrosulphocyanic +hydrosulphurated +hydrosulphuret +hydrosulphureted +hydrosulphuric +hydrosulphurous +hydrosulphuryl +hydrotachymeter +hydrotactic +hydrotalcite +hydrotasimeter +hydrotaxis +hydrotechnic +hydrotechnical +hydrotechnologist +hydrotechny +hydroterpene +hydrotheca +hydrothecal +hydrotherapeutic +hydrotherapeutics +hydrotherapy +hydrothermal +hydrothoracic +hydrothorax +hydrotic +hydrotical +hydrotimeter +hydrotimetric +hydrotimetry +hydrotomy +hydrotropic +hydrotropism +hydroturbine +hydrotype +hydrous +hydrovane +hydroxamic +hydroxamino +hydroxide +hydroximic +hydroxy +hydroxyacetic +hydroxyanthraquinone +hydroxybutyricacid +hydroxyketone +hydroxyl +hydroxylactone +hydroxylamine +hydroxylate +hydroxylation +hydroxylic +hydroxylization +hydroxylize +hydrozincite +Hydrozoa +hydrozoal +hydrozoan +hydrozoic +hydrozoon +hydrula +Hydruntine +Hydrurus +Hydrus +hydurilate +hydurilic +hyena +hyenadog +hyenanchin +hyenic +hyeniform +hyenine +hyenoid +hyetal +hyetograph +hyetographic +hyetographical +hyetographically +hyetography +hyetological +hyetology +hyetometer +hyetometrograph +Hygeia +Hygeian +hygeiolatry +hygeist +hygeistic +hygeology +hygiantic +hygiantics +hygiastic +hygiastics +hygieist +hygienal +hygiene +hygienic +hygienical +hygienically +hygienics +hygienist +hygienization +hygienize +hygiologist +hygiology +hygric +hygrine +hygroblepharic +hygrodeik +hygroexpansivity +hygrograph +hygrology +hygroma +hygromatous +hygrometer +hygrometric +hygrometrical +hygrometrically +hygrometry +hygrophaneity +hygrophanous +hygrophilous +hygrophobia +hygrophthalmic +hygrophyte +hygrophytic +hygroplasm +hygroplasma +hygroscope +hygroscopic +hygroscopical +hygroscopically +hygroscopicity +hygroscopy +hygrostat +hygrostatics +hygrostomia +hygrothermal +hygrothermograph +hying +hyke +Hyla +hylactic +hylactism +hylarchic +hylarchical +hyle +hyleg +hylegiacal +hylic +hylicism +hylicist +Hylidae +hylism +hylist +Hyllus +Hylobates +hylobatian +hylobatic +hylobatine +Hylocereus +Hylocichla +Hylocomium +Hylodes +hylogenesis +hylogeny +hyloid +hylology +hylomorphic +hylomorphical +hylomorphism +hylomorphist +hylomorphous +Hylomys +hylopathism +hylopathist +hylopathy +hylophagous +hylotheism +hylotheist +hylotheistic +hylotheistical +hylotomous +hylozoic +hylozoism +hylozoist +hylozoistic +hylozoistically +hymen +Hymenaea +Hymenaeus +Hymenaic +hymenal +hymeneal +hymeneally +hymeneals +hymenean +hymenial +hymenic +hymenicolar +hymeniferous +hymeniophore +hymenium +Hymenocallis +Hymenochaete +Hymenogaster +Hymenogastraceae +hymenogeny +hymenoid +Hymenolepis +hymenomycetal +hymenomycete +Hymenomycetes +hymenomycetoid +hymenomycetous +hymenophore +hymenophorum +Hymenophyllaceae +hymenophyllaceous +Hymenophyllites +Hymenophyllum +hymenopter +Hymenoptera +hymenopteran +hymenopterist +hymenopterological +hymenopterologist +hymenopterology +hymenopteron +hymenopterous +hymenotomy +Hymettian +Hymettic +hymn +hymnal +hymnarium +hymnary +hymnbook +hymner +hymnic +hymnist +hymnless +hymnlike +hymnode +hymnodical +hymnodist +hymnody +hymnographer +hymnography +hymnologic +hymnological +hymnologically +hymnologist +hymnology +hymnwise +hynde +hyne +hyobranchial +hyocholalic +hyocholic +hyoepiglottic +hyoepiglottidean +hyoglossal +hyoglossus +hyoglycocholic +hyoid +hyoidal +hyoidan +hyoideal +hyoidean +hyoides +Hyolithes +hyolithid +Hyolithidae +hyolithoid +hyomandibula +hyomandibular +hyomental +hyoplastral +hyoplastron +hyoscapular +hyoscine +hyoscyamine +Hyoscyamus +hyosternal +hyosternum +hyostylic +hyostyly +hyothere +Hyotherium +hyothyreoid +hyothyroid +hyp +hypabyssal +hypaethral +hypaethron +hypaethros +hypaethrum +hypalgesia +hypalgia +hypalgic +hypallactic +hypallage +hypanthial +hypanthium +hypantrum +Hypapante +hypapophysial +hypapophysis +hyparterial +hypaspist +hypate +hypaton +hypautomorphic +hypaxial +Hypenantron +hyper +hyperabelian +hyperabsorption +hyperaccurate +hyperacid +hyperacidaminuria +hyperacidity +hyperacoustics +hyperaction +hyperactive +hyperactivity +hyperacuity +hyperacusia +hyperacusis +hyperacute +hyperacuteness +hyperadenosis +hyperadiposis +hyperadiposity +hyperadrenalemia +hyperaeolism +hyperalbuminosis +hyperalgebra +hyperalgesia +hyperalgesic +hyperalgesis +hyperalgetic +hyperalimentation +hyperalkalinity +hyperaltruism +hyperaminoacidemia +hyperanabolic +hyperanarchy +hyperangelical +hyperaphia +hyperaphic +hyperapophyseal +hyperapophysial +hyperapophysis +hyperarchaeological +hyperarchepiscopal +hyperazotemia +hyperbarbarous +hyperbatic +hyperbatically +hyperbaton +hyperbola +hyperbolaeon +hyperbole +hyperbolic +hyperbolically +hyperbolicly +hyperbolism +hyperbolize +hyperboloid +hyperboloidal +hyperboreal +Hyperborean +hyperborean +hyperbrachycephal +hyperbrachycephalic +hyperbrachycephaly +hyperbrachycranial +hyperbrachyskelic +hyperbranchia +hyperbrutal +hyperbulia +hypercalcemia +hypercarbamidemia +hypercarbureted +hypercarburetted +hypercarnal +hypercatalectic +hypercatalexis +hypercatharsis +hypercathartic +hypercathexis +hypercenosis +hyperchamaerrhine +hyperchlorhydria +hyperchloric +hypercholesterinemia +hypercholesterolemia +hypercholia +hypercivilization +hypercivilized +hyperclassical +hyperclimax +hypercoagulability +hypercoagulable +hypercomplex +hypercomposite +hyperconcentration +hypercone +hyperconfident +hyperconformist +hyperconscientious +hyperconscientiousness +hyperconscious +hyperconsciousness +hyperconservatism +hyperconstitutional +hypercoracoid +hypercorrect +hypercorrection +hypercorrectness +hypercosmic +hypercreaturely +hypercritic +hypercritical +hypercritically +hypercriticism +hypercriticize +hypercryalgesia +hypercube +hypercyanotic +hypercycle +hypercylinder +hyperdactyl +hyperdactylia +hyperdactyly +hyperdeify +hyperdelicacy +hyperdelicate +hyperdemocracy +hyperdemocratic +hyperdeterminant +hyperdiabolical +hyperdialectism +hyperdiapason +hyperdiapente +hyperdiastole +hyperdiatessaron +hyperdiazeuxis +hyperdicrotic +hyperdicrotism +hyperdicrotous +hyperdimensional +hyperdimensionality +hyperdissyllable +hyperdistention +hyperditone +hyperdivision +hyperdolichocephal +hyperdolichocephalic +hyperdolichocephaly +hyperdolichocranial +hyperdoricism +hyperdulia +hyperdulic +hyperdulical +hyperelegant +hyperelliptic +hyperemesis +hyperemetic +hyperemia +hyperemic +hyperemotivity +hyperemphasize +hyperenthusiasm +hypereosinophilia +hyperephidrosis +hyperequatorial +hypererethism +hyperessence +hyperesthesia +hyperesthetic +hyperethical +hypereuryprosopic +hypereutectic +hypereutectoid +hyperexaltation +hyperexcitability +hyperexcitable +hyperexcitement +hyperexcursive +hyperexophoria +hyperextend +hyperextension +hyperfastidious +hyperfederalist +hyperfine +hyperflexion +hyperfocal +hyperfunction +hyperfunctional +hyperfunctioning +hypergalactia +hypergamous +hypergamy +hypergenesis +hypergenetic +hypergeometric +hypergeometrical +hypergeometry +hypergeusia +hypergeustia +hyperglycemia +hyperglycemic +hyperglycorrhachia +hyperglycosuria +hypergoddess +hypergol +hypergolic +Hypergon +hypergrammatical +hyperhedonia +hyperhemoglobinemia +hyperhilarious +hyperhypocrisy +Hypericaceae +hypericaceous +Hypericales +hypericin +hypericism +Hypericum +hypericum +hyperidealistic +hyperideation +hyperimmune +hyperimmunity +hyperimmunization +hyperimmunize +hyperingenuity +hyperinosis +hyperinotic +hyperinsulinization +hyperinsulinize +hyperintellectual +hyperintelligence +hyperinvolution +hyperirritability +hyperirritable +hyperisotonic +hyperite +hyperkeratosis +hyperkinesia +hyperkinesis +hyperkinetic +hyperlactation +hyperleptoprosopic +hyperleucocytosis +hyperlipemia +hyperlipoidemia +hyperlithuria +hyperlogical +hyperlustrous +hypermagical +hypermakroskelic +hypermedication +hypermenorrhea +hypermetabolism +hypermetamorphic +hypermetamorphism +hypermetamorphosis +hypermetamorphotic +hypermetaphorical +hypermetaphysical +hypermetaplasia +hypermeter +hypermetric +hypermetrical +hypermetron +hypermetrope +hypermetropia +hypermetropic +hypermetropical +hypermetropy +hypermiraculous +hypermixolydian +hypermnesia +hypermnesic +hypermnesis +hypermnestic +hypermodest +hypermonosyllable +hypermoral +hypermorph +hypermorphism +hypermorphosis +hypermotile +hypermotility +hypermyotonia +hypermyotrophy +hypermyriorama +hypermystical +hypernatural +hypernephroma +hyperneuria +hyperneurotic +hypernic +hypernitrogenous +hypernomian +hypernomic +hypernormal +hypernote +hypernutrition +Hyperoartia +hyperoartian +hyperobtrusive +hyperodontogeny +Hyperoodon +hyperoon +hyperope +hyperopia +hyperopic +hyperorganic +hyperorthognathic +hyperorthognathous +hyperorthognathy +hyperosmia +hyperosmic +hyperostosis +hyperostotic +hyperothodox +hyperothodoxy +Hyperotreta +hyperotretan +Hyperotreti +hyperotretous +hyperoxidation +hyperoxide +hyperoxygenate +hyperoxygenation +hyperoxygenize +hyperpanegyric +hyperparasite +hyperparasitic +hyperparasitism +hyperparasitize +hyperparoxysm +hyperpathetic +hyperpatriotic +hyperpencil +hyperpepsinia +hyperper +hyperperistalsis +hyperperistaltic +hyperpersonal +hyperphalangeal +hyperphalangism +hyperpharyngeal +hyperphenomena +hyperphoria +hyperphoric +hyperphosphorescence +hyperphysical +hyperphysically +hyperphysics +hyperpiesia +hyperpiesis +hyperpietic +hyperpietist +hyperpigmentation +hyperpigmented +hyperpinealism +hyperpituitarism +hyperplagiarism +hyperplane +hyperplasia +hyperplasic +hyperplastic +hyperplatyrrhine +hyperploid +hyperploidy +hyperpnea +hyperpnoea +hyperpolysyllabic +hyperpredator +hyperprism +hyperproduction +hyperprognathous +hyperprophetical +hyperprosexia +hyperpulmonary +hyperpure +hyperpurist +hyperpyramid +hyperpyretic +hyperpyrexia +hyperpyrexial +hyperquadric +hyperrational +hyperreactive +hyperrealize +hyperresonance +hyperresonant +hyperreverential +hyperrhythmical +hyperridiculous +hyperritualism +hypersacerdotal +hypersaintly +hypersalivation +hypersceptical +hyperscholastic +hyperscrupulosity +hypersecretion +hypersensibility +hypersensitive +hypersensitiveness +hypersensitivity +hypersensitization +hypersensitize +hypersensual +hypersensualism +hypersensuous +hypersentimental +hypersolid +hypersomnia +hypersonic +hypersophisticated +hyperspace +hyperspatial +hyperspeculative +hypersphere +hyperspherical +hyperspiritualizing +hypersplenia +hypersplenism +hypersthene +hypersthenia +hypersthenic +hypersthenite +hyperstoic +hyperstrophic +hypersubtlety +hypersuggestibility +hypersuperlative +hypersurface +hypersusceptibility +hypersusceptible +hypersystole +hypersystolic +hypertechnical +hypertelic +hypertely +hypertense +hypertensin +hypertension +hypertensive +hyperterrestrial +hypertetrahedron +hyperthermal +hyperthermalgesia +hyperthermesthesia +hyperthermia +hyperthermic +hyperthermy +hyperthesis +hyperthetic +hyperthetical +hyperthyreosis +hyperthyroid +hyperthyroidism +hyperthyroidization +hyperthyroidize +hypertonia +hypertonic +hypertonicity +hypertonus +hypertorrid +hypertoxic +hypertoxicity +hypertragical +hypertragically +hypertranscendent +hypertrichosis +hypertridimensional +hypertrophic +hypertrophied +hypertrophous +hypertrophy +hypertropia +hypertropical +hypertype +hypertypic +hypertypical +hyperurbanism +hyperuresis +hypervascular +hypervascularity +hypervenosity +hyperventilate +hyperventilation +hypervigilant +hyperviscosity +hypervitalization +hypervitalize +hypervitaminosis +hypervolume +hyperwrought +hypesthesia +hypesthesic +hypethral +hypha +Hyphaene +hyphaeresis +hyphal +hyphedonia +hyphema +hyphen +hyphenate +hyphenated +hyphenation +hyphenic +hyphenism +hyphenization +hyphenize +hypho +hyphodrome +Hyphomycetales +hyphomycete +Hyphomycetes +hyphomycetic +hyphomycetous +hyphomycosis +hypidiomorphic +hypidiomorphically +hypinosis +hypinotic +Hypnaceae +hypnaceous +hypnagogic +hypnesthesis +hypnesthetic +hypnoanalysis +hypnobate +hypnocyst +hypnody +hypnoetic +hypnogenesis +hypnogenetic +hypnoid +hypnoidal +hypnoidization +hypnoidize +hypnologic +hypnological +hypnologist +hypnology +hypnone +hypnophobia +hypnophobic +hypnophoby +hypnopompic +Hypnos +hypnoses +hypnosis +hypnosperm +hypnosporangium +hypnospore +hypnosporic +hypnotherapy +hypnotic +hypnotically +hypnotism +hypnotist +hypnotistic +hypnotizability +hypnotizable +hypnotization +hypnotize +hypnotizer +hypnotoid +hypnotoxin +Hypnum +hypo +hypoacid +hypoacidity +hypoactive +hypoactivity +hypoadenia +hypoadrenia +hypoaeolian +hypoalimentation +hypoalkaline +hypoalkalinity +hypoaminoacidemia +hypoantimonate +hypoazoturia +hypobasal +hypobatholithic +hypobenthonic +hypobenthos +hypoblast +hypoblastic +hypobole +hypobranchial +hypobranchiate +hypobromite +hypobromous +hypobulia +hypobulic +hypocalcemia +hypocarp +hypocarpium +hypocarpogean +hypocatharsis +hypocathartic +hypocathexis +hypocaust +hypocentrum +hypocephalus +Hypochaeris +hypochil +hypochilium +hypochlorhydria +hypochlorhydric +hypochloric +hypochlorite +hypochlorous +hypochloruria +Hypochnaceae +hypochnose +Hypochnus +hypochondria +hypochondriac +hypochondriacal +hypochondriacally +hypochondriacism +hypochondrial +hypochondriasis +hypochondriast +hypochondrium +hypochondry +hypochordal +hypochromia +hypochrosis +hypochylia +hypocist +hypocleidian +hypocleidium +hypocoelom +hypocondylar +hypocone +hypoconid +hypoconule +hypoconulid +hypocoracoid +hypocorism +hypocoristic +hypocoristical +hypocoristically +hypocotyl +hypocotyleal +hypocotyledonary +hypocotyledonous +hypocotylous +hypocrater +hypocrateriform +hypocraterimorphous +Hypocreaceae +hypocreaceous +Hypocreales +hypocrisis +hypocrisy +hypocrital +hypocrite +hypocritic +hypocritical +hypocritically +hypocrize +hypocrystalline +hypocycloid +hypocycloidal +hypocystotomy +hypocytosis +hypodactylum +hypoderm +hypoderma +hypodermal +hypodermatic +hypodermatically +hypodermatoclysis +hypodermatomy +Hypodermella +hypodermic +hypodermically +hypodermis +hypodermoclysis +hypodermosis +hypodermous +hypodiapason +hypodiapente +hypodiastole +hypodiatessaron +hypodiazeuxis +hypodicrotic +hypodicrotous +hypoditone +hypodorian +hypodynamia +hypodynamic +hypoeliminator +hypoendocrinism +hypoeosinophilia +hypoeutectic +hypoeutectoid +hypofunction +hypogastric +hypogastrium +hypogastrocele +hypogeal +hypogean +hypogee +hypogeic +hypogeiody +hypogene +hypogenesis +hypogenetic +hypogenic +hypogenous +hypogeocarpous +hypogeous +hypogeum +hypogeusia +hypoglobulia +hypoglossal +hypoglossitis +hypoglossus +hypoglottis +hypoglycemia +hypoglycemic +hypognathism +hypognathous +hypogonation +hypogynic +hypogynium +hypogynous +hypogyny +hypohalous +hypohemia +hypohidrosis +Hypohippus +hypohyal +hypohyaline +hypoid +hypoiodite +hypoiodous +hypoionian +hypoischium +hypoisotonic +hypokeimenometry +hypokinesia +hypokinesis +hypokinetic +hypokoristikon +hypolemniscus +hypoleptically +hypoleucocytosis +hypolimnion +hypolocrian +hypolydian +hypomania +hypomanic +hypomelancholia +hypomeral +hypomere +hypomeron +hypometropia +hypomixolydian +hypomnematic +hypomnesis +hypomochlion +hypomorph +hypomotility +hypomyotonia +hyponastic +hyponastically +hyponasty +hyponeuria +hyponitric +hyponitrite +hyponitrous +hyponoetic +hyponoia +hyponome +hyponomic +hyponychial +hyponychium +hyponym +hyponymic +hyponymous +Hypoparia +hypopepsia +hypopepsinia +hypopepsy +hypopetalous +hypopetaly +hypophalangism +hypophamin +hypophamine +hypophare +hypopharyngeal +hypopharynx +hypophloeodal +hypophloeodic +hypophloeous +hypophonic +hypophonous +hypophora +hypophoria +hypophosphate +hypophosphite +hypophosphoric +hypophosphorous +hypophrenia +hypophrenic +hypophrenosis +hypophrygian +hypophyge +hypophyll +hypophyllium +hypophyllous +hypophyllum +hypophyse +hypophyseal +hypophysectomize +hypophysectomy +hypophyseoprivic +hypophyseoprivous +hypophysial +hypophysical +hypophysics +hypophysis +hypopial +hypopinealism +hypopituitarism +Hypopitys +hypoplankton +hypoplanktonic +hypoplasia +hypoplastic +hypoplastral +hypoplastron +hypoplasty +hypoplasy +hypoploid +hypoploidy +hypopodium +hypopraxia +hypoprosexia +hypopselaphesia +hypopteral +hypopteron +hypoptilar +hypoptilum +hypoptosis +hypoptyalism +hypopus +hypopygial +hypopygidium +hypopygium +hypopyon +hyporadial +hyporadiolus +hyporadius +hyporchema +hyporchematic +hyporcheme +hyporchesis +hyporhachidian +hyporhachis +hyporhined +hyporit +hyporrhythmic +hyposcenium +hyposcleral +hyposcope +hyposecretion +hyposensitization +hyposensitize +hyposkeletal +hyposmia +hypospadiac +hypospadias +hyposphene +hypospray +hypostase +hypostasis +hypostasization +hypostasize +hypostasy +hypostatic +hypostatical +hypostatically +hypostatization +hypostatize +hyposternal +hyposternum +hyposthenia +hyposthenic +hyposthenuria +hypostigma +hypostilbite +hypostoma +Hypostomata +hypostomatic +hypostomatous +hypostome +hypostomial +Hypostomides +hypostomous +hypostrophe +hypostyle +hypostypsis +hypostyptic +hyposulphite +hyposulphurous +hyposuprarenalism +hyposyllogistic +hyposynaphe +hyposynergia +hyposystole +hypotactic +hypotarsal +hypotarsus +hypotaxia +hypotaxic +hypotaxis +hypotension +hypotensive +hypotensor +hypotenusal +hypotenuse +hypothalamic +hypothalamus +hypothalline +hypothallus +hypothec +hypotheca +hypothecal +hypothecary +hypothecate +hypothecation +hypothecative +hypothecator +hypothecatory +hypothecial +hypothecium +hypothenal +hypothenar +Hypotheria +hypothermal +hypothermia +hypothermic +hypothermy +hypotheses +hypothesis +hypothesist +hypothesize +hypothesizer +hypothetic +hypothetical +hypothetically +hypothetics +hypothetist +hypothetize +hypothetizer +hypothyreosis +hypothyroid +hypothyroidism +hypotonia +hypotonic +hypotonicity +hypotonus +hypotony +hypotoxic +hypotoxicity +hypotrachelium +Hypotremata +hypotrich +Hypotricha +Hypotrichida +hypotrichosis +hypotrichous +hypotrochanteric +hypotrochoid +hypotrochoidal +hypotrophic +hypotrophy +hypotympanic +hypotypic +hypotypical +hypotyposis +hypovalve +hypovanadate +hypovanadic +hypovanadious +hypovanadous +hypovitaminosis +hypoxanthic +hypoxanthine +Hypoxis +Hypoxylon +hypozeugma +hypozeuxis +Hypozoa +hypozoan +hypozoic +hyppish +hypsibrachycephalic +hypsibrachycephalism +hypsibrachycephaly +hypsicephalic +hypsicephaly +hypsidolichocephalic +hypsidolichocephalism +hypsidolichocephaly +hypsiliform +hypsiloid +Hypsilophodon +hypsilophodont +hypsilophodontid +Hypsilophodontidae +hypsilophodontoid +Hypsiprymninae +Hypsiprymnodontinae +Hypsiprymnus +Hypsistarian +hypsistenocephalic +hypsistenocephalism +hypsistenocephaly +hypsobathymetric +hypsocephalous +hypsochrome +hypsochromic +hypsochromy +hypsodont +hypsodontism +hypsodonty +hypsographic +hypsographical +hypsography +hypsoisotherm +hypsometer +hypsometric +hypsometrical +hypsometrically +hypsometrist +hypsometry +hypsophobia +hypsophonous +hypsophyll +hypsophyllar +hypsophyllary +hypsophyllous +hypsophyllum +hypsothermometer +hypural +hyraces +hyraceum +Hyrachyus +hyracid +Hyracidae +hyraciform +Hyracina +Hyracodon +hyracodont +hyracodontid +Hyracodontidae +hyracodontoid +hyracoid +Hyracoidea +hyracoidean +hyracothere +hyracotherian +Hyracotheriinae +Hyracotherium +hyrax +Hyrcan +Hyrcanian +hyson +hyssop +Hyssopus +hystazarin +hysteralgia +hysteralgic +hysteranthous +hysterectomy +hysterelcosis +hysteresial +hysteresis +hysteretic +hysteretically +hysteria +hysteriac +Hysteriales +hysteric +hysterical +hysterically +hystericky +hysterics +hysteriform +hysterioid +Hysterocarpus +hysterocatalepsy +hysterocele +hysterocleisis +hysterocrystalline +hysterocystic +hysterodynia +hysterogen +hysterogenetic +hysterogenic +hysterogenous +hysterogeny +hysteroid +hysterolaparotomy +hysterolith +hysterolithiasis +hysterology +hysterolysis +hysteromania +hysterometer +hysterometry +hysteromorphous +hysteromyoma +hysteromyomectomy +hysteron +hysteroneurasthenia +hysteropathy +hysteropexia +hysteropexy +hysterophore +Hysterophyta +hysterophytal +hysterophyte +hysteroproterize +hysteroptosia +hysteroptosis +hysterorrhaphy +hysterorrhexis +hysteroscope +hysterosis +hysterotome +hysterotomy +hysterotraumatism +hystriciasis +hystricid +Hystricidae +Hystricinae +hystricine +hystricism +hystricismus +hystricoid +hystricomorph +Hystricomorpha +hystricomorphic +hystricomorphous +Hystrix +I +i +Iacchic +Iacchos +Iacchus +Iachimo +iamatology +iamb +Iambe +iambelegus +iambi +iambic +iambically +iambist +iambize +iambographer +iambus +Ianthina +ianthine +ianthinite +Ianus +iao +Iapetus +Iapyges +Iapygian +Iapygii +iatraliptic +iatraliptics +iatric +iatrical +iatrochemic +iatrochemical +iatrochemist +iatrochemistry +iatrological +iatrology +iatromathematical +iatromathematician +iatromathematics +iatromechanical +iatromechanist +iatrophysical +iatrophysicist +iatrophysics +iatrotechnics +iba +Ibad +Ibadite +Iban +Ibanag +Iberes +Iberi +Iberia +Iberian +Iberic +Iberis +Iberism +iberite +ibex +ibices +ibid +Ibididae +Ibidinae +ibidine +Ibidium +Ibilao +ibis +ibisbill +Ibo +ibolium +ibota +Ibsenian +Ibsenic +Ibsenish +Ibsenism +Ibsenite +Ibycter +Ibycus +Icacinaceae +icacinaceous +icaco +Icacorea +Icaria +Icarian +Icarianism +Icarus +ice +iceberg +iceblink +iceboat +icebone +icebound +icebox +icebreaker +icecap +icecraft +iced +icefall +icefish +icehouse +Iceland +iceland +Icelander +Icelandian +Icelandic +iceleaf +iceless +Icelidae +icelike +iceman +Iceni +icequake +iceroot +Icerya +icework +ich +Ichneumia +ichneumon +ichneumoned +Ichneumones +ichneumonid +Ichneumonidae +ichneumonidan +Ichneumonides +ichneumoniform +ichneumonized +ichneumonoid +Ichneumonoidea +ichneumonology +ichneumous +ichneutic +ichnite +ichnographic +ichnographical +ichnographically +ichnography +ichnolite +ichnolithology +ichnolitic +ichnological +ichnology +ichnomancy +icho +ichoglan +ichor +ichorous +ichorrhea +ichorrhemia +ichthulin +ichthulinic +ichthus +ichthyal +ichthyic +ichthyism +ichthyismus +ichthyization +ichthyized +ichthyobatrachian +Ichthyocephali +ichthyocephalous +ichthyocol +ichthyocolla +ichthyocoprolite +Ichthyodea +Ichthyodectidae +ichthyodian +ichthyodont +ichthyodorulite +ichthyofauna +ichthyoform +ichthyographer +ichthyographia +ichthyographic +ichthyography +ichthyoid +ichthyoidal +Ichthyoidea +Ichthyol +ichthyolatrous +ichthyolatry +ichthyolite +ichthyolitic +ichthyologic +ichthyological +ichthyologically +ichthyologist +ichthyology +ichthyomancy +ichthyomantic +Ichthyomorpha +ichthyomorphic +ichthyomorphous +ichthyonomy +ichthyopaleontology +ichthyophagan +ichthyophagi +ichthyophagian +ichthyophagist +ichthyophagize +ichthyophagous +ichthyophagy +ichthyophile +ichthyophobia +ichthyophthalmite +ichthyophthiriasis +ichthyopolism +ichthyopolist +ichthyopsid +Ichthyopsida +ichthyopsidan +Ichthyopterygia +ichthyopterygian +ichthyopterygium +Ichthyornis +Ichthyornithes +ichthyornithic +Ichthyornithidae +Ichthyornithiformes +ichthyornithoid +ichthyosaur +Ichthyosauria +ichthyosaurian +ichthyosaurid +Ichthyosauridae +ichthyosauroid +Ichthyosaurus +ichthyosis +ichthyosism +ichthyotic +Ichthyotomi +ichthyotomist +ichthyotomous +ichthyotomy +ichthyotoxin +ichthyotoxism +ichthytaxidermy +ichu +icica +icicle +icicled +icily +iciness +icing +icon +Iconian +iconic +iconical +iconism +iconoclasm +iconoclast +iconoclastic +iconoclastically +iconoclasticism +iconodule +iconodulic +iconodulist +iconoduly +iconograph +iconographer +iconographic +iconographical +iconographist +iconography +iconolater +iconolatrous +iconolatry +iconological +iconologist +iconology +iconomachal +iconomachist +iconomachy +iconomania +iconomatic +iconomatically +iconomaticism +iconomatography +iconometer +iconometric +iconometrical +iconometrically +iconometry +iconophile +iconophilism +iconophilist +iconophily +iconoplast +iconoscope +iconostas +iconostasion +iconostasis +iconotype +icosahedral +Icosandria +icosasemic +icosian +icositetrahedron +icosteid +Icosteidae +icosteine +Icosteus +icotype +icteric +icterical +Icteridae +icterine +icteritious +icterode +icterogenetic +icterogenic +icterogenous +icterohematuria +icteroid +icterus +ictic +Ictonyx +ictuate +ictus +icy +id +Ida +Idaean +Idaho +Idahoan +Idaic +idalia +Idalian +idant +iddat +Iddio +ide +idea +ideaed +ideaful +ideagenous +ideal +idealess +idealism +idealist +idealistic +idealistical +idealistically +ideality +idealization +idealize +idealizer +idealless +ideally +idealness +ideamonger +Idean +ideate +ideation +ideational +ideationally +ideative +ideist +idempotent +identic +identical +identicalism +identically +identicalness +identifiable +identifiableness +identification +identifier +identify +identism +identity +ideogenetic +ideogenical +ideogenous +ideogeny +ideoglyph +ideogram +ideogrammic +ideograph +ideographic +ideographical +ideographically +ideography +ideolatry +ideologic +ideological +ideologically +ideologist +ideologize +ideologue +ideology +ideomotion +ideomotor +ideophone +ideophonetics +ideophonous +ideoplastia +ideoplastic +ideoplastics +ideoplasty +ideopraxist +ides +idgah +idiasm +idic +idiobiology +idioblast +idioblastic +idiochromatic +idiochromatin +idiochromosome +idiocrasis +idiocrasy +idiocratic +idiocratical +idiocy +idiocyclophanous +idioelectric +idioelectrical +Idiogastra +idiogenesis +idiogenetic +idiogenous +idioglossia +idioglottic +idiograph +idiographic +idiographical +idiohypnotism +idiolalia +idiolatry +idiologism +idiolysin +idiom +idiomatic +idiomatical +idiomatically +idiomaticalness +idiomelon +idiometer +idiomography +idiomology +idiomorphic +idiomorphically +idiomorphism +idiomorphous +idiomuscular +idiopathetic +idiopathic +idiopathical +idiopathically +idiopathy +idiophanism +idiophanous +idiophonic +idioplasm +idioplasmatic +idioplasmic +idiopsychological +idiopsychology +idioreflex +idiorepulsive +idioretinal +idiorrhythmic +Idiosepiidae +Idiosepion +idiosome +idiospasm +idiospastic +idiostatic +idiosyncrasy +idiosyncratic +idiosyncratical +idiosyncratically +idiot +idiotcy +idiothalamous +idiothermous +idiothermy +idiotic +idiotical +idiotically +idioticalness +idioticon +idiotish +idiotism +idiotize +idiotropian +idiotry +idiotype +idiotypic +Idism +Idist +Idistic +idite +iditol +idle +idleful +idleheaded +idlehood +idleman +idlement +idleness +idler +idleset +idleship +idlety +idlish +idly +Ido +idocrase +Idoism +Idoist +Idoistic +idol +idola +idolaster +idolater +idolatress +idolatric +idolatrize +idolatrizer +idolatrous +idolatrously +idolatrousness +idolatry +idolify +idolism +idolist +idolistic +idolization +idolize +idolizer +idoloclast +idoloclastic +idolodulia +idolographical +idololatrical +idololatry +idolomancy +idolomania +idolothyte +idolothytic +idolous +idolum +Idomeneus +idoneal +idoneity +idoneous +idoneousness +idorgan +idosaccharic +idose +Idotea +Idoteidae +Idothea +Idotheidae +idrialin +idrialine +idrialite +Idrisid +Idrisite +idryl +Idumaean +idyl +idyler +idylism +idylist +idylize +idyllian +idyllic +idyllical +idyllically +idyllicism +ie +Ierne +if +ife +iffy +Ifugao +Igara +Igbira +Igdyr +igelstromite +igloo +Iglulirmiut +ignatia +Ignatian +Ignatianist +Ignatius +ignavia +igneoaqueous +igneous +ignescent +ignicolist +igniferous +igniferousness +igniform +ignifuge +ignify +ignigenous +ignipotent +ignipuncture +ignitability +ignite +igniter +ignitibility +ignitible +ignition +ignitive +ignitor +ignitron +ignivomous +ignivomousness +ignobility +ignoble +ignobleness +ignoblesse +ignobly +ignominious +ignominiously +ignominiousness +ignominy +ignorable +ignoramus +ignorance +ignorant +Ignorantine +ignorantism +ignorantist +ignorantly +ignorantness +ignoration +ignore +ignorement +ignorer +ignote +Igorot +iguana +Iguania +iguanian +iguanid +Iguanidae +iguaniform +Iguanodon +iguanodont +Iguanodontia +Iguanodontidae +iguanodontoid +Iguanodontoidea +iguanoid +Iguvine +ihi +Ihlat +ihleite +ihram +iiwi +ijma +Ijo +ijolite +Ijore +ijussite +ikat +Ike +ikey +ikeyness +Ikhwan +ikona +ikra +Ila +ileac +ileectomy +ileitis +ileocaecal +ileocaecum +ileocolic +ileocolitis +ileocolostomy +ileocolotomy +ileon +ileosigmoidostomy +ileostomy +ileotomy +ilesite +ileum +ileus +ilex +ilia +Iliac +iliac +iliacus +Iliad +Iliadic +Iliadist +Iliadize +iliahi +ilial +Ilian +iliau +Ilicaceae +ilicaceous +ilicic +ilicin +ilima +iliocaudal +iliocaudalis +iliococcygeal +iliococcygeus +iliococcygian +iliocostal +iliocostalis +iliodorsal +iliofemoral +iliohypogastric +ilioinguinal +ilioischiac +ilioischiatic +iliolumbar +iliopectineal +iliopelvic +ilioperoneal +iliopsoas +iliopsoatic +iliopubic +iliosacral +iliosciatic +ilioscrotal +iliospinal +iliotibial +iliotrochanteric +Ilissus +ilium +ilk +ilka +ilkane +ill +illaborate +illachrymable +illachrymableness +Illaenus +Illano +Illanun +illapsable +illapse +illapsive +illaqueate +illaqueation +illation +illative +illatively +illaudable +illaudably +illaudation +illaudatory +Illecebraceae +illecebrous +illeck +illegal +illegality +illegalize +illegally +illegalness +illegibility +illegible +illegibleness +illegibly +illegitimacy +illegitimate +illegitimately +illegitimateness +illegitimation +illegitimatize +illeism +illeist +illess +illfare +illguide +illiberal +illiberalism +illiberality +illiberalize +illiberally +illiberalness +illicit +illicitly +illicitness +Illicium +illimitability +illimitable +illimitableness +illimitably +illimitate +illimitation +illimited +illimitedly +illimitedness +illinition +illinium +Illinoian +Illinois +Illinoisan +Illinoisian +Illipe +illipene +illiquation +illiquid +illiquidity +illiquidly +illish +illision +illiteracy +illiteral +illiterate +illiterately +illiterateness +illiterature +illium +illness +illocal +illocality +illocally +illogic +illogical +illogicality +illogically +illogicalness +illogician +illogicity +Illoricata +illoricate +illoricated +illoyal +illoyalty +illth +illucidate +illucidation +illucidative +illude +illudedly +illuder +illume +illumer +illuminability +illuminable +illuminance +illuminant +illuminate +illuminated +illuminati +illuminating +illuminatingly +illumination +illuminational +illuminatism +illuminatist +illuminative +illuminato +illuminator +illuminatory +illuminatus +illumine +illuminee +illuminer +Illuminism +illuminist +Illuministic +Illuminize +illuminometer +illuminous +illupi +illure +illurement +illusible +illusion +illusionable +illusional +illusionary +illusioned +illusionism +illusionist +illusionistic +illusive +illusively +illusiveness +illusor +illusorily +illusoriness +illusory +illustrable +illustratable +illustrate +illustration +illustrational +illustrative +illustratively +illustrator +illustratory +illustratress +illustre +illustricity +illustrious +illustriously +illustriousness +illutate +illutation +illuvial +illuviate +illuviation +illy +Illyrian +Illyric +ilmenite +ilmenitite +ilmenorutile +Ilocano +Ilokano +Iloko +Ilongot +ilot +Ilpirra +ilvaite +Ilysanthes +Ilysia +Ilysiidae +ilysioid +image +imageable +imageless +imager +imagerial +imagerially +imagery +imaginability +imaginable +imaginableness +imaginably +imaginal +imaginant +imaginarily +imaginariness +imaginary +imaginate +imagination +imaginational +imaginationalism +imaginative +imaginatively +imaginativeness +imaginator +imagine +imaginer +imagines +imaginist +imaginous +imagism +imagist +imagistic +imago +imam +imamah +imamate +imambarah +imamic +imamship +Imantophyllum +imaret +imbalance +imban +imband +imbannered +imbarge +imbark +imbarn +imbased +imbastardize +imbat +imbauba +imbe +imbecile +imbecilely +imbecilic +imbecilitate +imbecility +imbed +imbellious +imber +imbibe +imbiber +imbibition +imbibitional +imbibitory +imbirussu +imbitter +imbitterment +imbolish +imbondo +imbonity +imbordure +imborsation +imbosom +imbower +imbreathe +imbreviate +imbrex +imbricate +imbricated +imbricately +imbrication +imbricative +imbroglio +imbrue +imbruement +imbrute +imbrutement +imbue +imbuement +imburse +imbursement +Imer +Imerina +Imeritian +imi +imidazole +imidazolyl +imide +imidic +imidogen +iminazole +imine +imino +iminohydrin +imitability +imitable +imitableness +imitancy +imitant +imitate +imitatee +imitation +imitational +imitationist +imitative +imitatively +imitativeness +imitator +imitatorship +imitatress +imitatrix +immaculacy +immaculance +immaculate +immaculately +immaculateness +immalleable +immanacle +immanation +immane +immanely +immanence +immanency +immaneness +immanent +immanental +immanentism +immanentist +immanently +Immanes +immanifest +immanifestness +immanity +immantle +Immanuel +immarble +immarcescible +immarcescibly +immarcibleness +immarginate +immask +immatchable +immaterial +immaterialism +immaterialist +immateriality +immaterialize +immaterially +immaterialness +immaterials +immateriate +immatriculate +immatriculation +immature +immatured +immaturely +immatureness +immaturity +immeability +immeasurability +immeasurable +immeasurableness +immeasurably +immeasured +immechanical +immechanically +immediacy +immedial +immediate +immediately +immediateness +immediatism +immediatist +immedicable +immedicableness +immedicably +immelodious +immember +immemorable +immemorial +immemorially +immense +immensely +immenseness +immensity +immensive +immensurability +immensurable +immensurableness +immensurate +immerd +immerge +immergence +immergent +immerit +immerited +immeritorious +immeritoriously +immeritous +immerse +immersement +immersible +immersion +immersionism +immersionist +immersive +immethodic +immethodical +immethodically +immethodicalness +immethodize +immetrical +immetrically +immetricalness +immew +immi +immigrant +immigrate +immigration +immigrator +immigratory +imminence +imminency +imminent +imminently +imminentness +immingle +imminution +immiscibility +immiscible +immiscibly +immission +immit +immitigability +immitigable +immitigably +immix +immixable +immixture +immobile +immobility +immobilization +immobilize +immoderacy +immoderate +immoderately +immoderateness +immoderation +immodest +immodestly +immodesty +immodulated +immolate +immolation +immolator +immoment +immomentous +immonastered +immoral +immoralism +immoralist +immorality +immoralize +immorally +immorigerous +immorigerousness +immortability +immortable +immortal +immortalism +immortalist +immortality +immortalizable +immortalization +immortalize +immortalizer +immortally +immortalness +immortalship +immortelle +immortification +immortified +immotile +immotioned +immotive +immound +immovability +immovable +immovableness +immovably +immund +immundity +immune +immunist +immunity +immunization +immunize +immunochemistry +immunogen +immunogenetic +immunogenetics +immunogenic +immunogenically +immunogenicity +immunologic +immunological +immunologically +immunologist +immunology +immunoreaction +immunotoxin +immuration +immure +immurement +immusical +immusically +immutability +immutable +immutableness +immutably +immutation +immute +immutilate +immutual +Imogen +Imolinda +imonium +imp +impacability +impacable +impack +impackment +impact +impacted +impaction +impactionize +impactment +impactual +impages +impaint +impair +impairable +impairer +impairment +impala +impalace +impalatable +impale +impalement +impaler +impall +impalm +impalpability +impalpable +impalpably +impalsy +impaludism +impanate +impanation +impanator +impane +impanel +impanelment +impapase +impapyrate +impar +imparadise +imparalleled +imparasitic +impardonable +impardonably +imparidigitate +imparipinnate +imparisyllabic +imparity +impark +imparkation +imparl +imparlance +imparsonee +impart +impartable +impartance +impartation +imparter +impartial +impartialism +impartialist +impartiality +impartially +impartialness +impartibilibly +impartibility +impartible +impartibly +imparticipable +impartite +impartive +impartivity +impartment +impassability +impassable +impassableness +impassably +impasse +impassibilibly +impassibility +impassible +impassibleness +impassion +impassionable +impassionate +impassionately +impassioned +impassionedly +impassionedness +impassionment +impassive +impassively +impassiveness +impassivity +impastation +impaste +impasto +impasture +impaternate +impatible +impatience +impatiency +Impatiens +impatient +Impatientaceae +impatientaceous +impatiently +impatientness +impatronize +impave +impavid +impavidity +impavidly +impawn +impayable +impeach +impeachability +impeachable +impeacher +impeachment +impearl +impeccability +impeccable +impeccably +impeccance +impeccancy +impeccant +impectinate +impecuniary +impecuniosity +impecunious +impecuniously +impecuniousness +impedance +impede +impeder +impedibility +impedible +impedient +impediment +impedimenta +impedimental +impedimentary +impeding +impedingly +impedite +impedition +impeditive +impedometer +impeevish +impel +impellent +impeller +impen +impend +impendence +impendency +impendent +impending +impenetrability +impenetrable +impenetrableness +impenetrably +impenetrate +impenetration +impenetrative +impenitence +impenitent +impenitently +impenitentness +impenitible +impenitibleness +impennate +Impennes +impent +imperance +imperant +Imperata +imperate +imperation +imperatival +imperative +imperatively +imperativeness +imperator +imperatorial +imperatorially +imperatorian +imperatorious +imperatorship +imperatory +imperatrix +imperceivable +imperceivableness +imperceivably +imperceived +imperceiverant +imperceptibility +imperceptible +imperceptibleness +imperceptibly +imperception +imperceptive +imperceptiveness +imperceptivity +impercipience +impercipient +imperence +imperent +imperfect +imperfected +imperfectibility +imperfectible +imperfection +imperfectious +imperfective +imperfectly +imperfectness +imperforable +Imperforata +imperforate +imperforated +imperforation +imperformable +imperia +imperial +imperialin +imperialine +imperialism +imperialist +imperialistic +imperialistically +imperiality +imperialization +imperialize +imperially +imperialness +imperialty +imperil +imperilment +imperious +imperiously +imperiousness +imperish +imperishability +imperishable +imperishableness +imperishably +imperite +imperium +impermanence +impermanency +impermanent +impermanently +impermeability +impermeabilization +impermeabilize +impermeable +impermeableness +impermeably +impermeated +impermeator +impermissible +impermutable +imperscriptible +imperscrutable +impersonable +impersonal +impersonality +impersonalization +impersonalize +impersonally +impersonate +impersonation +impersonative +impersonator +impersonatress +impersonatrix +impersonification +impersonify +impersonization +impersonize +imperspicuity +imperspicuous +imperspirability +imperspirable +impersuadable +impersuadableness +impersuasibility +impersuasible +impersuasibleness +impersuasibly +impertinacy +impertinence +impertinency +impertinent +impertinently +impertinentness +impertransible +imperturbability +imperturbable +imperturbableness +imperturbably +imperturbation +imperturbed +imperverse +impervertible +impervestigable +imperviability +imperviable +imperviableness +impervial +impervious +imperviously +imperviousness +impest +impestation +impester +impeticos +impetiginous +impetigo +impetition +impetrate +impetration +impetrative +impetrator +impetratory +impetre +impetulant +impetulantly +impetuosity +impetuous +impetuously +impetuousness +impetus +Impeyan +imphee +impi +impicture +impierceable +impiety +impignorate +impignoration +impinge +impingement +impingence +impingent +impinger +impinguate +impious +impiously +impiousness +impish +impishly +impishness +impiteous +impitiably +implacability +implacable +implacableness +implacably +implacement +implacental +Implacentalia +implacentate +implant +implantation +implanter +implastic +implasticity +implate +implausibility +implausible +implausibleness +implausibly +impleach +implead +impleadable +impleader +impledge +implement +implemental +implementation +implementiferous +implete +impletion +impletive +implex +impliable +implial +implicant +implicate +implicately +implicateness +implication +implicational +implicative +implicatively +implicatory +implicit +implicitly +implicitness +impliedly +impliedness +impling +implode +implodent +implorable +imploration +implorator +imploratory +implore +implorer +imploring +imploringly +imploringness +implosion +implosive +implosively +implume +implumed +implunge +impluvium +imply +impocket +impofo +impoison +impoisoner +impolarizable +impolicy +impolished +impolite +impolitely +impoliteness +impolitic +impolitical +impolitically +impoliticalness +impoliticly +impoliticness +impollute +imponderabilia +imponderability +imponderable +imponderableness +imponderably +imponderous +impone +imponent +impoor +impopular +impopularly +imporosity +imporous +import +importability +importable +importableness +importably +importance +importancy +important +importantly +importation +importer +importless +importment +importraiture +importray +importunacy +importunance +importunate +importunately +importunateness +importunator +importune +importunely +importunement +importuner +importunity +imposable +imposableness +imposal +impose +imposement +imposer +imposing +imposingly +imposingness +imposition +impositional +impositive +impossibilification +impossibilism +impossibilist +impossibilitate +impossibility +impossible +impossibleness +impossibly +impost +imposter +imposterous +impostor +impostorism +impostorship +impostress +impostrix +impostrous +impostumate +impostumation +impostume +imposture +imposturism +imposturous +imposure +impot +impotable +impotence +impotency +impotent +impotently +impotentness +impound +impoundable +impoundage +impounder +impoundment +impoverish +impoverisher +impoverishment +impracticability +impracticable +impracticableness +impracticably +impractical +impracticality +impracticalness +imprecant +imprecate +imprecation +imprecator +imprecatorily +imprecatory +imprecise +imprecisely +imprecision +impredicability +impredicable +impreg +impregn +impregnability +impregnable +impregnableness +impregnably +impregnant +impregnate +impregnation +impregnative +impregnator +impregnatory +imprejudice +impremeditate +impreparation +impresa +impresario +imprescience +imprescribable +imprescriptibility +imprescriptible +imprescriptibly +imprese +impress +impressable +impressedly +impresser +impressibility +impressible +impressibleness +impressibly +impression +impressionability +impressionable +impressionableness +impressionably +impressional +impressionalist +impressionality +impressionally +impressionary +impressionism +impressionist +impressionistic +impressionistically +impressionless +impressive +impressively +impressiveness +impressment +impressor +impressure +imprest +imprestable +impreventability +impreventable +imprevisibility +imprevisible +imprevision +imprimatur +imprime +imprimitive +imprimitivity +imprint +imprinter +imprison +imprisonable +imprisoner +imprisonment +improbability +improbabilize +improbable +improbableness +improbably +improbation +improbative +improbatory +improbity +improcreant +improcurability +improcurable +improducible +improficience +improficiency +improgressive +improgressively +improgressiveness +improlificical +impromptitude +impromptu +impromptuary +impromptuist +improof +improper +improperation +improperly +improperness +impropriate +impropriation +impropriator +impropriatrix +impropriety +improvability +improvable +improvableness +improvably +improve +improvement +improver +improvership +improvidence +improvident +improvidentially +improvidently +improving +improvingly +improvisate +improvisation +improvisational +improvisator +improvisatorial +improvisatorially +improvisatorize +improvisatory +improvise +improvisedly +improviser +improvision +improviso +improvisor +imprudence +imprudency +imprudent +imprudential +imprudently +imprudentness +impship +impuberal +impuberate +impuberty +impubic +impudence +impudency +impudent +impudently +impudentness +impudicity +impugn +impugnability +impugnable +impugnation +impugner +impugnment +impuissance +impuissant +impulse +impulsion +impulsive +impulsively +impulsiveness +impulsivity +impulsory +impunctate +impunctual +impunctuality +impunely +impunible +impunibly +impunity +impure +impurely +impureness +impuritan +impuritanism +impurity +imputability +imputable +imputableness +imputably +imputation +imputative +imputatively +imputativeness +impute +imputedly +imputer +imputrescence +imputrescibility +imputrescible +imputrid +impy +imshi +imsonic +imu +in +inability +inabordable +inabstinence +inaccentuated +inaccentuation +inacceptable +inaccessibility +inaccessible +inaccessibleness +inaccessibly +inaccordance +inaccordancy +inaccordant +inaccordantly +inaccuracy +inaccurate +inaccurately +inaccurateness +inachid +Inachidae +inachoid +Inachus +inacquaintance +inacquiescent +inactinic +inaction +inactionist +inactivate +inactivation +inactive +inactively +inactiveness +inactivity +inactuate +inactuation +inadaptability +inadaptable +inadaptation +inadaptive +inadept +inadequacy +inadequate +inadequately +inadequateness +inadequation +inadequative +inadequatively +inadherent +inadhesion +inadhesive +inadjustability +inadjustable +inadmissibility +inadmissible +inadmissibly +inadventurous +inadvertence +inadvertency +inadvertent +inadvertently +inadvisability +inadvisable +inadvisableness +inadvisedly +inaesthetic +inaffability +inaffable +inaffectation +inagglutinability +inagglutinable +inaggressive +inagile +inaidable +inaja +inalacrity +inalienability +inalienable +inalienableness +inalienably +inalimental +inalterability +inalterable +inalterableness +inalterably +inamissibility +inamissible +inamissibleness +inamorata +inamorate +inamoration +inamorato +inamovability +inamovable +inane +inanely +inanga +inangulate +inanimadvertence +inanimate +inanimated +inanimately +inanimateness +inanimation +inanition +inanity +inantherate +inapathy +inapostate +inapparent +inappealable +inappeasable +inappellability +inappellable +inappendiculate +inapperceptible +inappertinent +inappetence +inappetency +inappetent +inappetible +inapplicability +inapplicable +inapplicableness +inapplicably +inapplication +inapposite +inappositely +inappositeness +inappreciable +inappreciably +inappreciation +inappreciative +inappreciatively +inappreciativeness +inapprehensible +inapprehension +inapprehensive +inapprehensiveness +inapproachability +inapproachable +inapproachably +inappropriable +inappropriableness +inappropriate +inappropriately +inappropriateness +inapt +inaptitude +inaptly +inaptness +inaqueous +inarable +inarch +inarculum +inarguable +inarguably +inarm +inarticulacy +Inarticulata +inarticulate +inarticulated +inarticulately +inarticulateness +inarticulation +inartificial +inartificiality +inartificially +inartificialness +inartistic +inartistical +inartisticality +inartistically +inasmuch +inassimilable +inassimilation +inassuageable +inattackable +inattention +inattentive +inattentively +inattentiveness +inaudibility +inaudible +inaudibleness +inaudibly +inaugur +inaugural +inaugurate +inauguration +inaugurative +inaugurator +inauguratory +inaugurer +inaurate +inauration +inauspicious +inauspiciously +inauspiciousness +inauthentic +inauthenticity +inauthoritative +inauthoritativeness +inaxon +inbe +inbeaming +inbearing +inbeing +inbending +inbent +inbirth +inblow +inblowing +inblown +inboard +inbond +inborn +inbound +inbread +inbreak +inbreaking +inbreathe +inbreather +inbred +inbreed +inbring +inbringer +inbuilt +inburning +inburnt +inburst +inby +Inca +Incaic +incalculability +incalculable +incalculableness +incalculably +incalescence +incalescency +incalescent +incaliculate +incalver +incalving +incameration +Incan +incandent +incandesce +incandescence +incandescency +incandescent +incandescently +incanous +incantation +incantational +incantator +incantatory +incanton +incapability +incapable +incapableness +incapably +incapacious +incapaciousness +incapacitate +incapacitation +incapacity +incapsulate +incapsulation +incaptivate +incarcerate +incarceration +incarcerator +incardinate +incardination +Incarial +incarmined +incarn +incarnadine +incarnant +incarnate +incarnation +incarnational +incarnationist +incarnative +Incarvillea +incase +incasement +incast +incatenate +incatenation +incaution +incautious +incautiously +incautiousness +incavate +incavated +incavation +incavern +incedingly +incelebrity +incendiarism +incendiary +incendivity +incensation +incense +incenseless +incensement +incensory +incensurable +incensurably +incenter +incentive +incentively +incentor +incept +inception +inceptive +inceptively +inceptor +inceration +incertitude +incessable +incessably +incessancy +incessant +incessantly +incessantness +incest +incestuous +incestuously +incestuousness +inch +inched +inchmeal +inchoacy +inchoant +inchoate +inchoately +inchoateness +inchoation +inchoative +inchpin +inchworm +incide +incidence +incident +incidental +incidentalist +incidentally +incidentalness +incidentless +incidently +incinerable +incinerate +incineration +incinerator +incipience +incipient +incipiently +incircumscription +incircumspect +incircumspection +incircumspectly +incircumspectness +incisal +incise +incisely +incisiform +incision +incisive +incisively +incisiveness +incisor +incisorial +incisory +incisure +incitability +incitable +incitant +incitation +incite +incitement +inciter +incitingly +incitive +incitress +incivic +incivility +incivilization +incivism +inclemency +inclement +inclemently +inclementness +inclinable +inclinableness +inclination +inclinational +inclinator +inclinatorily +inclinatorium +inclinatory +incline +incliner +inclinograph +inclinometer +inclip +inclose +inclosure +includable +include +included +includedness +includer +inclusa +incluse +inclusion +inclusionist +inclusive +inclusively +inclusiveness +inclusory +incoagulable +incoalescence +incoercible +incog +incogent +incogitability +incogitable +incogitancy +incogitant +incogitantly +incogitative +incognita +incognitive +incognito +incognizability +incognizable +incognizance +incognizant +incognoscent +incognoscibility +incognoscible +incoherence +incoherency +incoherent +incoherentific +incoherently +incoherentness +incohering +incohesion +incohesive +incoincidence +incoincident +incombustibility +incombustible +incombustibleness +incombustibly +incombustion +income +incomeless +incomer +incoming +incommensurability +incommensurable +incommensurableness +incommensurably +incommensurate +incommensurately +incommensurateness +incommiscibility +incommiscible +incommodate +incommodation +incommode +incommodement +incommodious +incommodiously +incommodiousness +incommodity +incommunicability +incommunicable +incommunicableness +incommunicably +incommunicado +incommunicative +incommunicatively +incommunicativeness +incommutability +incommutable +incommutableness +incommutably +incompact +incompactly +incompactness +incomparability +incomparable +incomparableness +incomparably +incompassionate +incompassionately +incompassionateness +incompatibility +incompatible +incompatibleness +incompatibly +incompendious +incompensated +incompensation +incompetence +incompetency +incompetent +incompetently +incompetentness +incompletability +incompletable +incompletableness +incomplete +incompleted +incompletely +incompleteness +incompletion +incomplex +incompliance +incompliancy +incompliant +incompliantly +incomplicate +incomplying +incomposed +incomposedly +incomposedness +incomposite +incompossibility +incompossible +incomprehended +incomprehending +incomprehendingly +incomprehensibility +incomprehensible +incomprehensibleness +incomprehensibly +incomprehension +incomprehensive +incomprehensively +incomprehensiveness +incompressibility +incompressible +incompressibleness +incompressibly +incomputable +inconcealable +inconceivability +inconceivable +inconceivableness +inconceivably +inconcinnate +inconcinnately +inconcinnity +inconcinnous +inconcludent +inconcluding +inconclusion +inconclusive +inconclusively +inconclusiveness +inconcrete +inconcurrent +inconcurring +incondensability +incondensable +incondensibility +incondensible +incondite +inconditionate +inconditioned +inconducive +inconfirm +inconformable +inconformably +inconformity +inconfused +inconfusedly +inconfusion +inconfutable +inconfutably +incongealable +incongealableness +incongenerous +incongenial +incongeniality +inconglomerate +incongruence +incongruent +incongruently +incongruity +incongruous +incongruously +incongruousness +inconjoinable +inconnected +inconnectedness +inconnu +inconscience +inconscient +inconsciently +inconscious +inconsciously +inconsecutive +inconsecutively +inconsecutiveness +inconsequence +inconsequent +inconsequential +inconsequentiality +inconsequentially +inconsequently +inconsequentness +inconsiderable +inconsiderableness +inconsiderably +inconsiderate +inconsiderately +inconsiderateness +inconsideration +inconsidered +inconsistence +inconsistency +inconsistent +inconsistently +inconsistentness +inconsolability +inconsolable +inconsolableness +inconsolably +inconsolate +inconsolately +inconsonance +inconsonant +inconsonantly +inconspicuous +inconspicuously +inconspicuousness +inconstancy +inconstant +inconstantly +inconstantness +inconstruable +inconsultable +inconsumable +inconsumably +inconsumed +incontaminable +incontaminate +incontaminateness +incontemptible +incontestability +incontestable +incontestableness +incontestably +incontinence +incontinency +incontinent +incontinently +incontinuity +incontinuous +incontracted +incontractile +incontraction +incontrollable +incontrollably +incontrolled +incontrovertibility +incontrovertible +incontrovertibleness +incontrovertibly +inconvenience +inconveniency +inconvenient +inconveniently +inconvenientness +inconversable +inconversant +inconversibility +inconvertibility +inconvertible +inconvertibleness +inconvertibly +inconvinced +inconvincedly +inconvincibility +inconvincible +inconvincibly +incopresentability +incopresentable +incoronate +incoronated +incoronation +incorporable +incorporate +incorporated +incorporatedness +incorporation +incorporative +incorporator +incorporeal +incorporealism +incorporealist +incorporeality +incorporealize +incorporeally +incorporeity +incorporeous +incorpse +incorrect +incorrection +incorrectly +incorrectness +incorrespondence +incorrespondency +incorrespondent +incorresponding +incorrigibility +incorrigible +incorrigibleness +incorrigibly +incorrodable +incorrodible +incorrosive +incorrupt +incorrupted +incorruptibility +Incorruptible +incorruptible +incorruptibleness +incorruptibly +incorruption +incorruptly +incorruptness +incourteous +incourteously +incrash +incrassate +incrassated +incrassation +incrassative +increasable +increasableness +increase +increasedly +increaseful +increasement +increaser +increasing +increasingly +increate +increately +increative +incredibility +incredible +incredibleness +incredibly +increditable +incredited +incredulity +incredulous +incredulously +incredulousness +increep +incremate +incremation +increment +incremental +incrementation +increpate +increpation +increscence +increscent +increst +incretion +incretionary +incretory +incriminate +incrimination +incriminator +incriminatory +incross +incrossbred +incrossing +incrotchet +incruent +incruental +incruentous +incrust +incrustant +Incrustata +incrustate +incrustation +incrustator +incrustive +incrustment +incrystal +incrystallizable +incubate +incubation +incubational +incubative +incubator +incubatorium +incubatory +incubi +incubous +incubus +incudal +incudate +incudectomy +incudes +incudomalleal +incudostapedial +inculcate +inculcation +inculcative +inculcator +inculcatory +inculpability +inculpable +inculpableness +inculpably +inculpate +inculpation +inculpative +inculpatory +incult +incultivation +inculture +incumbence +incumbency +incumbent +incumbentess +incumbently +incumber +incumberment +incumbrance +incumbrancer +incunable +incunabula +incunabular +incunabulist +incunabulum +incuneation +incur +incurability +incurable +incurableness +incurably +incuriosity +incurious +incuriously +incuriousness +incurrable +incurrence +incurrent +incurse +incursion +incursionist +incursive +incurvate +incurvation +incurvature +incurve +incus +incuse +incut +incutting +Ind +indaba +indaconitine +indagate +indagation +indagative +indagator +indagatory +indamine +indan +indane +Indanthrene +indanthrene +indart +indazin +indazine +indazol +indazole +inde +indebt +indebted +indebtedness +indebtment +indecence +indecency +indecent +indecently +indecentness +Indecidua +indeciduate +indeciduous +indecipherability +indecipherable +indecipherableness +indecipherably +indecision +indecisive +indecisively +indecisiveness +indeclinable +indeclinableness +indeclinably +indecomponible +indecomposable +indecomposableness +indecorous +indecorously +indecorousness +indecorum +indeed +indeedy +indefaceable +indefatigability +indefatigable +indefatigableness +indefatigably +indefeasibility +indefeasible +indefeasibleness +indefeasibly +indefeatable +indefectibility +indefectible +indefectibly +indefective +indefensibility +indefensible +indefensibleness +indefensibly +indefensive +indeficiency +indeficient +indeficiently +indefinable +indefinableness +indefinably +indefinite +indefinitely +indefiniteness +indefinitive +indefinitively +indefinitiveness +indefinitude +indefinity +indeflectible +indefluent +indeformable +indehiscence +indehiscent +indelectable +indelegability +indelegable +indeliberate +indeliberately +indeliberateness +indeliberation +indelibility +indelible +indelibleness +indelibly +indelicacy +indelicate +indelicately +indelicateness +indemnification +indemnificator +indemnificatory +indemnifier +indemnify +indemnitee +indemnitor +indemnity +indemnization +indemoniate +indemonstrability +indemonstrable +indemonstrableness +indemonstrably +indene +indent +indentation +indented +indentedly +indentee +indenter +indention +indentment +indentor +indenture +indentured +indentureship +indentwise +independable +independence +independency +independent +independentism +independently +Independista +indeposable +indeprehensible +indeprivability +indeprivable +inderivative +indescribability +indescribable +indescribableness +indescribably +indescript +indescriptive +indesert +indesignate +indesirable +indestructibility +indestructible +indestructibleness +indestructibly +indetectable +indeterminable +indeterminableness +indeterminably +indeterminacy +indeterminate +indeterminately +indeterminateness +indetermination +indeterminative +indetermined +indeterminism +indeterminist +indeterministic +indevirginate +indevoted +indevotion +indevotional +indevout +indevoutly +indevoutness +index +indexed +indexer +indexical +indexically +indexing +indexless +indexlessness +indexterity +India +indiadem +Indiaman +Indian +Indiana +indianaite +Indianan +Indianeer +Indianesque +Indianhood +Indianian +Indianism +Indianist +indianite +indianization +indianize +Indic +indic +indicable +indican +indicant +indicanuria +indicate +indication +indicative +indicatively +indicator +Indicatoridae +Indicatorinae +indicatory +indicatrix +indices +indicia +indicial +indicible +indicium +indicolite +indict +indictable +indictably +indictee +indicter +indiction +indictional +indictive +indictment +indictor +Indies +indiferous +indifference +indifferency +indifferent +indifferential +indifferentism +indifferentist +indifferentistic +indifferently +indigena +indigenal +indigenate +indigence +indigency +indigene +indigeneity +Indigenismo +indigenist +indigenity +indigenous +indigenously +indigenousness +indigent +indigently +indigested +indigestedness +indigestibility +indigestible +indigestibleness +indigestibly +indigestion +indigestive +indigitamenta +indigitate +indigitation +indign +indignance +indignancy +indignant +indignantly +indignation +indignatory +indignify +indignity +indignly +indigo +indigoberry +Indigofera +indigoferous +indigoid +indigotic +indigotin +indigotindisulphonic +indiguria +indimensible +indimensional +indiminishable +indimple +indirect +indirected +indirection +indirectly +indirectness +indirubin +indiscernibility +indiscernible +indiscernibleness +indiscernibly +indiscerptibility +indiscerptible +indiscerptibleness +indiscerptibly +indisciplinable +indiscipline +indisciplined +indiscoverable +indiscoverably +indiscovered +indiscreet +indiscreetly +indiscreetness +indiscrete +indiscretely +indiscretion +indiscretionary +indiscriminate +indiscriminated +indiscriminately +indiscriminateness +indiscriminating +indiscriminatingly +indiscrimination +indiscriminative +indiscriminatively +indiscriminatory +indiscussable +indiscussible +indispellable +indispensability +indispensable +indispensableness +indispensably +indispose +indisposed +indisposedness +indisposition +indisputability +indisputable +indisputableness +indisputably +indissipable +indissociable +indissolubility +indissoluble +indissolubleness +indissolubly +indissolute +indissolvability +indissolvable +indissolvableness +indissolvably +indissuadable +indissuadably +indistinct +indistinction +indistinctive +indistinctively +indistinctiveness +indistinctly +indistinctness +indistinguishability +indistinguishable +indistinguishableness +indistinguishably +indistinguished +indistortable +indistributable +indisturbable +indisturbance +indisturbed +indite +inditement +inditer +indium +indivertible +indivertibly +individable +individua +individual +individualism +individualist +individualistic +individualistically +individuality +individualization +individualize +individualizer +individualizingly +individually +individuate +individuation +individuative +individuator +individuity +individuum +indivinable +indivisibility +indivisible +indivisibleness +indivisibly +indivision +indocibility +indocible +indocibleness +indocile +indocility +indoctrinate +indoctrination +indoctrinator +indoctrine +indoctrinization +indoctrinize +Indogaea +Indogaean +indogen +indogenide +indole +indolence +indolent +indolently +indoles +indoline +Indologian +Indologist +Indologue +Indology +indoloid +indolyl +indomitability +indomitable +indomitableness +indomitably +Indone +Indonesian +indoor +indoors +indophenin +indophenol +Indophile +Indophilism +Indophilist +indorsation +indorse +indoxyl +indoxylic +indoxylsulphuric +indraft +indraught +indrawal +indrawing +indrawn +indri +Indris +indubious +indubiously +indubitable +indubitableness +indubitably +indubitatively +induce +induced +inducedly +inducement +inducer +induciae +inducible +inducive +induct +inductance +inductee +inducteous +inductile +inductility +induction +inductional +inductionally +inductionless +inductive +inductively +inductiveness +inductivity +inductometer +inductophone +inductor +inductorium +inductory +inductoscope +indue +induement +indulge +indulgeable +indulgement +indulgence +indulgenced +indulgency +indulgent +indulgential +indulgentially +indulgently +indulgentness +indulger +indulging +indulgingly +induline +indult +indulto +indument +indumentum +induna +induplicate +induplication +induplicative +indurable +indurate +induration +indurative +indurite +Indus +indusial +indusiate +indusiated +indusiform +indusioid +indusium +industrial +industrialism +industrialist +industrialization +industrialize +industrially +industrialness +industrious +industriously +industriousness +industrochemical +industry +induviae +induvial +induviate +indwell +indweller +indy +indyl +indylic +inearth +inebriacy +inebriant +inebriate +inebriation +inebriative +inebriety +inebrious +ineconomic +ineconomy +inedibility +inedible +inedited +Ineducabilia +ineducabilian +ineducability +ineducable +ineducation +ineffability +ineffable +ineffableness +ineffably +ineffaceability +ineffaceable +ineffaceably +ineffectible +ineffectibly +ineffective +ineffectively +ineffectiveness +ineffectual +ineffectuality +ineffectually +ineffectualness +ineffervescence +ineffervescent +ineffervescibility +ineffervescible +inefficacious +inefficaciously +inefficaciousness +inefficacity +inefficacy +inefficience +inefficiency +inefficient +inefficiently +ineffulgent +inelaborate +inelaborated +inelaborately +inelastic +inelasticate +inelasticity +inelegance +inelegancy +inelegant +inelegantly +ineligibility +ineligible +ineligibleness +ineligibly +ineliminable +ineloquence +ineloquent +ineloquently +ineluctability +ineluctable +ineluctably +ineludible +ineludibly +inembryonate +inemendable +inemotivity +inemulous +inenarrable +inenergetic +inenubilable +inenucleable +inept +ineptitude +ineptly +ineptness +inequable +inequal +inequalitarian +inequality +inequally +inequalness +inequation +inequiaxial +inequicostate +inequidistant +inequigranular +inequilateral +inequilibrium +inequilobate +inequilobed +inequipotential +inequipotentiality +inequitable +inequitableness +inequitably +inequity +inequivalent +inequivalve +inequivalvular +ineradicable +ineradicableness +ineradicably +inerasable +inerasableness +inerasably +inerasible +Ineri +inerm +Inermes +Inermi +Inermia +inermous +inerrability +inerrable +inerrableness +inerrably +inerrancy +inerrant +inerrantly +inerratic +inerring +inerringly +inerroneous +inert +inertance +inertia +inertial +inertion +inertly +inertness +inerubescent +inerudite +ineruditely +inerudition +inescapable +inescapableness +inescapably +inesculent +inescutcheon +inesite +inessential +inessentiality +inestimability +inestimable +inestimableness +inestimably +inestivation +inethical +ineunt +ineuphonious +inevadible +inevadibly +inevaporable +inevasible +inevidence +inevident +inevitability +inevitable +inevitableness +inevitably +inexact +inexacting +inexactitude +inexactly +inexactness +inexcellence +inexcitability +inexcitable +inexclusive +inexclusively +inexcommunicable +inexcusability +inexcusable +inexcusableness +inexcusably +inexecutable +inexecution +inexertion +inexhausted +inexhaustedly +inexhaustibility +inexhaustible +inexhaustibleness +inexhaustibly +inexhaustive +inexhaustively +inexigible +inexist +inexistence +inexistency +inexistent +inexorability +inexorable +inexorableness +inexorably +inexpansible +inexpansive +inexpectancy +inexpectant +inexpectation +inexpected +inexpectedly +inexpectedness +inexpedience +inexpediency +inexpedient +inexpediently +inexpensive +inexpensively +inexpensiveness +inexperience +inexperienced +inexpert +inexpertly +inexpertness +inexpiable +inexpiableness +inexpiably +inexpiate +inexplainable +inexplicability +inexplicable +inexplicableness +inexplicables +inexplicably +inexplicit +inexplicitly +inexplicitness +inexplorable +inexplosive +inexportable +inexposable +inexposure +inexpress +inexpressibility +inexpressible +inexpressibleness +inexpressibles +inexpressibly +inexpressive +inexpressively +inexpressiveness +inexpugnability +inexpugnable +inexpugnableness +inexpugnably +inexpungeable +inexpungible +inextant +inextended +inextensibility +inextensible +inextensile +inextension +inextensional +inextensive +inexterminable +inextinct +inextinguishable +inextinguishably +inextirpable +inextirpableness +inextricability +inextricable +inextricableness +inextricably +Inez +inface +infall +infallibilism +infallibilist +infallibility +infallible +infallibleness +infallibly +infalling +infalsificable +infame +infamiliar +infamiliarity +infamize +infamonize +infamous +infamously +infamousness +infamy +infancy +infand +infandous +infang +infanglement +infangthief +infant +infanta +infantado +infante +infanthood +infanticidal +infanticide +infantile +infantilism +infantility +infantine +infantlike +infantry +infantryman +infarct +infarctate +infarcted +infarction +infare +infatuate +infatuatedly +infatuation +infatuator +infaust +infeasibility +infeasible +infeasibleness +infect +infectant +infected +infectedness +infecter +infectible +infection +infectionist +infectious +infectiously +infectiousness +infective +infectiveness +infectivity +infector +infectress +infectuous +infecund +infecundity +infeed +infeft +infeftment +infelicific +infelicitous +infelicitously +infelicitousness +infelicity +infelonious +infelt +infeminine +infer +inferable +inference +inferent +inferential +inferentialism +inferentialist +inferentially +inferior +inferiorism +inferiority +inferiorize +inferiorly +infern +infernal +infernalism +infernality +infernalize +infernally +infernalry +infernalship +inferno +inferoanterior +inferobranchiate +inferofrontal +inferolateral +inferomedian +inferoposterior +inferrer +inferribility +inferrible +inferringly +infertile +infertilely +infertileness +infertility +infest +infestant +infestation +infester +infestive +infestivity +infestment +infeudation +infibulate +infibulation +inficete +infidel +infidelic +infidelical +infidelism +infidelistic +infidelity +infidelize +infidelly +infield +infielder +infieldsman +infighter +infighting +infill +infilling +infilm +infilter +infiltrate +infiltration +infiltrative +infinitant +infinitarily +infinitary +infinitate +infinitation +infinite +infinitely +infiniteness +infinitesimal +infinitesimalism +infinitesimality +infinitesimally +infinitesimalness +infiniteth +infinitieth +infinitival +infinitivally +infinitive +infinitively +infinitize +infinitude +infinituple +infinity +infirm +infirmarer +infirmaress +infirmarian +infirmary +infirmate +infirmation +infirmative +infirmity +infirmly +infirmness +infissile +infit +infitter +infix +infixion +inflame +inflamed +inflamedly +inflamedness +inflamer +inflaming +inflamingly +inflammability +inflammable +inflammableness +inflammably +inflammation +inflammative +inflammatorily +inflammatory +inflatable +inflate +inflated +inflatedly +inflatedness +inflater +inflatile +inflatingly +inflation +inflationary +inflationism +inflationist +inflative +inflatus +inflect +inflected +inflectedness +inflection +inflectional +inflectionally +inflectionless +inflective +inflector +inflex +inflexed +inflexibility +inflexible +inflexibleness +inflexibly +inflexive +inflict +inflictable +inflicter +infliction +inflictive +inflood +inflorescence +inflorescent +inflow +inflowering +influence +influenceable +influencer +influencive +influent +influential +influentiality +influentially +influenza +influenzal +influenzic +influx +influxable +influxible +influxibly +influxion +influxionism +infold +infolder +infolding +infoldment +infoliate +inform +informable +informal +informality +informalize +informally +informant +information +informational +informative +informatively +informatory +informed +informedly +informer +informidable +informingly +informity +infortiate +infortitude +infortunate +infortunately +infortunateness +infortune +infra +infrabasal +infrabestial +infrabranchial +infrabuccal +infracanthal +infracaudal +infracelestial +infracentral +infracephalic +infraclavicle +infraclavicular +infraclusion +infraconscious +infracortical +infracostal +infracostalis +infracotyloid +infract +infractible +infraction +infractor +infradentary +infradiaphragmatic +infragenual +infraglacial +infraglenoid +infraglottic +infragrant +infragular +infrahuman +infrahyoid +infralabial +infralapsarian +infralapsarianism +infralinear +infralittoral +inframammary +inframammillary +inframandibular +inframarginal +inframaxillary +inframedian +inframercurial +inframercurian +inframolecular +inframontane +inframundane +infranatural +infranaturalism +infrangibility +infrangible +infrangibleness +infrangibly +infranodal +infranuclear +infraoccipital +infraocclusion +infraocular +infraoral +infraorbital +infraordinary +infrapapillary +infrapatellar +infraperipherial +infrapose +infraposition +infraprotein +infrapubian +infraradular +infrared +infrarenal +infrarenally +infrarimal +infrascapular +infrascapularis +infrascientific +infraspinal +infraspinate +infraspinatus +infraspinous +infrastapedial +infrasternal +infrastigmatal +infrastipular +infrastructure +infrasutral +infratemporal +infraterrene +infraterritorial +infrathoracic +infratonsillar +infratracheal +infratrochanteric +infratrochlear +infratubal +infraturbinal +infravaginal +infraventral +infrequency +infrequent +infrequently +infrigidate +infrigidation +infrigidative +infringe +infringement +infringer +infringible +infructiferous +infructuose +infructuosity +infructuous +infructuously +infrugal +infrustrable +infrustrably +infula +infumate +infumated +infumation +infundibular +Infundibulata +infundibulate +infundibuliform +infundibulum +infuriate +infuriately +infuriatingly +infuriation +infuscate +infuscation +infuse +infusedly +infuser +infusibility +infusible +infusibleness +infusile +infusion +infusionism +infusionist +infusive +Infusoria +infusorial +infusorian +infusoriform +infusorioid +infusorium +infusory +Ing +ing +Inga +Ingaevones +Ingaevonic +ingallantry +ingate +ingather +ingatherer +ingathering +ingeldable +ingeminate +ingemination +ingenerability +ingenerable +ingenerably +ingenerate +ingenerately +ingeneration +ingenerative +ingeniosity +ingenious +ingeniously +ingeniousness +ingenit +ingenue +ingenuity +ingenuous +ingenuously +ingenuousness +Inger +ingerminate +ingest +ingesta +ingestible +ingestion +ingestive +Inghamite +Inghilois +ingiver +ingiving +ingle +inglenook +ingleside +inglobate +inglobe +inglorious +ingloriously +ingloriousness +inglutition +ingluvial +ingluvies +ingluviitis +ingoing +Ingomar +ingot +ingotman +ingraft +ingrain +ingrained +ingrainedly +ingrainedness +Ingram +ingrammaticism +ingrandize +ingrate +ingrateful +ingratefully +ingratefulness +ingrately +ingratiate +ingratiating +ingratiatingly +ingratiation +ingratiatory +ingratitude +ingravescent +ingravidate +ingravidation +ingredient +ingress +ingression +ingressive +ingressiveness +ingross +ingrow +ingrown +ingrownness +ingrowth +inguen +inguinal +inguinoabdominal +inguinocrural +inguinocutaneous +inguinodynia +inguinolabial +inguinoscrotal +Inguklimiut +ingulf +ingulfment +ingurgitate +ingurgitation +Ingush +inhabit +inhabitability +inhabitable +inhabitancy +inhabitant +inhabitation +inhabitative +inhabitativeness +inhabited +inhabitedness +inhabiter +inhabitiveness +inhabitress +inhalant +inhalation +inhalator +inhale +inhalement +inhalent +inhaler +inharmonic +inharmonical +inharmonious +inharmoniously +inharmoniousness +inharmony +inhaul +inhauler +inhaust +inhaustion +inhearse +inheaven +inhere +inherence +inherency +inherent +inherently +inherit +inheritability +inheritable +inheritableness +inheritably +inheritage +inheritance +inheritor +inheritress +inheritrice +inheritrix +inhesion +inhiate +inhibit +inhibitable +inhibiter +inhibition +inhibitionist +inhibitive +inhibitor +inhibitory +inhomogeneity +inhomogeneous +inhomogeneously +inhospitable +inhospitableness +inhospitably +inhospitality +inhuman +inhumane +inhumanely +inhumanism +inhumanity +inhumanize +inhumanly +inhumanness +inhumate +inhumation +inhumationist +inhume +inhumer +inhumorous +inhumorously +Inia +inial +inidoneity +inidoneous +Inigo +inimicable +inimical +inimicality +inimically +inimicalness +inimitability +inimitable +inimitableness +inimitably +iniome +Iniomi +iniomous +inion +iniquitable +iniquitably +iniquitous +iniquitously +iniquitousness +iniquity +inirritability +inirritable +inirritant +inirritative +inissuable +initial +initialer +initialist +initialize +initially +initiant +initiary +initiate +initiation +initiative +initiatively +initiator +initiatorily +initiatory +initiatress +initiatrix +initis +initive +inject +injectable +injection +injector +injelly +injudicial +injudicially +injudicious +injudiciously +injudiciousness +Injun +injunct +injunction +injunctive +injunctively +injurable +injure +injured +injuredly +injuredness +injurer +injurious +injuriously +injuriousness +injury +injustice +ink +inkberry +inkbush +inken +inker +Inkerman +inket +inkfish +inkholder +inkhorn +inkhornism +inkhornist +inkhornize +inkhornizer +inkindle +inkiness +inkish +inkle +inkless +inklike +inkling +inkmaker +inkmaking +inknot +inkosi +inkpot +Inkra +inkroot +inks +inkshed +inkslinger +inkslinging +inkstain +inkstand +inkstandish +inkstone +inkweed +inkwell +inkwood +inkwriter +inky +inlagation +inlaid +inlaik +inlake +inland +inlander +inlandish +inlaut +inlaw +inlawry +inlay +inlayer +inlaying +inleague +inleak +inleakage +inlet +inlier +inlook +inlooker +inly +inlying +inmate +inmeats +inmixture +inmost +inn +innascibility +innascible +innate +innately +innateness +innatism +innative +innatural +innaturality +innaturally +inneity +inner +innerly +innermore +innermost +innermostly +innerness +innervate +innervation +innervational +innerve +inness +innest +innet +innholder +inning +inninmorite +Innisfail +innkeeper +innless +innocence +innocency +innocent +innocently +innocentness +innocuity +innocuous +innocuously +innocuousness +innominable +innominables +innominata +innominate +innominatum +innovant +innovate +innovation +innovational +innovationist +innovative +innovator +innovatory +innoxious +innoxiously +innoxiousness +innuendo +Innuit +innumerability +innumerable +innumerableness +innumerably +innumerous +innutrient +innutrition +innutritious +innutritive +innyard +Ino +inobedience +inobedient +inobediently +inoblast +inobnoxious +inobscurable +inobservable +inobservance +inobservancy +inobservant +inobservantly +inobservantness +inobservation +inobtainable +inobtrusive +inobtrusively +inobtrusiveness +inobvious +Inocarpus +inoccupation +Inoceramus +inochondritis +inochondroma +inoculability +inoculable +inoculant +inocular +inoculate +inoculation +inoculative +inoculator +inoculum +inocystoma +inocyte +Inodes +inodorous +inodorously +inodorousness +inoepithelioma +inoffending +inoffensive +inoffensively +inoffensiveness +inofficial +inofficially +inofficiosity +inofficious +inofficiously +inofficiousness +inogen +inogenesis +inogenic +inogenous +inoglia +inohymenitic +inolith +inoma +inominous +inomyoma +inomyositis +inomyxoma +inone +inoneuroma +inoperable +inoperative +inoperativeness +inopercular +Inoperculata +inoperculate +inopinable +inopinate +inopinately +inopine +inopportune +inopportunely +inopportuneness +inopportunism +inopportunist +inopportunity +inoppressive +inoppugnable +inopulent +inorb +inorderly +inordinacy +inordinary +inordinate +inordinately +inordinateness +inorganic +inorganical +inorganically +inorganizable +inorganization +inorganized +inoriginate +inornate +inosclerosis +inoscopy +inosculate +inosculation +inosic +inosin +inosinic +inosite +inositol +inostensible +inostensibly +inotropic +inower +inoxidability +inoxidable +inoxidizable +inoxidize +inparabola +inpardonable +inpatient +inpayment +inpensioner +inphase +inpolygon +inpolyhedron +inport +inpour +inpush +input +inquaintance +inquartation +inquest +inquestual +inquiet +inquietation +inquietly +inquietness +inquietude +Inquilinae +inquiline +inquilinism +inquilinity +inquilinous +inquinate +inquination +inquirable +inquirant +inquiration +inquire +inquirendo +inquirent +inquirer +inquiring +inquiringly +inquiry +inquisite +inquisition +inquisitional +inquisitionist +inquisitive +inquisitively +inquisitiveness +inquisitor +inquisitorial +inquisitorially +inquisitorialness +inquisitorious +inquisitorship +inquisitory +inquisitress +inquisitrix +inquisiturient +inradius +inreality +inrigged +inrigger +inrighted +inring +inro +inroad +inroader +inroll +inrooted +inrub +inrun +inrunning +inruption +inrush +insack +insagacity +insalivate +insalivation +insalubrious +insalubrity +insalutary +insalvability +insalvable +insane +insanely +insaneness +insanify +insanitariness +insanitary +insanitation +insanity +insapiency +insapient +insatiability +insatiable +insatiableness +insatiably +insatiate +insatiated +insatiately +insatiateness +insatiety +insatisfaction +insatisfactorily +insaturable +inscenation +inscibile +inscience +inscient +inscribable +inscribableness +inscribe +inscriber +inscript +inscriptible +inscription +inscriptional +inscriptioned +inscriptionist +inscriptionless +inscriptive +inscriptively +inscriptured +inscroll +inscrutability +inscrutable +inscrutableness +inscrutables +inscrutably +insculp +insculpture +insea +inseam +insect +Insecta +insectan +insectarium +insectary +insectean +insected +insecticidal +insecticide +insectiferous +insectiform +insectifuge +insectile +insectine +insection +insectival +Insectivora +insectivore +insectivorous +insectlike +insectmonger +insectologer +insectologist +insectology +insectproof +insecure +insecurely +insecureness +insecurity +insee +inseer +inselberg +inseminate +insemination +insenescible +insensate +insensately +insensateness +insense +insensibility +insensibilization +insensibilize +insensibilizer +insensible +insensibleness +insensibly +insensitive +insensitiveness +insensitivity +insensuous +insentience +insentiency +insentient +inseparability +inseparable +inseparableness +inseparably +inseparate +inseparately +insequent +insert +insertable +inserted +inserter +insertion +insertional +insertive +inserviceable +insessor +Insessores +insessorial +inset +insetter +inseverable +inseverably +inshave +insheathe +inshell +inshining +inship +inshoe +inshoot +inshore +inside +insider +insidiosity +insidious +insidiously +insidiousness +insight +insightful +insigne +insignia +insignificance +insignificancy +insignificant +insignificantly +insimplicity +insincere +insincerely +insincerity +insinking +insinuant +insinuate +insinuating +insinuatingly +insinuation +insinuative +insinuatively +insinuativeness +insinuator +insinuatory +insinuendo +insipid +insipidity +insipidly +insipidness +insipience +insipient +insipiently +insist +insistence +insistency +insistent +insistently +insister +insistingly +insistive +insititious +insnare +insnarement +insnarer +insobriety +insociability +insociable +insociableness +insociably +insocial +insocially +insofar +insolate +insolation +insole +insolence +insolency +insolent +insolently +insolentness +insolid +insolidity +insolubility +insoluble +insolubleness +insolubly +insolvability +insolvable +insolvably +insolvence +insolvency +insolvent +insomnia +insomniac +insomnious +insomnolence +insomnolency +insomnolent +insomuch +insonorous +insooth +insorb +insorbent +insouciance +insouciant +insouciantly +insoul +inspan +inspeak +inspect +inspectability +inspectable +inspectingly +inspection +inspectional +inspectioneer +inspective +inspector +inspectoral +inspectorate +inspectorial +inspectorship +inspectress +inspectrix +inspheration +insphere +inspirability +inspirable +inspirant +inspiration +inspirational +inspirationalism +inspirationally +inspirationist +inspirative +inspirator +inspiratory +inspiratrix +inspire +inspired +inspiredly +inspirer +inspiring +inspiringly +inspirit +inspiriter +inspiriting +inspiritingly +inspiritment +inspirometer +inspissant +inspissate +inspissation +inspissator +inspissosis +inspoke +inspoken +inspreith +instability +instable +install +installant +installation +installer +installment +instance +instancy +instanding +instant +instantaneity +instantaneous +instantaneously +instantaneousness +instanter +instantial +instantly +instantness +instar +instate +instatement +instaurate +instauration +instaurator +instead +instealing +insteam +insteep +instellation +instep +instigant +instigate +instigatingly +instigation +instigative +instigator +instigatrix +instill +instillation +instillator +instillatory +instiller +instillment +instinct +instinctive +instinctively +instinctivist +instinctivity +instinctual +instipulate +institor +institorial +institorian +institory +institute +instituter +institution +institutional +institutionalism +institutionalist +institutionality +institutionalization +institutionalize +institutionally +institutionary +institutionize +institutive +institutively +institutor +institutress +institutrix +instonement +instratified +instreaming +instrengthen +instressed +instroke +instruct +instructed +instructedly +instructedness +instructer +instructible +instruction +instructional +instructionary +instructive +instructively +instructiveness +instructor +instructorship +instructress +instrument +instrumental +instrumentalism +instrumentalist +instrumentality +instrumentalize +instrumentally +instrumentary +instrumentate +instrumentation +instrumentative +instrumentist +instrumentman +insuavity +insubduable +insubjection +insubmergible +insubmersible +insubmission +insubmissive +insubordinate +insubordinately +insubordinateness +insubordination +insubstantial +insubstantiality +insubstantiate +insubstantiation +insubvertible +insuccess +insuccessful +insucken +insuetude +insufferable +insufferableness +insufferably +insufficience +insufficiency +insufficient +insufficiently +insufflate +insufflation +insufflator +insula +insulance +insulant +insular +insularism +insularity +insularize +insularly +insulary +insulate +insulated +insulating +insulation +insulator +insulin +insulize +insulse +insulsity +insult +insultable +insultant +insultation +insulter +insulting +insultingly +insultproof +insunk +insuperability +insuperable +insuperableness +insuperably +insupportable +insupportableness +insupportably +insupposable +insuppressible +insuppressibly +insuppressive +insurability +insurable +insurance +insurant +insure +insured +insurer +insurge +insurgence +insurgency +insurgent +insurgentism +insurgescence +insurmountability +insurmountable +insurmountableness +insurmountably +insurpassable +insurrect +insurrection +insurrectional +insurrectionally +insurrectionary +insurrectionism +insurrectionist +insurrectionize +insurrectory +insusceptibility +insusceptible +insusceptibly +insusceptive +inswamp +inswarming +insweeping +inswell +inswept +inswing +inswinger +intabulate +intact +intactile +intactly +intactness +intagliated +intagliation +intaglio +intagliotype +intake +intaker +intangibility +intangible +intangibleness +intangibly +intarissable +intarsia +intarsiate +intarsist +intastable +intaxable +intechnicality +integer +integrability +integrable +integral +integrality +integralization +integralize +integrally +integrand +integrant +integraph +integrate +integration +integrative +integrator +integrifolious +integrious +integriously +integripalliate +integrity +integrodifferential +integropallial +Integropallialia +Integropalliata +integropalliate +integument +integumental +integumentary +integumentation +inteind +intellect +intellectation +intellected +intellectible +intellection +intellective +intellectively +intellectual +intellectualism +intellectualist +intellectualistic +intellectualistically +intellectuality +intellectualization +intellectualize +intellectualizer +intellectually +intellectualness +intelligence +intelligenced +intelligencer +intelligency +intelligent +intelligential +intelligently +intelligentsia +intelligibility +intelligible +intelligibleness +intelligibly +intelligize +intemerate +intemerately +intemerateness +intemeration +intemperable +intemperably +intemperament +intemperance +intemperate +intemperately +intemperateness +intemperature +intempestive +intempestively +intempestivity +intemporal +intemporally +intenability +intenable +intenancy +intend +intendance +intendancy +intendant +intendantism +intendantship +intended +intendedly +intendedness +intendence +intender +intendible +intending +intendingly +intendit +intendment +intenerate +inteneration +intenible +intensate +intensation +intensative +intense +intensely +intenseness +intensification +intensifier +intensify +intension +intensional +intensionally +intensitive +intensity +intensive +intensively +intensiveness +intent +intention +intentional +intentionalism +intentionality +intentionally +intentioned +intentionless +intentive +intentively +intentiveness +intently +intentness +inter +interabsorption +interacademic +interaccessory +interaccuse +interacinar +interacinous +interact +interaction +interactional +interactionism +interactionist +interactive +interactivity +interadaptation +interadditive +interadventual +interaffiliation +interagency +interagent +interagglutinate +interagglutination +interagree +interagreement +interalar +interallied +interally +interalveolar +interambulacral +interambulacrum +interamnian +interangular +interanimate +interannular +interantagonism +interantennal +interantennary +interapophyseal +interapplication +interarboration +interarch +interarcualis +interarmy +interarticular +interartistic +interarytenoid +interassociation +interassure +interasteroidal +interastral +interatomic +interatrial +interattrition +interaulic +interaural +interauricular +interavailability +interavailable +interaxal +interaxial +interaxillary +interaxis +interbalance +interbanded +interbank +interbedded +interbelligerent +interblend +interbody +interbonding +interborough +interbourse +interbrachial +interbrain +interbranch +interbranchial +interbreath +interbreed +interbrigade +interbring +interbronchial +intercadence +intercadent +intercalare +intercalarily +intercalarium +intercalary +intercalate +intercalation +intercalative +intercalatory +intercale +intercalm +intercanal +intercanalicular +intercapillary +intercardinal +intercarotid +intercarpal +intercarpellary +intercarrier +intercartilaginous +intercaste +intercatenated +intercausative +intercavernous +intercede +interceder +intercellular +intercensal +intercentral +intercentrum +intercept +intercepter +intercepting +interception +interceptive +interceptor +interceptress +intercerebral +intercession +intercessional +intercessionary +intercessionment +intercessive +intercessor +intercessorial +intercessory +interchaff +interchange +interchangeability +interchangeable +interchangeableness +interchangeably +interchanger +interchapter +intercharge +interchase +intercheck +interchoke +interchondral +interchurch +Intercidona +interciliary +intercilium +intercircle +intercirculate +intercirculation +intercision +intercitizenship +intercity +intercivic +intercivilization +interclash +interclasp +interclass +interclavicle +interclavicular +interclerical +intercloud +interclub +intercoastal +intercoccygeal +intercoccygean +intercohesion +intercollege +intercollegian +intercollegiate +intercolline +intercolonial +intercolonially +intercolonization +intercolumn +intercolumnal +intercolumnar +intercolumniation +intercom +intercombat +intercombination +intercombine +intercome +intercommission +intercommon +intercommonable +intercommonage +intercommoner +intercommunal +intercommune +intercommuner +intercommunicability +intercommunicable +intercommunicate +intercommunication +intercommunicative +intercommunicator +intercommunion +intercommunity +intercompany +intercomparable +intercompare +intercomparison +intercomplexity +intercomplimentary +interconal +interconciliary +intercondenser +intercondylar +intercondylic +intercondyloid +interconfessional +interconfound +interconnect +interconnection +intercontinental +intercontorted +intercontradiction +intercontradictory +interconversion +interconvertibility +interconvertible +interconvertibly +intercooler +intercooling +intercoracoid +intercorporate +intercorpuscular +intercorrelate +intercorrelation +intercortical +intercosmic +intercosmically +intercostal +intercostally +intercostobrachial +intercostohumeral +intercotylar +intercounty +intercourse +intercoxal +intercranial +intercreate +intercrescence +intercrinal +intercrop +intercross +intercrural +intercrust +intercrystalline +intercrystallization +intercrystallize +intercultural +interculture +intercurl +intercurrence +intercurrent +intercurrently +intercursation +intercuspidal +intercutaneous +intercystic +interdash +interdebate +interdenominational +interdental +interdentally +interdentil +interdepartmental +interdepartmentally +interdepend +interdependable +interdependence +interdependency +interdependent +interdependently +interderivative +interdespise +interdestructive +interdestructiveness +interdetermination +interdetermine +interdevour +interdict +interdiction +interdictive +interdictor +interdictory +interdictum +interdifferentiation +interdiffuse +interdiffusion +interdiffusive +interdiffusiveness +interdigital +interdigitate +interdigitation +interdine +interdiscal +interdispensation +interdistinguish +interdistrict +interdivision +interdome +interdorsal +interdrink +intereat +interelectrode +interelectrodic +interempire +interenjoy +interentangle +interentanglement +interepidemic +interepimeral +interepithelial +interequinoctial +interessee +interest +interested +interestedly +interestedness +interester +interesting +interestingly +interestingness +interestless +interestuarine +interface +interfacial +interfactional +interfamily +interfascicular +interfault +interfector +interfederation +interfemoral +interfenestral +interfenestration +interferant +interfere +interference +interferent +interferential +interferer +interfering +interferingly +interferingness +interferometer +interferometry +interferric +interfertile +interfertility +interfibrillar +interfibrillary +interfibrous +interfilamentar +interfilamentary +interfilamentous +interfilar +interfiltrate +interfinger +interflange +interflashing +interflow +interfluence +interfluent +interfluminal +interfluous +interfluve +interfluvial +interflux +interfold +interfoliaceous +interfoliar +interfoliate +interfollicular +interforce +interfraternal +interfraternity +interfret +interfretted +interfriction +interfrontal +interfruitful +interfulgent +interfuse +interfusion +interganglionic +intergenerant +intergenerating +intergeneration +intergential +intergesture +intergilt +interglacial +interglandular +interglobular +interglyph +intergossip +intergovernmental +intergradation +intergrade +intergradient +intergraft +intergranular +intergrapple +intergrave +intergroupal +intergrow +intergrown +intergrowth +intergular +intergyral +interhabitation +interhemal +interhemispheric +interhostile +interhuman +interhyal +interhybridize +interim +interimist +interimistic +interimistical +interimistically +interimperial +interincorporation +interindependence +interindicate +interindividual +interinfluence +interinhibition +interinhibitive +interinsert +interinsular +interinsurance +interinsurer +interinvolve +interionic +interior +interiority +interiorize +interiorly +interiorness +interirrigation +interisland +interjacence +interjacency +interjacent +interjaculate +interjaculatory +interjangle +interjealousy +interject +interjection +interjectional +interjectionalize +interjectionally +interjectionary +interjectionize +interjectiveness +interjector +interjectorily +interjectory +interjectural +interjoin +interjoist +interjudgment +interjunction +interkinesis +interkinetic +interknit +interknot +interknow +interknowledge +interlaboratory +interlace +interlaced +interlacedly +interlacement +interlacery +interlacustrine +interlaid +interlake +interlamellar +interlamellation +interlaminar +interlaminate +interlamination +interlanguage +interlap +interlapse +interlard +interlardation +interlardment +interlatitudinal +interlaudation +interlay +interleaf +interleague +interleave +interleaver +interlibel +interlibrary +interlie +interligamentary +interligamentous +interlight +interlimitation +interline +interlineal +interlineally +interlinear +interlinearily +interlinearly +interlineary +interlineate +interlineation +interlinement +interliner +Interlingua +interlingual +interlinguist +interlinguistic +interlining +interlink +interloan +interlobar +interlobate +interlobular +interlocal +interlocally +interlocate +interlocation +interlock +interlocker +interlocular +interloculus +interlocution +interlocutive +interlocutor +interlocutorily +interlocutory +interlocutress +interlocutrice +interlocutrix +interloop +interlope +interloper +interlot +interlucation +interlucent +interlude +interluder +interludial +interlunar +interlunation +interlying +intermalleolar +intermammary +intermammillary +intermandibular +intermanorial +intermarginal +intermarine +intermarriage +intermarriageable +intermarry +intermason +intermastoid +intermat +intermatch +intermaxilla +intermaxillar +intermaxillary +intermaze +intermeasurable +intermeasure +intermeddle +intermeddlement +intermeddler +intermeddlesome +intermeddlesomeness +intermeddling +intermeddlingly +intermediacy +intermediae +intermedial +intermediary +intermediate +intermediately +intermediateness +intermediation +intermediator +intermediatory +intermedium +intermedius +intermeet +intermelt +intermembral +intermembranous +intermeningeal +intermenstrual +intermenstruum +interment +intermental +intermention +intermercurial +intermesenterial +intermesenteric +intermesh +intermessage +intermessenger +intermetacarpal +intermetallic +intermetameric +intermetatarsal +intermew +intermewed +intermewer +intermezzo +intermigration +interminability +interminable +interminableness +interminably +interminant +interminate +intermine +intermingle +intermingledom +interminglement +interminister +interministerial +interministerium +intermission +intermissive +intermit +intermitted +intermittedly +intermittence +intermittency +intermittent +intermittently +intermitter +intermitting +intermittingly +intermix +intermixedly +intermixtly +intermixture +intermobility +intermodification +intermodillion +intermodulation +intermolar +intermolecular +intermomentary +intermontane +intermorainic +intermotion +intermountain +intermundane +intermundial +intermundian +intermundium +intermunicipal +intermunicipality +intermural +intermuscular +intermutation +intermutual +intermutually +intermutule +intern +internal +internality +internalization +internalize +internally +internalness +internals +internarial +internasal +internation +international +internationalism +internationalist +internationality +internationalization +internationalize +internationally +interneciary +internecinal +internecine +internecion +internecive +internee +internetted +interneural +interneuronic +internidal +internist +internment +internobasal +internodal +internode +internodial +internodian +internodium +internodular +internship +internuclear +internuncial +internunciary +internunciatory +internuncio +internuncioship +internuncius +internuptial +interobjective +interoceanic +interoceptive +interoceptor +interocular +interoffice +interolivary +interopercle +interopercular +interoperculum +interoptic +interorbital +interorbitally +interoscillate +interosculant +interosculate +interosculation +interosseal +interosseous +interownership +interpage +interpalatine +interpalpebral +interpapillary +interparenchymal +interparental +interparenthetical +interparenthetically +interparietal +interparietale +interparliament +interparliamentary +interparoxysmal +interparty +interpause +interpave +interpeal +interpectoral +interpeduncular +interpel +interpellant +interpellate +interpellation +interpellator +interpenetrable +interpenetrant +interpenetrate +interpenetration +interpenetrative +interpenetratively +interpermeate +interpersonal +interpervade +interpetaloid +interpetiolar +interpetiolary +interphalangeal +interphase +interphone +interpiece +interpilaster +interpilastering +interplacental +interplait +interplanetary +interplant +interplanting +interplay +interplea +interplead +interpleader +interpledge +interpleural +interplical +interplicate +interplication +interplight +interpoint +interpolable +interpolar +interpolary +interpolate +interpolater +interpolation +interpolative +interpolatively +interpolator +interpole +interpolitical +interpolity +interpollinate +interpolymer +interpone +interportal +interposable +interposal +interpose +interposer +interposing +interposingly +interposition +interposure +interpour +interprater +interpressure +interpret +interpretability +interpretable +interpretableness +interpretably +interpretament +interpretation +interpretational +interpretative +interpretatively +interpreter +interpretership +interpretive +interpretively +interpretorial +interpretress +interprismatic +interproduce +interprofessional +interproglottidal +interproportional +interprotoplasmic +interprovincial +interproximal +interproximate +interpterygoid +interpubic +interpulmonary +interpunct +interpunction +interpunctuate +interpunctuation +interpupillary +interquarrel +interquarter +interrace +interracial +interracialism +interradial +interradially +interradiate +interradiation +interradium +interradius +interrailway +interramal +interramicorn +interramification +interreceive +interreflection +interregal +interregimental +interregional +interregna +interregnal +interregnum +interreign +interrelate +interrelated +interrelatedly +interrelatedness +interrelation +interrelationship +interreligious +interrenal +interrenalism +interrepellent +interrepulsion +interrer +interresponsibility +interresponsible +interreticular +interreticulation +interrex +interrhyme +interright +interriven +interroad +interrogability +interrogable +interrogant +interrogate +interrogatedness +interrogatee +interrogatingly +interrogation +interrogational +interrogative +interrogatively +interrogator +interrogatorily +interrogatory +interrogatrix +interrogee +interroom +interrule +interrun +interrupt +interrupted +interruptedly +interruptedness +interrupter +interruptible +interrupting +interruptingly +interruption +interruptive +interruptively +interruptor +interruptory +intersale +intersalute +interscapilium +interscapular +interscapulum +interscene +interscholastic +interschool +interscience +interscribe +interscription +interseaboard +interseamed +intersect +intersectant +intersection +intersectional +intersegmental +interseminal +intersentimental +interseptal +intersertal +intersesamoid +intersession +intersessional +interset +intersex +intersexual +intersexualism +intersexuality +intershade +intershifting +intershock +intershoot +intershop +intersidereal +intersituate +intersocial +intersocietal +intersociety +intersole +intersolubility +intersoluble +intersomnial +intersomnious +intersonant +intersow +interspace +interspatial +interspatially +interspeaker +interspecial +interspecific +interspersal +intersperse +interspersedly +interspersion +interspheral +intersphere +interspicular +interspinal +interspinalis +interspinous +interspiral +interspiration +intersporal +intersprinkle +intersqueeze +interstadial +interstage +interstaminal +interstapedial +interstate +interstation +interstellar +interstellary +intersterile +intersterility +intersternal +interstice +intersticed +interstimulate +interstimulation +interstitial +interstitially +interstitious +interstratification +interstratify +interstreak +interstream +interstreet +interstrial +interstriation +interstrive +intersubjective +intersubsistence +intersubstitution +intersuperciliary +intersusceptation +intersystem +intersystematical +intertalk +intertangle +intertanglement +intertarsal +interteam +intertentacular +intertergal +interterminal +interterritorial +intertessellation +intertexture +interthing +interthreaded +interthronging +intertidal +intertie +intertill +intertillage +intertinge +intertissued +intertone +intertongue +intertonic +intertouch +intertown +intertrabecular +intertrace +intertrade +intertrading +intertraffic +intertragian +intertransformability +intertransformable +intertransmissible +intertransmission +intertranspicuous +intertransversal +intertransversalis +intertransversary +intertransverse +intertrappean +intertribal +intertriginous +intertriglyph +intertrigo +intertrinitarian +intertrochanteric +intertropic +intertropical +intertropics +intertrude +intertuberal +intertubercular +intertubular +intertwin +intertwine +intertwinement +intertwining +intertwiningly +intertwist +intertwistingly +Intertype +interungular +interungulate +interunion +interuniversity +interurban +interureteric +intervaginal +interval +intervale +intervalley +intervallic +intervallum +intervalvular +intervarietal +intervary +intervascular +intervein +interveinal +intervenant +intervene +intervener +intervenience +interveniency +intervenient +intervenium +intervention +interventional +interventionism +interventionist +interventive +interventor +interventral +interventralia +interventricular +intervenular +interverbal +interversion +intervert +intervertebra +intervertebral +intervertebrally +intervesicular +interview +interviewable +interviewee +interviewer +intervillous +intervisibility +intervisible +intervisit +intervisitation +intervital +intervocal +intervocalic +intervolute +intervolution +intervolve +interwar +interweave +interweavement +interweaver +interweaving +interweavingly +interwed +interweld +interwhiff +interwhile +interwhistle +interwind +interwish +interword +interwork +interworks +interworld +interworry +interwound +interwove +interwoven +interwovenly +interwrap +interwreathe +interwrought +interxylary +interzonal +interzone +interzooecial +interzygapophysial +intestable +intestacy +intestate +intestation +intestinal +intestinally +intestine +intestineness +intestiniform +intestinovesical +intext +intextine +intexture +inthrall +inthrallment +inthrong +inthronistic +inthronization +inthronize +inthrow +inthrust +intil +intima +intimacy +intimal +intimate +intimately +intimateness +intimater +intimation +intimidate +intimidation +intimidator +intimidatory +intimidity +intimity +intinction +intine +intitule +into +intoed +intolerability +intolerable +intolerableness +intolerably +intolerance +intolerancy +intolerant +intolerantly +intolerantness +intolerated +intolerating +intoleration +intonable +intonate +intonation +intonator +intone +intonement +intoner +intoothed +intorsion +intort +intortillage +intown +intoxation +intoxicable +intoxicant +intoxicate +intoxicated +intoxicatedly +intoxicatedness +intoxicating +intoxicatingly +intoxication +intoxicative +intoxicator +intrabiontic +intrabranchial +intrabred +intrabronchial +intrabuccal +intracalicular +intracanalicular +intracanonical +intracapsular +intracardiac +intracardial +intracarpal +intracarpellary +intracartilaginous +intracellular +intracellularly +intracephalic +intracerebellar +intracerebral +intracerebrally +intracervical +intrachordal +intracistern +intracity +intraclitelline +intracloacal +intracoastal +intracoelomic +intracolic +intracollegiate +intracommunication +intracompany +intracontinental +intracorporeal +intracorpuscular +intracortical +intracosmic +intracosmical +intracosmically +intracostal +intracranial +intracranially +intractability +intractable +intractableness +intractably +intractile +intracutaneous +intracystic +intrada +intradepartmental +intradermal +intradermally +intradermic +intradermically +intradermo +intradistrict +intradivisional +intrados +intraduodenal +intradural +intraecclesiastical +intraepiphyseal +intraepithelial +intrafactory +intrafascicular +intrafissural +intrafistular +intrafoliaceous +intraformational +intrafusal +intragastric +intragemmal +intraglacial +intraglandular +intraglobular +intragroup +intragroupal +intragyral +intrahepatic +intrahyoid +intraimperial +intrait +intrajugular +intralamellar +intralaryngeal +intralaryngeally +intraleukocytic +intraligamentary +intraligamentous +intralingual +intralobar +intralobular +intralocular +intralogical +intralumbar +intramammary +intramarginal +intramastoid +intramatrical +intramatrically +intramedullary +intramembranous +intrameningeal +intramental +intrametropolitan +intramolecular +intramontane +intramorainic +intramundane +intramural +intramuralism +intramuscular +intramuscularly +intramyocardial +intranarial +intranasal +intranatal +intranational +intraneous +intraneural +intranidal +intranquil +intranquillity +intranscalency +intranscalent +intransferable +intransformable +intransfusible +intransgressible +intransient +intransigency +intransigent +intransigentism +intransigentist +intransigently +intransitable +intransitive +intransitively +intransitiveness +intransitivity +intranslatable +intransmissible +intransmutability +intransmutable +intransparency +intransparent +intrant +intranuclear +intraoctave +intraocular +intraoral +intraorbital +intraorganization +intraossal +intraosseous +intraosteal +intraovarian +intrapair +intraparenchymatous +intraparietal +intraparochial +intraparty +intrapelvic +intrapericardiac +intrapericardial +intraperineal +intraperiosteal +intraperitoneal +intraperitoneally +intrapetiolar +intraphilosophic +intrapial +intraplacental +intraplant +intrapleural +intrapolar +intrapontine +intraprostatic +intraprotoplasmic +intrapsychic +intrapsychical +intrapsychically +intrapulmonary +intrapyretic +intrarachidian +intrarectal +intrarelation +intrarenal +intraretinal +intrarhachidian +intraschool +intrascrotal +intrasegmental +intraselection +intrasellar +intraseminal +intraseptal +intraserous +intrashop +intraspecific +intraspinal +intrastate +intrastromal +intrasusception +intrasynovial +intratarsal +intratelluric +intraterritorial +intratesticular +intrathecal +intrathoracic +intrathyroid +intratomic +intratonsillar +intratrabecular +intratracheal +intratracheally +intratropical +intratubal +intratubular +intratympanic +intravaginal +intravalvular +intravasation +intravascular +intravenous +intravenously +intraventricular +intraverbal +intraversable +intravertebral +intravertebrally +intravesical +intravital +intravitelline +intravitreous +intraxylary +intreat +intrench +intrenchant +intrencher +intrenchment +intrepid +intrepidity +intrepidly +intrepidness +intricacy +intricate +intricately +intricateness +intrication +intrigant +intrigue +intrigueproof +intriguer +intriguery +intriguess +intriguing +intriguingly +intrine +intrinse +intrinsic +intrinsical +intrinsicality +intrinsically +intrinsicalness +introactive +introceptive +introconversion +introconvertibility +introconvertible +introdden +introduce +introducee +introducement +introducer +introducible +introduction +introductive +introductively +introductor +introductorily +introductoriness +introductory +introductress +introflex +introflexion +introgression +introgressive +introinflection +introit +introitus +introject +introjection +introjective +intromissibility +intromissible +intromission +intromissive +intromit +intromittence +intromittent +intromitter +intropression +intropulsive +introreception +introrsal +introrse +introrsely +introsensible +introsentient +introspect +introspectable +introspection +introspectional +introspectionism +introspectionist +introspective +introspectively +introspectiveness +introspectivism +introspectivist +introspector +introsuction +introsuscept +introsusception +introthoracic +introtraction +introvenient +introverse +introversibility +introversible +introversion +introversive +introversively +introvert +introverted +introvertive +introvision +introvolution +intrudance +intrude +intruder +intruding +intrudingly +intrudress +intruse +intrusion +intrusional +intrusionism +intrusionist +intrusive +intrusively +intrusiveness +intrust +intubate +intubation +intubationist +intubator +intube +intue +intuent +intuicity +intuit +intuitable +intuition +intuitional +intuitionalism +intuitionalist +intuitionally +intuitionism +intuitionist +intuitionistic +intuitionless +intuitive +intuitively +intuitiveness +intuitivism +intuitivist +intumesce +intumescence +intumescent +inturbidate +inturn +inturned +inturning +intussuscept +intussusception +intussusceptive +intwist +inula +inulaceous +inulase +inulin +inuloid +inumbrate +inumbration +inunct +inunction +inunctum +inunctuosity +inunctuous +inundable +inundant +inundate +inundation +inundator +inundatory +inunderstandable +inurbane +inurbanely +inurbaneness +inurbanity +inure +inured +inuredness +inurement +inurn +inusitate +inusitateness +inusitation +inustion +inutile +inutilely +inutility +inutilized +inutterable +invaccinate +invaccination +invadable +invade +invader +invaginable +invaginate +invagination +invalescence +invalid +invalidate +invalidation +invalidator +invalidcy +invalidhood +invalidish +invalidism +invalidity +invalidly +invalidness +invalidship +invalorous +invaluable +invaluableness +invaluably +invalued +Invar +invariability +invariable +invariableness +invariably +invariance +invariancy +invariant +invariantive +invariantively +invariantly +invaried +invasion +invasionist +invasive +invecked +invected +invection +invective +invectively +invectiveness +invectivist +invector +inveigh +inveigher +inveigle +inveiglement +inveigler +inveil +invein +invendibility +invendible +invendibleness +invenient +invent +inventable +inventary +inventer +inventful +inventibility +inventible +inventibleness +invention +inventional +inventionless +inventive +inventively +inventiveness +inventor +inventoriable +inventorial +inventorially +inventory +inventress +inventurous +inveracious +inveracity +inverisimilitude +inverity +inverminate +invermination +invernacular +Inverness +inversable +inversatile +inverse +inversed +inversedly +inversely +inversion +inversionist +inversive +invert +invertase +invertebracy +invertebral +Invertebrata +invertebrate +invertebrated +inverted +invertedly +invertend +inverter +invertibility +invertible +invertile +invertin +invertive +invertor +invest +investable +investible +investigable +investigatable +investigate +investigating +investigatingly +investigation +investigational +investigative +investigator +investigatorial +investigatory +investitive +investitor +investiture +investment +investor +inveteracy +inveterate +inveterately +inveterateness +inviability +invictive +invidious +invidiously +invidiousness +invigilance +invigilancy +invigilation +invigilator +invigor +invigorant +invigorate +invigorating +invigoratingly +invigoratingness +invigoration +invigorative +invigoratively +invigorator +invinate +invination +invincibility +invincible +invincibleness +invincibly +inviolability +inviolable +inviolableness +inviolably +inviolacy +inviolate +inviolated +inviolately +inviolateness +invirile +invirility +invirtuate +inviscate +inviscation +inviscid +inviscidity +invised +invisibility +invisible +invisibleness +invisibly +invitable +invital +invitant +invitation +invitational +invitatory +invite +invitee +invitement +inviter +invitiate +inviting +invitingly +invitingness +invitress +invitrifiable +invivid +invocable +invocant +invocate +invocation +invocative +invocator +invocatory +invoice +invoke +invoker +involatile +involatility +involucel +involucellate +involucellated +involucral +involucrate +involucre +involucred +involucriform +involucrum +involuntarily +involuntariness +involuntary +involute +involuted +involutedly +involutely +involution +involutional +involutionary +involutorial +involutory +involve +involved +involvedly +involvedness +involvement +involvent +involver +invulnerability +invulnerable +invulnerableness +invulnerably +invultuation +inwale +inwall +inwandering +inward +inwardly +inwardness +inwards +inweave +inwedged +inweed +inweight +inwick +inwind +inwit +inwith +inwood +inwork +inworn +inwound +inwoven +inwrap +inwrapment +inwreathe +inwrit +inwrought +inyoite +inyoke +Io +io +Iodamoeba +iodate +iodation +iodhydrate +iodhydric +iodhydrin +iodic +iodide +iodiferous +iodinate +iodination +iodine +iodinium +iodinophil +iodinophilic +iodinophilous +iodism +iodite +iodization +iodize +iodizer +iodo +iodobehenate +iodobenzene +iodobromite +iodocasein +iodochloride +iodochromate +iodocresol +iododerma +iodoethane +iodoform +iodogallicin +iodohydrate +iodohydric +iodohydrin +iodol +iodomercurate +iodomercuriate +iodomethane +iodometric +iodometrical +iodometry +iodonium +iodopsin +iodoso +iodosobenzene +iodospongin +iodotannic +iodotherapy +iodothyrin +iodous +iodoxy +iodoxybenzene +iodyrite +iolite +ion +Ione +Ioni +Ionian +Ionic +ionic +Ionicism +Ionicization +Ionicize +Ionidium +Ionism +Ionist +ionium +ionizable +Ionization +ionization +Ionize +ionize +ionizer +ionogen +ionogenic +ionone +Ionornis +ionosphere +ionospheric +Ionoxalis +iontophoresis +Ioskeha +iota +iotacism +iotacismus +iotacist +iotization +iotize +Iowa +Iowan +Ipalnemohuani +ipecac +ipecacuanha +ipecacuanhic +Iphimedia +Iphis +ipid +Ipidae +ipil +ipomea +Ipomoea +ipomoein +ipseand +ipsedixitish +ipsedixitism +ipsedixitist +ipseity +ipsilateral +Ira +iracund +iracundity +iracundulous +irade +Iran +Irani +Iranian +Iranic +Iranism +Iranist +Iranize +Iraq +Iraqi +Iraqian +irascent +irascibility +irascible +irascibleness +irascibly +irate +irately +ire +ireful +irefully +irefulness +Irelander +ireless +Irena +irenarch +Irene +irene +irenic +irenical +irenically +irenicism +irenicist +irenicon +irenics +irenicum +Iresine +Irgun +Irgunist +irian +Iriartea +Iriarteaceae +Iricism +Iricize +irid +Iridaceae +iridaceous +iridadenosis +iridal +iridalgia +iridate +iridauxesis +iridectome +iridectomize +iridectomy +iridectropium +iridemia +iridencleisis +iridentropium +irideous +irideremia +irides +iridesce +iridescence +iridescency +iridescent +iridescently +iridial +iridian +iridiate +iridic +iridical +iridin +iridine +iridiocyte +iridiophore +iridioplatinum +iridious +iridite +iridium +iridization +iridize +iridoavulsion +iridocapsulitis +iridocele +iridoceratitic +iridochoroiditis +iridocoloboma +iridoconstrictor +iridocyclitis +iridocyte +iridodesis +iridodiagnosis +iridodialysis +iridodonesis +iridokinesia +iridomalacia +iridomotor +Iridomyrmex +iridoncus +iridoparalysis +iridophore +iridoplegia +iridoptosis +iridopupillary +iridorhexis +iridosclerotomy +iridosmine +iridosmium +iridotasis +iridotome +iridotomy +iris +irisated +irisation +iriscope +irised +Irish +Irisher +Irishian +Irishism +Irishize +Irishly +Irishman +Irishness +Irishry +Irishwoman +Irishy +irisin +irislike +irisroot +iritic +iritis +irk +irksome +irksomely +irksomeness +Irma +Iroha +irok +iroko +iron +ironback +ironbark +ironbound +ironbush +ironclad +irone +ironer +ironfisted +ironflower +ironhanded +ironhandedly +ironhandedness +ironhard +ironhead +ironheaded +ironhearted +ironheartedly +ironheartedness +ironical +ironically +ironicalness +ironice +ironish +ironism +ironist +ironize +ironless +ironlike +ironly +ironmaker +ironmaking +ironman +ironmaster +ironmonger +ironmongering +ironmongery +ironness +ironshod +ironshot +ironside +ironsided +ironsides +ironsmith +ironstone +ironware +ironweed +ironwood +ironwork +ironworked +ironworker +ironworking +ironworks +ironwort +irony +Iroquoian +Iroquois +Irpex +irradiance +irradiancy +irradiant +irradiate +irradiated +irradiatingly +irradiation +irradiative +irradiator +irradicable +irradicate +irrarefiable +irrationability +irrationable +irrationably +irrational +irrationalism +irrationalist +irrationalistic +irrationality +irrationalize +irrationally +irrationalness +irreality +irrealizable +irrebuttable +irreceptive +irreceptivity +irreciprocal +irreciprocity +irreclaimability +irreclaimable +irreclaimableness +irreclaimably +irreclaimed +irrecognition +irrecognizability +irrecognizable +irrecognizably +irrecognizant +irrecollection +irreconcilability +irreconcilable +irreconcilableness +irreconcilably +irreconcile +irreconcilement +irreconciliability +irreconciliable +irreconciliableness +irreconciliably +irreconciliation +irrecordable +irrecoverable +irrecoverableness +irrecoverably +irrecusable +irrecusably +irredeemability +irredeemable +irredeemableness +irredeemably +irredeemed +irredenta +irredential +Irredentism +Irredentist +irredressibility +irredressible +irredressibly +irreducibility +irreducible +irreducibleness +irreducibly +irreductibility +irreductible +irreduction +irreferable +irreflection +irreflective +irreflectively +irreflectiveness +irreflexive +irreformability +irreformable +irrefragability +irrefragable +irrefragableness +irrefragably +irrefrangibility +irrefrangible +irrefrangibleness +irrefrangibly +irrefusable +irrefutability +irrefutable +irrefutableness +irrefutably +irregardless +irregeneracy +irregenerate +irregeneration +irregular +irregularism +irregularist +irregularity +irregularize +irregularly +irregularness +irregulate +irregulated +irregulation +irrelate +irrelated +irrelation +irrelative +irrelatively +irrelativeness +irrelevance +irrelevancy +irrelevant +irrelevantly +irreliability +irrelievable +irreligion +irreligionism +irreligionist +irreligionize +irreligiosity +irreligious +irreligiously +irreligiousness +irreluctant +irremeable +irremeably +irremediable +irremediableness +irremediably +irrememberable +irremissibility +irremissible +irremissibleness +irremissibly +irremission +irremissive +irremovability +irremovable +irremovableness +irremovably +irremunerable +irrenderable +irrenewable +irrenunciable +irrepair +irrepairable +irreparability +irreparable +irreparableness +irreparably +irrepassable +irrepealability +irrepealable +irrepealableness +irrepealably +irrepentance +irrepentant +irrepentantly +irreplaceable +irreplaceably +irrepleviable +irreplevisable +irreportable +irreprehensible +irreprehensibleness +irreprehensibly +irrepresentable +irrepresentableness +irrepressibility +irrepressible +irrepressibleness +irrepressibly +irrepressive +irreproachability +irreproachable +irreproachableness +irreproachably +irreproducible +irreproductive +irreprovable +irreprovableness +irreprovably +irreptitious +irrepublican +irresilient +irresistance +irresistibility +irresistible +irresistibleness +irresistibly +irresoluble +irresolubleness +irresolute +irresolutely +irresoluteness +irresolution +irresolvability +irresolvable +irresolvableness +irresolved +irresolvedly +irresonance +irresonant +irrespectability +irrespectable +irrespectful +irrespective +irrespectively +irrespirable +irrespondence +irresponsibility +irresponsible +irresponsibleness +irresponsibly +irresponsive +irresponsiveness +irrestrainable +irrestrainably +irrestrictive +irresultive +irresuscitable +irresuscitably +irretention +irretentive +irretentiveness +irreticence +irreticent +irretraceable +irretraceably +irretractable +irretractile +irretrievability +irretrievable +irretrievableness +irretrievably +irrevealable +irrevealably +irreverence +irreverend +irreverendly +irreverent +irreverential +irreverentialism +irreverentially +irreverently +irreversibility +irreversible +irreversibleness +irreversibly +irrevertible +irreviewable +irrevisable +irrevocability +irrevocable +irrevocableness +irrevocably +irrevoluble +irrigable +irrigably +irrigant +irrigate +irrigation +irrigational +irrigationist +irrigative +irrigator +irrigatorial +irrigatory +irriguous +irriguousness +irrision +irrisor +Irrisoridae +irrisory +irritability +irritable +irritableness +irritably +irritament +irritancy +irritant +irritate +irritatedly +irritating +irritatingly +irritation +irritative +irritativeness +irritator +irritatory +Irritila +irritomotile +irritomotility +irrorate +irrotational +irrotationally +irrubrical +irrupt +irruptible +irruption +irruptive +irruptively +Irvingesque +Irvingiana +Irvingism +Irvingite +is +Isaac +Isabel +isabelina +isabelita +Isabella +Isabelline +isabnormal +isaconitine +isacoustic +isadelphous +Isadora +isagoge +isagogic +isagogical +isagogically +isagogics +isagon +Isaiah +Isaian +isallobar +isallotherm +isamine +Isander +isandrous +isanemone +isanomal +isanomalous +isanthous +isapostolic +Isaria +isarioid +isatate +isatic +isatide +isatin +isatinic +Isatis +isatogen +isatogenic +Isaurian +Isawa +isazoxy +isba +Iscariot +Iscariotic +Iscariotical +Iscariotism +ischemia +ischemic +ischiac +ischiadic +ischiadicus +ischial +ischialgia +ischialgic +ischiatic +ischidrosis +ischioanal +ischiobulbar +ischiocapsular +ischiocaudal +ischiocavernosus +ischiocavernous +ischiocele +ischiocerite +ischiococcygeal +ischiofemoral +ischiofibular +ischioiliac +ischioneuralgia +ischioperineal +ischiopodite +ischiopubic +ischiopubis +ischiorectal +ischiorrhogic +ischiosacral +ischiotibial +ischiovaginal +ischiovertebral +ischium +ischocholia +ischuretic +ischuria +ischury +Ischyodus +Isegrim +isenergic +isentropic +isepiptesial +isepiptesis +iserine +iserite +isethionate +isethionic +Iseum +Isfahan +Ishmael +Ishmaelite +Ishmaelitic +Ishmaelitish +Ishmaelitism +ishpingo +ishshakku +Isiac +Isiacal +Isidae +isidiiferous +isidioid +isidiophorous +isidiose +isidium +isidoid +Isidore +Isidorian +Isidoric +Isinai +isindazole +isinglass +Isis +Islam +Islamic +Islamism +Islamist +Islamistic +Islamite +Islamitic +Islamitish +Islamization +Islamize +island +islander +islandhood +islandic +islandish +islandless +islandlike +islandman +islandress +islandry +islandy +islay +isle +isleless +islesman +islet +Isleta +isleted +isleward +islot +ism +Ismaelism +Ismaelite +Ismaelitic +Ismaelitical +Ismaelitish +Ismaili +Ismailian +Ismailite +ismal +ismatic +ismatical +ismaticalness +ismdom +ismy +Isnardia +iso +isoabnormal +isoagglutination +isoagglutinative +isoagglutinin +isoagglutinogen +isoalantolactone +isoallyl +isoamarine +isoamide +isoamyl +isoamylamine +isoamylene +isoamylethyl +isoamylidene +isoantibody +isoantigen +isoapiole +isoasparagine +isoaurore +isobar +isobarbaloin +isobarbituric +isobare +isobaric +isobarism +isobarometric +isobase +isobath +isobathic +isobathytherm +isobathythermal +isobathythermic +isobenzofuran +isobilateral +isobilianic +isobiogenetic +isoborneol +isobornyl +isobront +isobronton +isobutane +isobutyl +isobutylene +isobutyraldehyde +isobutyrate +isobutyric +isobutyryl +isocamphor +isocamphoric +isocaproic +isocarbostyril +Isocardia +Isocardiidae +isocarpic +isocarpous +isocellular +isocephalic +isocephalism +isocephalous +isocephaly +isocercal +isocercy +isochasm +isochasmic +isocheim +isocheimal +isocheimenal +isocheimic +isocheimonal +isochlor +isochlorophyll +isochlorophyllin +isocholanic +isocholesterin +isocholesterol +isochor +isochoric +isochromatic +isochronal +isochronally +isochrone +isochronic +isochronical +isochronism +isochronize +isochronon +isochronous +isochronously +isochroous +isocinchomeronic +isocinchonine +isocitric +isoclasite +isoclimatic +isoclinal +isocline +isoclinic +isocodeine +isocola +isocolic +isocolon +isocoria +isocorybulbin +isocorybulbine +isocorydine +isocoumarin +isocracy +isocrat +isocratic +isocreosol +isocrotonic +isocrymal +isocryme +isocrymic +isocyanate +isocyanic +isocyanide +isocyanine +isocyano +isocyanogen +isocyanurate +isocyanuric +isocyclic +isocymene +isocytic +isodactylism +isodactylous +isodiabatic +isodialuric +isodiametric +isodiametrical +isodiazo +isodiazotate +isodimorphic +isodimorphism +isodimorphous +isodomic +isodomous +isodomum +isodont +isodontous +isodrome +isodulcite +isodurene +isodynamia +isodynamic +isodynamical +isoelectric +isoelectrically +isoelectronic +isoelemicin +isoemodin +isoenergetic +isoerucic +Isoetaceae +Isoetales +Isoetes +isoeugenol +isoflavone +isoflor +isogamete +isogametic +isogametism +isogamic +isogamous +isogamy +isogen +isogenesis +isogenetic +isogenic +isogenotype +isogenotypic +isogenous +isogeny +isogeotherm +isogeothermal +isogeothermic +isogloss +isoglossal +isognathism +isognathous +isogon +isogonal +isogonality +isogonally +isogonic +isogoniostat +isogonism +isograft +isogram +isograph +isographic +isographical +isographically +isography +isogynous +isohaline +isohalsine +isohel +isohemopyrrole +isoheptane +isohesperidin +isohexyl +isohydric +isohydrocyanic +isohydrosorbic +isohyet +isohyetal +isoimmune +isoimmunity +isoimmunization +isoimmunize +isoindazole +isoindigotin +isoindole +isoionone +isokeraunic +isokeraunographic +isokeraunophonic +Isokontae +isokontan +isokurtic +isolability +isolable +isolapachol +isolate +isolated +isolatedly +isolating +isolation +isolationism +isolationist +isolative +Isolde +isolecithal +isoleucine +isolichenin +isolinolenic +isologous +isologue +isology +Isoloma +isolysin +isolysis +isomagnetic +isomaltose +isomastigate +isomelamine +isomenthone +isomer +Isomera +isomere +isomeric +isomerical +isomerically +isomeride +isomerism +isomerization +isomerize +isomeromorphism +isomerous +isomery +isometric +isometrical +isometrically +isometrograph +isometropia +isometry +isomorph +isomorphic +isomorphism +isomorphous +Isomyaria +isomyarian +isoneph +isonephelic +isonergic +isonicotinic +isonitramine +isonitrile +isonitroso +isonomic +isonomous +isonomy +isonuclear +isonym +isonymic +isonymy +isooleic +isoosmosis +isopachous +isopag +isoparaffin +isopectic +isopelletierin +isopelletierine +isopentane +isoperimeter +isoperimetric +isoperimetrical +isoperimetry +isopetalous +isophanal +isophane +isophasal +isophene +isophenomenal +isophoria +isophorone +isophthalic +isophthalyl +isophyllous +isophylly +isopicramic +isopiestic +isopiestically +isopilocarpine +isoplere +isopleth +Isopleura +isopleural +isopleuran +isopleurous +isopod +Isopoda +isopodan +isopodiform +isopodimorphous +isopodous +isopogonous +isopolite +isopolitical +isopolity +isopoly +isoprene +isopropenyl +isopropyl +isopropylacetic +isopropylamine +isopsephic +isopsephism +Isoptera +isopterous +isoptic +isopulegone +isopurpurin +isopycnic +isopyre +isopyromucic +isopyrrole +isoquercitrin +isoquinine +isoquinoline +isorcinol +isorhamnose +isorhodeose +isorithm +isorosindone +isorrhythmic +isorropic +isosaccharic +isosaccharin +isoscele +isosceles +isoscope +isoseismal +isoseismic +isoseismical +isoseist +isoserine +isosmotic +Isospondyli +isospondylous +isospore +isosporic +isosporous +isospory +isostasist +isostasy +isostatic +isostatical +isostatically +isostemonous +isostemony +isostere +isosteric +isosterism +isostrychnine +isosuccinic +isosulphide +isosulphocyanate +isosulphocyanic +isosultam +isotac +isoteles +isotely +isotheral +isothere +isotherm +isothermal +isothermally +isothermic +isothermical +isothermobath +isothermobathic +isothermous +isotherombrose +isothiocyanates +isothiocyanic +isothiocyano +isothujone +isotimal +isotome +isotomous +isotonia +isotonic +isotonicity +isotony +isotope +isotopic +isotopism +isotopy +isotrehalose +Isotria +isotrimorphic +isotrimorphism +isotrimorphous +isotron +isotrope +isotropic +isotropism +isotropous +isotropy +isotype +isotypic +isotypical +isovalerate +isovalerianate +isovalerianic +isovaleric +isovalerone +isovaline +isovanillic +isovoluminal +isoxanthine +isoxazine +isoxazole +isoxime +isoxylene +isoyohimbine +isozooid +ispaghul +ispravnik +Israel +Israeli +Israelite +Israeliteship +Israelitic +Israelitish +Israelitism +Israelitize +issanguila +Issedoi +Issedones +issei +issite +issuable +issuably +issuance +issuant +issue +issueless +issuer +issuing +ist +isthmi +Isthmia +isthmial +isthmian +isthmiate +isthmic +isthmoid +isthmus +istiophorid +Istiophoridae +Istiophorus +istle +istoke +Istrian +Istvaeones +isuret +isuretine +Isuridae +isuroid +Isurus +Iswara +it +Ita +itabirite +itacism +itacist +itacistic +itacolumite +itaconate +itaconic +Itala +Itali +Italian +Italianate +Italianately +Italianation +Italianesque +Italianish +Italianism +Italianist +Italianity +Italianization +Italianize +Italianizer +Italianly +Italic +Italical +Italically +Italican +Italicanist +Italici +Italicism +italicization +italicize +italics +Italiote +italite +Italomania +Italon +Italophile +itamalate +itamalic +itatartaric +itatartrate +Itaves +itch +itchiness +itching +itchingly +itchless +itchproof +itchreed +itchweed +itchy +itcze +Itea +Iteaceae +Itelmes +item +iteming +itemization +itemize +itemizer +itemy +Iten +Itenean +iter +iterable +iterance +iterancy +iterant +iterate +iteration +iterative +iteratively +iterativeness +Ithaca +Ithacan +Ithacensian +ithagine +Ithaginis +ither +Ithiel +ithomiid +Ithomiidae +Ithomiinae +ithyphallic +Ithyphallus +ithyphyllous +itineracy +itinerancy +itinerant +itinerantly +itinerarian +Itinerarium +itinerary +itinerate +itineration +itmo +Ito +Itoism +Itoist +Itoland +Itonama +Itonaman +Itonia +itonidid +Itonididae +itoubou +its +itself +Ituraean +iturite +Itylus +Itys +Itza +itzebu +iva +Ivan +ivied +ivin +ivoried +ivorine +ivoriness +ivorist +ivory +ivorylike +ivorytype +ivorywood +ivy +ivybells +ivyberry +ivyflower +ivylike +ivyweed +ivywood +ivywort +iwa +iwaiwa +iwis +Ixia +Ixiaceae +Ixiama +Ixil +Ixion +Ixionian +Ixodes +ixodian +ixodic +ixodid +Ixodidae +Ixora +iyo +Izar +izar +izard +Izcateco +Izdubar +izle +izote +iztle +izzard +J +j +Jaalin +jab +Jabarite +jabbed +jabber +jabberer +jabbering +jabberingly +jabberment +Jabberwock +jabberwockian +Jabberwocky +jabbing +jabbingly +jabble +jabers +jabia +jabiru +jaborandi +jaborine +jabot +jaboticaba +jabul +jacal +Jacaltec +Jacalteca +jacamar +Jacamaralcyon +jacameropine +Jacamerops +jacami +jacamin +Jacana +jacana +Jacanidae +Jacaranda +jacare +jacate +jacchus +jacent +jacinth +jacinthe +jack +jackal +jackanapes +jackanapish +jackaroo +jackass +jackassery +jackassification +jackassism +jackassness +jackbird +jackbox +jackboy +jackdaw +jackeen +jacker +jacket +jacketed +jacketing +jacketless +jacketwise +jackety +jackfish +jackhammer +jackknife +jackleg +jackman +jacko +jackpudding +jackpuddinghood +jackrod +jacksaw +jackscrew +jackshaft +jackshay +jacksnipe +Jackson +Jacksonia +Jacksonian +Jacksonite +jackstay +jackstone +jackstraw +jacktan +jackweed +jackwood +Jacky +Jacob +jacobaea +jacobaean +Jacobean +Jacobian +Jacobic +Jacobin +Jacobinia +Jacobinic +Jacobinical +Jacobinically +Jacobinism +Jacobinization +Jacobinize +Jacobite +Jacobitely +Jacobitiana +Jacobitic +Jacobitical +Jacobitically +Jacobitish +Jacobitishly +Jacobitism +jacobsite +jacobus +jacoby +jaconet +Jacqueminot +jactance +jactancy +jactant +jactation +jactitate +jactitation +jacu +jacuaru +jaculate +jaculation +jaculative +jaculator +jaculatorial +jaculatory +jaculiferous +Jacunda +jacutinga +jadder +jade +jaded +jadedly +jadedness +jadeite +jadery +jadesheen +jadeship +jadestone +jadish +jadishly +jadishness +jady +jaeger +jag +Jaga +Jagannath +Jagannatha +jagat +Jagatai +Jagataic +jager +jagged +jaggedly +jaggedness +jagger +jaggery +jaggy +jagir +jagirdar +jagla +jagless +jagong +jagrata +jagua +jaguar +jaguarete +Jahve +Jahvist +Jahvistic +jail +jailage +jailbird +jaildom +jailer +jaileress +jailering +jailership +jailhouse +jailish +jailkeeper +jaillike +jailmate +jailward +jailyard +Jain +Jaina +Jainism +Jainist +Jaipuri +jajman +Jake +jake +jakes +jako +Jakun +Jalalaean +jalap +jalapa +jalapin +jalkar +jalloped +jalopy +jalouse +jalousie +jalousied +jalpaite +Jam +jam +jama +Jamaica +Jamaican +jaman +jamb +jambalaya +jambeau +jambo +jambolan +jambone +jambool +jamboree +Jambos +jambosa +jambstone +jamdani +James +Jamesian +Jamesina +jamesonite +jami +Jamie +jamlike +jammedness +jammer +jammy +Jamnia +jampan +jampani +jamrosade +jamwood +janapa +janapan +Jane +jane +Janet +jangada +Janghey +jangkar +jangle +jangler +jangly +Janice +janiceps +Janiculan +Janiculum +Janiform +janissary +janitor +janitorial +janitorship +janitress +janitrix +Janizarian +Janizary +jank +janker +jann +jannock +Jansenism +Jansenist +Jansenistic +Jansenistical +Jansenize +Janthina +Janthinidae +jantu +janua +Januarius +January +Janus +Januslike +jaob +Jap +jap +japaconine +japaconitine +Japan +japan +Japanee +Japanese +Japanesque +Japanesquely +Japanesquery +Japanesy +Japanicize +Japanism +Japanization +Japanize +japanned +Japanner +japanner +japannery +Japannish +Japanolatry +Japanologist +Japanology +Japanophile +Japanophobe +Japanophobia +jape +japer +japery +Japetus +Japheth +Japhetic +Japhetide +Japhetite +japing +japingly +japish +japishly +japishness +Japonic +japonica +Japonically +Japonicize +Japonism +Japonize +Japonizer +Japygidae +japygoid +Japyx +Jaqueline +Jaquesian +jaquima +jar +jara +jaragua +jararaca +jararacussu +jarbird +jarble +jarbot +jardiniere +Jared +jarfly +jarful +jarg +jargon +jargonal +jargoneer +jargonelle +jargoner +jargonesque +jargonic +jargonish +jargonist +jargonistic +jargonium +jargonization +jargonize +jarkman +jarl +jarldom +jarless +jarlship +jarnut +jarool +jarosite +jarra +jarrah +jarring +jarringly +jarringness +jarry +jarvey +jasey +jaseyed +Jasione +Jasminaceae +jasmine +jasmined +jasminewood +Jasminum +jasmone +Jason +jaspachate +jaspagate +Jasper +jasper +jasperated +jaspered +jasperize +jasperoid +jaspery +jaspidean +jaspideous +jaspilite +jaspis +jaspoid +jasponyx +jaspopal +jass +jassid +Jassidae +jassoid +Jat +jatamansi +Jateorhiza +jateorhizine +jatha +jati +Jatki +Jatni +jato +Jatropha +jatrophic +jatrorrhizine +Jatulian +jaudie +jauk +jaun +jaunce +jaunder +jaundice +jaundiceroot +jaunt +jauntie +jauntily +jauntiness +jauntingly +jaunty +jaup +Java +Javahai +javali +Javan +Javanee +Javanese +javelin +javelina +javeline +javelineer +javer +Javitero +jaw +jawab +jawbation +jawbone +jawbreaker +jawbreaking +jawbreakingly +jawed +jawfall +jawfallen +jawfish +jawfoot +jawfooted +jawless +jawsmith +jawy +jay +jayhawk +jayhawker +jaypie +jaywalk +jaywalker +jazerant +Jazyges +jazz +jazzer +jazzily +jazziness +jazzy +jealous +jealously +jealousness +jealousy +Jeames +Jean +jean +Jeanie +Jeanne +Jeannette +Jeanpaulia +jeans +Jebus +Jebusi +Jebusite +Jebusitic +Jebusitical +Jebusitish +jecoral +jecorin +jecorize +jed +jedcock +jedding +jeddock +jeel +jeep +jeer +jeerer +jeering +jeeringly +jeerproof +jeery +jeewhillijers +jeewhillikens +jeff +jefferisite +Jeffersonia +Jeffersonian +Jeffersonianism +jeffersonite +Jehovah +Jehovic +Jehovism +Jehovist +Jehovistic +jehu +jehup +jejunal +jejunator +jejune +jejunely +jejuneness +jejunitis +jejunity +jejunoduodenal +jejunoileitis +jejunostomy +jejunotomy +jejunum +jelab +jelerang +jelick +jell +jellica +jellico +jellied +jelliedness +jellification +jellify +jellily +jelloid +jelly +jellydom +jellyfish +jellyleaf +jellylike +jelutong +Jem +jemadar +Jemez +Jemima +jemmily +jemminess +Jemmy +jemmy +jenkin +jenna +jennerization +jennerize +jennet +jenneting +Jennie +jennier +Jennifer +Jenny +jenny +Jenson +jentacular +jeofail +jeopard +jeoparder +jeopardize +jeopardous +jeopardously +jeopardousness +jeopardy +jequirity +Jerahmeel +Jerahmeelites +jerboa +jereed +jeremejevite +jeremiad +Jeremiah +Jeremian +Jeremianic +Jeremias +Jeremy +jerez +jerib +jerk +jerker +jerkily +jerkin +jerkined +jerkiness +jerkingly +jerkish +jerksome +jerkwater +jerky +jerl +jerm +jermonal +Jeroboam +Jerome +Jeromian +Jeronymite +jerque +jerquer +jerry +jerryism +Jersey +jersey +Jerseyan +jerseyed +Jerseyite +Jerseyman +jert +Jerusalem +jervia +jervina +jervine +jess +jessakeed +jessamine +jessamy +jessant +Jesse +Jessean +jessed +Jessica +Jessie +jessur +jest +jestbook +jestee +jester +jestful +jesting +jestingly +jestingstock +jestmonger +jestproof +jestwise +jestword +Jesu +Jesuate +Jesuit +Jesuited +Jesuitess +Jesuitic +Jesuitical +Jesuitically +Jesuitish +Jesuitism +Jesuitist +Jesuitize +Jesuitocracy +Jesuitry +Jesus +jet +jetbead +jete +Jethro +Jethronian +jetsam +jettage +jetted +jetter +jettied +jettiness +jettingly +jettison +jetton +jetty +jettyhead +jettywise +jetware +Jew +jewbird +jewbush +Jewdom +jewel +jeweler +jewelhouse +jeweling +jewelless +jewellike +jewelry +jewelsmith +jewelweed +jewely +Jewess +jewfish +Jewhood +Jewish +Jewishly +Jewishness +Jewism +Jewless +Jewlike +Jewling +Jewry +Jewship +Jewstone +Jewy +jezail +Jezebel +Jezebelian +Jezebelish +jezekite +jeziah +Jezreelite +jharal +jheel +jhool +jhow +Jhuria +jib +jibbah +jibber +jibbings +jibby +jibe +jibhead +jibi +jibman +jiboa +jibstay +jicama +Jicaque +Jicaquean +jicara +Jicarilla +jiff +jiffle +jiffy +jig +jigamaree +jigger +jiggerer +jiggerman +jiggers +jigget +jiggety +jigginess +jiggish +jiggle +jiggly +jiggumbob +jiggy +jiglike +jigman +jihad +jikungu +jillet +jillflirt +jilt +jiltee +jilter +jiltish +Jim +jimbang +jimberjaw +jimberjawed +jimjam +jimmy +jimp +jimply +jimpness +jimpricute +jimsedge +jina +jincamas +Jincan +jing +jingal +jingbang +jingle +jingled +jinglejangle +jingler +jinglet +jingling +jinglingly +jingly +jingo +jingodom +jingoish +jingoism +jingoist +jingoistic +jinja +jinjili +jink +jinker +jinket +jinkle +jinks +jinn +jinnestan +jinni +jinniwink +jinniyeh +jinny +jinriki +jinrikiman +jinrikisha +jinshang +jinx +jipijapa +jipper +jiqui +jirble +jirga +jirkinet +jiti +jitneur +jitneuse +jitney +jitneyman +jitro +jitter +jitterbug +jitters +jittery +jiva +Jivaran +Jivaro +Jivaroan +jive +jixie +Jo +jo +Joachimite +Joan +Joanna +Joannite +joaquinite +Job +job +jobade +jobarbe +jobation +jobber +jobbernowl +jobbernowlism +jobbery +jobbet +jobbing +jobbish +jobble +jobholder +jobless +joblessness +jobman +jobmaster +jobmistress +jobmonger +jobo +jobsmith +Jocasta +Jocelin +Joceline +Jocelyn +joch +Jock +jock +jocker +jockey +jockeydom +jockeyish +jockeyism +jockeylike +jockeyship +jocko +jockteleg +jocoque +jocose +jocosely +jocoseness +jocoseriosity +jocoserious +jocosity +jocote +jocu +jocular +jocularity +jocularly +jocularness +joculator +jocum +jocuma +jocund +jocundity +jocundly +jocundness +jodel +jodelr +jodhpurs +Jodo +Joe +joe +joebush +Joel +joewood +Joey +joey +jog +jogger +joggle +joggler +jogglety +jogglework +joggly +jogtrottism +Johann +Johanna +Johannean +Johannes +johannes +Johannine +Johannisberger +Johannist +Johannite +johannite +John +Johnadreams +Johnian +johnin +Johnny +johnnycake +johnnydom +Johnsmas +Johnsonese +Johnsonian +Johnsoniana +Johnsonianism +Johnsonianly +Johnsonism +johnstrupite +join +joinable +joinant +joinder +joiner +joinery +joining +joiningly +joint +jointage +jointed +jointedly +jointedness +jointer +jointing +jointist +jointless +jointly +jointress +jointure +jointureless +jointuress +jointweed +jointworm +jointy +joist +joisting +joistless +jojoba +joke +jokeless +jokelet +jokeproof +joker +jokesmith +jokesome +jokesomeness +jokester +jokingly +jokish +jokist +jokul +joky +joll +jolleyman +jollier +jollification +jollify +jollily +jolliness +jollity +jollop +jolloped +jolly +jollytail +Joloano +jolt +jolter +jolterhead +jolterheaded +jolterheadedness +jolthead +joltiness +jolting +joltingly +joltless +joltproof +jolty +Jonah +Jonahesque +Jonahism +Jonas +Jonathan +Jonathanization +Jonesian +jonglery +jongleur +jonque +jonquil +jonquille +Jonsonian +Jonval +jonvalization +jonvalize +jookerie +joola +joom +Jophiel +Jordan +jordan +Jordanian +jordanite +joree +Jorist +jorum +josefite +joseite +Joseph +Josepha +Josephine +Josephinism +josephinite +Josephism +Josephite +josh +josher +joshi +Joshua +Josiah +josie +joskin +joss +jossakeed +josser +jostle +jostlement +jostler +jot +jota +jotation +jotisi +Jotnian +jotter +jotting +jotty +joubarb +joug +jough +jouk +joukerypawkery +joule +joulean +joulemeter +jounce +journal +journalese +journalish +journalism +journalist +journalistic +journalistically +journalization +journalize +journalizer +journey +journeycake +journeyer +journeying +journeyman +journeywoman +journeywork +journeyworker +jours +joust +jouster +Jova +Jove +Jovial +jovial +jovialist +jovialistic +joviality +jovialize +jovially +jovialness +jovialty +Jovian +Jovianly +Jovicentric +Jovicentrical +Jovicentrically +jovilabe +Joviniamish +Jovinian +Jovinianist +Jovite +jow +jowar +jowari +jowel +jower +jowery +jowl +jowler +jowlish +jowlop +jowly +jowpy +jowser +jowter +joy +joyance +joyancy +joyant +Joyce +joyful +joyfully +joyfulness +joyhop +joyleaf +joyless +joylessly +joylessness +joylet +joyous +joyously +joyousness +joyproof +joysome +joyweed +Jozy +Ju +Juang +juba +jubate +jubbah +jubbe +jube +juberous +jubilance +jubilancy +jubilant +jubilantly +jubilarian +jubilate +jubilatio +jubilation +jubilatory +jubilean +jubilee +jubilist +jubilization +jubilize +jubilus +juck +juckies +Jucuna +jucundity +jud +Judaeomancy +Judaeophile +Judaeophilism +Judaeophobe +Judaeophobia +Judah +Judahite +Judaic +Judaica +Judaical +Judaically +Judaism +Judaist +Judaistic +Judaistically +Judaization +Judaize +Judaizer +Judas +Judaslike +judcock +Jude +Judean +judex +judge +judgeable +judgelike +judger +judgeship +judgingly +judgmatic +judgmatical +judgmatically +judgment +Judica +judicable +judicate +judication +judicative +judicator +judicatorial +judicatory +judicature +judices +judiciable +judicial +judiciality +judicialize +judicially +judicialness +judiciarily +judiciary +judicious +judiciously +judiciousness +Judith +judo +Judophobism +Judy +jufti +jug +Juga +jugal +jugale +Jugatae +jugate +jugated +jugation +juger +jugerum +jugful +jugger +Juggernaut +juggernaut +Juggernautish +juggins +juggle +jugglement +juggler +jugglery +juggling +jugglingly +Juglandaceae +juglandaceous +Juglandales +juglandin +Juglans +juglone +jugular +Jugulares +jugulary +jugulate +jugulum +jugum +Jugurthine +juice +juiceful +juiceless +juicily +juiciness +juicy +jujitsu +juju +jujube +jujuism +jujuist +juke +jukebox +Jule +julep +Jules +Juletta +Julia +Julian +Juliana +Julianist +julid +Julidae +julidan +Julie +Julien +julienite +julienne +Juliet +Julietta +julio +Julius +juloid +Juloidea +juloidian +julole +julolidin +julolidine +julolin +juloline +Julus +July +Julyflower +Jumada +Jumana +jumart +jumba +jumble +jumblement +jumbler +jumblingly +jumbly +jumbo +jumboesque +jumboism +jumbuck +jumby +jumelle +jument +jumentous +jumfru +jumillite +jumma +jump +jumpable +jumper +jumperism +jumpiness +jumpingly +jumpness +jumprock +jumpseed +jumpsome +jumpy +Juncaceae +juncaceous +Juncaginaceae +juncaginaceous +juncagineous +junciform +juncite +Junco +Juncoides +juncous +junction +junctional +junctive +juncture +Juncus +June +june +Juneberry +Junebud +junectomy +Juneflower +Jungermannia +Jungermanniaceae +jungermanniaceous +Jungermanniales +jungle +jungled +jungleside +junglewards +junglewood +jungli +jungly +juniata +junior +juniorate +juniority +juniorship +juniper +Juniperaceae +Juniperus +Junius +junk +junkboard +Junker +junker +Junkerdom +junkerdom +junkerish +Junkerism +junkerism +junket +junketer +junketing +junking +junkman +Juno +Junoesque +Junonia +Junonian +junt +junta +junto +jupati +jupe +Jupiter +jupon +Jur +Jura +jural +jurally +jurament +juramentado +juramental +juramentally +juramentum +Jurane +jurant +jurara +Jurassic +jurat +juration +jurative +jurator +juratorial +juratory +jure +jurel +juridic +juridical +juridically +juring +jurisconsult +jurisdiction +jurisdictional +jurisdictionalism +jurisdictionally +jurisdictive +jurisprudence +jurisprudent +jurisprudential +jurisprudentialist +jurisprudentially +jurist +juristic +juristical +juristically +juror +jurupaite +jury +juryless +juryman +jurywoman +jusquaboutisme +jusquaboutist +jussel +Jussiaea +Jussiaean +Jussieuan +jussion +jussive +jussory +just +justen +justice +justicehood +justiceless +justicelike +justicer +justiceship +justiceweed +Justicia +justiciability +justiciable +justicial +justiciar +justiciarship +justiciary +justiciaryship +justicies +justifiability +justifiable +justifiableness +justifiably +justification +justificative +justificator +justificatory +justifier +justify +justifying +justifyingly +Justin +Justina +Justine +Justinian +Justinianian +Justinianist +justly +justment +justness +justo +Justus +jut +Jute +jute +Jutic +Jutish +jutka +Jutlander +Jutlandish +jutting +juttingly +jutty +Juturna +Juvavian +juvenal +Juvenalian +juvenate +juvenescence +juvenescent +juvenile +juvenilely +juvenileness +juvenilify +juvenilism +juvenility +juvenilize +Juventas +juventude +Juverna +juvia +juvite +juxtalittoral +juxtamarine +juxtapose +juxtaposit +juxtaposition +juxtapositional +juxtapositive +juxtapyloric +juxtaspinal +juxtaterrestrial +juxtatropical +Juyas +Juza +Jynginae +jyngine +Jynx +jynx +K +k +ka +Kababish +Kabaka +kabaragoya +Kabard +Kabardian +kabaya +Kabbeljaws +kabel +kaberu +kabiet +Kabirpanthi +Kabistan +Kabonga +kabuki +Kabuli +Kabyle +Kachari +Kachin +kachin +Kadaga +Kadarite +kadaya +Kadayan +Kaddish +kadein +kadikane +kadischi +Kadmi +kados +Kadu +kaempferol +Kaf +Kafa +kaferita +Kaffir +kaffir +kaffiyeh +Kaffraria +Kaffrarian +Kafir +kafir +Kafiri +kafirin +kafiz +kafta +kago +kagu +kaha +kahar +kahau +kahikatea +kahili +kahu +kahuna +kai +Kaibab +Kaibartha +kaid +kaik +kaikara +kaikawaka +kail +kailyard +kailyarder +kailyardism +Kaimo +Kainah +kainga +kainite +kainsi +kainyn +kairine +kairoline +kaiser +kaiserdom +kaiserism +kaisership +kaitaka +Kaithi +kaiwhiria +kaiwi +Kajar +kajawah +kajugaru +kaka +Kakan +kakapo +kakar +kakarali +kakariki +Kakatoe +Kakatoidae +kakawahie +kaki +kakidrosis +kakistocracy +kakkak +kakke +kakortokite +kala +kaladana +kalamalo +kalamansanai +Kalamian +Kalanchoe +Kalandariyah +Kalang +Kalapooian +kalasie +Kaldani +kale +kaleidophon +kaleidophone +kaleidoscope +kaleidoscopic +kaleidoscopical +kaleidoscopically +Kalekah +kalema +Kalendae +kalends +kalewife +kaleyard +kali +kalian +Kaliana +kaliborite +kalidium +kaliform +kaligenous +Kalinga +kalinite +kaliophilite +kalipaya +Kalispel +kalium +kallah +kallege +kallilite +Kallima +kallitype +Kalmarian +Kalmia +Kalmuck +kalo +kalogeros +kalokagathia +kalon +kalong +kalpis +kalsomine +kalsominer +kalumpang +kalumpit +Kalwar +kalymmaukion +kalymmocyte +kamachile +kamacite +kamahi +kamala +kamaloka +kamansi +kamao +Kamares +kamarezite +kamarupa +kamarupic +kamas +Kamasin +Kamass +kamassi +Kamba +kambal +kamboh +Kamchadal +Kamchatkan +kame +kameeldoorn +kameelthorn +kamelaukion +kamerad +kamias +kamichi +kamik +kamikaze +kammalan +kammererite +kamperite +kampong +kamptomorph +kan +kana +kanae +kanagi +Kanaka +kanap +kanara +Kanarese +kanari +kanat +Kanauji +Kanawari +Kanawha +kanchil +kande +Kandelia +kandol +kaneh +kanephore +kanephoros +Kaneshite +Kanesian +kang +kanga +kangani +kangaroo +kangarooer +Kangli +Kanji +Kankanai +kankie +kannume +kanoon +Kanred +kans +Kansa +Kansan +kantele +kanteletar +kanten +Kantian +Kantianism +Kantism +Kantist +Kanuri +Kanwar +kaoliang +kaolin +kaolinate +kaolinic +kaolinite +kaolinization +kaolinize +kapa +kapai +kapeika +kapok +kapp +kappa +kappe +kappland +kapur +kaput +Karabagh +karagan +Karaism +Karaite +Karaitism +karaka +Karakatchan +Karakul +karakul +Karamojo +karamu +Karatas +Karaya +karaya +karbi +karch +kareao +kareeta +Karel +karela +Karelian +Karen +Karharbari +karite +Karling +Karluk +karma +Karmathian +karmic +karmouth +karo +kaross +karou +karree +karri +Karroo +karroo +karrusel +karsha +Karshuni +Karst +karst +karstenite +karstic +kartel +Karthli +kartometer +kartos +Kartvel +Kartvelian +karwar +Karwinskia +karyaster +karyenchyma +karyochrome +karyochylema +karyogamic +karyogamy +karyokinesis +karyokinetic +karyologic +karyological +karyologically +karyology +karyolymph +Karyolysidae +karyolysis +Karyolysus +karyolytic +karyomere +karyomerite +karyomicrosome +karyomitoic +karyomitome +karyomiton +karyomitosis +karyomitotic +karyon +karyoplasm +karyoplasma +karyoplasmatic +karyoplasmic +karyopyknosis +karyorrhexis +karyoschisis +karyosome +karyotin +karyotype +kasa +kasbah +kasbeke +kascamiol +Kasha +Kashan +kasher +kashga +kashi +kashima +Kashmiri +Kashmirian +Kashoubish +kashruth +Kashube +Kashubian +Kashyapa +kasida +Kasikumuk +Kaska +Kaskaskia +kasm +kasolite +kassabah +Kassak +Kassite +kassu +kastura +Kasubian +kat +Katabanian +katabasis +katabatic +katabella +katabolic +katabolically +katabolism +katabolite +katabolize +katabothron +katachromasis +katacrotic +katacrotism +katagenesis +katagenetic +katakana +katakinesis +katakinetic +katakinetomer +katakinetomeric +katakiribori +katalase +katalysis +katalyst +katalytic +katalyze +katamorphism +kataphoresis +kataphoretic +kataphoric +kataphrenia +kataplasia +kataplectic +kataplexy +katar +katastate +katastatic +katathermometer +katatonia +katatonic +katatype +katchung +katcina +Kate +kath +Katha +katha +kathal +Katharina +Katharine +katharometer +katharsis +kathartic +kathemoglobin +kathenotheism +Kathleen +kathodic +Kathopanishad +Kathy +Katie +Katik +Katinka +katipo +Katipunan +Katipuneros +katmon +katogle +Katrine +Katrinka +katsup +Katsuwonidae +katuka +Katukina +katun +katurai +Katy +katydid +Kauravas +kauri +kava +kavaic +kavass +Kavi +Kaw +kawaka +Kawchodinne +kawika +Kay +kay +kayak +kayaker +Kayan +Kayasth +Kayastha +kayles +kayo +Kazak +kazi +kazoo +kea +keach +keacorn +Keatsian +keawe +keb +kebbie +kebbuck +kechel +keck +keckle +keckling +kecksy +kecky +ked +Kedar +Kedarite +keddah +kedge +kedger +kedgeree +kedlock +Kedushshah +keech +keek +keeker +keel +keelage +keelbill +keelblock +keelboat +keelboatman +keeled +keeler +keelfat +keelhale +keelhaul +keelie +keeling +keelivine +keelless +keelman +keelrake +keelson +keen +keena +keened +keener +keenly +keenness +keep +keepable +keeper +keeperess +keepering +keeperless +keepership +keeping +keepsake +keepsaky +keepworthy +keerogue +keeshond +keest +keet +keeve +Keewatin +kef +keffel +kefir +kefiric +Kefti +Keftian +Keftiu +keg +kegler +kehaya +kehillah +kehoeite +Keid +keilhauite +keita +keitloa +Kekchi +kekotene +kekuna +kelchin +keld +Kele +kele +kelebe +kelectome +keleh +kelek +kelep +Kelima +kelk +kell +kella +kellion +kellupweed +kelly +keloid +keloidal +kelp +kelper +kelpfish +kelpie +kelpware +kelpwort +kelpy +kelt +kelter +Keltoi +kelty +kelvin +kelyphite +Kemalism +Kemalist +kemb +kemp +kemperyman +kempite +kemple +kempster +kempt +kempy +ken +kenaf +Kenai +kenareh +kench +kend +kendir +kendyr +Kenelm +Kenipsim +kenlore +kenmark +Kennebec +kennebecker +kennebunker +Kennedya +kennel +kennelly +kennelman +kenner +Kenneth +kenning +kenningwort +kenno +keno +kenogenesis +kenogenetic +kenogenetically +kenogeny +kenosis +kenotic +kenoticism +kenoticist +kenotism +kenotist +kenotoxin +kenotron +Kenseikai +kensington +Kensitite +kenspac +kenspeck +kenspeckle +kent +kentallenite +Kentia +Kenticism +Kentish +Kentishman +kentledge +kentrogon +kentrolite +Kentuckian +Kentucky +kenyte +kep +kepi +Keplerian +kept +Ker +keracele +keralite +kerana +keraphyllocele +keraphyllous +kerasin +kerasine +kerat +keratalgia +keratectasia +keratectomy +Keraterpeton +keratin +keratinization +keratinize +keratinoid +keratinose +keratinous +keratitis +keratoangioma +keratocele +keratocentesis +keratoconjunctivitis +keratoconus +keratocricoid +keratode +keratodermia +keratogenic +keratogenous +keratoglobus +keratoglossus +keratohelcosis +keratohyal +keratoid +Keratoidea +keratoiritis +Keratol +keratoleukoma +keratolysis +keratolytic +keratoma +keratomalacia +keratome +keratometer +keratometry +keratomycosis +keratoncus +keratonosus +keratonyxis +keratophyre +keratoplastic +keratoplasty +keratorrhexis +keratoscope +keratoscopy +keratose +keratosis +keratotome +keratotomy +keratto +keraulophon +keraulophone +Keraunia +keraunion +keraunograph +keraunographic +keraunography +keraunophone +keraunophonic +keraunoscopia +keraunoscopy +kerbstone +kerchief +kerchiefed +kerchoo +kerchug +kerchunk +kerectomy +kerel +Keres +Keresan +Kerewa +kerf +kerflap +kerflop +kerflummox +Kerite +Kermanji +Kermanshah +kermes +kermesic +kermesite +kermis +kern +kernel +kerneled +kernelless +kernelly +kerner +kernetty +kernish +kernite +kernos +kerogen +kerosene +kerplunk +Kerria +kerrie +kerrikerri +kerril +kerrite +Kerry +kerry +kersantite +kersey +kerseymere +kerslam +kerslosh +kersmash +kerugma +kerwham +kerygma +kerygmatic +kerykeion +kerystic +kerystics +Keryx +kesslerman +kestrel +ket +keta +ketal +ketapang +ketazine +ketch +ketchcraft +ketchup +ketembilla +keten +ketene +ketimide +ketimine +ketipate +ketipic +keto +ketogen +ketogenesis +ketogenic +ketoheptose +ketohexose +ketoketene +ketol +ketole +ketolysis +ketolytic +ketone +ketonemia +ketonic +ketonimid +ketonimide +ketonimin +ketonimine +ketonization +ketonize +ketonuria +ketose +ketoside +ketosis +ketosuccinic +ketoxime +kette +ketting +kettle +kettlecase +kettledrum +kettledrummer +kettleful +kettlemaker +kettlemaking +kettler +ketty +Ketu +ketuba +ketupa +ketyl +keup +Keuper +keurboom +kevalin +kevel +kevelhead +kevutzah +Keweenawan +keweenawite +kewpie +kex +kexy +key +keyage +keyboard +keyed +keyhole +keyless +keylet +keylock +Keynesian +Keynesianism +keynote +keynoter +keyseater +keyserlick +keysmith +keystone +keystoned +Keystoner +keyway +Kha +khaddar +khadi +khagiarite +khahoon +khaiki +khair +khaja +khajur +khakanship +khaki +khakied +Khaldian +khalifa +Khalifat +Khalkha +khalsa +Khami +khamsin +Khamti +khan +khanate +khanda +khandait +khanjar +khanjee +khankah +khansamah +khanum +khar +kharaj +Kharia +Kharijite +Kharoshthi +kharouba +kharroubah +Khartoumer +kharua +Kharwar +Khasa +Khasi +khass +khat +khatib +khatri +Khatti +Khattish +Khaya +Khazar +Khazarian +khediva +khedival +khedivate +khedive +khediviah +khedivial +khediviate +khepesh +Kherwari +Kherwarian +khet +Khevzur +khidmatgar +Khila +khilat +khir +khirka +Khitan +Khivan +Khlysti +Khmer +Khoja +khoja +khoka +Khokani +Khond +Khorassan +khot +Khotan +Khotana +Khowar +khu +Khuai +khubber +khula +khuskhus +Khussak +khutbah +khutuktu +Khuzi +khvat +Khwarazmian +kiack +kiaki +kialee +kiang +Kiangan +kiaugh +kibber +kibble +kibbler +kibblerman +kibe +kibei +kibitka +kibitz +kibitzer +kiblah +kibosh +kiby +kick +kickable +Kickapoo +kickback +kickee +kicker +kicking +kickish +kickless +kickoff +kickout +kickseys +kickshaw +kickup +Kidder +kidder +Kidderminster +kiddier +kiddish +kiddush +kiddushin +kiddy +kidhood +kidlet +kidling +kidnap +kidnapee +kidnaper +kidney +kidneyroot +kidneywort +Kids +kidskin +kidsman +kiefekil +Kieffer +kiekie +kiel +kier +kieselguhr +kieserite +kiestless +kieye +Kiho +kikar +Kikatsik +kikawaeo +kike +kiki +Kikongo +kiku +kikuel +kikumon +Kikuyu +kil +kiladja +kilah +kilampere +kilan +kilbrickenite +kildee +kilderkin +kileh +kilerg +kiley +Kilhamite +kilhig +kiliare +kilim +kill +killable +killadar +Killarney +killas +killcalf +killcrop +killcu +killdeer +killeekillee +killeen +killer +killick +killifish +killing +killingly +killingness +killinite +killogie +killweed +killwort +killy +Kilmarnock +kiln +kilneye +kilnhole +kilnman +kilnrib +kilo +kiloampere +kilobar +kilocalorie +kilocycle +kilodyne +kilogauss +kilogram +kilojoule +kiloliter +kilolumen +kilometer +kilometrage +kilometric +kilometrical +kiloparsec +kilostere +kiloton +kilovar +kilovolt +kilowatt +kilp +kilt +kilter +kiltie +kilting +Kiluba +Kim +kim +kimbang +kimberlin +kimberlite +Kimbundu +Kimeridgian +kimigayo +kimnel +kimono +kimonoed +kin +kina +kinaesthesia +kinaesthesis +kinah +kinase +kinbote +kinch +kinchin +kinchinmort +kincob +kind +kindergarten +kindergartener +kindergartening +kindergartner +Kinderhook +kindheart +kindhearted +kindheartedly +kindheartedness +kindle +kindler +kindlesome +kindlily +kindliness +kindling +kindly +kindness +kindred +kindredless +kindredly +kindredness +kindredship +kinematic +kinematical +kinematically +kinematics +kinematograph +kinemometer +kineplasty +kinepox +kinesalgia +kinescope +kinesiatric +kinesiatrics +kinesic +kinesics +kinesimeter +kinesiologic +kinesiological +kinesiology +kinesiometer +kinesis +kinesitherapy +kinesodic +kinesthesia +kinesthesis +kinesthetic +kinetic +kinetical +kinetically +kinetics +kinetochore +kinetogenesis +kinetogenetic +kinetogenetically +kinetogenic +kinetogram +kinetograph +kinetographer +kinetographic +kinetography +kinetomer +kinetomeric +kinetonema +kinetonucleus +kinetophone +kinetophonograph +kinetoplast +kinetoscope +kinetoscopic +king +kingbird +kingbolt +kingcob +kingcraft +kingcup +kingdom +kingdomed +kingdomful +kingdomless +kingdomship +kingfish +kingfisher +kinghead +kinghood +kinghunter +kingless +kinglessness +kinglet +kinglihood +kinglike +kinglily +kingliness +kingling +kingly +kingmaker +kingmaking +kingpiece +kingpin +kingrow +kingship +kingsman +Kingu +kingweed +kingwood +Kinipetu +kink +kinkable +kinkaider +kinkajou +kinkcough +kinkhab +kinkhost +kinkily +kinkiness +kinkle +kinkled +kinkly +kinksbush +kinky +kinless +kinnikinnick +kino +kinofluous +kinology +kinoplasm +kinoplasmic +Kinorhyncha +kinospore +Kinosternidae +Kinosternon +kinotannic +kinsfolk +kinship +kinsman +kinsmanly +kinsmanship +kinspeople +kinswoman +kintar +Kintyre +kioea +Kioko +kiosk +kiotome +Kiowa +Kiowan +Kioway +kip +kipage +Kipchak +kipe +Kiplingese +Kiplingism +kippeen +kipper +kipperer +kippy +kipsey +kipskin +Kiranti +Kirghiz +Kirghizean +kiri +Kirillitsa +kirimon +kirk +kirker +kirkify +kirking +kirkinhead +kirklike +kirkman +kirktown +kirkward +kirkyard +Kirman +kirmew +kirn +kirombo +kirsch +Kirsty +kirtle +kirtled +Kirundi +kirve +kirver +kischen +kish +Kishambala +kishen +kishon +kishy +kiskatom +Kislev +kismet +kismetic +kisra +kiss +kissability +kissable +kissableness +kissage +kissar +kisser +kissing +kissingly +kissproof +kisswise +kissy +kist +kistful +kiswa +Kiswahili +Kit +kit +kitab +kitabis +Kitalpha +Kitamat +Kitan +kitar +kitcat +kitchen +kitchendom +kitchener +kitchenette +kitchenful +kitchenless +kitchenmaid +kitchenman +kitchenry +kitchenward +kitchenwards +kitchenware +kitchenwife +kitcheny +kite +kiteflier +kiteflying +kith +kithe +kithless +kitish +Kitkahaxki +Kitkehahki +kitling +Kitlope +Kittatinny +kittel +kitten +kittendom +kittenhearted +kittenhood +kittenish +kittenishly +kittenishness +kittenless +kittenship +kitter +kittereen +kitthoge +kittiwake +kittle +kittlepins +kittles +kittlish +kittly +kittock +kittul +Kitty +kitty +kittysol +Kitunahan +kiva +kiver +kivikivi +kivu +Kiwai +Kiwanian +Kiwanis +kiwi +kiwikiwi +kiyas +kiyi +Kizil +Kizilbash +Kjeldahl +kjeldahlization +kjeldahlize +klafter +klaftern +klam +Klamath +Klan +Klanism +Klansman +Klanswoman +klaprotholite +Klaskino +klavern +Klaxon +klaxon +Klebsiella +kleeneboc +Kleinian +Kleistian +klendusic +klendusity +klendusive +klepht +klephtic +klephtism +kleptic +kleptistic +kleptomania +kleptomaniac +kleptomanist +kleptophobia +klicket +Klikitat +Kling +Klingsor +klip +klipbok +klipdachs +klipdas +klipfish +klippe +klippen +klipspringer +klister +klockmannite +klom +Klondike +Klondiker +klootchman +klop +klops +klosh +Kluxer +klystron +kmet +knab +knabble +knack +knackebrod +knacker +knackery +knacky +knag +knagged +knaggy +knap +knapbottle +knape +knappan +knapper +knappish +knappishly +knapsack +knapsacked +knapsacking +knapweed +knar +knark +knarred +knarry +Knautia +knave +knavery +knaveship +knavess +knavish +knavishly +knavishness +knawel +knead +kneadability +kneadable +kneader +kneading +kneadingly +knebelite +knee +kneebrush +kneecap +kneed +kneehole +kneel +kneeler +kneelet +kneeling +kneelingly +kneepad +kneepan +kneepiece +kneestone +Kneiffia +Kneippism +knell +knelt +Knesset +knet +knew +knez +knezi +kniaz +kniazi +knick +knicker +Knickerbocker +knickerbockered +knickerbockers +knickered +knickers +knickknack +knickknackatory +knickknacked +knickknackery +knickknacket +knickknackish +knickknacky +knickpoint +knife +knifeboard +knifeful +knifeless +knifelike +knifeman +knifeproof +knifer +knifesmith +knifeway +knight +knightage +knightess +knighthead +knighthood +Knightia +knightless +knightlihood +knightlike +knightliness +knightling +knightly +knightship +knightswort +Kniphofia +Knisteneaux +knit +knitback +knitch +knitted +knitter +knitting +knittle +knitwear +knitweed +knitwork +knived +knivey +knob +knobbed +knobber +knobbiness +knobble +knobbler +knobbly +knobby +knobkerrie +knoblike +knobstick +knobstone +knobular +knobweed +knobwood +knock +knockabout +knockdown +knockemdown +knocker +knocking +knockless +knockoff +knockout +knockstone +knockup +knoll +knoller +knolly +knop +knopite +knopped +knopper +knoppy +knopweed +knorhaan +Knorria +knosp +knosped +Knossian +knot +knotberry +knotgrass +knothole +knothorn +knotless +knotlike +knotroot +knotted +knotter +knottily +knottiness +knotting +knotty +knotweed +knotwork +knotwort +knout +know +knowability +knowable +knowableness +knowe +knower +knowing +knowingly +knowingness +knowledge +knowledgeable +knowledgeableness +knowledgeably +knowledged +knowledgeless +knowledgement +knowledging +known +knowperts +Knoxian +Knoxville +knoxvillite +knub +knubbly +knubby +knublet +knuckle +knucklebone +knuckled +knuckler +knuckling +knuckly +knuclesome +knur +knurl +knurled +knurling +knurly +Knut +knut +knutty +knyaz +knyazi +Ko +ko +koa +koae +koala +koali +Koasati +kob +koban +kobellite +kobi +kobird +kobold +kobong +kobu +Kobus +Koch +Kochab +Kochia +kochliarion +koda +Kodagu +Kodak +kodak +kodaker +kodakist +kodakry +Kodashim +kodro +kodurite +Koeberlinia +Koeberliniaceae +koeberliniaceous +koechlinite +Koeksotenok +koel +Koellia +Koelreuteria +koenenite +Koeri +koff +koft +koftgar +koftgari +koggelmannetje +Kogia +Kohathite +Koheleth +kohemp +Kohen +Kohistani +Kohl +kohl +Kohlan +kohlrabi +kohua +koi +Koiari +Koibal +koil +koila +koilanaglyphic +koilon +koimesis +Koine +koine +koinon +koinonia +Koipato +Koitapu +kojang +Kojiki +kokako +kokam +kokan +kokerboom +kokil +kokio +koklas +koklass +Koko +koko +kokoon +Kokoona +kokoromiko +kokowai +kokra +koksaghyz +koku +kokum +kokumin +kokumingun +Kol +kola +kolach +Kolarian +Koldaji +kolea +koleroga +kolhoz +Koli +kolinski +kolinsky +Kolis +kolkhos +kolkhoz +kollast +kollaster +koller +kollergang +kolo +kolobion +kolobus +kolokolo +kolsun +koltunna +koltunnor +Koluschan +Kolush +Komati +komatik +kombu +Kome +Komi +kominuter +kommetje +kommos +komondor +kompeni +Komsomol +kon +kona +konak +Konariot +Konde +Kongo +Kongoese +Kongolese +kongoni +kongsbergite +kongu +Konia +Koniaga +Koniga +konimeter +koninckite +konini +koniology +koniscope +konjak +Konkani +Konomihu +konstantin +kontakion +Konyak +kooka +kookaburra +kookeree +kookery +kookri +koolah +kooletah +kooliman +koolokamba +Koolooly +koombar +koomkie +Koorg +kootcha +Kootenay +kop +Kopagmiut +kopeck +koph +kopi +koppa +koppen +koppite +Koprino +kor +Kora +kora +koradji +Korah +Korahite +Korahitic +korait +korakan +Koran +Korana +Koranic +Koranist +korari +Kore +kore +Korean +korec +koreci +Koreish +Koreishite +korero +Koreshan +Koreshanity +kori +korimako +korin +Kornephorus +kornerupine +kornskeppa +kornskeppur +korntonde +korntonder +korntunna +korntunnur +Koroa +koromika +koromiko +korona +korova +korrel +korrigum +korumburra +koruna +Korwa +Koryak +korymboi +korymbos +korzec +kos +Kosalan +Koschei +kosher +Kosimo +kosin +kosmokrator +Koso +kosong +kosotoxin +Kossaean +Kossean +Kosteletzkya +koswite +Kota +kotal +Kotar +koto +Kotoko +kotschubeite +kottigite +kotuku +kotukutuku +kotwal +kotwalee +kotyle +kotylos +kou +koulan +Koungmiut +kouza +kovil +Kowagmiut +kowhai +kowtow +koyan +kozo +Kpuesi +Kra +kra +kraal +kraft +Krag +kragerite +krageroite +krait +kraken +krakowiak +kral +Krama +krama +Krameria +Krameriaceae +krameriaceous +kran +krantzite +Krapina +kras +krasis +kratogen +kratogenic +Kraunhia +kraurite +kraurosis +kraurotic +krausen +krausite +kraut +kreis +Kreistag +kreistle +kreittonite +krelos +kremersite +kremlin +krems +kreng +krennerite +Krepi +kreplech +kreutzer +kriegspiel +krieker +Krigia +krimmer +krina +Kriophoros +Krishna +Krishnaism +Krishnaist +Krishnaite +Krishnaitic +Kristinaux +krisuvigite +kritarchy +Krithia +kritrima +krobyloi +krobylos +krocket +krohnkite +krome +kromeski +kromogram +kromskop +krona +krone +kronen +kroner +Kronion +kronor +kronur +Kroo +kroon +krosa +krouchka +kroushka +Kru +Krugerism +Krugerite +Kruman +krummhorn +kryokonite +krypsis +kryptic +krypticism +kryptocyanine +kryptol +kryptomere +krypton +Kshatriya +Kshatriyahood +Kua +Kuan +kuan +Kuar +Kuba +kuba +Kubachi +Kubanka +kubba +Kubera +kubuklion +Kuchean +kuchen +kudize +kudos +Kudrun +kudu +kudzu +Kuehneola +kuei +Kufic +kuge +kugel +Kuhnia +Kui +kuichua +Kuki +kukoline +kukri +kuku +kukui +Kukulcan +kukupa +Kukuruku +kula +kulack +Kulah +kulah +kulaite +kulak +kulakism +Kulanapan +kulang +Kuli +kulimit +kulkarni +kullaite +Kullani +kulm +kulmet +Kulturkampf +Kulturkreis +Kuman +kumbi +kumhar +kumiss +kummel +Kumni +kumquat +kumrah +Kumyk +kunai +Kunbi +Kundry +Kuneste +kung +kunk +kunkur +Kunmiut +kunzite +Kuomintang +kupfernickel +kupfferite +kuphar +kupper +Kuranko +kurbash +kurchicine +kurchine +Kurd +Kurdish +Kurdistan +kurgan +Kuri +Kurilian +Kurku +kurmburra +Kurmi +Kuroshio +kurrajong +kurtosis +Kuruba +Kurukh +kuruma +kurumaya +Kurumba +kurung +kurus +kurvey +kurveyor +kusa +kusam +Kusan +kusha +Kushshu +kusimansel +kuskite +kuskos +kuskus +Kuskwogmiut +Kustenau +kusti +kusum +kutcha +Kutchin +Kutenai +kuttab +kuttar +kuttaur +kuvasz +Kuvera +kvass +kvint +kvinter +Kwakiutl +kwamme +kwan +Kwannon +Kwapa +kwarta +kwarterka +kwazoku +kyack +kyah +kyar +kyat +kyaung +Kybele +Kyklopes +Kyklops +kyl +kyle +kylite +kylix +kymation +kymatology +kymbalon +kymogram +kymograph +kymographic +kynurenic +kynurine +kyphoscoliosis +kyphoscoliotic +Kyphosidae +kyphosis +kyphotic +Kyrie +kyrine +kyschtymite +kyte +Kyurin +Kyurinish +L +l +la +laager +laang +lab +Laban +labara +labarum +labba +labber +labdacism +labdacismus +labdanum +labefact +labefactation +labefaction +labefy +label +labeler +labella +labellate +labeller +labelloid +labellum +labia +labial +labialism +labialismus +labiality +labialization +labialize +labially +Labiatae +labiate +labiated +labidophorous +Labidura +Labiduridae +labiella +labile +lability +labilization +labilize +labioalveolar +labiocervical +labiodental +labioglossal +labioglossolaryngeal +labioglossopharyngeal +labiograph +labioguttural +labiolingual +labiomancy +labiomental +labionasal +labiopalatal +labiopalatalize +labiopalatine +labiopharyngeal +labioplasty +labiose +labiotenaculum +labiovelar +labioversion +labis +labium +lablab +labor +laborability +laborable +laborage +laborant +laboratorial +laboratorian +laboratory +labordom +labored +laboredly +laboredness +laborer +laboress +laborhood +laboring +laboringly +laborious +laboriously +laboriousness +laborism +laborist +laborite +laborless +laborous +laborously +laborousness +laborsaving +laborsome +laborsomely +laborsomeness +Laboulbenia +Laboulbeniaceae +laboulbeniaceous +Laboulbeniales +labour +labra +Labrador +Labradorean +labradorite +labradoritic +labral +labret +labretifery +Labridae +labroid +Labroidea +labrosaurid +labrosauroid +Labrosaurus +labrose +labrum +Labrus +labrusca +labrys +Laburnum +labyrinth +labyrinthal +labyrinthally +labyrinthian +labyrinthibranch +labyrinthibranchiate +Labyrinthibranchii +labyrinthic +labyrinthical +labyrinthically +Labyrinthici +labyrinthiform +labyrinthine +labyrinthitis +Labyrinthodon +labyrinthodont +Labyrinthodonta +labyrinthodontian +labyrinthodontid +labyrinthodontoid +Labyrinthula +Labyrinthulidae +lac +lacca +laccaic +laccainic +laccase +laccol +laccolith +laccolithic +laccolitic +lace +lacebark +laced +Lacedaemonian +laceflower +laceleaf +laceless +lacelike +lacemaker +lacemaking +laceman +lacepiece +lacepod +lacer +lacerability +lacerable +lacerant +lacerate +lacerated +lacerately +laceration +lacerative +Lacerta +Lacertae +lacertian +Lacertid +Lacertidae +lacertiform +Lacertilia +lacertilian +lacertiloid +lacertine +lacertoid +lacertose +lacery +lacet +lacewing +lacewoman +lacewood +lacework +laceworker +laceybark +lache +Lachenalia +laches +Lachesis +Lachnanthes +Lachnosterna +lachryma +lachrymae +lachrymaeform +lachrymal +lachrymally +lachrymalness +lachrymary +lachrymation +lachrymator +lachrymatory +lachrymiform +lachrymist +lachrymogenic +lachrymonasal +lachrymosal +lachrymose +lachrymosely +lachrymosity +lachrymous +lachsa +lacily +Lacinaria +laciness +lacing +lacinia +laciniate +laciniated +laciniation +laciniform +laciniola +laciniolate +laciniose +lacinula +lacinulate +lacinulose +lacis +lack +lackadaisical +lackadaisicality +lackadaisically +lackadaisicalness +lackadaisy +lackaday +lacker +lackey +lackeydom +lackeyed +lackeyism +lackeyship +lackland +lackluster +lacklusterness +lacklustrous +lacksense +lackwit +lackwittedly +lackwittedness +lacmoid +lacmus +Laconian +Laconic +laconic +laconica +laconically +laconicalness +laconicism +laconicum +laconism +laconize +laconizer +Lacosomatidae +lacquer +lacquerer +lacquering +lacquerist +lacroixite +lacrosse +lacrosser +lacrym +lactagogue +lactalbumin +lactam +lactamide +lactant +lactarene +lactarious +lactarium +Lactarius +lactary +lactase +lactate +lactation +lactational +lacteal +lactean +lactenin +lacteous +lactesce +lactescence +lactescency +lactescent +lactic +lacticinia +lactid +lactide +lactiferous +lactiferousness +lactific +lactifical +lactification +lactiflorous +lactifluous +lactiform +lactifuge +lactify +lactigenic +lactigenous +lactigerous +lactim +lactimide +lactinate +lactivorous +lacto +lactobacilli +Lactobacillus +lactobacillus +lactobutyrometer +lactocele +lactochrome +lactocitrate +lactodensimeter +lactoflavin +lactoglobulin +lactoid +lactol +lactometer +lactone +lactonic +lactonization +lactonize +lactophosphate +lactoproteid +lactoprotein +lactoscope +lactose +lactoside +lactosuria +lactothermometer +lactotoxin +lactovegetarian +Lactuca +lactucarium +lactucerin +lactucin +lactucol +lactucon +lactyl +lacuna +lacunae +lacunal +lacunar +lacunaria +lacunary +lacune +lacunose +lacunosity +lacunule +lacunulose +lacuscular +lacustral +lacustrian +lacustrine +lacwork +lacy +lad +Ladakhi +ladakin +ladanigerous +ladanum +ladder +laddered +laddering +ladderlike +ladderway +ladderwise +laddery +laddess +laddie +laddikie +laddish +laddock +lade +lademan +laden +lader +ladhood +ladies +ladify +Ladik +Ladin +lading +Ladino +ladkin +ladle +ladleful +ladler +ladlewood +ladrone +ladronism +ladronize +lady +ladybird +ladybug +ladyclock +ladydom +ladyfinger +ladyfish +ladyfly +ladyfy +ladyhood +ladyish +ladyism +ladykin +ladykind +ladyless +ladylike +ladylikely +ladylikeness +ladyling +ladylintywhite +ladylove +ladyly +ladyship +Ladytide +Laelia +laemodipod +Laemodipoda +laemodipodan +laemodipodiform +laemodipodous +laemoparalysis +laemostenosis +laeotropic +laeotropism +Laestrygones +laet +laeti +laetic +Laevigrada +laevoduction +laevogyrate +laevogyre +laevogyrous +laevolactic +laevorotation +laevorotatory +laevotartaric +laevoversion +lafayette +Lafite +lag +lagan +lagarto +lagen +lagena +Lagenaria +lagend +lageniform +lager +Lagerstroemia +Lagetta +lagetto +laggar +laggard +laggardism +laggardly +laggardness +lagged +laggen +lagger +laggin +lagging +laglast +lagna +lagniappe +lagomorph +Lagomorpha +lagomorphic +lagomorphous +Lagomyidae +lagonite +lagoon +lagoonal +lagoonside +lagophthalmos +lagopode +lagopodous +lagopous +Lagopus +Lagorchestes +lagostoma +Lagostomus +Lagothrix +Lagrangian +Lagthing +Lagting +Laguncularia +Lagunero +Lagurus +lagwort +Lahnda +Lahontan +Lahuli +Lai +lai +Laibach +laic +laical +laicality +laically +laich +laicism +laicity +laicization +laicize +laicizer +laid +laigh +lain +laine +laiose +lair +lairage +laird +lairdess +lairdie +lairdly +lairdocracy +lairdship +lairless +lairman +lairstone +lairy +laitance +laity +Lak +lak +lakarpite +lakatoi +lake +lakeland +lakelander +lakeless +lakelet +lakelike +lakemanship +laker +lakeside +lakeward +lakeweed +lakie +laking +lakish +lakishness +lakism +lakist +Lakota +Lakshmi +laky +lalang +lall +Lallan +Lalland +lallation +lalling +lalo +laloneurosis +lalopathy +lalophobia +laloplegia +lam +lama +lamaic +Lamaism +Lamaist +Lamaistic +Lamaite +Lamanism +Lamanite +Lamano +lamantin +lamany +Lamarckia +Lamarckian +Lamarckianism +Lamarckism +lamasary +lamasery +lamastery +lamb +Lamba +lamba +Lambadi +lambale +lambaste +lambda +lambdacism +lambdoid +lambdoidal +lambeau +lambency +lambent +lambently +lamber +Lambert +lambert +lambhood +lambie +lambiness +lambish +lambkill +lambkin +Lamblia +lambliasis +lamblike +lambling +lambly +lamboys +lambrequin +lambsdown +lambskin +lambsuccory +lamby +lame +lamedh +lameduck +lamel +lamella +lamellar +Lamellaria +Lamellariidae +lamellarly +lamellary +lamellate +lamellated +lamellately +lamellation +lamellibranch +Lamellibranchia +Lamellibranchiata +lamellibranchiate +lamellicorn +lamellicornate +Lamellicornes +Lamellicornia +lamellicornous +lamelliferous +lamelliform +lamellirostral +lamellirostrate +Lamellirostres +lamelloid +lamellose +lamellosity +lamellule +lamely +lameness +lament +lamentable +lamentableness +lamentably +lamentation +lamentational +lamentatory +lamented +lamentedly +lamenter +lamentful +lamenting +lamentingly +lamentive +lamentory +lamester +lamestery +lameter +lametta +lamia +Lamiaceae +lamiaceous +lamiger +lamiid +Lamiidae +Lamiides +Lamiinae +lamin +lamina +laminability +laminable +laminae +laminar +Laminaria +Laminariaceae +laminariaceous +Laminariales +laminarian +laminarin +laminarioid +laminarite +laminary +laminate +laminated +lamination +laminboard +laminectomy +laminiferous +laminiform +laminiplantar +laminiplantation +laminitis +laminose +laminous +lamish +Lamista +lamiter +Lamium +Lammas +lammas +Lammastide +lammer +lammergeier +lammock +lammy +Lamna +lamnectomy +lamnid +Lamnidae +lamnoid +lamp +lampad +lampadary +lampadedromy +lampadephore +lampadephoria +lampadite +lampas +lampatia +lampblack +lamper +lampern +lampers +lampflower +lampfly +lampful +lamphole +lamping +lampion +lampist +lampistry +lampless +lamplet +lamplight +lamplighted +lamplighter +lamplit +lampmaker +lampmaking +lampman +Lampong +lampoon +lampooner +lampoonery +lampoonist +lamppost +lamprey +Lampridae +lamprophony +lamprophyre +lamprophyric +lamprotype +Lampsilis +Lampsilus +lampstand +lampwick +lampyrid +Lampyridae +lampyrine +Lampyris +Lamus +Lamut +lamziekte +lan +lanameter +Lanao +Lanarkia +lanarkite +lanas +lanate +lanated +lanaz +Lancaster +Lancasterian +Lancastrian +Lance +lance +lanced +lancegay +lancelet +lancelike +lancely +lanceman +lanceolar +lanceolate +lanceolated +lanceolately +lanceolation +lancepesade +lancepod +lanceproof +lancer +lances +lancet +lanceted +lanceteer +lancewood +lancha +lanciers +lanciferous +lanciform +lancinate +lancination +land +landamman +landau +landaulet +landaulette +landblink +landbook +landdrost +landed +lander +landesite +landfall +landfast +landflood +landgafol +landgravate +landgrave +landgraveship +landgravess +landgraviate +landgravine +landholder +landholdership +landholding +landimere +landing +landlady +landladydom +landladyhood +landladyish +landladyship +landless +landlessness +landlike +landline +landlock +landlocked +landlook +landlooker +landloper +landlord +landlordism +landlordly +landlordry +landlordship +landlouper +landlouping +landlubber +landlubberish +landlubberly +landlubbing +landman +landmark +Landmarker +landmil +landmonger +landocracy +landocrat +Landolphia +landolphia +landowner +landownership +landowning +landplane +landraker +landreeve +landright +landsale +landscape +landscapist +landshard +landship +landsick +landside +landskip +landslide +landslip +Landsmaal +landsman +landspout +landspringy +Landsting +landstorm +Landsturm +Landuman +landwaiter +landward +landwash +landways +Landwehr +landwhin +landwire +landwrack +lane +lanete +laneway +laney +langaha +langarai +langbanite +langbeinite +langca +Langhian +langi +langite +langlauf +langlaufer +langle +Lango +Langobard +Langobardic +langoon +langooty +langrage +langsat +Langsdorffia +langsettle +Langshan +langspiel +langsyne +language +languaged +languageless +langued +Languedocian +languescent +languet +languid +languidly +languidness +languish +languisher +languishing +languishingly +languishment +languor +languorous +languorously +langur +laniariform +laniary +laniate +laniferous +lanific +laniflorous +laniform +lanigerous +Laniidae +laniiform +Laniinae +lanioid +lanista +Lanital +Lanius +lank +lanket +lankily +lankiness +lankish +lankly +lankness +lanky +lanner +lanneret +lanolin +lanose +lanosity +lansat +lansdowne +lanseh +lansfordite +lansknecht +lanson +lansquenet +lant +lantaca +Lantana +lanterloo +lantern +lanternflower +lanternist +lanternleaf +lanternman +lanthana +lanthanide +lanthanite +Lanthanotidae +Lanthanotus +lanthanum +lanthopine +lantum +lanuginose +lanuginous +lanuginousness +lanugo +lanum +Lanuvian +lanx +lanyard +Lao +Laodicean +Laodiceanism +Laotian +lap +lapacho +lapachol +lapactic +Lapageria +laparectomy +laparocele +laparocholecystotomy +laparocolectomy +laparocolostomy +laparocolotomy +laparocolpohysterotomy +laparocolpotomy +laparocystectomy +laparocystotomy +laparoelytrotomy +laparoenterostomy +laparoenterotomy +laparogastroscopy +laparogastrotomy +laparohepatotomy +laparohysterectomy +laparohysteropexy +laparohysterotomy +laparoileotomy +laparomyitis +laparomyomectomy +laparomyomotomy +laparonephrectomy +laparonephrotomy +laparorrhaphy +laparosalpingectomy +laparosalpingotomy +laparoscopy +laparosplenectomy +laparosplenotomy +laparostict +Laparosticti +laparothoracoscopy +laparotome +laparotomist +laparotomize +laparotomy +laparotrachelotomy +lapboard +lapcock +Lapeirousia +lapel +lapeler +lapelled +lapful +lapicide +lapidarian +lapidarist +lapidary +lapidate +lapidation +lapidator +lapideon +lapideous +lapidescent +lapidicolous +lapidific +lapidification +lapidify +lapidist +lapidity +lapidose +lapilliform +lapillo +lapillus +Lapith +Lapithae +Lapithaean +Laplacian +Lapland +Laplander +Laplandian +Laplandic +Laplandish +lapon +Laportea +Lapp +Lappa +lappaceous +lappage +lapped +lapper +lappet +lappeted +Lappic +lapping +Lappish +Lapponese +Lapponian +Lappula +lapsability +lapsable +Lapsana +lapsation +lapse +lapsed +lapser +lapsi +lapsing +lapsingly +lapstone +lapstreak +lapstreaked +lapstreaker +Laputa +Laputan +laputically +lapwing +lapwork +laquear +laquearian +laqueus +Lar +lar +Laralia +Laramide +Laramie +larboard +larbolins +larbowlines +larcener +larcenic +larcenish +larcenist +larcenous +larcenously +larceny +larch +larchen +lard +lardacein +lardaceous +larder +larderellite +larderer +larderful +larderlike +lardiform +lardite +Lardizabalaceae +lardizabalaceous +lardon +lardworm +lardy +lareabell +Larentiidae +large +largebrained +largehanded +largehearted +largeheartedness +largely +largemouth +largemouthed +largen +largeness +largess +larghetto +largifical +largish +largition +largitional +largo +Lari +lari +Laria +lariat +larick +larid +Laridae +laridine +larigo +larigot +lariid +Lariidae +larin +Larinae +larine +larithmics +Larix +larixin +lark +larker +larkiness +larking +larkingly +larkish +larkishness +larklike +larkling +larksome +larkspur +larky +larmier +larmoyant +Larnaudian +larnax +laroid +larrigan +larrikin +larrikinalian +larrikiness +larrikinism +larriman +larrup +Larry +larry +Lars +larsenite +Larunda +Larus +larva +Larvacea +larvae +larval +Larvalia +larvarium +larvate +larve +larvicidal +larvicide +larvicolous +larviform +larvigerous +larvikite +larviparous +larviposit +larviposition +larvivorous +larvule +laryngal +laryngalgia +laryngeal +laryngeally +laryngean +laryngeating +laryngectomy +laryngemphraxis +laryngendoscope +larynges +laryngic +laryngismal +laryngismus +laryngitic +laryngitis +laryngocele +laryngocentesis +laryngofission +laryngofissure +laryngograph +laryngography +laryngological +laryngologist +laryngology +laryngometry +laryngoparalysis +laryngopathy +laryngopharyngeal +laryngopharyngitis +laryngophony +laryngophthisis +laryngoplasty +laryngoplegia +laryngorrhagia +laryngorrhea +laryngoscleroma +laryngoscope +laryngoscopic +laryngoscopical +laryngoscopist +laryngoscopy +laryngospasm +laryngostasis +laryngostenosis +laryngostomy +laryngostroboscope +laryngotome +laryngotomy +laryngotracheal +laryngotracheitis +laryngotracheoscopy +laryngotracheotomy +laryngotyphoid +laryngovestibulitis +larynx +las +lasa +lasarwort +lascar +lascivious +lasciviously +lasciviousness +laser +Laserpitium +laserwort +lash +lasher +lashingly +lashless +lashlite +Lasi +lasianthous +Lasiocampa +lasiocampid +Lasiocampidae +Lasiocampoidea +lasiocarpous +Lasius +lask +lasket +Laspeyresia +laspring +lasque +lass +lasset +lassie +lassiehood +lassieish +lassitude +lasslorn +lasso +lassock +lassoer +last +lastage +laster +lasting +lastingly +lastingness +lastly +lastness +lastre +lastspring +lasty +lat +lata +latah +Latakia +Latania +Latax +latch +latcher +latchet +latching +latchkey +latchless +latchman +latchstring +late +latebra +latebricole +latecomer +latecoming +lated +lateen +lateener +lately +laten +latence +latency +lateness +latensification +latent +latentize +latently +latentness +later +latera +laterad +lateral +lateralis +laterality +lateralization +lateralize +laterally +Lateran +latericumbent +lateriflexion +laterifloral +lateriflorous +laterifolious +Laterigradae +laterigrade +laterinerved +laterite +lateritic +lateritious +lateriversion +laterization +lateroabdominal +lateroanterior +laterocaudal +laterocervical +laterodeviation +laterodorsal +lateroduction +lateroflexion +lateromarginal +lateronuchal +lateroposition +lateroposterior +lateropulsion +laterostigmatal +laterostigmatic +laterotemporal +laterotorsion +lateroventral +lateroversion +latescence +latescent +latesome +latest +latewhile +latex +latexosis +lath +lathe +lathee +latheman +lathen +lather +latherability +latherable +lathereeve +latherer +latherin +latheron +latherwort +lathery +lathesman +lathhouse +lathing +Lathraea +lathwork +lathy +lathyric +lathyrism +Lathyrus +Latian +latibulize +latices +laticiferous +laticlave +laticostate +latidentate +latifundian +latifundium +latigo +Latimeria +Latin +Latinate +Latiner +Latinesque +Latinian +Latinic +Latiniform +Latinism +latinism +Latinist +Latinistic +Latinistical +Latinitaster +Latinity +Latinization +Latinize +Latinizer +Latinless +Latinus +lation +latipennate +latiplantar +latirostral +Latirostres +latirostrous +Latirus +latisept +latiseptal +latiseptate +latish +latisternal +latitancy +latitant +latitat +latite +latitude +latitudinal +latitudinally +latitudinarian +latitudinarianisn +latitudinary +latitudinous +latomy +Latona +Latonian +Latooka +latrant +latration +latreutic +latria +Latrididae +latrine +Latris +latro +latrobe +latrobite +latrocinium +Latrodectus +latron +latten +lattener +latter +latterkin +latterly +lattermath +lattermost +latterness +lattice +latticed +latticewise +latticework +latticing +latticinio +Latuka +latus +Latvian +lauan +laubanite +laud +laudability +laudable +laudableness +laudably +laudanidine +laudanin +laudanine +laudanosine +laudanum +laudation +laudative +laudator +laudatorily +laudatory +lauder +Laudian +Laudianism +laudification +Laudism +Laudist +laudist +laugh +laughable +laughableness +laughably +laughee +laugher +laughful +laughing +laughingly +laughingstock +laughsome +laughter +laughterful +laughterless +laughworthy +laughy +lauia +laumonite +laumontite +laun +launce +launch +launcher +launchful +launchways +laund +launder +launderability +launderable +launderer +laundry +laundrymaid +laundryman +laundryowner +laundrywoman +laur +Laura +laura +Lauraceae +lauraceous +lauraldehyde +laurate +laurdalite +laureate +laureated +laureateship +laureation +laurel +laureled +laurellike +laurelship +laurelwood +Laurencia +Laurentian +Laurentide +laureole +lauric +laurin +laurinoxylon +laurionite +laurite +Laurocerasus +laurone +laurotetanine +Laurus +laurustine +laurustinus +laurvikite +lauryl +lautarite +lautitious +lava +lavable +lavabo +lavacre +lavage +lavaliere +lavalike +Lavandula +lavanga +lavant +lavaret +Lavatera +lavatic +lavation +lavational +lavatorial +lavatory +lave +laveer +Lavehr +lavement +lavender +lavenite +laver +Laverania +laverock +laverwort +lavialite +lavic +Lavinia +lavish +lavisher +lavishing +lavishingly +lavishly +lavishment +lavishness +lavolta +lavrovite +law +lawbook +lawbreaker +lawbreaking +lawcraft +lawful +lawfully +lawfulness +lawgiver +lawgiving +lawing +lawish +lawk +lawlants +lawless +lawlessly +lawlessness +lawlike +lawmaker +lawmaking +lawman +lawmonger +lawn +lawned +lawner +lawnlet +lawnlike +lawny +lawproof +lawrencite +Lawrie +lawrightman +Lawson +Lawsoneve +Lawsonia +lawsonite +lawsuit +lawsuiting +lawter +Lawton +lawyer +lawyeress +lawyerism +lawyerlike +lawyerling +lawyerly +lawyership +lawyery +lawzy +lax +laxate +laxation +laxative +laxatively +laxativeness +laxiflorous +laxifoliate +laxifolious +laxism +laxist +laxity +laxly +laxness +lay +layaway +layback +layboy +layer +layerage +layered +layery +layette +Layia +laying +layland +layman +laymanship +layne +layoff +layout +layover +layship +laystall +laystow +laywoman +Laz +lazar +lazaret +lazaretto +Lazarist +lazarlike +lazarly +lazarole +Lazarus +laze +lazily +laziness +lazule +lazuli +lazuline +lazulite +lazulitic +lazurite +lazy +lazybird +lazybones +lazyboots +lazyhood +lazyish +lazylegs +lazyship +lazzarone +lazzaroni +lea +leach +leacher +leachman +leachy +Lead +lead +leadable +leadableness +leadage +leadback +leaded +leaden +leadenhearted +leadenheartedness +leadenly +leadenness +leadenpated +leader +leaderess +leaderette +leaderless +leadership +leadhillite +leadin +leadiness +leading +leadingly +leadless +leadman +leadoff +leadout +leadproof +leadsman +leadstone +leadway +leadwood +leadwork +leadwort +leady +leaf +leafage +leafboy +leafcup +leafdom +leafed +leafen +leafer +leafery +leafgirl +leafit +leafless +leaflessness +leaflet +leafleteer +leaflike +leafstalk +leafwork +leafy +league +leaguelong +leaguer +Leah +leak +leakage +leakance +leaker +leakiness +leakless +leakproof +leaky +leal +lealand +leally +lealness +lealty +leam +leamer +lean +Leander +leaner +leaning +leanish +leanly +leanness +leant +leap +leapable +leaper +leapfrog +leapfrogger +leapfrogging +leaping +leapingly +leapt +Lear +lear +Learchus +learn +learnable +learned +learnedly +learnedness +learner +learnership +learning +learnt +Learoyd +leasable +lease +leasehold +leaseholder +leaseholding +leaseless +leasemonger +leaser +leash +leashless +leasing +leasow +least +leastways +leastwise +leat +leath +leather +leatherback +leatherbark +leatherboard +leatherbush +leathercoat +leathercraft +leatherer +Leatherette +leatherfish +leatherflower +leatherhead +leatherine +leatheriness +leathering +leatherize +leatherjacket +leatherleaf +leatherlike +leathermaker +leathermaking +leathern +leatherneck +Leatheroid +leatherroot +leatherside +Leatherstocking +leatherware +leatherwing +leatherwood +leatherwork +leatherworker +leatherworking +leathery +leathwake +leatman +leave +leaved +leaveless +leavelooker +leaven +leavening +leavenish +leavenless +leavenous +leaver +leaverwood +leaves +leaving +leavy +leawill +leban +Lebanese +lebbek +lebensraum +Lebistes +lebrancho +lecama +lecaniid +Lecaniinae +lecanine +Lecanium +lecanomancer +lecanomancy +lecanomantic +Lecanora +Lecanoraceae +lecanoraceous +lecanorine +lecanoroid +lecanoscopic +lecanoscopy +lech +Lechea +lecher +lecherous +lecherously +lecherousness +lechery +lechriodont +Lechriodonta +lechuguilla +lechwe +Lecidea +Lecideaceae +lecideaceous +lecideiform +lecideine +lecidioid +lecithal +lecithalbumin +lecithality +lecithin +lecithinase +lecithoblast +lecithoprotein +leck +lecker +lecontite +lecotropal +lectern +lection +lectionary +lectisternium +lector +lectorate +lectorial +lectorship +lectotype +lectress +lectrice +lectual +lecture +lecturee +lectureproof +lecturer +lectureship +lecturess +lecturette +lecyth +lecythid +Lecythidaceae +lecythidaceous +Lecythis +lecythoid +lecythus +led +Leda +lede +leden +lederite +ledge +ledged +ledgeless +ledger +ledgerdom +ledging +ledgment +ledgy +Ledidae +ledol +Ledum +lee +leeangle +leeboard +leech +leecheater +leecher +leechery +leeches +leechkin +leechlike +leechwort +leed +leefang +leeftail +leek +leekish +leeky +leep +leepit +leer +leerily +leeringly +leerish +leerness +leeroway +Leersia +leery +lees +leet +leetman +leewan +leeward +leewardly +leewardmost +leewardness +leeway +leewill +left +leftish +leftism +leftist +leftments +leftmost +leftness +leftover +leftward +leftwardly +leftwards +leg +legacy +legal +legalese +legalism +legalist +legalistic +legalistically +legality +legalization +legalize +legally +legalness +legantine +legatary +legate +legatee +legateship +legatine +legation +legationary +legative +legato +legator +legatorial +legend +legenda +legendarian +legendary +legendic +legendist +legendless +Legendrian +legendry +leger +legerdemain +legerdemainist +legerity +leges +legged +legger +legginess +legging +legginged +leggy +leghorn +legibility +legible +legibleness +legibly +legific +legion +legionary +legioned +legioner +legionnaire +legionry +legislate +legislation +legislational +legislativ +legislative +legislatively +legislator +legislatorial +legislatorially +legislatorship +legislatress +legislature +legist +legit +legitim +legitimacy +legitimate +legitimately +legitimateness +legitimation +legitimatist +legitimatize +legitimism +legitimist +legitimistic +legitimity +legitimization +legitimize +leglen +legless +leglessness +leglet +leglike +legman +legoa +legpiece +legpull +legpuller +legpulling +legrope +legua +leguan +Leguatia +leguleian +leguleious +legume +legumelin +legumen +legumin +leguminiform +Leguminosae +leguminose +leguminous +Lehi +lehr +lehrbachite +lehrman +lehua +lei +Leibnitzian +Leibnitzianism +Leicester +leighton +Leila +leimtype +leiocephalous +leiocome +leiodermatous +leiodermia +leiomyofibroma +leiomyoma +leiomyomatous +leiomyosarcoma +leiophyllous +Leiophyllum +Leiothrix +Leiotrichan +Leiotriches +Leiotrichi +Leiotrichidae +Leiotrichinae +leiotrichine +leiotrichous +leiotrichy +leiotropic +Leipoa +Leishmania +leishmaniasis +Leisten +leister +leisterer +leisurable +leisurably +leisure +leisured +leisureful +leisureless +leisureliness +leisurely +leisureness +leitmotiv +Leitneria +Leitneriaceae +leitneriaceous +Leitneriales +lek +lekach +lekane +lekha +Lelia +Lemaireocereus +leman +Lemanea +Lemaneaceae +lemel +lemma +lemmata +lemming +lemmitis +lemmoblastic +lemmocyte +Lemmus +Lemna +Lemnaceae +lemnaceous +lemnad +Lemnian +lemniscate +lemniscatic +lemniscus +lemography +lemology +lemon +lemonade +Lemonias +Lemoniidae +Lemoniinae +lemonish +lemonlike +lemonweed +lemonwood +lemony +Lemosi +Lemovices +lempira +Lemuel +lemur +lemures +Lemuria +Lemurian +lemurian +lemurid +Lemuridae +lemuriform +Lemurinae +lemurine +lemuroid +Lemuroidea +Len +Lena +lenad +Lenaea +Lenaean +Lenaeum +Lenaeus +Lenape +lenard +Lenca +Lencan +lench +lend +lendable +lendee +lender +Lendu +lene +length +lengthen +lengthener +lengther +lengthful +lengthily +lengthiness +lengthsman +lengthsome +lengthsomeness +lengthways +lengthwise +lengthy +lenience +leniency +lenient +leniently +lenify +Leninism +Leninist +Leninite +lenis +lenitic +lenitive +lenitively +lenitiveness +lenitude +lenity +lennilite +Lennoaceae +lennoaceous +lennow +leno +lens +lensed +lensless +lenslike +Lent +lent +Lenten +Lententide +lenth +lenthways +Lentibulariaceae +lentibulariaceous +lenticel +lenticellate +lenticle +lenticonus +lenticula +lenticular +lenticulare +lenticularis +lenticularly +lenticulate +lenticulated +lenticule +lenticulostriate +lenticulothalamic +lentiform +lentigerous +lentiginous +lentigo +lentil +Lentilla +lentisc +lentiscine +lentisco +lentiscus +lentisk +lentitude +lentitudinous +lento +lentoid +lentor +lentous +lenvoi +lenvoy +Lenzites +Leo +Leon +Leonard +Leonardesque +Leonato +leoncito +Leonese +leonhardite +Leonid +Leonine +leonine +leoninely +leonines +Leonis +Leonist +leonite +Leonnoys +Leonora +Leonotis +leontiasis +Leontocebus +leontocephalous +Leontodon +Leontopodium +Leonurus +leopard +leoparde +leopardess +leopardine +leopardite +leopardwood +Leopold +Leopoldinia +leopoldite +leotard +lepa +Lepadidae +lepadoid +Lepanto +lepargylic +Lepargyraea +Lepas +Lepcha +leper +leperdom +lepered +lepidene +lepidine +Lepidium +lepidoblastic +Lepidodendraceae +lepidodendraceous +lepidodendrid +lepidodendroid +Lepidodendron +lepidoid +Lepidoidei +lepidolite +lepidomelane +Lepidophloios +lepidophyllous +Lepidophyllum +lepidophyte +lepidophytic +lepidoporphyrin +lepidopter +Lepidoptera +lepidopteral +lepidopteran +lepidopterid +lepidopterist +lepidopterological +lepidopterologist +lepidopterology +lepidopteron +lepidopterous +Lepidosauria +lepidosaurian +Lepidosiren +Lepidosirenidae +lepidosirenoid +lepidosis +Lepidosperma +Lepidospermae +Lepidosphes +Lepidostei +lepidosteoid +Lepidosteus +Lepidostrobus +lepidote +Lepidotes +lepidotic +Lepidotus +Lepidurus +Lepilemur +Lepiota +Lepisma +Lepismatidae +Lepismidae +lepismoid +Lepisosteidae +Lepisosteus +lepocyte +Lepomis +leporid +Leporidae +leporide +leporiform +leporine +Leporis +Lepospondyli +lepospondylous +Leposternidae +Leposternon +lepothrix +lepra +Lepralia +lepralian +leprechaun +lepric +leproid +leprologic +leprologist +leprology +leproma +lepromatous +leprosarium +leprose +leprosery +leprosied +leprosis +leprosity +leprosy +leprous +leprously +leprousness +Leptamnium +Leptandra +leptandrin +leptid +Leptidae +leptiform +Leptilon +leptinolite +Leptinotarsa +leptite +Leptocardia +leptocardian +Leptocardii +leptocentric +leptocephalan +leptocephali +leptocephalia +leptocephalic +leptocephalid +Leptocephalidae +leptocephaloid +leptocephalous +Leptocephalus +leptocephalus +leptocephaly +leptocercal +leptochlorite +leptochroa +leptochrous +leptoclase +leptodactyl +Leptodactylidae +leptodactylous +Leptodactylus +leptodermatous +leptodermous +Leptodora +Leptodoridae +Leptogenesis +leptokurtic +Leptolepidae +Leptolepis +Leptolinae +leptomatic +leptome +Leptomedusae +leptomedusan +leptomeningeal +leptomeninges +leptomeningitis +leptomeninx +leptometer +leptomonad +Leptomonas +Lepton +lepton +leptonecrosis +leptonema +leptopellic +Leptophis +leptophyllous +leptoprosope +leptoprosopic +leptoprosopous +leptoprosopy +Leptoptilus +Leptorchis +leptorrhin +leptorrhine +leptorrhinian +leptorrhinism +leptosome +leptosperm +Leptospermum +Leptosphaeria +Leptospira +leptospirosis +leptosporangiate +Leptostraca +leptostracan +leptostracous +Leptostromataceae +Leptosyne +leptotene +Leptothrix +Leptotrichia +Leptotyphlopidae +Leptotyphlops +leptus +leptynite +Lepus +Ler +Lernaea +Lernaeacea +Lernaean +Lernaeidae +lernaeiform +lernaeoid +Lernaeoides +lerot +lerp +lerret +Lerwa +Lesath +Lesbia +Lesbian +Lesbianism +lesche +Lesgh +lesion +lesional +lesiy +Leskea +Leskeaceae +leskeaceous +Lesleya +Lespedeza +Lesquerella +less +lessee +lesseeship +lessen +lessener +lesser +lessive +lessn +lessness +lesson +lessor +lest +lestiwarite +lestobiosis +lestobiotic +Lestodon +Lestosaurus +lestrad +Lestrigon +Lestrigonian +let +letch +letchy +letdown +lete +lethal +lethality +lethalize +lethally +lethargic +lethargical +lethargically +lethargicalness +lethargize +lethargus +lethargy +Lethe +Lethean +lethiferous +Lethocerus +lethologica +Letitia +Leto +letoff +Lett +lettable +letten +letter +lettered +letterer +letteret +lettergram +letterhead +letterin +lettering +letterleaf +letterless +letterpress +letterspace +letterweight +letterwood +Lettic +Lettice +Lettish +lettrin +lettsomite +lettuce +Letty +letup +leu +Leucadendron +Leucadian +leucaemia +leucaemic +Leucaena +leucaethiop +leucaethiopic +leucaniline +leucanthous +leucaugite +leucaurin +leucemia +leucemic +Leucetta +leuch +leuchaemia +leuchemia +leuchtenbergite +Leucichthys +Leucifer +Leuciferidae +leucine +Leucippus +leucism +leucite +leucitic +leucitis +leucitite +leucitohedron +leucitoid +Leuckartia +Leuckartiidae +leuco +leucobasalt +leucoblast +leucoblastic +Leucobryaceae +Leucobryum +leucocarpous +leucochalcite +leucocholic +leucocholy +leucochroic +leucocidic +leucocidin +leucocism +leucocrate +leucocratic +Leucocrinum +leucocyan +leucocytal +leucocyte +leucocythemia +leucocythemic +leucocytic +leucocytoblast +leucocytogenesis +leucocytoid +leucocytology +leucocytolysin +leucocytolysis +leucocytolytic +leucocytometer +leucocytopenia +leucocytopenic +leucocytoplania +leucocytopoiesis +leucocytosis +leucocytotherapy +leucocytotic +Leucocytozoon +leucoderma +leucodermatous +leucodermic +leucoencephalitis +leucogenic +leucoid +leucoindigo +leucoindigotin +Leucojaceae +Leucojum +leucolytic +leucoma +leucomaine +leucomatous +leucomelanic +leucomelanous +leucon +Leuconostoc +leucopenia +leucopenic +leucophane +leucophanite +leucophoenicite +leucophore +leucophyllous +leucophyre +leucoplakia +leucoplakial +leucoplast +leucoplastid +leucopoiesis +leucopoietic +leucopyrite +leucoquinizarin +leucorrhea +leucorrheal +leucoryx +leucosis +Leucosolenia +Leucosoleniidae +leucospermous +leucosphenite +leucosphere +leucospheric +leucostasis +Leucosticte +leucosyenite +leucotactic +Leucothea +Leucothoe +leucotic +leucotome +leucotomy +leucotoxic +leucous +leucoxene +leucyl +leud +leuk +leukemia +leukemic +leukocidic +leukocidin +leukosis +leukotic +leuma +lev +Levana +levance +Levant +levant +Levanter +levanter +Levantine +levator +levee +level +leveler +levelheaded +levelheadedly +levelheadedness +leveling +levelish +levelism +levelly +levelman +levelness +lever +leverage +leverer +leveret +leverman +levers +leverwood +Levi +leviable +leviathan +levier +levigable +levigate +levigation +levigator +levin +levining +levir +levirate +leviratical +leviration +Levis +Levisticum +levitant +levitate +levitation +levitational +levitative +levitator +Levite +Levitical +Leviticalism +Leviticality +Levitically +Leviticalness +Leviticism +Leviticus +Levitism +levity +levo +levoduction +levogyrate +levogyre +levogyrous +levolactic +levolimonene +levorotation +levorotatory +levotartaric +levoversion +levulic +levulin +levulinic +levulose +levulosuria +levy +levyist +levynite +Lew +lew +Lewanna +lewd +lewdly +lewdness +Lewie +Lewis +lewis +Lewisia +Lewisian +lewisite +lewisson +lewth +lexia +lexical +lexicalic +lexicality +lexicographer +lexicographian +lexicographic +lexicographical +lexicographically +lexicographist +lexicography +lexicologic +lexicological +lexicologist +lexicology +lexicon +lexiconist +lexiconize +lexigraphic +lexigraphical +lexigraphically +lexigraphy +lexiphanic +lexiphanicism +ley +leyland +leysing +Lezghian +lherzite +lherzolite +Lhota +li +liability +liable +liableness +liaison +liana +liang +liar +liard +Lias +Liassic +Liatris +libament +libaniferous +libanophorous +libanotophorous +libant +libate +libation +libationary +libationer +libatory +libber +libbet +libbra +Libby +libel +libelant +libelee +libeler +libelist +libellary +libellate +Libellula +libellulid +Libellulidae +libelluloid +libelous +libelously +Liber +liber +liberal +Liberalia +liberalism +liberalist +liberalistic +liberality +liberalization +liberalize +liberalizer +liberally +liberalness +liberate +liberation +liberationism +liberationist +liberative +liberator +liberatory +liberatress +Liberia +Liberian +liberomotor +libertarian +libertarianism +Libertas +liberticidal +liberticide +libertinage +libertine +libertinism +liberty +libertyless +libethenite +libidibi +libidinal +libidinally +libidinosity +libidinous +libidinously +libidinousness +libido +Libitina +libken +Libocedrus +Libra +libra +libral +librarian +librarianess +librarianship +librarious +librarius +library +libraryless +librate +libration +libratory +libretti +librettist +libretto +Librid +libriform +libroplast +Libyan +Libytheidae +Libytheinae +Licania +licareol +licca +licensable +license +licensed +licensee +licenseless +licenser +licensor +licensure +licentiate +licentiateship +licentiation +licentious +licentiously +licentiousness +lich +licham +lichanos +lichen +lichenaceous +lichened +Lichenes +licheniasis +lichenic +lichenicolous +licheniform +lichenin +lichenism +lichenist +lichenivorous +lichenization +lichenize +lichenlike +lichenographer +lichenographic +lichenographical +lichenographist +lichenography +lichenoid +lichenologic +lichenological +lichenologist +lichenology +Lichenopora +Lichenoporidae +lichenose +licheny +lichi +Lichnophora +Lichnophoridae +Licinian +licit +licitation +licitly +licitness +lick +licker +lickerish +lickerishly +lickerishness +licking +lickpenny +lickspit +lickspittle +lickspittling +licorice +licorn +licorne +lictor +lictorian +Licuala +lid +Lida +lidded +lidder +Lide +lidflower +lidgate +lidless +lie +liebenerite +Liebfraumilch +liebigite +lied +lief +liege +liegedom +liegeful +liegefully +liegeless +liegely +liegeman +lieger +lien +lienal +lienculus +lienee +lienic +lienitis +lienocele +lienogastric +lienointestinal +lienomalacia +lienomedullary +lienomyelogenous +lienopancreatic +lienor +lienorenal +lienotoxin +lienteria +lienteric +lientery +lieproof +lieprooflier +lieproofliest +lier +lierne +lierre +liesh +liespfund +lieu +lieue +lieutenancy +lieutenant +lieutenantry +lieutenantship +lieve +lievrite +Lif +life +lifeblood +lifeboat +lifeboatman +lifeday +lifedrop +lifeful +lifefully +lifefulness +lifeguard +lifehold +lifeholder +lifeless +lifelessly +lifelessness +lifelet +lifelike +lifelikeness +lifeline +lifelong +lifer +liferent +liferenter +liferentrix +liferoot +lifesaver +lifesaving +lifesome +lifesomely +lifesomeness +lifespring +lifetime +lifeward +lifework +lifey +lifo +lift +liftable +lifter +lifting +liftless +liftman +ligable +ligament +ligamental +ligamentary +ligamentous +ligamentously +ligamentum +ligas +ligate +ligation +ligator +ligature +ligeance +ligger +light +lightable +lightboat +lightbrained +lighten +lightener +lightening +lighter +lighterage +lighterful +lighterman +lightface +lightful +lightfulness +lighthead +lightheaded +lightheadedly +lightheadedness +lighthearted +lightheartedly +lightheartedness +lighthouse +lighthouseman +lighting +lightish +lightkeeper +lightless +lightlessness +lightly +lightman +lightmanship +lightmouthed +lightness +lightning +lightninglike +lightningproof +lightproof +lightroom +lightscot +lightship +lightsman +lightsome +lightsomely +lightsomeness +lighttight +lightwards +lightweight +lightwood +lightwort +lignaloes +lignatile +ligne +ligneous +lignescent +lignicole +lignicoline +lignicolous +ligniferous +lignification +ligniform +lignify +lignin +ligninsulphonate +ligniperdous +lignite +lignitic +lignitiferous +lignitize +lignivorous +lignocellulose +lignoceric +lignography +lignone +lignose +lignosity +lignosulphite +lignosulphonate +lignum +ligroine +ligula +ligular +Ligularia +ligulate +ligulated +ligule +Liguliflorae +liguliflorous +liguliform +ligulin +liguloid +Liguorian +ligure +Ligurian +ligurite +ligurition +Ligusticum +ligustrin +Ligustrum +Ligyda +Ligydidae +Lihyanite +liin +lija +likability +likable +likableness +like +likelihead +likelihood +likeliness +likely +liken +likeness +liker +likesome +likeways +likewise +likin +liking +liknon +Lila +lilac +lilaceous +lilacin +lilacky +lilacthroat +lilactide +Lilaeopsis +lile +Liliaceae +liliaceous +Liliales +Lilian +lilied +liliform +Liliiflorae +Lilith +Lilium +lill +lillianite +lillibullero +Lilliput +Lilliputian +Lilliputianize +lilt +liltingly +liltingness +lily +lilyfy +lilyhanded +lilylike +lilywood +lilywort +lim +Lima +Limacea +limacel +limaceous +Limacidae +limaciform +Limacina +limacine +limacinid +Limacinidae +limacoid +limacon +limaille +liman +limation +Limawood +Limax +limb +limbal +limbat +limbate +limbation +limbeck +limbed +limber +limberham +limberly +limberness +limbers +limbic +limbie +limbiferous +limbless +limbmeal +limbo +limboinfantum +limbous +Limbu +Limburger +limburgite +limbus +limby +lime +limeade +Limean +limeberry +limebush +limehouse +limekiln +limeless +limelight +limelighter +limelike +limeman +limen +limequat +limer +Limerick +limes +limestone +limetta +limettin +limewash +limewater +limewort +limey +Limicolae +limicoline +limicolous +Limidae +liminal +liminary +liminess +liming +limit +limitable +limitableness +limital +limitarian +limitary +limitate +limitation +limitative +limitatively +limited +limitedly +limitedness +limiter +limiting +limitive +limitless +limitlessly +limitlessness +limitrophe +limivorous +limma +limmer +limmock +limmu +limn +limnanth +Limnanthaceae +limnanthaceous +Limnanthemum +Limnanthes +limner +limnery +limnetic +Limnetis +limniad +limnimeter +limnimetric +limnite +limnobiologic +limnobiological +limnobiologically +limnobiology +limnobios +Limnobium +Limnocnida +limnograph +limnologic +limnological +limnologically +limnologist +limnology +limnometer +limnophile +limnophilid +Limnophilidae +limnophilous +limnoplankton +Limnorchis +Limnoria +Limnoriidae +limnorioid +Limodorum +limoid +limonene +limoniad +limonin +limonite +limonitic +limonitization +limonium +Limosa +limose +Limosella +Limosi +limous +limousine +limp +limper +limpet +limphault +limpid +limpidity +limpidly +limpidness +limpily +limpin +limpiness +limping +limpingly +limpingness +limpish +limpkin +limply +limpness +limpsy +limpwort +limpy +limsy +limu +limulid +Limulidae +limuloid +Limuloidea +Limulus +limurite +limy +lin +Lina +lina +linable +Linaceae +linaceous +linaga +linage +linaloa +linalol +linalool +linamarin +Linanthus +Linaria +linarite +linch +linchbolt +linchet +linchpin +linchpinned +lincloth +Lincoln +Lincolnian +Lincolniana +Lincolnlike +linctus +lindackerite +lindane +linden +linder +Lindera +Lindleyan +lindo +lindoite +line +linea +lineage +lineaged +lineal +lineality +lineally +lineament +lineamental +lineamentation +lineameter +linear +linearifolius +linearity +linearization +linearize +linearly +lineate +lineated +lineation +lineature +linecut +lined +lineiform +lineless +linelet +lineman +linen +Linene +linenette +linenize +linenizer +linenman +lineocircular +lineograph +lineolate +lineolated +liner +linesman +Linet +linewalker +linework +ling +linga +Lingayat +lingberry +lingbird +linge +lingel +lingenberry +linger +lingerer +lingerie +lingo +lingonberry +Lingoum +lingtow +lingtowman +lingua +linguacious +linguaciousness +linguadental +linguaeform +lingual +linguale +linguality +lingualize +lingually +linguanasal +Linguata +Linguatula +Linguatulida +Linguatulina +linguatuline +linguatuloid +linguet +linguidental +linguiform +linguipotence +linguist +linguister +linguistic +linguistical +linguistically +linguistician +linguistics +linguistry +lingula +lingulate +lingulated +Lingulella +lingulid +Lingulidae +linguliferous +linguliform +linguloid +linguodental +linguodistal +linguogingival +linguopalatal +linguopapillitis +linguoversion +lingwort +lingy +linha +linhay +linie +liniment +linin +lininess +lining +linitis +liniya +linja +linje +link +linkable +linkage +linkboy +linked +linkedness +linker +linking +linkman +links +linksmith +linkwork +linky +linn +Linnaea +Linnaean +Linnaeanism +linnaeite +Linne +linnet +lino +linolate +linoleic +linolein +linolenate +linolenic +linolenin +linoleum +linolic +linolin +linometer +linon +Linopteris +Linos +Linotype +linotype +linotyper +linotypist +linous +linoxin +linoxyn +linpin +Linsang +linseed +linsey +linstock +lint +lintel +linteled +linteling +linten +linter +lintern +lintie +lintless +lintonite +lintseed +lintwhite +linty +Linum +Linus +linwood +liny +Linyphia +Linyphiidae +liodermia +liomyofibroma +liomyoma +lion +lioncel +Lionel +lionel +lionesque +lioness +lionet +lionheart +lionhearted +lionheartedness +lionhood +lionism +lionizable +lionization +lionize +lionizer +lionlike +lionly +lionproof +lionship +Liothrix +Liotrichi +Liotrichidae +liotrichine +lip +lipa +lipacidemia +lipaciduria +Lipan +Liparian +liparian +liparid +Liparidae +Liparididae +Liparis +liparite +liparocele +liparoid +liparomphalus +liparous +lipase +lipectomy +lipemia +Lipeurus +lipide +lipin +lipless +liplet +liplike +lipoblast +lipoblastoma +Lipobranchia +lipocaic +lipocardiac +lipocele +lipoceratous +lipocere +lipochondroma +lipochrome +lipochromogen +lipoclasis +lipoclastic +lipocyte +lipodystrophia +lipodystrophy +lipoferous +lipofibroma +lipogenesis +lipogenetic +lipogenic +lipogenous +lipogram +lipogrammatic +lipogrammatism +lipogrammatist +lipography +lipohemia +lipoid +lipoidal +lipoidemia +lipoidic +lipolysis +lipolytic +lipoma +lipomata +lipomatosis +lipomatous +lipometabolic +lipometabolism +lipomorph +lipomyoma +lipomyxoma +lipopexia +lipophagic +lipophore +lipopod +Lipopoda +lipoprotein +liposarcoma +liposis +liposome +lipostomy +lipothymial +lipothymic +lipothymy +lipotrophic +lipotrophy +lipotropic +lipotropy +lipotype +Lipotyphla +lipovaccine +lipoxenous +lipoxeny +lipped +lippen +lipper +lipperings +Lippia +lippiness +lipping +lippitude +lippitudo +lippy +lipsanographer +lipsanotheca +lipstick +lipuria +lipwork +liquable +liquamen +liquate +liquation +liquefacient +liquefaction +liquefactive +liquefiable +liquefier +liquefy +liquesce +liquescence +liquescency +liquescent +liqueur +liquid +liquidable +Liquidambar +liquidamber +liquidate +liquidation +liquidator +liquidatorship +liquidity +liquidize +liquidizer +liquidless +liquidly +liquidness +liquidogenic +liquidogenous +liquidy +liquiform +liquor +liquorer +liquorish +liquorishly +liquorishness +liquorist +liquorless +lira +lirate +liration +lire +lirella +lirellate +lirelliform +lirelline +lirellous +Liriodendron +liripipe +liroconite +lis +Lisa +Lisbon +Lise +lisere +Lisette +lish +lisk +Lisle +lisle +lisp +lisper +lispingly +lispund +liss +Lissamphibia +lissamphibian +Lissencephala +lissencephalic +lissencephalous +Lissoflagellata +lissoflagellate +lissom +lissome +lissomely +lissomeness +lissotrichan +Lissotriches +lissotrichous +lissotrichy +list +listable +listed +listedness +listel +listen +listener +listening +lister +Listera +listerellosis +Listeria +Listerian +Listerine +Listerism +Listerize +listing +listless +listlessly +listlessness +listred +listwork +Lisuarte +lit +litaneutical +litany +litanywise +litas +litation +litch +litchi +lite +liter +literacy +literaily +literal +literalism +literalist +literalistic +literality +literalization +literalize +literalizer +literally +literalminded +literalmindedness +literalness +literarian +literariness +literary +literaryism +literate +literati +literation +literatist +literato +literator +literature +literatus +literose +literosity +lith +lithagogue +lithangiuria +lithanthrax +litharge +lithe +lithectasy +lithectomy +lithely +lithemia +lithemic +litheness +lithesome +lithesomeness +lithi +lithia +lithiasis +lithiastic +lithiate +lithic +lithifaction +lithification +lithify +lithite +lithium +litho +lithobiid +Lithobiidae +lithobioid +Lithobius +Lithocarpus +lithocenosis +lithochemistry +lithochromatic +lithochromatics +lithochromatographic +lithochromatography +lithochromography +lithochromy +lithoclase +lithoclast +lithoclastic +lithoclasty +lithoculture +lithocyst +lithocystotomy +Lithodes +lithodesma +lithodialysis +lithodid +Lithodidae +lithodomous +Lithodomus +lithofracteur +lithofractor +lithogenesis +lithogenetic +lithogenous +lithogeny +lithoglyph +lithoglypher +lithoglyphic +lithoglyptic +lithoglyptics +lithograph +lithographer +lithographic +lithographical +lithographically +lithographize +lithography +lithogravure +lithoid +lithoidite +litholabe +litholapaxy +litholatrous +litholatry +lithologic +lithological +lithologically +lithologist +lithology +litholysis +litholyte +litholytic +lithomancy +lithomarge +lithometer +lithonephria +lithonephritis +lithonephrotomy +lithontriptic +lithontriptist +lithontriptor +lithopedion +lithopedium +lithophagous +lithophane +lithophanic +lithophany +lithophilous +lithophone +lithophotography +lithophotogravure +lithophthisis +lithophyl +lithophyllous +lithophysa +lithophysal +lithophyte +lithophytic +lithophytous +lithopone +lithoprint +lithoscope +lithosian +lithosiid +Lithosiidae +Lithosiinae +lithosis +lithosol +lithosperm +lithospermon +lithospermous +Lithospermum +lithosphere +lithotint +lithotome +lithotomic +lithotomical +lithotomist +lithotomize +lithotomous +lithotomy +lithotony +lithotresis +lithotripsy +lithotriptor +lithotrite +lithotritic +lithotritist +lithotrity +lithotype +lithotypic +lithotypy +lithous +lithoxyl +lithsman +Lithuanian +Lithuanic +lithuresis +lithuria +lithy +liticontestation +litigable +litigant +litigate +litigation +litigationist +litigator +litigatory +litigiosity +litigious +litigiously +litigiousness +Litiopa +litiscontest +litiscontestation +litiscontestational +litmus +Litopterna +Litorina +Litorinidae +litorinoid +litotes +litra +Litsea +litster +litten +litter +litterateur +litterer +littermate +littery +little +littleleaf +littleneck +littleness +littlewale +littling +littlish +littoral +Littorella +littress +lituiform +lituite +Lituites +Lituitidae +Lituola +lituoline +lituoloid +liturate +liturgical +liturgically +liturgician +liturgics +liturgiological +liturgiologist +liturgiology +liturgism +liturgist +liturgistic +liturgistical +liturgize +liturgy +litus +lituus +Litvak +Lityerses +litz +Liukiu +Liv +livability +livable +livableness +live +liveborn +lived +livedo +livelihood +livelily +liveliness +livelong +lively +liven +liveness +liver +liverance +liverberry +livered +liverhearted +liverheartedness +liveried +liverish +liverishness +liverleaf +liverless +Liverpudlian +liverwort +liverwurst +livery +liverydom +liveryless +liveryman +livestock +Livian +livid +lividity +lividly +lividness +livier +living +livingless +livingly +livingness +livingstoneite +Livish +Livistona +Livonian +livor +livre +liwan +lixive +lixivial +lixiviate +lixiviation +lixiviator +lixivious +lixivium +Liz +lizard +lizardtail +Lizzie +llama +Llanberisslate +Llandeilo +Llandovery +llano +llautu +Lleu +Llew +Lloyd +Lludd +llyn +Lo +lo +Loa +loa +loach +load +loadage +loaded +loaden +loader +loading +loadless +loadpenny +loadsome +loadstone +loaf +loafer +loaferdom +loaferish +loafing +loafingly +loaflet +loaghtan +loam +loamily +loaminess +loaming +loamless +Loammi +loamy +loan +loanable +loaner +loanin +loanmonger +loanword +Loasa +Loasaceae +loasaceous +loath +loathe +loather +loathful +loathfully +loathfulness +loathing +loathingly +loathliness +loathly +loathness +loathsome +loathsomely +loathsomeness +Loatuko +loave +lob +Lobachevskian +lobal +Lobale +lobar +Lobaria +Lobata +Lobatae +lobate +lobated +lobately +lobation +lobber +lobbish +lobby +lobbyer +lobbyism +lobbyist +lobbyman +lobcock +lobe +lobectomy +lobed +lobefoot +lobefooted +lobeless +lobelet +Lobelia +Lobeliaceae +lobeliaceous +lobelin +lobeline +lobellated +lobfig +lobiform +lobigerous +lobing +lobiped +loblolly +lobo +lobola +lobopodium +Lobosa +lobose +lobotomy +lobscourse +lobscouse +lobscouser +lobster +lobstering +lobsterish +lobsterlike +lobsterproof +lobtail +lobular +Lobularia +lobularly +lobulate +lobulated +lobulation +lobule +lobulette +lobulose +lobulous +lobworm +loca +locable +local +locale +localism +localist +localistic +locality +localizable +localization +localize +localizer +locally +localness +locanda +Locarnist +Locarnite +Locarnize +Locarno +locate +location +locational +locative +locator +locellate +locellus +loch +lochage +lochan +lochetic +lochia +lochial +lochiocolpos +lochiocyte +lochiometra +lochiometritis +lochiopyra +lochiorrhagia +lochiorrhea +lochioschesis +Lochlin +lochometritis +lochoperitonitis +lochopyra +lochus +lochy +loci +lociation +lock +lockable +lockage +Lockatong +lockbox +locked +locker +lockerman +locket +lockful +lockhole +Lockian +Lockianism +locking +lockjaw +lockless +locklet +lockmaker +lockmaking +lockman +lockout +lockpin +Lockport +lockram +locksman +locksmith +locksmithery +locksmithing +lockspit +lockup +lockwork +locky +loco +locodescriptive +locofoco +Locofocoism +locoism +locomobile +locomobility +locomote +locomotility +locomotion +locomotive +locomotively +locomotiveman +locomotiveness +locomotivity +locomotor +locomotory +locomutation +locoweed +Locrian +Locrine +loculament +loculamentose +loculamentous +locular +loculate +loculated +loculation +locule +loculicidal +loculicidally +loculose +loculus +locum +locus +locust +locusta +locustal +locustberry +locustelle +locustid +Locustidae +locusting +locustlike +locution +locutor +locutorship +locutory +lod +Loddigesia +lode +lodemanage +lodesman +lodestar +lodestone +lodestuff +lodge +lodgeable +lodged +lodgeful +lodgeman +lodgepole +lodger +lodgerdom +lodging +lodginghouse +lodgings +lodgment +Lodha +lodicule +Lodoicea +Lodowic +Lodowick +Lodur +Loegria +loess +loessal +loessial +loessic +loessland +loessoid +lof +lofstelle +loft +lofter +loftily +loftiness +lofting +loftless +loftman +loftsman +lofty +log +loganberry +Logania +Loganiaceae +loganiaceous +loganin +logaoedic +logarithm +logarithmal +logarithmetic +logarithmetical +logarithmetically +logarithmic +logarithmical +logarithmically +logarithmomancy +logbook +logcock +loge +logeion +logeum +loggat +logged +logger +loggerhead +loggerheaded +loggia +loggin +logging +loggish +loghead +logheaded +logia +logic +logical +logicalist +logicality +logicalization +logicalize +logically +logicalness +logicaster +logician +logicism +logicist +logicity +logicize +logicless +logie +login +logion +logistic +logistical +logistician +logistics +logium +loglet +loglike +logman +logocracy +logodaedaly +logogogue +logogram +logogrammatic +logograph +logographer +logographic +logographical +logographically +logography +logogriph +logogriphic +logoi +logolatry +logology +logomach +logomacher +logomachic +logomachical +logomachist +logomachize +logomachy +logomancy +logomania +logomaniac +logometer +logometric +logometrical +logometrically +logopedia +logopedics +logorrhea +logos +logothete +logotype +logotypy +Logres +Logria +Logris +logroll +logroller +logrolling +logway +logwise +logwood +logwork +logy +lohan +Lohana +Lohar +lohoch +loimic +loimography +loimology +loin +loincloth +loined +loir +Lois +Loiseleuria +loiter +loiterer +loiteringly +loiteringness +loka +lokao +lokaose +lokapala +loke +loket +lokiec +Lokindra +Lokman +Lola +Loliginidae +Loligo +Lolium +loll +Lollard +Lollardian +Lollardism +Lollardist +Lollardize +Lollardlike +Lollardry +Lollardy +loller +lollingite +lollingly +lollipop +lollop +lollopy +lolly +Lolo +loma +lomastome +lomatine +lomatinous +Lomatium +Lombard +lombard +Lombardeer +Lombardesque +Lombardian +Lombardic +lomboy +Lombrosian +loment +lomentaceous +Lomentaria +lomentariaceous +lomentum +lomita +lommock +Lonchocarpus +Lonchopteridae +Londinensian +Londoner +Londonese +Londonesque +Londonian +Londonish +Londonism +Londonization +Londonize +Londony +Londres +lone +lonelihood +lonelily +loneliness +lonely +loneness +lonesome +lonesomely +lonesomeness +long +longa +longan +longanimity +longanimous +Longaville +longbeak +longbeard +longboat +longbow +longcloth +longe +longear +longer +longeval +longevity +longevous +longfelt +longfin +longful +longhair +longhand +longhead +longheaded +longheadedly +longheadedness +longhorn +longicaudal +longicaudate +longicone +longicorn +Longicornia +longilateral +longilingual +longiloquence +longimanous +longimetric +longimetry +longing +longingly +longingness +Longinian +longinquity +longipennate +longipennine +longirostral +longirostrate +longirostrine +Longirostrines +longisection +longish +longitude +longitudinal +longitudinally +longjaw +longleaf +longlegs +longly +longmouthed +longness +Longobard +Longobardi +Longobardian +Longobardic +longs +longshanks +longshore +longshoreman +longsome +longsomely +longsomeness +longspun +longspur +longtail +longue +longulite +longway +longways +longwise +longwool +longwork +longwort +Lonicera +Lonk +lonquhard +lontar +loo +looby +lood +loof +loofah +loofie +loofness +look +looker +looking +lookout +lookum +loom +loomer +loomery +looming +loon +loonery +looney +loony +loop +looper +loopful +loophole +looping +loopist +looplet +looplike +loopy +loose +loosely +loosemouthed +loosen +loosener +looseness +looser +loosestrife +loosing +loosish +loot +lootable +looten +looter +lootie +lootiewallah +lootsman +lop +lope +loper +Lopezia +lophiid +Lophiidae +lophine +Lophiodon +lophiodont +Lophiodontidae +lophiodontoid +Lophiola +Lophiomyidae +Lophiomyinae +Lophiomys +lophiostomate +lophiostomous +lophobranch +lophobranchiate +Lophobranchii +lophocalthrops +lophocercal +Lophocome +Lophocomi +Lophodermium +lophodont +Lophophora +lophophoral +lophophore +Lophophorinae +lophophorine +Lophophorus +lophophytosis +Lophopoda +Lophornis +Lophortyx +lophosteon +lophotriaene +lophotrichic +lophotrichous +Lophura +lopolith +loppard +lopper +loppet +lopping +loppy +lopseed +lopsided +lopsidedly +lopsidedness +lopstick +loquacious +loquaciously +loquaciousness +loquacity +loquat +loquence +loquent +loquently +Lora +lora +loral +loran +lorandite +loranskite +Loranthaceae +loranthaceous +Loranthus +lorarius +lorate +lorcha +lord +lording +lordkin +lordless +lordlet +lordlike +lordlily +lordliness +lordling +lordly +lordolatry +lordosis +lordotic +lordship +lordwood +lordy +lore +loreal +lored +loreless +Lorenzan +lorenzenite +Lorettine +lorettoite +lorgnette +lori +loric +lorica +loricarian +Loricariidae +loricarioid +Loricata +loricate +Loricati +lorication +loricoid +lorikeet +lorilet +lorimer +loriot +loris +Lorius +lormery +lorn +lornness +loro +Lorraine +Lorrainer +Lorrainese +lorriker +lorry +lors +lorum +lory +losable +losableness +lose +losel +loselism +losenger +loser +losh +losing +loss +lossenite +lossless +lossproof +lost +lostling +lostness +Lot +lot +Lota +lota +lotase +lote +lotebush +Lotharingian +lotic +lotiform +lotion +lotment +Lotophagi +lotophagous +lotophagously +lotrite +lots +Lotta +Lotte +lotter +lottery +Lottie +lotto +Lotuko +lotus +lotusin +lotuslike +Lou +louch +louchettes +loud +louden +loudering +loudish +loudly +loudmouthed +loudness +louey +lough +lougheen +Louie +Louis +Louisa +Louise +Louisiana +Louisianian +louisine +louk +loukoum +loulu +lounder +lounderer +lounge +lounger +lounging +loungingly +loungy +Loup +loup +loupe +lour +lourdy +louse +louseberry +lousewort +lousily +lousiness +louster +lousy +lout +louter +louther +loutish +loutishly +loutishness +loutrophoros +louty +louvar +louver +louvered +louvering +louverwork +Louvre +lovability +lovable +lovableness +lovably +lovage +love +lovebird +loveflower +loveful +lovelass +loveless +lovelessly +lovelessness +lovelihead +lovelily +loveliness +loveling +lovelock +lovelorn +lovelornness +lovely +loveman +lovemate +lovemonger +loveproof +lover +loverdom +lovered +loverhood +lovering +loverless +loverliness +loverly +lovership +loverwise +lovesick +lovesickness +lovesome +lovesomely +lovesomeness +loveworth +loveworthy +loving +lovingly +lovingness +low +lowa +lowan +lowbell +lowborn +lowboy +lowbred +lowdah +lowder +loweite +lower +lowerable +lowerclassman +lowerer +lowering +loweringly +loweringness +lowermost +lowery +lowigite +lowish +lowishly +lowishness +lowland +lowlander +lowlily +lowliness +lowly +lowmen +lowmost +lown +lowness +lownly +lowth +Lowville +lowwood +lowy +lox +loxia +loxic +Loxiinae +loxoclase +loxocosm +loxodograph +Loxodon +loxodont +Loxodonta +loxodontous +loxodrome +loxodromic +loxodromical +loxodromically +loxodromics +loxodromism +Loxolophodon +loxolophodont +Loxomma +loxophthalmus +Loxosoma +Loxosomidae +loxotic +loxotomy +loy +loyal +loyalism +loyalist +loyalize +loyally +loyalness +loyalty +Loyolism +Loyolite +lozenge +lozenged +lozenger +lozengeways +lozengewise +lozengy +Lu +Luba +lubber +lubbercock +Lubberland +lubberlike +lubberliness +lubberly +lube +lubra +lubric +lubricant +lubricate +lubrication +lubricational +lubricative +lubricator +lubricatory +lubricious +lubricity +lubricous +lubrifaction +lubrification +lubrify +lubritorian +lubritorium +Lucan +Lucania +lucanid +Lucanidae +Lucanus +lucarne +Lucayan +lucban +Lucchese +luce +lucence +lucency +lucent +Lucentio +lucently +Luceres +lucern +lucernal +Lucernaria +lucernarian +Lucernariidae +lucerne +lucet +Luchuan +Lucia +Lucian +Luciana +lucible +lucid +lucida +lucidity +lucidly +lucidness +lucifee +Lucifer +luciferase +Luciferian +Luciferidae +luciferin +luciferoid +luciferous +luciferously +luciferousness +lucific +luciform +lucifugal +lucifugous +lucigen +Lucile +Lucilia +lucimeter +Lucina +Lucinacea +Lucinda +Lucinidae +lucinoid +Lucite +Lucius +lucivee +luck +lucken +luckful +luckie +luckily +luckiness +luckless +lucklessly +lucklessness +Lucknow +lucky +lucration +lucrative +lucratively +lucrativeness +lucre +Lucrece +Lucretia +Lucretian +Lucretius +lucriferous +lucriferousness +lucrific +lucrify +Lucrine +luctation +luctiferous +luctiferousness +lucubrate +lucubration +lucubrator +lucubratory +lucule +luculent +luculently +Lucullan +lucullite +Lucuma +lucumia +Lucumo +lucumony +Lucy +lucy +ludden +Luddism +Luddite +Ludditism +ludefisk +Ludgate +Ludgathian +Ludgatian +Ludian +ludibrious +ludibry +ludicropathetic +ludicroserious +ludicrosity +ludicrosplenetic +ludicrous +ludicrously +ludicrousness +ludification +ludlamite +Ludlovian +Ludlow +ludo +Ludolphian +Ludwig +ludwigite +lue +Luella +lues +luetic +luetically +lufberry +lufbery +luff +Luffa +Lug +lug +Luganda +luge +luger +luggage +luggageless +luggar +lugged +lugger +luggie +Luggnagg +lugmark +Lugnas +lugsail +lugsome +lugubriosity +lugubrious +lugubriously +lugubriousness +lugworm +luhinga +Luian +Luigi +luigino +Luiseno +Luite +lujaurite +Luke +luke +lukely +lukeness +lukewarm +lukewarmish +lukewarmly +lukewarmness +lukewarmth +Lula +lulab +lull +lullaby +luller +Lullian +lulliloo +lullingly +Lulu +lulu +lum +lumachel +lumbaginous +lumbago +lumbang +lumbar +lumbarization +lumbayao +lumber +lumberdar +lumberdom +lumberer +lumbering +lumberingly +lumberingness +lumberjack +lumberless +lumberly +lumberman +lumbersome +lumberyard +lumbocolostomy +lumbocolotomy +lumbocostal +lumbodorsal +lumbodynia +lumbosacral +lumbovertebral +lumbrical +lumbricalis +Lumbricidae +lumbriciform +lumbricine +lumbricoid +lumbricosis +Lumbricus +lumbrous +lumen +luminaire +Luminal +luminal +luminance +luminant +luminarious +luminarism +luminarist +luminary +luminate +lumination +luminative +luminator +lumine +luminesce +luminescence +luminescent +luminiferous +luminificent +luminism +luminist +luminologist +luminometer +luminosity +luminous +luminously +luminousness +lummox +lummy +lump +lumper +lumpet +lumpfish +lumpily +lumpiness +lumping +lumpingly +lumpish +lumpishly +lumpishness +lumpkin +lumpman +lumpsucker +lumpy +luna +lunacy +lunambulism +lunar +lunare +Lunaria +lunarian +lunarist +lunarium +lunary +lunate +lunatellus +lunately +lunatic +lunatically +lunation +lunatize +lunatum +lunch +luncheon +luncheoner +luncheonette +luncheonless +luncher +lunchroom +Lunda +Lundinarium +lundress +lundyfoot +lune +Lunel +lunes +lunette +lung +lunge +lunged +lungeous +lunger +lungfish +lungflower +lungful +lungi +lungie +lungis +lungless +lungmotor +lungsick +lungworm +lungwort +lungy +lunicurrent +luniform +lunisolar +lunistice +lunistitial +lunitidal +Lunka +lunkhead +lunn +lunoid +lunt +lunula +lunular +Lunularia +lunulate +lunulated +lunule +lunulet +lunulite +Lunulites +Luo +lupanarian +lupanine +lupe +lupeol +lupeose +Lupercal +Lupercalia +Lupercalian +Luperci +lupetidine +lupicide +Lupid +lupiform +lupinaster +lupine +lupinin +lupinine +lupinosis +lupinous +Lupinus +lupis +lupoid +lupous +lupulic +lupulin +lupuline +lupulinic +lupulinous +lupulinum +lupulus +lupus +lupuserythematosus +Lur +lura +lural +lurch +lurcher +lurchingfully +lurchingly +lurchline +lurdan +lurdanism +lure +lureful +lurement +lurer +luresome +lurg +lurgworm +Luri +lurid +luridity +luridly +luridness +luringly +lurk +lurker +lurkingly +lurkingness +lurky +lurrier +lurry +Lusatian +Luscinia +luscious +lusciously +lusciousness +lush +Lushai +lushburg +Lushei +lusher +lushly +lushness +lushy +Lusiad +Lusian +Lusitania +Lusitanian +lusk +lusky +lusory +lust +luster +lusterer +lusterless +lusterware +lustful +lustfully +lustfulness +lustihead +lustily +lustiness +lustless +lustra +lustral +lustrant +lustrate +lustration +lustrative +lustratory +lustreless +lustrical +lustrification +lustrify +lustrine +lustring +lustrous +lustrously +lustrousness +lustrum +lusty +lut +lutaceous +lutanist +lutany +Lutao +lutation +Lutayo +lute +luteal +lutecia +lutecium +lutein +luteinization +luteinize +lutelet +lutemaker +lutemaking +luteo +luteocobaltic +luteofulvous +luteofuscescent +luteofuscous +luteolin +luteolous +luteoma +luteorufescent +luteous +luteovirescent +luter +lutescent +lutestring +Lutetia +Lutetian +lutetium +luteway +lutfisk +Luther +Lutheran +Lutheranic +Lutheranism +Lutheranize +Lutheranizer +Lutherism +Lutherist +luthern +luthier +lutianid +Lutianidae +lutianoid +Lutianus +lutidine +lutidinic +luting +lutist +Lutjanidae +Lutjanus +lutose +Lutra +Lutraria +Lutreola +lutrin +Lutrinae +lutrine +lutulence +lutulent +Luvaridae +Luvian +Luvish +Luwian +lux +luxate +luxation +luxe +Luxemburger +Luxemburgian +luxulianite +luxuriance +luxuriancy +luxuriant +luxuriantly +luxuriantness +luxuriate +luxuriation +luxurious +luxuriously +luxuriousness +luxurist +luxury +luxus +Luzula +Lwo +ly +lyam +lyard +Lyas +Lycaena +lycaenid +Lycaenidae +lycanthrope +lycanthropia +lycanthropic +lycanthropist +lycanthropize +lycanthropous +lycanthropy +lyceal +lyceum +Lychnic +Lychnis +lychnomancy +lychnoscope +lychnoscopic +Lycian +lycid +Lycidae +Lycium +Lycodes +Lycodidae +lycodoid +lycopene +Lycoperdaceae +lycoperdaceous +Lycoperdales +lycoperdoid +Lycoperdon +lycoperdon +Lycopersicon +lycopin +lycopod +lycopode +Lycopodiaceae +lycopodiaceous +Lycopodiales +Lycopodium +Lycopsida +Lycopsis +Lycopus +lycorine +Lycosa +lycosid +Lycosidae +lyctid +Lyctidae +Lyctus +Lycus +lyddite +Lydia +Lydian +lydite +lye +Lyencephala +lyencephalous +lyery +lygaeid +Lygaeidae +Lygeum +Lygodium +Lygosoma +lying +lyingly +Lymantria +lymantriid +Lymantriidae +lymhpangiophlebitis +Lymnaea +lymnaean +lymnaeid +Lymnaeidae +lymph +lymphad +lymphadenectasia +lymphadenectasis +lymphadenia +lymphadenitis +lymphadenoid +lymphadenoma +lymphadenopathy +lymphadenosis +lymphaemia +lymphagogue +lymphangeitis +lymphangial +lymphangiectasis +lymphangiectatic +lymphangiectodes +lymphangiitis +lymphangioendothelioma +lymphangiofibroma +lymphangiology +lymphangioma +lymphangiomatous +lymphangioplasty +lymphangiosarcoma +lymphangiotomy +lymphangitic +lymphangitis +lymphatic +lymphatical +lymphation +lymphatism +lymphatitis +lymphatolysin +lymphatolysis +lymphatolytic +lymphectasia +lymphedema +lymphemia +lymphenteritis +lymphoblast +lymphoblastic +lymphoblastoma +lymphoblastosis +lymphocele +lymphocyst +lymphocystosis +lymphocyte +lymphocythemia +lymphocytic +lymphocytoma +lymphocytomatosis +lymphocytosis +lymphocytotic +lymphocytotoxin +lymphodermia +lymphoduct +lymphogenic +lymphogenous +lymphoglandula +lymphogranuloma +lymphoid +lymphoidectomy +lymphology +lymphoma +lymphomatosis +lymphomatous +lymphomonocyte +lymphomyxoma +lymphopathy +lymphopenia +lymphopenial +lymphopoiesis +lymphopoietic +lymphoprotease +lymphorrhage +lymphorrhagia +lymphorrhagic +lymphorrhea +lymphosarcoma +lymphosarcomatosis +lymphosarcomatous +lymphosporidiosis +lymphostasis +lymphotaxis +lymphotome +lymphotomy +lymphotoxemia +lymphotoxin +lymphotrophic +lymphotrophy +lymphous +lymphuria +lymphy +lyncean +Lynceus +lynch +lynchable +lyncher +Lyncid +lyncine +Lynette +Lyngbyaceae +Lyngbyeae +lynnhaven +lynx +Lyomeri +lyomerous +Lyon +Lyonese +Lyonetia +lyonetiid +Lyonetiidae +Lyonnais +lyonnaise +Lyonnesse +lyophile +lyophilization +lyophilize +lyophobe +Lyopoma +Lyopomata +lyopomatous +lyotrope +lypemania +Lyperosia +lypothymia +lyra +Lyraid +lyrate +lyrated +lyrately +lyraway +lyre +lyrebird +lyreflower +lyreman +lyretail +lyric +lyrical +lyrically +lyricalness +lyrichord +lyricism +lyricist +lyricize +Lyrid +lyriform +lyrism +lyrist +Lyrurus +lys +Lysander +lysate +lyse +Lysenkoism +lysidine +lysigenic +lysigenous +lysigenously +Lysiloma +Lysimachia +Lysimachus +lysimeter +lysin +lysine +lysis +Lysistrata +lysogen +lysogenesis +lysogenetic +lysogenic +lysozyme +lyssa +lyssic +lyssophobia +lyterian +Lythraceae +lythraceous +Lythrum +lytic +lytta +lyxose +M +m +Ma +ma +maam +maamselle +Mab +Maba +Mabel +Mabellona +mabi +Mabinogion +mabolo +Mac +mac +macaasim +macabre +macabresque +Macaca +macaco +Macacus +macadam +Macadamia +macadamite +macadamization +macadamize +macadamizer +Macaglia +macan +macana +Macanese +macao +macaque +Macaranga +Macarani +Macareus +macarism +macarize +macaroni +macaronic +macaronical +macaronically +macaronicism +macaronism +macaroon +Macartney +Macassar +Macassarese +macaw +Macbeth +Maccabaeus +Maccabean +Maccabees +maccaboy +macco +maccoboy +Macduff +mace +macedoine +Macedon +Macedonian +Macedonic +macehead +maceman +macer +macerate +macerater +maceration +Macflecknoe +machairodont +Machairodontidae +Machairodontinae +Machairodus +machan +machar +machete +Machetes +machi +Machiavel +Machiavellian +Machiavellianism +Machiavellianly +Machiavellic +Machiavellism +machiavellist +Machiavellistic +machicolate +machicolation +machicoulis +Machicui +machila +Machilidae +Machilis +machin +machinability +machinable +machinal +machinate +machination +machinator +machine +machineful +machineless +machinelike +machinely +machineman +machinemonger +machiner +machinery +machinification +machinify +machinism +machinist +machinization +machinize +machinoclast +machinofacture +machinotechnique +machinule +Machogo +machopolyp +machree +macies +Macigno +macilence +macilency +macilent +mack +mackenboy +mackerel +mackereler +mackereling +Mackinaw +mackins +mackintosh +mackintoshite +mackle +macklike +macle +Macleaya +macled +Maclura +Maclurea +maclurin +Macmillanite +maco +Macon +maconite +Macracanthorhynchus +macracanthrorhynchiasis +macradenous +macrame +macrander +macrandrous +macrauchene +Macrauchenia +macraucheniid +Macraucheniidae +macraucheniiform +macrauchenioid +macrencephalic +macrencephalous +macro +macroanalysis +macroanalyst +macroanalytical +macrobacterium +macrobian +macrobiosis +macrobiote +macrobiotic +macrobiotics +Macrobiotus +macroblast +macrobrachia +macrocarpous +Macrocentrinae +Macrocentrus +macrocephalia +macrocephalic +macrocephalism +macrocephalous +macrocephalus +macrocephaly +macrochaeta +macrocheilia +Macrochelys +macrochemical +macrochemically +macrochemistry +Macrochira +macrochiran +Macrochires +macrochiria +Macrochiroptera +macrochiropteran +macrocladous +macroclimate +macroclimatic +macrococcus +macrocoly +macroconidial +macroconidium +macroconjugant +macrocornea +macrocosm +macrocosmic +macrocosmical +macrocosmology +macrocosmos +macrocrystalline +macrocyst +Macrocystis +macrocyte +macrocythemia +macrocytic +macrocytosis +macrodactyl +macrodactylia +macrodactylic +macrodactylism +macrodactylous +macrodactyly +macrodiagonal +macrodomatic +macrodome +macrodont +macrodontia +macrodontism +macroelement +macroergate +macroevolution +macrofarad +macrogamete +macrogametocyte +macrogamy +macrogastria +macroglossate +macroglossia +macrognathic +macrognathism +macrognathous +macrogonidium +macrograph +macrographic +macrography +macrolepidoptera +macrolepidopterous +macrology +macromandibular +macromania +macromastia +macromazia +macromelia +macromeral +macromere +macromeric +macromerite +macromeritic +macromesentery +macrometer +macromethod +macromolecule +macromyelon +macromyelonal +macron +macronuclear +macronucleus +macronutrient +macropetalous +macrophage +macrophagocyte +macrophagus +Macrophoma +macrophotograph +macrophotography +macrophyllous +macrophysics +macropia +macropinacoid +macropinacoidal +macroplankton +macroplasia +macroplastia +macropleural +macropodia +Macropodidae +Macropodinae +macropodine +macropodous +macroprism +macroprosopia +macropsia +macropteran +macropterous +Macropus +Macropygia +macropyramid +macroreaction +Macrorhamphosidae +Macrorhamphosus +macrorhinia +Macrorhinus +macroscelia +Macroscelides +macroscian +macroscopic +macroscopical +macroscopically +macroseism +macroseismic +macroseismograph +macrosepalous +macroseptum +macrosmatic +macrosomatia +macrosomatous +macrosomia +macrosplanchnic +macrosporange +macrosporangium +macrospore +macrosporic +Macrosporium +macrosporophore +macrosporophyl +macrosporophyll +Macrostachya +macrostomatous +macrostomia +macrostructural +macrostructure +macrostylospore +macrostylous +macrosymbiont +macrothere +Macrotheriidae +macrotherioid +Macrotherium +macrotherm +macrotia +macrotin +Macrotolagus +macrotome +macrotone +macrotous +macrourid +Macrouridae +Macrourus +Macrozamia +macrozoogonidium +macrozoospore +Macrura +macrural +macruran +macruroid +macrurous +mactation +Mactra +Mactridae +mactroid +macuca +macula +macular +maculate +maculated +maculation +macule +maculicole +maculicolous +maculiferous +maculocerebral +maculopapular +maculose +Macusi +macuta +mad +Madagascan +Madagascar +Madagascarian +Madagass +madam +madame +madapollam +madarosis +madarotic +madbrain +madbrained +madcap +madden +maddening +maddeningly +maddeningness +madder +madderish +madderwort +madding +maddingly +maddish +maddle +made +Madecase +madefaction +madefy +Madegassy +Madeira +Madeiran +Madeline +madeline +Madelon +madescent +Madge +madhouse +madhuca +Madhva +Madi +Madia +madid +madidans +Madiga +madisterium +madling +madly +madman +madnep +madness +mado +Madoc +Madonna +Madonnahood +Madonnaish +Madonnalike +madoqua +Madotheca +madrague +Madras +madrasah +Madrasi +madreperl +Madrepora +Madreporacea +madreporacean +Madreporaria +madreporarian +madrepore +madreporian +madreporic +madreporiform +madreporite +madreporitic +Madrid +madrier +madrigal +madrigaler +madrigaletto +madrigalian +madrigalist +Madrilene +Madrilenian +madrona +madship +madstone +Madurese +maduro +madweed +madwoman +madwort +mae +Maeandra +Maeandrina +maeandrine +maeandriniform +maeandrinoid +maeandroid +Maecenas +Maecenasship +maegbote +Maelstrom +Maemacterion +maenad +maenadic +maenadism +maenaite +Maenalus +Maenidae +Maeonian +Maeonides +maestri +maestro +maffia +maffick +mafficker +maffle +mafflin +mafic +mafoo +mafura +mag +Maga +Magadhi +magadis +magadize +Magahi +Magalensia +magani +magas +magazinable +magazinage +magazine +magazinelet +magaziner +magazinette +magazinish +magazinism +magazinist +magaziny +Magdalen +Magdalene +Magdalenian +mage +Magellan +Magellanian +Magellanic +magenta +magged +Maggie +maggle +maggot +maggotiness +maggotpie +maggoty +Maggy +Magh +Maghi +Maghrib +Maghribi +Magi +magi +Magian +Magianism +magic +magical +magicalize +magically +magicdom +magician +magicianship +magicked +magicking +Magindanao +magiric +magirics +magirist +magiristic +magirological +magirologist +magirology +Magism +magister +magisterial +magisteriality +magisterially +magisterialness +magistery +magistracy +magistral +magistrality +magistrally +magistrand +magistrant +magistrate +magistrateship +magistratic +magistratical +magistratically +magistrative +magistrature +Maglemose +Maglemosean +Maglemosian +magma +magmatic +magnanimity +magnanimous +magnanimously +magnanimousness +magnascope +magnascopic +magnate +magnecrystallic +magnelectric +magneoptic +magnes +magnesia +magnesial +magnesian +magnesic +magnesioferrite +magnesite +magnesium +magnet +magneta +magnetic +magnetical +magnetically +magneticalness +magnetician +magnetics +magnetiferous +magnetification +magnetify +magnetimeter +magnetism +magnetist +magnetite +magnetitic +magnetizability +magnetizable +magnetization +magnetize +magnetizer +magneto +magnetobell +magnetochemical +magnetochemistry +magnetod +magnetodynamo +magnetoelectric +magnetoelectrical +magnetoelectricity +magnetogenerator +magnetogram +magnetograph +magnetographic +magnetoid +magnetomachine +magnetometer +magnetometric +magnetometrical +magnetometrically +magnetometry +magnetomotive +magnetomotor +magneton +magnetooptic +magnetooptical +magnetooptics +magnetophone +magnetophonograph +magnetoplumbite +magnetoprinter +magnetoscope +magnetostriction +magnetotelegraph +magnetotelephone +magnetotherapy +magnetotransmitter +magnetron +magnicaudate +magnicaudatous +magnifiable +magnific +magnifical +magnifically +Magnificat +magnification +magnificative +magnifice +magnificence +magnificent +magnificently +magnificentness +magnifico +magnifier +magnify +magniloquence +magniloquent +magniloquently +magniloquy +magnipotence +magnipotent +magnirostrate +magnisonant +magnitude +magnitudinous +magnochromite +magnoferrite +Magnolia +magnolia +Magnoliaceae +magnoliaceous +magnum +Magog +magot +magpie +magpied +magpieish +magsman +maguari +maguey +Magyar +Magyaran +Magyarism +Magyarization +Magyarize +maha +mahaleb +mahalla +mahant +mahar +maharaja +maharajrana +maharana +maharanee +maharani +maharao +Maharashtri +maharawal +maharawat +mahatma +mahatmaism +Mahayana +Mahayanism +Mahayanist +Mahayanistic +Mahdi +Mahdian +Mahdiship +Mahdism +Mahdist +Mahi +Mahican +mahmal +mahmudi +mahoe +mahoganize +mahogany +mahoitre +maholi +maholtine +Mahomet +Mahometry +mahone +Mahonia +Mahori +Mahound +mahout +Mahra +Mahran +Mahri +mahseer +mahua +mahuang +Maia +Maiacca +Maianthemum +maid +Maida +maidan +maiden +maidenhair +maidenhead +maidenhood +maidenish +maidenism +maidenlike +maidenliness +maidenly +maidenship +maidenweed +maidhood +Maidie +maidish +maidism +maidkin +maidlike +maidling +maidservant +Maidu +maidy +maiefic +maieutic +maieutical +maieutics +maigre +maiid +Maiidae +mail +mailable +mailbag +mailbox +mailclad +mailed +mailer +mailguard +mailie +maillechort +mailless +mailman +mailplane +maim +maimed +maimedly +maimedness +maimer +maimon +Maimonidean +Maimonist +main +Mainan +Maine +mainferre +mainlander +mainly +mainmast +mainmortable +mainour +mainpast +mainpernable +mainpernor +mainpin +mainport +mainpost +mainprise +mains +mainsail +mainsheet +mainspring +mainstay +Mainstreeter +Mainstreetism +maint +maintain +maintainable +maintainableness +maintainer +maintainment +maintainor +maintenance +Maintenon +maintop +maintopman +maioid +Maioidea +maioidean +Maioli +Maiongkong +Maipure +mairatour +maire +maisonette +Maithili +maitlandite +Maitreya +Maius +maize +maizebird +maizenic +maizer +Maja +Majagga +majagua +Majesta +majestic +majestical +majestically +majesticalness +majesticness +majestious +majesty +majestyship +Majlis +majo +majolica +majolist +majoon +major +majorate +majoration +Majorcan +majorette +Majorism +Majorist +Majoristic +majority +majorize +majorship +majuscular +majuscule +makable +Makah +Makaraka +Makari +Makassar +make +makebate +makedom +makefast +maker +makeress +makership +makeshift +makeshiftiness +makeshiftness +makeshifty +makeweight +makhzan +maki +makimono +making +makluk +mako +Makonde +makroskelic +Maku +Makua +makuk +mal +mala +malaanonang +Malabar +Malabarese +malabathrum +malacanthid +Malacanthidae +malacanthine +Malacanthus +Malacca +Malaccan +malaccident +Malaceae +malaceous +malachite +malacia +Malaclemys +Malacobdella +Malacocotylea +malacoderm +Malacodermatidae +malacodermatous +Malacodermidae +malacodermous +malacoid +malacolite +malacological +malacologist +malacology +malacon +malacophilous +malacophonous +malacophyllous +malacopod +Malacopoda +malacopodous +malacopterygian +Malacopterygii +malacopterygious +Malacoscolices +Malacoscolicine +Malacosoma +Malacostraca +malacostracan +malacostracology +malacostracous +malactic +maladaptation +maladdress +maladive +maladjust +maladjusted +maladjustive +maladjustment +maladminister +maladministration +maladministrator +maladroit +maladroitly +maladroitness +maladventure +malady +Malaga +Malagasy +Malagigi +malagma +malaguena +malahack +malaise +malakin +malalignment +malambo +malandered +malanders +malandrous +malanga +malapaho +malapert +malapertly +malapertness +malapi +malapplication +malappointment +malappropriate +malappropriation +malaprop +malapropian +malapropish +malapropism +malapropoism +malapropos +Malapterurus +malar +malaria +malarial +malariaproof +malarin +malarioid +malariologist +malariology +malarious +malarkey +malaroma +malarrangement +malasapsap +malassimilation +malassociation +malate +malati +malattress +malax +malaxable +malaxage +malaxate +malaxation +malaxator +malaxerman +Malaxis +Malay +Malayalam +Malayalim +Malayan +Malayic +Malayize +Malayoid +Malaysian +malbehavior +malbrouck +malchite +Malchus +malconceived +malconduct +malconformation +malconstruction +malcontent +malcontented +malcontentedly +malcontentedness +malcontentism +malcontently +malcontentment +malconvenance +malcreated +malcultivation +maldeveloped +maldevelopment +maldigestion +maldirection +maldistribution +Maldivian +maldonite +malduck +Male +male +malease +maleate +Malebolge +Malebolgian +Malebolgic +Malebranchism +Malecite +maledicent +maledict +malediction +maledictive +maledictory +maleducation +malefaction +malefactor +malefactory +malefactress +malefical +malefically +maleficence +maleficent +maleficial +maleficiate +maleficiation +maleic +maleinoid +malella +Malemute +maleness +malengine +maleo +maleruption +Malesherbia +Malesherbiaceae +malesherbiaceous +malevolence +malevolency +malevolent +malevolently +malexecution +malfeasance +malfeasant +malfed +malformation +malformed +malfortune +malfunction +malgovernment +malgrace +malguzar +malguzari +malhonest +malhygiene +mali +malic +malice +maliceful +maliceproof +malicho +malicious +maliciously +maliciousness +malicorium +malidentification +maliferous +maliform +malign +malignance +malignancy +malignant +malignantly +malignation +maligner +malignify +malignity +malignly +malignment +malik +malikadna +malikala +malikana +Maliki +Malikite +maline +malines +malinfluence +malinger +malingerer +malingery +Malinois +malinowskite +malinstitution +malinstruction +malintent +malism +malison +malist +malistic +malkin +Malkite +mall +malladrite +mallangong +mallard +mallardite +malleability +malleabilization +malleable +malleableize +malleableized +malleableness +malleablize +malleal +mallear +malleate +malleation +mallee +Malleifera +malleiferous +malleiform +mallein +malleinization +malleinize +mallemaroking +mallemuck +malleoincudal +malleolable +malleolar +malleolus +mallet +malleus +Malling +Mallophaga +mallophagan +mallophagous +malloseismic +Mallotus +mallow +mallowwort +mallum +mallus +malm +Malmaison +malmignatte +malmsey +malmstone +malmy +malnourished +malnourishment +malnutrite +malnutrition +malo +malobservance +malobservation +maloccluded +malocclusion +malodor +malodorant +malodorous +malodorously +malodorousness +malojilla +malonate +malonic +malonyl +malonylurea +Malope +maloperation +malorganization +malorganized +malouah +malpais +Malpighia +Malpighiaceae +malpighiaceous +Malpighian +malplaced +malpoise +malposed +malposition +malpractice +malpractioner +malpraxis +malpresentation +malproportion +malproportioned +malpropriety +malpublication +malreasoning +malrotation +malshapen +malt +maltable +maltase +malter +Maltese +maltha +Malthe +malthouse +Malthusian +Malthusianism +Malthusiast +maltiness +malting +maltman +Malto +maltobiose +maltodextrin +maltodextrine +maltolte +maltose +maltreat +maltreatment +maltreator +maltster +malturned +maltworm +malty +malunion +Malurinae +malurine +Malurus +Malus +Malva +Malvaceae +malvaceous +Malvales +malvasia +malvasian +Malvastrum +malversation +malverse +malvoisie +malvolition +Mam +mamba +mambo +mameliere +mamelonation +mameluco +Mameluke +Mamercus +Mamers +Mamertine +Mamie +Mamilius +mamlatdar +mamma +mammal +mammalgia +Mammalia +mammalian +mammaliferous +mammality +mammalogical +mammalogist +mammalogy +mammary +mammate +Mammea +mammectomy +mammee +mammer +Mammifera +mammiferous +mammiform +mammilla +mammillaplasty +mammillar +Mammillaria +mammillary +mammillate +mammillated +mammillation +mammilliform +mammilloid +mammitis +mammock +mammogen +mammogenic +mammogenically +mammon +mammondom +mammoniacal +mammonish +mammonism +mammonist +mammonistic +mammonite +mammonitish +mammonization +mammonize +mammonolatry +Mammonteus +mammoth +mammothrept +mammula +mammular +Mammut +Mammutidae +mammy +mamo +man +mana +Manabozho +manacle +Manacus +manage +manageability +manageable +manageableness +manageably +managee +manageless +management +managemental +manager +managerdom +manageress +managerial +managerially +managership +managery +manaism +manakin +manal +manas +Manasquan +manatee +Manatidae +manatine +manatoid +Manatus +manavel +manavelins +manbird +manbot +manche +Manchester +Manchesterdom +Manchesterism +Manchesterist +Manchestrian +manchet +manchineel +Manchu +Manchurian +mancinism +mancipable +mancipant +mancipate +mancipation +mancipative +mancipatory +mancipee +mancipium +manciple +mancipleship +mancipular +mancono +Mancunian +mancus +mand +Mandaean +Mandaeism +Mandaic +Mandaite +mandala +Mandalay +mandament +mandamus +Mandan +mandant +mandarah +mandarin +mandarinate +mandarindom +mandariness +mandarinic +mandarinism +mandarinize +mandarinship +mandatary +mandate +mandatee +mandation +mandative +mandator +mandatorily +mandatory +mandatum +Mande +mandelate +mandelic +mandible +mandibula +mandibular +mandibulary +Mandibulata +mandibulate +mandibulated +mandibuliform +mandibulohyoid +mandibulomaxillary +mandibulopharyngeal +mandibulosuspensorial +mandil +mandilion +Mandingan +Mandingo +mandola +mandolin +mandolinist +mandolute +mandom +mandora +mandore +mandra +mandragora +mandrake +mandrel +mandriarch +mandrill +mandrin +mandruka +mandua +manducable +manducate +manducation +manducatory +mandyas +mane +maned +manege +manei +maneless +manent +manerial +manes +manesheet +maness +Manetti +Manettia +maneuver +maneuverability +maneuverable +maneuverer +maneuvrability +maneuvrable +maney +Manfred +Manfreda +manful +manfully +manfulness +mang +manga +mangabeira +mangabey +mangal +manganapatite +manganate +manganblende +manganbrucite +manganeisen +manganese +manganesian +manganetic +manganhedenbergite +manganic +manganiferous +manganite +manganium +manganize +Manganja +manganocalcite +manganocolumbite +manganophyllite +manganosiderite +manganosite +manganostibiite +manganotantalite +manganous +manganpectolite +Mangar +Mangbattu +mange +mangeao +mangel +mangelin +manger +mangerite +mangi +Mangifera +mangily +manginess +mangle +mangleman +mangler +mangling +manglingly +mango +mangona +mangonel +mangonism +mangonization +mangonize +mangosteen +mangrass +mangrate +mangrove +Mangue +mangue +mangy +Mangyan +manhandle +Manhattan +Manhattanite +Manhattanize +manhead +manhole +manhood +mani +mania +maniable +maniac +maniacal +maniacally +manic +Manicaria +manicate +Manichaean +Manichaeanism +Manichaeanize +Manichaeism +Manichaeist +Manichee +manichord +manicole +manicure +manicurist +manid +Manidae +manienie +manifest +manifestable +manifestant +manifestation +manifestational +manifestationist +manifestative +manifestatively +manifested +manifestedness +manifester +manifestive +manifestly +manifestness +manifesto +manifold +manifolder +manifoldly +manifoldness +manifoldwise +maniform +manify +Manihot +manikin +manikinism +Manila +manila +manilla +manille +manioc +maniple +manipulable +manipular +manipulatable +manipulate +manipulation +manipulative +manipulatively +manipulator +manipulatory +Manipuri +Manis +manism +manist +manistic +manito +Manitoban +manitrunk +maniu +Manius +Maniva +manjak +mank +mankeeper +mankin +mankind +manless +manlessly +manlessness +manlet +manlihood +manlike +manlikely +manlikeness +manlily +manliness +manling +manly +manna +mannan +mannequin +manner +mannerable +mannered +mannerhood +mannering +mannerism +mannerist +manneristic +manneristical +manneristically +mannerize +mannerless +mannerlessness +mannerliness +mannerly +manners +mannersome +manness +Mannheimar +mannide +mannie +manniferous +mannify +mannikinism +manning +mannish +mannishly +mannishness +mannite +mannitic +mannitol +mannitose +mannoheptite +mannoheptitol +mannoheptose +mannoketoheptose +mannonic +mannosan +mannose +manny +mano +Manobo +manoc +manograph +manometer +manometric +manometrical +manometry +manomin +manor +manorial +manorialism +manorialize +manorship +manoscope +manostat +manostatic +manque +manred +manrent +manroot +manrope +Mans +mansard +mansarded +manscape +manse +manservant +manship +mansion +mansional +mansionary +mansioned +mansioneer +mansionry +manslaughter +manslaughterer +manslaughtering +manslaughterous +manslayer +manslaying +manso +mansonry +manstealer +manstealing +manstopper +manstopping +mansuete +mansuetely +mansuetude +mant +manta +mantal +manteau +mantel +mantelet +manteline +mantelletta +mantellone +mantelpiece +mantelshelf +manteltree +manter +mantes +mantevil +mantic +manticism +manticore +mantid +Mantidae +mantilla +Mantinean +mantis +Mantisia +Mantispa +mantispid +Mantispidae +mantissa +mantistic +mantle +mantled +mantlet +mantling +Manto +manto +Mantodea +mantoid +Mantoidea +mantologist +mantology +mantra +mantrap +mantua +mantuamaker +mantuamaking +Mantuan +Mantzu +manual +manualii +manualism +manualist +manualiter +manually +manuao +manubrial +manubriated +manubrium +manucaption +manucaptor +manucapture +manucode +Manucodia +manucodiata +manuduce +manuduction +manuductor +manuductory +Manuel +manufactory +manufacturable +manufactural +manufacture +manufacturer +manufacturess +manuka +manul +manuma +manumea +manumisable +manumission +manumissive +manumit +manumitter +manumotive +manurable +manurage +manurance +manure +manureless +manurer +manurial +manurially +manus +manuscript +manuscriptal +manuscription +manuscriptural +manusina +manustupration +manutagi +Manvantara +manward +manwards +manway +manweed +manwise +Manx +Manxman +Manxwoman +many +manyberry +Manyema +manyfold +manyness +manyplies +manyroot +manyways +manywhere +manywise +manzana +manzanilla +manzanillo +manzanita +Manzas +manzil +mao +maomao +Maori +Maoridom +Maoriland +Maorilander +map +mapach +mapau +maphrian +mapland +maple +maplebush +mapo +mappable +mapper +Mappila +mappist +mappy +Mapuche +mapwise +maquahuitl +maquette +maqui +Maquiritare +maquis +Mar +mar +marabotin +marabou +Marabout +marabuto +maraca +Maracaibo +maracan +maracock +marae +Maragato +marajuana +marakapas +maral +maranatha +marang +Maranha +Maranham +Maranhao +Maranta +Marantaceae +marantaceous +marantic +marara +mararie +marasca +maraschino +marasmic +Marasmius +marasmoid +marasmous +marasmus +Maratha +Marathi +marathon +marathoner +Marathonian +Maratism +Maratist +Marattia +Marattiaceae +marattiaceous +Marattiales +maraud +marauder +maravedi +Maravi +marbelize +marble +marbled +marblehead +marbleheader +marblehearted +marbleization +marbleize +marbleizer +marblelike +marbleness +marbler +marbles +marblewood +marbling +marblish +marbly +marbrinus +marc +Marcan +marcantant +marcasite +marcasitic +marcasitical +marcel +marceline +Marcella +marcella +marceller +Marcellian +Marcellianism +marcello +marcescence +marcescent +Marcgravia +Marcgraviaceae +marcgraviaceous +March +march +Marchantia +Marchantiaceae +marchantiaceous +Marchantiales +marcher +marchetto +marchioness +marchite +marchland +marchman +Marchmont +marchpane +Marcia +marcid +Marcionism +Marcionist +Marcionite +Marcionitic +Marcionitish +Marcionitism +Marcite +marco +Marcobrunner +Marcomanni +Marconi +marconi +marconigram +marconigraph +marconigraphy +marcor +Marcosian +marcottage +mardy +mare +mareblob +Mareca +marechal +Marehan +marekanite +maremma +maremmatic +maremmese +marengo +marennin +Mareotic +Mareotid +Marfik +marfire +margarate +Margarelon +Margaret +margaric +margarin +margarine +margarita +margaritaceous +margarite +margaritiferous +margaritomancy +Margarodes +margarodid +Margarodinae +margarodite +Margaropus +margarosanite +margay +marge +margeline +margent +Margery +Margie +margin +marginal +marginalia +marginality +marginalize +marginally +marginate +marginated +margination +margined +Marginella +Marginellidae +marginelliform +marginiform +margining +marginirostral +marginoplasty +margosa +Margot +margravate +margrave +margravely +margravial +margraviate +margravine +marguerite +marhala +Marheshvan +Mari +Maria +maria +marialite +Mariamman +Marian +Mariana +Marianic +Marianne +Marianolatrist +Marianolatry +maricolous +marid +mariengroschen +marigenous +marigold +marigram +marigraph +marigraphic +marijuana +marikina +Marilla +marimba +marimonda +marina +marinade +marinate +marinated +marine +mariner +marinheiro +marinist +marinorama +mariola +Mariolater +Mariolatrous +Mariolatry +Mariology +Marion +marionette +Mariposan +mariposite +maris +marish +marishness +Marist +maritage +marital +maritality +maritally +mariticidal +mariticide +Maritime +maritime +maritorious +mariupolite +marjoram +Marjorie +Mark +mark +marka +Markab +markdown +Markeb +marked +markedly +markedness +marker +market +marketability +marketable +marketableness +marketably +marketeer +marketer +marketing +marketman +marketstead +marketwise +markfieldite +Markgenossenschaft +markhor +marking +markka +markless +markman +markmoot +Marko +markshot +marksman +marksmanly +marksmanship +markswoman +markup +markweed +markworthy +marl +marlaceous +marlberry +marled +marler +marli +marlin +marline +marlinespike +marlite +marlitic +marllike +marlock +Marlovian +Marlowesque +Marlowish +Marlowism +marlpit +marly +marm +marmalade +marmalady +Marmar +marmarization +marmarize +marmarosis +marmatite +marmelos +marmennill +marmit +marmite +marmolite +marmoraceous +marmorate +marmorated +marmoration +marmoreal +marmoreally +marmorean +marmoric +Marmosa +marmose +marmoset +marmot +Marmota +maro +marocain +marok +Maronian +Maronist +Maronite +maroon +marooner +maroquin +Marpessa +marplot +marplotry +marque +marquee +Marquesan +marquess +marquetry +marquis +marquisal +marquisate +marquisdom +marquise +marquisette +marquisina +marquisotte +marquisship +marquito +marranism +marranize +marrano +marree +Marrella +marrer +marriable +marriage +marriageability +marriageable +marriageableness +marriageproof +married +marrier +marron +marrot +marrow +marrowbone +marrowed +marrowfat +marrowish +marrowless +marrowlike +marrowsky +marrowskyer +marrowy +Marrubium +Marrucinian +marry +marryer +marrying +marrymuffe +Mars +Marsala +Marsdenia +marseilles +marsh +marshal +marshalate +marshalcy +marshaler +marshaless +Marshall +marshalman +marshalment +Marshalsea +marshalship +marshberry +marshbuck +marshfire +marshflower +marshiness +marshite +marshland +marshlander +marshlike +marshlocks +marshman +marshwort +marshy +Marsi +Marsian +Marsilea +Marsileaceae +marsileaceous +Marsilia +Marsiliaceae +marsipobranch +Marsipobranchia +Marsipobranchiata +marsipobranchiate +Marsipobranchii +marsoon +Marspiter +Marssonia +Marssonina +marsupial +Marsupialia +marsupialian +marsupialization +marsupialize +marsupian +Marsupiata +marsupiate +marsupium +Mart +mart +martagon +martel +marteline +martellate +martellato +marten +martensite +martensitic +Martes +martext +Martha +martial +martialism +Martialist +martiality +martialization +martialize +martially +martialness +Martian +Martin +martin +martinet +martineta +martinetish +martinetishness +martinetism +martinetship +Martinez +martingale +martinico +Martinism +Martinist +Martinmas +martinoe +martite +Martius +martlet +Martu +Marty +Martynia +Martyniaceae +martyniaceous +martyr +martyrdom +martyress +martyrium +martyrization +martyrize +martyrizer +martyrlike +martyrly +martyrolatry +martyrologic +martyrological +martyrologist +martyrologistic +martyrologium +martyrology +martyrship +martyry +maru +marvel +marvelment +marvelous +marvelously +marvelousness +marvelry +marver +Marwari +Marxian +Marxianism +Marxism +Marxist +Mary +mary +marybud +Maryland +Marylander +Marylandian +Marymass +marysole +marzipan +mas +masa +Masai +masaridid +Masarididae +Masaridinae +Masaris +mascagnine +mascagnite +mascally +mascara +mascaron +mascled +mascleless +mascot +mascotism +mascotry +Mascouten +mascularity +masculate +masculation +masculine +masculinely +masculineness +masculinism +masculinist +masculinity +masculinization +masculinize +masculist +masculofeminine +masculonucleus +masculy +masdeu +Masdevallia +mash +masha +mashal +mashallah +mashelton +masher +mashie +mashing +mashman +Mashona +Mashpee +mashru +mashy +masjid +mask +masked +Maskegon +maskelynite +masker +maskette +maskflower +Maskins +masklike +Maskoi +maskoid +maslin +masochism +masochist +masochistic +mason +masoned +masoner +masonic +Masonite +masonite +masonry +masonwork +masooka +masoola +Masora +Masorete +Masoreth +Masoretic +Maspiter +masque +masquer +masquerade +masquerader +Mass +mass +massa +massacre +massacrer +massage +massager +massageuse +massagist +Massalia +Massalian +massaranduba +massasauga +masse +massebah +massecuite +massedly +massedness +Massekhoth +massel +masser +masseter +masseteric +masseur +masseuse +massicot +massier +massiest +massif +Massilia +Massilian +massily +massiness +massive +massively +massiveness +massivity +masskanne +massless +masslike +Massmonger +massotherapy +massoy +massula +massy +mast +mastaba +mastadenitis +mastadenoma +mastage +mastalgia +mastatrophia +mastatrophy +mastauxe +mastax +mastectomy +masted +master +masterable +masterate +masterdom +masterer +masterful +masterfully +masterfulness +masterhood +masterless +masterlessness +masterlike +masterlily +masterliness +masterling +masterly +masterman +mastermind +masterous +masterpiece +masterproof +mastership +masterwork +masterwort +mastery +mastful +masthead +masthelcosis +mastic +masticability +masticable +masticate +mastication +masticator +masticatory +mastiche +masticic +Masticura +masticurous +mastiff +Mastigamoeba +mastigate +mastigium +mastigobranchia +mastigobranchial +Mastigophora +mastigophoran +mastigophoric +mastigophorous +mastigopod +Mastigopoda +mastigopodous +mastigote +mastigure +masting +mastitis +mastless +mastlike +mastman +mastocarcinoma +mastoccipital +mastochondroma +mastochondrosis +mastodon +mastodonsaurian +Mastodonsaurus +mastodont +mastodontic +Mastodontidae +mastodontine +mastodontoid +mastodynia +mastoid +mastoidal +mastoidale +mastoideal +mastoidean +mastoidectomy +mastoideocentesis +mastoideosquamous +mastoiditis +mastoidohumeral +mastoidohumeralis +mastoidotomy +mastological +mastologist +mastology +mastomenia +mastoncus +mastooccipital +mastoparietal +mastopathy +mastopexy +mastoplastia +mastorrhagia +mastoscirrhus +mastosquamose +mastotomy +mastotympanic +masturbate +masturbation +masturbational +masturbator +masturbatory +mastwood +masty +masu +Masulipatam +masurium +mat +Matabele +Matacan +matachin +matachina +mataco +matadero +matador +mataeological +mataeologue +mataeology +Matagalpa +Matagalpan +matagory +matagouri +matai +matajuelo +matalan +matamata +matamoro +matanza +matapan +matapi +Matar +matara +Matatua +Matawan +matax +matboard +match +matchable +matchableness +matchably +matchboard +matchboarding +matchbook +matchbox +matchcloth +matchcoat +matcher +matching +matchless +matchlessly +matchlessness +matchlock +matchmaker +matchmaking +matchmark +Matchotic +matchsafe +matchstick +matchwood +matchy +mate +mategriffon +matehood +mateless +matelessness +matelote +mately +mater +materfamilias +material +materialism +materialist +materialistic +materialistical +materialistically +materiality +materialization +materialize +materializee +materializer +materially +materialman +materialness +materiate +materiation +materiel +maternal +maternality +maternalize +maternally +maternalness +maternity +maternology +mateship +matey +matezite +matfelon +matgrass +math +mathematic +mathematical +mathematically +mathematicals +mathematician +mathematicize +mathematics +mathematize +mathemeg +mathes +mathesis +mathetic +Mathurin +matico +matildite +matin +matinal +matinee +mating +matins +matipo +matka +matless +matlockite +matlow +matmaker +matmaking +matra +matral +Matralia +matranee +matrass +matreed +matriarch +matriarchal +matriarchalism +matriarchate +matriarchic +matriarchist +matriarchy +matric +matrical +Matricaria +matrices +matricidal +matricide +matricula +matriculable +matriculant +matricular +matriculate +matriculation +matriculator +matriculatory +Matrigan +matriheritage +matriherital +matrilineal +matrilineally +matrilinear +matrilinearism +matriliny +matrilocal +matrimonial +matrimonially +matrimonious +matrimoniously +matrimony +matriotism +matripotestal +matris +matrix +matroclinic +matroclinous +matrocliny +matron +matronage +matronal +Matronalia +matronhood +matronism +matronize +matronlike +matronliness +matronly +matronship +matronymic +matross +matsu +matsuri +matta +mattamore +Mattapony +mattaro +mattboard +matte +matted +mattedly +mattedness +matter +matterate +matterative +matterful +matterfulness +matterless +mattery +Matteuccia +Matthaean +Matthew +Matthiola +matti +matting +mattock +mattoid +mattoir +mattress +mattulla +Matty +maturable +maturate +maturation +maturative +mature +maturely +maturement +matureness +maturer +maturescence +maturescent +maturing +maturish +maturity +matutinal +matutinally +matutinary +matutine +matutinely +matweed +maty +matzo +matzoon +matzos +matzoth +mau +maucherite +Maud +maud +maudle +maudlin +maudlinism +maudlinize +maudlinly +maudlinwort +mauger +maugh +Maugis +maul +Maulawiyah +mauler +mauley +mauling +maulstick +Maumee +maumet +maumetry +Maun +maun +maund +maunder +maunderer +maundful +maundy +maunge +Maurandia +Mauretanian +Mauri +Maurice +Maurist +Mauritia +Mauritian +Mauser +mausolea +mausoleal +mausolean +mausoleum +mauther +mauve +mauveine +mauvette +mauvine +maux +maverick +mavis +Mavortian +mavournin +mavrodaphne +maw +mawbound +mawk +mawkish +mawkishly +mawkishness +mawky +mawp +Max +maxilla +maxillar +maxillary +maxilliferous +maxilliform +maxilliped +maxillipedary +maxillodental +maxillofacial +maxillojugal +maxillolabial +maxillomandibular +maxillopalatal +maxillopalatine +maxillopharyngeal +maxillopremaxillary +maxilloturbinal +maxillozygomatic +maxim +maxima +maximal +Maximalism +Maximalist +maximally +maximate +maximation +maximed +maximist +maximistic +maximite +maximization +maximize +maximizer +Maximon +maximum +maximus +maxixe +maxwell +May +may +Maya +maya +Mayaca +Mayacaceae +mayacaceous +Mayan +Mayance +Mayathan +maybe +Maybird +Maybloom +maybush +Maycock +maycock +Mayda +mayday +Mayer +Mayey +Mayeye +Mayfair +mayfish +Mayflower +Mayfowl +mayhap +mayhappen +mayhem +Maying +Maylike +maynt +Mayo +Mayologist +mayonnaise +mayor +mayoral +mayoralty +mayoress +mayorship +Mayoruna +Maypole +Maypoling +maypop +maysin +mayten +Maytenus +Maythorn +Maytide +Maytime +mayweed +Maywings +Maywort +maza +mazalgia +Mazama +mazame +Mazanderani +mazapilite +mazard +mazarine +Mazatec +Mazateco +Mazda +Mazdaism +Mazdaist +Mazdakean +Mazdakite +Mazdean +maze +mazed +mazedly +mazedness +mazeful +mazement +mazer +Mazhabi +mazic +mazily +maziness +mazocacothesis +mazodynia +mazolysis +mazolytic +mazopathia +mazopathic +mazopexy +Mazovian +mazuca +mazuma +Mazur +Mazurian +mazurka +mazut +mazy +mazzard +Mazzinian +Mazzinianism +Mazzinist +mbalolo +Mbaya +mbori +Mbuba +Mbunda +Mcintosh +Mckay +Mdewakanton +me +meable +meaching +mead +meader +meadow +meadowbur +meadowed +meadower +meadowing +meadowink +meadowland +meadowless +meadowsweet +meadowwort +meadowy +meadsman +meager +meagerly +meagerness +meagre +meak +meal +mealable +mealberry +mealer +mealies +mealily +mealiness +mealless +mealman +mealmonger +mealmouth +mealmouthed +mealproof +mealtime +mealy +mealymouth +mealymouthed +mealymouthedly +mealymouthedness +mealywing +mean +meander +meanderingly +meandrine +meandriniform +meandrite +meandrous +meaned +meaner +meaning +meaningful +meaningfully +meaningless +meaninglessly +meaninglessness +meaningly +meaningness +meanish +meanly +meanness +meant +Meantes +meantone +meanwhile +mease +measle +measled +measledness +measles +measlesproof +measly +measondue +measurability +measurable +measurableness +measurably +measuration +measure +measured +measuredly +measuredness +measureless +measurelessly +measurelessness +measurely +measurement +measurer +measuring +meat +meatal +meatbird +meatcutter +meated +meathook +meatily +meatiness +meatless +meatman +meatometer +meatorrhaphy +meatoscope +meatoscopy +meatotome +meatotomy +meatus +meatworks +meaty +Mebsuta +Mecaptera +mecate +Mecca +Meccan +Meccano +Meccawee +mechanal +mechanality +mechanalize +mechanic +mechanical +mechanicalism +mechanicalist +mechanicality +mechanicalization +mechanicalize +mechanically +mechanicalness +mechanician +mechanicochemical +mechanicocorpuscular +mechanicointellectual +mechanicotherapy +mechanics +mechanism +mechanist +mechanistic +mechanistically +mechanization +mechanize +mechanizer +mechanolater +mechanology +mechanomorphic +mechanomorphism +mechanotherapeutic +mechanotherapeutics +mechanotherapist +mechanotherapy +Mechir +Mechitaristican +Mechlin +mechoacan +meckelectomy +Meckelian +Mecklenburgian +mecodont +Mecodonta +mecometer +mecometry +mecon +meconic +meconidium +meconin +meconioid +meconium +meconology +meconophagism +meconophagist +Mecoptera +mecopteran +mecopteron +mecopterous +medal +medaled +medalet +medalist +medalize +medallary +medallic +medallically +medallion +medallionist +meddle +meddlecome +meddlement +meddler +meddlesome +meddlesomely +meddlesomeness +meddling +meddlingly +Mede +Medellin +Medeola +Media +media +mediacid +mediacy +mediad +mediaevalize +mediaevally +medial +medialization +medialize +medialkaline +medially +Median +median +medianic +medianimic +medianimity +medianism +medianity +medianly +mediant +mediastinal +mediastine +mediastinitis +mediastinotomy +mediastinum +mediate +mediately +mediateness +mediating +mediatingly +mediation +mediative +mediatization +mediatize +mediator +mediatorial +mediatorialism +mediatorially +mediatorship +mediatory +mediatress +mediatrice +mediatrix +Medic +medic +medicable +Medicago +medical +medically +medicament +medicamental +medicamentally +medicamentary +medicamentation +medicamentous +medicaster +medicate +medication +medicative +medicator +medicatory +Medicean +Medici +medicinable +medicinableness +medicinal +medicinally +medicinalness +medicine +medicinelike +medicinemonger +mediciner +medico +medicobotanical +medicochirurgic +medicochirurgical +medicodental +medicolegal +medicolegally +medicomania +medicomechanic +medicomechanical +medicomoral +medicophysical +medicopsychological +medicopsychology +medicostatistic +medicosurgical +medicotopographic +medicozoologic +mediety +Medieval +medieval +medievalism +medievalist +medievalistic +medievalize +medievally +medifixed +mediglacial +medimn +medimno +medimnos +medimnus +Medina +Medinilla +medino +medio +medioanterior +mediocarpal +medioccipital +mediocre +mediocrist +mediocrity +mediocubital +mediodepressed +mediodigital +mediodorsal +mediodorsally +mediofrontal +mediolateral +mediopalatal +mediopalatine +mediopassive +mediopectoral +medioperforate +mediopontine +medioposterior +mediosilicic +mediostapedial +mediotarsal +medioventral +medisance +medisect +medisection +Medish +Medism +meditant +meditate +meditating +meditatingly +meditation +meditationist +meditatist +meditative +meditatively +meditativeness +meditator +mediterranean +Mediterraneanism +Mediterraneanization +Mediterraneanize +mediterraneous +medithorax +Meditrinalia +meditullium +medium +mediumism +mediumistic +mediumization +mediumize +mediumship +medius +Medize +Medizer +medjidie +medlar +medley +Medoc +medregal +medrick +medrinaque +medulla +medullar +medullary +medullate +medullated +medullation +medullispinal +medullitis +medullization +medullose +Medusa +Medusaean +medusal +medusalike +medusan +medusiferous +medusiform +medusoid +meebos +meece +meed +meedless +meek +meeken +meekhearted +meekheartedness +meekling +meekly +meekness +Meekoceras +meered +meerkat +meerschaum +meese +meet +meetable +meeten +meeter +meeterly +meethelp +meethelper +meeting +meetinger +meetinghouse +meetly +meetness +Meg +megabar +megacephalia +megacephalic +megacephaly +megacerine +Megaceros +megacerotine +Megachile +megachilid +Megachilidae +Megachiroptera +megachiropteran +megachiropterous +megacolon +megacosm +megacoulomb +megacycle +megadont +Megadrili +megadynamics +megadyne +Megaera +megaerg +megafarad +megafog +megagamete +megagametophyte +megajoule +megakaryocyte +Megalactractus +Megaladapis +Megalaema +Megalaemidae +Megalania +megaleme +Megalensian +megalerg +Megalesia +Megalesian +megalesthete +megalethoscope +Megalichthyidae +Megalichthys +megalith +megalithic +Megalobatrachus +megaloblast +megaloblastic +megalocardia +megalocarpous +megalocephalia +megalocephalic +megalocephalous +megalocephaly +Megaloceros +megalochirous +megalocornea +megalocyte +megalocytosis +megalodactylia +megalodactylism +megalodactylous +Megalodon +megalodont +megalodontia +Megalodontidae +megaloenteron +megalogastria +megaloglossia +megalograph +megalography +megalohepatia +megalokaryocyte +megalomania +megalomaniac +megalomaniacal +megalomelia +Megalonychidae +Megalonyx +megalopa +megalopenis +megalophonic +megalophonous +megalophthalmus +megalopia +megalopic +Megalopidae +Megalopinae +megalopine +megaloplastocyte +megalopolis +megalopolitan +megalopolitanism +megalopore +megalops +megalopsia +Megaloptera +Megalopyge +Megalopygidae +Megalornis +Megalornithidae +megalosaur +megalosaurian +Megalosauridae +megalosauroid +Megalosaurus +megaloscope +megaloscopy +megalosphere +megalospheric +megalosplenia +megalosyndactyly +megaloureter +Megaluridae +Megamastictora +megamastictoral +megamere +megameter +megampere +Meganeura +Meganthropus +meganucleus +megaparsec +megaphone +megaphonic +megaphotographic +megaphotography +megaphyllous +Megaphyton +megapod +megapode +Megapodidae +Megapodiidae +Megapodius +megaprosopous +Megaptera +Megapterinae +megapterine +Megarensian +Megarhinus +Megarhyssa +Megarian +Megarianism +Megaric +megaron +megasclere +megascleric +megasclerous +megasclerum +megascope +megascopic +megascopical +megascopically +megaseism +megaseismic +megaseme +Megasoma +megasporange +megasporangium +megaspore +megasporic +megasporophyll +megasynthetic +megathere +megatherian +Megatheriidae +megatherine +megatherioid +Megatherium +megatherm +megathermic +megatheroid +megaton +megatype +megatypy +megavolt +megawatt +megaweber +megazooid +megazoospore +megerg +Meggy +megilp +megmho +megohm +megohmit +megohmmeter +megophthalmus +megotalc +Megrel +Megrez +megrim +megrimish +mehalla +mehari +meharist +Mehelya +mehmandar +mehtar +mehtarship +Meibomia +Meibomian +meile +mein +meinie +meio +meiobar +meionite +meiophylly +meiosis +meiotaxy +meiotic +Meissa +Meistersinger +meith +Meithei +meizoseismal +meizoseismic +mejorana +Mekbuda +Mekhitarist +mekometer +mel +mela +melaconite +melada +meladiorite +melagabbro +melagra +melagranite +Melaleuca +melalgia +melam +melamed +melamine +melampodium +Melampsora +Melampsoraceae +Melampus +melampyritol +Melampyrum +melanagogal +melanagogue +melancholia +melancholiac +melancholic +melancholically +melancholily +melancholiness +melancholious +melancholiously +melancholiousness +melancholish +melancholist +melancholize +melancholomaniac +melancholy +melancholyish +Melanchthonian +Melanconiaceae +melanconiaceous +Melanconiales +Melanconium +melanemia +melanemic +Melanesian +melange +melanger +melangeur +Melania +melanian +melanic +melaniferous +Melaniidae +melanilin +melaniline +melanin +Melanippe +Melanippus +melanism +melanistic +melanite +melanitic +melanize +melano +melanoblast +melanocarcinoma +melanocerite +Melanochroi +Melanochroid +melanochroite +melanochroous +melanocomous +melanocrate +melanocratic +melanocyte +Melanodendron +melanoderma +melanodermia +melanodermic +Melanogaster +melanogen +Melanoi +melanoid +melanoidin +melanoma +melanopathia +melanopathy +melanophore +melanoplakia +Melanoplus +melanorrhagia +melanorrhea +Melanorrhoea +melanosarcoma +melanosarcomatosis +melanoscope +melanose +melanosed +melanosis +melanosity +melanospermous +melanotekite +melanotic +melanotrichous +melanous +melanterite +Melanthaceae +melanthaceous +Melanthium +melanure +melanuresis +melanuria +melanuric +melaphyre +Melas +melasma +melasmic +melassigenic +Melastoma +Melastomaceae +melastomaceous +melastomad +melatope +melaxuma +Melburnian +Melcarth +melch +Melchite +Melchora +meld +melder +meldometer +meldrop +mele +Meleager +Meleagridae +Meleagrina +Meleagrinae +meleagrine +Meleagris +melebiose +melee +melena +melene +melenic +Meles +Meletian +Meletski +melezitase +melezitose +Melia +Meliaceae +meliaceous +Meliadus +Melian +Melianthaceae +melianthaceous +Melianthus +meliatin +melibiose +melic +Melica +Melicent +melicera +meliceric +meliceris +melicerous +Melicerta +Melicertidae +melichrous +melicitose +Melicocca +melicraton +melilite +melilitite +melilot +Melilotus +Melinae +meline +Melinis +melinite +Meliola +meliorability +meliorable +meliorant +meliorate +meliorater +melioration +meliorative +meliorator +meliorism +meliorist +melioristic +meliority +meliphagan +Meliphagidae +meliphagidan +meliphagous +meliphanite +Melipona +Meliponinae +meliponine +melisma +melismatic +melismatics +Melissa +melissyl +melissylic +Melitaea +melitemia +melithemia +melitis +melitose +melitriose +melittologist +melittology +melituria +melituric +mell +mellaginous +mellate +mellay +melleous +meller +Mellifera +melliferous +mellificate +mellification +mellifluence +mellifluent +mellifluently +mellifluous +mellifluously +mellifluousness +mellimide +mellisonant +mellisugent +mellit +mellitate +mellite +mellitic +Mellivora +Mellivorinae +mellivorous +mellon +mellonides +mellophone +mellow +mellowly +mellowness +mellowy +mellsman +Melocactus +melocoton +melodeon +melodia +melodial +melodially +melodic +melodica +melodically +melodicon +melodics +melodiograph +melodion +melodious +melodiously +melodiousness +melodism +melodist +melodize +melodizer +melodram +melodrama +melodramatic +melodramatical +melodramatically +melodramaticism +melodramatics +melodramatist +melodramatize +melodrame +melody +melodyless +meloe +melogram +Melogrammataceae +melograph +melographic +meloid +Meloidae +melologue +Melolontha +Melolonthidae +melolonthidan +Melolonthides +Melolonthinae +melolonthine +melomane +melomania +melomaniac +melomanic +melon +meloncus +Melonechinus +melongena +melongrower +melonist +melonite +Melonites +melonlike +melonmonger +melonry +melophone +melophonic +melophonist +melopiano +meloplast +meloplastic +meloplasty +melopoeia +melopoeic +melos +melosa +Melospiza +Melothria +melotragedy +melotragic +melotrope +melt +meltability +meltable +meltage +melted +meltedness +melteigite +melter +melters +melting +meltingly +meltingness +melton +Meltonian +Melungeon +Melursus +mem +member +membered +memberless +membership +membracid +Membracidae +membracine +membral +membrally +membrana +membranaceous +membranaceously +membranate +membrane +membraned +membraneless +membranelike +membranelle +membraneous +membraniferous +membraniform +membranin +Membranipora +Membraniporidae +membranocalcareous +membranocartilaginous +membranocoriaceous +membranocorneous +membranogenic +membranoid +membranology +membranonervous +membranosis +membranous +membranously +membranula +membranule +membretto +memento +meminna +Memnon +Memnonian +Memnonium +memo +memoir +memoirism +memoirist +memorabilia +memorability +memorable +memorableness +memorably +memoranda +memorandist +memorandize +memorandum +memorative +memoria +memorial +memorialist +memorialization +memorialize +memorializer +memorially +memoried +memorious +memorist +memorizable +memorization +memorize +memorizer +memory +memoryless +Memphian +Memphite +men +menaccanite +menaccanitic +menace +menaceable +menaceful +menacement +menacer +menacing +menacingly +menacme +menadione +menage +menagerie +menagerist +menald +Menangkabau +menarche +Menaspis +mend +mendable +mendacious +mendaciously +mendaciousness +mendacity +Mendaite +Mende +mendee +Mendelian +Mendelianism +Mendelianist +Mendelism +Mendelist +Mendelize +Mendelssohnian +Mendelssohnic +mendelyeevite +mender +Mendi +mendicancy +mendicant +mendicate +mendication +mendicity +mending +mendipite +mendole +mendozite +mends +meneghinite +menfolk +Menfra +meng +Mengwe +menhaden +menhir +menial +menialism +meniality +menially +Menic +menilite +meningeal +meninges +meningic +meningina +meningism +meningitic +meningitis +meningocele +meningocephalitis +meningocerebritis +meningococcal +meningococcemia +meningococcic +meningococcus +meningocortical +meningoencephalitis +meningoencephalocele +meningomalacia +meningomyclitic +meningomyelitis +meningomyelocele +meningomyelorrhaphy +meningorachidian +meningoradicular +meningorhachidian +meningorrhagia +meningorrhea +meningorrhoea +meningosis +meningospinal +meningotyphoid +meninting +meninx +meniscal +meniscate +menisciform +meniscitis +meniscoid +meniscoidal +Meniscotheriidae +Meniscotherium +meniscus +menisperm +Menispermaceae +menispermaceous +menispermine +Menispermum +Menkalinan +Menkar +Menkib +menkind +mennom +Mennonist +Mennonite +Menobranchidae +Menobranchus +menognath +menognathous +menologium +menology +menometastasis +Menominee +menopausal +menopause +menopausic +menophania +menoplania +Menopoma +Menorah +Menorhyncha +menorhynchous +menorrhagia +menorrhagic +menorrhagy +menorrhea +menorrheic +menorrhoea +menorrhoeic +menoschesis +menoschetic +menosepsis +menostasia +menostasis +menostatic +menostaxis +Menotyphla +menotyphlic +menoxenia +mensa +mensal +mensalize +mense +menseful +menseless +menses +Menshevik +Menshevism +Menshevist +mensk +menstrual +menstruant +menstruate +menstruation +menstruous +menstruousness +menstruum +mensual +mensurability +mensurable +mensurableness +mensurably +mensural +mensuralist +mensurate +mensuration +mensurational +mensurative +Ment +mentagra +mental +mentalis +mentalism +mentalist +mentalistic +mentality +mentalization +mentalize +mentally +mentary +mentation +Mentha +Menthaceae +menthaceous +menthadiene +menthane +menthene +menthenol +menthenone +menthol +mentholated +menthone +menthyl +menticide +menticultural +menticulture +mentiferous +mentiform +mentigerous +mentimeter +mentimutation +mention +mentionability +mentionable +mentionless +mentoanterior +mentobregmatic +mentocondylial +mentohyoid +mentolabial +mentomeckelian +mentonniere +mentoposterior +mentor +mentorial +mentorism +mentorship +mentum +Mentzelia +menu +Menura +Menurae +Menuridae +meny +Menyanthaceae +Menyanthaceous +Menyanthes +menyie +menzie +Menziesia +Meo +Mephisto +Mephistophelean +Mephistopheleanly +Mephistopheles +Mephistophelic +Mephistophelistic +mephitic +mephitical +Mephitinae +mephitine +mephitis +mephitism +Mer +Merak +meralgia +meraline +Meratia +merbaby +mercal +mercantile +mercantilely +mercantilism +mercantilist +mercantilistic +mercantility +mercaptal +mercaptan +mercaptides +mercaptids +mercapto +mercaptol +mercaptole +Mercator +Mercatorial +mercatorial +Mercedarian +Mercedes +Mercedinus +Mercedonius +mercenarily +mercenariness +mercenary +mercer +merceress +mercerization +mercerize +mercerizer +mercership +mercery +merch +merchandisable +merchandise +merchandiser +merchant +merchantable +merchantableness +merchanter +merchanthood +merchantish +merchantlike +merchantly +merchantman +merchantry +merchantship +merchet +Mercian +merciful +mercifully +mercifulness +merciless +mercilessly +mercilessness +merciment +mercurate +mercuration +Mercurean +mercurial +Mercurialis +mercurialism +mercuriality +mercurialization +mercurialize +mercurially +mercurialness +mercuriamines +mercuriammonium +Mercurian +mercuriate +mercuric +mercuride +mercurification +mercurify +Mercurius +mercurization +mercurize +Mercurochrome +mercurophen +mercurous +Mercury +mercy +mercyproof +merdivorous +mere +Meredithian +merel +merely +merenchyma +merenchymatous +meresman +merestone +meretricious +meretriciously +meretriciousness +meretrix +merfold +merfolk +merganser +merge +mergence +merger +mergh +Merginae +Mergulus +Mergus +meriah +mericarp +merice +Merida +meridian +Meridion +Meridionaceae +Meridional +meridional +meridionality +meridionally +meril +meringue +meringued +Merino +Meriones +meriquinoid +meriquinoidal +meriquinone +meriquinonic +meriquinonoid +merism +merismatic +merismoid +merist +meristele +meristelic +meristem +meristematic +meristematically +meristic +meristically +meristogenous +merit +meritable +merited +meritedly +meriter +meritful +meritless +meritmonger +meritmongering +meritmongery +meritorious +meritoriously +meritoriousness +merk +merkhet +merkin +merl +merle +merlette +merlin +merlon +Merlucciidae +Merluccius +mermaid +mermaiden +merman +Mermis +mermithaner +mermithergate +Mermithidae +mermithization +mermithized +mermithogyne +Mermnad +Mermnadae +mermother +mero +meroblastic +meroblastically +merocele +merocelic +merocerite +meroceritic +merocrystalline +merocyte +Merodach +merogamy +merogastrula +merogenesis +merogenetic +merogenic +merognathite +merogonic +merogony +merohedral +merohedric +merohedrism +meroistic +Meroitic +meromorphic +Meromyaria +meromyarian +merop +Merope +Meropes +meropia +Meropidae +meropidan +meroplankton +meroplanktonic +meropodite +meropoditic +Merops +merorganization +merorganize +meros +merosomal +Merosomata +merosomatous +merosome +merosthenic +Merostomata +merostomatous +merostome +merostomous +merosymmetrical +merosymmetry +merosystematic +merotomize +merotomy +merotropism +merotropy +Merovingian +meroxene +Merozoa +merozoite +merpeople +merribauks +merribush +merriless +merrily +merriment +merriness +merrow +merry +merrymake +merrymaker +merrymaking +merryman +merrymeeting +merrythought +merrytrotter +merrywing +merse +Mertensia +Merula +meruline +merulioid +Merulius +merveileux +merwinite +merwoman +Merychippus +merycism +merycismus +Merycoidodon +Merycoidodontidae +Merycopotamidae +Merycopotamus +Mes +mesa +mesabite +mesaconate +mesaconic +mesad +Mesadenia +mesadenia +mesail +mesal +mesalike +mesally +mesameboid +mesange +mesaortitis +mesaraic +mesaraical +mesarch +mesarteritic +mesarteritis +Mesartim +mesaticephal +mesaticephali +mesaticephalic +mesaticephalism +mesaticephalous +mesaticephaly +mesatipellic +mesatipelvic +mesatiskelic +mesaxonic +mescal +Mescalero +mescaline +mescalism +mesdames +mese +mesectoderm +mesem +Mesembryanthemaceae +Mesembryanthemum +mesembryo +mesembryonic +mesencephalic +mesencephalon +mesenchyma +mesenchymal +mesenchymatal +mesenchymatic +mesenchymatous +mesenchyme +mesendoderm +mesenna +mesenterial +mesenteric +mesenterical +mesenterically +mesenteriform +mesenteriolum +mesenteritic +mesenteritis +mesenteron +mesenteronic +mesentery +mesentoderm +mesepimeral +mesepimeron +mesepisternal +mesepisternum +mesepithelial +mesepithelium +mesethmoid +mesethmoidal +mesh +Meshech +meshed +meshrabiyeh +meshwork +meshy +mesiad +mesial +mesially +mesian +mesic +mesically +mesilla +mesiobuccal +mesiocervical +mesioclusion +mesiodistal +mesiodistally +mesiogingival +mesioincisal +mesiolabial +mesiolingual +mesion +mesioocclusal +mesiopulpal +mesioversion +Mesitae +Mesites +Mesitidae +mesitite +mesityl +mesitylene +mesitylenic +mesmerian +mesmeric +mesmerical +mesmerically +mesmerism +mesmerist +mesmerite +mesmerizability +mesmerizable +mesmerization +mesmerize +mesmerizee +mesmerizer +mesmeromania +mesmeromaniac +mesnality +mesnalty +mesne +meso +mesoappendicitis +mesoappendix +mesoarial +mesoarium +mesobar +mesobenthos +mesoblast +mesoblastema +mesoblastemic +mesoblastic +mesobranchial +mesobregmate +mesocaecal +mesocaecum +mesocardia +mesocardium +mesocarp +mesocentrous +mesocephal +mesocephalic +mesocephalism +mesocephalon +mesocephalous +mesocephaly +mesochilium +mesochondrium +mesochroic +mesocoele +mesocoelian +mesocoelic +mesocolic +mesocolon +mesocoracoid +mesocranial +mesocratic +mesocuneiform +mesode +mesoderm +mesodermal +mesodermic +Mesodesma +Mesodesmatidae +Mesodesmidae +Mesodevonian +Mesodevonic +mesodic +mesodisilicic +mesodont +Mesoenatides +mesofurca +mesofurcal +mesogaster +mesogastral +mesogastric +mesogastrium +mesogloea +mesogloeal +mesognathic +mesognathion +mesognathism +mesognathous +mesognathy +mesogyrate +mesohepar +Mesohippus +mesokurtic +mesolabe +mesole +mesolecithal +mesolimnion +mesolite +mesolithic +mesologic +mesological +mesology +mesomere +mesomeric +mesomerism +mesometral +mesometric +mesometrium +mesomorph +mesomorphic +mesomorphous +mesomorphy +Mesomyodi +mesomyodian +mesomyodous +meson +mesonasal +Mesonemertini +mesonephric +mesonephridium +mesonephritic +mesonephros +mesonic +mesonotal +mesonotum +Mesonychidae +Mesonyx +mesoparapteral +mesoparapteron +mesopectus +mesoperiodic +mesopetalum +mesophile +mesophilic +mesophilous +mesophragm +mesophragma +mesophragmal +mesophryon +mesophyll +mesophyllous +mesophyllum +mesophyte +mesophytic +mesophytism +mesopic +mesoplankton +mesoplanktonic +mesoplast +mesoplastic +mesoplastral +mesoplastron +mesopleural +mesopleuron +Mesoplodon +mesoplodont +mesopodial +mesopodiale +mesopodium +mesopotamia +Mesopotamian +mesopotamic +mesoprescutal +mesoprescutum +mesoprosopic +mesopterygial +mesopterygium +mesopterygoid +mesorchial +mesorchium +Mesore +mesorectal +mesorectum +Mesoreodon +mesorrhin +mesorrhinal +mesorrhinian +mesorrhinism +mesorrhinium +mesorrhiny +mesosalpinx +mesosaur +Mesosauria +Mesosaurus +mesoscapula +mesoscapular +mesoscutal +mesoscutellar +mesoscutellum +mesoscutum +mesoseismal +mesoseme +mesosiderite +mesosigmoid +mesoskelic +mesosoma +mesosomatic +mesosome +mesosperm +mesospore +mesosporic +mesosporium +mesostasis +mesosternal +mesosternebra +mesosternebral +mesosternum +mesostethium +Mesostoma +Mesostomatidae +mesostomid +mesostyle +mesostylous +Mesosuchia +mesosuchian +Mesotaeniaceae +Mesotaeniales +mesotarsal +mesotartaric +Mesothelae +mesothelial +mesothelium +mesotherm +mesothermal +mesothesis +mesothet +mesothetic +mesothetical +mesothoracic +mesothoracotheca +mesothorax +mesothorium +mesotonic +mesotroch +mesotrocha +mesotrochal +mesotrochous +mesotron +mesotropic +mesotympanic +mesotype +mesovarian +mesovarium +mesoventral +mesoventrally +mesoxalate +mesoxalic +mesoxalyl +Mesozoa +mesozoan +Mesozoic +mespil +Mespilus +Mespot +mesquite +Mesropian +mess +message +messagery +Messalian +messaline +messan +Messapian +messe +messelite +messenger +messengership +messer +messet +Messiah +Messiahship +Messianic +Messianically +messianically +Messianism +Messianist +Messianize +Messias +messieurs +messily +messin +Messines +Messinese +messiness +messing +messman +messmate +messor +messroom +messrs +messtin +messuage +messy +mestee +mester +mestiza +mestizo +mestome +Mesua +Mesvinian +mesymnion +met +meta +metabasis +metabasite +metabatic +metabiological +metabiology +metabiosis +metabiotic +metabiotically +metabismuthic +metabisulphite +metabletic +Metabola +metabola +metabole +Metabolia +metabolian +metabolic +metabolism +metabolite +metabolizable +metabolize +metabolon +metabolous +metaboly +metaborate +metaboric +metabranchial +metabrushite +metabular +metacarpal +metacarpale +metacarpophalangeal +metacarpus +metacenter +metacentral +metacentric +metacentricity +metachemic +metachemistry +Metachlamydeae +metachlamydeous +metachromasis +metachromatic +metachromatin +metachromatinic +metachromatism +metachrome +metachronism +metachrosis +metacinnabarite +metacism +metacismus +metaclase +metacneme +metacoele +metacoelia +metaconal +metacone +metaconid +metaconule +metacoracoid +metacrasis +metacresol +metacromial +metacromion +metacryst +metacyclic +metacymene +metad +metadiabase +metadiazine +metadiorite +metadiscoidal +metadromous +metafluidal +metaformaldehyde +metafulminuric +metagalactic +metagalaxy +metagaster +metagastric +metagastrula +metage +Metageitnion +metagelatin +metagenesis +metagenetic +metagenetically +metagenic +metageometer +metageometrical +metageometry +metagnath +metagnathism +metagnathous +metagnomy +metagnostic +metagnosticism +metagram +metagrammatism +metagrammatize +metagraphic +metagraphy +metahewettite +metahydroxide +metaigneous +metainfective +metakinesis +metakinetic +metal +metalammonium +metalanguage +metalbumin +metalcraft +metaldehyde +metalepsis +metaleptic +metaleptical +metaleptically +metaler +metaline +metalined +metaling +metalinguistic +metalinguistics +metalism +metalist +metalization +metalize +metallary +metalleity +metallic +metallical +metallically +metallicity +metallicize +metallicly +metallics +metallide +metallifacture +metalliferous +metallification +metalliform +metallify +metallik +metalline +metallism +metallization +metallize +metallochrome +metallochromy +metallogenetic +metallogenic +metallogeny +metallograph +metallographer +metallographic +metallographical +metallographist +metallography +metalloid +metalloidal +metallometer +metallophone +metalloplastic +metallorganic +metallotherapeutic +metallotherapy +metallurgic +metallurgical +metallurgically +metallurgist +metallurgy +metalmonger +metalogic +metalogical +metaloph +metalorganic +metaloscope +metaloscopy +metaluminate +metaluminic +metalware +metalwork +metalworker +metalworking +metalworks +metamathematical +metamathematics +metamer +metameral +metamere +metameric +metamerically +metameride +metamerism +metamerization +metamerized +metamerous +metamery +metamorphic +metamorphism +metamorphize +metamorphopsia +metamorphopsy +metamorphosable +metamorphose +metamorphoser +metamorphoses +metamorphosian +metamorphosic +metamorphosical +metamorphosis +metamorphostical +metamorphotic +metamorphous +metamorphy +Metamynodon +metanalysis +metanauplius +Metanemertini +metanephric +metanephritic +metanephron +metanephros +metanepionic +metanilic +metanitroaniline +metanomen +metanotal +metanotum +metantimonate +metantimonic +metantimonious +metantimonite +metantimonous +metanym +metaorganism +metaparapteral +metaparapteron +metapectic +metapectus +metapepsis +metapeptone +metaperiodic +metaphase +metaphenomenal +metaphenomenon +metaphenylene +metaphenylenediamin +metaphenylenediamine +metaphloem +metaphonical +metaphonize +metaphony +metaphor +metaphoric +metaphorical +metaphorically +metaphoricalness +metaphorist +metaphorize +metaphosphate +metaphosphoric +metaphosphorous +metaphragm +metaphragmal +metaphrase +metaphrasis +metaphrast +metaphrastic +metaphrastical +metaphrastically +metaphyseal +metaphysic +metaphysical +metaphysically +metaphysician +metaphysicianism +metaphysicist +metaphysicize +metaphysicous +metaphysics +metaphysis +metaphyte +metaphytic +metaphyton +metaplasia +metaplasis +metaplasm +metaplasmic +metaplast +metaplastic +metapleural +metapleure +metapleuron +metaplumbate +metaplumbic +metapneumonic +metapneustic +metapodial +metapodiale +metapodium +metapolitic +metapolitical +metapolitician +metapolitics +metapophyseal +metapophysial +metapophysis +metapore +metapostscutellar +metapostscutellum +metaprescutal +metaprescutum +metaprotein +metapsychic +metapsychical +metapsychics +metapsychism +metapsychist +metapsychological +metapsychology +metapsychosis +metapterygial +metapterygium +metapterygoid +metarabic +metarhyolite +metarossite +metarsenic +metarsenious +metarsenite +metasaccharinic +metascutal +metascutellar +metascutellum +metascutum +metasedimentary +metasilicate +metasilicic +metasoma +metasomal +metasomasis +metasomatic +metasomatism +metasomatosis +metasome +metasperm +Metaspermae +metaspermic +metaspermous +metastability +metastable +metastannate +metastannic +metastasis +metastasize +metastatic +metastatical +metastatically +metasternal +metasternum +metasthenic +metastibnite +metastigmate +metastoma +metastome +metastrophe +metastrophic +metastyle +metatantalic +metatarsal +metatarsale +metatarse +metatarsophalangeal +metatarsus +metatatic +metatatically +metataxic +metate +metathalamus +metatheology +Metatheria +metatherian +metatheses +metathesis +metathetic +metathetical +metathetically +metathoracic +metathorax +metatitanate +metatitanic +metatoluic +metatoluidine +metatracheal +metatrophic +metatungstic +metatype +metatypic +Metaurus +metavanadate +metavanadic +metavauxite +metavoltine +metaxenia +metaxite +metaxylem +metaxylene +metayer +Metazoa +metazoal +metazoan +metazoea +metazoic +metazoon +mete +metel +metempiric +metempirical +metempirically +metempiricism +metempiricist +metempirics +metempsychic +metempsychosal +metempsychose +metempsychoses +metempsychosical +metempsychosis +metempsychosize +metemptosis +metencephalic +metencephalon +metensarcosis +metensomatosis +metenteron +metenteronic +meteogram +meteograph +meteor +meteorgraph +meteoric +meteorical +meteorically +meteorism +meteorist +meteoristic +meteorital +meteorite +meteoritic +meteoritics +meteorization +meteorize +meteorlike +meteorogram +meteorograph +meteorographic +meteorography +meteoroid +meteoroidal +meteorolite +meteorolitic +meteorologic +meteorological +meteorologically +meteorologist +meteorology +meteorometer +meteoroscope +meteoroscopy +meteorous +metepencephalic +metepencephalon +metepimeral +metepimeron +metepisternal +metepisternum +meter +meterage +metergram +meterless +meterman +metership +metestick +metewand +meteyard +methacrylate +methacrylic +methadone +methanal +methanate +methane +methanoic +methanolysis +methanometer +metheglin +methemoglobin +methemoglobinemia +methemoglobinuria +methenamine +methene +methenyl +mether +methid +methide +methine +methinks +methiodide +methionic +methionine +methobromide +method +methodaster +methodeutic +methodic +methodical +methodically +methodicalness +methodics +methodism +Methodist +methodist +Methodistic +Methodistically +Methodisty +methodization +Methodize +methodize +methodizer +methodless +methodological +methodologically +methodologist +methodology +Methody +methought +methoxide +methoxychlor +methoxyl +methronic +Methuselah +methyl +methylacetanilide +methylal +methylamine +methylaniline +methylanthracene +methylate +methylation +methylator +methylcholanthrene +methylene +methylenimine +methylenitan +methylethylacetic +methylglycine +methylglycocoll +methylglyoxal +methylic +methylmalonic +methylnaphthalene +methylol +methylolurea +methylosis +methylotic +methylpentose +methylpentoses +methylpropane +methylsulfanol +metic +meticulosity +meticulous +meticulously +meticulousness +metier +metis +Metoac +metochous +metochy +metoestrous +metoestrum +Metol +metonym +metonymic +metonymical +metonymically +metonymous +metonymously +metonymy +metope +Metopias +metopic +metopion +metopism +Metopoceros +metopomancy +metopon +metoposcopic +metoposcopical +metoposcopist +metoposcopy +metosteal +metosteon +metoxazine +metoxenous +metoxeny +metra +metralgia +metranate +metranemia +metratonia +Metrazol +metrectasia +metrectatic +metrectomy +metrectopia +metrectopic +metrectopy +metreless +metreship +metreta +metrete +metretes +metria +metric +metrical +metrically +metrician +metricism +metricist +metricize +metrics +Metridium +metrification +metrifier +metrify +metriocephalic +metrist +metritis +metrocampsis +metrocarat +metrocarcinoma +metrocele +metroclyst +metrocolpocele +metrocracy +metrocratic +metrocystosis +metrodynia +metrofibroma +metrological +metrologist +metrologue +metrology +metrolymphangitis +metromalacia +metromalacoma +metromalacosis +metromania +metromaniac +metromaniacal +metrometer +metroneuria +metronome +metronomic +metronomical +metronomically +metronymic +metronymy +metroparalysis +metropathia +metropathic +metropathy +metroperitonitis +metrophlebitis +metrophotography +metropole +metropolis +metropolitan +metropolitanate +metropolitancy +metropolitanism +metropolitanize +metropolitanship +metropolite +metropolitic +metropolitical +metropolitically +metroptosia +metroptosis +metroradioscope +metrorrhagia +metrorrhagic +metrorrhea +metrorrhexis +metrorthosis +metrosalpingitis +metrosalpinx +metroscirrhus +metroscope +metroscopy +Metrosideros +metrostaxis +metrostenosis +metrosteresis +metrostyle +metrosynizesis +metrotherapist +metrotherapy +metrotome +metrotomy +Metroxylon +mettar +mettle +mettled +mettlesome +mettlesomely +mettlesomeness +metusia +metze +Meum +meuse +meute +Mev +mew +meward +mewer +mewl +mewler +Mexica +Mexican +Mexicanize +Mexitl +Mexitli +meyerhofferite +mezcal +Mezentian +Mezentism +Mezentius +mezereon +mezereum +mezuzah +mezzanine +mezzo +mezzograph +mezzotint +mezzotinter +mezzotinto +mho +mhometer +mi +Miami +miamia +mian +Miao +Miaotse +Miaotze +miaow +miaower +Miaplacidus +miargyrite +miarolitic +mias +miaskite +miasm +miasma +miasmal +miasmata +miasmatic +miasmatical +miasmatically +miasmatize +miasmatology +miasmatous +miasmic +miasmology +miasmous +Miastor +miaul +miauler +mib +mica +micaceous +micacious +micacite +Micah +micasization +micasize +micate +mication +Micawberish +Micawberism +mice +micellar +micelle +Michabo +Michabou +Michael +Michaelites +Michaelmas +Michaelmastide +miche +Michel +Michelangelesque +Michelangelism +Michelia +micher +Michigamea +Michigan +michigan +Michigander +Michiganite +miching +Michoacan +Michoacano +micht +mick +mickle +Micky +Micmac +mico +miconcave +Miconia +micramock +Micrampelis +micranatomy +micrander +micrandrous +micraner +micranthropos +Micraster +micrencephalia +micrencephalic +micrencephalous +micrencephalus +micrencephaly +micrergate +micresthete +micrify +micro +microammeter +microampere +microanalysis +microanalyst +microanalytical +microangstrom +microapparatus +microbal +microbalance +microbar +microbarograph +microbattery +microbe +microbeless +microbeproof +microbial +microbian +microbic +microbicidal +microbicide +microbiologic +microbiological +microbiologically +microbiologist +microbiology +microbion +microbiosis +microbiota +microbiotic +microbious +microbism +microbium +microblast +microblepharia +microblepharism +microblephary +microbrachia +microbrachius +microburet +microburette +microburner +microcaltrop +microcardia +microcardius +microcarpous +Microcebus +microcellular +microcentrosome +microcentrum +microcephal +microcephalia +microcephalic +microcephalism +microcephalous +microcephalus +microcephaly +microceratous +microchaeta +microcharacter +microcheilia +microcheiria +microchemic +microchemical +microchemically +microchemistry +microchiria +Microchiroptera +microchiropteran +microchiropterous +microchromosome +microchronometer +microcinema +microcinematograph +microcinematographic +microcinematography +Microcitrus +microclastic +microclimate +microclimatic +microclimatologic +microclimatological +microclimatology +microcline +microcnemia +microcoat +micrococcal +Micrococceae +Micrococcus +microcoleoptera +microcolon +microcolorimeter +microcolorimetric +microcolorimetrically +microcolorimetry +microcolumnar +microcombustion +microconidial +microconidium +microconjugant +Microconodon +microconstituent +microcopy +microcoria +microcosm +microcosmal +microcosmian +microcosmic +microcosmical +microcosmography +microcosmology +microcosmos +microcosmus +microcoulomb +microcranous +microcrith +microcryptocrystalline +microcrystal +microcrystalline +microcrystallogeny +microcrystallography +microcrystalloscopy +microcurie +Microcyprini +microcyst +microcyte +microcythemia +microcytosis +microdactylia +microdactylism +microdactylous +microdentism +microdentous +microdetection +microdetector +microdetermination +microdiactine +microdissection +microdistillation +microdont +microdontism +microdontous +microdose +microdrawing +Microdrili +microdrive +microelectrode +microelectrolysis +microelectroscope +microelement +microerg +microestimation +microeutaxitic +microevolution +microexamination +microfarad +microfauna +microfelsite +microfelsitic +microfilaria +microfilm +microflora +microfluidal +microfoliation +microfossil +microfungus +microfurnace +Microgadus +microgalvanometer +microgamete +microgametocyte +microgametophyte +microgamy +Microgaster +microgastria +Microgastrinae +microgastrine +microgeological +microgeologist +microgeology +microgilbert +microglia +microglossia +micrognathia +micrognathic +micrognathous +microgonidial +microgonidium +microgram +microgramme +microgranite +microgranitic +microgranitoid +microgranular +microgranulitic +micrograph +micrographer +micrographic +micrographical +micrographically +micrographist +micrography +micrograver +microgravimetric +microgroove +microgyne +microgyria +microhenry +microhepatia +microhistochemical +microhistology +microhm +microhmmeter +Microhymenoptera +microhymenopteron +microinjection +microjoule +microlepidopter +microlepidoptera +microlepidopteran +microlepidopterist +microlepidopteron +microlepidopterous +microleukoblast +microlevel +microlite +microliter +microlith +microlithic +microlitic +micrologic +micrological +micrologically +micrologist +micrologue +micrology +microlux +micromania +micromaniac +micromanipulation +micromanipulator +micromanometer +Micromastictora +micromazia +micromeasurement +micromechanics +micromelia +micromelic +micromelus +micromembrane +micromeral +micromere +Micromeria +micromeric +micromerism +micromeritic +micromeritics +micromesentery +micrometallographer +micrometallography +micrometallurgy +micrometer +micromethod +micrometrical +micrometrically +micrometry +micromicrofarad +micromicron +micromil +micromillimeter +micromineralogical +micromineralogy +micromorph +micromotion +micromotoscope +micromyelia +micromyeloblast +micron +Micronesian +micronization +micronize +micronometer +micronuclear +micronucleus +micronutrient +microorganic +microorganism +microorganismal +micropaleontology +micropantograph +microparasite +microparasitic +micropathological +micropathologist +micropathology +micropegmatite +micropegmatitic +micropenis +microperthite +microperthitic +micropetalous +micropetrography +micropetrologist +micropetrology +microphage +microphagocyte +microphagous +microphagy +microphakia +microphallus +microphone +microphonic +microphonics +microphonograph +microphot +microphotograph +microphotographic +microphotography +microphotometer +microphotoscope +microphthalmia +microphthalmic +microphthalmos +microphthalmus +microphyllous +microphysical +microphysics +microphysiography +microphytal +microphyte +microphytic +microphytology +micropia +micropin +micropipette +microplakite +microplankton +microplastocyte +microplastometer +micropodal +Micropodi +micropodia +Micropodidae +Micropodiformes +micropoecilitic +micropoicilitic +micropoikilitic +micropolariscope +micropolarization +micropore +microporosity +microporous +microporphyritic +microprint +microprojector +micropsia +micropsy +micropterism +micropterous +Micropterus +micropterygid +Micropterygidae +micropterygious +Micropterygoidea +Micropteryx +Micropus +micropylar +micropyle +micropyrometer +microradiometer +microreaction +microrefractometer +microrhabdus +microrheometer +microrheometric +microrheometrical +Microrhopias +Microsauria +microsaurian +microsclere +microsclerous +microsclerum +microscopal +microscope +microscopial +microscopic +microscopical +microscopically +microscopics +Microscopid +microscopist +Microscopium +microscopize +microscopy +microsecond +microsection +microseism +microseismic +microseismical +microseismograph +microseismology +microseismometer +microseismometrograph +microseismometry +microseme +microseptum +microsmatic +microsmatism +microsoma +microsomatous +microsome +microsomia +microsommite +Microsorex +microspecies +microspectroscope +microspectroscopic +microspectroscopy +Microspermae +microspermous +Microsphaera +microsphaeric +microsphere +microspheric +microspherulitic +microsplanchnic +microsplenia +microsplenic +microsporange +microsporangium +microspore +microsporiasis +microsporic +Microsporidia +microsporidian +Microsporon +microsporophore +microsporophyll +microsporosis +microsporous +Microsporum +microstat +microsthene +Microsthenes +microsthenic +microstomatous +microstome +microstomia +microstomous +microstructural +microstructure +Microstylis +microstylospore +microstylous +microsublimation +microtasimeter +microtechnic +microtechnique +microtelephone +microtelephonic +Microthelyphonida +microtheos +microtherm +microthermic +microthorax +Microthyriaceae +microtia +Microtinae +microtine +microtitration +microtome +microtomic +microtomical +microtomist +microtomy +microtone +Microtus +microtypal +microtype +microtypical +microvolt +microvolume +microvolumetric +microwatt +microwave +microweber +microzoa +microzoal +microzoan +microzoaria +microzoarian +microzoary +microzoic +microzone +microzooid +microzoology +microzoon +microzoospore +microzyma +microzyme +microzymian +micrurgic +micrurgical +micrurgist +micrurgy +Micrurus +miction +micturate +micturition +mid +midafternoon +midautumn +midaxillary +midbrain +midday +midden +middenstead +middle +middlebreaker +middlebuster +middleman +middlemanism +middlemanship +middlemost +middler +middlesplitter +middlewards +middleway +middleweight +middlewoman +middling +middlingish +middlingly +middlingness +middlings +middorsal +middy +mide +Mider +midevening +midewiwin +midfacial +midforenoon +midfrontal +midge +midget +midgety +midgy +midheaven +Midianite +Midianitish +Mididae +midiron +midland +Midlander +Midlandize +midlandward +midlatitude +midleg +midlenting +midmain +midmandibular +midmonth +midmonthly +midmorn +midmorning +midmost +midnight +midnightly +midnoon +midparent +midparentage +midparental +midpit +midrange +midrash +midrashic +midrib +midribbed +midriff +mids +midseason +midsentence +midship +midshipman +midshipmanship +midshipmite +midships +midspace +midst +midstory +midstout +midstream +midstreet +midstroke +midstyled +midsummer +midsummerish +midsummery +midtap +midvein +midverse +midward +midwatch +midway +midweek +midweekly +Midwest +Midwestern +Midwesterner +midwestward +midwife +midwifery +midwinter +midwinterly +midwintry +midwise +midyear +mien +miersite +Miescherian +miff +miffiness +miffy +mig +might +mightily +mightiness +mightless +mightnt +mighty +mightyhearted +mightyship +miglio +migmatite +migniardise +mignon +mignonette +mignonne +mignonness +Migonitis +migraine +migrainoid +migrainous +migrant +migrate +migration +migrational +migrationist +migrative +migrator +migratorial +migratory +Miguel +miharaite +mihrab +mijakite +mijl +mikado +mikadoate +mikadoism +Mikania +Mikasuki +Mike +mike +mikie +Mikir +Mil +mil +mila +milady +milammeter +Milan +Milanese +Milanion +milarite +milch +milcher +milchy +mild +milden +milder +mildew +mildewer +mildewy +mildhearted +mildheartedness +mildish +mildly +mildness +Mildred +mile +mileage +Miledh +milepost +miler +Miles +Milesian +milesima +Milesius +milestone +mileway +milfoil +milha +miliaceous +miliarensis +miliaria +miliarium +miliary +Milicent +milieu +Miliola +milioliform +milioline +miliolite +miliolitic +militancy +militant +militantly +militantness +militarily +militariness +militarism +militarist +militaristic +militaristically +militarization +militarize +military +militaryism +militaryment +militaster +militate +militation +militia +militiaman +militiate +milium +milk +milkbush +milken +milker +milkeress +milkfish +milkgrass +milkhouse +milkily +milkiness +milking +milkless +milklike +milkmaid +milkman +milkness +milkshed +milkshop +milksick +milksop +milksopism +milksoppery +milksopping +milksoppish +milksoppy +milkstone +milkweed +milkwood +milkwort +milky +mill +Milla +milla +millable +millage +millboard +millclapper +millcourse +milldam +mille +milled +millefiori +milleflorous +millefoliate +millenarian +millenarianism +millenarist +millenary +millennia +millennial +millennialism +millennialist +millennially +millennian +millenniarism +millenniary +millennium +millepede +Millepora +millepore +milleporiform +milleporine +milleporite +milleporous +millepunctate +miller +milleress +millering +Millerism +Millerite +millerite +millerole +millesimal +millesimally +millet +Millettia +millfeed +millful +millhouse +milliad +milliammeter +milliamp +milliampere +milliamperemeter +milliangstrom +milliard +milliardaire +milliare +milliarium +milliary +millibar +millicron +millicurie +Millie +millieme +milliequivalent +millifarad +millifold +milliform +milligal +milligrade +milligram +milligramage +millihenry +millilambert +millile +milliliter +millilux +millimeter +millimicron +millimolar +millimole +millincost +milline +milliner +millinerial +millinering +millinery +milling +Millingtonia +millinormal +millinormality +millioctave +millioersted +million +millionaire +millionairedom +millionairess +millionairish +millionairism +millionary +millioned +millioner +millionfold +millionism +millionist +millionize +millionocracy +millions +millionth +milliphot +millipoise +millisecond +millistere +Millite +millithrum +millivolt +millivoltmeter +millman +millocracy +millocrat +millocratism +millosevichite +millowner +millpond +millpool +millpost +millrace +millrynd +millsite +millstock +millstone +millstream +milltail +millward +millwork +millworker +millwright +millwrighting +Milly +milner +milo +milord +milpa +milreis +milsey +milsie +milt +milter +miltlike +Miltonia +Miltonian +Miltonic +Miltonically +Miltonism +Miltonist +Miltonize +miltsick +miltwaste +milty +Milvago +Milvinae +milvine +milvinous +Milvus +milzbrand +mim +mima +mimbar +mimble +Mimbreno +Mime +mime +mimeo +mimeograph +mimeographic +mimeographically +mimeographist +mimer +mimesis +mimester +mimetene +mimetesite +mimetic +mimetical +mimetically +mimetism +mimetite +Mimi +mimiambi +mimiambic +mimiambics +mimic +mimical +mimically +mimicism +mimicker +mimicry +Mimidae +Miminae +mimine +miminypiminy +mimly +mimmation +mimmest +mimmock +mimmocking +mimmocky +mimmood +mimmoud +mimmouthed +mimmouthedness +mimodrama +mimographer +mimography +mimologist +Mimosa +Mimosaceae +mimosaceous +mimosis +mimosite +mimotype +mimotypic +mimp +Mimpei +mimsey +Mimulus +Mimus +Mimusops +min +Mina +mina +minable +minacious +minaciously +minaciousness +minacity +Minaean +Minahassa +Minahassan +Minahassian +minar +minaret +minareted +minargent +minasragrite +minatorial +minatorially +minatorily +minatory +minaway +mince +mincemeat +mincer +minchery +minchiate +mincing +mincingly +mincingness +Mincopi +Mincopie +mind +minded +Mindel +Mindelian +minder +Mindererus +mindful +mindfully +mindfulness +minding +mindless +mindlessly +mindlessness +mindsight +mine +mineowner +miner +mineragraphic +mineragraphy +mineraiogic +mineral +mineralizable +mineralization +mineralize +mineralizer +mineralogical +mineralogically +mineralogist +mineralogize +mineralogy +Minerva +minerval +Minervan +Minervic +minery +mines +minette +mineworker +Ming +ming +minge +mingelen +mingle +mingleable +mingledly +minglement +mingler +minglingly +Mingo +Mingrelian +minguetite +mingwort +mingy +minhag +minhah +miniaceous +miniate +miniator +miniature +miniaturist +minibus +minicam +minicamera +Miniconjou +minienize +minification +minify +minikin +minikinly +minim +minima +minimacid +minimal +minimalism +Minimalist +minimalkaline +minimally +minimetric +minimifidian +minimifidianism +minimism +minimistic +Minimite +minimitude +minimization +minimize +minimizer +minimum +minimus +minimuscular +mining +minion +minionette +minionism +minionly +minionship +minish +minisher +minishment +minister +ministeriable +ministerial +ministerialism +ministerialist +ministeriality +ministerially +ministerialness +ministerium +ministership +ministrable +ministrant +ministration +ministrative +ministrator +ministrer +ministress +ministry +ministryship +minitant +Minitari +minium +miniver +minivet +mink +minkery +minkish +Minkopi +Minnehaha +minnesinger +minnesong +Minnesotan +Minnetaree +Minnie +minnie +minniebush +minning +minnow +minny +mino +Minoan +minoize +minometer +minor +minorage +minorate +minoration +Minorca +Minorcan +Minoress +minoress +Minorist +Minorite +minority +minorship +Minos +minot +Minotaur +Minseito +minsitive +minster +minsteryard +minstrel +minstreless +minstrelship +minstrelsy +mint +mintage +Mintaka +mintbush +minter +mintmaker +mintmaking +mintman +mintmaster +minty +minuend +minuet +minuetic +minuetish +minus +minuscular +minuscule +minutary +minutation +minute +minutely +minuteman +minuteness +minuter +minuthesis +minutia +minutiae +minutial +minutiose +minutiously +minutissimic +minverite +minx +minxish +minxishly +minxishness +minxship +miny +Minyadidae +Minyae +Minyan +minyan +Minyas +miocardia +Miocene +Miocenic +Miohippus +miolithic +mioplasmia +miothermic +miqra +miquelet +mir +Mira +Mirabel +Mirabell +mirabiliary +Mirabilis +mirabilite +Mirac +Mirach +mirach +miracidial +miracidium +miracle +miraclemonger +miraclemongering +miraclist +miraculist +miraculize +miraculosity +miraculous +miraculously +miraculousness +mirador +mirage +miragy +Mirak +Miramolin +Mirana +Miranda +mirandous +Miranha +Miranhan +mirate +mirbane +mird +mirdaha +mire +mirepoix +Mirfak +Miriam +mirid +Miridae +mirific +miriness +mirish +mirk +mirkiness +mirksome +mirliton +Miro +miro +Mirounga +mirror +mirrored +mirrorize +mirrorlike +mirrorscope +mirrory +mirth +mirthful +mirthfully +mirthfulness +mirthless +mirthlessly +mirthlessness +mirthsome +mirthsomeness +miry +miryachit +mirza +misaccent +misaccentuation +misachievement +misacknowledge +misact +misadapt +misadaptation +misadd +misaddress +misadjust +misadmeasurement +misadministration +misadvantage +misadventure +misadventurer +misadventurous +misadventurously +misadvertence +misadvice +misadvise +misadvised +misadvisedly +misadvisedness +misaffected +misaffection +misaffirm +misagent +misaim +misalienate +misalignment +misallegation +misallege +misalliance +misallotment +misallowance +misally +misalphabetize +misalter +misanalyze +misandry +misanswer +misanthrope +misanthropia +misanthropic +misanthropical +misanthropically +misanthropism +misanthropist +misanthropize +misanthropy +misapparel +misappear +misappearance +misappellation +misapplication +misapplier +misapply +misappoint +misappointment +misappraise +misappraisement +misappreciate +misappreciation +misappreciative +misapprehend +misapprehendingly +misapprehensible +misapprehension +misapprehensive +misapprehensively +misapprehensiveness +misappropriate +misappropriately +misappropriation +misarchism +misarchist +misarrange +misarrangement +misarray +misascribe +misascription +misasperse +misassay +misassent +misassert +misassign +misassociate +misassociation +misatone +misattend +misattribute +misattribution +misaunter +misauthorization +misauthorize +misaward +misbandage +misbaptize +misbecome +misbecoming +misbecomingly +misbecomingness +misbefitting +misbeget +misbegin +misbegotten +misbehave +misbehavior +misbeholden +misbelief +misbelieve +misbeliever +misbelievingly +misbelove +misbeseem +misbestow +misbestowal +misbetide +misbias +misbill +misbind +misbirth +misbode +misborn +misbrand +misbuild +misbusy +miscalculate +miscalculation +miscalculator +miscall +miscaller +miscanonize +miscarriage +miscarriageable +miscarry +miscast +miscasualty +misceability +miscegenate +miscegenation +miscegenationist +miscegenator +miscegenetic +miscegine +miscellanarian +miscellanea +miscellaneity +miscellaneous +miscellaneously +miscellaneousness +miscellanist +miscellany +mischallenge +mischance +mischanceful +mischancy +mischaracterization +mischaracterize +mischarge +mischief +mischiefful +mischieve +mischievous +mischievously +mischievousness +mischio +mischoice +mischoose +mischristen +miscibility +miscible +miscipher +misclaim +misclaiming +misclass +misclassification +misclassify +miscognizant +miscoin +miscoinage +miscollocation +miscolor +miscoloration +miscommand +miscommit +miscommunicate +miscompare +miscomplacence +miscomplain +miscomplaint +miscompose +miscomprehend +miscomprehension +miscomputation +miscompute +misconceive +misconceiver +misconception +misconclusion +miscondition +misconduct +misconfer +misconfidence +misconfident +misconfiguration +misconjecture +misconjugate +misconjugation +misconjunction +misconsecrate +misconsequence +misconstitutional +misconstruable +misconstruct +misconstruction +misconstructive +misconstrue +misconstruer +miscontinuance +misconvenient +misconvey +miscook +miscookery +miscorrect +miscorrection +miscounsel +miscount +miscovet +miscreancy +miscreant +miscreate +miscreation +miscreative +miscreator +miscredited +miscredulity +miscreed +miscript +miscrop +miscue +miscultivated +misculture +miscurvature +miscut +misdate +misdateful +misdaub +misdeal +misdealer +misdecide +misdecision +misdeclaration +misdeclare +misdeed +misdeem +misdeemful +misdefine +misdeformed +misdeliver +misdelivery +misdemean +misdemeanant +misdemeanist +misdemeanor +misdentition +misderivation +misderive +misdescribe +misdescriber +misdescription +misdescriptive +misdesire +misdetermine +misdevise +misdevoted +misdevotion +misdiet +misdirect +misdirection +misdispose +misdisposition +misdistinguish +misdistribute +misdistribution +misdivide +misdivision +misdo +misdoer +misdoing +misdoubt +misdower +misdraw +misdread +misdrive +mise +misease +misecclesiastic +misedit +miseducate +miseducation +miseducative +miseffect +misemphasis +misemphasize +misemploy +misemployment +misencourage +misendeavor +misenforce +misengrave +misenite +misenjoy +misenroll +misentitle +misenunciation +Misenus +miser +miserabilism +miserabilist +miserabilistic +miserability +miserable +miserableness +miserably +miserdom +miserected +Miserere +miserhood +misericord +Misericordia +miserism +miserliness +miserly +misery +misesteem +misestimate +misestimation +misexample +misexecute +misexecution +misexpectation +misexpend +misexpenditure +misexplain +misexplanation +misexplication +misexposition +misexpound +misexpress +misexpression +misexpressive +misfaith +misfare +misfashion +misfather +misfault +misfeasance +misfeasor +misfeature +misfield +misfigure +misfile +misfire +misfit +misfond +misform +misformation +misfortunate +misfortunately +misfortune +misfortuned +misfortuner +misframe +misgauge +misgesture +misgive +misgiving +misgivingly +misgo +misgotten +misgovern +misgovernance +misgovernment +misgovernor +misgracious +misgraft +misgrave +misground +misgrow +misgrown +misgrowth +misguess +misguggle +misguidance +misguide +misguided +misguidedly +misguidedness +misguider +misguiding +misguidingly +mishandle +mishap +mishappen +Mishikhwutmetunne +mishmash +mishmee +Mishmi +Mishnah +Mishnaic +Mishnic +Mishnical +Mishongnovi +misidentification +misidentify +Misima +misimagination +misimagine +misimpression +misimprove +misimprovement +misimputation +misimpute +misincensed +misincite +misinclination +misincline +misinfer +misinference +misinflame +misinform +misinformant +misinformation +misinformer +misingenuity +misinspired +misinstruct +misinstruction +misinstructive +misintelligence +misintelligible +misintend +misintention +misinter +misinterment +misinterpret +misinterpretable +misinterpretation +misinterpreter +misintimation +misjoin +misjoinder +misjudge +misjudgement +misjudger +misjudgingly +misjudgment +miskeep +misken +miskenning +miskill +miskindle +misknow +misknowledge +misky +mislabel +mislabor +mislanguage +mislay +mislayer +mislead +misleadable +misleader +misleading +misleadingly +misleadingness +mislear +misleared +mislearn +misled +mislest +mislight +mislike +misliken +mislikeness +misliker +mislikingly +mislippen +mislive +mislocate +mislocation +mislodge +mismade +mismake +mismanage +mismanageable +mismanagement +mismanager +mismarriage +mismarry +mismatch +mismatchment +mismate +mismeasure +mismeasurement +mismenstruation +misminded +mismingle +mismotion +mismove +misname +misnarrate +misnatured +misnavigation +Misniac +misnomed +misnomer +misnumber +misnurture +misnutrition +misobedience +misobey +misobservance +misobserve +misocapnic +misocapnist +misocatholic +misoccupy +misogallic +misogamic +misogamist +misogamy +misogyne +misogynic +misogynical +misogynism +misogynist +misogynistic +misogynistical +misogynous +misogyny +misohellene +misologist +misology +misomath +misoneism +misoneist +misoneistic +misopaterist +misopedia +misopedism +misopedist +misopinion +misopolemical +misorder +misordination +misorganization +misorganize +misoscopist +misosophist +misosophy +misotheism +misotheist +misotheistic +misotramontanism +misotyranny +misoxene +misoxeny +mispage +mispagination +mispaint +misparse +mispart +mispassion +mispatch +mispay +misperceive +misperception +misperform +misperformance +mispersuade +misperuse +misphrase +mispick +mispickel +misplace +misplacement +misplant +misplay +misplead +mispleading +misplease +mispoint +mispoise +mispolicy +misposition +mispossessed +mispractice +mispraise +misprejudiced +misprincipled +misprint +misprisal +misprision +misprize +misprizer +misproceeding +misproduce +misprofess +misprofessor +mispronounce +mispronouncement +mispronunciation +misproportion +misproposal +mispropose +misproud +misprovide +misprovidence +misprovoke +mispunctuate +mispunctuation +mispurchase +mispursuit +misput +misqualify +misquality +misquotation +misquote +misquoter +misraise +misrate +misread +misreader +misrealize +misreason +misreceive +misrecital +misrecite +misreckon +misrecognition +misrecognize +misrecollect +misrefer +misreference +misreflect +misreform +misregulate +misrehearsal +misrehearse +misrelate +misrelation +misreliance +misremember +misremembrance +misrender +misrepeat +misreport +misreporter +misreposed +misrepresent +misrepresentation +misrepresentative +misrepresenter +misreprint +misrepute +misresemblance +misresolved +misresult +misreward +misrhyme +misrhymer +misrule +miss +missable +missal +missay +missayer +misseem +missel +missemblance +missentence +misserve +misservice +misset +misshape +misshapen +misshapenly +misshapenness +misshood +missible +missile +missileproof +missiness +missing +missingly +mission +missional +missionarize +missionary +missionaryship +missioner +missionize +missionizer +missis +Missisauga +missish +missishness +Mississippi +Mississippian +missive +missmark +missment +Missouri +Missourian +Missourianism +missourite +misspeak +misspeech +misspell +misspelling +misspend +misspender +misstate +misstatement +misstater +misstay +misstep +missuade +missuggestion +missummation +missuppose +missy +missyish +missyllabication +missyllabify +mist +mistakable +mistakableness +mistakably +mistake +mistakeful +mistaken +mistakenly +mistakenness +mistakeproof +mistaker +mistaking +mistakingly +mistassini +mistaught +mistbow +misteach +misteacher +misted +mistell +mistempered +mistend +mistendency +Mister +mister +misterm +mistetch +mistfall +mistflower +mistful +misthink +misthought +misthread +misthrift +misthrive +misthrow +mistic +mistide +mistify +mistigris +mistily +mistime +mistiness +mistitle +mistle +mistless +mistletoe +mistone +mistonusk +mistook +mistouch +mistradition +mistrain +mistral +mistranscribe +mistranscript +mistranscription +mistranslate +mistranslation +mistreat +mistreatment +mistress +mistressdom +mistresshood +mistressless +mistressly +mistrial +mistrist +mistrust +mistruster +mistrustful +mistrustfully +mistrustfulness +mistrusting +mistrustingly +mistrustless +mistry +mistryst +misturn +mistutor +misty +mistyish +misunderstand +misunderstandable +misunderstander +misunderstanding +misunderstandingly +misunderstood +misunderstoodness +misura +misusage +misuse +misuseful +misusement +misuser +misusurped +misvaluation +misvalue +misventure +misventurous +misvouch +miswed +miswisdom +miswish +misword +misworship +misworshiper +misworshipper +miswrite +misyoke +miszealous +Mitakshara +Mitanni +Mitannian +Mitannish +mitapsis +mitchboard +Mitchella +mite +Mitella +miteproof +miter +mitered +miterer +miterflower +miterwort +Mithra +Mithraea +Mithraeum +Mithraic +Mithraicism +Mithraicist +Mithraicize +Mithraism +Mithraist +Mithraistic +Mithraitic +Mithraize +Mithras +Mithratic +Mithriac +mithridate +Mithridatic +mithridatic +mithridatism +mithridatize +miticidal +miticide +mitigable +mitigant +mitigate +mitigatedly +mitigation +mitigative +mitigator +mitigatory +mitis +mitochondria +mitochondrial +mitogenetic +mitome +mitosis +mitosome +mitotic +mitotically +Mitra +mitra +mitrailleuse +mitral +mitrate +mitre +mitrer +Mitridae +mitriform +Mitsukurina +Mitsukurinidae +mitsumata +mitt +mittelhand +Mittelmeer +mitten +mittened +mittimus +mitty +Mitu +Mitua +mity +miurus +mix +mixable +mixableness +mixblood +Mixe +mixed +mixedly +mixedness +mixen +mixer +mixeress +mixhill +mixible +mixite +mixobarbaric +mixochromosome +Mixodectes +Mixodectidae +mixolydian +mixoploid +mixoploidy +Mixosaurus +mixotrophic +Mixtec +Mixtecan +mixtiform +mixtilineal +mixtilion +mixtion +mixture +mixy +Mizar +mizmaze +Mizpah +Mizraim +mizzen +mizzenmast +mizzenmastman +mizzentopman +mizzle +mizzler +mizzly +mizzonite +mizzy +mlechchha +mneme +mnemic +Mnemiopsis +mnemonic +mnemonical +mnemonicalist +mnemonically +mnemonicon +mnemonics +mnemonism +mnemonist +mnemonization +mnemonize +Mnemosyne +mnemotechnic +mnemotechnical +mnemotechnics +mnemotechnist +mnemotechny +mnesic +mnestic +Mnevis +Mniaceae +mniaceous +mnioid +Mniotiltidae +Mnium +Mo +mo +Moabite +Moabitess +Moabitic +Moabitish +moan +moanful +moanfully +moanification +moaning +moaningly +moanless +Moaria +Moarian +moat +Moattalite +mob +mobable +mobbable +mobber +mobbish +mobbishly +mobbishness +mobbism +mobbist +mobby +mobcap +mobed +mobile +Mobilian +mobilianer +mobiliary +mobility +mobilizable +mobilization +mobilize +mobilometer +moble +moblike +mobocracy +mobocrat +mobocratic +mobocratical +mobolatry +mobproof +mobship +mobsman +mobster +Mobula +Mobulidae +moccasin +Mocha +mocha +Mochica +mochras +mock +mockable +mockado +mockbird +mocker +mockernut +mockery +mockful +mockfully +mockground +mockingbird +mockingstock +mocmain +Mocoa +Mocoan +mocomoco +mocuck +Mod +modal +modalism +modalist +modalistic +modality +modalize +modally +mode +model +modeler +modeless +modelessness +modeling +modelist +modeller +modelmaker +modelmaking +modena +Modenese +moderant +moderantism +moderantist +moderate +moderately +moderateness +moderation +moderationist +moderatism +moderatist +moderato +moderator +moderatorship +moderatrix +Modern +modern +moderner +modernicide +modernish +modernism +modernist +modernistic +modernity +modernizable +modernization +modernize +modernizer +modernly +modernness +modest +modestly +modestness +modesty +modiation +modicity +modicum +modifiability +modifiable +modifiableness +modifiably +modificability +modificable +modification +modificationist +modificative +modificator +modificatory +modifier +modify +modillion +modiolar +Modiolus +modiolus +modish +modishly +modishness +modist +modiste +modistry +modius +Modoc +Modred +modulability +modulant +modular +modulate +modulation +modulative +modulator +modulatory +module +Modulidae +modulo +modulus +modumite +Moed +Moehringia +moellon +moerithere +moeritherian +Moeritheriidae +Moeritherium +mofette +moff +mofussil +mofussilite +mog +mogador +mogadore +mogdad +moggan +moggy +Moghan +mogigraphia +mogigraphic +mogigraphy +mogilalia +mogilalism +mogiphonia +mogitocia +mogo +mogographia +Mogollon +Mograbi +Mogrebbin +moguey +Mogul +mogulship +Moguntine +moha +mohabat +mohair +Mohammedan +Mohammedanism +Mohammedanization +Mohammedanize +Mohammedism +Mohammedist +Mohammedization +Mohammedize +mohar +Mohave +Mohawk +Mohawkian +mohawkite +Mohegan +mohel +Mohican +Mohineyam +mohnseed +moho +Mohock +Mohockism +mohr +Mohrodendron +mohur +Moi +moider +moidore +moieter +moiety +moil +moiler +moiles +moiley +moiling +moilingly +moilsome +moineau +Moingwena +moio +Moira +moire +moirette +moise +Moism +moissanite +moist +moisten +moistener +moistful +moistify +moistish +moistishness +moistless +moistly +moistness +moisture +moistureless +moistureproof +moisty +moit +moity +mojarra +Mojo +mojo +mokaddam +moke +moki +mokihana +moko +moksha +mokum +moky +Mola +mola +molal +Molala +molality +molar +molariform +molarimeter +molarity +molary +Molasse +molasses +molassied +molassy +molave +mold +moldability +moldable +moldableness +Moldavian +moldavite +moldboard +molder +moldery +moldiness +molding +moldmade +moldproof +moldwarp +moldy +Mole +mole +molecast +molecula +molecular +molecularist +molecularity +molecularly +molecule +molehead +moleheap +molehill +molehillish +molehilly +moleism +molelike +molendinar +molendinary +molengraaffite +moleproof +moler +moleskin +molest +molestation +molester +molestful +molestfully +Molge +Molgula +Molidae +molimen +moliminous +molinary +moline +Molinia +Molinism +Molinist +Molinistic +molka +Moll +molland +Mollberg +molle +mollescence +mollescent +molleton +mollichop +mollicrush +mollie +mollienisia +mollient +molliently +mollifiable +mollification +mollifiedly +mollifier +mollify +mollifying +mollifyingly +mollifyingness +molligrant +molligrubs +mollipilose +Mollisiaceae +mollisiose +mollities +mollitious +mollitude +Molluginaceae +Mollugo +Mollusca +molluscan +molluscivorous +molluscoid +Molluscoida +molluscoidal +molluscoidan +Molluscoidea +molluscoidean +molluscous +molluscousness +molluscum +mollusk +Molly +molly +mollycoddle +mollycoddler +mollycoddling +mollycosset +mollycot +mollyhawk +molman +Moloch +Molochize +Molochship +moloid +moloker +molompi +molosse +Molossian +molossic +Molossidae +molossine +molossoid +molossus +Molothrus +molpe +molrooken +molt +molten +moltenly +molter +Molucca +Moluccan +Moluccella +Moluche +moly +molybdate +molybdena +molybdenic +molybdeniferous +molybdenite +molybdenous +molybdenum +molybdic +molybdite +molybdocardialgia +molybdocolic +molybdodyspepsia +molybdomancy +molybdomenite +molybdonosus +molybdoparesis +molybdophyllite +molybdosis +molybdous +molysite +mombin +momble +Mombottu +mome +moment +momenta +momental +momentally +momentaneall +momentaneity +momentaneous +momentaneously +momentaneousness +momentarily +momentariness +momentary +momently +momentous +momentously +momentousness +momentum +momiology +momism +momme +mommet +mommy +momo +Momordica +Momotidae +Momotinae +Momotus +Momus +Mon +mon +mona +Monacan +monacanthid +Monacanthidae +monacanthine +monacanthous +Monacha +monachal +monachate +Monachi +monachism +monachist +monachization +monachize +monactin +monactine +monactinellid +monactinellidan +monad +monadelph +Monadelphia +monadelphian +monadelphous +monadic +monadical +monadically +monadiform +monadigerous +Monadina +monadism +monadistic +monadnock +monadology +monaene +monal +monamniotic +Monanday +monander +Monandria +monandrian +monandric +monandrous +monandry +monanthous +monapsal +monarch +monarchal +monarchally +monarchess +monarchial +monarchian +monarchianism +monarchianist +monarchianistic +monarchic +monarchical +monarchically +monarchism +monarchist +monarchistic +monarchize +monarchizer +monarchlike +monarchomachic +monarchomachist +monarchy +Monarda +Monardella +monarthritis +monarticular +monas +Monasa +Monascidiae +monascidian +monase +monaster +monasterial +monasterially +monastery +monastic +monastical +monastically +monasticism +monasticize +monatomic +monatomicity +monatomism +monaulos +monaural +monaxial +monaxile +monaxon +monaxonial +monaxonic +Monaxonida +monazine +monazite +Monbuttu +monchiquite +Monday +Mondayish +Mondayishness +Mondayland +mone +Monegasque +Monel +monel +monembryary +monembryonic +monembryony +monepic +monepiscopacy +monepiscopal +moner +Monera +moneral +moneran +monergic +monergism +monergist +monergistic +moneric +moneron +Monerozoa +monerozoan +monerozoic +monerula +Moneses +monesia +monetarily +monetary +monetite +monetization +monetize +money +moneyage +moneybag +moneybags +moneyed +moneyer +moneyflower +moneygrub +moneygrubber +moneygrubbing +moneylender +moneylending +moneyless +moneymonger +moneymongering +moneysaving +moneywise +moneywort +mong +mongcorn +monger +mongering +mongery +Monghol +Mongholian +Mongibel +mongler +Mongo +Mongol +Mongolian +Mongolianism +Mongolic +Mongolioid +Mongolish +Mongolism +Mongolization +Mongolize +Mongoloid +mongoose +Mongoyo +mongrel +mongreldom +mongrelish +mongrelism +mongrelity +mongrelization +mongrelize +mongrelly +mongrelness +mongst +monheimite +monial +Monias +Monica +moniker +monilated +monilethrix +Monilia +Moniliaceae +moniliaceous +Moniliales +monilicorn +moniliform +moniliformly +monilioid +moniment +Monimia +Monimiaceae +monimiaceous +monimolite +monimostylic +monism +monist +monistic +monistical +monistically +monition +monitive +monitor +monitorial +monitorially +monitorish +monitorship +monitory +monitress +monitrix +monk +monkbird +monkcraft +monkdom +monkery +monkess +monkey +monkeyboard +monkeyface +monkeyfy +monkeyhood +monkeyish +monkeyishly +monkeyishness +monkeylike +monkeynut +monkeypod +monkeypot +monkeyry +monkeyshine +monkeytail +monkfish +monkflower +monkhood +monkish +monkishly +monkishness +monkism +monklike +monkliness +monkly +monkmonger +monkship +monkshood +Monmouth +monmouthite +monny +Mono +mono +monoacetate +monoacetin +monoacid +monoacidic +monoamide +monoamine +monoamino +monoammonium +monoazo +monobacillary +monobase +monobasic +monobasicity +monoblastic +monoblepsia +monoblepsis +monobloc +monobranchiate +monobromacetone +monobromated +monobromide +monobrominated +monobromination +monobromized +monobromoacetanilide +monobromoacetone +monobutyrin +monocalcium +monocarbide +monocarbonate +monocarbonic +monocarboxylic +monocardian +monocarp +monocarpal +monocarpellary +monocarpian +monocarpic +monocarpous +monocellular +monocentric +monocentrid +Monocentridae +Monocentris +monocentroid +monocephalous +monocercous +monoceros +monocerous +monochasial +monochasium +Monochlamydeae +monochlamydeous +monochlor +monochloracetic +monochloranthracene +monochlorbenzene +monochloride +monochlorinated +monochlorination +monochloro +monochloroacetic +monochlorobenzene +monochloromethane +monochoanitic +monochord +monochordist +monochordize +monochroic +monochromasy +monochromat +monochromate +monochromatic +monochromatically +monochromatism +monochromator +monochrome +monochromic +monochromical +monochromically +monochromist +monochromous +monochromy +monochronic +monochronous +monociliated +monocle +monocled +monocleid +monoclinal +monoclinally +monocline +monoclinian +monoclinic +monoclinism +monoclinometric +monoclinous +Monoclonius +Monocoelia +monocoelian +monocoelic +Monocondyla +monocondylar +monocondylian +monocondylic +monocondylous +monocormic +monocot +monocotyledon +Monocotyledones +monocotyledonous +monocracy +monocrat +monocratic +monocrotic +monocrotism +monocular +monocularity +monocularly +monoculate +monocule +monoculist +monoculous +monocultural +monoculture +monoculus +monocyanogen +monocycle +monocyclic +Monocyclica +monocystic +Monocystidae +Monocystidea +Monocystis +monocyte +monocytic +monocytopoiesis +monodactyl +monodactylate +monodactyle +monodactylism +monodactylous +monodactyly +monodelph +Monodelphia +monodelphian +monodelphic +monodelphous +monodermic +monodic +monodically +monodimetric +monodist +monodize +monodomous +Monodon +monodont +Monodonta +monodontal +monodram +monodrama +monodramatic +monodramatist +monodromic +monodromy +monody +monodynamic +monodynamism +Monoecia +monoecian +monoecious +monoeciously +monoeciousness +monoecism +monoeidic +monoestrous +monoethanolamine +monoethylamine +monofilament +monofilm +monoflagellate +monoformin +monogamian +monogamic +monogamist +monogamistic +monogamous +monogamously +monogamousness +monogamy +monoganglionic +monogastric +monogene +Monogenea +monogeneity +monogeneous +monogenesis +monogenesist +monogenesy +monogenetic +Monogenetica +monogenic +monogenism +monogenist +monogenistic +monogenous +monogeny +monoglot +monoglycerid +monoglyceride +monogoneutic +monogonoporic +monogonoporous +monogony +monogram +monogrammatic +monogrammatical +monogrammed +monogrammic +monograph +monographer +monographic +monographical +monographically +monographist +monography +monograptid +Monograptidae +Monograptus +monogynic +monogynious +monogynist +monogynoecial +monogynous +monogyny +monohybrid +monohydrate +monohydrated +monohydric +monohydrogen +monohydroxy +monoicous +monoid +monoketone +monolater +monolatrist +monolatrous +monolatry +monolayer +monoline +monolingual +monolinguist +monoliteral +monolith +monolithal +monolithic +monolobular +monolocular +monologian +monologic +monological +monologist +monologize +monologue +monologuist +monology +monomachist +monomachy +monomania +monomaniac +monomaniacal +monomastigate +monomeniscous +monomer +monomeric +monomerous +monometallic +monometallism +monometallist +monometer +monomethyl +monomethylated +monomethylic +monometric +monometrical +monomial +monomict +monomineral +monomineralic +monomolecular +monomolybdate +Monomorium +monomorphic +monomorphism +monomorphous +Monomya +Monomyaria +monomyarian +mononaphthalene +mononch +Mononchus +mononeural +Monongahela +mononitrate +mononitrated +mononitration +mononitride +mononitrobenzene +mononomial +mononomian +monont +mononuclear +mononucleated +mononucleosis +mononychous +mononym +mononymic +mononymization +mononymize +mononymy +monoousian +monoousious +monoparental +monoparesis +monoparesthesia +monopathic +monopathy +monopectinate +monopersonal +monopersulfuric +monopersulphuric +Monopetalae +monopetalous +monophagism +monophagous +monophagy +monophase +monophasia +monophasic +monophobia +monophone +monophonic +monophonous +monophony +monophotal +monophote +monophthalmic +monophthalmus +monophthong +monophthongal +monophthongization +monophthongize +monophyletic +monophyleticism +monophylite +monophyllous +monophyodont +monophyodontism +Monophysite +Monophysitic +Monophysitical +Monophysitism +monopitch +monoplacula +monoplacular +monoplaculate +monoplane +monoplanist +monoplasmatic +monoplast +monoplastic +monoplegia +monoplegic +Monopneumoa +monopneumonian +monopneumonous +monopode +monopodial +monopodially +monopodic +monopodium +monopodous +monopody +monopolar +monopolaric +monopolarity +monopole +monopolism +monopolist +monopolistic +monopolistically +monopolitical +monopolizable +monopolization +monopolize +monopolizer +monopolous +monopoly +monopolylogist +monopolylogue +monopotassium +monoprionid +monoprionidian +monopsonistic +monopsony +monopsychism +monopteral +Monopteridae +monopteroid +monopteron +monopteros +monopterous +monoptic +monoptical +monoptote +monoptotic +Monopylaea +Monopylaria +monopylean +monopyrenous +monorail +monorailroad +monorailway +monorchid +monorchidism +monorchis +monorchism +monorganic +Monorhina +monorhinal +monorhine +monorhyme +monorhymed +monorhythmic +monosaccharide +monosaccharose +monoschemic +monoscope +monose +monosemic +monosepalous +monoservice +monosilane +monosilicate +monosilicic +monosiphonic +monosiphonous +monosodium +monosomatic +monosomatous +monosome +monosomic +monosperm +monospermal +monospermic +monospermous +monospermy +monospherical +monospondylic +monosporangium +monospore +monospored +monosporiferous +monosporous +monostele +monostelic +monostelous +monostely +monostich +monostichous +Monostomata +Monostomatidae +monostomatous +monostome +Monostomidae +monostomous +Monostomum +monostromatic +monostrophe +monostrophic +monostrophics +monostylous +monosubstituted +monosubstitution +monosulfone +monosulfonic +monosulphide +monosulphone +monosulphonic +monosyllabic +monosyllabical +monosyllabically +monosyllabism +monosyllabize +monosyllable +monosymmetric +monosymmetrical +monosymmetrically +monosymmetry +monosynthetic +monotelephone +monotelephonic +monotellurite +Monothalama +monothalamian +monothalamous +monothecal +monotheism +monotheist +monotheistic +monotheistical +monotheistically +Monothelete +Monotheletian +Monotheletic +Monotheletism +monothelious +Monothelism +Monothelitic +Monothelitism +monothetic +monotic +monotint +Monotocardia +monotocardiac +monotocardian +monotocous +monotomous +monotone +monotonic +monotonical +monotonically +monotonist +monotonize +monotonous +monotonously +monotonousness +monotony +monotremal +Monotremata +monotremate +monotrematous +monotreme +monotremous +monotrichous +monotriglyph +monotriglyphic +Monotrocha +monotrochal +monotrochian +monotrochous +Monotropa +Monotropaceae +monotropaceous +monotrophic +monotropic +Monotropsis +monotropy +monotypal +monotype +monotypic +monotypical +monotypous +monoureide +monovalence +monovalency +monovalent +monovariant +monoverticillate +monovoltine +monovular +monoxenous +monoxide +monoxime +monoxyle +monoxylic +monoxylon +monoxylous +Monozoa +monozoan +monozoic +monozygotic +Monroeism +Monroeist +monrolite +monseigneur +monsieur +monsieurship +monsignor +monsignorial +Monsoni +monsoon +monsoonal +monsoonish +monsoonishly +monster +Monstera +monsterhood +monsterlike +monstership +monstrance +monstrate +monstration +monstrator +monstricide +monstriferous +monstrification +monstrify +monstrosity +monstrous +monstrously +monstrousness +Mont +montage +Montagnac +Montagnais +Montana +montana +Montanan +montane +montanic +montanin +Montanism +Montanist +Montanistic +Montanistical +montanite +Montanize +montant +Montargis +Montauk +montbretia +monte +montebrasite +monteith +montem +Montenegrin +Montepulciano +Monterey +Montes +Montesco +Montesinos +Montessorian +Montessorianism +Montezuma +montgolfier +month +monthly +monthon +Montia +monticellite +monticle +monticoline +monticulate +monticule +Monticulipora +Monticuliporidae +monticuliporidean +monticuliporoid +monticulose +monticulous +monticulus +montiform +montigeneous +montilla +montjoy +montmartrite +Montmorency +montmorilonite +monton +Montrachet +montroydite +Montu +monture +Monumbo +monument +monumental +monumentalism +monumentality +monumentalization +monumentalize +monumentally +monumentary +monumentless +monumentlike +monzodiorite +monzogabbro +monzonite +monzonitic +moo +Mooachaht +mooch +moocha +moocher +moochulka +mood +mooder +moodily +moodiness +moodish +moodishly +moodishness +moodle +moody +mooing +mool +moolet +moolings +mools +moolum +moon +moonack +moonbeam +moonbill +moonblink +mooncalf +mooncreeper +moondown +moondrop +mooned +mooner +moonery +mooneye +moonface +moonfaced +moonfall +moonfish +moonflower +moonglade +moonglow +moonhead +moonily +mooniness +mooning +moonish +moonite +moonja +moonjah +moonless +moonlet +moonlight +moonlighted +moonlighter +moonlighting +moonlighty +moonlike +moonlikeness +moonlit +moonlitten +moonman +moonpath +moonpenny +moonproof +moonraker +moonraking +moonrise +moonsail +moonscape +moonseed +moonset +moonshade +moonshine +moonshiner +moonshining +moonshiny +moonsick +moonsickness +moonstone +moontide +moonwalker +moonwalking +moonward +moonwards +moonway +moonwort +moony +moop +Moor +moor +moorage +moorball +moorband +moorberry +moorbird +moorburn +moorburner +moorburning +moorflower +moorfowl +mooring +Moorish +moorish +moorishly +moorishness +moorland +moorlander +Moorman +moorman +moorn +moorpan +moors +Moorship +moorsman +moorstone +moortetter +moorup +moorwort +moory +moosa +moose +mooseberry +moosebird +moosebush +moosecall +mooseflower +moosehood +moosemise +moosetongue +moosewob +moosewood +moosey +moost +moot +mootable +mooter +mooth +mooting +mootman +mootstead +mootworthy +mop +Mopan +mopane +mopboard +mope +moper +moph +mophead +mopheaded +moping +mopingly +mopish +mopishly +mopishness +mopla +mopper +moppet +moppy +mopstick +mopsy +mopus +Moquelumnan +moquette +Moqui +mor +mora +Moraceae +moraceous +Moraea +morainal +moraine +morainic +moral +morale +moralism +moralist +moralistic +moralistically +morality +moralization +moralize +moralizer +moralizingly +moralless +morally +moralness +morals +morass +morassic +morassweed +morassy +morat +morate +moration +moratoria +moratorium +moratory +Moravian +Moravianism +Moravianized +Moravid +moravite +moray +morbid +morbidity +morbidize +morbidly +morbidness +morbiferal +morbiferous +morbific +morbifical +morbifically +morbify +morbility +morbillary +morbilli +morbilliform +morbillous +morcellate +morcellated +morcellation +Morchella +Morcote +mordacious +mordaciously +mordacity +mordancy +mordant +mordantly +Mordella +mordellid +Mordellidae +mordelloid +mordenite +mordent +mordicate +mordication +mordicative +mordore +Mordv +Mordva +Mordvin +Mordvinian +more +moreen +morefold +moreish +morel +morella +morello +morencite +moreness +morenita +morenosite +Moreote +moreover +morepork +mores +Moresque +morfrey +morg +morga +Morgan +morgan +Morgana +morganatic +morganatical +morganatically +morganic +morganite +morganize +morgay +morgen +morgengift +morgenstern +morglay +morgue +moribund +moribundity +moribundly +moric +moriche +moriform +morigerate +morigeration +morigerous +morigerously +morigerousness +morillon +morin +Morinaceae +Morinda +morindin +morindone +morinel +Moringa +Moringaceae +moringaceous +moringad +Moringua +moringuid +Moringuidae +moringuoid +morion +Moriori +Moriscan +Morisco +Morisonian +Morisonianism +morkin +morlop +mormaor +mormaordom +mormaorship +mormo +Mormon +mormon +Mormondom +Mormoness +Mormonism +Mormonist +Mormonite +Mormonweed +Mormoops +mormyr +mormyre +mormyrian +mormyrid +Mormyridae +mormyroid +Mormyrus +morn +morne +morned +morning +morningless +morningly +mornings +morningtide +morningward +mornless +mornlike +morntime +mornward +Moro +moro +moroc +Moroccan +Morocco +morocco +morocota +morological +morologically +morologist +morology +moromancy +moron +moroncy +morong +moronic +Moronidae +moronism +moronity +moronry +Moropus +morosaurian +morosauroid +Morosaurus +morose +morosely +moroseness +morosis +morosity +moroxite +morph +morphallaxis +morphea +Morphean +morpheme +morphemic +morphemics +morphetic +Morpheus +morphew +morphia +morphiate +morphic +morphically +morphinate +morphine +morphinic +morphinism +morphinist +morphinization +morphinize +morphinomania +morphinomaniac +morphiomania +morphiomaniac +Morpho +morphogenesis +morphogenetic +morphogenic +morphogeny +morphographer +morphographic +morphographical +morphographist +morphography +morpholine +morphologic +morphological +morphologically +morphologist +morphology +morphometrical +morphometry +morphon +morphonomic +morphonomy +morphophonemic +morphophonemically +morphophonemics +morphophyly +morphoplasm +morphoplasmic +morphosis +morphotic +morphotropic +morphotropism +morphotropy +morphous +Morrenian +Morrhua +morrhuate +morrhuine +morricer +morris +Morrisean +morrow +morrowing +morrowless +morrowmass +morrowspeech +morrowtide +morsal +Morse +morse +morsel +morselization +morselize +morsing +morsure +mort +mortacious +mortal +mortalism +mortalist +mortality +mortalize +mortally +mortalness +mortalwise +mortar +mortarboard +mortarize +mortarless +mortarlike +mortarware +mortary +mortbell +mortcloth +mortersheen +mortgage +mortgageable +mortgagee +mortgagor +morth +morthwyrtha +mortician +mortier +mortiferous +mortiferously +mortiferousness +mortific +mortification +mortified +mortifiedly +mortifiedness +mortifier +mortify +mortifying +mortifyingly +Mortimer +mortise +mortiser +mortling +mortmain +mortmainer +mortuarian +mortuary +mortuous +morula +morular +morulation +morule +moruloid +Morus +morvin +morwong +Mosaic +mosaic +Mosaical +mosaical +mosaically +mosaicism +mosaicist +Mosaicity +Mosaism +Mosaist +mosaist +mosandrite +mosasaur +Mosasauri +Mosasauria +mosasaurian +mosasaurid +Mosasauridae +mosasauroid +Mosasaurus +Mosatenan +moschate +moschatel +moschatelline +Moschi +Moschidae +moschiferous +Moschinae +moschine +Moschus +Moscow +Mose +Moselle +Moses +mosesite +Mosetena +mosette +mosey +Mosgu +moskeneer +mosker +Moslem +Moslemah +Moslemic +Moslemin +Moslemism +Moslemite +Moslemize +moslings +mosque +mosquelet +mosquish +mosquital +Mosquito +mosquito +mosquitobill +mosquitocidal +mosquitocide +mosquitoey +mosquitoish +mosquitoproof +moss +mossback +mossberry +mossbunker +mossed +mosser +mossery +mossful +mosshead +Mossi +mossiness +mossless +mosslike +mosstrooper +mosstroopery +mosstrooping +mosswort +mossy +mossyback +most +moste +Mosting +mostlike +mostlings +mostly +mostness +Mosul +mot +Motacilla +motacillid +Motacillidae +Motacillinae +motacilline +motatorious +motatory +Motazilite +mote +moted +motel +moteless +moter +motet +motettist +motey +moth +mothed +mother +motherdom +mothered +motherer +mothergate +motherhood +motheriness +mothering +motherkin +motherland +motherless +motherlessness +motherlike +motherliness +motherling +motherly +mothership +mothersome +motherward +motherwise +motherwort +mothery +mothless +mothlike +mothproof +mothworm +mothy +motif +motific +motile +motility +motion +motionable +motional +motionless +motionlessly +motionlessness +motitation +motivate +motivation +motivational +motive +motiveless +motivelessly +motivelessness +motiveness +motivity +motley +motleyness +motmot +motofacient +motograph +motographic +motomagnetic +motoneuron +motophone +motor +motorable +motorboat +motorboatman +motorbus +motorcab +motorcade +motorcar +motorcycle +motorcyclist +motordom +motordrome +motored +motorial +motoric +motoring +motorism +motorist +motorium +motorization +motorize +motorless +motorman +motorneer +motorphobe +motorphobia +motorphobiac +motorway +motory +Motozintlec +Motozintleca +motricity +mott +motte +mottle +mottled +mottledness +mottlement +mottler +mottling +motto +mottoed +mottoless +mottolike +mottramite +motyka +mou +moucharaby +mouchardism +mouche +mouchrabieh +moud +moudie +moudieman +moudy +mouflon +Mougeotia +Mougeotiaceae +mouillation +mouille +mouillure +moujik +moul +mould +moulded +moule +moulin +moulinage +moulinet +moulleen +moulrush +mouls +moulter +mouly +mound +moundiness +moundlet +moundwork +moundy +mount +mountable +mountably +mountain +mountained +mountaineer +mountainet +mountainette +mountainless +mountainlike +mountainous +mountainously +mountainousness +mountainside +mountaintop +mountainward +mountainwards +mountainy +mountant +mountebank +mountebankery +mountebankish +mountebankism +mountebankly +mounted +mounter +Mountie +mounting +mountingly +mountlet +mounture +moup +mourn +mourner +mourneress +mournful +mournfully +mournfulness +mourning +mourningly +mournival +mournsome +mouse +mousebane +mousebird +mousefish +mousehawk +mousehole +mousehound +Mouseion +mousekin +mouselet +mouselike +mouseproof +mouser +mousery +mouseship +mousetail +mousetrap +mouseweb +mousey +mousily +mousiness +mousing +mousingly +mousle +mousmee +Mousoni +mousquetaire +mousse +Mousterian +moustoc +mousy +mout +moutan +mouth +mouthable +mouthbreeder +mouthed +mouther +mouthful +mouthily +mouthiness +mouthing +mouthingly +mouthishly +mouthless +mouthlike +mouthpiece +mouthroot +mouthwash +mouthwise +mouthy +mouton +moutonnee +mouzah +mouzouna +movability +movable +movableness +movably +movant +move +moveability +moveableness +moveably +moveless +movelessly +movelessness +movement +mover +movie +moviedom +movieize +movieland +moving +movingly +movingness +mow +mowable +mowana +mowburn +mowburnt +mowch +mowcht +mower +mowha +mowie +mowing +mowland +mown +mowra +mowrah +mowse +mowstead +mowt +mowth +moxa +moxieberry +Moxo +moy +moyen +moyenless +moyenne +moyite +moyle +moyo +Mozambican +mozambique +Mozarab +Mozarabian +Mozarabic +Mozartean +mozemize +mozing +mozzetta +Mpangwe +Mpondo +mpret +Mr +Mrs +Mru +mu +muang +mubarat +mucago +mucaro +mucedin +mucedinaceous +mucedine +mucedinous +much +muchfold +muchly +muchness +mucic +mucid +mucidness +muciferous +mucific +muciform +mucigen +mucigenous +mucilage +mucilaginous +mucilaginously +mucilaginousness +mucin +mucinogen +mucinoid +mucinous +muciparous +mucivore +mucivorous +muck +muckender +Mucker +mucker +muckerish +muckerism +mucket +muckiness +muckite +muckle +muckluck +muckman +muckment +muckmidden +muckna +muckrake +muckraker +mucksweat +mucksy +muckthrift +muckweed +muckworm +mucky +mucluc +mucocele +mucocellulose +mucocellulosic +mucocutaneous +mucodermal +mucofibrous +mucoflocculent +mucoid +mucomembranous +muconic +mucoprotein +mucopurulent +mucopus +mucor +Mucoraceae +mucoraceous +Mucorales +mucorine +mucorioid +mucormycosis +mucorrhea +mucosa +mucosal +mucosanguineous +mucose +mucoserous +mucosity +mucosocalcareous +mucosogranular +mucosopurulent +mucososaccharine +mucous +mucousness +mucro +mucronate +mucronately +mucronation +mucrones +mucroniferous +mucroniform +mucronulate +mucronulatous +muculent +Mucuna +mucus +mucusin +mud +mudar +mudbank +mudcap +mudd +mudde +mudden +muddify +muddily +muddiness +mudding +muddish +muddle +muddlebrained +muddledom +muddlehead +muddleheaded +muddleheadedness +muddlement +muddleproof +muddler +muddlesome +muddlingly +muddy +muddybrained +muddybreast +muddyheaded +mudee +Mudejar +mudfish +mudflow +mudguard +mudhead +mudhole +mudhopper +mudir +mudiria +mudland +mudlark +mudlarker +mudless +mudproof +mudra +mudsill +mudskipper +mudslinger +mudslinging +mudspate +mudstain +mudstone +mudsucker +mudtrack +mudweed +mudwort +Muehlenbeckia +muermo +muezzin +muff +muffed +muffet +muffetee +muffin +muffineer +muffish +muffishness +muffle +muffled +muffleman +muffler +mufflin +muffy +mufti +mufty +mug +muga +mugearite +mugful +mugg +mugger +mugget +muggily +mugginess +muggins +muggish +muggles +Muggletonian +Muggletonianism +muggy +mughouse +mugience +mugiency +mugient +Mugil +Mugilidae +mugiliform +mugiloid +mugweed +mugwort +mugwump +mugwumpery +mugwumpian +mugwumpism +muhammadi +Muharram +Muhlenbergia +muid +Muilla +muir +muirburn +muircock +muirfowl +muishond +muist +mujtahid +Mukden +mukluk +Mukri +muktar +muktatma +mukti +mulaprakriti +mulatta +mulatto +mulattoism +mulattress +mulberry +mulch +mulcher +Mulciber +Mulcibirian +mulct +mulctable +mulctary +mulctation +mulctative +mulctatory +mulctuary +mulder +mule +muleback +mulefoot +mulefooted +muleman +muleta +muleteer +muletress +muletta +mulewort +muley +mulga +muliebral +muliebria +muliebrile +muliebrity +muliebrous +mulier +mulierine +mulierose +mulierosity +mulish +mulishly +mulishness +mulism +mulita +mulk +mull +mulla +mullah +mullar +mullein +mullenize +muller +Mullerian +mullet +mulletry +mullets +mulley +mullid +Mullidae +mulligan +mulligatawny +mulligrubs +mullion +mullite +mullock +mullocker +mullocky +mulloid +mulloway +mulmul +mulse +mulsify +mult +multangular +multangularly +multangularness +multangulous +multangulum +Multani +multanimous +multarticulate +multeity +multiangular +multiareolate +multiarticular +multiarticulate +multiarticulated +multiaxial +multiblade +multibladed +multibranched +multibranchiate +multibreak +multicamerate +multicapitate +multicapsular +multicarinate +multicarinated +multicellular +multicentral +multicentric +multicharge +multichord +multichrome +multiciliate +multiciliated +multicipital +multicircuit +multicoccous +multicoil +multicolor +multicolored +multicolorous +multicomponent +multiconductor +multiconstant +multicore +multicorneal +multicostate +multicourse +multicrystalline +multicuspid +multicuspidate +multicycle +multicylinder +multicylindered +multidentate +multidenticulate +multidenticulated +multidigitate +multidimensional +multidirectional +multidisperse +multiengine +multiengined +multiexhaust +multifaced +multifaceted +multifactorial +multifamilial +multifarious +multifariously +multifariousness +multiferous +multifetation +multifibered +multifid +multifidly +multifidous +multifidus +multifilament +multifistular +multiflagellate +multiflagellated +multiflash +multiflorous +multiflow +multiflue +multifocal +multifoil +multifoiled +multifold +multifoliate +multifoliolate +multiform +multiformed +multiformity +multifurcate +multiganglionic +multigap +multigranulate +multigranulated +Multigraph +multigraph +multigrapher +multiguttulate +multigyrate +multihead +multihearth +multihued +multijet +multijugate +multijugous +multilaciniate +multilamellar +multilamellate +multilamellous +multilaminar +multilaminate +multilaminated +multilateral +multilaterally +multilighted +multilineal +multilinear +multilingual +multilinguist +multilirate +multiliteral +multilobar +multilobate +multilobe +multilobed +multilobular +multilobulate +multilobulated +multilocation +multilocular +multiloculate +multiloculated +multiloquence +multiloquent +multiloquious +multiloquous +multiloquy +multimacular +multimammate +multimarble +multimascular +multimedial +multimetalic +multimetallism +multimetallist +multimillion +multimillionaire +multimodal +multimodality +multimolecular +multimotor +multimotored +multinational +multinervate +multinervose +multinodal +multinodate +multinodous +multinodular +multinomial +multinominal +multinominous +multinuclear +multinucleate +multinucleated +multinucleolar +multinucleolate +multinucleolated +multiovular +multiovulate +multipara +multiparient +multiparity +multiparous +multipartisan +multipartite +multiped +multiperforate +multiperforated +multipersonal +multiphase +multiphaser +multiphotography +multipinnate +multiplane +multiple +multiplepoinding +multiplet +multiplex +multipliable +multipliableness +multiplicability +multiplicable +multiplicand +multiplicate +multiplication +multiplicational +multiplicative +multiplicatively +multiplicator +multiplicity +multiplier +multiply +multiplying +multipointed +multipolar +multipole +multiported +multipotent +multipresence +multipresent +multiradial +multiradiate +multiradiated +multiradicate +multiradicular +multiramified +multiramose +multiramous +multirate +multireflex +multirooted +multirotation +multirotatory +multisaccate +multisacculate +multisacculated +multiscience +multiseated +multisect +multisector +multisegmental +multisegmentate +multisegmented +multisensual +multiseptate +multiserial +multiserially +multiseriate +multishot +multisiliquous +multisonous +multispeed +multispermous +multispicular +multispiculate +multispindle +multispinous +multispiral +multispired +multistage +multistaminate +multistoried +multistory +multistratified +multistratous +multistriate +multisulcate +multisulcated +multisyllabic +multisyllability +multisyllable +multitarian +multitentaculate +multitheism +multithreaded +multititular +multitoed +multitoned +multitube +Multituberculata +multituberculate +multituberculated +multituberculism +multituberculy +multitubular +multitude +multitudinal +multitudinary +multitudinism +multitudinist +multitudinistic +multitudinosity +multitudinous +multitudinously +multitudinousness +multiturn +multivagant +multivalence +multivalency +multivalent +multivalve +multivalved +multivalvular +multivane +multivariant +multivarious +multiversant +multiverse +multivibrator +multivincular +multivious +multivocal +multivocalness +multivoiced +multivolent +multivoltine +multivolumed +multivorous +multocular +multum +multungulate +multure +multurer +mum +mumble +mumblebee +mumblement +mumbler +mumbling +mumblingly +mummer +mummery +mummichog +mummick +mummied +mummification +mummiform +mummify +mumming +mummy +mummydom +mummyhood +mummylike +mumness +mump +mumper +mumphead +mumpish +mumpishly +mumpishness +mumps +mumpsimus +mumruffin +mun +Munandi +Muncerian +munch +Munchausenism +Munchausenize +muncheel +muncher +munchet +mund +Munda +mundane +mundanely +mundaneness +mundanism +mundanity +Mundari +mundatory +mundic +mundificant +mundification +mundifier +mundify +mundil +mundivagant +mundle +mung +munga +munge +mungey +mungo +mungofa +munguba +mungy +Munia +Munich +Munichism +municipal +municipalism +municipalist +municipality +municipalization +municipalize +municipalizer +municipally +municipium +munific +munificence +munificency +munificent +munificently +munificentness +muniment +munition +munitionary +munitioneer +munitioner +munitions +munity +munj +munjeet +munjistin +munnion +Munnopsidae +Munnopsis +Munsee +munshi +munt +Muntiacus +muntin +Muntingia +muntjac +Munychia +Munychian +Munychion +Muong +Muphrid +Mura +mura +Muradiyah +Muraena +Muraenidae +muraenoid +murage +mural +muraled +muralist +murally +Muran +Muranese +murasakite +Muratorian +murchy +murder +murderer +murderess +murdering +murderingly +murderish +murderment +murderous +murderously +murderousness +murdrum +mure +murenger +murex +murexan +murexide +murga +murgavi +murgeon +muriate +muriated +muriatic +muricate +muricid +Muricidae +muriciform +muricine +muricoid +muriculate +murid +Muridae +muridism +Muriel +muriform +muriformly +Murillo +Murinae +murine +murinus +muriti +murium +murk +murkily +murkiness +murkish +murkly +murkness +murksome +murky +murlin +murly +Murmi +murmur +murmuration +murmurator +murmurer +murmuring +murmuringly +murmurish +murmurless +murmurlessly +murmurous +murmurously +muromontite +murphy +murra +murrain +Murraya +murre +murrelet +murrey +murrhine +murrina +murrnong +murshid +murumuru +Murut +muruxi +murva +murza +Murzim +Mus +Musa +Musaceae +musaceous +Musaeus +musal +Musales +Musalmani +musang +musar +Musca +muscade +muscadel +muscadine +Muscadinia +muscardine +Muscardinidae +Muscardinus +Muscari +muscariform +muscarine +muscat +muscatel +muscatorium +Musci +Muscicapa +Muscicapidae +muscicapine +muscicide +muscicole +muscicoline +muscicolous +muscid +Muscidae +musciform +Muscinae +muscle +muscled +muscleless +musclelike +muscling +muscly +Muscogee +muscoid +Muscoidea +muscologic +muscological +muscologist +muscology +muscone +muscose +muscoseness +muscosity +muscot +muscovadite +muscovado +Muscovi +Muscovite +muscovite +Muscovitic +muscovitization +muscovitize +muscovy +muscular +muscularity +muscularize +muscularly +musculation +musculature +muscule +musculin +musculoarterial +musculocellular +musculocutaneous +musculodermic +musculoelastic +musculofibrous +musculointestinal +musculoligamentous +musculomembranous +musculopallial +musculophrenic +musculospinal +musculospiral +musculotegumentary +musculotendinous +Muse +muse +mused +museful +musefully +museist +museless +muselike +museographist +museography +museologist +museology +muser +musery +musette +museum +museumize +Musgu +mush +musha +mushaa +Mushabbihite +mushed +musher +mushhead +mushheaded +mushheadedness +mushily +mushiness +mushla +mushmelon +mushrebiyeh +mushroom +mushroomer +mushroomic +mushroomlike +mushroomy +mushru +mushy +music +musical +musicale +musicality +musicalization +musicalize +musically +musicalness +musicate +musician +musiciana +musicianer +musicianly +musicianship +musicker +musicless +musiclike +musicmonger +musico +musicoartistic +musicodramatic +musicofanatic +musicographer +musicography +musicological +musicologist +musicologue +musicology +musicomania +musicomechanical +musicophilosophical +musicophobia +musicophysical +musicopoetic +musicotherapy +musicproof +musie +musily +musimon +musing +musingly +musk +muskat +muskeg +muskeggy +muskellunge +musket +musketade +musketeer +musketlike +musketoon +musketproof +musketry +muskflower +Muskhogean +muskie +muskiness +muskish +musklike +muskmelon +Muskogee +muskrat +muskroot +Muskwaki +muskwood +musky +muslin +muslined +muslinet +musnud +Musophaga +Musophagi +Musophagidae +musophagine +musquash +musquashroot +musquashweed +musquaspen +musquaw +musrol +muss +mussable +mussably +Mussaenda +mussal +mussalchee +mussel +musseled +musseler +mussily +mussiness +mussitate +mussitation +mussuk +Mussulman +Mussulmanic +Mussulmanish +Mussulmanism +Mussulwoman +mussurana +mussy +must +mustache +mustached +mustachial +mustachio +mustachioed +mustafina +Mustahfiz +mustang +mustanger +mustard +mustarder +mustee +Mustela +mustelid +Mustelidae +musteline +mustelinous +musteloid +Mustelus +muster +musterable +musterdevillers +musterer +mustermaster +mustify +mustily +mustiness +mustnt +musty +muta +Mutabilia +mutability +mutable +mutableness +mutably +mutafacient +mutage +mutagenic +mutant +mutarotate +mutarotation +mutase +mutate +mutation +mutational +mutationally +mutationism +mutationist +mutative +mutatory +mutawalli +Mutazala +mutch +mute +mutedly +mutely +muteness +Muter +mutesarif +mutescence +mutessarifat +muth +muthmannite +muthmassel +mutic +muticous +mutilate +mutilation +mutilative +mutilator +mutilatory +Mutilla +mutillid +Mutillidae +mutilous +mutineer +mutinous +mutinously +mutinousness +mutiny +Mutisia +Mutisiaceae +mutism +mutist +mutistic +mutive +mutivity +mutoscope +mutoscopic +mutsje +mutsuddy +mutt +mutter +mutterer +muttering +mutteringly +mutton +muttonbird +muttonchop +muttonfish +muttonhead +muttonheaded +muttonhood +muttonmonger +muttonwood +muttony +mutual +mutualism +mutualist +mutualistic +mutuality +mutualization +mutualize +mutually +mutualness +mutuary +mutuatitious +mutulary +mutule +mutuum +mux +Muysca +muyusa +muzhik +Muzo +muzz +muzzily +muzziness +muzzle +muzzler +muzzlewood +muzzy +my +Mya +Myacea +myal +myalgia +myalgic +myalism +myall +Myaria +myarian +myasthenia +myasthenic +myatonia +myatonic +myatony +myatrophy +mycele +mycelia +mycelial +mycelian +mycelioid +mycelium +myceloid +Mycenaean +Mycetes +mycetism +mycetocyte +mycetogenesis +mycetogenetic +mycetogenic +mycetogenous +mycetoid +mycetological +mycetology +mycetoma +mycetomatous +Mycetophagidae +mycetophagous +mycetophilid +Mycetophilidae +mycetous +Mycetozoa +mycetozoan +mycetozoon +Mycobacteria +Mycobacteriaceae +Mycobacterium +mycocecidium +mycocyte +mycoderm +mycoderma +mycodermatoid +mycodermatous +mycodermic +mycodermitis +mycodesmoid +mycodomatium +mycogastritis +Mycogone +mycohaemia +mycohemia +mycoid +mycologic +mycological +mycologically +mycologist +mycologize +mycology +mycomycete +Mycomycetes +mycomycetous +mycomyringitis +mycophagist +mycophagous +mycophagy +mycophyte +Mycoplana +mycoplasm +mycoplasmic +mycoprotein +mycorhiza +mycorhizal +mycorrhizal +mycose +mycosin +mycosis +mycosozin +Mycosphaerella +Mycosphaerellaceae +mycosterol +mycosymbiosis +mycotic +mycotrophic +Mycteria +mycteric +mycterism +Myctodera +myctophid +Myctophidae +Myctophum +Mydaidae +mydaleine +mydatoxine +Mydaus +mydine +mydriasine +mydriasis +mydriatic +mydriatine +myectomize +myectomy +myectopia +myectopy +myelalgia +myelapoplexy +myelasthenia +myelatrophy +myelauxe +myelemia +myelencephalic +myelencephalon +myelencephalous +myelic +myelin +myelinate +myelinated +myelination +myelinic +myelinization +myelinogenesis +myelinogenetic +myelinogeny +myelitic +myelitis +myeloblast +myeloblastic +myelobrachium +myelocele +myelocerebellar +myelocoele +myelocyst +myelocystic +myelocystocele +myelocyte +myelocythaemia +myelocythemia +myelocytic +myelocytosis +myelodiastasis +myeloencephalitis +myeloganglitis +myelogenesis +myelogenetic +myelogenous +myelogonium +myeloic +myeloid +myelolymphangioma +myelolymphocyte +myeloma +myelomalacia +myelomatoid +myelomatosis +myelomenia +myelomeningitis +myelomeningocele +myelomere +myelon +myelonal +myeloneuritis +myelonic +myeloparalysis +myelopathic +myelopathy +myelopetal +myelophthisis +myeloplast +myeloplastic +myeloplax +myeloplegia +myelopoiesis +myelopoietic +myelorrhagia +myelorrhaphy +myelosarcoma +myelosclerosis +myelospasm +myelospongium +myelosyphilis +myelosyphilosis +myelosyringosis +myelotherapy +Myelozoa +myelozoan +myentasis +myenteric +myenteron +myesthesia +mygale +mygalid +mygaloid +Myiarchus +myiasis +myiferous +myiodesopsia +myiosis +myitis +mykiss +myliobatid +Myliobatidae +myliobatine +myliobatoid +Mylodon +mylodont +Mylodontidae +mylohyoid +mylohyoidean +mylonite +mylonitic +Mymar +mymarid +Mymaridae +myna +Mynheer +mynpacht +mynpachtbrief +myoalbumin +myoalbumose +myoatrophy +myoblast +myoblastic +myocardiac +myocardial +myocardiogram +myocardiograph +myocarditic +myocarditis +myocardium +myocele +myocellulitis +myoclonic +myoclonus +myocoele +myocoelom +myocolpitis +myocomma +myocyte +myodegeneration +Myodes +myodiastasis +myodynamia +myodynamic +myodynamics +myodynamiometer +myodynamometer +myoedema +myoelectric +myoendocarditis +myoepicardial +myoepithelial +myofibril +myofibroma +myogen +myogenesis +myogenetic +myogenic +myogenous +myoglobin +myoglobulin +myogram +myograph +myographer +myographic +myographical +myographist +myography +myohematin +myoid +myoidema +myokinesis +myolemma +myolipoma +myoliposis +myologic +myological +myologist +myology +myolysis +myoma +myomalacia +myomancy +myomantic +myomatous +myomectomy +myomelanosis +myomere +myometritis +myometrium +myomohysterectomy +myomorph +Myomorpha +myomorphic +myomotomy +myoneme +myoneural +myoneuralgia +myoneurasthenia +myoneure +myoneuroma +myoneurosis +myonosus +myopachynsis +myoparalysis +myoparesis +myopathia +myopathic +myopathy +myope +myoperitonitis +myophan +myophore +myophorous +myophysical +myophysics +myopia +myopic +myopical +myopically +myoplasm +myoplastic +myoplasty +myopolar +Myoporaceae +myoporaceous +myoporad +Myoporum +myoproteid +myoprotein +myoproteose +myops +myopy +myorrhaphy +myorrhexis +myosalpingitis +myosarcoma +myosarcomatous +myosclerosis +myoscope +myoseptum +myosin +myosinogen +myosinose +myosis +myositic +myositis +myosote +Myosotis +myospasm +myospasmia +Myosurus +myosuture +myosynizesis +myotacismus +Myotalpa +Myotalpinae +myotasis +myotenotomy +myothermic +myotic +myotome +myotomic +myotomy +myotonia +myotonic +myotonus +myotony +myotrophy +myowun +Myoxidae +myoxine +Myoxus +Myra +myrabalanus +myrabolam +myrcene +Myrcia +myrcia +myriacanthous +myriacoulomb +myriad +myriaded +myriadfold +myriadly +myriadth +myriagram +myriagramme +myrialiter +myrialitre +myriameter +myriametre +Myrianida +myriapod +Myriapoda +myriapodan +myriapodous +myriarch +myriarchy +myriare +Myrica +myrica +Myricaceae +myricaceous +Myricales +myricetin +myricin +myricyl +myricylic +Myrientomata +myringa +myringectomy +myringitis +myringodectomy +myringodermatitis +myringomycosis +myringoplasty +myringotome +myringotomy +myriological +myriologist +myriologue +myriophyllite +myriophyllous +Myriophyllum +Myriopoda +myriopodous +myriorama +myrioscope +myriosporous +myriotheism +Myriotrichia +Myriotrichiaceae +myriotrichiaceous +myristate +myristic +Myristica +myristica +Myristicaceae +myristicaceous +Myristicivora +myristicivorous +myristin +myristone +Myrmecia +Myrmecobiinae +myrmecobine +Myrmecobius +myrmecochorous +myrmecochory +myrmecoid +myrmecoidy +myrmecological +myrmecologist +myrmecology +Myrmecophaga +Myrmecophagidae +myrmecophagine +myrmecophagoid +myrmecophagous +myrmecophile +myrmecophilism +myrmecophilous +myrmecophily +myrmecophobic +myrmecophyte +myrmecophytic +myrmekite +Myrmeleon +Myrmeleonidae +Myrmeleontidae +Myrmica +myrmicid +Myrmicidae +myrmicine +myrmicoid +Myrmidon +Myrmidonian +myrmotherine +myrobalan +myron +myronate +myronic +myrosin +myrosinase +Myrothamnaceae +myrothamnaceous +Myrothamnus +Myroxylon +myrrh +myrrhed +myrrhic +myrrhine +Myrrhis +myrrhol +myrrhophore +myrrhy +Myrsinaceae +myrsinaceous +myrsinad +Myrsiphyllum +Myrtaceae +myrtaceous +myrtal +Myrtales +myrtiform +Myrtilus +myrtle +myrtleberry +myrtlelike +myrtol +Myrtus +mysel +myself +mysell +Mysian +mysid +Mysidacea +Mysidae +mysidean +Mysis +mysogynism +mysoid +mysophobia +mysosophist +mysost +myst +mystacial +Mystacocete +Mystacoceti +mystagogic +mystagogical +mystagogically +mystagogue +mystagogy +mystax +mysterial +mysteriarch +mysteriosophic +mysteriosophy +mysterious +mysteriously +mysteriousness +mysterize +mystery +mystes +mystic +mystical +mysticality +mystically +mysticalness +Mysticete +mysticete +Mysticeti +mysticetous +mysticism +mysticity +mysticize +mysticly +mystific +mystifically +mystification +mystificator +mystificatory +mystifiedly +mystifier +mystify +mystifyingly +mytacism +myth +mythical +mythicalism +mythicality +mythically +mythicalness +mythicism +mythicist +mythicize +mythicizer +mythification +mythify +mythism +mythist +mythize +mythland +mythmaker +mythmaking +mythoclast +mythoclastic +mythogenesis +mythogonic +mythogony +mythographer +mythographist +mythography +mythogreen +mythoheroic +mythohistoric +mythologema +mythologer +mythological +mythologically +mythologist +mythologize +mythologizer +mythologue +mythology +mythomania +mythomaniac +mythometer +mythonomy +mythopastoral +mythopoeic +mythopoeism +mythopoeist +mythopoem +mythopoesis +mythopoesy +mythopoet +mythopoetic +mythopoetize +mythopoetry +mythos +mythus +Mytilacea +mytilacean +mytilaceous +Mytiliaspis +mytilid +Mytilidae +mytiliform +mytiloid +mytilotoxine +Mytilus +myxa +myxadenitis +myxadenoma +myxaemia +myxamoeba +myxangitis +myxasthenia +myxedema +myxedematoid +myxedematous +myxedemic +myxemia +Myxine +Myxinidae +myxinoid +Myxinoidei +myxo +Myxobacteria +Myxobacteriaceae +myxobacteriaceous +Myxobacteriales +myxoblastoma +myxochondroma +myxochondrosarcoma +Myxococcus +myxocystoma +myxocyte +myxoenchondroma +myxofibroma +myxofibrosarcoma +myxoflagellate +myxogaster +Myxogasteres +Myxogastrales +Myxogastres +myxogastric +myxogastrous +myxoglioma +myxoid +myxoinoma +myxolipoma +myxoma +myxomatosis +myxomatous +Myxomycetales +myxomycete +Myxomycetes +myxomycetous +myxomyoma +myxoneuroma +myxopapilloma +Myxophyceae +myxophycean +Myxophyta +myxopod +Myxopoda +myxopodan +myxopodium +myxopodous +myxopoiesis +myxorrhea +myxosarcoma +Myxospongiae +myxospongian +Myxospongida +myxospore +Myxosporidia +myxosporidian +Myxosporidiida +Myxosporium +myxosporous +Myxothallophyta +myxotheca +Myzodendraceae +myzodendraceous +Myzodendron +Myzomyia +myzont +Myzontes +Myzostoma +Myzostomata +myzostomatous +myzostome +myzostomid +Myzostomida +Myzostomidae +myzostomidan +myzostomous +N +n +na +naa +naam +Naaman +Naassenes +nab +nabak +Nabal +Nabalism +Nabalite +Nabalitic +Nabaloi +Nabalus +Nabataean +Nabatean +Nabathaean +Nabathean +Nabathite +nabber +Nabby +nabk +nabla +nable +nabob +nabobery +nabobess +nabobical +nabobish +nabobishly +nabobism +nabobry +nabobship +Nabothian +nabs +Nabu +nacarat +nacarine +nace +nacelle +nach +nachani +Nachitoch +Nachitoches +Nachschlag +Nacionalista +nacket +nacre +nacred +nacreous +nacrine +nacrite +nacrous +nacry +nadder +nadir +nadiral +nadorite +nae +naebody +naegate +naegates +nael +Naemorhedinae +naemorhedine +Naemorhedus +naether +naething +nag +Naga +naga +nagaika +nagana +nagara +Nagari +nagatelite +nagger +naggin +nagging +naggingly +naggingness +naggish +naggle +naggly +naggy +naght +nagkassar +nagmaal +nagman +nagnag +nagnail +nagor +nagsman +nagster +nagual +nagualism +nagualist +nagyagite +Nahanarvali +Nahane +Nahani +Naharvali +Nahor +Nahua +Nahuan +Nahuatl +Nahuatlac +Nahuatlan +Nahuatleca +Nahuatlecan +Nahum +naiad +Naiadaceae +naiadaceous +Naiadales +Naiades +naiant +Naias +naid +naif +naifly +naig +naigie +naik +nail +nailbin +nailbrush +nailer +naileress +nailery +nailhead +nailing +nailless +naillike +nailprint +nailproof +nailrod +nailshop +nailsick +nailsmith +nailwort +naily +nain +nainsel +nainsook +naio +naipkin +Nair +nairy +nais +naish +naissance +naissant +naither +naive +naively +naiveness +naivete +naivety +Naja +nak +nake +naked +nakedish +nakedize +nakedly +nakedness +nakedweed +nakedwood +naker +nakhlite +nakhod +nakhoda +Nakir +nako +Nakomgilisala +nakong +nakoo +Nakula +Nalita +nallah +nam +Nama +namability +namable +Namaqua +namaqua +Namaquan +namaycush +namaz +namazlik +Nambe +namda +name +nameability +nameable +nameboard +nameless +namelessly +namelessness +nameling +namely +namer +namesake +naming +nammad +Nan +nan +Nana +nana +Nanaimo +nanawood +Nance +Nancy +nancy +Nandi +nandi +Nandina +nandine +nandow +nandu +nane +nanes +nanga +nanism +nanization +nankeen +Nankin +nankin +Nanking +Nankingese +nannander +nannandrium +nannandrous +Nannette +nannoplankton +Nanny +nanny +nannyberry +nannybush +nanocephalia +nanocephalic +nanocephalism +nanocephalous +nanocephalus +nanocephaly +nanoid +nanomelia +nanomelous +nanomelus +nanosoma +nanosomia +nanosomus +nanpie +nant +Nanticoke +nantle +nantokite +Nantz +naological +naology +naometry +Naomi +Naos +naos +Naosaurus +nap +napa +Napaea +Napaean +napal +napalm +nape +napead +napecrest +napellus +naperer +napery +naphtha +naphthacene +naphthalate +naphthalene +naphthaleneacetic +naphthalenesulphonic +naphthalenic +naphthalenoid +naphthalic +naphthalidine +naphthalin +naphthaline +naphthalization +naphthalize +naphthalol +naphthamine +naphthanthracene +naphthene +naphthenic +naphthinduline +naphthionate +naphtho +naphthoic +naphthol +naphtholate +naphtholize +naphtholsulphonate +naphtholsulphonic +naphthoquinone +naphthoresorcinol +naphthosalol +naphthous +naphthoxide +naphthyl +naphthylamine +naphthylaminesulphonic +naphthylene +naphthylic +naphtol +Napierian +napiform +napkin +napkining +napless +naplessness +Napoleon +napoleon +Napoleonana +Napoleonic +Napoleonically +Napoleonism +Napoleonist +Napoleonistic +napoleonite +Napoleonize +napoo +nappe +napped +napper +nappiness +napping +nappishness +nappy +naprapath +naprapathy +napron +napthionic +napu +nar +Narcaciontes +Narcaciontidae +narceine +narcism +Narciss +Narcissan +narcissi +Narcissine +narcissism +narcissist +narcissistic +Narcissus +narcist +narcistic +narcoanalysis +narcoanesthesia +Narcobatidae +Narcobatoidea +Narcobatus +narcohypnia +narcohypnosis +narcolepsy +narcoleptic +narcoma +narcomania +narcomaniac +narcomaniacal +narcomatous +Narcomedusae +narcomedusan +narcose +narcosis +narcostimulant +narcosynthesis +narcotherapy +narcotia +narcotic +narcotical +narcotically +narcoticalness +narcoticism +narcoticness +narcotina +narcotine +narcotinic +narcotism +narcotist +narcotization +narcotize +narcous +nard +nardine +nardoo +Nardus +nares +narghile +nargil +narial +naric +narica +naricorn +nariform +narine +naringenin +naringin +nark +narky +narr +narra +Narraganset +narras +narratable +narrate +narrater +narration +narrational +narrative +narratively +narrator +narratory +narratress +narratrix +narrawood +narrow +narrower +narrowhearted +narrowheartedness +narrowingness +narrowish +narrowly +narrowness +narrowy +narsarsukite +narsinga +narthecal +Narthecium +narthex +narwhal +narwhalian +nary +nasab +nasal +Nasalis +nasalis +nasalism +nasality +nasalization +nasalize +nasally +nasalward +nasalwards +nasard +Nascan +Nascapi +nascence +nascency +nascent +nasch +naseberry +nasethmoid +nash +nashgab +nashgob +Nashim +Nashira +Nashua +nasi +nasial +nasicorn +Nasicornia +nasicornous +Nasiei +nasiform +nasilabial +nasillate +nasillation +nasioalveolar +nasiobregmatic +nasioinial +nasiomental +nasion +nasitis +Naskhi +nasoalveola +nasoantral +nasobasilar +nasobronchial +nasobuccal +nasoccipital +nasociliary +nasoethmoidal +nasofrontal +nasolabial +nasolachrymal +nasological +nasologist +nasology +nasomalar +nasomaxillary +nasonite +nasoorbital +nasopalatal +nasopalatine +nasopharyngeal +nasopharyngitis +nasopharynx +nasoprognathic +nasoprognathism +nasorostral +nasoscope +nasoseptal +nasosinuitis +nasosinusitis +nasosubnasal +nasoturbinal +nasrol +Nassa +Nassau +Nassellaria +nassellarian +Nassidae +nassology +nast +nastaliq +nastic +nastika +nastily +nastiness +nasturtion +nasturtium +nasty +Nasua +nasus +nasute +nasuteness +nasutiform +nasutus +nat +natability +nataka +Natal +natal +Natalia +Natalian +Natalie +natality +nataloin +natals +natant +natantly +Nataraja +natation +natational +natator +natatorial +natatorious +natatorium +natatory +natch +natchbone +Natchez +Natchezan +Natchitoches +natchnee +nates +Nathan +Nathanael +Nathaniel +nathe +nather +nathless +Natica +Naticidae +naticiform +naticine +Natick +naticoid +natiform +natimortality +nation +national +nationalism +nationalist +nationalistic +nationalistically +nationality +nationalization +nationalize +nationalizer +nationally +nationalness +nationalty +nationhood +nationless +nationwide +native +natively +nativeness +nativism +nativist +nativistic +nativity +natr +Natricinae +natricine +natrium +Natrix +natrochalcite +natrojarosite +natrolite +natron +Natt +natter +nattered +natteredness +natterjack +nattily +nattiness +nattle +natty +natuary +natural +naturalesque +naturalism +naturalist +naturalistic +naturalistically +naturality +naturalization +naturalize +naturalizer +naturally +naturalness +nature +naturecraft +naturelike +naturing +naturism +naturist +naturistic +naturistically +naturize +naturopath +naturopathic +naturopathist +naturopathy +naucrar +naucrary +naufragous +nauger +naught +naughtily +naughtiness +naughty +naujaite +naumachia +naumachy +naumannite +Naumburgia +naumk +naumkeag +naumkeager +naunt +nauntle +naupathia +nauplial +naupliiform +nauplioid +nauplius +nauropometer +nauscopy +nausea +nauseant +nauseaproof +nauseate +nauseatingly +nauseation +nauseous +nauseously +nauseousness +Nauset +naut +nautch +nauther +nautic +nautical +nauticality +nautically +nautics +nautiform +Nautilacea +nautilacean +nautilicone +nautiliform +nautilite +nautiloid +Nautiloidea +nautiloidean +nautilus +Navaho +Navajo +naval +navalese +navalism +navalist +navalistic +navalistically +navally +navar +navarch +navarchy +Navarrese +Navarrian +nave +navel +naveled +navellike +navelwort +navet +navette +navew +navicella +navicert +navicula +Naviculaceae +naviculaeform +navicular +naviculare +naviculoid +naviform +navigability +navigable +navigableness +navigably +navigant +navigate +navigation +navigational +navigator +navigerous +navipendular +navipendulum +navite +navvy +navy +naw +nawab +nawabship +nawt +nay +Nayar +Nayarit +Nayarita +nayaur +naysay +naysayer +nayward +nayword +Nazarate +Nazarean +Nazarene +Nazarenism +Nazarite +Nazariteship +Nazaritic +Nazaritish +Nazaritism +naze +Nazerini +Nazi +Nazify +Naziism +nazim +nazir +Nazirate +Nazirite +Naziritic +Nazism +ne +nea +Neal +neal +neallotype +Neanderthal +Neanderthaler +Neanderthaloid +neanic +neanthropic +neap +neaped +Neapolitan +nearable +nearabout +nearabouts +nearaivays +nearaway +nearby +Nearctic +Nearctica +nearest +nearish +nearly +nearmost +nearness +nearsighted +nearsightedly +nearsightedness +nearthrosis +neat +neaten +neath +neatherd +neatherdess +neathmost +neatify +neatly +neatness +neb +neback +Nebaioth +Nebalia +Nebaliacea +nebalian +Nebaliidae +nebalioid +nebbed +nebbuck +nebbuk +nebby +nebel +nebelist +nebenkern +Nebiim +Nebraskan +nebris +nebula +nebulae +nebular +nebularization +nebularize +nebulated +nebulation +nebule +nebulescent +nebuliferous +nebulite +nebulium +nebulization +nebulize +nebulizer +nebulose +nebulosity +nebulous +nebulously +nebulousness +Necator +necessar +necessarian +necessarianism +necessarily +necessariness +necessary +necessism +necessist +necessitarian +necessitarianism +necessitate +necessitatedly +necessitatingly +necessitation +necessitative +necessitous +necessitously +necessitousness +necessitude +necessity +neck +neckar +neckatee +neckband +neckcloth +necked +necker +neckercher +neckerchief +neckful +neckguard +necking +neckinger +necklace +necklaced +necklaceweed +neckless +necklet +necklike +neckline +neckmold +neckpiece +neckstock +necktie +necktieless +neckward +neckwear +neckweed +neckyoke +necrectomy +necremia +necrobacillary +necrobacillosis +necrobiosis +necrobiotic +necrogenic +necrogenous +necrographer +necrolatry +necrologic +necrological +necrologically +necrologist +necrologue +necrology +necromancer +necromancing +necromancy +necromantic +necromantically +necromorphous +necronite +necropathy +Necrophaga +necrophagan +necrophagous +necrophile +necrophilia +necrophilic +necrophilism +necrophilistic +necrophilous +necrophily +necrophobia +necrophobic +Necrophorus +necropoleis +necropoles +necropolis +necropolitan +necropsy +necroscopic +necroscopical +necroscopy +necrose +necrosis +necrotic +necrotization +necrotize +necrotomic +necrotomist +necrotomy +necrotype +necrotypic +Nectandra +nectar +nectareal +nectarean +nectared +nectareous +nectareously +nectareousness +nectarial +nectarian +nectaried +nectariferous +nectarine +Nectarinia +Nectariniidae +nectarious +nectarium +nectarivorous +nectarize +nectarlike +nectarous +nectary +nectiferous +nectocalycine +nectocalyx +Nectonema +nectophore +nectopod +Nectria +nectriaceous +Nectrioidaceae +Necturidae +Necturus +Ned +nedder +neddy +Nederlands +nee +neebor +neebour +need +needer +needfire +needful +needfully +needfulness +needgates +needham +needily +neediness +needing +needle +needlebill +needlebook +needlebush +needlecase +needled +needlefish +needleful +needlelike +needlemaker +needlemaking +needleman +needlemonger +needleproof +needler +needles +needless +needlessly +needlessness +needlestone +needlewoman +needlewood +needlework +needleworked +needleworker +needling +needly +needments +needs +needsome +needy +neeger +neeld +neele +neelghan +neem +neencephalic +neencephalon +Neengatu +neep +neepour +neer +neese +neet +neetup +neeze +nef +nefandous +nefandousness +nefarious +nefariously +nefariousness +nefast +neffy +neftgil +negate +negatedness +negation +negationalist +negationist +negative +negatively +negativeness +negativer +negativism +negativist +negativistic +negativity +negator +negatory +negatron +neger +neginoth +neglect +neglectable +neglectedly +neglectedness +neglecter +neglectful +neglectfully +neglectfulness +neglectingly +neglection +neglective +neglectively +neglector +neglectproof +negligee +negligence +negligency +negligent +negligently +negligibility +negligible +negligibleness +negligibly +negotiability +negotiable +negotiant +negotiate +negotiation +negotiator +negotiatory +negotiatress +negotiatrix +Negress +negrillo +negrine +Negritian +Negritic +Negritize +Negrito +Negritoid +Negro +negro +negrodom +Negrofy +negrohead +negrohood +Negroid +Negroidal +negroish +Negroism +Negroization +Negroize +negrolike +Negroloid +Negrophil +Negrophile +Negrophilism +Negrophilist +Negrophobe +Negrophobia +Negrophobiac +Negrophobist +Negrotic +Negundo +Negus +negus +Nehantic +Nehemiah +nehiloth +nei +neif +neigh +neighbor +neighbored +neighborer +neighboress +neighborhood +neighboring +neighborless +neighborlike +neighborliness +neighborly +neighborship +neighborstained +neighbourless +neighbourlike +neighbourship +neigher +Neil +Neillia +neiper +Neisseria +Neisserieae +neist +neither +Nejd +Nejdi +Nekkar +nekton +nektonic +Nell +Nellie +Nelly +nelson +nelsonite +nelumbian +Nelumbium +Nelumbo +Nelumbonaceae +nema +nemaline +Nemalion +Nemalionaceae +Nemalionales +nemalite +Nemastomaceae +Nematelmia +nematelminth +Nematelminthes +nemathece +nemathecial +nemathecium +Nemathelmia +nemathelminth +Nemathelminthes +nematic +nematoblast +nematoblastic +Nematocera +nematoceran +nematocerous +nematocide +nematocyst +nematocystic +Nematoda +nematode +nematodiasis +nematogene +nematogenic +nematogenous +nematognath +Nematognathi +nematognathous +nematogone +nematogonous +nematoid +Nematoidea +nematoidean +nematologist +nematology +Nematomorpha +nematophyton +Nematospora +nematozooid +Nembutal +Nemean +Nemertea +nemertean +Nemertina +nemertine +Nemertinea +nemertinean +Nemertini +nemertoid +nemeses +Nemesia +nemesic +Nemesis +Nemichthyidae +Nemichthys +Nemocera +nemoceran +nemocerous +Nemopanthus +Nemophila +nemophilist +nemophilous +nemophily +nemoral +Nemorensian +nemoricole +Nengahiba +nenta +nenuphar +neo +neoacademic +neoanthropic +Neoarctic +neoarsphenamine +Neobalaena +Neobeckia +neoblastic +neobotanist +neobotany +Neocene +Neoceratodus +neocerotic +neoclassic +neoclassicism +neoclassicist +Neocomian +neocosmic +neocracy +neocriticism +neocyanine +neocyte +neocytosis +neodamode +neodidymium +neodymium +Neofabraea +neofetal +neofetus +Neofiber +neoformation +neoformative +Neogaea +Neogaean +neogamous +neogamy +Neogene +neogenesis +neogenetic +Neognathae +neognathic +neognathous +neogrammarian +neogrammatical +neographic +neohexane +Neohipparion +neoholmia +neoholmium +neoimpressionism +neoimpressionist +neolalia +neolater +neolatry +neolith +neolithic +neologian +neologianism +neologic +neological +neologically +neologism +neologist +neologistic +neologistical +neologization +neologize +neology +neomedievalism +neomenia +neomenian +Neomeniidae +neomiracle +neomodal +neomorph +Neomorpha +neomorphic +neomorphism +Neomylodon +neon +neonatal +neonate +neonatus +neonomian +neonomianism +neontology +neonychium +neopagan +neopaganism +neopaganize +Neopaleozoic +neopallial +neopallium +neoparaffin +neophilism +neophilological +neophilologist +neophobia +neophobic +neophrastic +Neophron +neophyte +neophytic +neophytish +neophytism +Neopieris +neoplasia +neoplasm +neoplasma +neoplasmata +neoplastic +neoplasticism +neoplasty +Neoplatonic +Neoplatonician +Neoplatonism +Neoplatonist +neoprene +neorama +neorealism +Neornithes +neornithic +Neosalvarsan +Neosorex +Neosporidia +neossin +neossology +neossoptile +neostriatum +neostyle +neoteinia +neoteinic +neotenia +neotenic +neoteny +neoteric +neoterically +neoterism +neoterist +neoteristic +neoterize +neothalamus +Neotoma +Neotragus +Neotremata +Neotropic +Neotropical +neotype +neovitalism +neovolcanic +Neowashingtonia +neoytterbium +neoza +Neozoic +Nep +nep +Nepa +Nepal +Nepalese +Nepali +Nepenthaceae +nepenthaceous +nepenthe +nepenthean +Nepenthes +nepenthes +neper +Neperian +Nepeta +nephalism +nephalist +Nephele +nephele +nepheligenous +nepheline +nephelinic +nephelinite +nephelinitic +nephelinitoid +nephelite +Nephelium +nephelognosy +nepheloid +nephelometer +nephelometric +nephelometrical +nephelometrically +nephelometry +nephelorometer +nepheloscope +nephesh +nephew +nephewship +Nephila +Nephilinae +Nephite +nephogram +nephograph +nephological +nephologist +nephology +nephoscope +nephradenoma +nephralgia +nephralgic +nephrapostasis +nephratonia +nephrauxe +nephrectasia +nephrectasis +nephrectomize +nephrectomy +nephrelcosis +nephremia +nephremphraxis +nephria +nephric +nephridia +nephridial +nephridiopore +nephridium +nephrism +nephrite +nephritic +nephritical +nephritis +nephroabdominal +nephrocardiac +nephrocele +nephrocoele +nephrocolic +nephrocolopexy +nephrocoloptosis +nephrocystitis +nephrocystosis +nephrocyte +nephrodinic +Nephrodium +nephroerysipelas +nephrogastric +nephrogenetic +nephrogenic +nephrogenous +nephrogonaduct +nephrohydrosis +nephrohypertrophy +nephroid +Nephrolepis +nephrolith +nephrolithic +nephrolithotomy +nephrologist +nephrology +nephrolysin +nephrolysis +nephrolytic +nephromalacia +nephromegaly +nephromere +nephron +nephroncus +nephroparalysis +nephropathic +nephropathy +nephropexy +nephrophthisis +nephropore +Nephrops +Nephropsidae +nephroptosia +nephroptosis +nephropyelitis +nephropyeloplasty +nephropyosis +nephrorrhagia +nephrorrhaphy +nephros +nephrosclerosis +nephrosis +nephrostoma +nephrostome +nephrostomial +nephrostomous +nephrostomy +nephrotome +nephrotomize +nephrotomy +nephrotoxic +nephrotoxicity +nephrotoxin +nephrotuberculosis +nephrotyphoid +nephrotyphus +nephrozymosis +Nepidae +nepionic +nepman +nepotal +nepote +nepotic +nepotious +nepotism +nepotist +nepotistical +nepouite +Neptune +Neptunean +Neptunian +neptunism +neptunist +neptunium +Nereid +Nereidae +nereidiform +Nereidiformia +Nereis +nereite +Nereocystis +Neri +Nerine +nerine +Nerita +neritic +Neritidae +Neritina +neritoid +Nerium +Neroic +Neronian +Neronic +Neronize +nerterology +Nerthridae +Nerthrus +nerval +nervate +nervation +nervature +nerve +nerveless +nervelessly +nervelessness +nervelet +nerveproof +nerver +nerveroot +nervid +nerviduct +Nervii +nervily +nervimotion +nervimotor +nervimuscular +nervine +nerviness +nerving +nervish +nervism +nervomuscular +nervosanguineous +nervose +nervosism +nervosity +nervous +nervously +nervousness +nervular +nervule +nervulet +nervulose +nervuration +nervure +nervy +nescience +nescient +nese +nesh +neshly +neshness +Nesiot +nesiote +Neskhi +Neslia +Nesogaea +Nesogaean +Nesokia +Nesonetta +Nesotragus +Nespelim +nesquehonite +ness +nesslerization +Nesslerize +nesslerize +nest +nestable +nestage +nester +nestful +nestiatria +nestitherapy +nestle +nestler +nestlike +nestling +Nestor +Nestorian +Nestorianism +Nestorianize +Nestorianizer +nestorine +nesty +Net +net +netball +netbraider +netbush +netcha +Netchilik +nete +neter +netful +neth +netheist +nether +Netherlander +Netherlandian +Netherlandic +Netherlandish +nethermore +nethermost +netherstock +netherstone +netherward +netherwards +Nethinim +neti +netleaf +netlike +netmaker +netmaking +netman +netmonger +netop +netsman +netsuke +nettable +Nettapus +netted +netter +Nettie +netting +Nettion +nettle +nettlebed +nettlebird +nettlefire +nettlefish +nettlefoot +nettlelike +nettlemonger +nettler +nettlesome +nettlewort +nettling +nettly +Netty +netty +netwise +network +Neudeckian +neugroschen +neuma +neumatic +neumatize +neume +neumic +neurad +neuradynamia +neural +neurale +neuralgia +neuralgiac +neuralgic +neuralgiform +neuralgy +neuralist +neurapophyseal +neurapophysial +neurapophysis +neurarthropathy +neurasthenia +neurasthenic +neurasthenical +neurasthenically +neurataxia +neurataxy +neuration +neuratrophia +neuratrophic +neuratrophy +neuraxial +neuraxis +neuraxon +neuraxone +neurectasia +neurectasis +neurectasy +neurectome +neurectomic +neurectomy +neurectopia +neurectopy +neurenteric +neurepithelium +neurergic +neurexairesis +neurhypnology +neurhypnotist +neuriatry +neuric +neurilema +neurilematic +neurilemma +neurilemmal +neurilemmatic +neurilemmatous +neurilemmitis +neurility +neurin +neurine +neurinoma +neurism +neurite +neuritic +neuritis +neuroanatomical +neuroanatomy +neurobiotactic +neurobiotaxis +neuroblast +neuroblastic +neuroblastoma +neurocanal +neurocardiac +neurocele +neurocentral +neurocentrum +neurochemistry +neurochitin +neurochondrite +neurochord +neurochorioretinitis +neurocirculatory +neurocity +neuroclonic +neurocoele +neurocoelian +neurocyte +neurocytoma +neurodegenerative +neurodendrite +neurodendron +neurodermatitis +neurodermatosis +neurodermitis +neurodiagnosis +neurodynamic +neurodynia +neuroepidermal +neuroepithelial +neuroepithelium +neurofibril +neurofibrilla +neurofibrillae +neurofibrillar +neurofibroma +neurofibromatosis +neurofil +neuroganglion +neurogastralgia +neurogastric +neurogenesis +neurogenetic +neurogenic +neurogenous +neuroglandular +neuroglia +neurogliac +neuroglial +neurogliar +neuroglic +neuroglioma +neurogliosis +neurogram +neurogrammic +neurographic +neurography +neurohistology +neurohumor +neurohumoral +neurohypnology +neurohypnotic +neurohypnotism +neurohypophysis +neuroid +neurokeratin +neurokyme +neurological +neurologist +neurologize +neurology +neurolymph +neurolysis +neurolytic +neuroma +neuromalacia +neuromalakia +neuromast +neuromastic +neuromatosis +neuromatous +neuromere +neuromerism +neuromerous +neuromimesis +neuromimetic +neuromotor +neuromuscular +neuromusculature +neuromyelitis +neuromyic +neuron +neuronal +neurone +neuronic +neuronism +neuronist +neuronophagia +neuronophagy +neuronym +neuronymy +neuroparalysis +neuroparalytic +neuropath +neuropathic +neuropathical +neuropathically +neuropathist +neuropathological +neuropathologist +neuropathology +neuropathy +Neurope +neurophagy +neurophil +neurophile +neurophilic +neurophysiological +neurophysiology +neuropile +neuroplasm +neuroplasmic +neuroplasty +neuroplexus +neuropodial +neuropodium +neuropodous +neuropore +neuropsychiatric +neuropsychiatrist +neuropsychiatry +neuropsychic +neuropsychological +neuropsychologist +neuropsychology +neuropsychopathic +neuropsychopathy +neuropsychosis +neuropter +Neuroptera +neuropteran +Neuropteris +neuropterist +neuropteroid +Neuropteroidea +neuropterological +neuropterology +neuropteron +neuropterous +neuroretinitis +neurorrhaphy +Neurorthoptera +neurorthopteran +neurorthopterous +neurosal +neurosarcoma +neurosclerosis +neuroses +neurosis +neuroskeletal +neuroskeleton +neurosome +neurospasm +neurospongium +neurosthenia +neurosurgeon +neurosurgery +neurosurgical +neurosuture +neurosynapse +neurosyphilis +neurotendinous +neurotension +neurotherapeutics +neurotherapist +neurotherapy +neurothlipsis +neurotic +neurotically +neuroticism +neuroticize +neurotization +neurotome +neurotomical +neurotomist +neurotomize +neurotomy +neurotonic +neurotoxia +neurotoxic +neurotoxin +neurotripsy +neurotrophic +neurotrophy +neurotropic +neurotropism +neurovaccination +neurovaccine +neurovascular +neurovisceral +neurula +neurypnological +neurypnologist +neurypnology +Neustrian +neuter +neuterdom +neuterlike +neuterly +neuterness +neutral +neutralism +neutralist +neutrality +neutralization +neutralize +neutralizer +neutrally +neutralness +neutrino +neutroceptive +neutroceptor +neutroclusion +Neutrodyne +neutrologistic +neutron +neutropassive +neutrophile +neutrophilia +neutrophilic +neutrophilous +Nevada +Nevadan +nevadite +neve +nevel +never +neverland +nevermore +nevertheless +nevo +nevoid +Nevome +nevoy +nevus +nevyanskite +new +Newar +Newari +newberyite +newcal +Newcastle +newcome +newcomer +newel +newelty +newfangle +newfangled +newfangledism +newfangledly +newfangledness +newfanglement +Newfoundland +Newfoundlander +Newichawanoc +newing +newings +newish +newlandite +newly +newlywed +Newmanism +Newmanite +Newmanize +newmarket +newness +Newport +news +newsbill +newsboard +newsboat +newsboy +newscast +newscaster +newscasting +newsful +newsiness +newsless +newslessness +newsletter +newsman +newsmonger +newsmongering +newsmongery +newspaper +newspaperdom +newspaperese +newspaperish +newspaperized +newspaperman +newspaperwoman +newspapery +newsprint +newsreader +newsreel +newsroom +newssheet +newsstand +newsteller +newsworthiness +newsworthy +newsy +newt +newtake +newton +Newtonian +Newtonianism +Newtonic +Newtonist +newtonite +nexal +next +nextly +nextness +nexum +nexus +neyanda +ngai +ngaio +ngapi +Ngoko +Nheengatu +ni +niacin +Niagara +Niagaran +Niantic +Nias +Niasese +niata +nib +nibbana +nibbed +nibber +nibble +nibbler +nibblingly +nibby +niblick +niblike +nibong +nibs +nibsome +Nicaean +Nicaragua +Nicaraguan +Nicarao +niccolic +niccoliferous +niccolite +niccolous +Nice +nice +niceish +niceling +nicely +Nicene +niceness +Nicenian +Nicenist +nicesome +nicetish +nicety +niche +nichelino +nicher +Nicholas +Nick +nick +nickel +nickelage +nickelic +nickeliferous +nickeline +nickeling +nickelization +nickelize +nickellike +nickelodeon +nickelous +nickeltype +nicker +nickerpecker +nickey +Nickie +Nickieben +nicking +nickle +nickname +nicknameable +nicknamee +nicknameless +nicknamer +Nickneven +nickstick +nicky +Nicobar +Nicobarese +Nicodemite +Nicodemus +Nicol +Nicolaitan +Nicolaitanism +Nicolas +nicolayite +nicolo +Nicomachean +nicotia +nicotian +Nicotiana +nicotianin +nicotic +nicotinamide +nicotine +nicotinean +nicotined +nicotineless +nicotinian +nicotinic +nicotinism +nicotinize +nicotism +nicotize +nictate +nictation +nictitant +nictitate +nictitation +nid +nidal +nidamental +nidana +nidation +nidatory +niddering +niddick +niddle +nide +nidge +nidget +nidgety +nidi +nidicolous +nidificant +nidificate +nidification +nidificational +nidifugous +nidify +niding +nidologist +nidology +nidor +nidorosity +nidorous +nidorulent +nidulant +Nidularia +Nidulariaceae +nidulariaceous +Nidulariales +nidulate +nidulation +nidulus +nidus +niece +nieceless +nieceship +niellated +nielled +niellist +niello +niepa +Nierembergia +Niersteiner +Nietzschean +Nietzscheanism +Nietzscheism +nieve +nieveta +nievling +nife +nifesima +niffer +nific +nifle +nifling +nifty +nig +Nigel +Nigella +Nigerian +niggard +niggardize +niggardliness +niggardling +niggardly +niggardness +nigger +niggerdom +niggerfish +niggergoose +niggerhead +niggerish +niggerism +niggerling +niggertoe +niggerweed +niggery +niggle +niggler +niggling +nigglingly +niggly +nigh +nighly +nighness +night +nightcap +nightcapped +nightcaps +nightchurr +nightdress +nighted +nightfall +nightfish +nightflit +nightfowl +nightgown +nighthawk +nightie +nightingale +nightingalize +nightjar +nightless +nightlessness +nightlike +nightlong +nightly +nightman +nightmare +nightmarish +nightmarishly +nightmary +nights +nightshade +nightshine +nightshirt +nightstock +nightstool +nighttide +nighttime +nightwalker +nightwalking +nightward +nightwards +nightwear +nightwork +nightworker +nignay +nignye +nigori +nigranilin +nigraniline +nigre +nigrescence +nigrescent +nigresceous +nigrescite +nigrification +nigrified +nigrify +nigrine +Nigritian +nigrities +nigritude +nigritudinous +nigrosine +nigrous +nigua +Nihal +nihilianism +nihilianistic +nihilification +nihilify +nihilism +nihilist +nihilistic +nihilitic +nihility +nikau +Nikeno +nikethamide +Nikko +niklesite +nil +Nile +nilgai +Nilometer +Nilometric +Niloscope +Nilot +Nilotic +Nilous +nilpotent +nim +nimb +nimbated +nimbed +nimbi +nimbiferous +nimbification +nimble +nimblebrained +nimbleness +nimbly +nimbose +nimbosity +nimbus +nimbused +nimiety +niminy +nimious +Nimkish +nimmer +Nimrod +Nimrodian +Nimrodic +Nimrodical +Nimrodize +nimshi +Nina +nincom +nincompoop +nincompoopery +nincompoophood +nincompoopish +nine +ninebark +ninefold +nineholes +ninepegs +ninepence +ninepenny +ninepin +ninepins +ninescore +nineted +nineteen +nineteenfold +nineteenth +nineteenthly +ninetieth +ninety +ninetyfold +ninetyish +ninetyknot +Ninevite +Ninevitical +Ninevitish +Ningpo +ninny +ninnyhammer +ninnyish +ninnyism +ninnyship +ninnywatch +Ninon +ninon +Ninox +ninth +ninthly +nintu +ninut +niobate +Niobe +Niobean +niobic +Niobid +Niobite +niobite +niobium +niobous +niog +niota +Nip +nip +nipa +nipcheese +niphablepsia +niphotyphlosis +Nipissing +Nipmuc +nipper +nipperkin +nippers +nippily +nippiness +nipping +nippingly +nippitate +nipple +nippleless +nipplewort +Nipponese +Nipponism +nipponium +Nipponize +nippy +nipter +Niquiran +nirles +nirmanakaya +nirvana +nirvanic +Nisaean +Nisan +nisei +Nishada +nishiki +nisnas +nispero +Nisqualli +nisse +nisus +nit +nitch +nitchevo +Nitella +nitency +nitently +niter +niterbush +nitered +nither +nithing +nitid +nitidous +nitidulid +Nitidulidae +nito +niton +nitramine +nitramino +nitranilic +nitraniline +nitrate +nitratine +nitration +nitrator +Nitrian +nitriary +nitric +nitridation +nitride +nitriding +nitridization +nitridize +nitrifaction +nitriferous +nitrifiable +nitrification +nitrifier +nitrify +nitrile +Nitriot +nitrite +nitro +nitroalizarin +nitroamine +nitroaniline +Nitrobacter +nitrobacteria +Nitrobacteriaceae +Nitrobacterieae +nitrobarite +nitrobenzene +nitrobenzol +nitrobenzole +nitrocalcite +nitrocellulose +nitrocellulosic +nitrochloroform +nitrocotton +nitroform +nitrogelatin +nitrogen +nitrogenate +nitrogenation +nitrogenic +nitrogenization +nitrogenize +nitrogenous +nitroglycerin +nitrohydrochloric +nitrolamine +nitrolic +nitrolime +nitromagnesite +nitrometer +nitrometric +nitromuriate +nitromuriatic +nitronaphthalene +nitroparaffin +nitrophenol +nitrophilous +nitrophyte +nitrophytic +nitroprussiate +nitroprussic +nitroprusside +nitrosamine +nitrosate +nitrosification +nitrosify +nitrosite +nitrosobacteria +nitrosochloride +Nitrosococcus +Nitrosomonas +nitrososulphuric +nitrostarch +nitrosulphate +nitrosulphonic +nitrosulphuric +nitrosyl +nitrosylsulphuric +nitrotoluene +nitrous +nitroxyl +nitryl +nitter +nitty +nitwit +Nitzschia +Nitzschiaceae +Niuan +Niue +nival +nivation +nivellate +nivellation +nivellator +nivellization +nivenite +niveous +nivicolous +nivosity +nix +nixie +niyoga +Nizam +nizam +nizamate +nizamut +nizy +njave +no +noa +Noachian +Noachic +Noachical +Noachite +Noah +Noahic +nob +nobber +nobbily +nobble +nobbler +nobbut +nobby +nobiliary +nobilify +nobilitate +nobilitation +nobility +noble +noblehearted +nobleheartedly +nobleheartedness +nobleman +noblemanly +nobleness +noblesse +noblewoman +nobley +nobly +nobody +nobodyness +nobs +nocake +Nocardia +nocardiosis +nocent +nocerite +nociassociation +nociceptive +nociceptor +nociperception +nociperceptive +nock +nocket +nocktat +noctambulant +noctambulation +noctambule +noctambulism +noctambulist +noctambulistic +noctambulous +Nocten +noctidial +noctidiurnal +noctiferous +noctiflorous +Noctilio +Noctilionidae +Noctiluca +noctiluca +noctilucal +noctilucan +noctilucence +noctilucent +Noctilucidae +noctilucin +noctilucine +noctilucous +noctiluminous +noctipotent +noctivagant +noctivagation +noctivagous +noctograph +noctovision +Noctuae +noctuid +Noctuidae +noctuiform +noctule +nocturia +nocturn +nocturnal +nocturnally +nocturne +nocuity +nocuous +nocuously +nocuousness +nod +nodal +nodality +nodated +nodder +nodding +noddingly +noddle +noddy +node +noded +nodi +nodiak +nodical +nodicorn +nodiferous +nodiflorous +nodiform +Nodosaria +nodosarian +nodosariform +nodosarine +nodose +nodosity +nodous +nodular +nodulate +nodulated +nodulation +nodule +noduled +nodulize +nodulose +nodulous +nodulus +nodus +noegenesis +noegenetic +Noel +noel +noematachograph +noematachometer +noematachometic +Noetic +noetic +noetics +nog +nogada +Nogai +nogal +noggen +noggin +nogging +noghead +nogheaded +nohow +Nohuntsik +noibwood +noil +noilage +noiler +noily +noint +nointment +noir +noise +noiseful +noisefully +noiseless +noiselessly +noiselessness +noisemaker +noisemaking +noiseproof +noisette +noisily +noisiness +noisome +noisomely +noisomeness +noisy +nokta +Nolascan +nolition +Noll +noll +nolle +nolleity +nollepros +nolo +noma +nomad +nomadian +nomadic +nomadical +nomadically +Nomadidae +nomadism +nomadization +nomadize +nomancy +nomarch +nomarchy +Nomarthra +nomarthral +nombril +nome +Nomeidae +nomenclate +nomenclative +nomenclator +nomenclatorial +nomenclatorship +nomenclatory +nomenclatural +nomenclature +nomenclaturist +Nomeus +nomial +nomic +nomina +nominable +nominal +nominalism +nominalist +nominalistic +nominality +nominally +nominate +nominated +nominately +nomination +nominatival +nominative +nominatively +nominator +nominatrix +nominature +nominee +nomineeism +nominy +nomism +nomisma +nomismata +nomistic +nomocanon +nomocracy +nomogenist +nomogenous +nomogeny +nomogram +nomograph +nomographer +nomographic +nomographical +nomographically +nomography +nomological +nomologist +nomology +nomopelmous +nomophylax +nomophyllous +nomos +nomotheism +nomothete +nomothetes +nomothetic +nomothetical +non +Nona +nonabandonment +nonabdication +nonabiding +nonability +nonabjuration +nonabjurer +nonabolition +nonabridgment +nonabsentation +nonabsolute +nonabsolution +nonabsorbable +nonabsorbent +nonabsorptive +nonabstainer +nonabstaining +nonabstemious +nonabstention +nonabstract +nonacademic +nonacceding +nonacceleration +nonaccent +nonacceptance +nonacceptant +nonacceptation +nonaccess +nonaccession +nonaccessory +nonaccidental +nonaccompaniment +nonaccompanying +nonaccomplishment +nonaccredited +nonaccretion +nonachievement +nonacid +nonacknowledgment +nonacosane +nonacoustic +nonacquaintance +nonacquiescence +nonacquiescent +nonacquisitive +nonacquittal +nonact +nonactinic +nonaction +nonactionable +nonactive +nonactuality +nonaculeate +nonacute +nonadditive +nonadecane +nonadherence +nonadherent +nonadhesion +nonadhesive +nonadjacent +nonadjectival +nonadjournment +nonadjustable +nonadjustive +nonadjustment +nonadministrative +nonadmiring +nonadmission +nonadmitted +nonadoption +Nonadorantes +nonadornment +nonadult +nonadvancement +nonadvantageous +nonadventitious +nonadventurous +nonadverbial +nonadvertence +nonadvertency +nonadvocate +nonaerating +nonaerobiotic +nonaesthetic +nonaffection +nonaffiliated +nonaffirmation +nonage +nonagenarian +nonagency +nonagent +nonagesimal +nonagglutinative +nonagglutinator +nonaggression +nonaggressive +nonagon +nonagrarian +nonagreement +nonagricultural +nonahydrate +nonaid +nonair +nonalarmist +nonalcohol +nonalcoholic +nonalgebraic +nonalienating +nonalienation +nonalignment +nonalkaloidal +nonallegation +nonallegorical +nonalliterated +nonalliterative +nonallotment +nonalluvial +nonalphabetic +nonaltruistic +nonaluminous +nonamalgamable +nonamendable +nonamino +nonamotion +nonamphibious +nonamputation +nonanalogy +nonanalytical +nonanalyzable +nonanalyzed +nonanaphoric +nonanaphthene +nonanatomical +nonancestral +nonane +nonanesthetized +nonangelic +nonangling +nonanimal +nonannexation +nonannouncement +nonannuitant +nonannulment +nonanoic +nonanonymity +nonanswer +nonantagonistic +nonanticipative +nonantigenic +nonapologetic +nonapostatizing +nonapostolic +nonapparent +nonappealable +nonappearance +nonappearer +nonappearing +nonappellate +nonappendicular +nonapplication +nonapply +nonappointment +nonapportionable +nonapposable +nonappraisal +nonappreciation +nonapprehension +nonappropriation +nonapproval +nonaqueous +nonarbitrable +nonarcing +nonargentiferous +nonaristocratic +nonarithmetical +nonarmament +nonarmigerous +nonaromatic +nonarraignment +nonarrival +nonarsenical +nonarterial +nonartesian +nonarticulated +nonarticulation +nonartistic +nonary +nonascendancy +nonascertainable +nonascertaining +nonascetic +nonascription +nonaseptic +nonaspersion +nonasphalt +nonaspirate +nonaspiring +nonassault +nonassent +nonassentation +nonassented +nonassenting +nonassertion +nonassertive +nonassessable +nonassessment +nonassignable +nonassignment +nonassimilable +nonassimilating +nonassimilation +nonassistance +nonassistive +nonassociable +nonassortment +nonassurance +nonasthmatic +nonastronomical +nonathletic +nonatmospheric +nonatonement +nonattached +nonattachment +nonattainment +nonattendance +nonattendant +nonattention +nonattestation +nonattribution +nonattributive +nonaugmentative +nonauricular +nonauriferous +nonauthentication +nonauthoritative +nonautomatic +nonautomotive +nonavoidance +nonaxiomatic +nonazotized +nonbachelor +nonbacterial +nonbailable +nonballoting +nonbanishment +nonbankable +nonbarbarous +nonbaronial +nonbase +nonbasement +nonbasic +nonbasing +nonbathing +nonbearded +nonbearing +nonbeing +nonbeliever +nonbelieving +nonbelligerent +nonbending +nonbenevolent +nonbetrayal +nonbeverage +nonbilabiate +nonbilious +nonbinomial +nonbiological +nonbitter +nonbituminous +nonblack +nonblameless +nonbleeding +nonblended +nonblockaded +nonblocking +nonblooded +nonblooming +nonbodily +nonbookish +nonborrower +nonbotanical +nonbourgeois +nonbranded +nonbreakable +nonbreeder +nonbreeding +nonbroodiness +nonbroody +nonbrowsing +nonbudding +nonbulbous +nonbulkhead +nonbureaucratic +nonburgage +nonburgess +nonburnable +nonburning +nonbursting +nonbusiness +nonbuying +noncabinet +noncaffeine +noncaking +Noncalcarea +noncalcareous +noncalcified +noncallability +noncallable +noncancellable +noncannibalistic +noncanonical +noncanonization +noncanvassing +noncapillarity +noncapillary +noncapital +noncapitalist +noncapitalistic +noncapitulation +noncapsizable +noncapture +noncarbonate +noncareer +noncarnivorous +noncarrier +noncartelized +noncaste +noncastigation +noncataloguer +noncatarrhal +noncatechizable +noncategorical +noncathedral +noncatholicity +noncausality +noncausation +nonce +noncelebration +noncelestial +noncellular +noncellulosic +noncensored +noncensorious +noncensus +noncentral +noncereal +noncerebral +nonceremonial +noncertain +noncertainty +noncertified +nonchafing +nonchalance +nonchalant +nonchalantly +nonchalantness +nonchalky +nonchallenger +nonchampion +nonchangeable +nonchanging +noncharacteristic +nonchargeable +nonchastisement +nonchastity +nonchemical +nonchemist +nonchivalrous +nonchokable +nonchokebore +nonchronological +nonchurch +nonchurched +nonchurchgoer +nonciliate +noncircuit +noncircuital +noncircular +noncirculation +noncitation +noncitizen +noncivilized +nonclaim +nonclaimable +nonclassable +nonclassical +nonclassifiable +nonclassification +nonclastic +nonclearance +noncleistogamic +nonclergyable +nonclerical +nonclimbable +nonclinical +nonclose +nonclosure +nonclotting +noncoagulability +noncoagulable +noncoagulation +noncoalescing +noncock +noncoercion +noncoercive +noncognate +noncognition +noncognitive +noncognizable +noncognizance +noncoherent +noncohesion +noncohesive +noncoinage +noncoincidence +noncoincident +noncoincidental +noncoking +noncollaboration +noncollaborative +noncollapsible +noncollectable +noncollection +noncollegiate +noncollinear +noncolloid +noncollusion +noncollusive +noncolonial +noncoloring +noncom +noncombat +noncombatant +noncombination +noncombining +noncombustible +noncombustion +noncome +noncoming +noncommemoration +noncommencement +noncommendable +noncommensurable +noncommercial +noncommissioned +noncommittal +noncommittalism +noncommittally +noncommittalness +noncommonable +noncommorancy +noncommunal +noncommunicable +noncommunicant +noncommunicating +noncommunication +noncommunion +noncommunist +noncommunistic +noncommutative +noncompearance +noncompensating +noncompensation +noncompetency +noncompetent +noncompeting +noncompetitive +noncompetitively +noncomplaisance +noncompletion +noncompliance +noncomplicity +noncomplying +noncomposite +noncompoundable +noncompounder +noncomprehension +noncompressible +noncompression +noncompulsion +noncomputation +noncon +nonconcealment +nonconceiving +nonconcentration +nonconception +nonconcern +nonconcession +nonconciliating +nonconcludency +nonconcludent +nonconcluding +nonconclusion +nonconcordant +nonconcur +nonconcurrence +nonconcurrency +nonconcurrent +noncondensable +noncondensation +noncondensible +noncondensing +noncondimental +nonconditioned +noncondonation +nonconducive +nonconductibility +nonconductible +nonconducting +nonconduction +nonconductive +nonconductor +nonconfederate +nonconferrable +nonconfession +nonconficient +nonconfident +nonconfidential +nonconfinement +nonconfirmation +nonconfirmative +nonconfiscable +nonconfiscation +nonconfitent +nonconflicting +nonconform +nonconformable +nonconformably +nonconformance +nonconformer +nonconforming +nonconformism +nonconformist +nonconformistical +nonconformistically +nonconformitant +nonconformity +nonconfutation +noncongealing +noncongenital +noncongestion +noncongratulatory +noncongruent +nonconjectural +nonconjugal +nonconjugate +nonconjunction +nonconnection +nonconnective +nonconnivance +nonconnotative +nonconnubial +nonconscientious +nonconscious +nonconscription +nonconsecration +nonconsecutive +nonconsent +nonconsenting +nonconsequence +nonconsequent +nonconservation +nonconservative +nonconserving +nonconsideration +nonconsignment +nonconsistorial +nonconsoling +nonconsonant +nonconsorting +nonconspirator +nonconspiring +nonconstituent +nonconstitutional +nonconstraint +nonconstruable +nonconstruction +nonconstructive +nonconsular +nonconsultative +nonconsumable +nonconsumption +noncontact +noncontagion +noncontagionist +noncontagious +noncontagiousness +noncontamination +noncontemplative +noncontending +noncontent +noncontention +noncontentious +noncontentiously +nonconterminous +noncontiguity +noncontiguous +noncontinental +noncontingent +noncontinuance +noncontinuation +noncontinuous +noncontraband +noncontraction +noncontradiction +noncontradictory +noncontributing +noncontribution +noncontributor +noncontributory +noncontrivance +noncontrolled +noncontrolling +noncontroversial +nonconvective +nonconvenable +nonconventional +nonconvergent +nonconversable +nonconversant +nonconversational +nonconversion +nonconvertible +nonconveyance +nonconviction +nonconvivial +noncoplanar +noncopying +noncoring +noncorporate +noncorporeality +noncorpuscular +noncorrection +noncorrective +noncorrelation +noncorrespondence +noncorrespondent +noncorresponding +noncorroboration +noncorroborative +noncorrodible +noncorroding +noncorrosive +noncorruption +noncortical +noncosmic +noncosmopolitism +noncostraight +noncottager +noncotyledonous +noncounty +noncranking +noncreation +noncreative +noncredence +noncredent +noncredibility +noncredible +noncreditor +noncreeping +noncrenate +noncretaceous +noncriminal +noncriminality +noncrinoid +noncritical +noncrucial +noncruciform +noncrusading +noncrushability +noncrushable +noncrustaceous +noncrystalline +noncrystallizable +noncrystallized +noncrystallizing +nonculmination +nonculpable +noncultivated +noncultivation +nonculture +noncumulative +noncurantist +noncurling +noncurrency +noncurrent +noncursive +noncurtailment +noncuspidate +noncustomary +noncutting +noncyclic +noncyclical +nonda +nondamageable +nondamnation +nondancer +nondangerous +nondatival +nondealer +nondebtor +nondecadence +nondecadent +nondecalcified +nondecane +nondecasyllabic +nondecatoic +nondecaying +nondeceivable +nondeception +nondeceptive +Nondeciduata +nondeciduate +nondeciduous +nondecision +nondeclarant +nondeclaration +nondeclarer +nondecomposition +nondecoration +nondedication +nondeduction +nondefalcation +nondefamatory +nondefaulting +nondefection +nondefendant +nondefense +nondefensive +nondeference +nondeferential +nondefiance +nondefilement +nondefining +nondefinition +nondefinitive +nondeforestation +nondegenerate +nondegeneration +nondegerming +nondegradation +nondegreased +nondehiscent +nondeist +nondelegable +nondelegate +nondelegation +nondeleterious +nondeliberate +nondeliberation +nondelineation +nondeliquescent +nondelirious +nondeliverance +nondelivery +nondemand +nondemise +nondemobilization +nondemocratic +nondemonstration +nondendroid +nondenial +nondenominational +nondenominationalism +nondense +nondenumerable +nondenunciation +nondepartmental +nondeparture +nondependence +nondependent +nondepletion +nondeportation +nondeported +nondeposition +nondepositor +nondepravity +nondepreciating +nondepressed +nondepression +nondeprivable +nonderivable +nonderivative +nonderogatory +nondescript +nondesecration +nondesignate +nondesigned +nondesire +nondesirous +nondesisting +nondespotic +nondesquamative +nondestructive +nondesulphurized +nondetachable +nondetailed +nondetention +nondetermination +nondeterminist +nondeterrent +nondetest +nondetonating +nondetrimental +nondevelopable +nondevelopment +nondeviation +nondevotional +nondexterous +nondiabetic +nondiabolic +nondiagnosis +nondiagonal +nondiagrammatic +nondialectal +nondialectical +nondialyzing +nondiametral +nondiastatic +nondiathermanous +nondiazotizable +nondichogamous +nondichogamy +nondichotomous +nondictation +nondictatorial +nondictionary +nondidactic +nondieting +nondifferentation +nondifferentiable +nondiffractive +nondiffusing +nondigestion +nondilatable +nondilution +nondiocesan +nondiphtheritic +nondiphthongal +nondiplomatic +nondipterous +nondirection +nondirectional +nondisagreement +nondisappearing +nondisarmament +nondisbursed +nondiscernment +nondischarging +nondisciplinary +nondisclaim +nondisclosure +nondiscontinuance +nondiscordant +nondiscountable +nondiscovery +nondiscretionary +nondiscrimination +nondiscriminatory +nondiscussion +nondisestablishment +nondisfigurement +nondisfranchised +nondisingenuous +nondisintegration +nondisinterested +nondisjunct +nondisjunction +nondisjunctional +nondisjunctive +nondismemberment +nondismissal +nondisparaging +nondisparate +nondispensation +nondispersal +nondispersion +nondisposal +nondisqualifying +nondissenting +nondissolution +nondistant +nondistinctive +nondistortion +nondistribution +nondistributive +nondisturbance +nondivergence +nondivergent +nondiversification +nondivinity +nondivisible +nondivisiblity +nondivision +nondivisional +nondivorce +nondo +nondoctrinal +nondocumentary +nondogmatic +nondoing +nondomestic +nondomesticated +nondominant +nondonation +nondramatic +nondrinking +nondropsical +nondrying +nonduality +nondumping +nonduplication +nondutiable +nondynastic +nondyspeptic +none +nonearning +noneastern +noneatable +nonecclesiastical +nonechoic +noneclectic +noneclipsing +nonecompense +noneconomic +nonedible +noneditor +noneditorial +noneducable +noneducation +noneducational +noneffective +noneffervescent +noneffete +nonefficacious +nonefficacy +nonefficiency +nonefficient +noneffusion +nonego +nonegoistical +nonejection +nonelastic +nonelasticity +nonelect +nonelection +nonelective +nonelector +nonelectric +nonelectrical +nonelectrification +nonelectrified +nonelectrized +nonelectrocution +nonelectrolyte +noneleemosynary +nonelemental +nonelementary +nonelimination +nonelopement +nonemanating +nonemancipation +nonembarkation +nonembellishment +nonembezzlement +nonembryonic +nonemendation +nonemergent +nonemigration +nonemission +nonemotional +nonemphatic +nonemphatical +nonempirical +nonemploying +nonemployment +nonemulative +nonenactment +nonenclosure +nonencroachment +nonencyclopedic +nonendemic +nonendorsement +nonenduring +nonene +nonenemy +nonenergic +nonenforceability +nonenforceable +nonenforcement +nonengagement +nonengineering +nonenrolled +nonent +nonentailed +nonenteric +nonentertainment +nonentitative +nonentitive +nonentitize +nonentity +nonentityism +nonentomological +nonentrant +nonentres +nonentry +nonenumerated +nonenunciation +nonenvious +nonenzymic +nonephemeral +nonepic +nonepicurean +nonepileptic +nonepiscopal +nonepiscopalian +nonepithelial +nonepochal +nonequal +nonequation +nonequatorial +nonequestrian +nonequilateral +nonequilibrium +nonequivalent +nonequivocating +nonerasure +nonerecting +nonerection +nonerotic +nonerroneous +nonerudite +noneruption +nones +nonescape +nonespionage +nonespousal +nonessential +nonesthetic +nonesuch +nonet +noneternal +noneternity +nonetheless +nonethereal +nonethical +nonethnological +nonethyl +noneugenic +noneuphonious +nonevacuation +nonevanescent +nonevangelical +nonevaporation +nonevasion +nonevasive +noneviction +nonevident +nonevidential +nonevil +nonevolutionary +nonevolutionist +nonevolving +nonexaction +nonexaggeration +nonexamination +nonexcavation +nonexcepted +nonexcerptible +nonexcessive +nonexchangeability +nonexchangeable +nonexciting +nonexclamatory +nonexclusion +nonexclusive +nonexcommunicable +nonexculpation +nonexcusable +nonexecution +nonexecutive +nonexemplary +nonexemplificatior +nonexempt +nonexercise +nonexertion +nonexhibition +nonexistence +nonexistent +nonexistential +nonexisting +nonexoneration +nonexotic +nonexpansion +nonexpansive +nonexpansively +nonexpectation +nonexpendable +nonexperience +nonexperienced +nonexperimental +nonexpert +nonexpiation +nonexpiry +nonexploitation +nonexplosive +nonexportable +nonexportation +nonexposure +nonexpulsion +nonextant +nonextempore +nonextended +nonextensile +nonextension +nonextensional +nonextensive +nonextenuatory +nonexteriority +nonextermination +nonexternal +nonexternality +nonextinction +nonextortion +nonextracted +nonextraction +nonextraditable +nonextradition +nonextraneous +nonextreme +nonextrication +nonextrinsic +nonexuding +nonexultation +nonfabulous +nonfacetious +nonfacial +nonfacility +nonfacing +nonfact +nonfactious +nonfactory +nonfactual +nonfacultative +nonfaculty +nonfaddist +nonfading +nonfailure +nonfalse +nonfamily +nonfamous +nonfanatical +nonfanciful +nonfarm +nonfastidious +nonfat +nonfatal +nonfatalistic +nonfatty +nonfavorite +nonfeasance +nonfeasor +nonfeatured +nonfebrile +nonfederal +nonfederated +nonfeldspathic +nonfelonious +nonfelony +nonfenestrated +nonfermentability +nonfermentable +nonfermentation +nonfermentative +nonferrous +nonfertile +nonfertility +nonfestive +nonfeudal +nonfibrous +nonfiction +nonfictional +nonfiduciary +nonfighter +nonfigurative +nonfilamentous +nonfimbriate +nonfinancial +nonfinding +nonfinishing +nonfinite +nonfireproof +nonfiscal +nonfisherman +nonfissile +nonfixation +nonflaky +nonflammable +nonfloatation +nonfloating +nonfloriferous +nonflowering +nonflowing +nonfluctuating +nonfluid +nonfluorescent +nonflying +nonfocal +nonfood +nonforeclosure +nonforeign +nonforeknowledge +nonforest +nonforested +nonforfeitable +nonforfeiting +nonforfeiture +nonform +nonformal +nonformation +nonformulation +nonfortification +nonfortuitous +nonfossiliferous +nonfouling +nonfrat +nonfraternity +nonfrauder +nonfraudulent +nonfreedom +nonfreeman +nonfreezable +nonfreeze +nonfreezing +nonfricative +nonfriction +nonfrosted +nonfruition +nonfrustration +nonfulfillment +nonfunctional +nonfundable +nonfundamental +nonfungible +nonfuroid +nonfusion +nonfuturition +nonfuturity +nongalactic +nongalvanized +nonganglionic +nongas +nongaseous +nongassy +nongelatinizing +nongelatinous +nongenealogical +nongenerative +nongenetic +nongentile +nongeographical +nongeological +nongeometrical +nongermination +nongerundial +nongildsman +nongipsy +nonglacial +nonglandered +nonglandular +nonglare +nonglucose +nonglucosidal +nonglucosidic +nongod +nongold +nongolfer +nongospel +nongovernmental +nongraduate +nongraduated +nongraduation +nongrain +nongranular +nongraphitic +nongrass +nongratuitous +nongravitation +nongravity +nongray +nongreasy +nongreen +nongregarious +nongremial +nongrey +nongrooming +nonguarantee +nonguard +nonguttural +nongymnast +nongypsy +nonhabitable +nonhabitual +nonhalation +nonhallucination +nonhandicap +nonhardenable +nonharmonic +nonharmonious +nonhazardous +nonheading +nonhearer +nonheathen +nonhedonistic +nonhepatic +nonhereditarily +nonhereditary +nonheritable +nonheritor +nonhero +nonhieratic +nonhistoric +nonhistorical +nonhomaloidal +nonhomogeneity +nonhomogeneous +nonhomogenous +nonhostile +nonhouseholder +nonhousekeeping +nonhuman +nonhumanist +nonhumorous +nonhumus +nonhunting +nonhydrogenous +nonhydrolyzable +nonhygrometric +nonhygroscopic +nonhypostatic +nonic +noniconoclastic +nonideal +nonidealist +nonidentical +nonidentity +nonidiomatic +nonidolatrous +nonidyllic +nonignitible +nonignominious +nonignorant +nonillion +nonillionth +nonillumination +nonillustration +nonimaginary +nonimbricating +nonimitative +nonimmateriality +nonimmersion +nonimmigrant +nonimmigration +nonimmune +nonimmunity +nonimmunized +nonimpact +nonimpairment +nonimpartment +nonimpatience +nonimpeachment +nonimperative +nonimperial +nonimplement +nonimportation +nonimporting +nonimposition +nonimpregnated +nonimpressionist +nonimprovement +nonimputation +nonincandescent +nonincarnated +nonincitement +noninclination +noninclusion +noninclusive +nonincrease +nonincreasing +nonincrusting +nonindependent +nonindictable +nonindictment +nonindividual +nonindividualistic +noninductive +noninductively +noninductivity +nonindurated +nonindustrial +noninfallibilist +noninfallible +noninfantry +noninfected +noninfection +noninfectious +noninfinite +noninfinitely +noninflammability +noninflammable +noninflammatory +noninflectional +noninfluence +noninformative +noninfraction +noninhabitant +noninheritable +noninherited +noninitial +noninjurious +noninjury +noninoculation +noninquiring +noninsect +noninsertion +noninstitution +noninstruction +noninstructional +noninstructress +noninstrumental +noninsurance +nonintegrable +nonintegrity +nonintellectual +nonintelligence +nonintelligent +nonintent +nonintention +noninterchangeability +noninterchangeable +nonintercourse +noninterference +noninterferer +noninterfering +nonintermittent +noninternational +noninterpolation +noninterposition +noninterrupted +nonintersecting +nonintersector +nonintervention +noninterventionalist +noninterventionist +nonintoxicant +nonintoxicating +nonintrospective +nonintrospectively +nonintrusion +nonintrusionism +nonintrusionist +nonintuitive +noninverted +noninvidious +noninvincibility +noniodized +nonion +nonionized +nonionizing +nonirate +nonirradiated +nonirrational +nonirreparable +nonirrevocable +nonirrigable +nonirrigated +nonirrigating +nonirrigation +nonirritable +nonirritant +nonirritating +nonisobaric +nonisotropic +nonissuable +nonius +nonjoinder +nonjudicial +nonjurable +nonjurant +nonjuress +nonjuring +nonjurist +nonjuristic +nonjuror +nonjurorism +nonjury +nonjurying +nonknowledge +nonkosher +nonlabeling +nonlactescent +nonlaminated +nonlanguage +nonlaying +nonleaded +nonleaking +nonlegal +nonlegato +nonlegume +nonlepidopterous +nonleprous +nonlevel +nonlevulose +nonliability +nonliable +nonliberation +nonlicensed +nonlicentiate +nonlicet +nonlicking +nonlife +nonlimitation +nonlimiting +nonlinear +nonlipoidal +nonliquefying +nonliquid +nonliquidating +nonliquidation +nonlister +nonlisting +nonliterary +nonlitigious +nonliturgical +nonliving +nonlixiviated +nonlocal +nonlocalized +nonlogical +nonlosable +nonloser +nonlover +nonloving +nonloxodromic +nonluminescent +nonluminosity +nonluminous +nonluster +nonlustrous +nonly +nonmagnetic +nonmagnetizable +nonmaintenance +nonmajority +nonmalarious +nonmalicious +nonmalignant +nonmalleable +nonmammalian +nonmandatory +nonmanifest +nonmanifestation +nonmanila +nonmannite +nonmanual +nonmanufacture +nonmanufactured +nonmanufacturing +nonmarine +nonmarital +nonmaritime +nonmarket +nonmarriage +nonmarriageable +nonmarrying +nonmartial +nonmastery +nonmaterial +nonmaterialistic +nonmateriality +nonmaternal +nonmathematical +nonmathematician +nonmatrimonial +nonmatter +nonmechanical +nonmechanistic +nonmedical +nonmedicinal +nonmedullated +nonmelodious +nonmember +nonmembership +nonmenial +nonmental +nonmercantile +nonmetal +nonmetallic +nonmetalliferous +nonmetallurgical +nonmetamorphic +nonmetaphysical +nonmeteoric +nonmeteorological +nonmetric +nonmetrical +nonmetropolitan +nonmicrobic +nonmicroscopical +nonmigratory +nonmilitant +nonmilitary +nonmillionaire +nonmimetic +nonmineral +nonmineralogical +nonminimal +nonministerial +nonministration +nonmiraculous +nonmischievous +nonmiscible +nonmissionary +nonmobile +nonmodal +nonmodern +nonmolar +nonmolecular +nonmomentary +nonmonarchical +nonmonarchist +nonmonastic +nonmonist +nonmonogamous +nonmonotheistic +nonmorainic +nonmoral +nonmorality +nonmortal +nonmotile +nonmotoring +nonmotorist +nonmountainous +nonmucilaginous +nonmucous +nonmulched +nonmultiple +nonmunicipal +nonmuscular +nonmusical +nonmussable +nonmutationally +nonmutative +nonmutual +nonmystical +nonmythical +nonmythological +nonnant +nonnarcotic +nonnasal +nonnat +nonnational +nonnative +nonnatural +nonnaturalism +nonnaturalistic +nonnaturality +nonnaturalness +nonnautical +nonnaval +nonnavigable +nonnavigation +nonnebular +nonnecessary +nonnecessity +nonnegligible +nonnegotiable +nonnegotiation +nonnephritic +nonnervous +nonnescience +nonnescient +nonneutral +nonneutrality +nonnitrogenized +nonnitrogenous +nonnoble +nonnomination +nonnotification +nonnotional +nonnucleated +nonnumeral +nonnutrient +nonnutritious +nonnutritive +nonobedience +nonobedient +nonobjection +nonobjective +nonobligatory +nonobservable +nonobservance +nonobservant +nonobservation +nonobstetrical +nonobstructive +nonobvious +nonoccidental +nonocculting +nonoccupant +nonoccupation +nonoccupational +nonoccurrence +nonodorous +nonoecumenic +nonoffender +nonoffensive +nonofficeholding +nonofficial +nonofficially +nonofficinal +nonoic +nonoily +nonolfactory +nonomad +nononerous +nonopacity +nonopening +nonoperating +nonoperative +nonopposition +nonoppressive +nonoptical +nonoptimistic +nonoptional +nonorchestral +nonordination +nonorganic +nonorganization +nonoriental +nonoriginal +nonornamental +nonorthodox +nonorthographical +nonoscine +nonostentation +nonoutlawry +nonoutrage +nonoverhead +nonoverlapping +nonowner +nonoxidating +nonoxidizable +nonoxidizing +nonoxygenated +nonoxygenous +nonpacific +nonpacification +nonpacifist +nonpagan +nonpaid +nonpainter +nonpalatal +nonpapal +nonpapist +nonpar +nonparallel +nonparalytic +nonparasitic +nonparasitism +nonpareil +nonparent +nonparental +nonpariello +nonparishioner +nonparliamentary +nonparlor +nonparochial +nonparous +nonpartial +nonpartiality +nonparticipant +nonparticipating +nonparticipation +nonpartisan +nonpartisanship +nonpartner +nonparty +nonpassenger +nonpasserine +nonpastoral +nonpatentable +nonpatented +nonpaternal +nonpathogenic +nonpause +nonpaying +nonpayment +nonpeak +nonpeaked +nonpearlitic +nonpecuniary +nonpedestrian +nonpedigree +nonpelagic +nonpeltast +nonpenal +nonpenalized +nonpending +nonpensionable +nonpensioner +nonperception +nonperceptual +nonperfection +nonperforated +nonperforating +nonperformance +nonperformer +nonperforming +nonperiodic +nonperiodical +nonperishable +nonperishing +nonperjury +nonpermanent +nonpermeability +nonpermeable +nonpermissible +nonpermission +nonperpendicular +nonperpetual +nonperpetuity +nonpersecution +nonperseverance +nonpersistence +nonpersistent +nonperson +nonpersonal +nonpersonification +nonpertinent +nonperversive +nonphagocytic +nonpharmaceutical +nonphenolic +nonphenomenal +nonphilanthropic +nonphilological +nonphilosophical +nonphilosophy +nonphonetic +nonphosphatic +nonphosphorized +nonphotobiotic +nonphysical +nonphysiological +nonpickable +nonpigmented +nonplacental +nonplacet +nonplanar +nonplane +nonplanetary +nonplantowning +nonplastic +nonplate +nonplausible +nonpleading +nonplus +nonplusation +nonplushed +nonplutocratic +nonpoet +nonpoetic +nonpoisonous +nonpolar +nonpolarizable +nonpolarizing +nonpolitical +nonponderosity +nonponderous +nonpopery +nonpopular +nonpopularity +nonporous +nonporphyritic +nonport +nonportability +nonportable +nonportrayal +nonpositive +nonpossession +nonposthumous +nonpostponement +nonpotential +nonpower +nonpractical +nonpractice +nonpraedial +nonpreaching +nonprecious +nonprecipitation +nonpredatory +nonpredestination +nonpredicative +nonpredictable +nonpreference +nonpreferential +nonpreformed +nonpregnant +nonprehensile +nonprejudicial +nonprelatical +nonpremium +nonpreparation +nonprepayment +nonprepositional +nonpresbyter +nonprescribed +nonprescriptive +nonpresence +nonpresentation +nonpreservation +nonpresidential +nonpress +nonpressure +nonprevalence +nonprevalent +nonpriestly +nonprimitive +nonprincipiate +nonprincipled +nonprobable +nonprocreation +nonprocurement +nonproducer +nonproducing +nonproduction +nonproductive +nonproductively +nonproductiveness +nonprofane +nonprofessed +nonprofession +nonprofessional +nonprofessionalism +nonprofessorial +nonproficience +nonproficiency +nonproficient +nonprofit +nonprofiteering +nonprognostication +nonprogressive +nonprohibitable +nonprohibition +nonprohibitive +nonprojection +nonprojective +nonprojectively +nonproletarian +nonproliferous +nonprolific +nonprolongation +nonpromiscuous +nonpromissory +nonpromotion +nonpromulgation +nonpronunciation +nonpropagandistic +nonpropagation +nonprophetic +nonpropitiation +nonproportional +nonproprietary +nonproprietor +nonprorogation +nonproscriptive +nonprosecution +nonprospect +nonprotection +nonprotective +nonproteid +nonprotein +nonprotestation +nonprotractile +nonprotractility +nonproven +nonprovided +nonprovidential +nonprovocation +nonpsychic +nonpsychological +nonpublic +nonpublication +nonpublicity +nonpueblo +nonpulmonary +nonpulsating +nonpumpable +nonpunctual +nonpunctuation +nonpuncturable +nonpunishable +nonpunishing +nonpunishment +nonpurchase +nonpurchaser +nonpurgative +nonpurification +nonpurposive +nonpursuit +nonpurulent +nonpurveyance +nonputrescent +nonputrescible +nonputting +nonpyogenic +nonpyritiferous +nonqualification +nonquality +nonquota +nonracial +nonradiable +nonradiating +nonradical +nonrailroader +nonranging +nonratability +nonratable +nonrated +nonratifying +nonrational +nonrationalist +nonrationalized +nonrayed +nonreaction +nonreactive +nonreactor +nonreader +nonreading +nonrealistic +nonreality +nonrealization +nonreasonable +nonreasoner +nonrebel +nonrebellious +nonreceipt +nonreceiving +nonrecent +nonreception +nonrecess +nonrecipient +nonreciprocal +nonreciprocating +nonreciprocity +nonrecital +nonreclamation +nonrecluse +nonrecognition +nonrecognized +nonrecoil +nonrecollection +nonrecommendation +nonreconciliation +nonrecourse +nonrecoverable +nonrecovery +nonrectangular +nonrectified +nonrecuperation +nonrecurrent +nonrecurring +nonredemption +nonredressing +nonreducing +nonreference +nonrefillable +nonreflector +nonreformation +nonrefraction +nonrefrigerant +nonrefueling +nonrefutation +nonregardance +nonregarding +nonregenerating +nonregenerative +nonregent +nonregimented +nonregistered +nonregistrability +nonregistrable +nonregistration +nonregression +nonregulation +nonrehabilitation +nonreigning +nonreimbursement +nonreinforcement +nonreinstatement +nonrejection +nonrejoinder +nonrelapsed +nonrelation +nonrelative +nonrelaxation +nonrelease +nonreliance +nonreligion +nonreligious +nonreligiousness +nonrelinquishment +nonremanie +nonremedy +nonremembrance +nonremission +nonremonstrance +nonremuneration +nonremunerative +nonrendition +nonrenewable +nonrenewal +nonrenouncing +nonrenunciation +nonrepair +nonreparation +nonrepayable +nonrepealing +nonrepeat +nonrepeater +nonrepentance +nonrepetition +nonreplacement +nonreplicate +nonreportable +nonreprehensible +nonrepresentation +nonrepresentational +nonrepresentationalism +nonrepresentative +nonrepression +nonreprisal +nonreproduction +nonreproductive +nonrepublican +nonrepudiation +nonrequirement +nonrequisition +nonrequital +nonrescue +nonresemblance +nonreservation +nonreserve +nonresidence +nonresidency +nonresident +nonresidental +nonresidenter +nonresidential +nonresidentiary +nonresidentor +nonresidual +nonresignation +nonresinifiable +nonresistance +nonresistant +nonresisting +nonresistive +nonresolvability +nonresolvable +nonresonant +nonrespectable +nonrespirable +nonresponsibility +nonrestitution +nonrestraint +nonrestricted +nonrestriction +nonrestrictive +nonresumption +nonresurrection +nonresuscitation +nonretaliation +nonretention +nonretentive +nonreticence +nonretinal +nonretirement +nonretiring +nonretraceable +nonretractation +nonretractile +nonretraction +nonretrenchment +nonretroactive +nonreturn +nonreturnable +nonrevaluation +nonrevealing +nonrevelation +nonrevenge +nonrevenue +nonreverse +nonreversed +nonreversible +nonreversing +nonreversion +nonrevertible +nonreviewable +nonrevision +nonrevival +nonrevocation +nonrevolting +nonrevolutionary +nonrevolving +nonrhetorical +nonrhymed +nonrhyming +nonrhythmic +nonriding +nonrigid +nonrioter +nonriparian +nonritualistic +nonrival +nonromantic +nonrotatable +nonrotating +nonrotative +nonround +nonroutine +nonroyal +nonroyalist +nonrubber +nonruminant +Nonruminantia +nonrun +nonrupture +nonrural +nonrustable +nonsabbatic +nonsaccharine +nonsacerdotal +nonsacramental +nonsacred +nonsacrifice +nonsacrificial +nonsailor +nonsalable +nonsalaried +nonsale +nonsaline +nonsalutary +nonsalutation +nonsalvation +nonsanctification +nonsanction +nonsanctity +nonsane +nonsanguine +nonsanity +nonsaponifiable +nonsatisfaction +nonsaturated +nonsaturation +nonsaving +nonsawing +nonscalding +nonscaling +nonscandalous +nonschematized +nonschismatic +nonscholastic +nonscience +nonscientific +nonscientist +nonscoring +nonscraping +nonscriptural +nonscripturalist +nonscrutiny +nonseasonal +nonsecession +nonseclusion +nonsecrecy +nonsecret +nonsecretarial +nonsecretion +nonsecretive +nonsecretory +nonsectarian +nonsectional +nonsectorial +nonsecular +nonsecurity +nonsedentary +nonseditious +nonsegmented +nonsegregation +nonseizure +nonselected +nonselection +nonselective +nonself +nonselfregarding +nonselling +nonsenatorial +nonsense +nonsensible +nonsensical +nonsensicality +nonsensically +nonsensicalness +nonsensification +nonsensify +nonsensitive +nonsensitiveness +nonsensitized +nonsensorial +nonsensuous +nonsentence +nonsentient +nonseparation +nonseptate +nonseptic +nonsequacious +nonsequaciousness +nonsequestration +nonserial +nonserif +nonserious +nonserous +nonserviential +nonservile +nonsetter +nonsetting +nonsettlement +nonsexual +nonsexually +nonshaft +nonsharing +nonshatter +nonshedder +nonshipper +nonshipping +nonshredding +nonshrinkable +nonshrinking +nonsiccative +nonsidereal +nonsignatory +nonsignature +nonsignificance +nonsignificant +nonsignification +nonsignificative +nonsilicated +nonsiliceous +nonsilver +nonsimplification +nonsine +nonsinging +nonsingular +nonsinkable +nonsinusoidal +nonsiphonage +nonsister +nonsitter +nonsitting +nonskeptical +nonskid +nonskidding +nonskipping +nonslaveholding +nonslip +nonslippery +nonslipping +nonsludging +nonsmoker +nonsmoking +nonsmutting +nonsocial +nonsocialist +nonsocialistic +nonsociety +nonsociological +nonsolar +nonsoldier +nonsolicitation +nonsolid +nonsolidified +nonsolution +nonsolvency +nonsolvent +nonsonant +nonsovereign +nonspalling +nonsparing +nonsparking +nonspeaker +nonspeaking +nonspecial +nonspecialist +nonspecialized +nonspecie +nonspecific +nonspecification +nonspecificity +nonspecified +nonspectacular +nonspectral +nonspeculation +nonspeculative +nonspherical +nonspill +nonspillable +nonspinning +nonspinose +nonspiny +nonspiral +nonspirit +nonspiritual +nonspirituous +nonspontaneous +nonspored +nonsporeformer +nonsporeforming +nonsporting +nonspottable +nonsprouting +nonstainable +nonstaining +nonstampable +nonstandard +nonstandardized +nonstanzaic +nonstaple +nonstarch +nonstarter +nonstarting +nonstatement +nonstatic +nonstationary +nonstatistical +nonstatutory +nonstellar +nonsticky +nonstimulant +nonstipulation +nonstock +nonstooping +nonstop +nonstrategic +nonstress +nonstretchable +nonstretchy +nonstriated +nonstriker +nonstriking +nonstriped +nonstructural +nonstudent +nonstudious +nonstylized +nonsubject +nonsubjective +nonsubmission +nonsubmissive +nonsubordination +nonsubscriber +nonsubscribing +nonsubscription +nonsubsiding +nonsubsidy +nonsubsistence +nonsubstantial +nonsubstantialism +nonsubstantialist +nonsubstantiality +nonsubstantiation +nonsubstantive +nonsubstitution +nonsubtraction +nonsuccess +nonsuccessful +nonsuccession +nonsuccessive +nonsuccour +nonsuction +nonsuctorial +nonsufferance +nonsuffrage +nonsugar +nonsuggestion +nonsuit +nonsulphurous +nonsummons +nonsupplication +nonsupport +nonsupporter +nonsupporting +nonsuppositional +nonsuppressed +nonsuppression +nonsuppurative +nonsurface +nonsurgical +nonsurrender +nonsurvival +nonsurvivor +nonsuspect +nonsustaining +nonsustenance +nonswearer +nonswearing +nonsweating +nonswimmer +nonswimming +nonsyllabic +nonsyllabicness +nonsyllogistic +nonsyllogizing +nonsymbiotic +nonsymbiotically +nonsymbolic +nonsymmetrical +nonsympathetic +nonsympathizer +nonsympathy +nonsymphonic +nonsymptomatic +nonsynchronous +nonsyndicate +nonsynodic +nonsynonymous +nonsyntactic +nonsyntactical +nonsynthesized +nonsyntonic +nonsystematic +nontabular +nontactical +nontan +nontangential +nontannic +nontannin +nontariff +nontarnishable +nontarnishing +nontautomeric +nontautomerizable +nontax +nontaxability +nontaxable +nontaxonomic +nonteachable +nonteacher +nonteaching +nontechnical +nontechnological +nonteetotaler +nontelegraphic +nonteleological +nontelephonic +nontemporal +nontemporizing +nontenant +nontenure +nontenurial +nonterm +nonterminating +nonterrestrial +nonterritorial +nonterritoriality +nontestamentary +nontextual +nontheatrical +nontheistic +nonthematic +nontheological +nontheosophical +nontherapeutic +nonthinker +nonthinking +nonthoracic +nonthoroughfare +nonthreaded +nontidal +nontillable +nontimbered +nontitaniferous +nontitular +nontolerated +nontopographical +nontourist +nontoxic +nontraction +nontrade +nontrader +nontrading +nontraditional +nontragic +nontrailing +nontransferability +nontransferable +nontransgression +nontransient +nontransitional +nontranslocation +nontransmission +nontransparency +nontransparent +nontransportation +nontransposing +nontransposition +nontraveler +nontraveling +nontreasonable +nontreated +nontreatment +nontreaty +nontrespass +nontrial +nontribal +nontribesman +nontributary +nontrier +nontrigonometrical +nontronite +nontropical +nontrunked +nontruth +nontuberculous +nontuned +nonturbinated +nontutorial +nontyphoidal +nontypical +nontypicalness +nontypographical +nontyrannical +nonubiquitous +nonulcerous +nonultrafilterable +nonumbilical +nonumbilicate +nonumbrellaed +nonunanimous +nonuncial +nonundergraduate +nonunderstandable +nonunderstanding +nonunderstandingly +nonunderstood +nonundulatory +nonuniform +nonuniformist +nonuniformitarian +nonuniformity +nonuniformly +nonunion +nonunionism +nonunionist +nonunique +nonunison +nonunited +nonuniversal +nonuniversity +nonupholstered +nonuple +nonuplet +nonupright +nonurban +nonurgent +nonusage +nonuse +nonuser +nonusing +nonusurping +nonuterine +nonutile +nonutilitarian +nonutility +nonutilized +nonutterance +nonvacant +nonvaccination +nonvacuous +nonvaginal +nonvalent +nonvalidity +nonvaluation +nonvalve +nonvanishing +nonvariable +nonvariant +nonvariation +nonvascular +nonvassal +nonvegetative +nonvenereal +nonvenomous +nonvenous +nonventilation +nonverbal +nonverdict +nonverminous +nonvernacular +nonvertebral +nonvertical +nonvertically +nonvesicular +nonvesting +nonvesture +nonveteran +nonveterinary +nonviable +nonvibratile +nonvibration +nonvibrator +nonvibratory +nonvicarious +nonvictory +nonvillager +nonvillainous +nonvindication +nonvinous +nonvintage +nonviolation +nonviolence +nonvirginal +nonvirile +nonvirtue +nonvirtuous +nonvirulent +nonviruliferous +nonvisaed +nonvisceral +nonviscid +nonviscous +nonvisional +nonvisitation +nonvisiting +nonvisual +nonvisualized +nonvital +nonvitreous +nonvitrified +nonviviparous +nonvocal +nonvocalic +nonvocational +nonvolant +nonvolatile +nonvolatilized +nonvolcanic +nonvolition +nonvoluntary +nonvortical +nonvortically +nonvoter +nonvoting +nonvulcanizable +nonvulvar +nonwalking +nonwar +nonwasting +nonwatertight +nonweakness +nonwestern +nonwetted +nonwhite +nonwinged +nonwoody +nonworker +nonworking +nonworship +nonwrinkleable +nonya +nonyielding +nonyl +nonylene +nonylenic +nonylic +nonzealous +nonzero +nonzodiacal +nonzonal +nonzonate +nonzoological +noodle +noodledom +noodleism +nook +nooked +nookery +nooking +nooklet +nooklike +nooky +noological +noologist +noology +noometry +noon +noonday +noonflower +nooning +noonlight +noonlit +noonstead +noontide +noontime +noonwards +noop +nooscopic +noose +nooser +Nootka +nopal +Nopalea +nopalry +nope +nopinene +nor +Nora +Norah +norard +norate +noration +norbergite +Norbertine +norcamphane +nordcaper +nordenskioldine +Nordic +Nordicism +Nordicist +Nordicity +Nordicization +Nordicize +nordmarkite +noreast +noreaster +norelin +Norfolk +Norfolkian +norgine +nori +noria +Noric +norie +norimon +norite +norland +norlander +norlandism +norleucine +norm +norma +normal +normalcy +normalism +normalist +normality +normalization +normalize +normalizer +normally +normalness +Norman +Normanesque +Normanish +Normanism +Normanist +Normanization +Normanize +Normanizer +Normanly +Normannic +normated +normative +normatively +normativeness +normless +normoblast +normoblastic +normocyte +normocytic +normotensive +Norn +Norna +nornicotine +nornorwest +noropianic +norpinic +Norridgewock +Norroway +Norroy +Norse +norsel +Norseland +norseler +Norseman +Norsk +north +northbound +northeast +northeaster +northeasterly +northeastern +northeasternmost +northeastward +northeastwardly +northeastwards +norther +northerliness +northerly +northern +northerner +northernize +northernly +northernmost +northernness +northest +northfieldite +northing +northland +northlander +northlight +Northman +northmost +northness +Northumber +Northumbrian +northupite +northward +northwardly +northwards +northwest +northwester +northwesterly +northwestern +northwestward +northwestwardly +northwestwards +Norumbega +norward +norwards +Norway +Norwegian +norwest +norwester +norwestward +Nosairi +Nosairian +nosarian +nose +nosean +noseanite +noseband +nosebanded +nosebleed +nosebone +noseburn +nosed +nosegay +nosegaylike +noseherb +nosehole +noseless +noselessly +noselessness +noselike +noselite +Nosema +Nosematidae +nosepiece +nosepinch +noser +nosesmart +nosethirl +nosetiology +nosewards +nosewheel +nosewise +nosey +nosine +nosing +nosism +nosocomial +nosocomium +nosogenesis +nosogenetic +nosogenic +nosogeny +nosogeography +nosographer +nosographic +nosographical +nosographically +nosography +nosohaemia +nosohemia +nosological +nosologically +nosologist +nosology +nosomania +nosomycosis +nosonomy +nosophobia +nosophyte +nosopoetic +nosopoietic +nosotaxy +nosotrophy +nostalgia +nostalgic +nostalgically +nostalgy +nostic +Nostoc +Nostocaceae +nostocaceous +nostochine +nostologic +nostology +nostomania +Nostradamus +nostrificate +nostrification +nostril +nostriled +nostrility +nostrilsome +nostrum +nostrummonger +nostrummongership +nostrummongery +Nosu +nosy +not +notabilia +notability +notable +notableness +notably +notacanthid +Notacanthidae +notacanthoid +notacanthous +Notacanthus +notaeal +notaeum +notal +notalgia +notalgic +Notalia +notan +notandum +notanencephalia +notarial +notarially +notariate +notarikon +notarize +notary +notaryship +notate +notation +notational +notative +notator +notch +notchboard +notched +notchel +notcher +notchful +notching +notchweed +notchwing +notchy +note +notebook +notecase +noted +notedly +notedness +notehead +noteholder +notekin +Notelaea +noteless +notelessly +notelessness +notelet +notencephalocele +notencephalus +noter +notewise +noteworthily +noteworthiness +noteworthy +notharctid +Notharctidae +Notharctus +nother +nothing +nothingarian +nothingarianism +nothingism +nothingist +nothingize +nothingless +nothingly +nothingness +nothingology +Nothofagus +Notholaena +nothosaur +Nothosauri +nothosaurian +Nothosauridae +Nothosaurus +nothous +notice +noticeability +noticeable +noticeably +noticer +Notidani +notidanian +notidanid +Notidanidae +notidanidan +notidanoid +Notidanus +notifiable +notification +notified +notifier +notify +notifyee +notion +notionable +notional +notionalist +notionality +notionally +notionalness +notionary +notionate +notioned +notionist +notionless +Notiosorex +notitia +Notkerian +notocentrous +notocentrum +notochord +notochordal +notodontian +notodontid +Notodontidae +notodontoid +Notogaea +Notogaeal +Notogaean +Notogaeic +notommatid +Notommatidae +Notonecta +notonectal +notonectid +Notonectidae +notopodial +notopodium +notopterid +Notopteridae +notopteroid +Notopterus +notorhizal +Notorhynchus +notoriety +notorious +notoriously +notoriousness +Notornis +Notoryctes +Notostraca +Nototherium +Nototrema +nototribe +notour +notourly +Notropis +notself +Nottoway +notum +Notungulata +notungulate +Notus +notwithstanding +nougat +nougatine +nought +noumeaite +noumeite +noumenal +noumenalism +noumenalist +noumenality +noumenalize +noumenally +noumenism +noumenon +noun +nounal +nounally +nounize +nounless +noup +nourice +nourish +nourishable +nourisher +nourishing +nourishingly +nourishment +nouriture +nous +nouther +nova +novaculite +novalia +Novanglian +Novanglican +novantique +novarsenobenzene +novate +Novatian +Novatianism +Novatianist +novation +novative +novator +novatory +novatrix +novcic +novel +novelcraft +noveldom +novelese +novelesque +novelet +novelette +noveletter +novelettish +novelettist +noveletty +novelish +novelism +novelist +novelistic +novelistically +novelization +novelize +novella +novelless +novellike +novelly +novelmongering +novelness +novelry +novelty +novelwright +novem +novemarticulate +November +Novemberish +novemcostate +novemdigitate +novemfid +novemlobate +novemnervate +novemperfoliate +novena +novenary +novendial +novene +novennial +novercal +Novial +novice +novicehood +novicelike +noviceship +noviciate +novilunar +novitial +novitiate +novitiateship +novitiation +novity +Novocain +novodamus +now +nowaday +nowadays +nowanights +noway +noways +nowed +nowel +nowhat +nowhen +nowhence +nowhere +nowhereness +nowheres +nowhit +nowhither +nowise +nowness +Nowroze +nowt +nowy +noxa +noxal +noxally +noxious +noxiously +noxiousness +noy +noyade +noyau +Nozi +nozzle +nozzler +nth +nu +nuance +nub +Nuba +nubbin +nubble +nubbling +nubbly +nubby +nubecula +nubia +Nubian +nubiferous +nubiform +nubigenous +nubilate +nubilation +nubile +nubility +nubilous +Nubilum +nucal +nucament +nucamentaceous +nucellar +nucellus +nucha +nuchal +nuchalgia +nuciculture +nuciferous +nuciform +nucin +nucivorous +nucleal +nuclear +nucleary +nuclease +nucleate +nucleation +nucleator +nuclei +nucleiferous +nucleiform +nuclein +nucleinase +nucleoalbumin +nucleoalbuminuria +nucleofugal +nucleohistone +nucleohyaloplasm +nucleohyaloplasma +nucleoid +nucleoidioplasma +nucleolar +nucleolated +nucleole +nucleoli +nucleolinus +nucleolocentrosome +nucleoloid +nucleolus +nucleolysis +nucleomicrosome +nucleon +nucleone +nucleonics +nucleopetal +nucleoplasm +nucleoplasmatic +nucleoplasmic +nucleoprotein +nucleoside +nucleotide +nucleus +nuclide +nuclidic +Nucula +Nuculacea +nuculanium +nucule +nuculid +Nuculidae +nuculiform +nuculoid +Nuda +nudate +nudation +Nudd +nuddle +nude +nudely +nudeness +Nudens +nudge +nudger +nudibranch +Nudibranchia +nudibranchian +nudibranchiate +nudicaudate +nudicaul +nudifier +nudiflorous +nudiped +nudish +nudism +nudist +nuditarian +nudity +nugacious +nugaciousness +nugacity +nugator +nugatoriness +nugatory +nuggar +nugget +nuggety +nugify +nugilogue +Nugumiut +nuisance +nuisancer +nuke +Nukuhivan +nul +null +nullable +nullah +nullibicity +nullibility +nullibiquitous +nullibist +nullification +nullificationist +nullificator +nullifidian +nullifier +nullify +nullipara +nulliparity +nulliparous +nullipennate +Nullipennes +nulliplex +nullipore +nulliporous +nullism +nullisome +nullisomic +nullity +nulliverse +nullo +Numa +Numantine +numb +number +numberable +numberer +numberful +numberless +numberous +numbersome +numbfish +numbing +numbingly +numble +numbles +numbly +numbness +numda +numdah +numen +Numenius +numerable +numerableness +numerably +numeral +numerant +numerary +numerate +numeration +numerative +numerator +numerical +numerically +numericalness +numerist +numero +numerology +numerose +numerosity +numerous +numerously +numerousness +Numida +Numidae +Numidian +Numididae +Numidinae +numinism +numinous +numinously +numismatic +numismatical +numismatically +numismatician +numismatics +numismatist +numismatography +numismatologist +numismatology +nummary +nummi +nummiform +nummular +Nummularia +nummulary +nummulated +nummulation +nummuline +Nummulinidae +nummulite +Nummulites +nummulitic +Nummulitidae +nummulitoid +nummuloidal +nummus +numskull +numskulled +numskulledness +numskullery +numskullism +numud +nun +nunatak +nunbird +nunch +nuncheon +nunciate +nunciative +nunciatory +nunciature +nuncio +nuncioship +nuncle +nuncupate +nuncupation +nuncupative +nuncupatively +nundinal +nundination +nundine +nunhood +Nunki +nunky +nunlet +nunlike +nunnari +nunnated +nunnation +nunnery +nunni +nunnify +nunnish +nunnishness +nunship +Nupe +Nuphar +nuptial +nuptiality +nuptialize +nuptially +nuptials +nuque +nuraghe +nurhag +nurly +nursable +nurse +nursedom +nursegirl +nursehound +nursekeeper +nursekin +nurselet +nurselike +nursemaid +nurser +nursery +nurserydom +nurseryful +nurserymaid +nurseryman +nursetender +nursing +nursingly +nursle +nursling +nursy +nurturable +nurtural +nurture +nurtureless +nurturer +nurtureship +Nusairis +Nusakan +nusfiah +nut +nutant +nutarian +nutate +nutation +nutational +nutbreaker +nutcake +nutcrack +nutcracker +nutcrackers +nutcrackery +nutgall +nuthatch +nuthook +nutjobber +nutlet +nutlike +nutmeg +nutmegged +nutmeggy +nutpecker +nutpick +nutramin +nutria +nutrice +nutricial +nutricism +nutrient +nutrify +nutriment +nutrimental +nutritial +nutrition +nutritional +nutritionally +nutritionist +nutritious +nutritiously +nutritiousness +nutritive +nutritively +nutritiveness +nutritory +nutseed +nutshell +Nuttallia +nuttalliasis +nuttalliosis +nutted +nutter +nuttery +nuttily +nuttiness +nutting +nuttish +nuttishness +nutty +nuzzer +nuzzerana +nuzzle +Nyamwezi +Nyanja +nyanza +Nyaya +nychthemer +nychthemeral +nychthemeron +Nyctaginaceae +nyctaginaceous +Nyctaginia +nyctalope +nyctalopia +nyctalopic +nyctalopy +Nyctanthes +Nyctea +Nyctereutes +nycteribiid +Nycteribiidae +Nycteridae +nycterine +Nycteris +Nycticorax +Nyctimene +nyctinastic +nyctinasty +nyctipelagic +Nyctipithecinae +nyctipithecine +Nyctipithecus +nyctitropic +nyctitropism +nyctophobia +nycturia +Nydia +nye +nylast +nylon +nymil +nymph +nympha +nymphae +Nymphaea +Nymphaeaceae +nymphaeaceous +nymphaeum +nymphal +nymphalid +Nymphalidae +Nymphalinae +nymphaline +nympheal +nymphean +nymphet +nymphic +nymphical +nymphid +nymphine +Nymphipara +nymphiparous +nymphish +nymphitis +nymphlike +nymphlin +nymphly +Nymphoides +nympholepsia +nympholepsy +nympholept +nympholeptic +nymphomania +nymphomaniac +nymphomaniacal +Nymphonacea +nymphosis +nymphotomy +nymphwise +Nyoro +Nyroca +Nyssa +Nyssaceae +nystagmic +nystagmus +nyxis +O +o +oadal +oaf +oafdom +oafish +oafishly +oafishness +oak +oakberry +Oakboy +oaken +oakenshaw +Oakesia +oaklet +oaklike +oakling +oaktongue +oakum +oakweb +oakwood +oaky +oam +Oannes +oar +oarage +oarcock +oared +oarfish +oarhole +oarial +oarialgia +oaric +oariocele +oariopathic +oariopathy +oariotomy +oaritic +oaritis +oarium +oarless +oarlike +oarlock +oarlop +oarman +oarsman +oarsmanship +oarswoman +oarweed +oary +oasal +oasean +oases +oasis +oasitic +oast +oasthouse +oat +oatbin +oatcake +oatear +oaten +oatenmeal +oatfowl +oath +oathay +oathed +oathful +oathlet +oathworthy +oatland +oatlike +oatmeal +oatseed +oaty +Obadiah +obambulate +obambulation +obambulatory +oban +Obbenite +obbligato +obclavate +obclude +obcompressed +obconical +obcordate +obcordiform +obcuneate +obdeltoid +obdiplostemonous +obdiplostemony +obdormition +obduction +obduracy +obdurate +obdurately +obdurateness +obduration +obe +obeah +obeahism +obeche +obedience +obediency +obedient +obediential +obedientially +obedientialness +obedientiar +obedientiary +obediently +obeisance +obeisant +obeisantly +obeism +obelia +obeliac +obelial +obelion +obeliscal +obeliscar +obelisk +obeliskoid +obelism +obelize +obelus +Oberon +obese +obesely +obeseness +obesity +obex +obey +obeyable +obeyer +obeyingly +obfuscable +obfuscate +obfuscation +obfuscator +obfuscity +obfuscous +obi +Obidicut +obispo +obit +obitual +obituarian +obituarily +obituarist +obituarize +obituary +object +objectable +objectation +objectative +objectee +objecthood +objectification +objectify +objection +objectionability +objectionable +objectionableness +objectionably +objectional +objectioner +objectionist +objectival +objectivate +objectivation +objective +objectively +objectiveness +objectivism +objectivist +objectivistic +objectivity +objectivize +objectization +objectize +objectless +objectlessly +objectlessness +objector +objicient +objuration +objure +objurgate +objurgation +objurgative +objurgatively +objurgator +objurgatorily +objurgatory +objurgatrix +oblanceolate +oblate +oblately +oblateness +oblation +oblational +oblationary +oblatory +oblectate +oblectation +obley +obligable +obligancy +obligant +obligate +obligation +obligational +obligative +obligativeness +obligator +obligatorily +obligatoriness +obligatory +obligatum +oblige +obliged +obligedly +obligedness +obligee +obligement +obliger +obliging +obligingly +obligingness +obligistic +obligor +obliquangular +obliquate +obliquation +oblique +obliquely +obliqueness +obliquitous +obliquity +obliquus +obliterable +obliterate +obliteration +obliterative +obliterator +oblivescence +oblivial +obliviality +oblivion +oblivionate +oblivionist +oblivionize +oblivious +obliviously +obliviousness +obliviscence +obliviscible +oblocutor +oblong +oblongatal +oblongated +oblongish +oblongitude +oblongitudinal +oblongly +oblongness +obloquial +obloquious +obloquy +obmutescence +obmutescent +obnebulate +obnounce +obnoxiety +obnoxious +obnoxiously +obnoxiousness +obnubilate +obnubilation +obnunciation +oboe +oboist +obol +Obolaria +obolary +obole +obolet +obolus +obomegoid +Obongo +oboval +obovate +obovoid +obpyramidal +obpyriform +Obrazil +obreption +obreptitious +obreptitiously +obrogate +obrogation +obrotund +obscene +obscenely +obsceneness +obscenity +obscurancy +obscurant +obscurantic +obscurantism +obscurantist +obscuration +obscurative +obscure +obscuredly +obscurely +obscurement +obscureness +obscurer +obscurism +obscurist +obscurity +obsecrate +obsecration +obsecrationary +obsecratory +obsede +obsequence +obsequent +obsequial +obsequience +obsequiosity +obsequious +obsequiously +obsequiousness +obsequity +obsequium +obsequy +observability +observable +observableness +observably +observance +observancy +observandum +observant +Observantine +Observantist +observantly +observantness +observation +observational +observationalism +observationally +observative +observatorial +observatory +observe +observedly +observer +observership +observing +observingly +obsess +obsessingly +obsession +obsessional +obsessionist +obsessive +obsessor +obsidian +obsidianite +obsidional +obsidionary +obsidious +obsignate +obsignation +obsignatory +obsolesce +obsolescence +obsolescent +obsolescently +obsolete +obsoletely +obsoleteness +obsoletion +obsoletism +obstacle +obstetric +obstetrical +obstetrically +obstetricate +obstetrication +obstetrician +obstetrics +obstetricy +obstetrist +obstetrix +obstinacious +obstinacy +obstinance +obstinate +obstinately +obstinateness +obstination +obstinative +obstipation +obstreperate +obstreperosity +obstreperous +obstreperously +obstreperousness +obstriction +obstringe +obstruct +obstructant +obstructedly +obstructer +obstructingly +obstruction +obstructionism +obstructionist +obstructive +obstructively +obstructiveness +obstructivism +obstructivity +obstructor +obstruent +obstupefy +obtain +obtainable +obtainal +obtainance +obtainer +obtainment +obtect +obtected +obtemper +obtemperate +obtenebrate +obtenebration +obtention +obtest +obtestation +obtriangular +obtrude +obtruder +obtruncate +obtruncation +obtruncator +obtrusion +obtrusionist +obtrusive +obtrusively +obtrusiveness +obtund +obtundent +obtunder +obtundity +obturate +obturation +obturator +obturatory +obturbinate +obtusangular +obtuse +obtusely +obtuseness +obtusifid +obtusifolious +obtusilingual +obtusilobous +obtusion +obtusipennate +obtusirostrate +obtusish +obtusity +obumbrant +obumbrate +obumbration +obvallate +obvelation +obvention +obverse +obversely +obversion +obvert +obvertend +obviable +obviate +obviation +obviative +obviator +obvious +obviously +obviousness +obvolute +obvoluted +obvolution +obvolutive +obvolve +obvolvent +ocarina +Occamism +Occamist +Occamistic +Occamite +occamy +occasion +occasionable +occasional +occasionalism +occasionalist +occasionalistic +occasionality +occasionally +occasionalness +occasionary +occasioner +occasionless +occasive +occident +occidental +Occidentalism +Occidentalist +occidentality +Occidentalization +Occidentalize +occidentally +occiduous +occipital +occipitalis +occipitally +occipitoanterior +occipitoatlantal +occipitoatloid +occipitoaxial +occipitoaxoid +occipitobasilar +occipitobregmatic +occipitocalcarine +occipitocervical +occipitofacial +occipitofrontal +occipitofrontalis +occipitohyoid +occipitoiliac +occipitomastoid +occipitomental +occipitonasal +occipitonuchal +occipitootic +occipitoparietal +occipitoposterior +occipitoscapular +occipitosphenoid +occipitosphenoidal +occipitotemporal +occipitothalamic +occiput +occitone +occlude +occludent +occlusal +occluse +occlusion +occlusive +occlusiveness +occlusocervical +occlusocervically +occlusogingival +occlusometer +occlusor +occult +occultate +occultation +occulter +occulting +occultism +occultist +occultly +occultness +occupable +occupance +occupancy +occupant +occupation +occupational +occupationalist +occupationally +occupationless +occupative +occupiable +occupier +occupy +occur +occurrence +occurrent +occursive +ocean +oceaned +oceanet +oceanful +Oceanian +oceanic +Oceanican +oceanity +oceanographer +oceanographic +oceanographical +oceanographically +oceanographist +oceanography +oceanology +oceanophyte +oceanside +oceanward +oceanwards +oceanways +oceanwise +ocellar +ocellary +ocellate +ocellated +ocellation +ocelli +ocellicyst +ocellicystic +ocelliferous +ocelliform +ocelligerous +ocellus +oceloid +ocelot +och +ochava +ochavo +ocher +ocherish +ocherous +ochery +ochidore +ochlesis +ochlesitic +ochletic +ochlocracy +ochlocrat +ochlocratic +ochlocratical +ochlocratically +ochlophobia +ochlophobist +Ochna +Ochnaceae +ochnaceous +ochone +Ochotona +Ochotonidae +Ochozoma +ochraceous +Ochrana +ochrea +ochreate +ochreous +ochro +ochrocarpous +ochroid +ochroleucous +ochrolite +Ochroma +ochronosis +ochronosus +ochronotic +ochrous +ocht +Ocimum +ock +oclock +Ocneria +ocote +Ocotea +ocotillo +ocque +ocracy +ocrea +ocreaceous +Ocreatae +ocreate +ocreated +octachloride +octachord +octachordal +octachronous +Octacnemus +octacolic +octactinal +octactine +Octactiniae +octactinian +octad +octadecahydrate +octadecane +octadecanoic +octadecyl +octadic +octadrachm +octaemeron +octaeteric +octaeterid +octagon +octagonal +octagonally +octahedral +octahedric +octahedrical +octahedrite +octahedroid +octahedron +octahedrous +octahydrate +octahydrated +octakishexahedron +octamerism +octamerous +octameter +octan +octanaphthene +Octandria +octandrian +octandrious +octane +octangle +octangular +octangularness +Octans +octant +octantal +octapla +octaploid +octaploidic +octaploidy +octapodic +octapody +octarch +octarchy +octarius +octarticulate +octary +octasemic +octastich +octastichon +octastrophic +octastyle +octastylos +octateuch +octaval +octavalent +octavarium +octave +Octavia +Octavian +octavic +octavina +Octavius +octavo +octenary +octene +octennial +octennially +octet +octic +octillion +octillionth +octine +octingentenary +octoad +octoalloy +octoate +octobass +October +octobrachiate +Octobrist +octocentenary +octocentennial +octochord +Octocoralla +octocorallan +Octocorallia +octocoralline +octocotyloid +octodactyl +octodactyle +octodactylous +octodecimal +octodecimo +octodentate +octodianome +Octodon +octodont +Octodontidae +Octodontinae +octoechos +octofid +octofoil +octofoiled +octogamy +octogenarian +octogenarianism +octogenary +octogild +octoglot +Octogynia +octogynian +octogynious +octogynous +octoic +octoid +octolateral +octolocular +octomeral +octomerous +octometer +octonal +octonare +octonarian +octonarius +octonary +octonematous +octonion +octonocular +octoon +octopartite +octopean +octoped +octopede +octopetalous +octophthalmous +octophyllous +octopi +octopine +octoploid +octoploidic +octoploidy +octopod +Octopoda +octopodan +octopodes +octopodous +octopolar +octopus +octoradial +octoradiate +octoradiated +octoreme +octoroon +octose +octosepalous +octospermous +octospore +octosporous +octostichous +octosyllabic +octosyllable +octovalent +octoyl +octroi +octroy +octuor +octuple +octuplet +octuplex +octuplicate +octuplication +octuply +octyl +octylene +octyne +ocuby +ocular +ocularist +ocularly +oculary +oculate +oculated +oculauditory +oculiferous +oculiform +oculigerous +Oculina +oculinid +Oculinidae +oculinoid +oculist +oculistic +oculocephalic +oculofacial +oculofrontal +oculomotor +oculomotory +oculonasal +oculopalpebral +oculopupillary +oculospinal +oculozygomatic +oculus +ocydrome +ocydromine +Ocydromus +Ocypete +Ocypoda +ocypodan +Ocypode +ocypodian +Ocypodidae +ocypodoid +Ocyroe +Ocyroidae +Od +od +oda +Odacidae +odacoid +odal +odalborn +odalisk +odalisque +odaller +odalman +odalwoman +Odax +odd +oddish +oddity +oddlegs +oddly +oddman +oddment +oddments +oddness +Odds +odds +Oddsbud +oddsman +ode +odel +odelet +Odelsthing +Odelsting +odeon +odeum +odic +odically +Odin +Odinian +Odinic +Odinism +Odinist +odinite +Odinitic +odiometer +odious +odiously +odiousness +odist +odium +odiumproof +Odobenidae +Odobenus +Odocoileus +odograph +odology +odometer +odometrical +odometry +Odonata +odontagra +odontalgia +odontalgic +Odontaspidae +Odontaspididae +Odontaspis +odontatrophia +odontatrophy +odontexesis +odontiasis +odontic +odontist +odontitis +odontoblast +odontoblastic +odontocele +Odontocete +odontocete +Odontoceti +odontocetous +odontochirurgic +odontoclasis +odontoclast +odontodynia +odontogen +odontogenesis +odontogenic +odontogeny +Odontoglossae +odontoglossal +odontoglossate +Odontoglossum +Odontognathae +odontognathic +odontognathous +odontograph +odontographic +odontography +odontohyperesthesia +odontoid +Odontolcae +odontolcate +odontolcous +odontolite +odontolith +odontological +odontologist +odontology +odontoloxia +odontoma +odontomous +odontonecrosis +odontoneuralgia +odontonosology +odontopathy +odontophoral +odontophore +Odontophoridae +Odontophorinae +odontophorine +odontophorous +Odontophorus +odontoplast +odontoplerosis +Odontopteris +Odontopteryx +odontorhynchous +Odontormae +Odontornithes +odontornithic +odontorrhagia +odontorthosis +odontoschism +odontoscope +odontosis +odontostomatous +odontostomous +Odontosyllis +odontotechny +odontotherapia +odontotherapy +odontotomy +Odontotormae +odontotripsis +odontotrypy +odoom +odophone +odor +odorant +odorate +odorator +odored +odorful +odoriferant +odoriferosity +odoriferous +odoriferously +odoriferousness +odorific +odorimeter +odorimetry +odoriphore +odorivector +odorize +odorless +odorometer +odorosity +odorous +odorously +odorousness +odorproof +Odostemon +Ods +odso +odum +odyl +odylic +odylism +odylist +odylization +odylize +Odynerus +Odyssean +Odyssey +Odz +Odzookers +Odzooks +oe +Oecanthus +oecist +oecodomic +oecodomical +oecoparasite +oecoparasitism +oecophobia +oecumenian +oecumenic +oecumenical +oecumenicalism +oecumenicity +oecus +oedemerid +Oedemeridae +oedicnemine +Oedicnemus +Oedipal +Oedipean +Oedipus +Oedogoniaceae +oedogoniaceous +Oedogoniales +Oedogonium +oenanthaldehyde +oenanthate +Oenanthe +oenanthic +oenanthol +oenanthole +oenanthyl +oenanthylate +oenanthylic +oenin +Oenocarpus +oenochoe +oenocyte +oenocytic +oenolin +oenological +oenologist +oenology +oenomancy +Oenomaus +oenomel +oenometer +oenophilist +oenophobist +oenopoetic +Oenothera +Oenotheraceae +oenotheraceous +Oenotrian +oer +oersted +oes +oesophageal +oesophagi +oesophagismus +oesophagostomiasis +Oesophagostomum +oesophagus +oestradiol +Oestrelata +oestrian +oestriasis +oestrid +Oestridae +oestrin +oestriol +oestroid +oestrous +oestrual +oestruate +oestruation +oestrum +oestrus +of +off +offal +offaling +offbeat +offcast +offcome +offcut +offend +offendable +offendant +offended +offendedly +offendedness +offender +offendible +offendress +offense +offenseful +offenseless +offenselessly +offenseproof +offensible +offensive +offensively +offensiveness +offer +offerable +offeree +offerer +offering +offeror +offertorial +offertory +offgoing +offgrade +offhand +offhanded +offhandedly +offhandedness +office +officeholder +officeless +officer +officerage +officeress +officerhood +officerial +officerism +officerless +officership +official +officialdom +officialese +officialism +officiality +officialization +officialize +officially +officialty +officiant +officiary +officiate +officiation +officiator +officinal +officinally +officious +officiously +officiousness +offing +offish +offishly +offishness +offlet +offlook +offprint +offsaddle +offscape +offscour +offscourer +offscouring +offscum +offset +offshoot +offshore +offsider +offspring +offtake +offtype +offuscate +offuscation +offward +offwards +oflete +Ofo +oft +often +oftenness +oftens +oftentime +oftentimes +ofter +oftest +oftly +oftness +ofttime +ofttimes +oftwhiles +Og +ogaire +Ogallala +ogam +ogamic +Ogboni +Ogcocephalidae +Ogcocephalus +ogdoad +ogdoas +ogee +ogeed +ogganition +ogham +oghamic +Oghuz +ogival +ogive +ogived +Oglala +ogle +ogler +ogmic +Ogor +Ogpu +ogre +ogreish +ogreishly +ogreism +ogress +ogrish +ogrism +ogtiern +ogum +Ogygia +Ogygian +oh +ohelo +ohia +Ohio +Ohioan +ohm +ohmage +ohmic +ohmmeter +oho +ohoy +oidioid +oidiomycosis +oidiomycotic +Oidium +oii +oikology +oikoplast +oil +oilberry +oilbird +oilcan +oilcloth +oilcoat +oilcup +oildom +oiled +oiler +oilery +oilfish +oilhole +oilily +oiliness +oilless +oillessness +oillet +oillike +oilman +oilmonger +oilmongery +oilometer +oilpaper +oilproof +oilproofing +oilseed +oilskin +oilskinned +oilstock +oilstone +oilstove +oiltight +oiltightness +oilway +oily +oilyish +oime +oinochoe +oinology +oinomancy +oinomania +oinomel +oint +ointment +Oireachtas +oisin +oisivity +oitava +oiticica +Ojibwa +Ojibway +Ok +oka +okapi +Okapia +okee +okenite +oket +oki +okia +Okie +Okinagan +Oklafalaya +Oklahannali +Oklahoma +Oklahoman +okoniosis +okonite +okra +okrug +okshoofd +okthabah +Okuari +okupukupu +Olacaceae +olacaceous +olam +olamic +Olax +Olcha +Olchi +old +olden +Oldenburg +older +oldermost +oldfangled +oldfangledness +Oldfieldia +Oldhamia +oldhamite +oldhearted +oldish +oldland +oldness +oldster +oldwife +Olea +Oleaceae +oleaceous +Oleacina +Oleacinidae +oleaginous +oleaginousness +oleana +oleander +oleandrin +Olearia +olease +oleaster +oleate +olecranal +olecranarthritis +olecranial +olecranian +olecranoid +olecranon +olefiant +olefin +olefine +olefinic +oleic +oleiferous +olein +olena +olenellidian +Olenellus +olenid +Olenidae +olenidian +olent +Olenus +oleo +oleocalcareous +oleocellosis +oleocyst +oleoduct +oleograph +oleographer +oleographic +oleography +oleomargaric +oleomargarine +oleometer +oleoptene +oleorefractometer +oleoresin +oleoresinous +oleosaccharum +oleose +oleosity +oleostearate +oleostearin +oleothorax +oleous +Oleraceae +oleraceous +olericultural +olericulturally +olericulture +Oleron +Olethreutes +olethreutid +Olethreutidae +olfact +olfactible +olfaction +olfactive +olfactology +olfactometer +olfactometric +olfactometry +olfactor +olfactorily +olfactory +olfacty +Olga +oliban +olibanum +olid +oligacanthous +oligaemia +oligandrous +oliganthous +oligarch +oligarchal +oligarchic +oligarchical +oligarchically +oligarchism +oligarchist +oligarchize +oligarchy +oligemia +oligidria +oligist +oligistic +oligistical +oligocarpous +Oligocene +Oligochaeta +oligochaete +oligochaetous +oligochete +oligocholia +oligochrome +oligochromemia +oligochronometer +oligochylia +oligoclase +oligoclasite +oligocystic +oligocythemia +oligocythemic +oligodactylia +oligodendroglia +oligodendroglioma +oligodipsia +oligodontous +oligodynamic +oligogalactia +oligohemia +oligohydramnios +oligolactia +oligomenorrhea +oligomerous +oligomery +oligometochia +oligometochic +Oligomyodae +oligomyodian +oligomyoid +Oligonephria +oligonephric +oligonephrous +oligonite +oligopepsia +oligopetalous +oligophagous +oligophosphaturia +oligophrenia +oligophrenic +oligophyllous +oligoplasmia +oligopnea +oligopolistic +oligopoly +oligoprothesy +oligoprothetic +oligopsonistic +oligopsony +oligopsychia +oligopyrene +oligorhizous +oligosepalous +oligosialia +oligosideric +oligosiderite +oligosite +oligospermia +oligospermous +oligostemonous +oligosyllabic +oligosyllable +oligosynthetic +oligotokous +oligotrichia +oligotrophic +oligotrophy +oligotropic +oliguresis +oliguretic +oliguria +Olinia +Oliniaceae +oliniaceous +olio +oliphant +oliprance +olitory +Oliva +oliva +olivaceous +olivary +Olive +olive +Olivean +olived +Olivella +oliveness +olivenite +Oliver +Oliverian +oliverman +oliversmith +olivescent +olivet +Olivetan +Olivette +olivewood +Olivia +Olividae +oliviferous +oliviform +olivil +olivile +olivilin +olivine +olivinefels +olivinic +olivinite +olivinitic +olla +ollamh +ollapod +ollenite +Ollie +ollock +olm +Olneya +ological +ologist +ologistic +ology +olomao +olona +Olonets +Olonetsian +Olonetsish +Olor +oloroso +olpe +Olpidiaster +Olpidium +oltonde +oltunna +olycook +olykoek +Olympia +Olympiad +Olympiadic +Olympian +Olympianism +Olympianize +Olympianly +Olympianwise +Olympic +Olympicly +Olympicness +Olympieion +Olympionic +Olympus +Olynthiac +Olynthian +Olynthus +om +omadhaun +omagra +Omagua +Omaha +omalgia +Oman +Omani +omao +omarthritis +omasitis +omasum +omber +ombrette +ombrifuge +ombrograph +ombrological +ombrology +ombrometer +ombrophile +ombrophilic +ombrophilous +ombrophily +ombrophobe +ombrophobous +ombrophoby +ombrophyte +omega +omegoid +omelet +omelette +omen +omened +omenology +omental +omentectomy +omentitis +omentocele +omentofixation +omentopexy +omentoplasty +omentorrhaphy +omentosplenopexy +omentotomy +omentulum +omentum +omer +omicron +omina +ominous +ominously +ominousness +omissible +omission +omissive +omissively +omit +omitis +omittable +omitter +omlah +Ommastrephes +Ommastrephidae +ommateal +ommateum +ommatidial +ommatidium +ommatophore +ommatophorous +Ommiad +Ommiades +omneity +omniactive +omniactuality +omniana +omniarch +omnibenevolence +omnibenevolent +omnibus +omnibusman +omnicausality +omnicompetence +omnicompetent +omnicorporeal +omnicredulity +omnicredulous +omnidenominational +omnierudite +omniessence +omnifacial +omnifarious +omnifariously +omnifariousness +omniferous +omnific +omnificent +omnifidel +omniform +omniformal +omniformity +omnify +omnigenous +omnigerent +omnigraph +omnihuman +omnihumanity +omnilegent +omnilingual +omniloquent +omnilucent +omnimental +omnimeter +omnimode +omnimodous +omninescience +omninescient +omniparent +omniparient +omniparity +omniparous +omnipatient +omnipercipience +omnipercipiency +omnipercipient +omniperfect +omnipotence +omnipotency +omnipotent +omnipotentiality +omnipotently +omnipregnant +omnipresence +omnipresent +omnipresently +omniprevalence +omniprevalent +omniproduction +omniprudent +omnirange +omniregency +omnirepresentative +omnirepresentativeness +omnirevealing +omniscience +omnisciency +omniscient +omnisciently +omniscope +omniscribent +omniscriptive +omnisentience +omnisentient +omnisignificance +omnisignificant +omnispective +omnist +omnisufficiency +omnisufficient +omnitemporal +omnitenent +omnitolerant +omnitonal +omnitonality +omnitonic +omnitude +omnium +omnivagant +omnivalence +omnivalent +omnivalous +omnivarious +omnividence +omnivident +omnivision +omnivolent +Omnivora +omnivoracious +omnivoracity +omnivorant +omnivore +omnivorous +omnivorously +omnivorousness +omodynia +omohyoid +omoideum +omophagia +omophagist +omophagous +omophagy +omophorion +omoplate +omoplatoscopy +omostegite +omosternal +omosternum +omphacine +omphacite +omphalectomy +omphalic +omphalism +omphalitis +omphalocele +omphalode +omphalodium +omphalogenous +omphaloid +omphaloma +omphalomesaraic +omphalomesenteric +omphaloncus +omphalopagus +omphalophlebitis +omphalopsychic +omphalopsychite +omphalorrhagia +omphalorrhea +omphalorrhexis +omphalos +omphalosite +omphaloskepsis +omphalospinous +omphalotomy +omphalotripsy +omphalus +on +Ona +ona +onager +Onagra +onagra +Onagraceae +onagraceous +Onan +onanism +onanist +onanistic +onca +once +oncetta +Onchidiidae +Onchidium +Onchocerca +onchocerciasis +onchocercosis +oncia +Oncidium +oncin +oncograph +oncography +oncologic +oncological +oncology +oncome +oncometer +oncometric +oncometry +oncoming +Oncorhynchus +oncosimeter +oncosis +oncosphere +oncost +oncostman +oncotomy +ondagram +ondagraph +ondameter +ondascope +ondatra +ondine +ondogram +ondograph +ondometer +ondoscope +ondy +one +oneanother +oneberry +onefold +onefoldness +onegite +onehearted +onehow +Oneida +oneiric +oneirocrit +oneirocritic +oneirocritical +oneirocritically +oneirocriticism +oneirocritics +oneirodynia +oneirologist +oneirology +oneiromancer +oneiromancy +oneiroscopic +oneiroscopist +oneiroscopy +oneirotic +oneism +onement +oneness +oner +onerary +onerative +onerosity +onerous +onerously +onerousness +onery +oneself +onesigned +onetime +onewhere +oneyer +onfall +onflemed +onflow +onflowing +ongaro +ongoing +onhanger +onicolo +oniomania +oniomaniac +onion +onionet +onionized +onionlike +onionpeel +onionskin +oniony +onirotic +Oniscidae +onisciform +oniscoid +Oniscoidea +oniscoidean +Oniscus +onium +onkilonite +onkos +onlay +onlepy +onliest +onliness +onlook +onlooker +onlooking +only +onmarch +Onmun +Onobrychis +onocentaur +Onoclea +onofrite +Onohippidium +onolatry +onomancy +onomantia +onomastic +onomasticon +onomatologist +onomatology +onomatomania +onomatope +onomatoplasm +onomatopoeia +onomatopoeial +onomatopoeian +onomatopoeic +onomatopoeical +onomatopoeically +onomatopoesis +onomatopoesy +onomatopoetic +onomatopoetically +onomatopy +onomatous +onomomancy +Onondaga +Onondagan +Ononis +Onopordon +Onosmodium +onrush +onrushing +ons +onset +onsetter +onshore +onside +onsight +onslaught +onstand +onstanding +onstead +onsweep +onsweeping +ontal +Ontarian +Ontaric +onto +ontocycle +ontocyclic +ontogenal +ontogenesis +ontogenetic +ontogenetical +ontogenetically +ontogenic +ontogenically +ontogenist +ontogeny +ontography +ontologic +ontological +ontologically +ontologism +ontologist +ontologistic +ontologize +ontology +ontosophy +onus +onwaiting +onward +onwardly +onwardness +onwards +onycha +onychatrophia +onychauxis +onychia +onychin +onychitis +onychium +onychogryposis +onychoid +onycholysis +onychomalacia +onychomancy +onychomycosis +onychonosus +onychopathic +onychopathology +onychopathy +onychophagist +onychophagy +Onychophora +onychophoran +onychophorous +onychophyma +onychoptosis +onychorrhexis +onychoschizia +onychosis +onychotrophy +onym +onymal +onymancy +onymatic +onymity +onymize +onymous +onymy +onyx +onyxis +onyxitis +onza +ooangium +ooblast +ooblastic +oocyesis +oocyst +Oocystaceae +oocystaceous +oocystic +Oocystis +oocyte +oodles +ooecial +ooecium +oofbird +ooftish +oofy +oogamete +oogamous +oogamy +oogenesis +oogenetic +oogeny +ooglea +oogone +oogonial +oogoniophore +oogonium +oograph +ooid +ooidal +ookinesis +ookinete +ookinetic +oolak +oolemma +oolite +oolitic +oolly +oologic +oological +oologically +oologist +oologize +oology +oolong +oomancy +oomantia +oometer +oometric +oometry +oomycete +Oomycetes +oomycetous +oons +oont +oopak +oophoralgia +oophorauxe +oophore +oophorectomy +oophoreocele +oophorhysterectomy +oophoric +oophoridium +oophoritis +oophoroepilepsy +oophoroma +oophoromalacia +oophoromania +oophoron +oophoropexy +oophororrhaphy +oophorosalpingectomy +oophorostomy +oophorotomy +oophyte +oophytic +ooplasm +ooplasmic +ooplast +oopod +oopodal +ooporphyrin +oorali +oord +ooscope +ooscopy +oosperm +oosphere +oosporange +oosporangium +oospore +Oosporeae +oosporic +oosporiferous +oosporous +oostegite +oostegitic +ootheca +oothecal +ootid +ootocoid +Ootocoidea +ootocoidean +ootocous +ootype +ooze +oozily +ooziness +oozooid +oozy +opacate +opacification +opacifier +opacify +opacite +opacity +opacous +opacousness +opah +opal +opaled +opalesce +opalescence +opalescent +opalesque +Opalina +opaline +opalinid +Opalinidae +opalinine +opalish +opalize +opaloid +opaque +opaquely +opaqueness +Opata +opdalite +ope +Opegrapha +opeidoscope +opelet +open +openable +openband +openbeak +openbill +opencast +opener +openhanded +openhandedly +openhandedness +openhead +openhearted +openheartedly +openheartedness +opening +openly +openmouthed +openmouthedly +openmouthedness +openness +openside +openwork +opera +operability +operabily +operable +operae +operagoer +operalogue +operameter +operance +operancy +operand +operant +operatable +operate +operatee +operatic +operatical +operatically +operating +operation +operational +operationalism +operationalist +operationism +operationist +operative +operatively +operativeness +operativity +operatize +operator +operatory +operatrix +opercle +opercled +opercula +opercular +Operculata +operculate +operculated +operculiferous +operculiform +operculigenous +operculigerous +operculum +operetta +operette +operettist +operose +operosely +operoseness +operosity +Ophelia +ophelimity +Ophian +ophiasis +ophic +ophicalcite +Ophicephalidae +ophicephaloid +Ophicephalus +Ophichthyidae +ophichthyoid +ophicleide +ophicleidean +ophicleidist +Ophidia +ophidian +Ophidiidae +Ophidiobatrachia +ophidioid +Ophidion +ophidiophobia +ophidious +ophidologist +ophidology +Ophiobatrachia +Ophiobolus +Ophioglossaceae +ophioglossaceous +Ophioglossales +Ophioglossum +ophiography +ophioid +ophiolater +ophiolatrous +ophiolatry +ophiolite +ophiolitic +ophiologic +ophiological +ophiologist +ophiology +ophiomancy +ophiomorph +Ophiomorpha +ophiomorphic +ophiomorphous +Ophion +ophionid +Ophioninae +ophionine +ophiophagous +ophiophilism +ophiophilist +ophiophobe +ophiophobia +ophiophoby +ophiopluteus +Ophiosaurus +ophiostaphyle +ophiouride +Ophis +Ophisaurus +Ophism +Ophite +ophite +Ophitic +ophitic +Ophitism +Ophiuchid +Ophiuchus +ophiuran +ophiurid +Ophiurida +ophiuroid +Ophiuroidea +ophiuroidean +ophryon +Ophrys +ophthalaiater +ophthalmagra +ophthalmalgia +ophthalmalgic +ophthalmatrophia +ophthalmectomy +ophthalmencephalon +ophthalmetrical +ophthalmia +ophthalmiac +ophthalmiatrics +ophthalmic +ophthalmious +ophthalmist +ophthalmite +ophthalmitic +ophthalmitis +ophthalmoblennorrhea +ophthalmocarcinoma +ophthalmocele +ophthalmocopia +ophthalmodiagnosis +ophthalmodiastimeter +ophthalmodynamometer +ophthalmodynia +ophthalmography +ophthalmoleucoscope +ophthalmolith +ophthalmologic +ophthalmological +ophthalmologist +ophthalmology +ophthalmomalacia +ophthalmometer +ophthalmometric +ophthalmometry +ophthalmomycosis +ophthalmomyositis +ophthalmomyotomy +ophthalmoneuritis +ophthalmopathy +ophthalmophlebotomy +ophthalmophore +ophthalmophorous +ophthalmophthisis +ophthalmoplasty +ophthalmoplegia +ophthalmoplegic +ophthalmopod +ophthalmoptosis +ophthalmorrhagia +ophthalmorrhea +ophthalmorrhexis +Ophthalmosaurus +ophthalmoscope +ophthalmoscopic +ophthalmoscopical +ophthalmoscopist +ophthalmoscopy +ophthalmostasis +ophthalmostat +ophthalmostatometer +ophthalmothermometer +ophthalmotomy +ophthalmotonometer +ophthalmotonometry +ophthalmotrope +ophthalmotropometer +ophthalmy +opianic +opianyl +opiate +opiateproof +opiatic +Opiconsivia +opificer +opiism +Opilia +Opiliaceae +opiliaceous +Opiliones +Opilionina +opilionine +Opilonea +Opimian +opinability +opinable +opinably +opinant +opination +opinative +opinatively +opinator +opine +opiner +opiniaster +opiniastre +opiniastrety +opiniastrous +opiniater +opiniative +opiniatively +opiniativeness +opiniatreness +opiniatrety +opinion +opinionable +opinionaire +opinional +opinionate +opinionated +opinionatedly +opinionatedness +opinionately +opinionative +opinionatively +opinionativeness +opinioned +opinionedness +opinionist +opiomania +opiomaniac +opiophagism +opiophagy +opiparous +opisometer +opisthenar +opisthion +opisthobranch +Opisthobranchia +opisthobranchiate +Opisthocoelia +opisthocoelian +opisthocoelous +opisthocome +Opisthocomi +Opisthocomidae +opisthocomine +opisthocomous +opisthodetic +opisthodome +opisthodomos +opisthodomus +opisthodont +opisthogastric +Opisthoglossa +opisthoglossal +opisthoglossate +opisthoglyph +Opisthoglypha +opisthoglyphic +opisthoglyphous +Opisthognathidae +opisthognathism +opisthognathous +opisthograph +opisthographal +opisthographic +opisthographical +opisthography +opisthogyrate +opisthogyrous +Opisthoparia +opisthoparian +opisthophagic +opisthoporeia +opisthorchiasis +Opisthorchis +opisthosomal +Opisthothelae +opisthotic +opisthotonic +opisthotonoid +opisthotonos +opisthotonus +opium +opiumism +opobalsam +opodeldoc +opodidymus +opodymus +opopanax +Oporto +opossum +opotherapy +Oppian +oppidan +oppilate +oppilation +oppilative +opponency +opponent +opportune +opportuneless +opportunely +opportuneness +opportunism +opportunist +opportunistic +opportunistically +opportunity +opposability +opposable +oppose +opposed +opposeless +opposer +opposing +opposingly +opposit +opposite +oppositely +oppositeness +oppositiflorous +oppositifolious +opposition +oppositional +oppositionary +oppositionism +oppositionist +oppositionless +oppositious +oppositipetalous +oppositipinnate +oppositipolar +oppositisepalous +oppositive +oppositively +oppositiveness +opposure +oppress +oppressed +oppressible +oppression +oppressionist +oppressive +oppressively +oppressiveness +oppressor +opprobriate +opprobrious +opprobriously +opprobriousness +opprobrium +opprobry +oppugn +oppugnacy +oppugnance +oppugnancy +oppugnant +oppugnate +oppugnation +oppugner +opsigamy +opsimath +opsimathy +opsiometer +opsisform +opsistype +opsonic +opsoniferous +opsonification +opsonify +opsonin +opsonist +opsonium +opsonization +opsonize +opsonogen +opsonoid +opsonology +opsonometry +opsonophilia +opsonophilic +opsonophoric +opsonotherapy +opsy +opt +optable +optableness +optably +optant +optate +optation +optative +optatively +opthalmophorium +opthalmoplegy +opthalmothermometer +optic +optical +optically +optician +opticist +opticity +opticochemical +opticociliary +opticon +opticopapillary +opticopupillary +optics +optigraph +optimacy +optimal +optimate +optimates +optime +optimism +optimist +optimistic +optimistical +optimistically +optimity +optimization +optimize +optimum +option +optional +optionality +optionalize +optionally +optionary +optionee +optionor +optive +optoblast +optogram +optography +optological +optologist +optology +optomeninx +optometer +optometrical +optometrist +optometry +optophone +optotechnics +optotype +Opulaster +opulence +opulency +opulent +opulently +opulus +Opuntia +Opuntiaceae +Opuntiales +opuntioid +opus +opuscular +opuscule +opusculum +oquassa +or +ora +orabassu +orach +oracle +oracular +oracularity +oracularly +oracularness +oraculate +oraculous +oraculously +oraculousness +oraculum +orad +orage +oragious +Orakzai +oral +oraler +oralism +oralist +orality +oralization +oralize +orally +oralogist +oralogy +Orang +orang +orange +orangeade +orangebird +Orangeism +Orangeist +orangeleaf +Orangeman +orangeman +oranger +orangeroot +orangery +orangewoman +orangewood +orangey +orangism +orangist +orangite +orangize +orangutan +orant +Oraon +orarian +orarion +orarium +orary +orate +oration +orational +orationer +orator +oratorial +oratorially +Oratorian +oratorian +Oratorianism +Oratorianize +oratoric +oratorical +oratorically +oratorio +oratorize +oratorlike +oratorship +oratory +oratress +oratrix +orb +orbed +orbic +orbical +Orbicella +orbicle +orbicular +orbicularis +orbicularity +orbicularly +orbicularness +orbiculate +orbiculated +orbiculately +orbiculation +orbiculatocordate +orbiculatoelliptical +Orbiculoidea +orbific +Orbilian +Orbilius +orbit +orbital +orbitale +orbitar +orbitary +orbite +orbitelar +Orbitelariae +orbitelarian +orbitele +orbitelous +orbitofrontal +Orbitoides +Orbitolina +orbitolite +Orbitolites +orbitomalar +orbitomaxillary +orbitonasal +orbitopalpebral +orbitosphenoid +orbitosphenoidal +orbitostat +orbitotomy +orbitozygomatic +orbless +orblet +Orbulina +orby +orc +Orca +Orcadian +orcanet +orcein +orchamus +orchard +orcharding +orchardist +orchardman +orchat +orchel +orchella +orchesis +orchesography +orchester +Orchestia +orchestian +orchestic +orchestiid +Orchestiidae +orchestra +orchestral +orchestraless +orchestrally +orchestrate +orchestrater +orchestration +orchestrator +orchestre +orchestric +orchestrina +orchestrion +orchialgia +orchic +orchichorea +orchid +Orchidaceae +orchidacean +orchidaceous +Orchidales +orchidalgia +orchidectomy +orchideous +orchideously +orchidist +orchiditis +orchidocele +orchidocelioplasty +orchidologist +orchidology +orchidomania +orchidopexy +orchidoplasty +orchidoptosis +orchidorrhaphy +orchidotherapy +orchidotomy +orchiectomy +orchiencephaloma +orchiepididymitis +orchil +orchilla +orchilytic +orchiocatabasis +orchiocele +orchiodynia +orchiomyeloma +orchioncus +orchioneuralgia +orchiopexy +orchioplasty +orchiorrhaphy +orchioscheocele +orchioscirrhus +orchiotomy +Orchis +orchitic +orchitis +orchotomy +orcin +orcinol +Orcinus +ordain +ordainable +ordainer +ordainment +ordanchite +ordeal +order +orderable +ordered +orderedness +orderer +orderless +orderliness +orderly +ordinable +ordinal +ordinally +ordinance +ordinand +ordinant +ordinar +ordinarily +ordinariness +ordinarius +ordinary +ordinaryship +ordinate +ordinately +ordination +ordinative +ordinatomaculate +ordinator +ordinee +ordines +ordnance +ordonnance +ordonnant +ordosite +Ordovian +Ordovices +Ordovician +ordu +ordure +ordurous +ore +oread +Oreamnos +Oreas +orecchion +orectic +orective +oreillet +orellin +oreman +orenda +orendite +Oreocarya +Oreodon +oreodont +Oreodontidae +oreodontine +oreodontoid +Oreodoxa +Oreophasinae +oreophasine +Oreophasis +Oreortyx +oreotragine +Oreotragus +Oreotrochilus +Orestean +Oresteia +oreweed +orewood +orexis +orf +orfgild +organ +organal +organbird +organdy +organella +organelle +organer +organette +organic +organical +organically +organicalness +organicism +organicismal +organicist +organicistic +organicity +organific +organing +organism +organismal +organismic +organist +organistic +organistrum +organistship +organity +organizability +organizable +organization +organizational +organizationally +organizationist +organizatory +organize +organized +organizer +organless +organoantimony +organoarsenic +organobismuth +organoboron +organochordium +organogel +organogen +organogenesis +organogenetic +organogenic +organogenist +organogeny +organogold +organographic +organographical +organographist +organography +organoid +organoiron +organolead +organoleptic +organolithium +organologic +organological +organologist +organology +organomagnesium +organomercury +organometallic +organon +organonomic +organonomy +organonym +organonymal +organonymic +organonymy +organopathy +organophil +organophile +organophilic +organophone +organophonic +organophyly +organoplastic +organoscopy +organosilicon +organosilver +organosodium +organosol +organotherapy +organotin +organotrophic +organotropic +organotropically +organotropism +organotropy +organozinc +organry +organule +organum +organzine +orgasm +orgasmic +orgastic +orgeat +orgia +orgiac +orgiacs +orgiasm +orgiast +orgiastic +orgiastical +orgic +orgue +orguinette +orgulous +orgulously +orgy +orgyia +Orias +Oribatidae +oribi +orichalceous +orichalch +orichalcum +oriconic +oricycle +oriel +oriency +orient +Oriental +oriental +Orientalia +orientalism +orientalist +orientality +orientalization +orientalize +orientally +Orientalogy +orientate +orientation +orientative +orientator +orientite +orientization +orientize +oriently +orientness +orifacial +orifice +orificial +oriflamb +oriflamme +oriform +origan +origanized +Origanum +Origenian +Origenic +Origenical +Origenism +Origenist +Origenistic +Origenize +origin +originable +original +originalist +originality +originally +originalness +originant +originarily +originary +originate +origination +originative +originatively +originator +originatress +originist +orignal +orihon +orihyperbola +orillion +orillon +orinasal +orinasality +oriole +Oriolidae +Oriolus +Orion +Oriskanian +orismologic +orismological +orismology +orison +orisphere +oristic +Oriya +Orkhon +Orkneyan +Orlando +orle +orlean +Orleanism +Orleanist +Orleanistic +Orleans +orlet +orleways +orlewise +orlo +orlop +Ormazd +ormer +ormolu +Ormond +orna +ornament +ornamental +ornamentalism +ornamentalist +ornamentality +ornamentalize +ornamentally +ornamentary +ornamentation +ornamenter +ornamentist +ornate +ornately +ornateness +ornation +ornature +orneriness +ornery +ornis +orniscopic +orniscopist +orniscopy +ornithic +ornithichnite +ornithine +Ornithischia +ornithischian +ornithivorous +ornithobiographical +ornithobiography +ornithocephalic +Ornithocephalidae +ornithocephalous +Ornithocephalus +ornithocoprolite +ornithocopros +ornithodelph +Ornithodelphia +ornithodelphian +ornithodelphic +ornithodelphous +Ornithodoros +Ornithogaea +Ornithogaean +Ornithogalum +ornithogeographic +ornithogeographical +ornithography +ornithoid +Ornitholestes +ornitholite +ornitholitic +ornithologic +ornithological +ornithologically +ornithologist +ornithology +ornithomancy +ornithomantia +ornithomantic +ornithomantist +Ornithomimidae +Ornithomimus +ornithomorph +ornithomorphic +ornithomyzous +ornithon +Ornithopappi +ornithophile +ornithophilist +ornithophilite +ornithophilous +ornithophily +ornithopod +Ornithopoda +ornithopter +Ornithoptera +Ornithopteris +Ornithorhynchidae +ornithorhynchous +Ornithorhynchus +ornithosaur +Ornithosauria +ornithosaurian +Ornithoscelida +ornithoscelidan +ornithoscopic +ornithoscopist +ornithoscopy +ornithosis +ornithotomical +ornithotomist +ornithotomy +ornithotrophy +Ornithurae +ornithuric +ornithurous +ornoite +oroanal +Orobanchaceae +orobanchaceous +Orobanche +orobancheous +orobathymetric +Orobatoidea +Orochon +orocratic +orodiagnosis +orogen +orogenesis +orogenesy +orogenetic +orogenic +orogeny +orograph +orographic +orographical +orographically +orography +oroheliograph +Orohippus +orohydrographic +orohydrographical +orohydrography +oroide +orolingual +orological +orologist +orology +orometer +orometric +orometry +Oromo +oronasal +oronoco +Orontium +oropharyngeal +oropharynx +orotherapy +Orotinan +orotund +orotundity +orphan +orphancy +orphandom +orphange +orphanhood +orphanism +orphanize +orphanry +orphanship +orpharion +Orphean +Orpheist +orpheon +orpheonist +orpheum +Orpheus +Orphic +Orphical +Orphically +Orphicism +Orphism +Orphize +orphrey +orphreyed +orpiment +orpine +Orpington +orrery +orrhoid +orrhology +orrhotherapy +orris +orrisroot +orseille +orseilline +orsel +orselle +orseller +orsellic +orsellinate +orsellinic +Orson +ort +ortalid +Ortalidae +ortalidian +Ortalis +ortet +Orthagoriscus +orthal +orthantimonic +Ortheris +orthian +orthic +orthicon +orthid +Orthidae +Orthis +orthite +orthitic +ortho +orthoarsenite +orthoaxis +orthobenzoquinone +orthobiosis +orthoborate +orthobrachycephalic +orthocarbonic +orthocarpous +Orthocarpus +orthocenter +orthocentric +orthocephalic +orthocephalous +orthocephaly +orthoceracone +Orthoceran +Orthoceras +Orthoceratidae +orthoceratite +orthoceratitic +orthoceratoid +orthochlorite +orthochromatic +orthochromatize +orthoclase +orthoclasite +orthoclastic +orthocoumaric +orthocresol +orthocymene +orthodiaene +orthodiagonal +orthodiagram +orthodiagraph +orthodiagraphic +orthodiagraphy +orthodiazin +orthodiazine +orthodolichocephalic +orthodomatic +orthodome +orthodontia +orthodontic +orthodontics +orthodontist +orthodox +orthodoxal +orthodoxality +orthodoxally +orthodoxian +orthodoxical +orthodoxically +orthodoxism +orthodoxist +orthodoxly +orthodoxness +orthodoxy +orthodromic +orthodromics +orthodromy +orthoepic +orthoepical +orthoepically +orthoepist +orthoepistic +orthoepy +orthoformic +orthogamous +orthogamy +orthogenesis +orthogenetic +orthogenic +orthognathic +orthognathism +orthognathous +orthognathus +orthognathy +orthogneiss +orthogonal +orthogonality +orthogonally +orthogonial +orthograde +orthogranite +orthograph +orthographer +orthographic +orthographical +orthographically +orthographist +orthographize +orthography +orthohydrogen +orthologer +orthologian +orthological +orthology +orthometopic +orthometric +orthometry +Orthonectida +orthonitroaniline +orthopath +orthopathic +orthopathically +orthopathy +orthopedia +orthopedic +orthopedical +orthopedically +orthopedics +orthopedist +orthopedy +orthophenylene +orthophonic +orthophony +orthophoria +orthophoric +orthophosphate +orthophosphoric +orthophyre +orthophyric +orthopinacoid +orthopinacoidal +orthoplastic +orthoplasy +orthoplumbate +orthopnea +orthopneic +orthopod +Orthopoda +orthopraxis +orthopraxy +orthoprism +orthopsychiatric +orthopsychiatrical +orthopsychiatrist +orthopsychiatry +orthopter +Orthoptera +orthopteral +orthopteran +orthopterist +orthopteroid +Orthopteroidea +orthopterological +orthopterologist +orthopterology +orthopteron +orthopterous +orthoptic +orthopyramid +orthopyroxene +orthoquinone +orthorhombic +Orthorrhapha +orthorrhaphous +orthorrhaphy +orthoscope +orthoscopic +orthose +orthosemidin +orthosemidine +orthosilicate +orthosilicic +orthosis +orthosite +orthosomatic +orthospermous +orthostatic +orthostichous +orthostichy +orthostyle +orthosubstituted +orthosymmetric +orthosymmetrical +orthosymmetrically +orthosymmetry +orthotactic +orthotectic +orthotic +orthotolidin +orthotolidine +orthotoluic +orthotoluidin +orthotoluidine +orthotomic +orthotomous +orthotone +orthotonesis +orthotonic +orthotonus +orthotropal +orthotropic +orthotropism +orthotropous +orthotropy +orthotype +orthotypous +orthovanadate +orthovanadic +orthoveratraldehyde +orthoveratric +orthoxazin +orthoxazine +orthoxylene +orthron +ortiga +ortive +Ortol +ortolan +Ortrud +ortstein +ortygan +Ortygian +Ortyginae +ortygine +Ortyx +Orunchun +orvietan +orvietite +Orvieto +ory +Orycteropodidae +Orycteropus +oryctics +oryctognostic +oryctognostical +oryctognostically +oryctognosy +Oryctolagus +oryssid +Oryssidae +Oryssus +Oryx +Oryza +oryzenin +oryzivorous +Oryzomys +Oryzopsis +Oryzorictes +Oryzorictinae +Os +os +Osage +osamin +osamine +osazone +Osc +Oscan +Oscar +Oscarella +Oscarellidae +oscella +oscheal +oscheitis +oscheocarcinoma +oscheocele +oscheolith +oscheoma +oscheoncus +oscheoplasty +Oschophoria +oscillance +oscillancy +oscillant +Oscillaria +Oscillariaceae +oscillariaceous +oscillate +oscillating +oscillation +oscillative +oscillatively +oscillator +Oscillatoria +Oscillatoriaceae +oscillatoriaceous +oscillatorian +oscillatory +oscillogram +oscillograph +oscillographic +oscillography +oscillometer +oscillometric +oscillometry +oscilloscope +oscin +oscine +Oscines +oscinian +Oscinidae +oscinine +Oscinis +oscitance +oscitancy +oscitant +oscitantly +oscitate +oscitation +oscnode +osculable +osculant +oscular +oscularity +osculate +osculation +osculatory +osculatrix +oscule +osculiferous +osculum +oscurrantist +ose +osela +oshac +Osiandrian +oside +osier +osiered +osierlike +osiery +Osirian +Osiride +Osiridean +Osirification +Osirify +Osiris +Osirism +Osmanie +Osmanli +Osmanthus +osmate +osmatic +osmatism +osmazomatic +osmazomatous +osmazome +Osmeridae +Osmerus +osmesis +osmeterium +osmetic +osmic +osmidrosis +osmin +osmina +osmious +osmiridium +osmium +osmodysphoria +osmogene +osmograph +osmolagnia +osmology +osmometer +osmometric +osmometry +Osmond +osmondite +osmophore +osmoregulation +Osmorhiza +osmoscope +osmose +osmosis +osmotactic +osmotaxis +osmotherapy +osmotic +osmotically +osmous +osmund +Osmunda +Osmundaceae +osmundaceous +osmundine +Osnaburg +Osnappar +osoberry +osone +osophy +osotriazine +osotriazole +osphradial +osphradium +osphresiolagnia +osphresiologic +osphresiologist +osphresiology +osphresiometer +osphresiometry +osphresiophilia +osphresis +osphretic +Osphromenidae +osphyalgia +osphyalgic +osphyarthritis +osphyitis +osphyocele +osphyomelitis +osprey +ossal +ossarium +ossature +osse +ossein +osselet +ossements +osseoalbuminoid +osseoaponeurotic +osseocartilaginous +osseofibrous +osseomucoid +osseous +osseously +Osset +Ossetian +Ossetic +Ossetine +Ossetish +Ossian +Ossianesque +Ossianic +Ossianism +Ossianize +ossicle +ossicular +ossiculate +ossicule +ossiculectomy +ossiculotomy +ossiculum +ossiferous +ossific +ossification +ossified +ossifier +ossifluence +ossifluent +ossiform +ossifrage +ossifrangent +ossify +ossivorous +ossuarium +ossuary +ossypite +ostalgia +Ostara +ostariophysan +Ostariophyseae +Ostariophysi +ostariophysial +ostariophysous +ostarthritis +osteal +ostealgia +osteanabrosis +osteanagenesis +ostearthritis +ostearthrotomy +ostectomy +osteectomy +osteectopia +osteectopy +Osteichthyes +ostein +osteitic +osteitis +ostemia +ostempyesis +ostensibility +ostensible +ostensibly +ostension +ostensive +ostensively +ostensorium +ostensory +ostent +ostentate +ostentation +ostentatious +ostentatiously +ostentatiousness +ostentive +ostentous +osteoaneurysm +osteoarthritis +osteoarthropathy +osteoarthrotomy +osteoblast +osteoblastic +osteoblastoma +osteocachetic +osteocarcinoma +osteocartilaginous +osteocele +osteocephaloma +osteochondritis +osteochondrofibroma +osteochondroma +osteochondromatous +osteochondropathy +osteochondrophyte +osteochondrosarcoma +osteochondrous +osteoclasia +osteoclasis +osteoclast +osteoclastic +osteoclasty +osteocolla +osteocomma +osteocranium +osteocystoma +osteodentin +osteodentinal +osteodentine +osteoderm +osteodermal +osteodermatous +osteodermia +osteodermis +osteodiastasis +osteodynia +osteodystrophy +osteoencephaloma +osteoenchondroma +osteoepiphysis +osteofibroma +osteofibrous +osteogangrene +osteogen +osteogenesis +osteogenetic +osteogenic +osteogenist +osteogenous +osteogeny +osteoglossid +Osteoglossidae +osteoglossoid +Osteoglossum +osteographer +osteography +osteohalisteresis +osteoid +Osteolepidae +Osteolepis +osteolite +osteologer +osteologic +osteological +osteologically +osteologist +osteology +osteolysis +osteolytic +osteoma +osteomalacia +osteomalacial +osteomalacic +osteomancy +osteomanty +osteomatoid +osteomere +osteometric +osteometrical +osteometry +osteomyelitis +osteoncus +osteonecrosis +osteoneuralgia +osteopaedion +osteopath +osteopathic +osteopathically +osteopathist +osteopathy +osteopedion +osteoperiosteal +osteoperiostitis +osteopetrosis +osteophage +osteophagia +osteophlebitis +osteophone +osteophony +osteophore +osteophyma +osteophyte +osteophytic +osteoplaque +osteoplast +osteoplastic +osteoplasty +osteoporosis +osteoporotic +osteorrhaphy +osteosarcoma +osteosarcomatous +osteosclerosis +osteoscope +osteosis +osteosteatoma +osteostixis +osteostomatous +osteostomous +osteostracan +Osteostraci +osteosuture +osteosynovitis +osteosynthesis +osteothrombosis +osteotome +osteotomist +osteotomy +osteotribe +osteotrite +osteotrophic +osteotrophy +Ostertagia +ostial +ostiary +ostiate +Ostic +ostiolar +ostiolate +ostiole +ostitis +ostium +ostleress +Ostmannic +ostmark +Ostmen +ostosis +Ostracea +ostracean +ostraceous +Ostraciidae +ostracine +ostracioid +Ostracion +ostracism +ostracizable +ostracization +ostracize +ostracizer +ostracod +Ostracoda +ostracode +ostracoderm +Ostracodermi +ostracodous +ostracoid +Ostracoidea +ostracon +ostracophore +Ostracophori +ostracophorous +ostracum +Ostraeacea +ostraite +Ostrea +ostreaceous +ostreger +ostreicultural +ostreiculture +ostreiculturist +Ostreidae +ostreiform +ostreodynamometer +ostreoid +ostreophage +ostreophagist +ostreophagous +ostrich +ostrichlike +Ostrogoth +Ostrogothian +Ostrogothic +Ostrya +Ostyak +Oswald +Oswegan +otacoustic +otacousticon +Otaheitan +otalgia +otalgic +otalgy +Otaria +otarian +Otariidae +Otariinae +otariine +otarine +otarioid +otary +otate +otectomy +otelcosis +Otello +Othake +othelcosis +Othello +othematoma +othemorrhea +otheoscope +other +otherdom +otherest +othergates +otherguess +otherhow +otherism +otherist +otherness +othersome +othertime +otherwards +otherwhence +otherwhere +otherwhereness +otherwheres +otherwhile +otherwhiles +otherwhither +otherwise +otherwiseness +otherworld +otherworldliness +otherworldly +otherworldness +Othin +Othinism +othmany +Othonna +othygroma +otiant +otiatric +otiatrics +otiatry +otic +oticodinia +Otidae +Otides +Otididae +otidiform +otidine +Otidiphaps +otidium +otiorhynchid +Otiorhynchidae +Otiorhynchinae +otiose +otiosely +otioseness +otiosity +Otis +otitic +otitis +otkon +Oto +otoantritis +otoblennorrhea +otocariasis +otocephalic +otocephaly +otocerebritis +otocleisis +otoconial +otoconite +otoconium +otocrane +otocranial +otocranic +otocranium +Otocyon +otocyst +otocystic +otodynia +otodynic +otoencephalitis +otogenic +otogenous +otographical +otography +Otogyps +otohemineurasthenia +otolaryngologic +otolaryngologist +otolaryngology +otolite +otolith +Otolithidae +Otolithus +otolitic +otological +otologist +otology +Otomaco +otomassage +Otomi +Otomian +Otomitlan +otomucormycosis +otomyces +otomycosis +otonecrectomy +otoneuralgia +otoneurasthenia +otopathic +otopathy +otopharyngeal +otophone +otopiesis +otoplastic +otoplasty +otopolypus +otopyorrhea +otopyosis +otorhinolaryngologic +otorhinolaryngologist +otorhinolaryngology +otorrhagia +otorrhea +otorrhoea +otosalpinx +otosclerosis +otoscope +otoscopic +otoscopy +otosis +otosphenal +otosteal +otosteon +ototomy +Otozoum +ottajanite +ottar +ottavarima +Ottawa +otter +otterer +otterhound +ottinger +ottingkar +Otto +otto +Ottoman +Ottomanean +Ottomanic +Ottomanism +Ottomanization +Ottomanize +Ottomanlike +Ottomite +ottrelife +Ottweilian +Otuquian +oturia +Otus +Otyak +ouabain +ouabaio +ouabe +ouachitite +ouakari +ouananiche +oubliette +ouch +Oudemian +oudenarde +Oudenodon +oudenodont +ouenite +ouf +ough +ought +oughtness +oughtnt +Ouija +ouistiti +oukia +oulap +ounce +ounds +ouphe +ouphish +our +Ouranos +ourie +ouroub +Ourouparia +ours +ourself +ourselves +oust +ouster +out +outact +outadmiral +Outagami +outage +outambush +outarde +outargue +outask +outawe +outbabble +outback +outbacker +outbake +outbalance +outban +outbanter +outbar +outbargain +outbark +outbawl +outbeam +outbear +outbearing +outbeg +outbeggar +outbelch +outbellow +outbent +outbetter +outbid +outbidder +outbirth +outblacken +outblaze +outbleat +outbleed +outbless +outbloom +outblossom +outblot +outblow +outblowing +outblown +outbluff +outblunder +outblush +outbluster +outboard +outboast +outbolting +outbond +outbook +outborn +outborough +outbound +outboundaries +outbounds +outbow +outbowed +outbowl +outbox +outbrag +outbranch +outbranching +outbrave +outbray +outbrazen +outbreak +outbreaker +outbreaking +outbreath +outbreathe +outbreather +outbred +outbreed +outbreeding +outbribe +outbridge +outbring +outbrother +outbud +outbuild +outbuilding +outbulge +outbulk +outbully +outburn +outburst +outbustle +outbuy +outbuzz +outby +outcant +outcaper +outcarol +outcarry +outcase +outcast +outcaste +outcasting +outcastness +outcavil +outchamber +outcharm +outchase +outchatter +outcheat +outchide +outcity +outclamor +outclass +outclerk +outclimb +outcome +outcomer +outcoming +outcompass +outcomplete +outcompliment +outcorner +outcountry +outcourt +outcrawl +outcricket +outcrier +outcrop +outcropper +outcross +outcrossing +outcrow +outcrowd +outcry +outcull +outcure +outcurse +outcurve +outcut +outdaciousness +outdance +outdare +outdate +outdated +outdazzle +outdevil +outdispatch +outdistance +outdistrict +outdo +outdodge +outdoer +outdoor +outdoorness +outdoors +outdoorsman +outdraft +outdragon +outdraw +outdream +outdress +outdrink +outdrive +outdure +outdwell +outdweller +outdwelling +outeat +outecho +outed +outedge +outen +outer +outerly +outermost +outerness +outerwear +outeye +outeyed +outfable +outface +outfall +outfame +outfangthief +outfast +outfawn +outfeast +outfeat +outfeeding +outfence +outferret +outfiction +outfield +outfielder +outfieldsman +outfight +outfighter +outfighting +outfigure +outfish +outfit +outfitter +outflame +outflank +outflanker +outflanking +outflare +outflash +outflatter +outfling +outfloat +outflourish +outflow +outflue +outflung +outflunky +outflush +outflux +outfly +outfold +outfool +outfoot +outform +outfort +outfreeman +outfront +outfroth +outfrown +outgabble +outgain +outgallop +outgamble +outgame +outgang +outgarment +outgarth +outgas +outgate +outgauge +outgaze +outgeneral +outgive +outgiving +outglad +outglare +outgleam +outglitter +outgloom +outglow +outgnaw +outgo +outgoer +outgoing +outgoingness +outgone +outgreen +outgrin +outground +outgrow +outgrowing +outgrowth +outguard +outguess +outgun +outgush +outhammer +outhasten +outhaul +outhauler +outhear +outheart +outhector +outheel +outher +outhire +outhiss +outhit +outhold +outhorror +outhouse +outhousing +outhowl +outhue +outhumor +outhunt +outhurl +outhut +outhymn +outhyperbolize +outimage +outing +outinvent +outish +outissue +outjazz +outjest +outjet +outjetting +outjinx +outjockey +outjourney +outjuggle +outjump +outjut +outkeeper +outkick +outkill +outking +outkiss +outkitchen +outknave +outknee +outlabor +outlaid +outlance +outland +outlander +outlandish +outlandishlike +outlandishly +outlandishness +outlash +outlast +outlaugh +outlaunch +outlaw +outlawry +outlay +outlean +outleap +outlearn +outlegend +outlength +outlengthen +outler +outlet +outlie +outlier +outlighten +outlimb +outlimn +outline +outlinear +outlined +outlineless +outliner +outlinger +outlip +outlipped +outlive +outliver +outlodging +outlook +outlooker +outlord +outlove +outlung +outluster +outly +outlying +outmagic +outmalaprop +outman +outmaneuver +outmantle +outmarch +outmarriage +outmarry +outmaster +outmatch +outmate +outmeasure +outmerchant +outmiracle +outmode +outmoded +outmost +outmount +outmouth +outmove +outname +outness +outnight +outnoise +outnook +outnumber +outoffice +outoven +outpace +outpage +outpaint +outparagon +outparamour +outparish +outpart +outpass +outpassion +outpath +outpatient +outpay +outpayment +outpeal +outpeep +outpeer +outpension +outpensioner +outpeople +outperform +outpick +outpicket +outpipe +outpitch +outpity +outplace +outplan +outplay +outplayed +outplease +outplod +outplot +outpocketing +outpoint +outpoise +outpoison +outpoll +outpomp +outpop +outpopulate +outporch +outport +outporter +outportion +outpost +outpouching +outpour +outpourer +outpouring +outpractice +outpraise +outpray +outpreach +outpreen +outprice +outprodigy +outproduce +outpromise +outpry +outpull +outpupil +outpurl +outpurse +outpush +output +outputter +outquaff +outquarters +outqueen +outquestion +outquibble +outquote +outrace +outrage +outrageous +outrageously +outrageousness +outrageproof +outrager +outraging +outrail +outrance +outrange +outrank +outrant +outrap +outrate +outraught +outrave +outray +outre +outreach +outread +outreason +outreckon +outredden +outrede +outreign +outrelief +outremer +outreness +outrhyme +outrick +outride +outrider +outriding +outrig +outrigger +outriggered +outriggerless +outrigging +outright +outrightly +outrightness +outring +outrival +outroar +outrogue +outroll +outromance +outrooper +outroot +outrove +outrow +outroyal +outrun +outrunner +outrush +outsail +outsaint +outsally +outsatisfy +outsavor +outsay +outscent +outscold +outscore +outscorn +outscour +outscouring +outscream +outsea +outseam +outsearch +outsee +outseek +outsell +outsentry +outsert +outservant +outset +outsetting +outsettlement +outsettler +outshadow +outshake +outshame +outshape +outsharp +outsharpen +outsheathe +outshift +outshine +outshiner +outshoot +outshot +outshoulder +outshout +outshove +outshow +outshower +outshriek +outshrill +outshut +outside +outsided +outsidedness +outsideness +outsider +outsift +outsigh +outsight +outsin +outsing +outsit +outsize +outsized +outskill +outskip +outskirmish +outskirmisher +outskirt +outskirter +outslander +outslang +outsleep +outslide +outslink +outsmart +outsmell +outsmile +outsnatch +outsnore +outsoar +outsole +outsoler +outsonnet +outsophisticate +outsound +outspan +outsparkle +outspeak +outspeaker +outspeech +outspeed +outspell +outspend +outspent +outspill +outspin +outspirit +outspit +outsplendor +outspoken +outspokenly +outspokenness +outsport +outspout +outspread +outspring +outsprint +outspue +outspurn +outspurt +outstagger +outstair +outstand +outstander +outstanding +outstandingly +outstandingness +outstare +outstart +outstarter +outstartle +outstate +outstation +outstatistic +outstature +outstay +outsteal +outsteam +outstep +outsting +outstink +outstood +outstorm +outstrain +outstream +outstreet +outstretch +outstretcher +outstride +outstrike +outstrip +outstrive +outstroke +outstrut +outstudent +outstudy +outstunt +outsubtle +outsuck +outsucken +outsuffer +outsuitor +outsulk +outsum +outsuperstition +outswagger +outswarm +outswear +outsweep +outsweeping +outsweeten +outswell +outswift +outswim +outswindle +outswing +outswirl +outtaken +outtalent +outtalk +outtask +outtaste +outtear +outtease +outtell +outthieve +outthink +outthreaten +outthrob +outthrough +outthrow +outthrust +outthruster +outthunder +outthwack +outtinkle +outtire +outtoil +outtongue +outtop +outtower +outtrade +outtrail +outtravel +outtrick +outtrot +outtrump +outturn +outturned +outtyrannize +outusure +outvalue +outvanish +outvaunt +outvelvet +outvenom +outvictor +outvie +outvier +outvigil +outvillage +outvillain +outvociferate +outvoice +outvote +outvoter +outvoyage +outwait +outwake +outwale +outwalk +outwall +outwallop +outwander +outwar +outwarble +outward +outwardly +outwardmost +outwardness +outwards +outwash +outwaste +outwatch +outwater +outwave +outwealth +outweapon +outwear +outweary +outweave +outweed +outweep +outweigh +outweight +outwell +outwent +outwhirl +outwick +outwile +outwill +outwind +outwindow +outwing +outwish +outwit +outwith +outwittal +outwitter +outwoe +outwoman +outwood +outword +outwore +outwork +outworker +outworld +outworn +outworth +outwrangle +outwrench +outwrest +outwrestle +outwriggle +outwring +outwrite +outwrought +outyard +outyell +outyelp +outyield +outzany +ouzel +Ova +ova +Ovaherero +oval +ovalbumin +ovalescent +ovaliform +ovalish +ovalization +ovalize +ovally +ovalness +ovaloid +ovalwise +Ovambo +Ovampo +Ovangangela +ovant +ovarial +ovarian +ovarin +ovarioabdominal +ovariocele +ovariocentesis +ovariocyesis +ovariodysneuria +ovariohysterectomy +ovariole +ovariolumbar +ovariorrhexis +ovariosalpingectomy +ovariosteresis +ovariostomy +ovariotomist +ovariotomize +ovariotomy +ovariotubal +ovarious +ovaritis +ovarium +ovary +ovate +ovateconical +ovated +ovately +ovation +ovational +ovationary +ovatoacuminate +ovatoconical +ovatocordate +ovatocylindraceous +ovatodeltoid +ovatoellipsoidal +ovatoglobose +ovatolanceolate +ovatooblong +ovatoorbicular +ovatopyriform +ovatoquadrangular +ovatorotundate +ovatoserrate +ovatotriangular +oven +ovenbird +ovenful +ovenlike +ovenly +ovenman +ovenpeel +ovenstone +ovenware +ovenwise +over +overability +overable +overabound +overabsorb +overabstain +overabstemious +overabstemiousness +overabundance +overabundant +overabundantly +overabuse +overaccentuate +overaccumulate +overaccumulation +overaccuracy +overaccurate +overaccurately +overact +overaction +overactive +overactiveness +overactivity +overacute +overaddiction +overadvance +overadvice +overaffect +overaffirmation +overafflict +overaffliction +overage +overageness +overaggravate +overaggravation +overagitate +overagonize +overall +overalled +overalls +overambitioned +overambitious +overambling +overanalyze +overangelic +overannotate +overanswer +overanxiety +overanxious +overanxiously +overappareled +overappraisal +overappraise +overapprehended +overapprehension +overapprehensive +overapt +overarch +overargue +overarm +overartificial +overartificiality +overassail +overassert +overassertion +overassertive +overassertively +overassertiveness +overassess +overassessment +overassumption +overattached +overattachment +overattention +overattentive +overattentively +overawe +overawful +overawn +overawning +overbake +overbalance +overballast +overbalm +overbanded +overbandy +overbank +overbanked +overbark +overbarren +overbarrenness +overbase +overbaseness +overbashful +overbashfully +overbashfulness +overbattle +overbear +overbearance +overbearer +overbearing +overbearingly +overbearingness +overbeat +overbeating +overbeetling +overbelief +overbend +overbepatched +overberg +overbet +overbias +overbid +overbig +overbigness +overbillow +overbit +overbite +overbitten +overbitter +overbitterly +overbitterness +overblack +overblame +overblaze +overbleach +overblessed +overblessedness +overblind +overblindly +overblithe +overbloom +overblouse +overblow +overblowing +overblown +overboard +overboast +overboastful +overbodice +overboding +overbody +overboil +overbold +overboldly +overboldness +overbook +overbookish +overbooming +overborne +overborrow +overbought +overbound +overbounteous +overbounteously +overbounteousness +overbow +overbowed +overbowl +overbrace +overbragging +overbrained +overbranch +overbrave +overbravely +overbravery +overbray +overbreak +overbreathe +overbred +overbreed +overbribe +overbridge +overbright +overbrightly +overbrightness +overbrilliancy +overbrilliant +overbrilliantly +overbrim +overbrimmingly +overbroaden +overbroil +overbrood +overbrow +overbrown +overbrowse +overbrush +overbrutal +overbrutality +overbrutalize +overbrutally +overbubbling +overbuild +overbuilt +overbulk +overbulky +overbumptious +overburden +overburdeningly +overburdensome +overburn +overburned +overburningly +overburnt +overburst +overburthen +overbusily +overbusiness +overbusy +overbuy +overby +overcall +overcanny +overcanopy +overcap +overcapable +overcapably +overcapacity +overcape +overcapitalization +overcapitalize +overcaptious +overcaptiously +overcaptiousness +overcard +overcare +overcareful +overcarefully +overcareless +overcarelessly +overcarelessness +overcaring +overcarking +overcarry +overcast +overcasting +overcasual +overcasually +overcatch +overcaution +overcautious +overcautiously +overcautiousness +overcentralization +overcentralize +overcertification +overcertify +overchafe +overchannel +overchant +overcharge +overchargement +overcharger +overcharitable +overcharitably +overcharity +overchase +overcheap +overcheaply +overcheapness +overcheck +overcherish +overchidden +overchief +overchildish +overchildishness +overchill +overchlorinate +overchoke +overchrome +overchurch +overcirculate +overcircumspect +overcircumspection +overcivil +overcivility +overcivilization +overcivilize +overclaim +overclamor +overclasp +overclean +overcleanly +overcleanness +overcleave +overclever +overcleverness +overclimb +overcloak +overclog +overclose +overclosely +overcloseness +overclothe +overclothes +overcloud +overcloy +overcluster +overcoached +overcoat +overcoated +overcoating +overcoil +overcold +overcoldly +overcollar +overcolor +overcomable +overcome +overcomer +overcomingly +overcommand +overcommend +overcommon +overcommonly +overcommonness +overcompensate +overcompensation +overcompensatory +overcompetition +overcompetitive +overcomplacency +overcomplacent +overcomplacently +overcomplete +overcomplex +overcomplexity +overcompliant +overcompound +overconcentrate +overconcentration +overconcern +overconcerned +overcondensation +overcondense +overconfidence +overconfident +overconfidently +overconfute +overconquer +overconscientious +overconscious +overconsciously +overconsciousness +overconservatism +overconservative +overconservatively +overconsiderate +overconsiderately +overconsideration +overconsume +overconsumption +overcontented +overcontentedly +overcontentment +overcontract +overcontraction +overcontribute +overcontribution +overcook +overcool +overcoolly +overcopious +overcopiously +overcopiousness +overcorned +overcorrect +overcorrection +overcorrupt +overcorruption +overcorruptly +overcostly +overcount +overcourteous +overcourtesy +overcover +overcovetous +overcovetousness +overcow +overcoy +overcoyness +overcram +overcredit +overcredulity +overcredulous +overcredulously +overcreed +overcreep +overcritical +overcritically +overcriticalness +overcriticism +overcriticize +overcrop +overcross +overcrow +overcrowd +overcrowded +overcrowdedly +overcrowdedness +overcrown +overcrust +overcry +overcull +overcultivate +overcultivation +overculture +overcultured +overcumber +overcunning +overcunningly +overcunningness +overcup +overcured +overcurious +overcuriously +overcuriousness +overcurl +overcurrency +overcurrent +overcurtain +overcustom +overcut +overcutter +overcutting +overdaintily +overdaintiness +overdainty +overdamn +overdance +overdangle +overdare +overdaringly +overdarken +overdash +overdazed +overdazzle +overdeal +overdear +overdearly +overdearness +overdeck +overdecorate +overdecoration +overdecorative +overdeeming +overdeep +overdeepen +overdeeply +overdeliberate +overdeliberation +overdelicacy +overdelicate +overdelicately +overdelicious +overdeliciously +overdelighted +overdelightedly +overdemand +overdemocracy +overdepress +overdepressive +overdescant +overdesire +overdesirous +overdesirousness +overdestructive +overdestructively +overdestructiveness +overdetermination +overdetermined +overdevelop +overdevelopment +overdevoted +overdevotedly +overdevotion +overdiffuse +overdiffusely +overdiffuseness +overdigest +overdignified +overdignifiedly +overdignifiedness +overdignify +overdignity +overdiligence +overdiligent +overdiligently +overdilute +overdilution +overdischarge +overdiscipline +overdiscount +overdiscourage +overdiscouragement +overdistance +overdistant +overdistantly +overdistantness +overdistempered +overdistention +overdiverse +overdiversely +overdiversification +overdiversify +overdiversity +overdo +overdoctrinize +overdoer +overdogmatic +overdogmatically +overdogmatism +overdome +overdominate +overdone +overdoor +overdosage +overdose +overdoubt +overdoze +overdraft +overdrain +overdrainage +overdramatic +overdramatically +overdrape +overdrapery +overdraw +overdrawer +overdream +overdrench +overdress +overdrifted +overdrink +overdrip +overdrive +overdriven +overdroop +overdrowsed +overdry +overdubbed +overdue +overdunged +overdure +overdust +overdye +overeager +overeagerly +overeagerness +overearnest +overearnestly +overearnestness +overeasily +overeasiness +overeasy +overeat +overeaten +overedge +overedit +overeducate +overeducated +overeducation +overeducative +overeffort +overegg +overelaborate +overelaborately +overelaboration +overelate +overelegance +overelegancy +overelegant +overelegantly +overelliptical +overembellish +overembellishment +overembroider +overemotional +overemotionality +overemotionalize +overemphasis +overemphasize +overemphatic +overemphatically +overemphaticness +overempired +overemptiness +overempty +overenter +overenthusiasm +overenthusiastic +overentreat +overentry +overequal +overestimate +overestimation +overexcelling +overexcitability +overexcitable +overexcitably +overexcite +overexcitement +overexercise +overexert +overexerted +overexertedly +overexertedness +overexertion +overexpand +overexpansion +overexpansive +overexpect +overexpectant +overexpectantly +overexpenditure +overexpert +overexplain +overexplanation +overexpose +overexposure +overexpress +overexquisite +overexquisitely +overextend +overextension +overextensive +overextreme +overexuberant +overeye +overeyebrowed +overface +overfacile +overfacilely +overfacility +overfactious +overfactiousness +overfag +overfagged +overfaint +overfaith +overfaithful +overfaithfully +overfall +overfamed +overfamiliar +overfamiliarity +overfamiliarly +overfamous +overfanciful +overfancy +overfar +overfast +overfastidious +overfastidiously +overfastidiousness +overfasting +overfat +overfatigue +overfatten +overfavor +overfavorable +overfavorably +overfear +overfearful +overfearfully +overfearfulness +overfeast +overfeatured +overfed +overfee +overfeed +overfeel +overfellowlike +overfellowly +overfelon +overfeminine +overfeminize +overfertile +overfertility +overfestoon +overfew +overfierce +overfierceness +overfile +overfill +overfilm +overfine +overfinished +overfish +overfit +overfix +overflatten +overfleece +overfleshed +overflexion +overfling +overfloat +overflog +overflood +overflorid +overfloridness +overflourish +overflow +overflowable +overflower +overflowing +overflowingly +overflowingness +overflown +overfluency +overfluent +overfluently +overflush +overflutter +overfly +overfold +overfond +overfondle +overfondly +overfondness +overfoolish +overfoolishly +overfoolishness +overfoot +overforce +overforged +overformed +overforward +overforwardly +overforwardness +overfought +overfoul +overfoully +overfrail +overfrailty +overfranchised +overfrank +overfrankly +overfrankness +overfraught +overfree +overfreedom +overfreely +overfreight +overfrequency +overfrequent +overfrequently +overfret +overfrieze +overfrighted +overfrighten +overfroth +overfrown +overfrozen +overfruited +overfruitful +overfull +overfullness +overfunctioning +overfurnish +overgaiter +overgalled +overgamble +overgang +overgarment +overgarrison +overgaze +overgeneral +overgeneralize +overgenerally +overgenerosity +overgenerous +overgenerously +overgenial +overgeniality +overgentle +overgently +overget +overgifted +overgild +overgilted +overgird +overgirded +overgirdle +overglad +overgladly +overglance +overglass +overglaze +overglide +overglint +overgloom +overgloominess +overgloomy +overglorious +overgloss +overglut +overgo +overgoad +overgod +overgodliness +overgodly +overgood +overgorge +overgovern +overgovernment +overgown +overgrace +overgracious +overgrade +overgrain +overgrainer +overgrasping +overgrateful +overgratefully +overgratification +overgratify +overgratitude +overgraze +overgreasiness +overgreasy +overgreat +overgreatly +overgreatness +overgreed +overgreedily +overgreediness +overgreedy +overgrieve +overgrievous +overgrind +overgross +overgrossly +overgrossness +overground +overgrow +overgrown +overgrowth +overguilty +overgun +overhair +overhalf +overhand +overhanded +overhandicap +overhandle +overhang +overhappy +overharass +overhard +overharden +overhardness +overhardy +overharsh +overharshly +overharshness +overhaste +overhasten +overhastily +overhastiness +overhasty +overhate +overhatted +overhaughty +overhaul +overhauler +overhead +overheadiness +overheadman +overheady +overheap +overhear +overhearer +overheartily +overhearty +overheat +overheatedly +overheave +overheaviness +overheavy +overheight +overheighten +overheinous +overheld +overhelp +overhelpful +overhigh +overhighly +overhill +overhit +overholiness +overhollow +overholy +overhomeliness +overhomely +overhonest +overhonestly +overhonesty +overhonor +overhorse +overhot +overhotly +overhour +overhouse +overhover +overhuge +overhuman +overhumanity +overhumanize +overhung +overhunt +overhurl +overhurriedly +overhurry +overhusk +overhysterical +overidealism +overidealistic +overidle +overidly +overillustrate +overillustration +overimaginative +overimaginativeness +overimitate +overimitation +overimitative +overimitatively +overimport +overimportation +overimpress +overimpressible +overinclinable +overinclination +overinclined +overincrust +overincurious +overindividualism +overindividualistic +overindulge +overindulgence +overindulgent +overindulgently +overindustrialization +overindustrialize +overinflate +overinflation +overinflative +overinfluence +overinfluential +overinform +overink +overinsist +overinsistence +overinsistent +overinsistently +overinsolence +overinsolent +overinsolently +overinstruct +overinstruction +overinsurance +overinsure +overintellectual +overintellectuality +overintense +overintensely +overintensification +overintensity +overinterest +overinterested +overinterestedness +overinventoried +overinvest +overinvestment +overiodize +overirrigate +overirrigation +overissue +overitching +overjacket +overjade +overjaded +overjawed +overjealous +overjealously +overjealousness +overjob +overjocular +overjoy +overjoyful +overjoyfully +overjoyous +overjudge +overjudging +overjudgment +overjudicious +overjump +overjust +overjutting +overkeen +overkeenness +overkeep +overkick +overkind +overkindly +overkindness +overking +overknavery +overknee +overknow +overknowing +overlabor +overlace +overlactation +overlade +overlaid +overlain +overland +Overlander +overlander +overlanguaged +overlap +overlard +overlarge +overlargely +overlargeness +overlascivious +overlast +overlate +overlaudation +overlaudatory +overlaugh +overlaunch +overlave +overlavish +overlavishly +overlax +overlaxative +overlaxly +overlaxness +overlay +overlayer +overlead +overleaf +overlean +overleap +overlearn +overlearned +overlearnedly +overlearnedness +overleather +overleave +overleaven +overleer +overleg +overlegislation +overleisured +overlength +overlettered +overlewd +overlewdly +overlewdness +overliberal +overliberality +overliberally +overlicentious +overlick +overlie +overlier +overlift +overlight +overlighted +overlightheaded +overlightly +overlightsome +overliking +overline +overling +overlinger +overlinked +overlip +overlipping +overlisted +overlisten +overliterary +overlittle +overlive +overliveliness +overlively +overliver +overload +overloath +overlock +overlocker +overlofty +overlogical +overlogically +overlong +overlook +overlooker +overloose +overlord +overlordship +overloud +overloup +overlove +overlover +overlow +overlowness +overloyal +overloyally +overloyalty +overlubricatio +overluscious +overlush +overlustiness +overlusty +overluxuriance +overluxuriant +overluxurious +overly +overlying +overmagnify +overmagnitude +overmajority +overmalapert +overman +overmantel +overmantle +overmany +overmarch +overmark +overmarking +overmarl +overmask +overmast +overmaster +overmasterful +overmasterfully +overmasterfulness +overmastering +overmasteringly +overmatch +overmatter +overmature +overmaturity +overmean +overmeanly +overmeanness +overmeasure +overmeddle +overmeek +overmeekly +overmeekness +overmellow +overmellowness +overmelodied +overmelt +overmerciful +overmercifulness +overmerit +overmerrily +overmerry +overmettled +overmickle +overmighty +overmild +overmill +overminute +overminutely +overminuteness +overmix +overmoccasin +overmodest +overmodestly +overmodesty +overmodulation +overmoist +overmoisten +overmoisture +overmortgage +overmoss +overmost +overmotor +overmount +overmounts +overmourn +overmournful +overmournfully +overmuch +overmuchness +overmultiplication +overmultiply +overmultitude +overname +overnarrow +overnarrowly +overnationalization +overnear +overneat +overneatness +overneglect +overnegligence +overnegligent +overnervous +overnervously +overnervousness +overnet +overnew +overnice +overnicely +overniceness +overnicety +overnigh +overnight +overnimble +overnipping +overnoise +overnotable +overnourish +overnoveled +overnumber +overnumerous +overnumerousness +overnurse +overobedience +overobedient +overobediently +overobese +overobjectify +overoblige +overobsequious +overobsequiously +overobsequiousness +overoffend +overoffensive +overofficered +overofficious +overorder +overornamented +overpained +overpainful +overpainfully +overpainfulness +overpaint +overpamper +overpart +overparted +overpartial +overpartiality +overpartially +overparticular +overparticularly +overpass +overpassionate +overpassionately +overpassionateness +overpast +overpatient +overpatriotic +overpay +overpayment +overpeer +overpending +overpensive +overpensiveness +overpeople +overpepper +overperemptory +overpersuade +overpersuasion +overpert +overpessimism +overpessimistic +overpet +overphysic +overpick +overpicture +overpinching +overpitch +overpitched +overpiteous +overplace +overplaced +overplacement +overplain +overplant +overplausible +overplay +overplease +overplenitude +overplenteous +overplenteously +overplentiful +overplenty +overplot +overplow +overplumb +overplume +overplump +overplumpness +overplus +overply +overpointed +overpoise +overpole +overpolemical +overpolish +overpolitic +overponderous +overpopular +overpopularity +overpopularly +overpopulate +overpopulation +overpopulous +overpopulousness +overpositive +overpossess +overpot +overpotent +overpotential +overpour +overpower +overpowerful +overpowering +overpoweringly +overpoweringness +overpraise +overpray +overpreach +overprecise +overpreciseness +overpreface +overpregnant +overpreoccupation +overpreoccupy +overpress +overpressure +overpresumption +overpresumptuous +overprice +overprick +overprint +overprize +overprizer +overprocrastination +overproduce +overproduction +overproductive +overproficient +overprolific +overprolix +overprominence +overprominent +overprominently +overpromise +overprompt +overpromptly +overpromptness +overprone +overproneness +overpronounced +overproof +overproportion +overproportionate +overproportionated +overproportionately +overproportioned +overprosperity +overprosperous +overprotect +overprotract +overprotraction +overproud +overproudly +overprove +overprovender +overprovide +overprovident +overprovidently +overprovision +overprovocation +overprovoke +overprune +overpublic +overpublicity +overpuff +overpuissant +overpunish +overpunishment +overpurchase +overquantity +overquarter +overquell +overquick +overquickly +overquiet +overquietly +overquietness +overrace +overrack +overrake +overrange +overrank +overrankness +overrapture +overrapturize +overrash +overrashly +overrashness +overrate +overrational +overrationalize +overravish +overreach +overreacher +overreaching +overreachingly +overreachingness +overread +overreader +overreadily +overreadiness +overready +overrealism +overrealistic +overreckon +overrecord +overrefine +overrefined +overrefinement +overreflection +overreflective +overregister +overregistration +overregular +overregularity +overregularly +overregulate +overregulation +overrelax +overreliance +overreliant +overreligion +overreligious +overremiss +overremissly +overremissness +overrennet +overrent +overreplete +overrepletion +overrepresent +overrepresentation +overrepresentative +overreserved +overresolute +overresolutely +overrestore +overrestrain +overretention +overreward +overrich +overriches +overrichness +override +overrife +overrigged +overright +overrighteous +overrighteously +overrighteousness +overrigid +overrigidity +overrigidly +overrigorous +overrigorously +overrim +overriot +overripe +overripely +overripen +overripeness +overrise +overroast +overroll +overroof +overrooted +overrough +overroughly +overroughness +overroyal +overrude +overrudely +overrudeness +overruff +overrule +overruler +overruling +overrulingly +overrun +overrunner +overrunning +overrunningly +overrush +overrusset +overrust +oversad +oversadly +oversadness +oversaid +oversail +oversale +oversaliva +oversalt +oversalty +oversand +oversanded +oversanguine +oversanguinely +oversapless +oversated +oversatisfy +oversaturate +oversaturation +oversauce +oversauciness +oversaucy +oversave +overscare +overscatter +overscented +oversceptical +overscepticism +overscore +overscour +overscratch +overscrawl +overscream +overscribble +overscrub +overscruple +overscrupulosity +overscrupulous +overscrupulously +overscrupulousness +overscurf +overscutched +oversea +overseal +overseam +overseamer +oversearch +overseas +overseason +overseasoned +overseated +oversecure +oversecurely +oversecurity +oversee +overseed +overseen +overseer +overseerism +overseership +overseethe +oversell +oversend +oversensible +oversensibly +oversensitive +oversensitively +oversensitiveness +oversententious +oversentimental +oversentimentalism +oversentimentalize +oversentimentally +overserious +overseriously +overseriousness +overservice +overservile +overservility +overset +oversetter +oversettle +oversettled +oversevere +overseverely +overseverity +oversew +overshade +overshadow +overshadower +overshadowing +overshadowingly +overshadowment +overshake +oversharp +oversharpness +overshave +oversheet +overshelving +overshepherd +overshine +overshirt +overshoe +overshoot +overshort +overshorten +overshortly +overshot +overshoulder +overshowered +overshrink +overshroud +oversick +overside +oversight +oversilence +oversilent +oversilver +oversimple +oversimplicity +oversimplification +oversimplify +oversimply +oversize +oversized +overskim +overskip +overskipper +overskirt +overslack +overslander +overslaugh +overslavish +overslavishly +oversleep +oversleeve +overslide +overslight +overslip +overslope +overslow +overslowly +overslowness +overslur +oversmall +oversman +oversmite +oversmitten +oversmoke +oversmooth +oversmoothly +oversmoothness +oversnow +oversoak +oversoar +oversock +oversoft +oversoftly +oversoftness +oversold +oversolemn +oversolemnity +oversolemnly +oversolicitous +oversolicitously +oversolicitousness +oversoon +oversoothing +oversophisticated +oversophistication +oversorrow +oversorrowed +oversot +oversoul +oversound +oversour +oversourly +oversourness +oversow +overspacious +overspaciousness +overspan +overspangled +oversparing +oversparingly +oversparingness +oversparred +overspatter +overspeak +overspecialization +overspecialize +overspeculate +overspeculation +overspeculative +overspeech +overspeed +overspeedily +overspeedy +overspend +overspill +overspin +oversplash +overspread +overspring +oversprinkle +oversprung +overspun +oversqueak +oversqueamish +oversqueamishness +overstaff +overstaid +overstain +overstale +overstalled +overstand +overstaring +overstate +overstately +overstatement +overstay +overstayal +oversteadfast +oversteadfastness +oversteady +overstep +overstiff +overstiffness +overstifle +overstimulate +overstimulation +overstimulative +overstir +overstitch +overstock +overstoop +overstoping +overstore +overstory +overstout +overstoutly +overstowage +overstowed +overstrain +overstrait +overstraiten +overstraitly +overstraitness +overstream +overstrength +overstress +overstretch +overstrew +overstrict +overstrictly +overstrictness +overstride +overstrident +overstridently +overstrike +overstring +overstriving +overstrong +overstrongly +overstrung +overstud +overstudied +overstudious +overstudiously +overstudiousness +overstudy +overstuff +oversublime +oversubscribe +oversubscriber +oversubscription +oversubtile +oversubtle +oversubtlety +oversubtly +oversufficiency +oversufficient +oversufficiently +oversuperstitious +oversupply +oversure +oversurety +oversurge +oversurviving +oversusceptibility +oversusceptible +oversuspicious +oversuspiciously +overswarm +overswarth +oversway +oversweated +oversweep +oversweet +oversweeten +oversweetly +oversweetness +overswell +overswift +overswim +overswimmer +overswing +overswinging +overswirling +oversystematic +oversystematically +oversystematize +overt +overtakable +overtake +overtaker +overtalk +overtalkative +overtalkativeness +overtalker +overtame +overtamely +overtameness +overtapped +overtare +overtariff +overtarry +overtart +overtask +overtax +overtaxation +overteach +overtechnical +overtechnicality +overtedious +overtediously +overteem +overtell +overtempt +overtenacious +overtender +overtenderly +overtenderness +overtense +overtensely +overtenseness +overtension +overterrible +overtest +overthick +overthin +overthink +overthought +overthoughtful +overthriftily +overthriftiness +overthrifty +overthrong +overthrow +overthrowable +overthrowal +overthrower +overthrust +overthwart +overthwartly +overthwartness +overthwartways +overthwartwise +overtide +overtight +overtightly +overtill +overtimbered +overtime +overtimer +overtimorous +overtimorously +overtimorousness +overtinseled +overtint +overtip +overtipple +overtire +overtiredness +overtitle +overtly +overtness +overtoe +overtoil +overtoise +overtone +overtongued +overtop +overtopple +overtorture +overtower +overtrace +overtrack +overtrade +overtrader +overtrailed +overtrain +overtrample +overtravel +overtread +overtreatment +overtrick +overtrim +overtrouble +overtrue +overtrump +overtrust +overtrustful +overtruthful +overtruthfully +overtumble +overture +overturn +overturnable +overturner +overtutor +overtwine +overtwist +overtype +overuberous +overunionized +overunsuitable +overurbanization +overurge +overuse +overusual +overusually +overvaliant +overvaluable +overvaluation +overvalue +overvariety +overvault +overvehemence +overvehement +overveil +overventilate +overventilation +overventuresome +overventurous +overview +overvoltage +overvote +overwade +overwages +overwake +overwalk +overwander +overward +overwash +overwasted +overwatch +overwatcher +overwater +overwave +overway +overwealth +overwealthy +overweaponed +overwear +overweary +overweather +overweave +overweb +overween +overweener +overweening +overweeningly +overweeningness +overweep +overweigh +overweight +overweightage +overwell +overwelt +overwet +overwetness +overwheel +overwhelm +overwhelmer +overwhelming +overwhelmingly +overwhelmingness +overwhipped +overwhirl +overwhisper +overwide +overwild +overwilily +overwilling +overwillingly +overwily +overwin +overwind +overwing +overwinter +overwiped +overwisdom +overwise +overwisely +overwithered +overwoman +overwomanize +overwomanly +overwood +overwooded +overwoody +overword +overwork +overworld +overworn +overworry +overworship +overwound +overwove +overwoven +overwrap +overwrest +overwrested +overwrestle +overwrite +overwroth +overwrought +overyear +overyoung +overyouthful +overzeal +overzealous +overzealously +overzealousness +ovest +ovey +Ovibos +Ovibovinae +ovibovine +ovicapsular +ovicapsule +ovicell +ovicellular +ovicidal +ovicide +ovicular +oviculated +oviculum +ovicyst +ovicystic +Ovidae +Ovidian +oviducal +oviduct +oviductal +oviferous +ovification +oviform +ovigenesis +ovigenetic +ovigenic +ovigenous +ovigerm +ovigerous +ovile +Ovillus +Ovinae +ovine +ovinia +ovipara +oviparal +oviparity +oviparous +oviparously +oviparousness +oviposit +oviposition +ovipositor +Ovis +ovisac +oviscapt +ovism +ovispermary +ovispermiduct +ovist +ovistic +ovivorous +ovocyte +ovoelliptic +ovoflavin +ovogenesis +ovogenetic +ovogenous +ovogonium +ovoid +ovoidal +ovolemma +ovolo +ovological +ovologist +ovology +ovolytic +ovomucoid +ovoplasm +ovoplasmic +ovopyriform +ovorhomboid +ovorhomboidal +ovotesticular +ovotestis +ovovitellin +Ovovivipara +ovoviviparism +ovoviviparity +ovoviviparous +ovoviviparously +ovoviviparousness +Ovula +ovular +ovularian +ovulary +ovulate +ovulation +ovule +ovuliferous +ovuligerous +ovulist +ovum +ow +owd +owe +owelty +Owen +Owenia +Owenian +Owenism +Owenist +Owenite +Owenize +ower +owerance +owerby +owercome +owergang +owerloup +owertaen +owerword +owght +owing +owk +owl +owldom +owler +owlery +owlet +Owlglass +owlhead +owling +owlish +owlishly +owlishness +owlism +owllight +owllike +Owlspiegle +owly +own +owner +ownerless +ownership +ownhood +ownness +ownself +ownwayish +owregane +owrehip +owrelay +owse +owsen +owser +owtchah +owyheeite +ox +oxacid +oxadiazole +oxalacetic +oxalaldehyde +oxalamid +oxalamide +oxalan +oxalate +oxaldehyde +oxalemia +oxalic +Oxalidaceae +oxalidaceous +Oxalis +oxalite +oxalodiacetic +oxalonitril +oxalonitrile +oxaluramid +oxaluramide +oxalurate +oxaluria +oxaluric +oxalyl +oxalylurea +oxamate +oxamethane +oxamic +oxamid +oxamide +oxamidine +oxammite +oxan +oxanate +oxane +oxanic +oxanilate +oxanilic +oxanilide +oxazine +oxazole +oxbane +oxberry +oxbird +oxbiter +oxblood +oxbow +oxboy +oxbrake +oxcart +oxcheek +oxdiacetic +oxdiazole +oxea +oxeate +oxen +oxeote +oxer +oxetone +oxeye +oxfly +Oxford +Oxfordian +Oxfordism +Oxfordist +oxgang +oxgoad +oxharrow +oxhead +oxheal +oxheart +oxhide +oxhoft +oxhorn +oxhouse +oxhuvud +oxidability +oxidable +oxidant +oxidase +oxidate +oxidation +oxidational +oxidative +oxidator +oxide +oxidic +oxidimetric +oxidimetry +oxidizability +oxidizable +oxidization +oxidize +oxidizement +oxidizer +oxidizing +oxidoreductase +oxidoreduction +oxidulated +oximate +oximation +oxime +oxland +oxlike +oxlip +oxman +oxmanship +oxoindoline +Oxonian +oxonic +oxonium +Oxonolatry +oxozone +oxozonide +oxpecker +oxphony +oxreim +oxshoe +oxskin +oxtail +oxter +oxtongue +oxwort +oxy +oxyacanthine +oxyacanthous +oxyacetylene +oxyacid +Oxyaena +Oxyaenidae +oxyaldehyde +oxyamine +oxyanthracene +oxyanthraquinone +oxyaphia +oxyaster +oxybaphon +Oxybaphus +oxybenzaldehyde +oxybenzene +oxybenzoic +oxybenzyl +oxyberberine +oxyblepsia +oxybromide +oxybutyria +oxybutyric +oxycalcium +oxycalorimeter +oxycamphor +oxycaproic +oxycarbonate +oxycellulose +oxycephalic +oxycephalism +oxycephalous +oxycephaly +oxychlorate +oxychloric +oxychloride +oxycholesterol +oxychromatic +oxychromatin +oxychromatinic +oxycinnamic +oxycobaltammine +Oxycoccus +oxycopaivic +oxycoumarin +oxycrate +oxycyanide +oxydactyl +Oxydendrum +oxydiact +oxyesthesia +oxyether +oxyethyl +oxyfatty +oxyfluoride +oxygas +oxygen +oxygenant +oxygenate +oxygenation +oxygenator +oxygenerator +oxygenic +oxygenicity +oxygenium +oxygenizable +oxygenize +oxygenizement +oxygenizer +oxygenous +oxygeusia +oxygnathous +oxyhalide +oxyhaloid +oxyhematin +oxyhemocyanin +oxyhemoglobin +oxyhexactine +oxyhexaster +oxyhydrate +oxyhydric +oxyhydrogen +oxyiodide +oxyketone +oxyl +Oxylabracidae +Oxylabrax +oxyluciferin +oxyluminescence +oxyluminescent +oxymandelic +oxymel +oxymethylene +oxymoron +oxymuriate +oxymuriatic +oxynaphthoic +oxynaphtoquinone +oxynarcotine +oxyneurin +oxyneurine +oxynitrate +oxyntic +oxyophitic +oxyopia +Oxyopidae +oxyosphresia +oxypetalous +oxyphenol +oxyphenyl +oxyphile +oxyphilic +oxyphilous +oxyphonia +oxyphosphate +oxyphthalic +oxyphyllous +oxyphyte +oxypicric +Oxypolis +oxyproline +oxypropionic +oxypurine +oxypycnos +oxyquinaseptol +oxyquinoline +oxyquinone +oxyrhine +oxyrhinous +oxyrhynch +oxyrhynchous +oxyrhynchus +Oxyrrhyncha +oxyrrhynchid +oxysalicylic +oxysalt +oxystearic +Oxystomata +oxystomatous +oxystome +oxysulphate +oxysulphide +oxyterpene +oxytocia +oxytocic +oxytocin +oxytocous +oxytoluene +oxytoluic +oxytone +oxytonesis +oxytonical +oxytonize +Oxytricha +Oxytropis +oxytylotate +oxytylote +oxyuriasis +oxyuricide +Oxyuridae +oxyurous +oxywelding +Oyana +oyapock +oyer +oyster +oysterage +oysterbird +oystered +oysterer +oysterfish +oystergreen +oysterhood +oysterhouse +oystering +oysterish +oysterishness +oysterlike +oysterling +oysterman +oysterous +oysterroot +oysterseed +oystershell +oysterwife +oysterwoman +Ozark +ozarkite +ozena +Ozias +ozobrome +ozocerite +ozokerit +ozokerite +ozonate +ozonation +ozonator +ozone +ozoned +ozonic +ozonide +ozoniferous +ozonification +ozonify +Ozonium +ozonization +ozonize +ozonizer +ozonometer +ozonometry +ozonoscope +ozonoscopic +ozonous +ozophen +ozophene +ozostomia +ozotype +P +p +pa +paal +paar +paauw +Paba +pabble +pablo +pabouch +pabular +pabulary +pabulation +pabulatory +pabulous +pabulum +pac +paca +pacable +Pacaguara +pacate +pacation +pacative +pacay +pacaya +Paccanarist +Pacchionian +Pace +pace +paceboard +paced +pacemaker +pacemaking +pacer +pachak +pachisi +pachnolite +pachometer +Pachomian +Pachons +Pacht +pachyacria +pachyaemia +pachyblepharon +pachycarpous +pachycephal +pachycephalia +pachycephalic +pachycephalous +pachycephaly +pachychilia +pachycholia +pachychymia +pachycladous +pachydactyl +pachydactylous +pachydactyly +pachyderm +pachyderma +pachydermal +Pachydermata +pachydermatocele +pachydermatoid +pachydermatosis +pachydermatous +pachydermatously +pachydermia +pachydermial +pachydermic +pachydermoid +pachydermous +pachyemia +pachyglossal +pachyglossate +pachyglossia +pachyglossous +pachyhaemia +pachyhaemic +pachyhaemous +pachyhematous +pachyhemia +pachyhymenia +pachyhymenic +Pachylophus +pachylosis +Pachyma +pachymenia +pachymenic +pachymeningitic +pachymeningitis +pachymeninx +pachymeter +pachynathous +pachynema +pachynsis +pachyntic +pachyodont +pachyotia +pachyotous +pachyperitonitis +pachyphyllous +pachypleuritic +pachypod +pachypodous +pachypterous +Pachyrhizus +pachyrhynchous +pachysalpingitis +Pachysandra +pachysaurian +pachysomia +pachysomous +pachystichous +Pachystima +pachytene +pachytrichous +Pachytylus +pachyvaginitis +pacifiable +pacific +pacifical +pacifically +pacificate +pacification +pacificator +pacificatory +pacificism +pacificist +pacificity +pacifier +pacifism +pacifist +pacifistic +pacifistically +pacify +pacifyingly +Pacinian +pack +packable +package +packbuilder +packcloth +packer +packery +packet +packhouse +packless +packly +packmaker +packmaking +packman +packmanship +packness +packsack +packsaddle +packstaff +packthread +packwall +packwaller +packware +packway +paco +Pacolet +pacouryuva +pact +paction +pactional +pactionally +Pactolian +Pactolus +pad +padcloth +Padda +padder +padding +paddle +paddlecock +paddled +paddlefish +paddlelike +paddler +paddlewood +paddling +paddock +paddockride +paddockstone +paddockstool +Paddy +paddy +paddybird +Paddyism +paddymelon +Paddywack +paddywatch +Paddywhack +paddywhack +padella +padfoot +padge +Padina +padishah +padle +padlike +padlock +padmasana +padmelon +padnag +padpiece +Padraic +Padraig +padre +padroadist +padroado +padronism +padstone +padtree +Paduan +Paduanism +paduasoy +Padus +paean +paeanism +paeanize +paedarchy +paedatrophia +paedatrophy +paediatry +paedogenesis +paedogenetic +paedometer +paedometrical +paedomorphic +paedomorphism +paedonymic +paedonymy +paedopsychologist +paedotribe +paedotrophic +paedotrophist +paedotrophy +paegel +paegle +Paelignian +paenula +paeon +Paeonia +Paeoniaceae +Paeonian +paeonic +paetrick +paga +pagan +Paganalia +Paganalian +pagandom +paganic +paganical +paganically +paganish +paganishly +paganism +paganist +paganistic +paganity +paganization +paganize +paganizer +paganly +paganry +pagatpat +page +pageant +pageanted +pageanteer +pageantic +pageantry +pagedom +pageful +pagehood +pageless +pagelike +pager +pageship +pagina +paginal +paginary +paginate +pagination +pagiopod +Pagiopoda +pagoda +pagodalike +pagodite +pagoscope +pagrus +Paguma +pagurian +pagurid +Paguridae +Paguridea +pagurine +Pagurinea +paguroid +Paguroidea +Pagurus +pagus +pah +paha +Pahareen +Pahari +Paharia +pahi +Pahlavi +pahlavi +pahmi +paho +pahoehoe +Pahouin +pahutan +Paiconeca +paideutic +paideutics +paidological +paidologist +paidology +paidonosology +paigle +paik +pail +pailful +paillasse +paillette +pailletted +pailou +paimaneh +pain +pained +painful +painfully +painfulness +paining +painingly +painkiller +painless +painlessly +painlessness +painproof +painstaker +painstaking +painstakingly +painstakingness +painsworthy +paint +paintability +paintable +paintableness +paintably +paintbox +paintbrush +painted +paintedness +painter +painterish +painterlike +painterly +paintership +paintiness +painting +paintingness +paintless +paintpot +paintproof +paintress +paintrix +paintroot +painty +paip +pair +paired +pairedness +pairer +pairment +pairwise +pais +paisa +paisanite +Paisley +Paiute +paiwari +pajahuello +pajama +pajamaed +pajock +Pajonism +Pakawa +Pakawan +pakchoi +pakeha +Pakhpuluk +Pakhtun +Pakistani +paktong +pal +Pala +palace +palaced +palacelike +palaceous +palaceward +palacewards +paladin +palaeanthropic +Palaearctic +Palaeechini +palaeechinoid +Palaeechinoidea +palaeechinoidean +palaeentomology +palaeethnologic +palaeethnological +palaeethnologist +palaeethnology +Palaeeudyptes +Palaeic +palaeichthyan +Palaeichthyes +palaeichthyic +Palaemon +palaemonid +Palaemonidae +palaemonoid +palaeoalchemical +palaeoanthropic +palaeoanthropography +palaeoanthropology +Palaeoanthropus +palaeoatavism +palaeoatavistic +palaeobiogeography +palaeobiologist +palaeobiology +palaeobotanic +palaeobotanical +palaeobotanically +palaeobotanist +palaeobotany +Palaeocarida +palaeoceanography +Palaeocene +palaeochorology +palaeoclimatic +palaeoclimatology +Palaeoconcha +palaeocosmic +palaeocosmology +Palaeocrinoidea +palaeocrystal +palaeocrystallic +palaeocrystalline +palaeocrystic +palaeocyclic +palaeodendrologic +palaeodendrological +palaeodendrologically +palaeodendrologist +palaeodendrology +Palaeodictyoptera +palaeodictyopteran +palaeodictyopteron +palaeodictyopterous +palaeoencephalon +palaeoeremology +palaeoethnic +palaeoethnologic +palaeoethnological +palaeoethnologist +palaeoethnology +palaeofauna +Palaeogaea +Palaeogaean +palaeogene +palaeogenesis +palaeogenetic +palaeogeographic +palaeogeography +palaeoglaciology +palaeoglyph +Palaeognathae +palaeognathic +palaeognathous +palaeograph +palaeographer +palaeographic +palaeographical +palaeographically +palaeographist +palaeography +palaeoherpetologist +palaeoherpetology +palaeohistology +palaeohydrography +palaeolatry +palaeolimnology +palaeolith +palaeolithic +palaeolithical +palaeolithist +palaeolithoid +palaeolithy +palaeological +palaeologist +palaeology +Palaeomastodon +palaeometallic +palaeometeorological +palaeometeorology +Palaeonemertea +palaeonemertean +palaeonemertine +Palaeonemertinea +Palaeonemertini +palaeoniscid +Palaeoniscidae +palaeoniscoid +Palaeoniscum +Palaeoniscus +palaeontographic +palaeontographical +palaeontography +palaeopathology +palaeopedology +palaeophile +palaeophilist +Palaeophis +palaeophysiography +palaeophysiology +palaeophytic +palaeophytological +palaeophytologist +palaeophytology +palaeoplain +palaeopotamology +palaeopsychic +palaeopsychological +palaeopsychology +palaeoptychology +Palaeornis +Palaeornithinae +palaeornithine +palaeornithological +palaeornithology +palaeosaur +Palaeosaurus +palaeosophy +Palaeospondylus +Palaeostraca +palaeostracan +palaeostriatal +palaeostriatum +palaeostylic +palaeostyly +palaeotechnic +palaeothalamus +Palaeothentes +Palaeothentidae +palaeothere +palaeotherian +Palaeotheriidae +palaeotheriodont +palaeotherioid +Palaeotherium +palaeotheroid +Palaeotropical +palaeotype +palaeotypic +palaeotypical +palaeotypically +palaeotypographical +palaeotypographist +palaeotypography +palaeovolcanic +Palaeozoic +palaeozoological +palaeozoologist +palaeozoology +palaestra +palaestral +palaestrian +palaestric +palaestrics +palaetiological +palaetiologist +palaetiology +palafitte +palagonite +palagonitic +Palaic +Palaihnihan +palaiotype +palaite +palama +palamate +palame +Palamedea +palamedean +Palamedeidae +Palamite +Palamitism +palampore +palander +palanka +palankeen +palanquin +palapalai +Palapteryx +Palaquium +palar +palas +palatability +palatable +palatableness +palatably +palatal +palatalism +palatality +palatalization +palatalize +palate +palated +palateful +palatefulness +palateless +palatelike +palatial +palatially +palatialness +palatian +palatic +palatinal +palatinate +palatine +palatineship +Palatinian +palatinite +palation +palatist +palatitis +palative +palatization +palatize +palatoalveolar +palatodental +palatoglossal +palatoglossus +palatognathous +palatogram +palatograph +palatography +palatomaxillary +palatometer +palatonasal +palatopharyngeal +palatopharyngeus +palatoplasty +palatoplegia +palatopterygoid +palatoquadrate +palatorrhaphy +palatoschisis +Palatua +Palau +Palaung +palaver +palaverer +palaverist +palaverment +palaverous +palay +palazzi +palberry +palch +pale +palea +paleaceous +paleanthropic +Palearctic +paleate +palebelly +palebuck +palechinoid +paled +paledness +paleencephalon +paleentomology +paleethnographer +paleethnologic +paleethnological +paleethnologist +paleethnology +paleface +palehearted +paleichthyologic +paleichthyologist +paleichthyology +paleiform +palely +Paleman +paleness +Palenque +paleoalchemical +paleoandesite +paleoanthropic +paleoanthropography +paleoanthropological +paleoanthropologist +paleoanthropology +Paleoanthropus +paleoatavism +paleoatavistic +paleobiogeography +paleobiologist +paleobiology +paleobotanic +paleobotanical +paleobotanically +paleobotanist +paleobotany +paleoceanography +Paleocene +paleochorology +paleoclimatic +paleoclimatologist +paleoclimatology +Paleoconcha +paleocosmic +paleocosmology +paleocrystal +paleocrystallic +paleocrystalline +paleocrystic +paleocyclic +paleodendrologic +paleodendrological +paleodendrologically +paleodendrologist +paleodendrology +paleoecologist +paleoecology +paleoencephalon +paleoeremology +paleoethnic +paleoethnography +paleoethnologic +paleoethnological +paleoethnologist +paleoethnology +paleofauna +Paleogene +paleogenesis +paleogenetic +paleogeographic +paleogeography +paleoglaciology +paleoglyph +paleograph +paleographer +paleographic +paleographical +paleographically +paleographist +paleography +paleoherpetologist +paleoherpetology +paleohistology +paleohydrography +paleoichthyology +paleokinetic +paleola +paleolate +paleolatry +paleolimnology +paleolith +paleolithic +paleolithical +paleolithist +paleolithoid +paleolithy +paleological +paleologist +paleology +paleomammalogy +paleometallic +paleometeorological +paleometeorology +paleontographic +paleontographical +paleontography +paleontologic +paleontological +paleontologically +paleontologist +paleontology +paleopathology +paleopedology +paleophysiography +paleophysiology +paleophytic +paleophytological +paleophytologist +paleophytology +paleopicrite +paleoplain +paleopotamoloy +paleopsychic +paleopsychological +paleopsychology +paleornithological +paleornithology +paleostriatal +paleostriatum +paleostylic +paleostyly +paleotechnic +paleothalamus +paleothermal +paleothermic +Paleotropical +paleovolcanic +paleoytterbium +Paleozoic +paleozoological +paleozoologist +paleozoology +paler +Palermitan +Palermo +Pales +Palesman +Palestinian +palestra +palestral +palestrian +palestric +palet +paletiology +paletot +palette +paletz +palewise +palfrey +palfreyed +palgat +Pali +pali +Palicourea +palification +paliform +paligorskite +palikar +palikarism +palikinesia +palila +palilalia +Palilia +Palilicium +palillogia +palilogetic +palilogy +palimbacchic +palimbacchius +palimpsest +palimpsestic +palinal +palindrome +palindromic +palindromical +palindromically +palindromist +paling +palingenesia +palingenesian +palingenesis +palingenesist +palingenesy +palingenetic +palingenetically +palingenic +palingenist +palingeny +palinode +palinodial +palinodic +palinodist +palinody +palinurid +Palinuridae +palinuroid +Palinurus +paliphrasia +palirrhea +palisade +palisading +palisado +palisander +palisfy +palish +palistrophia +Paliurus +palkee +pall +palla +palladammine +Palladia +palladia +Palladian +Palladianism +palladic +palladiferous +palladinize +palladion +palladious +Palladium +palladium +palladiumize +palladize +palladodiammine +palladosammine +palladous +pallae +pallah +pallall +pallanesthesia +Pallas +pallasite +pallbearer +palled +pallescence +pallescent +pallesthesia +pallet +palleting +palletize +pallette +pallholder +palli +pallial +palliard +palliasse +Palliata +palliata +palliate +palliation +palliative +palliatively +palliator +palliatory +pallid +pallidiflorous +pallidipalpate +palliditarsate +pallidity +pallidiventrate +pallidly +pallidness +palliness +Palliobranchiata +palliobranchiate +palliocardiac +pallioessexite +pallion +palliopedal +palliostratus +pallium +Palliyan +pallograph +pallographic +pallometric +pallone +pallor +Pallu +Palluites +pallwise +pally +palm +palma +Palmaceae +palmaceous +palmad +Palmae +palmanesthesia +palmar +palmarian +palmary +palmate +palmated +palmately +palmatifid +palmatiform +palmatilobate +palmatilobed +palmation +palmatiparted +palmatipartite +palmatisect +palmatisected +palmature +palmcrist +palmed +Palmella +Palmellaceae +palmellaceous +palmelloid +palmer +palmerite +palmery +palmesthesia +palmette +palmetto +palmetum +palmful +palmicolous +palmiferous +palmification +palmiform +palmigrade +palmilobate +palmilobated +palmilobed +palminervate +palminerved +palmiped +Palmipedes +palmipes +palmist +palmister +palmistry +palmitate +palmite +palmitic +palmitin +palmitinic +palmito +palmitoleic +palmitone +palmiveined +palmivorous +palmlike +palmo +palmodic +palmoscopy +palmospasmus +palmula +palmus +palmwise +palmwood +palmy +palmyra +Palmyrene +Palmyrenian +palolo +palombino +palometa +palomino +palosapis +palouser +paloverde +palp +palpability +palpable +palpableness +palpably +palpacle +palpal +palpate +palpation +palpatory +palpebra +palpebral +palpebrate +palpebration +palpebritis +palped +palpi +palpicorn +Palpicornia +palpifer +palpiferous +palpiform +palpiger +palpigerous +palpitant +palpitate +palpitatingly +palpitation +palpless +palpocil +palpon +palpulus +palpus +palsgrave +palsgravine +palsied +palsification +palstave +palster +palsy +palsylike +palsywort +palt +Palta +palter +palterer +palterly +paltrily +paltriness +paltry +paludal +paludament +paludamentum +paludial +paludian +paludic +Paludicella +Paludicolae +paludicole +paludicoline +paludicolous +paludiferous +Paludina +paludinal +paludine +paludinous +paludism +paludose +paludous +paludrin +paludrine +palule +palulus +Palus +palus +palustral +palustrian +palustrine +paly +palynology +pam +pambanmanche +Pamela +pament +pameroon +Pamir +Pamiri +Pamirian +Pamlico +pamment +Pampanga +Pampangan +Pampango +pampas +pampean +pamper +pampered +pamperedly +pamperedness +pamperer +pamperize +pampero +pamphagous +pampharmacon +Pamphiliidae +Pamphilius +pamphlet +pamphletage +pamphletary +pamphleteer +pamphleter +pamphletful +pamphletic +pamphletical +pamphletize +pamphletwise +pamphysical +pamphysicism +pampilion +pampiniform +pampinocele +pamplegia +pampootee +pampootie +pampre +pamprodactyl +pamprodactylism +pamprodactylous +pampsychism +pampsychist +Pamunkey +Pan +pan +panace +panacea +panacean +panaceist +panache +panached +panachure +panada +panade +Panagia +panagiarion +Panak +Panaka +panama +Panamaian +Panaman +Panamanian +Panamano +Panamic +Panamint +Panamist +panapospory +panarchic +panarchy +panaris +panaritium +panarteritis +panarthritis +panary +panatela +Panathenaea +Panathenaean +Panathenaic +panatrophy +panautomorphic +panax +Panayan +Panayano +panbabylonian +panbabylonism +Panboeotian +pancake +pancarditis +panchama +panchayat +pancheon +panchion +panchromatic +panchromatism +panchromatization +panchromatize +panchway +panclastic +panconciliatory +pancosmic +pancosmism +pancosmist +pancratian +pancratiast +pancratiastic +pancratic +pancratical +pancratically +pancration +pancratism +pancratist +pancratium +pancreas +pancreatalgia +pancreatectomize +pancreatectomy +pancreatemphraxis +pancreathelcosis +pancreatic +pancreaticoduodenal +pancreaticoduodenostomy +pancreaticogastrostomy +pancreaticosplenic +pancreatin +pancreatism +pancreatitic +pancreatitis +pancreatization +pancreatize +pancreatoduodenectomy +pancreatoenterostomy +pancreatogenic +pancreatogenous +pancreatoid +pancreatolipase +pancreatolith +pancreatomy +pancreatoncus +pancreatopathy +pancreatorrhagia +pancreatotomy +pancreectomy +pancreozymin +pancyclopedic +pand +panda +pandal +pandan +Pandanaceae +pandanaceous +Pandanales +Pandanus +pandaram +Pandarctos +pandaric +Pandarus +pandation +Pandean +pandect +Pandectist +pandemia +pandemian +pandemic +pandemicity +pandemoniac +Pandemoniacal +Pandemonian +pandemonic +pandemonism +Pandemonium +pandemonium +Pandemos +pandemy +pandenominational +pander +panderage +panderer +panderess +panderism +panderize +panderly +Panderma +pandermite +panderous +pandership +pandestruction +pandiabolism +pandiculation +Pandion +Pandionidae +pandita +pandle +pandlewhew +Pandora +pandora +Pandorea +Pandoridae +Pandorina +Pandosto +pandour +pandowdy +pandrop +pandura +pandurate +pandurated +panduriform +pandy +pane +panecclesiastical +paned +panegoism +panegoist +panegyric +panegyrical +panegyrically +panegyricize +panegyricon +panegyricum +panegyris +panegyrist +panegyrize +panegyrizer +panegyry +paneity +panel +panela +panelation +paneler +paneless +paneling +panelist +panellation +panelling +panelwise +panelwork +panentheism +panesthesia +panesthetic +paneulogism +panfil +panfish +panful +pang +Pangaea +pangamic +pangamous +pangamously +pangamy +pangane +Pangasinan +pangen +pangene +pangenesis +pangenetic +pangenetically +pangenic +pangful +pangi +Pangium +pangless +panglessly +panglima +Pangloss +Panglossian +Panglossic +pangolin +pangrammatist +Pangwe +panhandle +panhandler +panharmonic +panharmonicon +panhead +panheaded +Panhellenic +Panhellenios +Panhellenism +Panhellenist +Panhellenium +panhidrosis +panhuman +panhygrous +panhyperemia +panhysterectomy +Pani +panic +panical +panically +panicful +panichthyophagous +panicked +panicky +panicle +panicled +paniclike +panicmonger +panicmongering +paniconograph +paniconographic +paniconography +Panicularia +paniculate +paniculated +paniculately +paniculitis +Panicum +panidiomorphic +panidrosis +panification +panimmunity +Paninean +Panionia +Panionian +Panionic +Paniquita +Paniquitan +panisc +panisca +paniscus +panisic +panivorous +Panjabi +panjandrum +pank +pankin +pankration +panleucopenia +panlogical +panlogism +panlogistical +panman +panmelodicon +panmelodion +panmerism +panmeristic +panmixia +panmixy +panmnesia +panmug +panmyelophthisis +Panna +pannade +pannage +pannam +pannationalism +panne +pannel +panner +pannery +panneuritic +panneuritis +pannicle +pannicular +pannier +panniered +pannierman +pannikin +panning +Pannonian +Pannonic +pannose +pannosely +pannum +pannus +pannuscorium +Panoan +panocha +panoche +panococo +panoistic +panomphaic +panomphean +panomphic +panophobia +panophthalmia +panophthalmitis +panoplied +panoplist +panoply +panoptic +panoptical +panopticon +panoram +panorama +panoramic +panoramical +panoramically +panoramist +panornithic +Panorpa +Panorpatae +panorpian +panorpid +Panorpidae +panosteitis +panostitis +panotitis +panotype +panouchi +panpathy +panpharmacon +panphenomenalism +panphobia +Panpipe +panplegia +panpneumatism +panpolism +panpsychic +panpsychism +panpsychist +panpsychistic +panscientist +pansciolism +pansciolist +pansclerosis +pansclerotic +panse +pansexism +pansexual +pansexualism +pansexualist +pansexuality +pansexualize +panshard +panside +pansideman +pansied +pansinuitis +pansinusitis +pansmith +pansophic +pansophical +pansophically +pansophism +pansophist +pansophy +panspermatism +panspermatist +panspermia +panspermic +panspermism +panspermist +panspermy +pansphygmograph +panstereorama +pansy +pansylike +pant +pantachromatic +pantacosm +pantagamy +pantagogue +pantagraph +pantagraphic +pantagraphical +Pantagruel +Pantagruelian +Pantagruelic +Pantagruelically +Pantagrueline +pantagruelion +Pantagruelism +Pantagruelist +Pantagruelistic +Pantagruelistical +Pantagruelize +pantaleon +pantaletless +pantalets +pantaletted +pantalgia +pantalon +Pantalone +pantaloon +pantalooned +pantaloonery +pantaloons +pantameter +pantamorph +pantamorphia +pantamorphic +pantanemone +pantanencephalia +pantanencephalic +pantaphobia +pantarbe +pantarchy +pantas +pantascope +pantascopic +Pantastomatida +Pantastomina +pantatrophia +pantatrophy +pantatype +pantechnic +pantechnicon +pantelegraph +pantelegraphy +panteleologism +pantelephone +pantelephonic +pantellerite +panter +panterer +Pantheian +pantheic +pantheism +pantheist +pantheistic +pantheistical +pantheistically +panthelematism +panthelism +pantheologist +pantheology +pantheon +pantheonic +pantheonization +pantheonize +panther +pantheress +pantherine +pantherish +pantherlike +pantherwood +pantheum +pantie +panties +pantile +pantiled +pantiling +panting +pantingly +pantisocracy +pantisocrat +pantisocratic +pantisocratical +pantisocratist +pantle +pantler +panto +pantochrome +pantochromic +pantochromism +pantochronometer +Pantocrator +pantod +Pantodon +Pantodontidae +pantoffle +pantofle +pantoganglitis +pantogelastic +pantoglossical +pantoglot +pantoglottism +pantograph +pantographer +pantographic +pantographical +pantographically +pantography +pantoiatrical +pantologic +pantological +pantologist +pantology +pantomancer +pantometer +pantometric +pantometrical +pantometry +pantomime +pantomimic +pantomimical +pantomimically +pantomimicry +pantomimish +pantomimist +pantomimus +pantomnesia +pantomnesic +pantomorph +pantomorphia +pantomorphic +panton +pantoon +pantopelagian +pantophagic +pantophagist +pantophagous +pantophagy +pantophile +pantophobia +pantophobic +pantophobous +pantoplethora +pantopod +Pantopoda +pantopragmatic +pantopterous +pantoscope +pantoscopic +pantosophy +Pantostomata +pantostomate +pantostomatous +pantostome +pantotactic +pantothenate +pantothenic +Pantotheria +pantotherian +pantotype +pantoum +pantropic +pantropical +pantry +pantryman +pantrywoman +pants +pantun +panty +pantywaist +panung +panurgic +panurgy +panyar +panzoism +panzootia +panzootic +panzooty +paolo +paon +pap +papa +papability +papable +papabot +papacy +papagallo +Papago +papain +papal +papalism +papalist +papalistic +papalization +papalize +papalizer +papally +papalty +papane +papaphobia +papaphobist +papaprelatical +papaprelatist +paparchical +paparchy +papaship +Papaver +Papaveraceae +papaveraceous +Papaverales +papaverine +papaverous +papaw +papaya +Papayaceae +papayaceous +papayotin +papboat +pape +papelonne +paper +paperback +paperbark +paperboard +papered +paperer +paperful +paperiness +papering +paperlike +papermaker +papermaking +papermouth +papern +papershell +paperweight +papery +papess +papeterie +papey +Paphian +Paphiopedilum +Papiamento +papicolar +papicolist +Papilio +Papilionaceae +papilionaceous +Papiliones +papilionid +Papilionidae +Papilionides +Papilioninae +papilionine +papilionoid +Papilionoidea +papilla +papillae +papillar +papillary +papillate +papillated +papillectomy +papilledema +papilliferous +papilliform +papillitis +papilloadenocystoma +papillocarcinoma +papilloedema +papilloma +papillomatosis +papillomatous +papillon +papilloretinitis +papillosarcoma +papillose +papillosity +papillote +papillous +papillulate +papillule +Papinachois +Papio +papion +papish +papisher +papism +Papist +papist +papistic +papistical +papistically +papistlike +papistly +papistry +papize +papless +papmeat +papolater +papolatrous +papolatry +papoose +papooseroot +Pappea +pappescent +pappi +pappiferous +pappiform +pappose +pappox +pappus +pappy +papreg +paprica +paprika +Papuan +papula +papular +papulate +papulated +papulation +papule +papuliferous +papuloerythematous +papulopustular +papulopustule +papulose +papulosquamous +papulous +papulovesicular +papyr +papyraceous +papyral +papyrean +papyri +papyrian +papyrin +papyrine +papyritious +papyrocracy +papyrograph +papyrographer +papyrographic +papyrography +papyrological +papyrologist +papyrology +papyrophobia +papyroplastics +papyrotamia +papyrotint +papyrotype +papyrus +Paque +paquet +par +para +paraaminobenzoic +parabanate +parabanic +parabaptism +parabaptization +parabasal +parabasic +parabasis +parabema +parabematic +parabenzoquinone +parabiosis +parabiotic +parablast +parablastic +parable +parablepsia +parablepsis +parablepsy +parableptic +parabola +parabolanus +parabolic +parabolical +parabolicalism +parabolically +parabolicness +paraboliform +parabolist +parabolization +parabolize +parabolizer +paraboloid +paraboloidal +parabomb +parabotulism +parabranchia +parabranchial +parabranchiate +parabulia +parabulic +paracanthosis +paracarmine +paracasein +paracaseinate +Paracelsian +Paracelsianism +Paracelsic +Paracelsist +Paracelsistic +Paracelsus +paracentesis +paracentral +paracentric +paracentrical +paracephalus +paracerebellar +paracetaldehyde +parachaplain +paracholia +parachor +parachordal +parachrea +parachroia +parachroma +parachromatism +parachromatophorous +parachromatopsia +parachromatosis +parachrome +parachromoparous +parachromophoric +parachromophorous +parachronism +parachronistic +parachrose +parachute +parachutic +parachutism +parachutist +paraclete +paracmasis +paracme +paracoele +paracoelian +paracolitis +paracolon +paracolpitis +paracolpium +paracondyloid +paracone +paraconic +paraconid +paraconscious +paracorolla +paracotoin +paracoumaric +paracresol +Paracress +paracusia +paracusic +paracyanogen +paracyesis +paracymene +paracystic +paracystitis +paracystium +parade +paradeful +paradeless +paradelike +paradenitis +paradental +paradentitis +paradentium +parader +paraderm +paradiastole +paradiazine +paradichlorbenzene +paradichlorbenzol +paradichlorobenzene +paradichlorobenzol +paradidymal +paradidymis +paradigm +paradigmatic +paradigmatical +paradigmatically +paradigmatize +parading +paradingly +paradiplomatic +paradisaic +paradisaically +paradisal +paradise +Paradisea +paradisean +Paradiseidae +Paradiseinae +Paradisia +paradisiac +paradisiacal +paradisiacally +paradisial +paradisian +paradisic +paradisical +parado +paradoctor +parados +paradoses +paradox +paradoxal +paradoxer +paradoxial +paradoxic +paradoxical +paradoxicalism +paradoxicality +paradoxically +paradoxicalness +paradoxician +Paradoxides +paradoxidian +paradoxism +paradoxist +paradoxographer +paradoxographical +paradoxology +paradoxure +Paradoxurinae +paradoxurine +Paradoxurus +paradoxy +paradromic +paraenesis +paraenesize +paraenetic +paraenetical +paraengineer +paraffin +paraffine +paraffiner +paraffinic +paraffinize +paraffinoid +paraffiny +paraffle +parafle +parafloccular +paraflocculus +paraform +paraformaldehyde +parafunction +paragammacism +paraganglion +paragaster +paragastral +paragastric +paragastrula +paragastrular +parage +paragenesia +paragenesis +paragenetic +paragenic +paragerontic +parageusia +parageusic +parageusis +paragglutination +paraglenal +paraglobin +paraglobulin +paraglossa +paraglossal +paraglossate +paraglossia +paraglycogen +paragnath +paragnathism +paragnathous +paragnathus +paragneiss +paragnosia +paragoge +paragogic +paragogical +paragogically +paragogize +paragon +paragonimiasis +Paragonimus +paragonite +paragonitic +paragonless +paragram +paragrammatist +paragraph +paragrapher +paragraphia +paragraphic +paragraphical +paragraphically +paragraphism +paragraphist +paragraphistical +paragraphize +Paraguay +Paraguayan +parah +paraheliotropic +paraheliotropism +parahematin +parahemoglobin +parahepatic +Parahippus +parahopeite +parahormone +parahydrogen +paraiba +Paraiyan +parakeet +parakeratosis +parakilya +parakinesia +parakinetic +paralactate +paralalia +paralambdacism +paralambdacismus +paralaurionite +paraldehyde +parale +paralectotype +paraleipsis +paralepsis +paralexia +paralexic +paralgesia +paralgesic +paralinin +paralipomena +Paralipomenon +paralipsis +paralitical +parallactic +parallactical +parallactically +parallax +parallel +parallelable +parallelepiped +parallelepipedal +parallelepipedic +parallelepipedon +parallelepipedonal +paralleler +parallelinervate +parallelinerved +parallelinervous +parallelism +parallelist +parallelistic +parallelith +parallelization +parallelize +parallelizer +parallelless +parallelly +parallelodrome +parallelodromous +parallelogram +parallelogrammatic +parallelogrammatical +parallelogrammic +parallelogrammical +parallelograph +parallelometer +parallelopiped +parallelopipedon +parallelotropic +parallelotropism +parallelwise +parallepipedous +paralogia +paralogical +paralogician +paralogism +paralogist +paralogistic +paralogize +paralogy +paraluminite +paralyses +paralysis +paralytic +paralytical +paralytically +paralyzant +paralyzation +paralyze +paralyzedly +paralyzer +paralyzingly +param +paramagnet +paramagnetic +paramagnetism +paramandelic +paramarine +paramastigate +paramastitis +paramastoid +paramatta +Paramecidae +Paramecium +paramedian +paramelaconite +paramenia +parament +paramere +parameric +parameron +paramese +paramesial +parameter +parametric +parametrical +parametritic +parametritis +parametrium +paramide +paramilitary +paramimia +paramine +paramiographer +paramitome +paramnesia +paramo +Paramoecium +paramorph +paramorphia +paramorphic +paramorphine +paramorphism +paramorphosis +paramorphous +paramount +paramountcy +paramountly +paramountness +paramountship +paramour +paramuthetic +paramyelin +paramylum +paramyoclonus +paramyosinogen +paramyotone +paramyotonia +paranasal +paranatellon +parandrus +paranema +paranematic +paranephric +paranephritic +paranephritis +paranephros +paranepionic +paranete +parang +paranitraniline +paranitrosophenol +paranoia +paranoiac +paranoid +paranoidal +paranoidism +paranomia +paranormal +paranosic +paranthelion +paranthracene +Paranthropus +paranuclear +paranucleate +paranucleic +paranuclein +paranucleinic +paranucleus +paranymph +paranymphal +parao +paraoperation +Parapaguridae +paraparesis +paraparetic +parapathia +parapathy +parapegm +parapegma +paraperiodic +parapet +parapetalous +parapeted +parapetless +paraph +paraphasia +paraphasic +paraphemia +paraphenetidine +paraphenylene +paraphenylenediamine +parapherna +paraphernal +paraphernalia +paraphernalian +paraphia +paraphilia +paraphimosis +paraphonia +paraphonic +paraphototropism +paraphrasable +paraphrase +paraphraser +paraphrasia +paraphrasian +paraphrasis +paraphrasist +paraphrast +paraphraster +paraphrastic +paraphrastical +paraphrastically +paraphrenia +paraphrenic +paraphrenitis +paraphyllium +paraphysate +paraphysical +paraphysiferous +paraphysis +paraplasis +paraplasm +paraplasmic +paraplastic +paraplastin +paraplectic +paraplegia +paraplegic +paraplegy +parapleuritis +parapleurum +parapod +parapodial +parapodium +parapophysial +parapophysis +parapraxia +parapraxis +paraproctitis +paraproctium +paraprostatitis +Parapsida +parapsidal +parapsidan +parapsis +parapsychical +parapsychism +parapsychological +parapsychology +parapsychosis +parapteral +parapteron +parapterum +paraquadrate +paraquinone +Pararctalia +Pararctalian +pararectal +pararek +parareka +pararhotacism +pararosaniline +pararosolic +pararthria +parasaboteur +parasalpingitis +parasang +parascene +parascenium +parasceve +paraschematic +parasecretion +paraselene +paraselenic +parasemidin +parasemidine +parasexuality +parashah +parasigmatism +parasigmatismus +Parasita +parasital +parasitary +parasite +parasitelike +parasitemia +parasitic +Parasitica +parasitical +parasitically +parasiticalness +parasiticidal +parasiticide +Parasitidae +parasitism +parasitize +parasitogenic +parasitoid +parasitoidism +parasitological +parasitologist +parasitology +parasitophobia +parasitosis +parasitotrope +parasitotropic +parasitotropism +parasitotropy +paraskenion +parasol +parasoled +parasolette +paraspecific +parasphenoid +parasphenoidal +paraspotter +paraspy +parastas +parastatic +parastemon +parastemonal +parasternal +parasternum +parastichy +parastyle +parasubphonate +parasubstituted +Parasuchia +parasuchian +parasympathetic +parasympathomimetic +parasynapsis +parasynaptic +parasynaptist +parasyndesis +parasynesis +parasynetic +parasynovitis +parasynthesis +parasynthetic +parasyntheton +parasyphilis +parasyphilitic +parasyphilosis +parasystole +paratactic +paratactical +paratactically +paratartaric +parataxis +parate +paraterminal +Paratheria +paratherian +parathesis +parathetic +parathion +parathormone +parathymic +parathyroid +parathyroidal +parathyroidectomize +parathyroidectomy +parathyroprival +parathyroprivia +parathyroprivic +paratitla +paratitles +paratoloid +paratoluic +paratoluidine +paratomial +paratomium +paratonic +paratonically +paratorium +paratory +paratracheal +paratragedia +paratragoedia +paratransversan +paratrichosis +paratrimma +paratriptic +paratroop +paratrooper +paratrophic +paratrophy +paratuberculin +paratuberculosis +paratuberculous +paratungstate +paratungstic +paratype +paratyphlitis +paratyphoid +paratypic +paratypical +paratypically +paravaginitis +paravail +paravane +paravauxite +paravent +paravertebral +paravesical +paraxial +paraxially +paraxon +paraxonic +paraxylene +Parazoa +parazoan +parazonium +parbake +Parbate +parboil +parbuckle +parcel +parceling +parcellary +parcellate +parcellation +parcelling +parcellization +parcellize +parcelment +parcelwise +parcenary +parcener +parcenership +parch +parchable +parchedly +parchedness +parcheesi +parchemin +parcher +parchesi +parching +parchingly +parchisi +parchment +parchmenter +parchmentize +parchmentlike +parchmenty +parchy +parcidentate +parciloquy +parclose +parcook +pard +pardalote +Pardanthus +pardao +parded +pardesi +pardine +pardner +pardnomastic +pardo +pardon +pardonable +pardonableness +pardonably +pardonee +pardoner +pardoning +pardonless +pardonmonger +pare +paregoric +Pareiasauri +Pareiasauria +pareiasaurian +Pareiasaurus +Pareioplitae +parel +parelectronomic +parelectronomy +parella +paren +parencephalic +parencephalon +parenchym +parenchyma +parenchymal +parenchymatic +parenchymatitis +parenchymatous +parenchymatously +parenchyme +parenchymous +parent +parentage +parental +Parentalia +parentalism +parentality +parentally +parentdom +parentela +parentelic +parenteral +parenterally +parentheses +parenthesis +parenthesize +parenthetic +parenthetical +parentheticality +parenthetically +parentheticalness +parenthood +parenticide +parentless +parentlike +parentship +Pareoean +parepididymal +parepididymis +parepigastric +parer +parerethesis +parergal +parergic +parergon +paresis +paresthesia +paresthesis +paresthetic +parethmoid +paretic +paretically +pareunia +parfait +parfilage +parfleche +parfocal +pargana +pargasite +parge +pargeboard +parget +pargeter +pargeting +pargo +parhelia +parheliacal +parhelic +parhelion +parhomologous +parhomology +parhypate +pari +pariah +pariahdom +pariahism +pariahship +parial +Parian +parian +Pariasauria +Pariasaurus +Paridae +paridigitate +paridrosis +paries +parietal +Parietales +Parietaria +parietary +parietes +parietofrontal +parietojugal +parietomastoid +parietoquadrate +parietosphenoid +parietosphenoidal +parietosplanchnic +parietosquamosal +parietotemporal +parietovaginal +parietovisceral +parify +parigenin +pariglin +Parilia +Parilicium +parilla +parillin +parimutuel +Parinarium +parine +paring +paripinnate +Paris +parish +parished +parishen +parishional +parishionally +parishionate +parishioner +parishionership +Parisian +Parisianism +Parisianization +Parisianize +Parisianly +Parisii +parisis +parisology +parison +parisonic +paristhmic +paristhmion +parisyllabic +parisyllabical +Pariti +Paritium +parity +parivincular +park +parka +parkee +parker +parkin +parking +Parkinsonia +Parkinsonism +parkish +parklike +parkward +parkway +parky +parlamento +parlance +parlando +Parlatoria +parlatory +parlay +parle +parley +parleyer +parliament +parliamental +parliamentarian +parliamentarianism +parliamentarily +parliamentariness +parliamentarism +parliamentarization +parliamentarize +parliamentary +parliamenteer +parliamenteering +parliamenter +parling +parlish +parlor +parlorish +parlormaid +parlous +parlously +parlousness +parly +Parma +parma +parmacety +parmak +Parmelia +Parmeliaceae +parmeliaceous +parmelioid +Parmentiera +Parmesan +Parmese +parnas +Parnassia +Parnassiaceae +parnassiaceous +Parnassian +Parnassianism +Parnassiinae +Parnassism +Parnassus +parnel +Parnellism +Parnellite +parnorpine +paroarion +paroarium +paroccipital +paroch +parochial +parochialic +parochialism +parochialist +parochiality +parochialization +parochialize +parochially +parochialness +parochin +parochine +parochiner +parode +parodiable +parodial +parodic +parodical +parodinia +parodist +parodistic +parodistically +parodize +parodontitis +parodos +parody +parodyproof +paroecious +paroeciously +paroeciousness +paroecism +paroecy +paroemia +paroemiac +paroemiographer +paroemiography +paroemiologist +paroemiology +paroicous +parol +parolable +parole +parolee +parolfactory +paroli +parolist +paromoeon +paromologetic +paromologia +paromology +paromphalocele +paromphalocelic +paronomasia +paronomasial +paronomasian +paronomasiastic +paronomastical +paronomastically +paronychia +paronychial +paronychium +paronym +paronymic +paronymization +paronymize +paronymous +paronymy +paroophoric +paroophoritis +paroophoron +paropsis +paroptesis +paroptic +parorchid +parorchis +parorexia +Parosela +parosmia +parosmic +parosteal +parosteitis +parosteosis +parostosis +parostotic +Parotia +parotic +parotid +parotidean +parotidectomy +parotiditis +parotis +parotitic +parotitis +parotoid +parous +parousia +parousiamania +parovarian +parovariotomy +parovarium +paroxazine +paroxysm +paroxysmal +paroxysmalist +paroxysmally +paroxysmic +paroxysmist +paroxytone +paroxytonic +paroxytonize +parpal +parquet +parquetage +parquetry +parr +Parra +parrel +parrhesia +parrhesiastic +parriable +parricidal +parricidally +parricide +parricided +parricidial +parricidism +Parridae +parrier +parrock +parrot +parroter +parrothood +parrotism +parrotize +parrotlet +parrotlike +parrotry +parrotwise +parroty +parry +parsable +parse +parsec +Parsee +Parseeism +parser +parsettensite +Parsi +Parsic +Parsiism +parsimonious +parsimoniously +parsimoniousness +parsimony +Parsism +parsley +parsleylike +parsleywort +parsnip +parson +parsonage +parsonarchy +parsondom +parsoned +parsonese +parsoness +parsonet +parsonhood +parsonic +parsonical +parsonically +parsoning +parsonish +parsonity +parsonize +parsonlike +parsonly +parsonolatry +parsonology +parsonry +parsonship +Parsonsia +parsonsite +parsony +part +partakable +partake +partaker +partan +partanfull +partanhanded +parted +partedness +parter +parterre +parterred +partheniad +Partheniae +parthenian +parthenic +Parthenium +parthenocarpelly +parthenocarpic +parthenocarpical +parthenocarpically +parthenocarpous +parthenocarpy +Parthenocissus +parthenogenesis +parthenogenetic +parthenogenetically +parthenogenic +parthenogenitive +parthenogenous +parthenogeny +parthenogonidium +Parthenolatry +parthenology +Parthenon +Parthenopaeus +parthenoparous +Parthenope +Parthenopean +Parthenos +parthenosperm +parthenospore +Parthian +partial +partialism +partialist +partialistic +partiality +partialize +partially +partialness +partiary +partible +particate +participability +participable +participance +participancy +participant +participantly +participate +participatingly +participation +participative +participatively +participator +participatory +participatress +participial +participiality +participialize +participially +participle +particle +particled +particular +particularism +particularist +particularistic +particularistically +particularity +particularization +particularize +particularly +particularness +particulate +partigen +partile +partimembered +partimen +partinium +partisan +partisanism +partisanize +partisanship +partite +partition +partitional +partitionary +partitioned +partitioner +partitioning +partitionist +partitionment +partitive +partitively +partitura +partiversal +partivity +partless +partlet +partly +partner +partnerless +partnership +parto +partook +partridge +partridgeberry +partridgelike +partridgewood +partridging +partschinite +parture +parturiate +parturience +parturiency +parturient +parturifacient +parturition +parturitive +party +partyism +partyist +partykin +partyless +partymonger +partyship +Parukutu +parulis +parumbilical +parure +paruria +Parus +parvanimity +parvenu +parvenudom +parvenuism +parvicellular +parviflorous +parvifoliate +parvifolious +parvipotent +parvirostrate +parvis +parviscient +parvitude +parvolin +parvoline +parvule +paryphodrome +pasan +pasang +Pasch +Pascha +paschal +paschalist +Paschaltide +paschite +pascoite +pascuage +pascual +pascuous +pasgarde +pash +pasha +pashadom +pashalik +pashaship +pashm +pashmina +Pashto +pasi +pasigraphic +pasigraphical +pasigraphy +pasilaly +Pasitelean +pasmo +Paspalum +pasqueflower +pasquil +pasquilant +pasquiler +pasquilic +Pasquin +pasquin +pasquinade +pasquinader +Pasquinian +Pasquino +pass +passable +passableness +passably +passade +passado +passage +passageable +passageway +Passagian +passalid +Passalidae +Passalus +Passamaquoddy +passant +passback +passbook +Passe +passe +passee +passegarde +passement +passementerie +passen +passenger +Passer +passer +Passeres +passeriform +Passeriformes +Passerina +passerine +passewa +passibility +passible +passibleness +Passiflora +Passifloraceae +passifloraceous +Passiflorales +passimeter +passing +passingly +passingness +passion +passional +passionary +passionate +passionately +passionateness +passionative +passioned +passionflower +passionful +passionfully +passionfulness +Passionist +passionist +passionless +passionlessly +passionlessness +passionlike +passionometer +passionproof +Passiontide +passionwise +passionwort +passir +passival +passivate +passivation +passive +passively +passiveness +passivism +passivist +passivity +passkey +passless +passman +passo +passometer +passout +passover +passoverish +passpenny +passport +passportless +passulate +passulation +passus +passway +passwoman +password +passworts +passymeasure +past +paste +pasteboard +pasteboardy +pasted +pastedness +pastedown +pastel +pastelist +paster +pasterer +pastern +pasterned +pasteur +Pasteurella +Pasteurelleae +pasteurellosis +Pasteurian +pasteurism +pasteurization +pasteurize +pasteurizer +pastiche +pasticheur +pastil +pastile +pastille +pastime +pastimer +Pastinaca +pastiness +pasting +pastness +pastophor +pastophorion +pastophorium +pastophorus +pastor +pastorage +pastoral +pastorale +pastoralism +pastoralist +pastorality +pastoralize +pastorally +pastoralness +pastorate +pastoress +pastorhood +pastorium +pastorize +pastorless +pastorlike +pastorling +pastorly +pastorship +pastose +pastosity +pastrami +pastry +pastryman +pasturability +pasturable +pasturage +pastural +pasture +pastureless +pasturer +pasturewise +pasty +pasul +Pat +pat +pata +pataca +patacao +pataco +patagial +patagiate +patagium +Patagon +patagon +Patagones +Patagonian +pataka +patamar +patao +patapat +pataque +Pataria +Patarin +Patarine +Patarinism +patas +patashte +Patavian +patavinity +patball +patballer +patch +patchable +patcher +patchery +patchily +patchiness +patchleaf +patchless +patchouli +patchwise +patchword +patchwork +patchworky +patchy +pate +patefaction +patefy +patel +patella +patellar +patellaroid +patellate +Patellidae +patellidan +patelliform +patelline +patellofemoral +patelloid +patellula +patellulate +paten +patency +patener +patent +patentability +patentable +patentably +patentee +patently +patentor +pater +patera +patercove +paterfamiliar +paterfamiliarly +paterfamilias +pateriform +paterissa +paternal +paternalism +paternalist +paternalistic +paternalistically +paternality +paternalize +paternally +paternity +paternoster +paternosterer +patesi +patesiate +path +Pathan +pathbreaker +pathed +pathema +pathematic +pathematically +pathematology +pathetic +pathetical +pathetically +patheticalness +patheticate +patheticly +patheticness +pathetism +pathetist +pathetize +pathfarer +pathfinder +pathfinding +pathic +pathicism +pathless +pathlessness +pathlet +pathoanatomical +pathoanatomy +pathobiological +pathobiologist +pathobiology +pathochemistry +pathodontia +pathogen +pathogene +pathogenesis +pathogenesy +pathogenetic +pathogenic +pathogenicity +pathogenous +pathogeny +pathogerm +pathogermic +pathognomic +pathognomical +pathognomonic +pathognomonical +pathognomy +pathognostic +pathographical +pathography +pathologic +pathological +pathologically +pathologicoanatomic +pathologicoanatomical +pathologicoclinical +pathologicohistological +pathologicopsychological +pathologist +pathology +patholysis +patholytic +pathomania +pathometabolism +pathomimesis +pathomimicry +pathoneurosis +pathonomia +pathonomy +pathophobia +pathophoresis +pathophoric +pathophorous +pathoplastic +pathoplastically +pathopoeia +pathopoiesis +pathopoietic +pathopsychology +pathopsychosis +pathoradiography +pathos +pathosocial +Pathrusim +pathway +pathwayed +pathy +patible +patibulary +patibulate +patience +patiency +patient +patientless +patiently +patientness +patina +patinate +patination +patine +patined +patinize +patinous +patio +patisserie +patly +Patmian +Patmos +patness +patnidar +pato +patois +patola +patonce +patria +patrial +patriarch +patriarchal +patriarchalism +patriarchally +patriarchate +patriarchdom +patriarched +patriarchess +patriarchic +patriarchical +patriarchically +patriarchism +patriarchist +patriarchship +patriarchy +patrice +Patricia +Patrician +patrician +patricianhood +patricianism +patricianly +patricianship +patriciate +patricidal +patricide +Patrick +patrico +patrilineal +patrilineally +patrilinear +patriliny +patrilocal +patrimonial +patrimonially +patrimony +patrin +Patriofelis +patriolatry +patriot +patrioteer +patriotess +patriotic +patriotical +patriotically +patriotics +patriotism +patriotly +patriotship +Patripassian +Patripassianism +Patripassianist +Patripassianly +patrist +patristic +patristical +patristically +patristicalness +patristicism +patristics +patrix +patrizate +patrization +patrocinium +patroclinic +patroclinous +patrocliny +patrogenesis +patrol +patroller +patrollotism +patrolman +patrologic +patrological +patrologist +patrology +patron +patronage +patronal +patronate +patrondom +patroness +patronessship +patronite +patronizable +patronization +patronize +patronizer +patronizing +patronizingly +patronless +patronly +patronomatology +patronship +patronym +patronymic +patronymically +patronymy +patroon +patroonry +patroonship +patruity +Patsy +patta +pattable +patte +pattee +patten +pattened +pattener +patter +patterer +patterist +pattern +patternable +patterned +patterner +patterning +patternize +patternless +patternlike +patternmaker +patternmaking +patternwise +patterny +pattu +Patty +patty +pattypan +patu +patulent +patulous +patulously +patulousness +Patuxent +patwari +Patwin +paty +pau +pauciarticulate +pauciarticulated +paucidentate +pauciflorous +paucifoliate +paucifolious +paucify +paucijugate +paucilocular +pauciloquent +pauciloquently +pauciloquy +paucinervate +paucipinnate +pauciplicate +pauciradiate +pauciradiated +paucispiral +paucispirated +paucity +paughty +paukpan +Paul +Paula +paular +pauldron +Pauliad +Paulian +Paulianist +Pauliccian +Paulicianism +paulie +paulin +Paulina +Pauline +Paulinia +Paulinian +Paulinism +Paulinist +Paulinistic +Paulinistically +Paulinity +Paulinize +Paulinus +Paulism +Paulist +Paulista +Paulite +paulopast +paulopost +paulospore +Paulownia +Paulus +Paumari +paunch +paunched +paunchful +paunchily +paunchiness +paunchy +paup +pauper +pauperage +pauperate +pauperdom +pauperess +pauperism +pauperitic +pauperization +pauperize +pauperizer +Paurometabola +paurometabolic +paurometabolism +paurometabolous +paurometaboly +pauropod +Pauropoda +pauropodous +pausably +pausal +pausation +pause +pauseful +pausefully +pauseless +pauselessly +pausement +pauser +pausingly +paussid +Paussidae +paut +pauxi +pavage +pavan +pavane +pave +pavement +pavemental +paver +pavestone +Pavetta +Pavia +pavid +pavidity +pavier +pavilion +paving +pavior +Paviotso +paviour +pavis +pavisade +pavisado +paviser +pavisor +Pavo +pavonated +pavonazzetto +pavonazzo +Pavoncella +Pavonia +pavonian +pavonine +pavonize +pavy +paw +pawdite +pawer +pawing +pawk +pawkery +pawkily +pawkiness +pawkrie +pawky +pawl +pawn +pawnable +pawnage +pawnbroker +pawnbrokerage +pawnbrokeress +pawnbrokering +pawnbrokery +pawnbroking +Pawnee +pawnee +pawner +pawnie +pawnor +pawnshop +pawpaw +Pawtucket +pax +paxilla +paxillar +paxillary +paxillate +paxilliferous +paxilliform +Paxillosa +paxillose +paxillus +paxiuba +paxwax +pay +payability +payable +payableness +payably +Payagua +Payaguan +payday +payed +payee +payeny +payer +paying +paymaster +paymastership +payment +paymistress +Payni +paynim +paynimhood +paynimry +Paynize +payoff +payong +payor +payroll +paysagist +Pazend +pea +peaberry +peace +peaceable +peaceableness +peaceably +peacebreaker +peacebreaking +peaceful +peacefully +peacefulness +peaceless +peacelessness +peacelike +peacemaker +peacemaking +peaceman +peacemonger +peacemongering +peacetime +peach +peachberry +peachblossom +peachblow +peachen +peacher +peachery +peachick +peachify +peachiness +peachlet +peachlike +peachwood +peachwort +peachy +peacoat +peacock +peacockery +peacockish +peacockishly +peacockishness +peacockism +peacocklike +peacockly +peacockwise +peacocky +peacod +peafowl +peag +peage +peahen +peai +peaiism +peak +peaked +peakedly +peakedness +peaker +peakily +peakiness +peaking +peakish +peakishly +peakishness +peakless +peaklike +peakward +peaky +peakyish +peal +pealike +pean +peanut +pear +pearceite +pearl +pearlberry +pearled +pearler +pearlet +pearlfish +pearlfruit +pearlike +pearlin +pearliness +pearling +pearlish +pearlite +pearlitic +pearlsides +pearlstone +pearlweed +pearlwort +pearly +pearmain +pearmonger +peart +pearten +peartly +peartness +pearwood +peasant +peasantess +peasanthood +peasantism +peasantize +peasantlike +peasantly +peasantry +peasantship +peasecod +peaselike +peasen +peashooter +peason +peastake +peastaking +peastick +peasticking +peastone +peasy +peat +peatery +peathouse +peatman +peatship +peatstack +peatwood +peaty +peavey +peavy +Peba +peba +Peban +pebble +pebbled +pebblehearted +pebblestone +pebbleware +pebbly +pebrine +pebrinous +pecan +peccability +peccable +peccadillo +peccancy +peccant +peccantly +peccantness +peccary +peccation +peccavi +pech +pecht +pecite +peck +pecked +pecker +peckerwood +pecket +peckful +peckhamite +peckiness +peckish +peckishly +peckishness +peckle +peckled +peckly +Pecksniffian +Pecksniffianism +Pecksniffism +pecky +Pecopteris +pecopteroid +Pecora +Pecos +pectase +pectate +pecten +pectic +pectin +Pectinacea +pectinacean +pectinaceous +pectinal +pectinase +pectinate +pectinated +pectinately +pectination +pectinatodenticulate +pectinatofimbricate +pectinatopinnate +pectineal +pectineus +pectinibranch +Pectinibranchia +pectinibranchian +Pectinibranchiata +pectinibranchiate +pectinic +pectinid +Pectinidae +pectiniferous +pectiniform +pectinirostrate +pectinite +pectinogen +pectinoid +pectinose +pectinous +pectizable +pectization +pectize +pectocellulose +pectolite +pectora +pectoral +pectoralgia +pectoralis +pectoralist +pectorally +pectoriloquial +pectoriloquism +pectoriloquous +pectoriloquy +pectosase +pectose +pectosic +pectosinase +pectous +pectunculate +Pectunculus +pectus +peculate +peculation +peculator +peculiar +peculiarism +peculiarity +peculiarize +peculiarly +peculiarness +peculiarsome +peculium +pecuniarily +pecuniary +pecuniosity +pecunious +ped +peda +pedage +pedagog +pedagogal +pedagogic +pedagogical +pedagogically +pedagogics +pedagogism +pedagogist +pedagogue +pedagoguery +pedagoguish +pedagoguism +pedagogy +pedal +pedaler +pedalfer +pedalferic +Pedaliaceae +pedaliaceous +pedalian +pedalier +Pedalion +pedalism +pedalist +pedaliter +pedality +Pedalium +pedanalysis +pedant +pedantesque +pedantess +pedanthood +pedantic +pedantical +pedantically +pedanticalness +pedanticism +pedanticly +pedanticness +pedantism +pedantize +pedantocracy +pedantocrat +pedantocratic +pedantry +pedary +Pedata +pedate +pedated +pedately +pedatifid +pedatiform +pedatilobate +pedatilobed +pedatinerved +pedatipartite +pedatisect +pedatisected +pedatrophia +pedder +peddle +peddler +peddleress +peddlerism +peddlery +peddling +peddlingly +pedee +pedelion +pederast +pederastic +pederastically +pederasty +pedes +pedesis +pedestal +pedestrial +pedestrially +pedestrian +pedestrianate +pedestrianism +pedestrianize +pedetentous +Pedetes +Pedetidae +Pedetinae +pediadontia +pediadontic +pediadontist +pedialgia +Pediastrum +pediatric +pediatrician +pediatrics +pediatrist +pediatry +pedicab +pedicel +pediceled +pedicellar +pedicellaria +pedicellate +pedicellated +pedicellation +pedicelled +pedicelliform +Pedicellina +pedicellus +pedicle +pedicular +Pedicularia +Pedicularis +pediculate +pediculated +Pediculati +pedicule +Pediculi +pediculicidal +pediculicide +pediculid +Pediculidae +Pediculina +pediculine +pediculofrontal +pediculoid +pediculoparietal +pediculophobia +pediculosis +pediculous +Pediculus +pedicure +pedicurism +pedicurist +pediferous +pediform +pedigerous +pedigraic +pedigree +pedigreeless +pediluvium +Pedimana +pedimanous +pediment +pedimental +pedimented +pedimentum +Pedioecetes +pedion +pedionomite +Pedionomus +pedipalp +pedipalpal +pedipalpate +Pedipalpi +Pedipalpida +pedipalpous +pedipalpus +pedipulate +pedipulation +pedipulator +pedlar +pedlary +pedobaptism +pedobaptist +pedocal +pedocalcic +pedodontia +pedodontic +pedodontist +pedodontology +pedograph +pedological +pedologist +pedologistical +pedologistically +pedology +pedometer +pedometric +pedometrical +pedometrically +pedometrician +pedometrist +pedomorphic +pedomorphism +pedomotive +pedomotor +pedophilia +pedophilic +pedotribe +pedotrophic +pedotrophist +pedotrophy +pedrail +pedregal +pedrero +pedro +pedule +pedum +peduncle +peduncled +peduncular +Pedunculata +pedunculate +pedunculated +pedunculation +pedunculus +pee +peed +peek +peekaboo +peel +peelable +peele +peeled +peeledness +peeler +peelhouse +peeling +Peelism +Peelite +peelman +peen +peenge +peeoy +peep +peeper +peepeye +peephole +peepy +peer +peerage +peerdom +peeress +peerhood +peerie +peeringly +peerless +peerlessly +peerlessness +peerling +peerly +peership +peery +peesash +peesoreh +peesweep +peetweet +peeve +peeved +peevedly +peevedness +peever +peevish +peevishly +peevishness +peewee +Peg +peg +pega +pegall +peganite +Peganum +Pegasean +Pegasian +Pegasid +pegasid +Pegasidae +pegasoid +Pegasus +pegboard +pegbox +pegged +pegger +pegging +peggle +Peggy +peggy +pegless +peglet +peglike +pegman +pegmatite +pegmatitic +pegmatization +pegmatize +pegmatoid +pegmatophyre +pegology +pegomancy +Peguan +pegwood +Pehlevi +peho +Pehuenche +peignoir +peine +peirameter +peirastic +peirastically +peisage +peise +peiser +Peitho +peixere +pejorate +pejoration +pejorationist +pejorative +pejoratively +pejorism +pejorist +pejority +pekan +Pekin +pekin +Peking +Pekingese +pekoe +peladic +pelage +pelagial +Pelagian +pelagian +Pelagianism +Pelagianize +Pelagianizer +pelagic +Pelagothuria +pelamyd +pelanos +Pelargi +pelargic +Pelargikon +pelargomorph +Pelargomorphae +pelargomorphic +pelargonate +pelargonic +pelargonidin +pelargonin +pelargonium +Pelasgi +Pelasgian +Pelasgic +Pelasgikon +Pelasgoi +Pele +pelean +pelecan +Pelecani +Pelecanidae +Pelecaniformes +Pelecanoides +Pelecanoidinae +Pelecanus +pelecypod +Pelecypoda +pelecypodous +pelelith +pelerine +Peleus +Pelew +pelf +Pelias +pelican +pelicanry +pelick +pelicometer +Pelides +Pelidnota +pelike +peliom +pelioma +peliosis +pelisse +pelite +pelitic +pell +Pellaea +pellage +pellagra +pellagragenic +pellagrin +pellagrose +pellagrous +pellar +pellard +pellas +pellate +pellation +peller +pellet +pelleted +pelletierine +pelletlike +pellety +Pellian +pellicle +pellicula +pellicular +pellicularia +pelliculate +pellicule +pellile +pellitory +pellmell +pellock +pellotine +pellucent +pellucid +pellucidity +pellucidly +pellucidness +Pelmanism +Pelmanist +Pelmanize +pelmatic +pelmatogram +Pelmatozoa +pelmatozoan +pelmatozoic +pelmet +Pelobates +pelobatid +Pelobatidae +pelobatoid +Pelodytes +pelodytid +Pelodytidae +pelodytoid +Pelomedusa +pelomedusid +Pelomedusidae +pelomedusoid +Pelomyxa +pelon +Pelopaeus +Pelopid +Pelopidae +Peloponnesian +Pelops +peloria +pelorian +peloriate +peloric +pelorism +pelorization +pelorize +pelorus +pelota +pelotherapy +peloton +pelt +pelta +Peltandra +peltast +peltate +peltated +peltately +peltatifid +peltation +peltatodigitate +pelter +pelterer +peltiferous +peltifolious +peltiform +Peltigera +Peltigeraceae +peltigerine +peltigerous +peltinerved +pelting +peltingly +peltless +peltmonger +Peltogaster +peltry +pelu +peludo +Pelusios +pelveoperitonitis +pelves +Pelvetia +pelvic +pelviform +pelvigraph +pelvigraphy +pelvimeter +pelvimetry +pelviolithotomy +pelvioperitonitis +pelvioplasty +pelvioradiography +pelvioscopy +pelviotomy +pelviperitonitis +pelvirectal +pelvis +pelvisacral +pelvisternal +pelvisternum +pelycogram +pelycography +pelycology +pelycometer +pelycometry +pelycosaur +Pelycosauria +pelycosaurian +pembina +Pembroke +pemican +pemmican +pemmicanization +pemmicanize +pemphigoid +pemphigous +pemphigus +pen +penacute +Penaea +Penaeaceae +penaeaceous +penal +penalist +penality +penalizable +penalization +penalize +penally +penalty +penance +penanceless +penang +penannular +penates +penbard +pencatite +pence +pencel +penceless +penchant +penchute +pencil +penciled +penciler +penciliform +penciling +pencilled +penciller +pencillike +pencilling +pencilry +pencilwood +pencraft +pend +penda +pendant +pendanted +pendanting +pendantlike +pendecagon +pendeloque +pendency +pendent +pendentive +pendently +pendicle +pendicler +pending +pendle +pendom +pendragon +pendragonish +pendragonship +pendulant +pendular +pendulate +pendulation +pendule +penduline +pendulosity +pendulous +pendulously +pendulousness +pendulum +pendulumlike +Penelope +Penelopean +Penelophon +Penelopinae +penelopine +peneplain +peneplanation +peneplane +peneseismic +penetrability +penetrable +penetrableness +penetrably +penetral +penetralia +penetralian +penetrance +penetrancy +penetrant +penetrate +penetrating +penetratingly +penetratingness +penetration +penetrative +penetratively +penetrativeness +penetrativity +penetrator +penetrology +penetrometer +penfieldite +penfold +penful +penghulu +pengo +penguin +penguinery +penhead +penholder +penial +penicillate +penicillated +penicillately +penicillation +penicilliform +penicillin +Penicillium +penide +penile +peninsula +peninsular +peninsularism +peninsularity +peninsulate +penintime +peninvariant +penis +penistone +penitence +penitencer +penitent +Penitentes +penitential +penitentially +penitentiary +penitentiaryship +penitently +penk +penkeeper +penknife +penlike +penmaker +penmaking +penman +penmanship +penmaster +penna +pennaceous +Pennacook +pennae +pennage +Pennales +pennant +Pennaria +Pennariidae +Pennatae +pennate +pennated +pennatifid +pennatilobate +pennatipartite +pennatisect +pennatisected +Pennatula +Pennatulacea +pennatulacean +pennatulaceous +pennatularian +pennatulid +Pennatulidae +pennatuloid +penneech +penneeck +penner +pennet +penni +pennia +pennied +penniferous +penniform +pennigerous +penniless +pennilessly +pennilessness +pennill +penninervate +penninerved +penning +penninite +pennipotent +Pennisetum +penniveined +pennon +pennoned +pennopluma +pennoplume +pennorth +Pennsylvania +Pennsylvanian +penny +pennybird +pennycress +pennyearth +pennyflower +pennyhole +pennyleaf +pennyrot +pennyroyal +pennysiller +pennystone +pennyweight +pennywinkle +pennywort +pennyworth +Penobscot +penologic +penological +penologist +penology +penorcon +penrack +penroseite +Pensacola +penscript +penseful +pensefulness +penship +pensile +pensileness +pensility +pension +pensionable +pensionably +pensionary +pensioner +pensionership +pensionless +pensive +pensived +pensively +pensiveness +penster +penstick +penstock +pensum +pensy +pent +penta +pentabasic +pentabromide +pentacapsular +pentacarbon +pentacarbonyl +pentacarpellary +pentace +pentacetate +pentachenium +pentachloride +pentachord +pentachromic +pentacid +pentacle +pentacoccous +pentacontane +pentacosane +Pentacrinidae +pentacrinite +pentacrinoid +Pentacrinus +pentacron +pentacrostic +pentactinal +pentactine +pentacular +pentacyanic +pentacyclic +pentad +pentadactyl +Pentadactyla +pentadactylate +pentadactyle +pentadactylism +pentadactyloid +pentadecagon +pentadecahydrate +pentadecahydrated +pentadecane +pentadecatoic +pentadecoic +pentadecyl +pentadecylic +pentadelphous +pentadicity +pentadiene +pentadodecahedron +pentadrachm +pentadrachma +pentaerythrite +pentaerythritol +pentafid +pentafluoride +pentagamist +pentaglossal +pentaglot +pentaglottical +pentagon +pentagonal +pentagonally +pentagonohedron +pentagonoid +pentagram +pentagrammatic +pentagyn +Pentagynia +pentagynian +pentagynous +pentahalide +pentahedral +pentahedrical +pentahedroid +pentahedron +pentahedrous +pentahexahedral +pentahexahedron +pentahydrate +pentahydrated +pentahydric +pentahydroxy +pentail +pentaiodide +pentalobate +pentalogue +pentalogy +pentalpha +Pentamera +pentameral +pentameran +pentamerid +Pentameridae +pentamerism +pentameroid +pentamerous +Pentamerus +pentameter +pentamethylene +pentamethylenediamine +pentametrist +pentametrize +pentander +Pentandria +pentandrian +pentandrous +pentane +pentanedione +pentangle +pentangular +pentanitrate +pentanoic +pentanolide +pentanone +pentapetalous +Pentaphylacaceae +pentaphylacaceous +Pentaphylax +pentaphyllous +pentaploid +pentaploidic +pentaploidy +pentapody +pentapolis +pentapolitan +pentapterous +pentaptote +pentaptych +pentaquine +pentarch +pentarchical +pentarchy +pentasepalous +pentasilicate +pentaspermous +pentaspheric +pentaspherical +pentastich +pentastichous +pentastichy +pentastome +Pentastomida +pentastomoid +pentastomous +Pentastomum +pentastyle +pentastylos +pentasulphide +pentasyllabic +pentasyllabism +pentasyllable +Pentateuch +Pentateuchal +pentateuchal +pentathionate +pentathionic +pentathlete +pentathlon +pentathlos +pentatomic +pentatomid +Pentatomidae +Pentatomoidea +pentatone +pentatonic +pentatriacontane +pentavalence +pentavalency +pentavalent +penteconter +pentecontoglossal +Pentecost +Pentecostal +pentecostal +pentecostalism +pentecostalist +pentecostarion +pentecoster +pentecostys +Pentelic +Pentelican +pentene +penteteric +penthemimer +penthemimeral +penthemimeris +Penthestes +penthiophen +penthiophene +Penthoraceae +Penthorum +penthouse +penthouselike +penthrit +penthrite +pentimento +pentine +pentiodide +pentit +pentite +pentitol +pentlandite +pentobarbital +pentode +pentoic +pentol +pentosan +pentosane +pentose +pentoside +pentosuria +pentoxide +pentremital +pentremite +Pentremites +Pentremitidae +pentrit +pentrite +pentrough +Pentstemon +pentstock +penttail +pentyl +pentylene +pentylic +pentylidene +pentyne +Pentzia +penuchi +penult +penultima +penultimate +penultimatum +penumbra +penumbrae +penumbral +penumbrous +penurious +penuriously +penuriousness +penury +Penutian +penwiper +penwoman +penwomanship +penworker +penwright +peon +peonage +peonism +peony +people +peopledom +peoplehood +peopleize +peopleless +peopler +peoplet +peoplish +Peoria +Peorian +peotomy +pep +peperine +peperino +Peperomia +pepful +Pephredo +pepinella +pepino +peplos +peplosed +peplum +peplus +pepo +peponida +peponium +pepper +pepperbox +peppercorn +peppercornish +peppercorny +pepperer +peppergrass +pepperidge +pepperily +pepperiness +pepperish +pepperishly +peppermint +pepperoni +pepperproof +pepperroot +pepperweed +pepperwood +pepperwort +peppery +peppily +peppin +peppiness +peppy +pepsin +pepsinate +pepsinhydrochloric +pepsiniferous +pepsinogen +pepsinogenic +pepsinogenous +pepsis +peptic +peptical +pepticity +peptidase +peptide +peptizable +peptization +peptize +peptizer +peptogaster +peptogenic +peptogenous +peptogeny +peptohydrochloric +peptolysis +peptolytic +peptonaemia +peptonate +peptone +peptonemia +peptonic +peptonization +peptonize +peptonizer +peptonoid +peptonuria +peptotoxine +Pepysian +Pequot +per +Peracarida +peracephalus +peracetate +peracetic +peracid +peracidite +peract +peracute +peradventure +peragrate +peragration +Perakim +peramble +perambulant +perambulate +perambulation +perambulator +perambulatory +Perameles +Peramelidae +perameline +perameloid +Peramium +Peratae +Perates +perbend +perborate +perborax +perbromide +Perca +percale +percaline +percarbide +percarbonate +percarbonic +perceivability +perceivable +perceivableness +perceivably +perceivance +perceivancy +perceive +perceivedly +perceivedness +perceiver +perceiving +perceivingness +percent +percentable +percentably +percentage +percentaged +percental +percentile +percentual +percept +perceptibility +perceptible +perceptibleness +perceptibly +perception +perceptional +perceptionalism +perceptionism +perceptive +perceptively +perceptiveness +perceptivity +perceptual +perceptually +Percesoces +percesocine +Perceval +perch +percha +perchable +perchance +percher +Percheron +perchlorate +perchlorethane +perchlorethylene +perchloric +perchloride +perchlorinate +perchlorination +perchloroethane +perchloroethylene +perchromate +perchromic +percid +Percidae +perciform +Perciformes +percipience +percipiency +percipient +Percival +perclose +percnosome +percoct +percoid +Percoidea +percoidean +percolable +percolate +percolation +percolative +percolator +percomorph +Percomorphi +percomorphous +percompound +percontation +percontatorial +percribrate +percribration +percrystallization +perculsion +perculsive +percur +percurration +percurrent +percursory +percuss +percussion +percussional +percussioner +percussionist +percussionize +percussive +percussively +percussiveness +percussor +percutaneous +percutaneously +percutient +Percy +percylite +Perdicinae +perdicine +perdition +perditionable +Perdix +perdricide +perdu +perduellion +perdurability +perdurable +perdurableness +perdurably +perdurance +perdurant +perdure +perduring +perduringly +Perean +peregrin +peregrina +peregrinate +peregrination +peregrinator +peregrinatory +peregrine +peregrinity +peregrinoid +pereion +pereiopod +pereira +pereirine +peremptorily +peremptoriness +peremptory +perendinant +perendinate +perendination +perendure +perennate +perennation +perennial +perenniality +perennialize +perennially +perennibranch +Perennibranchiata +perennibranchiate +perequitate +peres +Pereskia +perezone +perfect +perfectation +perfected +perfectedly +perfecter +perfecti +perfectibilian +perfectibilism +perfectibilist +perfectibilitarian +perfectibility +perfectible +perfecting +perfection +perfectionate +perfectionation +perfectionator +perfectioner +perfectionism +perfectionist +perfectionistic +perfectionize +perfectionizement +perfectionizer +perfectionment +perfectism +perfectist +perfective +perfectively +perfectiveness +perfectivity +perfectivize +perfectly +perfectness +perfecto +perfector +perfectuation +perfervent +perfervid +perfervidity +perfervidly +perfervidness +perfervor +perfervour +perfidious +perfidiously +perfidiousness +perfidy +perfilograph +perflate +perflation +perfluent +perfoliate +perfoliation +perforable +perforant +Perforata +perforate +perforated +perforation +perforationproof +perforative +perforator +perforatorium +perforatory +perforce +perforcedly +perform +performable +performance +performant +performative +performer +perfrication +perfumatory +perfume +perfumed +perfumeless +perfumer +perfumeress +perfumery +perfumy +perfunctionary +perfunctorily +perfunctoriness +perfunctorious +perfunctoriously +perfunctorize +perfunctory +perfuncturate +perfusate +perfuse +perfusion +perfusive +Pergamene +pergameneous +Pergamenian +pergamentaceous +Pergamic +pergamyn +pergola +perhalide +perhalogen +perhaps +perhazard +perhorresce +perhydroanthracene +perhydrogenate +perhydrogenation +perhydrogenize +peri +periacinal +periacinous +periactus +periadenitis +periamygdalitis +perianal +periangiocholitis +periangioma +periangitis +perianth +perianthial +perianthium +periaortic +periaortitis +periapical +periappendicitis +periappendicular +periapt +Periarctic +periareum +periarterial +periarteritis +periarthric +periarthritis +periarticular +periaster +periastral +periastron +periastrum +periatrial +periauricular +periaxial +periaxillary +periaxonal +periblast +periblastic +periblastula +periblem +peribolos +peribolus +peribranchial +peribronchial +peribronchiolar +peribronchiolitis +peribronchitis +peribulbar +peribursal +pericaecal +pericaecitis +pericanalicular +pericapsular +pericardia +pericardiac +pericardiacophrenic +pericardial +pericardicentesis +pericardiectomy +pericardiocentesis +pericardiolysis +pericardiomediastinitis +pericardiophrenic +pericardiopleural +pericardiorrhaphy +pericardiosymphysis +pericardiotomy +pericarditic +pericarditis +pericardium +pericardotomy +pericarp +pericarpial +pericarpic +pericarpium +pericarpoidal +pericecal +pericecitis +pericellular +pericemental +pericementitis +pericementoclasia +pericementum +pericenter +pericentral +pericentric +pericephalic +pericerebral +perichaete +perichaetial +perichaetium +perichete +pericholangitis +pericholecystitis +perichondral +perichondrial +perichondritis +perichondrium +perichord +perichordal +perichoresis +perichorioidal +perichoroidal +perichylous +pericladium +periclase +periclasia +periclasite +periclaustral +Periclean +Pericles +periclinal +periclinally +pericline +periclinium +periclitate +periclitation +pericolitis +pericolpitis +periconchal +periconchitis +pericopal +pericope +pericopic +pericorneal +pericowperitis +pericoxitis +pericranial +pericranitis +pericranium +pericristate +Pericu +periculant +pericycle +pericycloid +pericyclone +pericyclonic +pericystic +pericystitis +pericystium +pericytial +peridendritic +peridental +peridentium +peridentoclasia +periderm +peridermal +peridermic +Peridermium +peridesm +peridesmic +peridesmitis +peridesmium +peridial +peridiastole +peridiastolic +perididymis +perididymitis +peridiiform +Peridineae +Peridiniaceae +peridiniaceous +peridinial +Peridiniales +peridinian +peridinid +Peridinidae +Peridinieae +Peridiniidae +Peridinium +peridiole +peridiolum +peridium +peridot +peridotic +peridotite +peridotitic +periductal +periegesis +periegetic +perielesis +periencephalitis +perienteric +perienteritis +perienteron +periependymal +periesophageal +periesophagitis +perifistular +perifoliary +perifollicular +perifolliculitis +perigangliitis +periganglionic +perigastric +perigastritis +perigastrula +perigastrular +perigastrulation +perigeal +perigee +perigemmal +perigenesis +perigenital +perigeum +periglandular +perigloea +periglottic +periglottis +perignathic +perigon +perigonadial +perigonal +perigone +perigonial +perigonium +perigraph +perigraphic +perigynial +perigynium +perigynous +perigyny +perihelial +perihelian +perihelion +perihelium +perihepatic +perihepatitis +perihermenial +perihernial +perihysteric +perijejunitis +perijove +perikaryon +perikronion +peril +perilabyrinth +perilabyrinthitis +perilaryngeal +perilaryngitis +perilenticular +periligamentous +Perilla +perilless +perilobar +perilous +perilously +perilousness +perilsome +perilymph +perilymphangial +perilymphangitis +perilymphatic +perimartium +perimastitis +perimedullary +perimeningitis +perimeter +perimeterless +perimetral +perimetric +perimetrical +perimetrically +perimetritic +perimetritis +perimetrium +perimetry +perimorph +perimorphic +perimorphism +perimorphous +perimyelitis +perimysial +perimysium +perine +perineal +perineocele +perineoplastic +perineoplasty +perineorrhaphy +perineoscrotal +perineostomy +perineosynthesis +perineotomy +perineovaginal +perineovulvar +perinephral +perinephrial +perinephric +perinephritic +perinephritis +perinephrium +perineptunium +perineum +perineural +perineurial +perineuritis +perineurium +perinium +perinuclear +periocular +period +periodate +periodic +periodical +periodicalism +periodicalist +periodicalize +periodically +periodicalness +periodicity +periodide +periodize +periodogram +periodograph +periodology +periodontal +periodontia +periodontic +periodontist +periodontitis +periodontium +periodontoclasia +periodontologist +periodontology +periodontum +periodoscope +perioeci +perioecians +perioecic +perioecid +perioecus +perioesophageal +perioikoi +periomphalic +perionychia +perionychium +perionyx +perionyxis +perioophoritis +periophthalmic +periophthalmitis +periople +perioplic +perioptic +perioptometry +perioral +periorbit +periorbita +periorbital +periorchitis +periost +periostea +periosteal +periosteitis +periosteoalveolar +periosteoma +periosteomedullitis +periosteomyelitis +periosteophyte +periosteorrhaphy +periosteotome +periosteotomy +periosteous +periosteum +periostitic +periostitis +periostoma +periostosis +periostotomy +periostracal +periostracum +periotic +periovular +peripachymeningitis +peripancreatic +peripancreatitis +peripapillary +Peripatetic +peripatetic +peripatetical +peripatetically +peripateticate +Peripateticism +Peripatidae +Peripatidea +peripatize +peripatoid +Peripatopsidae +Peripatopsis +Peripatus +peripenial +peripericarditis +peripetalous +peripetasma +peripeteia +peripetia +peripety +periphacitis +peripharyngeal +peripherad +peripheral +peripherally +peripherial +peripheric +peripherical +peripherically +peripherocentral +peripheroceptor +peripheromittor +peripheroneural +peripherophose +periphery +periphlebitic +periphlebitis +periphractic +periphrase +periphrases +periphrasis +periphrastic +periphrastical +periphrastically +periphraxy +periphyllum +periphyse +periphysis +Periplaneta +periplasm +periplast +periplastic +periplegmatic +peripleural +peripleuritis +Periploca +periplus +peripneumonia +peripneumonic +peripneumony +peripneustic +peripolar +peripolygonal +periportal +periproct +periproctal +periproctitis +periproctous +periprostatic +periprostatitis +peripteral +peripterous +periptery +peripylephlebitis +peripyloric +perique +perirectal +perirectitis +perirenal +perisalpingitis +perisarc +perisarcal +perisarcous +perisaturnium +periscian +periscians +periscii +perisclerotic +periscopal +periscope +periscopic +periscopical +periscopism +perish +perishability +perishable +perishableness +perishably +perished +perishing +perishingly +perishless +perishment +perisigmoiditis +perisinuitis +perisinuous +perisinusitis +perisoma +perisomal +perisomatic +perisome +perisomial +perisperm +perispermal +perispermatitis +perispermic +perisphere +perispheric +perispherical +perisphinctean +Perisphinctes +Perisphinctidae +perisphinctoid +perisplanchnic +perisplanchnitis +perisplenetic +perisplenic +perisplenitis +perispome +perispomenon +perispondylic +perispondylitis +perispore +Perisporiaceae +perisporiaceous +Perisporiales +perissad +perissodactyl +Perissodactyla +perissodactylate +perissodactyle +perissodactylic +perissodactylism +perissodactylous +perissologic +perissological +perissology +perissosyllabic +peristalith +peristalsis +peristaltic +peristaltically +peristaphyline +peristaphylitis +peristele +peristerite +peristeromorph +Peristeromorphae +peristeromorphic +peristeromorphous +peristeronic +peristerophily +peristeropod +peristeropodan +peristeropode +Peristeropodes +peristeropodous +peristethium +peristole +peristoma +peristomal +peristomatic +peristome +peristomial +peristomium +peristrephic +peristrephical +peristrumitis +peristrumous +peristylar +peristyle +peristylium +peristylos +peristylum +perisynovial +perisystole +perisystolic +perit +perite +peritectic +peritendineum +peritenon +perithece +perithecial +perithecium +perithelial +perithelioma +perithelium +perithoracic +perithyreoiditis +perithyroiditis +peritomize +peritomous +peritomy +peritoneal +peritonealgia +peritoneally +peritoneocentesis +peritoneoclysis +peritoneomuscular +peritoneopathy +peritoneopericardial +peritoneopexy +peritoneoplasty +peritoneoscope +peritoneoscopy +peritoneotomy +peritoneum +peritonism +peritonital +peritonitic +peritonitis +peritonsillar +peritonsillitis +peritracheal +peritrema +peritrematous +peritreme +peritrich +Peritricha +peritrichan +peritrichic +peritrichous +peritrichously +peritroch +peritrochal +peritrochanteric +peritrochium +peritrochoid +peritropal +peritrophic +peritropous +perityphlic +perityphlitic +perityphlitis +periumbilical +periungual +periuranium +periureteric +periureteritis +periurethral +periurethritis +periuterine +periuvular +perivaginal +perivaginitis +perivascular +perivasculitis +perivenous +perivertebral +perivesical +perivisceral +perivisceritis +perivitellin +perivitelline +periwig +periwigpated +periwinkle +periwinkled +periwinkler +perizonium +perjink +perjinkety +perjinkities +perjinkly +perjure +perjured +perjuredly +perjuredness +perjurer +perjuress +perjurious +perjuriously +perjuriousness +perjurous +perjury +perjurymonger +perjurymongering +perk +perkily +Perkin +perkin +perkiness +perking +perkingly +perkish +perknite +perky +Perla +perlaceous +Perlaria +perle +perlection +perlid +Perlidae +perligenous +perlingual +perlingually +perlite +perlitic +perloir +perlustrate +perlustration +perlustrator +perm +permafrost +Permalloy +permalloy +permanence +permanency +permanent +permanently +permanentness +permanganate +permanganic +permansive +permeability +permeable +permeableness +permeably +permeameter +permeance +permeant +permeate +permeation +permeative +permeator +Permiak +Permian +permillage +permirific +permissibility +permissible +permissibleness +permissibly +permission +permissioned +permissive +permissively +permissiveness +permissory +permit +permittable +permitted +permittedly +permittee +permitter +permittivity +permixture +Permocarboniferous +permonosulphuric +permoralize +permutability +permutable +permutableness +permutably +permutate +permutation +permutational +permutationist +permutator +permutatorial +permutatory +permute +permuter +pern +pernancy +pernasal +pernavigate +Pernettia +pernicious +perniciously +perniciousness +pernicketiness +pernickety +pernine +Pernis +pernitrate +pernitric +pernoctation +pernor +pernyi +peroba +perobrachius +perocephalus +perochirus +perodactylus +Perodipus +Perognathinae +Perognathus +Peromedusae +Peromela +peromelous +peromelus +Peromyscus +peronate +peroneal +peroneocalcaneal +peroneotarsal +peroneotibial +peronial +peronium +Peronospora +Peronosporaceae +peronosporaceous +Peronosporales +peropod +Peropoda +peropodous +peropus +peroral +perorally +perorate +peroration +perorational +perorative +perorator +peroratorical +peroratorically +peroratory +perosis +perosmate +perosmic +perosomus +perotic +perovskite +peroxidase +peroxidate +peroxidation +peroxide +peroxidic +peroxidize +peroxidizement +peroxy +peroxyl +perozonid +perozonide +perpend +perpendicular +perpendicularity +perpendicularly +perpera +perperfect +perpetrable +perpetrate +perpetration +perpetrator +perpetratress +perpetratrix +perpetuable +perpetual +perpetualism +perpetualist +perpetuality +perpetually +perpetualness +perpetuana +perpetuance +perpetuant +perpetuate +perpetuation +perpetuator +perpetuity +perplantar +perplex +perplexable +perplexed +perplexedly +perplexedness +perplexer +perplexing +perplexingly +perplexity +perplexment +perplication +perquadrat +perquest +perquisite +perquisition +perquisitor +perradial +perradially +perradiate +perradius +perridiculous +perrier +Perrinist +perron +perruche +perrukery +perruthenate +perruthenic +perry +perryman +Persae +persalt +perscent +perscribe +perscrutate +perscrutation +perscrutator +perse +Persea +persecute +persecutee +persecuting +persecutingly +persecution +persecutional +persecutive +persecutiveness +persecutor +persecutory +persecutress +persecutrix +Perseid +perseite +perseitol +perseity +persentiscency +Persephassa +Persephone +Persepolitan +perseverance +perseverant +perseverate +perseveration +persevere +persevering +perseveringly +Persian +Persianist +Persianization +Persianize +Persic +Persicaria +persicary +Persicize +persico +persicot +persienne +persiennes +persiflage +persiflate +persilicic +persimmon +Persis +persis +Persism +persist +persistence +persistency +persistent +persistently +persister +persisting +persistingly +persistive +persistively +persistiveness +persnickety +person +persona +personable +personableness +personably +personage +personal +personalia +personalism +personalist +personalistic +personality +personalization +personalize +personally +personalness +personalty +personate +personately +personating +personation +personative +personator +personed +personeity +personifiable +personifiant +personification +personificative +personificator +personifier +personify +personization +personize +personnel +personship +perspection +perspective +perspectived +perspectiveless +perspectively +perspectivity +perspectograph +perspectometer +perspicacious +perspicaciously +perspicaciousness +perspicacity +perspicuity +perspicuous +perspicuously +perspicuousness +perspirability +perspirable +perspirant +perspirate +perspiration +perspirative +perspiratory +perspire +perspiringly +perspiry +perstringe +perstringement +persuadability +persuadable +persuadableness +persuadably +persuade +persuaded +persuadedly +persuadedness +persuader +persuadingly +persuasibility +persuasible +persuasibleness +persuasibly +persuasion +persuasive +persuasively +persuasiveness +persuasory +persulphate +persulphide +persulphocyanate +persulphocyanic +persulphuric +persymmetric +persymmetrical +pert +pertain +pertaining +pertainment +perten +perthiocyanate +perthiocyanic +perthiotophyre +perthite +perthitic +perthitically +perthosite +pertinacious +pertinaciously +pertinaciousness +pertinacity +pertinence +pertinency +pertinent +pertinently +pertinentness +pertish +pertly +pertness +perturb +perturbability +perturbable +perturbance +perturbancy +perturbant +perturbate +perturbation +perturbational +perturbatious +perturbative +perturbator +perturbatory +perturbatress +perturbatrix +perturbed +perturbedly +perturbedness +perturber +perturbing +perturbingly +perturbment +Pertusaria +Pertusariaceae +pertuse +pertused +pertusion +pertussal +pertussis +perty +Peru +Perugian +Peruginesque +peruke +perukeless +perukier +perukiership +perula +Perularia +perulate +perule +Perun +perusable +perusal +peruse +peruser +Peruvian +Peruvianize +pervade +pervadence +pervader +pervading +pervadingly +pervadingness +pervagate +pervagation +pervalvar +pervasion +pervasive +pervasively +pervasiveness +perverse +perversely +perverseness +perversion +perversity +perversive +pervert +perverted +pervertedly +pervertedness +perverter +pervertibility +pervertible +pervertibly +pervertive +perviability +perviable +pervicacious +pervicaciously +pervicaciousness +pervicacity +pervigilium +pervious +perviously +perviousness +pervulgate +pervulgation +perwitsky +pes +pesa +Pesach +pesade +pesage +Pesah +peseta +peshkar +peshkash +peshwa +peshwaship +peskily +peskiness +pesky +peso +pess +pessary +pessimal +pessimism +pessimist +pessimistic +pessimistically +pessimize +pessimum +pessomancy +pessoner +pessular +pessulus +pest +Pestalozzian +Pestalozzianism +peste +pester +pesterer +pesteringly +pesterment +pesterous +pestersome +pestful +pesthole +pesthouse +pesticidal +pesticide +pestiduct +pestiferous +pestiferously +pestiferousness +pestifugous +pestify +pestilence +pestilenceweed +pestilencewort +pestilent +pestilential +pestilentially +pestilentialness +pestilently +pestle +pestological +pestologist +pestology +pestproof +pet +petal +petalage +petaled +Petalia +petaliferous +petaliform +Petaliidae +petaline +petalism +petalite +petalled +petalless +petallike +petalocerous +petalodic +petalodont +petalodontid +Petalodontidae +petalodontoid +Petalodus +petalody +petaloid +petaloidal +petaloideous +petalomania +petalon +Petalostemon +petalous +petalwise +petaly +petard +petardeer +petardier +petary +Petasites +petasos +petasus +petaurine +petaurist +Petaurista +Petauristidae +Petauroides +Petaurus +petchary +petcock +Pete +pete +peteca +petechiae +petechial +petechiate +peteman +Peter +peter +Peterkin +Peterloo +peterman +peternet +petersham +peterwort +petful +petiolar +petiolary +Petiolata +petiolate +petiolated +petiole +petioled +Petioliventres +petiolular +petiolulate +petiolule +petiolus +petit +petite +petiteness +petitgrain +petition +petitionable +petitional +petitionarily +petitionary +petitionee +petitioner +petitionist +petitionproof +petitor +petitory +Petiveria +Petiveriaceae +petkin +petling +peto +Petrarchal +Petrarchan +Petrarchesque +Petrarchian +Petrarchianism +Petrarchism +Petrarchist +Petrarchistic +Petrarchistical +Petrarchize +petrary +petre +Petrea +petrean +petreity +petrel +petrescence +petrescent +Petricola +Petricolidae +petricolous +petrie +petrifaction +petrifactive +petrifiable +petrific +petrificant +petrificate +petrification +petrified +petrifier +petrify +Petrine +Petrinism +Petrinist +Petrinize +petrissage +Petrobium +Petrobrusian +petrochemical +petrochemistry +Petrogale +petrogenesis +petrogenic +petrogeny +petroglyph +petroglyphic +petroglyphy +petrograph +petrographer +petrographic +petrographical +petrographically +petrography +petrohyoid +petrol +petrolage +petrolatum +petrolean +petrolene +petroleous +petroleum +petrolic +petroliferous +petrolific +petrolist +petrolithic +petrolization +petrolize +petrologic +petrological +petrologically +petromastoid +Petromyzon +Petromyzonidae +petromyzont +Petromyzontes +Petromyzontidae +petromyzontoid +petronel +petronella +petropharyngeal +petrophilous +petrosa +petrosal +Petroselinum +petrosilex +petrosiliceous +petrosilicious +petrosphenoid +petrosphenoidal +petrosphere +petrosquamosal +petrosquamous +petrostearin +petrostearine +petrosum +petrotympanic +petrous +petroxolin +pettable +petted +pettedly +pettedness +petter +pettichaps +petticoat +petticoated +petticoaterie +petticoatery +petticoatism +petticoatless +petticoaty +pettifog +pettifogger +pettifoggery +pettifogging +pettifogulize +pettifogulizer +pettily +pettiness +pettingly +pettish +pettitoes +pettle +petty +pettyfog +petulance +petulancy +petulant +petulantly +petune +Petunia +petuntse +petwood +petzite +Peucedanum +Peucetii +peucites +peuhl +Peul +Peumus +Peutingerian +pew +pewage +pewdom +pewee +pewfellow +pewful +pewholder +pewing +pewit +pewless +pewmate +pewter +pewterer +pewterwort +pewtery +pewy +Peyerian +peyote +peyotl +peyton +peytrel +pezantic +Peziza +Pezizaceae +pezizaceous +pezizaeform +Pezizales +peziziform +pezizoid +pezograph +Pezophaps +Pfaffian +pfeffernuss +Pfeifferella +pfennig +pfui +pfund +Phaca +Phacelia +phacelite +phacella +Phacidiaceae +Phacidiales +phacitis +phacoanaphylaxis +phacocele +phacochere +phacocherine +phacochoere +phacochoerid +phacochoerine +phacochoeroid +Phacochoerus +phacocyst +phacocystectomy +phacocystitis +phacoglaucoma +phacoid +phacoidal +phacoidoscope +phacolite +phacolith +phacolysis +phacomalacia +phacometer +phacopid +Phacopidae +Phacops +phacosclerosis +phacoscope +phacotherapy +Phaeacian +Phaedo +phaeism +phaenantherous +phaenanthery +phaenogam +Phaenogamia +phaenogamian +phaenogamic +phaenogamous +phaenogenesis +phaenogenetic +phaenological +phaenology +phaenomenal +phaenomenism +phaenomenon +phaenozygous +phaeochrous +Phaeodaria +phaeodarian +phaeophore +Phaeophyceae +phaeophycean +phaeophyceous +phaeophyll +Phaeophyta +phaeophytin +phaeoplast +Phaeosporales +phaeospore +Phaeosporeae +phaeosporous +Phaet +Phaethon +Phaethonic +Phaethontes +Phaethontic +Phaethontidae +Phaethusa +phaeton +phage +phagedena +phagedenic +phagedenical +phagedenous +Phagineae +phagocytable +phagocytal +phagocyte +phagocyter +phagocytic +phagocytism +phagocytize +phagocytoblast +phagocytolysis +phagocytolytic +phagocytose +phagocytosis +phagodynamometer +phagolysis +phagolytic +phagomania +phainolion +Phainopepla +Phajus +Phalacrocoracidae +phalacrocoracine +Phalacrocorax +phalacrosis +Phalaecean +Phalaecian +Phalaenae +Phalaenidae +phalaenopsid +Phalaenopsis +phalangal +phalange +phalangeal +phalangean +phalanger +Phalangeridae +Phalangerinae +phalangerine +phalanges +phalangette +phalangian +phalangic +phalangid +Phalangida +phalangidan +Phalangidea +phalangidean +Phalangides +phalangiform +Phalangigrada +phalangigrade +phalangigrady +phalangiid +Phalangiidae +phalangist +Phalangista +Phalangistidae +phalangistine +phalangite +phalangitic +phalangitis +Phalangium +phalangologist +phalangology +phalansterial +phalansterian +phalansterianism +phalansteric +phalansterism +phalansterist +phalanstery +phalanx +phalanxed +phalarica +Phalaris +Phalarism +phalarope +Phalaropodidae +phalera +phalerate +phalerated +Phaleucian +Phallaceae +phallaceous +Phallales +phallalgia +phallaneurysm +phallephoric +phallic +phallical +phallicism +phallicist +phallin +phallism +phallist +phallitis +phallocrypsis +phallodynia +phalloid +phalloncus +phalloplasty +phallorrhagia +phallus +Phanar +Phanariot +Phanariote +phanatron +phaneric +phanerite +Phanerocarpae +Phanerocarpous +Phanerocephala +phanerocephalous +phanerocodonic +phanerocryst +phanerocrystalline +phanerogam +Phanerogamia +phanerogamian +phanerogamic +phanerogamous +phanerogamy +phanerogenetic +phanerogenic +Phaneroglossa +phaneroglossal +phaneroglossate +phaneromania +phaneromere +phaneromerous +phaneroscope +phanerosis +phanerozoic +phanerozonate +Phanerozonia +phanic +phano +phansigar +phantascope +phantasia +Phantasiast +Phantasiastic +phantasist +phantasize +phantasm +phantasma +phantasmagoria +phantasmagorial +phantasmagorially +phantasmagorian +phantasmagoric +phantasmagorical +phantasmagorist +phantasmagory +phantasmal +phantasmalian +phantasmality +phantasmally +phantasmascope +phantasmata +Phantasmatic +phantasmatic +phantasmatical +phantasmatically +phantasmatography +phantasmic +phantasmical +phantasmically +Phantasmist +phantasmogenesis +phantasmogenetic +phantasmograph +phantasmological +phantasmology +phantast +phantasy +phantom +phantomatic +phantomic +phantomical +phantomically +Phantomist +phantomize +phantomizer +phantomland +phantomlike +phantomnation +phantomry +phantomship +phantomy +phantoplex +phantoscope +Pharaoh +Pharaonic +Pharaonical +Pharbitis +phare +Phareodus +Pharian +Pharisaean +Pharisaic +pharisaical +pharisaically +pharisaicalness +Pharisaism +Pharisaist +Pharisean +Pharisee +pharisee +Phariseeism +pharmacal +pharmaceutic +pharmaceutical +pharmaceutically +pharmaceutics +pharmaceutist +pharmacic +pharmacist +pharmacite +pharmacodiagnosis +pharmacodynamic +pharmacodynamical +pharmacodynamics +pharmacoendocrinology +pharmacognosia +pharmacognosis +pharmacognosist +pharmacognostical +pharmacognostically +pharmacognostics +pharmacognosy +pharmacography +pharmacolite +pharmacologia +pharmacologic +pharmacological +pharmacologically +pharmacologist +pharmacology +pharmacomania +pharmacomaniac +pharmacomaniacal +pharmacometer +pharmacopedia +pharmacopedic +pharmacopedics +pharmacopeia +pharmacopeial +pharmacopeian +pharmacophobia +pharmacopoeia +pharmacopoeial +pharmacopoeian +pharmacopoeist +pharmacopolist +pharmacoposia +pharmacopsychology +pharmacosiderite +pharmacotherapy +pharmacy +pharmakos +pharmic +pharmuthi +pharology +Pharomacrus +pharos +Pharsalian +pharyngal +pharyngalgia +pharyngalgic +pharyngeal +pharyngectomy +pharyngemphraxis +pharynges +pharyngic +pharyngismus +pharyngitic +pharyngitis +pharyngoamygdalitis +pharyngobranch +pharyngobranchial +pharyngobranchiate +Pharyngobranchii +pharyngocele +pharyngoceratosis +pharyngodynia +pharyngoepiglottic +pharyngoepiglottidean +pharyngoesophageal +pharyngoglossal +pharyngoglossus +pharyngognath +Pharyngognathi +pharyngognathous +pharyngographic +pharyngography +pharyngokeratosis +pharyngolaryngeal +pharyngolaryngitis +pharyngolith +pharyngological +pharyngology +pharyngomaxillary +pharyngomycosis +pharyngonasal +pharyngopalatine +pharyngopalatinus +pharyngoparalysis +pharyngopathy +pharyngoplasty +pharyngoplegia +pharyngoplegic +pharyngoplegy +pharyngopleural +Pharyngopneusta +pharyngopneustal +pharyngorhinitis +pharyngorhinoscopy +pharyngoscleroma +pharyngoscope +pharyngoscopy +pharyngospasm +pharyngotherapy +pharyngotomy +pharyngotonsillitis +pharyngotyphoid +pharyngoxerosis +pharynogotome +pharynx +Phascaceae +phascaceous +Phascogale +Phascolarctinae +Phascolarctos +phascolome +Phascolomyidae +Phascolomys +Phascolonus +Phascum +phase +phaseal +phaseless +phaselin +phasemeter +phasemy +Phaseolaceae +phaseolin +phaseolous +phaseolunatin +Phaseolus +phaseometer +phases +Phasianella +Phasianellidae +phasianic +phasianid +Phasianidae +Phasianinae +phasianine +phasianoid +Phasianus +phasic +Phasiron +phasis +phasm +phasma +phasmatid +Phasmatida +Phasmatidae +Phasmatodea +phasmatoid +Phasmatoidea +phasmatrope +phasmid +Phasmida +Phasmidae +phasmoid +phasogeneous +phasotropy +pheal +pheasant +pheasantry +pheasantwood +Phebe +Phecda +Phegopteris +Pheidole +phellandrene +phellem +Phellodendron +phelloderm +phellodermal +phellogen +phellogenetic +phellogenic +phellonic +phelloplastic +phelloplastics +phelonion +phemic +Phemie +phenacaine +phenacetin +phenaceturic +phenacite +Phenacodontidae +Phenacodus +phenacyl +phenakism +phenakistoscope +Phenalgin +phenanthrene +phenanthridine +phenanthridone +phenanthrol +phenanthroline +phenarsine +phenate +phenazine +phenazone +phene +phenegol +phenene +phenethyl +phenetidine +phenetole +phengite +phengitical +phenic +phenicate +phenicious +phenicopter +phenin +phenmiazine +phenobarbital +phenocoll +phenocopy +phenocryst +phenocrystalline +phenogenesis +phenogenetic +phenol +phenolate +phenolic +phenolization +phenolize +phenological +phenologically +phenologist +phenology +phenoloid +phenolphthalein +phenolsulphonate +phenolsulphonephthalein +phenolsulphonic +phenomena +phenomenal +phenomenalism +phenomenalist +phenomenalistic +phenomenalistically +phenomenality +phenomenalization +phenomenalize +phenomenally +phenomenic +phenomenical +phenomenism +phenomenist +phenomenistic +phenomenize +phenomenological +phenomenologically +phenomenology +phenomenon +phenoplast +phenoplastic +phenoquinone +phenosafranine +phenosal +phenospermic +phenospermy +phenothiazine +phenotype +phenotypic +phenotypical +phenotypically +phenoxazine +phenoxid +phenoxide +phenozygous +Pheny +phenyl +phenylacetaldehyde +phenylacetamide +phenylacetic +phenylalanine +phenylamide +phenylamine +phenylate +phenylation +phenylboric +phenylcarbamic +phenylcarbimide +phenylene +phenylenediamine +phenylethylene +phenylglycine +phenylglycolic +phenylglyoxylic +phenylhydrazine +phenylhydrazone +phenylic +phenylmethane +pheon +pheophyl +pheophyll +pheophytin +Pherecratean +Pherecratian +Pherecratic +Pherephatta +pheretrer +Pherkad +Pherophatta +Phersephatta +Phersephoneia +phew +phi +phial +phiale +phialful +phialide +phialine +phiallike +phialophore +phialospore +Phidiac +Phidian +Phigalian +Phil +Philadelphian +Philadelphianism +philadelphite +Philadelphus +philadelphy +philalethist +philamot +Philander +philander +philanderer +philanthid +Philanthidae +philanthrope +philanthropian +philanthropic +philanthropical +philanthropically +philanthropinism +philanthropinist +Philanthropinum +philanthropism +philanthropist +philanthropistic +philanthropize +philanthropy +Philanthus +philantomba +philarchaist +philaristocracy +philatelic +philatelical +philatelically +philatelism +philatelist +philatelistic +philately +Philathea +philathletic +philematology +Philepitta +Philepittidae +Philesia +Philetaerus +philharmonic +philhellene +philhellenic +philhellenism +philhellenist +philhippic +philhymnic +philiater +Philip +Philippa +Philippan +Philippian +Philippic +philippicize +Philippine +Philippines +Philippism +Philippist +Philippistic +Philippizate +philippize +philippizer +philippus +Philistia +Philistian +Philistine +Philistinely +Philistinian +Philistinic +Philistinish +Philistinism +Philistinize +philliloo +phillipsine +phillipsite +Phillis +Phillyrea +phillyrin +philobiblian +philobiblic +philobiblical +philobiblist +philobotanic +philobotanist +philobrutish +philocalic +philocalist +philocaly +philocathartic +philocatholic +philocomal +Philoctetes +philocubist +philocynic +philocynical +philocynicism +philocyny +philodemic +Philodendron +philodespot +philodestructiveness +Philodina +Philodinidae +philodox +philodoxer +philodoxical +philodramatic +philodramatist +philofelist +philofelon +philogarlic +philogastric +philogeant +philogenitive +philogenitiveness +philograph +philographic +philogynaecic +philogynist +philogynous +philogyny +Philohela +philohellenian +philokleptic +philoleucosis +philologaster +philologastry +philologer +philologian +philologic +philological +philologically +philologist +philologistic +philologize +philologue +philology +Philomachus +philomath +philomathematic +philomathematical +philomathic +philomathical +philomathy +philomel +Philomela +philomelanist +philomuse +philomusical +philomystic +philonatural +philoneism +Philonian +Philonic +Philonism +Philonist +philonium +philonoist +philopagan +philopater +philopatrian +philopena +philophilosophos +philopig +philoplutonic +philopoet +philopogon +philopolemic +philopolemical +philopornist +philoprogeneity +philoprogenitive +philoprogenitiveness +philopterid +Philopteridae +philopublican +philoradical +philorchidaceous +philornithic +philorthodox +philosoph +philosophaster +philosophastering +philosophastry +philosophedom +philosopheme +philosopher +philosopheress +philosophership +philosophic +philosophical +philosophically +philosophicalness +philosophicide +philosophicohistorical +philosophicojuristic +philosophicolegal +philosophicoreligious +philosophicotheological +philosophism +philosophist +philosophister +philosophistic +philosophistical +philosophization +philosophize +philosophizer +philosophling +philosophobia +philosophocracy +philosophuncule +philosophunculist +philosophy +philotadpole +philotechnic +philotechnical +philotechnist +philothaumaturgic +philotheism +philotheist +philotheistic +philotheosophical +philotherian +philotherianism +Philotria +Philoxenian +philoxygenous +philozoic +philozoist +philozoonist +philter +philterer +philterproof +philtra +philtrum +Philydraceae +philydraceous +Philyra +phimosed +phimosis +phimotic +Phineas +Phiomia +phit +phiz +phizes +phizog +phlebalgia +phlebangioma +phlebarteriectasia +phlebarteriodialysis +phlebectasia +phlebectasis +phlebectasy +phlebectomy +phlebectopia +phlebectopy +phlebemphraxis +phlebenteric +phlebenterism +phlebitic +phlebitis +Phlebodium +phlebogram +phlebograph +phlebographical +phlebography +phleboid +phleboidal +phlebolite +phlebolith +phlebolithiasis +phlebolithic +phlebolitic +phlebological +phlebology +phlebometritis +phlebopexy +phleboplasty +phleborrhage +phleborrhagia +phleborrhaphy +phleborrhexis +phlebosclerosis +phlebosclerotic +phlebostasia +phlebostasis +phlebostenosis +phlebostrepsis +phlebothrombosis +phlebotome +phlebotomic +phlebotomical +phlebotomically +phlebotomist +phlebotomization +phlebotomize +Phlebotomus +phlebotomus +phlebotomy +Phlegethon +Phlegethontal +Phlegethontic +phlegm +phlegma +phlegmagogue +phlegmasia +phlegmatic +phlegmatical +phlegmatically +phlegmaticalness +phlegmaticly +phlegmaticness +phlegmatism +phlegmatist +phlegmatous +phlegmless +phlegmon +phlegmonic +phlegmonoid +phlegmonous +phlegmy +Phleum +phlobaphene +phlobatannin +phloem +phloeophagous +phloeoterma +phlogisma +phlogistian +phlogistic +phlogistical +phlogisticate +phlogistication +phlogiston +phlogistonism +phlogistonist +phlogogenetic +phlogogenic +phlogogenous +phlogopite +phlogosed +Phlomis +phloretic +phloroglucic +phloroglucin +phlorone +phloxin +pho +phobiac +phobic +phobism +phobist +phobophobia +Phobos +phoby +phoca +phocacean +phocaceous +Phocaean +Phocaena +Phocaenina +phocaenine +phocal +Phocean +phocenate +phocenic +phocenin +Phocian +phocid +Phocidae +phociform +Phocinae +phocine +phocodont +Phocodontia +phocodontic +Phocoena +phocoid +phocomelia +phocomelous +phocomelus +Phoebe +phoebe +Phoebean +Phoenicaceae +phoenicaceous +Phoenicales +phoenicean +Phoenician +Phoenicianism +Phoenicid +phoenicite +Phoenicize +phoenicochroite +Phoenicopteridae +Phoenicopteriformes +phoenicopteroid +Phoenicopteroideae +phoenicopterous +Phoenicopterus +Phoeniculidae +Phoeniculus +phoenicurous +phoenigm +Phoenix +phoenix +phoenixity +phoenixlike +phoh +pholad +Pholadacea +pholadian +pholadid +Pholadidae +Pholadinea +pholadoid +Pholas +pholcid +Pholcidae +pholcoid +Pholcus +pholido +pholidolite +pholidosis +Pholidota +pholidote +Pholiota +Phoma +Phomopsis +phon +phonal +phonasthenia +phonate +phonation +phonatory +phonautogram +phonautograph +phonautographic +phonautographically +phone +phoneidoscope +phoneidoscopic +Phonelescope +phoneme +phonemic +phonemics +phonendoscope +phonesis +phonestheme +phonetic +phonetical +phonetically +phonetician +phoneticism +phoneticist +phoneticization +phoneticize +phoneticogrammatical +phoneticohieroglyphic +phonetics +phonetism +phonetist +phonetization +phonetize +phoniatrics +phoniatry +phonic +phonics +phonikon +phonism +phono +phonocamptic +phonocinematograph +phonodeik +phonodynamograph +phonoglyph +phonogram +phonogramic +phonogramically +phonogrammatic +phonogrammatical +phonogrammic +phonogrammically +phonograph +phonographer +phonographic +phonographical +phonographically +phonographist +phonography +phonolite +phonolitic +phonologer +phonologic +phonological +phonologically +phonologist +phonology +phonometer +phonometric +phonometry +phonomimic +phonomotor +phonopathy +phonophile +phonophobia +phonophone +phonophore +phonophoric +phonophorous +phonophote +phonophotography +phonophotoscope +phonophotoscopic +phonoplex +phonoscope +phonotelemeter +phonotype +phonotyper +phonotypic +phonotypical +phonotypically +phonotypist +phonotypy +phony +phoo +Phora +Phoradendron +phoranthium +phoresis +phoresy +phoria +phorid +Phoridae +phorminx +Phormium +phorology +phorometer +phorometric +phorometry +phorone +phoronic +phoronid +Phoronida +Phoronidea +Phoronis +phoronomia +phoronomic +phoronomically +phoronomics +phoronomy +Phororhacidae +Phororhacos +phoroscope +phorozooid +phos +phose +phosgene +phosgenic +phosgenite +phosis +phosphagen +phospham +phosphamic +phosphamide +phosphamidic +phosphammonium +phosphatase +phosphate +phosphated +phosphatemia +phosphatese +phosphatic +phosphatide +phosphation +phosphatization +phosphatize +phosphaturia +phosphaturic +phosphene +phosphenyl +phosphide +phosphinate +phosphine +phosphinic +phosphite +phospho +phosphoaminolipide +phosphocarnic +phosphocreatine +phosphoferrite +phosphoglycerate +phosphoglyceric +phosphoglycoprotein +phospholipide +phospholipin +phosphomolybdate +phosphomolybdic +phosphonate +phosphonic +phosphonium +phosphophyllite +phosphoprotein +phosphor +phosphorate +phosphore +phosphoreal +phosphorent +phosphoreous +phosphoresce +phosphorescence +phosphorescent +phosphorescently +phosphoreted +phosphorhidrosis +phosphori +phosphoric +phosphorical +phosphoriferous +phosphorism +phosphorite +phosphoritic +phosphorize +phosphorogen +phosphorogenic +phosphorograph +phosphorographic +phosphorography +phosphoroscope +phosphorous +phosphoruria +phosphorus +phosphoryl +phosphorylase +phosphorylation +phosphosilicate +phosphotartaric +phosphotungstate +phosphotungstic +phosphowolframic +phosphuranylite +phosphuret +phosphuria +phosphyl +phossy +phot +photaesthesia +photaesthesis +photaesthetic +photal +photalgia +photechy +photelectrograph +photeolic +photerythrous +photesthesis +photic +photics +Photinia +Photinian +Photinianism +photism +photistic +photo +photoactinic +photoactivate +photoactivation +photoactive +photoactivity +photoaesthetic +photoalbum +photoalgraphy +photoanamorphosis +photoaquatint +Photobacterium +photobathic +photobiotic +photobromide +photocampsis +photocatalysis +photocatalyst +photocatalytic +photocatalyzer +photocell +photocellulose +photoceptor +photoceramic +photoceramics +photoceramist +photochemic +photochemical +photochemically +photochemigraphy +photochemist +photochemistry +photochloride +photochlorination +photochromascope +photochromatic +photochrome +photochromic +photochromography +photochromolithograph +photochromoscope +photochromotype +photochromotypy +photochromy +photochronograph +photochronographic +photochronographical +photochronographically +photochronography +photocollograph +photocollographic +photocollography +photocollotype +photocombustion +photocompose +photocomposition +photoconductivity +photocopier +photocopy +photocrayon +photocurrent +photodecomposition +photodensitometer +photodermatic +photodermatism +photodisintegration +photodissociation +photodrama +photodramatic +photodramatics +photodramatist +photodramaturgic +photodramaturgy +photodrome +photodromy +photodynamic +photodynamical +photodynamically +photodynamics +photodysphoria +photoelastic +photoelasticity +photoelectric +photoelectrical +photoelectrically +photoelectricity +photoelectron +photoelectrotype +photoemission +photoemissive +photoengrave +photoengraver +photoengraving +photoepinastic +photoepinastically +photoepinasty +photoesthesis +photoesthetic +photoetch +photoetcher +photoetching +photofilm +photofinish +photofinisher +photofinishing +photofloodlamp +photogalvanograph +photogalvanographic +photogalvanography +photogastroscope +photogelatin +photogen +photogene +photogenetic +photogenic +photogenically +photogenous +photoglyph +photoglyphic +photoglyphography +photoglyphy +photoglyptic +photoglyptography +photogram +photogrammeter +photogrammetric +photogrammetrical +photogrammetry +photograph +photographable +photographee +photographer +photographeress +photographess +photographic +photographical +photographically +photographist +photographize +photographometer +photography +photogravure +photogravurist +photogyric +photohalide +photoheliograph +photoheliographic +photoheliography +photoheliometer +photohyponastic +photohyponastically +photohyponasty +photoimpression +photoinactivation +photoinduction +photoinhibition +photointaglio +photoionization +photoisomeric +photoisomerization +photokinesis +photokinetic +photolith +photolitho +photolithograph +photolithographer +photolithographic +photolithography +photologic +photological +photologist +photology +photoluminescence +photoluminescent +photolysis +photolyte +photolytic +photoma +photomacrograph +photomagnetic +photomagnetism +photomap +photomapper +photomechanical +photomechanically +photometeor +photometer +photometric +photometrical +photometrically +photometrician +photometrist +photometrograph +photometry +photomezzotype +photomicrogram +photomicrograph +photomicrographer +photomicrographic +photomicrography +photomicroscope +photomicroscopic +photomicroscopy +photomontage +photomorphosis +photomural +photon +photonastic +photonasty +photonegative +photonephograph +photonephoscope +photoneutron +photonosus +photooxidation +photooxidative +photopathic +photopathy +photoperceptive +photoperimeter +photoperiod +photoperiodic +photoperiodism +photophane +photophile +photophilic +photophilous +photophily +photophobe +photophobia +photophobic +photophobous +photophone +photophonic +photophony +photophore +photophoresis +photophosphorescent +photophygous +photophysical +photophysicist +photopia +photopic +photopile +photopitometer +photoplay +photoplayer +photoplaywright +photopography +photopolarigraph +photopolymerization +photopositive +photoprint +photoprinter +photoprinting +photoprocess +photoptometer +photoradio +photoradiogram +photoreception +photoreceptive +photoreceptor +photoregression +photorelief +photoresistance +photosalt +photosantonic +photoscope +photoscopic +photoscopy +photosculptural +photosculpture +photosensitive +photosensitiveness +photosensitivity +photosensitization +photosensitize +photosensitizer +photosensory +photospectroheliograph +photospectroscope +photospectroscopic +photospectroscopical +photospectroscopy +photosphere +photospheric +photostability +photostable +Photostat +photostat +photostationary +photostereograph +photosurveying +photosyntax +photosynthate +photosynthesis +photosynthesize +photosynthetic +photosynthetically +photosynthometer +phototachometer +phototachometric +phototachometrical +phototachometry +phototactic +phototactically +phototactism +phototaxis +phototaxy +phototechnic +phototelegraph +phototelegraphic +phototelegraphically +phototelegraphy +phototelephone +phototelephony +phototelescope +phototelescopic +phototheodolite +phototherapeutic +phototherapeutics +phototherapic +phototherapist +phototherapy +photothermic +phototonic +phototonus +phototopographic +phototopographical +phototopography +phototrichromatic +phototrope +phototrophic +phototrophy +phototropic +phototropically +phototropism +phototropy +phototube +phototype +phototypic +phototypically +phototypist +phototypographic +phototypography +phototypy +photovisual +photovitrotype +photovoltaic +photoxylography +photozinco +photozincograph +photozincographic +photozincography +photozincotype +photozincotypy +photuria +Phractamphibia +phragma +Phragmidium +Phragmites +phragmocone +phragmoconic +Phragmocyttares +phragmocyttarous +phragmoid +phragmosis +phrasable +phrasal +phrasally +phrase +phraseable +phraseless +phrasemaker +phrasemaking +phraseman +phrasemonger +phrasemongering +phrasemongery +phraseogram +phraseograph +phraseographic +phraseography +phraseological +phraseologically +phraseologist +phraseology +phraser +phrasify +phrasiness +phrasing +phrasy +phrator +phratral +phratria +phratriac +phratrial +phratry +phreatic +phreatophyte +phrenesia +phrenesiac +phrenesis +phrenetic +phrenetically +phreneticness +phrenic +phrenicectomy +phrenicocolic +phrenicocostal +phrenicogastric +phrenicoglottic +phrenicohepatic +phrenicolienal +phrenicopericardiac +phrenicosplenic +phrenicotomy +phrenics +phrenitic +phrenitis +phrenocardia +phrenocardiac +phrenocolic +phrenocostal +phrenodynia +phrenogastric +phrenoglottic +phrenogram +phrenograph +phrenography +phrenohepatic +phrenologer +phrenologic +phrenological +phrenologically +phrenologist +phrenologize +phrenology +phrenomagnetism +phrenomesmerism +phrenopathia +phrenopathic +phrenopathy +phrenopericardiac +phrenoplegia +phrenoplegy +phrenosin +phrenosinic +phrenospasm +phrenosplenic +phronesis +Phronima +Phronimidae +phrontisterion +phrontisterium +phrontistery +Phryganea +phryganeid +Phryganeidae +phryganeoid +Phrygian +Phrygianize +phrygium +Phryma +Phrymaceae +phrymaceous +phrynid +Phrynidae +phrynin +phrynoid +Phrynosoma +phthalacene +phthalan +phthalanilic +phthalate +phthalazin +phthalazine +phthalein +phthaleinometer +phthalic +phthalid +phthalide +phthalimide +phthalin +phthalocyanine +phthalyl +phthanite +Phthartolatrae +phthinoid +phthiocol +phthiriasis +Phthirius +phthirophagous +phthisic +phthisical +phthisicky +phthisiogenesis +phthisiogenetic +phthisiogenic +phthisiologist +phthisiology +phthisiophobia +phthisiotherapeutic +phthisiotherapy +phthisipneumonia +phthisipneumony +phthisis +phthongal +phthongometer +phthor +phthoric +phu +phugoid +phulkari +phulwa +phulwara +phut +Phyciodes +phycite +Phycitidae +phycitol +phycochromaceae +phycochromaceous +phycochrome +Phycochromophyceae +phycochromophyceous +phycocyanin +phycocyanogen +Phycodromidae +phycoerythrin +phycography +phycological +phycologist +phycology +Phycomyces +phycomycete +Phycomycetes +phycomycetous +phycophaein +phycoxanthin +phycoxanthine +phygogalactic +phyla +phylacobiosis +phylacobiotic +phylacteric +phylacterical +phylacteried +phylacterize +phylactery +phylactic +phylactocarp +phylactocarpal +Phylactolaema +Phylactolaemata +phylactolaematous +Phylactolema +Phylactolemata +phylarch +phylarchic +phylarchical +phylarchy +phyle +phylephebic +phylesis +phyletic +phyletically +phyletism +phylic +Phyllachora +Phyllactinia +phyllade +Phyllanthus +phyllary +Phyllaurea +phylliform +phyllin +phylline +Phyllis +phyllite +phyllitic +Phyllitis +Phyllium +phyllobranchia +phyllobranchial +phyllobranchiate +Phyllocactus +phyllocarid +Phyllocarida +phyllocaridan +Phylloceras +phyllocerate +Phylloceratidae +phylloclad +phylloclade +phyllocladioid +phyllocladium +phyllocladous +phyllocyanic +phyllocyanin +phyllocyst +phyllocystic +phyllode +phyllodial +phyllodination +phyllodineous +phyllodiniation +phyllodinous +phyllodium +Phyllodoce +phyllody +phylloerythrin +phyllogenetic +phyllogenous +phylloid +phylloidal +phylloideous +phyllomancy +phyllomania +phyllome +phyllomic +phyllomorph +phyllomorphic +phyllomorphosis +phyllomorphy +Phyllophaga +phyllophagous +phyllophore +phyllophorous +phyllophyllin +phyllophyte +phyllopod +Phyllopoda +phyllopodan +phyllopode +phyllopodiform +phyllopodium +phyllopodous +phylloporphyrin +Phyllopteryx +phylloptosis +phyllopyrrole +phyllorhine +phyllorhinine +phylloscopine +Phylloscopus +phyllosiphonic +phyllosoma +Phyllosomata +phyllosome +Phyllospondyli +phyllospondylous +Phyllostachys +Phyllosticta +Phyllostoma +Phyllostomatidae +Phyllostomatinae +phyllostomatoid +phyllostomatous +phyllostome +Phyllostomidae +Phyllostominae +phyllostomine +phyllostomous +Phyllostomus +phyllotactic +phyllotactical +phyllotaxis +phyllotaxy +phyllous +phylloxanthin +Phylloxera +phylloxeran +phylloxeric +Phylloxeridae +phyllozooid +phylogenetic +phylogenetical +phylogenetically +phylogenic +phylogenist +phylogeny +phylogerontic +phylogerontism +phylography +phylology +phylon +phyloneanic +phylonepionic +phylum +phyma +phymata +phymatic +phymatid +Phymatidae +Phymatodes +phymatoid +phymatorhysin +phymatosis +Phymosia +Physa +physagogue +Physalia +physalian +Physaliidae +Physalis +physalite +Physalospora +Physapoda +Physaria +Physcia +Physciaceae +physcioid +Physcomitrium +Physeter +Physeteridae +Physeterinae +physeterine +physeteroid +Physeteroidea +physharmonica +physianthropy +physiatric +physiatrical +physiatrics +physic +physical +physicalism +physicalist +physicalistic +physicalistically +physicality +physically +physicalness +physician +physicianary +physiciancy +physicianed +physicianer +physicianess +physicianless +physicianly +physicianship +physicism +physicist +physicked +physicker +physicking +physicky +physicoastronomical +physicobiological +physicochemic +physicochemical +physicochemically +physicochemist +physicochemistry +physicogeographical +physicologic +physicological +physicomathematical +physicomathematics +physicomechanical +physicomedical +physicomental +physicomorph +physicomorphic +physicomorphism +physicooptics +physicophilosophical +physicophilosophy +physicophysiological +physicopsychical +physicosocial +physicotheological +physicotheologist +physicotheology +physicotherapeutic +physicotherapeutics +physicotherapy +physics +Physidae +physiform +physiochemical +physiochemically +physiocracy +physiocrat +physiocratic +physiocratism +physiocratist +physiogenesis +physiogenetic +physiogenic +physiogeny +physiognomic +physiognomical +physiognomically +physiognomics +physiognomist +physiognomize +physiognomonic +physiognomonical +physiognomy +physiogony +physiographer +physiographic +physiographical +physiographically +physiography +physiolater +physiolatrous +physiolatry +physiologer +physiologian +physiological +physiologically +physiologicoanatomic +physiologist +physiologize +physiologue +physiologus +physiology +physiopathological +physiophilist +physiophilosopher +physiophilosophical +physiophilosophy +physiopsychic +physiopsychical +physiopsychological +physiopsychology +physiosociological +physiosophic +physiosophy +physiotherapeutic +physiotherapeutical +physiotherapeutics +physiotherapist +physiotherapy +physiotype +physiotypy +physique +physiqued +physitheism +physitheistic +physitism +physiurgic +physiurgy +physocarpous +Physocarpus +physocele +physoclist +Physoclisti +physoclistic +physoclistous +Physoderma +physogastric +physogastrism +physogastry +physometra +Physonectae +physonectous +Physophorae +physophoran +physophore +physophorous +physopod +Physopoda +physopodan +Physostegia +Physostigma +physostigmine +physostomatous +physostome +Physostomi +physostomous +phytalbumose +phytase +Phytelephas +Phyteus +phytic +phytiferous +phytiform +phytin +phytivorous +phytobacteriology +phytobezoar +phytobiological +phytobiology +phytochemical +phytochemistry +phytochlorin +phytocidal +phytodynamics +phytoecological +phytoecologist +phytoecology +Phytoflagellata +phytogamy +phytogenesis +phytogenetic +phytogenetical +phytogenetically +phytogenic +phytogenous +phytogeny +phytogeographer +phytogeographic +phytogeographical +phytogeographically +phytogeography +phytoglobulin +phytograph +phytographer +phytographic +phytographical +phytographist +phytography +phytohormone +phytoid +phytol +Phytolacca +Phytolaccaceae +phytolaccaceous +phytolatrous +phytolatry +phytolithological +phytolithologist +phytolithology +phytologic +phytological +phytologically +phytologist +phytology +phytoma +Phytomastigina +Phytomastigoda +phytome +phytomer +phytometer +phytometric +phytometry +phytomonad +Phytomonadida +Phytomonadina +Phytomonas +phytomorphic +phytomorphology +phytomorphosis +phyton +phytonic +phytonomy +phytooecology +phytopaleontologic +phytopaleontological +phytopaleontologist +phytopaleontology +phytoparasite +phytopathogen +phytopathogenic +phytopathologic +phytopathological +phytopathologist +phytopathology +Phytophaga +phytophagan +phytophagic +Phytophagineae +phytophagous +phytophagy +phytopharmacologic +phytopharmacology +phytophenological +phytophenology +phytophil +phytophilous +Phytophthora +phytophylogenetic +phytophylogenic +phytophylogeny +phytophysiological +phytophysiology +phytoplankton +phytopsyche +phytoptid +Phytoptidae +phytoptose +phytoptosis +Phytoptus +phytorhodin +phytosaur +Phytosauria +phytosaurian +phytoserologic +phytoserological +phytoserologically +phytoserology +phytosis +phytosociologic +phytosociological +phytosociologically +phytosociologist +phytosociology +phytosterin +phytosterol +phytostrote +phytosynthesis +phytotaxonomy +phytotechny +phytoteratologic +phytoteratological +phytoteratologist +phytoteratology +Phytotoma +Phytotomidae +phytotomist +phytotomy +phytotopographical +phytotopography +phytotoxic +phytotoxin +phytovitellin +Phytozoa +phytozoan +Phytozoaria +phytozoon +phytyl +pi +pia +piaba +piacaba +piacle +piacular +piacularity +piacularly +piacularness +piaculum +piaffe +piaffer +pial +pialyn +pian +pianette +pianic +pianino +pianism +pianissimo +pianist +pianiste +pianistic +pianistically +Piankashaw +piannet +piano +pianoforte +pianofortist +pianograph +Pianokoto +Pianola +pianola +pianolist +pianologue +piarhemia +piarhemic +Piarist +Piaroa +Piaroan +Piaropus +Piarroan +piassava +Piast +piaster +piastre +piation +piazine +piazza +piazzaed +piazzaless +piazzalike +piazzian +pibcorn +piblokto +pibroch +pic +Pica +pica +picador +picadura +Picae +pical +picamar +picara +Picard +picarel +picaresque +Picariae +picarian +Picarii +picaro +picaroon +picary +picayune +picayunish +picayunishly +picayunishness +piccadill +piccadilly +piccalilli +piccolo +piccoloist +pice +Picea +Picene +picene +Picenian +piceoferruginous +piceotestaceous +piceous +piceworth +pichi +pichiciago +pichuric +pichurim +Pici +Picidae +piciform +Piciformes +Picinae +picine +pick +pickaback +pickable +pickableness +pickage +pickaninny +pickaroon +pickaway +pickax +picked +pickedly +pickedness +pickee +pickeer +picker +pickerel +pickerelweed +pickering +pickeringite +pickery +picket +picketboat +picketeer +picketer +pickfork +pickietar +pickings +pickle +picklelike +pickleman +pickler +pickleweed +pickleworm +picklock +pickman +pickmaw +picknick +picknicker +pickover +pickpocket +pickpocketism +pickpocketry +pickpole +pickpurse +pickshaft +picksman +picksmith +picksome +picksomeness +pickthank +pickthankly +pickthankness +pickthatch +picktooth +pickup +pickwick +Pickwickian +Pickwickianism +Pickwickianly +pickwork +picky +picnic +picnicker +picnickery +Picnickian +picnickish +picnicky +pico +picofarad +picoid +picoline +picolinic +picot +picotah +picotee +picotite +picqueter +picra +picramic +Picramnia +picrasmin +picrate +picrated +picric +Picris +picrite +picrocarmine +Picrodendraceae +Picrodendron +picroerythrin +picrol +picrolite +picromerite +picropodophyllin +picrorhiza +picrorhizin +picrotin +picrotoxic +picrotoxin +picrotoxinin +picryl +Pict +pict +pictarnie +Pictavi +Pictish +Pictland +pictogram +pictograph +pictographic +pictographically +pictography +Pictones +pictoradiogram +pictorial +pictorialism +pictorialist +pictorialization +pictorialize +pictorially +pictorialness +pictoric +pictorical +pictorically +picturability +picturable +picturableness +picturably +pictural +picture +picturecraft +pictured +picturedom +picturedrome +pictureful +pictureless +picturelike +picturely +picturemaker +picturemaking +picturer +picturesque +picturesquely +picturesqueness +picturesquish +picturization +picturize +pictury +picucule +picuda +picudilla +picudo +picul +piculet +piculule +Picumninae +Picumnus +Picunche +Picuris +Picus +pidan +piddle +piddler +piddling +piddock +pidgin +pidjajap +pie +piebald +piebaldism +piebaldly +piebaldness +piece +pieceable +pieceless +piecemaker +piecemeal +piecemealwise +piecen +piecener +piecer +piecette +piecewise +piecework +pieceworker +piecing +piecrust +pied +piedfort +piedly +piedmont +piedmontal +Piedmontese +piedmontite +piedness +Piegan +piehouse +pieless +pielet +pielum +piemag +pieman +piemarker +pien +pienanny +piend +piepan +pieplant +piepoudre +piepowder +pieprint +pier +pierage +pierce +pierceable +pierced +piercel +pierceless +piercent +piercer +piercing +piercingly +piercingness +pierdrop +pierhead +Pierian +pierid +Pieridae +Pierides +Pieridinae +pieridine +Pierinae +pierine +Pieris +pierless +pierlike +Pierre +Pierrot +pierrot +pierrotic +pieshop +piet +pietas +pietic +pietism +Pietist +pietist +pietistic +pietistical +pietistically +pietose +piety +piewife +piewipe +piewoman +piezo +piezochemical +piezochemistry +piezocrystallization +piezoelectric +piezoelectrically +piezoelectricity +piezometer +piezometric +piezometrical +piezometry +piff +piffle +piffler +pifine +pig +pigbelly +pigdan +pigdom +pigeon +pigeonable +pigeonberry +pigeoneer +pigeoner +pigeonfoot +pigeongram +pigeonhearted +pigeonhole +pigeonholer +pigeonman +pigeonry +pigeontail +pigeonweed +pigeonwing +pigeonwood +pigface +pigfish +pigflower +pigfoot +pigful +piggery +piggin +pigging +piggish +piggishly +piggishness +piggle +piggy +pighead +pigheaded +pigheadedly +pigheadedness +pigherd +pightle +pigless +piglet +pigling +piglinghood +pigly +pigmaker +pigmaking +pigman +pigment +pigmental +pigmentally +pigmentary +pigmentation +pigmentize +pigmentolysis +pigmentophage +pigmentose +Pigmy +pignolia +pignon +pignorate +pignoration +pignoratitious +pignorative +pignus +pignut +pigpen +pigritude +pigroot +pigsconce +pigskin +pigsney +pigstick +pigsticker +pigsty +pigtail +pigwash +pigweed +pigwidgeon +pigyard +piitis +pik +pika +pike +piked +pikel +pikelet +pikeman +pikemonger +piker +pikestaff +piketail +pikey +piki +piking +pikle +piky +pilage +pilandite +pilapil +pilar +pilary +pilaster +pilastered +pilastering +pilastrade +pilastraded +pilastric +Pilate +Pilatian +pilau +pilaued +pilch +pilchard +pilcher +pilcorn +pilcrow +pile +Pilea +pileata +pileate +pileated +piled +pileiform +pileolated +pileolus +pileorhiza +pileorhize +pileous +piler +piles +pileus +pileweed +pilework +pileworm +pilewort +pilfer +pilferage +pilferer +pilfering +pilferingly +pilferment +pilgarlic +pilgarlicky +pilger +pilgrim +pilgrimage +pilgrimager +pilgrimatic +pilgrimatical +pilgrimdom +pilgrimer +pilgrimess +pilgrimism +pilgrimize +pilgrimlike +pilgrimwise +pili +pilidium +pilifer +piliferous +piliform +piligan +piliganine +piligerous +pilikai +pililloo +pilimiction +pilin +piline +piling +pilipilula +pilkins +pill +pillage +pillageable +pillagee +pillager +pillar +pillared +pillaret +pillaring +pillarist +pillarize +pillarlet +pillarlike +pillarwise +pillary +pillas +pillbox +pilled +pilledness +pillet +pilleus +pillion +pilliver +pilliwinks +pillmaker +pillmaking +pillmonger +pillorization +pillorize +pillory +pillow +pillowcase +pillowing +pillowless +pillowmade +pillowwork +pillowy +pillworm +pillwort +pilm +pilmy +Pilobolus +pilocarpidine +pilocarpine +Pilocarpus +Pilocereus +pilocystic +piloerection +pilomotor +pilon +pilonidal +pilori +pilose +pilosebaceous +pilosine +pilosis +pilosism +pilosity +pilot +pilotage +pilotaxitic +pilotee +pilothouse +piloting +pilotism +pilotless +pilotman +pilotry +pilotship +pilotweed +pilous +Pilpai +Pilpay +pilpul +pilpulist +pilpulistic +piltock +pilula +pilular +Pilularia +pilule +pilulist +pilulous +pilum +Pilumnus +pilus +pilwillet +pily +Pima +Piman +pimaric +pimelate +Pimelea +pimelic +pimelite +pimelitis +Pimenta +pimento +pimenton +pimgenet +pimienta +pimiento +pimlico +pimola +pimp +pimperlimpimp +pimpernel +pimpery +Pimpinella +pimping +pimpish +Pimpla +pimple +pimpleback +pimpled +pimpleproof +Pimplinae +pimpliness +pimplo +pimploe +pimplous +pimply +pimpship +pin +pina +Pinaceae +pinaceous +pinaces +pinachrome +pinacle +Pinacoceras +Pinacoceratidae +pinacocytal +pinacocyte +pinacoid +pinacoidal +pinacol +pinacolate +pinacolic +pinacolin +pinacone +pinacoteca +pinaculum +Pinacyanol +pinafore +pinakiolite +pinakoidal +pinakotheke +Pinal +Pinaleno +Pinales +pinang +pinaster +pinatype +pinaverdol +pinax +pinball +pinbefore +pinbone +pinbush +pincase +pincement +pincer +pincerlike +pincers +pincerweed +pinch +pinchable +pinchback +pinchbeck +pinchbelly +pinchcock +pinchcommons +pinchcrust +pinche +pinched +pinchedly +pinchedness +pinchem +pincher +pinchfist +pinchfisted +pinchgut +pinching +pinchingly +pinchpenny +Pincian +Pinckneya +pincoffin +pincpinc +Pinctada +pincushion +pincushiony +pind +pinda +Pindari +Pindaric +pindarical +pindarically +Pindarism +Pindarist +Pindarize +Pindarus +pinder +pindling +pindy +pine +pineal +pinealism +pinealoma +pineapple +pined +pinedrops +pineland +pinene +piner +pinery +pinesap +pinetum +pineweed +pinewoods +piney +pinfall +pinfeather +pinfeathered +pinfeatherer +pinfeathery +pinfish +pinfold +ping +pingle +pingler +pingue +pinguecula +pinguedinous +pinguefaction +pinguefy +pinguescence +pinguescent +Pinguicula +pinguicula +Pinguiculaceae +pinguiculaceous +pinguid +pinguidity +pinguiferous +pinguin +pinguinitescent +pinguite +pinguitude +pinguitudinous +pinhead +pinheaded +pinheadedness +pinhold +pinhole +pinhook +pinic +pinicoline +pinicolous +piniferous +piniform +pining +piningly +pinion +pinioned +pinionless +pinionlike +pinipicrin +pinitannic +pinite +pinitol +pinivorous +pinjane +pinjra +pink +pinkberry +pinked +pinkeen +pinken +pinker +Pinkerton +Pinkertonism +pinkeye +pinkfish +pinkie +pinkify +pinkily +pinkiness +pinking +pinkish +pinkishness +pinkly +pinkness +pinkroot +pinksome +Pinkster +pinkweed +pinkwood +pinkwort +pinky +pinless +pinlock +pinmaker +Pinna +pinna +pinnace +pinnacle +pinnaclet +pinnae +pinnaglobin +pinnal +pinnate +pinnated +pinnatedly +pinnately +pinnatifid +pinnatifidly +pinnatilobate +pinnatilobed +pinnation +pinnatipartite +pinnatiped +pinnatisect +pinnatisected +pinnatodentate +pinnatopectinate +pinnatulate +pinned +pinnel +pinner +pinnet +Pinnidae +pinniferous +pinniform +pinnigerous +Pinnigrada +pinnigrade +pinninervate +pinninerved +pinning +pinningly +pinniped +Pinnipedia +pinnipedian +pinnisect +pinnisected +pinnitarsal +pinnitentaculate +pinniwinkis +pinnock +pinnoite +pinnotere +pinnothere +Pinnotheres +pinnotherian +Pinnotheridae +pinnula +pinnular +pinnulate +pinnulated +pinnule +pinnulet +pinny +pino +pinochle +pinocytosis +pinole +pinoleum +pinolia +pinolin +pinon +pinonic +pinpillow +pinpoint +pinprick +pinproof +pinrail +pinrowed +pinscher +pinsons +pint +pinta +pintadera +pintado +pintadoite +pintail +pintano +pinte +pintle +pinto +pintura +pinulus +Pinus +pinweed +pinwing +pinwork +pinworm +piny +pinyl +pinyon +pioneer +pioneerdom +pioneership +pionnotes +pioscope +pioted +piotine +piotty +pioury +pious +piously +piousness +Pioxe +pip +pipa +pipage +pipal +pipe +pipeage +pipecoline +pipecolinic +piped +pipefish +pipeful +pipelayer +pipeless +pipelike +pipeline +pipeman +pipemouth +Piper +piper +Piperaceae +piperaceous +Piperales +piperate +piperazin +piperazine +piperic +piperide +piperideine +piperidge +piperidide +piperidine +piperine +piperitious +piperitone +piperly +piperno +piperoid +piperonal +piperonyl +pipery +piperylene +pipestapple +pipestem +pipestone +pipet +pipette +pipewalker +pipewood +pipework +pipewort +pipi +Pipidae +Pipil +Pipile +Pipilo +piping +pipingly +pipingness +pipiri +pipistrel +pipistrelle +Pipistrellus +pipit +pipkin +pipkinet +pipless +pipped +pipper +pippin +pippiner +pippinface +pippy +Pipra +Pipridae +Piprinae +piprine +piproid +pipsissewa +Piptadenia +Piptomeris +pipunculid +Pipunculidae +pipy +piquable +piquance +piquancy +piquant +piquantly +piquantness +pique +piquet +piquia +piqure +pir +piracy +piragua +Piranga +piranha +pirate +piratelike +piratery +piratess +piratical +piratically +piratism +piratize +piraty +Pirene +Piricularia +pirijiri +piripiri +piririgua +pirl +pirn +pirner +pirnie +pirny +Piro +pirogue +pirol +piroplasm +Piroplasma +piroplasmosis +pirouette +pirouetter +pirouettist +pirr +pirraura +pirrmaw +pirssonite +Pisaca +pisaca +pisachee +Pisan +pisang +pisanite +Pisauridae +pisay +piscary +Piscataqua +Piscataway +piscation +piscatology +piscator +piscatorial +piscatorialist +piscatorially +piscatorian +piscatorious +piscatory +Pisces +piscian +piscicapture +piscicapturist +piscicolous +piscicultural +pisciculturally +pisciculture +pisciculturist +Piscid +Piscidia +piscifauna +pisciferous +pisciform +piscina +piscinal +piscine +piscinity +Piscis +piscivorous +pisco +pise +pish +pishaug +pishogue +Pishquow +pishu +Pisidium +pisiform +Pisistratean +Pisistratidae +pisk +pisky +pismire +pismirism +piso +pisolite +pisolitic +Pisonia +piss +pissabed +pissant +pist +pistache +pistachio +Pistacia +pistacite +pistareen +Pistia +pistic +pistil +pistillaceous +pistillar +pistillary +pistillate +pistillid +pistilliferous +pistilliform +pistilligerous +pistilline +pistillode +pistillody +pistilloid +pistilogy +pistle +Pistoiese +pistol +pistole +pistoleer +pistolet +pistolgram +pistolgraph +pistollike +pistolography +pistology +pistolproof +pistolwise +piston +pistonhead +pistonlike +pistrix +Pisum +pit +pita +Pitahauerat +Pitahauirata +pitahaya +pitanga +pitangua +pitapat +pitapatation +pitarah +pitau +pitaya +pitayita +Pitcairnia +pitch +pitchable +pitchblende +pitcher +pitchered +pitcherful +pitcherlike +pitcherman +pitchfork +pitchhole +pitchi +pitchiness +pitching +pitchlike +pitchman +pitchometer +pitchout +pitchpike +pitchpole +pitchpoll +pitchstone +pitchwork +pitchy +piteous +piteously +piteousness +pitfall +pith +pithecan +pithecanthrope +pithecanthropic +pithecanthropid +Pithecanthropidae +pithecanthropoid +Pithecanthropus +Pithecia +pithecian +Pitheciinae +pitheciine +pithecism +pithecoid +Pithecolobium +pithecological +pithecometric +pithecomorphic +pithecomorphism +pithful +pithily +pithiness +pithless +pithlessly +Pithoegia +Pithoigia +pithole +pithos +pithsome +pithwork +pithy +pitiability +pitiable +pitiableness +pitiably +pitiedly +pitiedness +pitier +pitiful +pitifully +pitifulness +pitikins +pitiless +pitilessly +pitilessness +pitless +pitlike +pitmaker +pitmaking +pitman +pitmark +pitmirk +pitometer +pitpan +pitpit +pitside +Pitta +pittacal +pittance +pittancer +pitted +pitter +pitticite +Pittidae +pittine +pitting +Pittism +Pittite +pittite +pittoid +Pittosporaceae +pittosporaceous +pittospore +Pittosporum +Pittsburgher +pituital +pituitary +pituite +pituitous +pituitousness +Pituitrin +pituri +pitwood +pitwork +pitwright +pity +pitying +pityingly +Pitylus +pityocampa +pityproof +pityriasic +pityriasis +Pityrogramma +pityroid +piuri +piuricapsular +pivalic +pivot +pivotal +pivotally +pivoter +pix +pixie +pixilated +pixilation +pixy +pize +pizza +pizzeria +pizzicato +pizzle +placability +placable +placableness +placably +Placaean +placard +placardeer +placarder +placate +placater +placation +placative +placatively +placatory +placcate +place +placeable +Placean +placebo +placeful +placeless +placelessly +placemaker +placemaking +placeman +placemanship +placement +placemonger +placemongering +placenta +placental +Placentalia +placentalian +placentary +placentate +placentation +placentiferous +placentiform +placentigerous +placentitis +placentoid +placentoma +placer +placet +placewoman +placid +placidity +placidly +placidness +placitum +plack +placket +plackless +placochromatic +placode +placoderm +placodermal +placodermatous +Placodermi +placodermoid +placodont +Placodontia +Placodus +placoganoid +placoganoidean +Placoganoidei +placoid +placoidal +placoidean +Placoidei +Placoides +Placophora +placophoran +placoplast +placula +placuntitis +placuntoma +Placus +pladaroma +pladarosis +plaga +plagal +plagate +plage +Plagianthus +plagiaplite +plagiarical +plagiarism +plagiarist +plagiaristic +plagiaristically +plagiarization +plagiarize +plagiarizer +plagiary +plagihedral +plagiocephalic +plagiocephalism +plagiocephaly +Plagiochila +plagioclase +plagioclasite +plagioclastic +plagioclinal +plagiodont +plagiograph +plagioliparite +plagionite +plagiopatagium +plagiophyre +Plagiostomata +plagiostomatous +plagiostome +Plagiostomi +plagiostomous +plagiotropic +plagiotropically +plagiotropism +plagiotropous +plagium +plagose +plagosity +plague +plagued +plagueful +plagueless +plagueproof +plaguer +plaguesome +plaguesomeness +plaguily +plaguy +plaice +plaid +plaided +plaidie +plaiding +plaidman +plaidy +plain +plainback +plainbacks +plainer +plainful +plainhearted +plainish +plainly +plainness +plainscraft +plainsfolk +plainsman +plainsoled +plainstones +plainswoman +plaint +plaintail +plaintiff +plaintiffship +plaintile +plaintive +plaintively +plaintiveness +plaintless +plainward +plaister +plait +plaited +plaiter +plaiting +plaitless +plaitwork +plak +plakat +plan +planable +planaea +planar +Planaria +planarian +Planarida +planaridan +planariform +planarioid +planarity +planate +planation +planch +plancheite +plancher +planchet +planchette +planching +planchment +plancier +Planckian +plandok +plane +planeness +planer +Planera +planet +planeta +planetable +planetabler +planetal +planetaria +planetarian +planetarily +planetarium +planetary +planeted +planetesimal +planeticose +planeting +planetist +planetkin +planetless +planetlike +planetogeny +planetography +planetoid +planetoidal +planetologic +planetologist +planetology +planetule +planform +planful +planfully +planfulness +plang +plangency +plangent +plangently +plangor +plangorous +planicaudate +planicipital +planidorsate +planifolious +planiform +planigraph +planilla +planimetric +planimetrical +planimetry +planineter +planipennate +Planipennia +planipennine +planipetalous +planiphyllous +planirostral +planirostrate +planiscope +planiscopic +planish +planisher +planispheral +planisphere +planispheric +planispherical +planispiral +planity +plank +plankage +plankbuilt +planker +planking +plankless +planklike +planksheer +plankter +planktologist +planktology +plankton +planktonic +planktont +plankways +plankwise +planky +planless +planlessly +planlessness +planner +planoblast +planoblastic +Planococcus +planoconical +planocylindric +planoferrite +planogamete +planograph +planographic +planographist +planography +planohorizontal +planolindrical +planometer +planometry +planomiller +planoorbicular +Planorbidae +planorbiform +planorbine +Planorbis +planorboid +planorotund +Planosarcina +planosol +planosome +planospiral +planospore +planosubulate +plant +planta +plantable +plantad +Plantae +plantage +Plantaginaceae +plantaginaceous +Plantaginales +plantagineous +Plantago +plantain +plantal +plantar +plantaris +plantarium +plantation +plantationlike +plantdom +planter +planterdom +planterly +plantership +Plantigrada +plantigrade +plantigrady +planting +plantivorous +plantless +plantlet +plantlike +plantling +plantocracy +plantsman +plantula +plantular +plantule +planula +planulan +planular +planulate +planuliform +planuloid +Planuloidea +planuria +planury +planxty +plap +plappert +plaque +plaquette +plash +plasher +plashet +plashingly +plashment +plashy +plasm +plasma +plasmagene +plasmapheresis +plasmase +plasmatic +plasmatical +plasmation +plasmatoparous +plasmatorrhexis +plasmic +plasmocyte +plasmocytoma +plasmode +plasmodesm +plasmodesma +plasmodesmal +plasmodesmic +plasmodesmus +plasmodia +plasmodial +plasmodiate +plasmodic +plasmodiocarp +plasmodiocarpous +Plasmodiophora +Plasmodiophoraceae +Plasmodiophorales +plasmodium +plasmogen +plasmolysis +plasmolytic +plasmolytically +plasmolyzability +plasmolyzable +plasmolyze +plasmoma +Plasmon +Plasmopara +plasmophagous +plasmophagy +plasmoptysis +plasmosoma +plasmosome +plasmotomy +plasome +plass +plasson +plastein +plaster +plasterbill +plasterboard +plasterer +plasteriness +plastering +plasterlike +plasterwise +plasterwork +plastery +plastic +plastically +plasticimeter +Plasticine +plasticine +plasticism +plasticity +plasticization +plasticize +plasticizer +plasticly +plastics +plastid +plastidium +plastidome +Plastidozoa +plastidular +plastidule +plastify +plastin +plastinoid +plastisol +plastochondria +plastochron +plastochrone +plastodynamia +plastodynamic +plastogamic +plastogamy +plastogene +plastomere +plastometer +plastosome +plastotype +plastral +plastron +plastrum +plat +Plataean +Platalea +Plataleidae +plataleiform +Plataleinae +plataleine +platan +Platanaceae +platanaceous +platane +platanist +Platanista +Platanistidae +platano +Platanus +platband +platch +plate +platea +plateasm +plateau +plateaux +plated +plateful +plateholder +plateiasmus +platelayer +plateless +platelet +platelike +platemaker +platemaking +plateman +platen +plater +platerer +plateresque +platery +plateway +platework +plateworker +platform +platformally +platformed +platformer +platformish +platformism +platformist +platformistic +platformless +platformy +platic +platicly +platilla +platina +platinamine +platinammine +platinate +Platine +plating +platinic +platinichloric +platinichloride +platiniferous +platiniridium +platinite +platinization +platinize +platinochloric +platinochloride +platinocyanic +platinocyanide +platinoid +platinotype +platinous +platinum +platinumsmith +platitude +platitudinal +platitudinarian +platitudinarianism +platitudinism +platitudinist +platitudinization +platitudinize +platitudinizer +platitudinous +platitudinously +platitudinousness +Platoda +platode +Platodes +platoid +Platonesque +platonesque +Platonian +Platonic +Platonical +Platonically +Platonicalness +Platonician +Platonicism +Platonism +Platonist +Platonistic +Platonization +Platonize +Platonizer +platoon +platopic +platosamine +platosammine +Platt +Plattdeutsch +platted +platten +platter +platterface +platterful +platting +plattnerite +platty +platurous +platy +platybasic +platybrachycephalic +platybrachycephalous +platybregmatic +platycarpous +Platycarpus +Platycarya +platycelian +platycelous +platycephalic +Platycephalidae +platycephalism +platycephaloid +platycephalous +Platycephalus +platycephaly +Platycercinae +platycercine +Platycercus +Platycerium +platycheiria +platycnemia +platycnemic +Platycodon +platycoria +platycrania +platycranial +Platyctenea +platycyrtean +platydactyl +platydactyle +platydactylous +platydolichocephalic +platydolichocephalous +platyfish +platyglossal +platyglossate +platyglossia +Platyhelmia +platyhelminth +Platyhelminthes +platyhelminthic +platyhieric +platykurtic +platylobate +platymeria +platymeric +platymery +platymesaticephalic +platymesocephalic +platymeter +platymyoid +platynite +platynotal +platyodont +platyope +platyopia +platyopic +platypellic +platypetalous +platyphyllous +platypod +Platypoda +platypodia +platypodous +Platyptera +platypus +platypygous +Platyrhina +Platyrhini +platyrhynchous +platyrrhin +Platyrrhina +platyrrhine +Platyrrhini +platyrrhinian +platyrrhinic +platyrrhinism +platyrrhiny +platysma +platysmamyoides +platysomid +Platysomidae +Platysomus +platystaphyline +Platystemon +platystencephalia +platystencephalic +platystencephalism +platystencephaly +platysternal +Platysternidae +Platystomidae +platystomous +platytrope +platytropy +plaud +plaudation +plaudit +plaudite +plauditor +plauditory +plauenite +plausibility +plausible +plausibleness +plausibly +plausive +plaustral +Plautine +Plautus +play +playa +playability +playable +playback +playbill +playbook +playbox +playboy +playboyism +playbroker +playcraft +playcraftsman +playday +playdown +player +playerdom +playeress +playfellow +playfellowship +playfield +playfolk +playful +playfully +playfulness +playgoer +playgoing +playground +playhouse +playingly +playless +playlet +playlike +playmaker +playmaking +playman +playmare +playmate +playmonger +playmongering +playock +playpen +playreader +playroom +playscript +playsome +playsomely +playsomeness +playstead +plaything +playtime +playward +playwoman +playwork +playwright +playwrightess +playwrighting +playwrightry +playwriter +playwriting +plaza +plazolite +plea +pleach +pleached +pleacher +plead +pleadable +pleadableness +pleader +pleading +pleadingly +pleadingness +pleaproof +pleasable +pleasableness +pleasance +pleasant +pleasantable +pleasantish +pleasantly +pleasantness +pleasantry +pleasantsome +please +pleasedly +pleasedness +pleaseman +pleaser +pleaship +pleasing +pleasingly +pleasingness +pleasurability +pleasurable +pleasurableness +pleasurably +pleasure +pleasureful +pleasurehood +pleasureless +pleasurelessly +pleasureman +pleasurement +pleasuremonger +pleasureproof +pleasurer +pleasuring +pleasurist +pleasurous +pleat +pleater +pleatless +pleb +plebe +plebeian +plebeiance +plebeianize +plebeianly +plebeianness +plebeity +plebianism +plebicolar +plebicolist +plebificate +plebification +plebify +plebiscitarian +plebiscitarism +plebiscitary +plebiscite +plebiscitic +plebiscitum +plebs +pleck +Plecoptera +plecopteran +plecopterid +plecopterous +Plecotinae +plecotine +Plecotus +plectognath +Plectognathi +plectognathic +plectognathous +plectopter +plectopteran +plectopterous +plectospondyl +Plectospondyli +plectospondylous +plectre +plectridial +plectridium +plectron +plectrum +pled +pledge +pledgeable +pledgee +pledgeless +pledgeor +pledger +pledgeshop +pledget +pledgor +Plegadis +plegaphonia +plegometer +Pleiades +pleiobar +pleiochromia +pleiochromic +pleiomastia +pleiomazia +pleiomerous +pleiomery +pleion +Pleione +pleionian +pleiophyllous +pleiophylly +pleiotaxis +pleiotropic +pleiotropically +pleiotropism +Pleistocene +Pleistocenic +pleistoseist +plemochoe +plemyrameter +plenarily +plenariness +plenarium +plenarty +plenary +plenicorn +pleniloquence +plenilunal +plenilunar +plenilunary +plenilune +plenipo +plenipotence +plenipotent +plenipotential +plenipotentiality +plenipotentiarily +plenipotentiarize +Plenipotentiary +plenipotentiary +plenipotentiaryship +plenish +plenishing +plenishment +plenism +plenist +plenitide +plenitude +plenitudinous +plenshing +plenteous +plenteously +plenteousness +plentiful +plentifully +plentifulness +plentify +plenty +plenum +pleny +pleochroic +pleochroism +pleochroitic +pleochromatic +pleochromatism +pleochroous +pleocrystalline +pleodont +pleomastia +pleomastic +pleomazia +pleometrosis +pleometrotic +pleomorph +pleomorphic +pleomorphism +pleomorphist +pleomorphous +pleomorphy +pleon +pleonal +pleonasm +pleonast +pleonaste +pleonastic +pleonastical +pleonastically +pleonectic +pleonexia +pleonic +pleophyletic +pleopod +pleopodite +Pleospora +Pleosporaceae +plerergate +plerocercoid +pleroma +pleromatic +plerome +pleromorph +plerophoric +plerophory +plerosis +plerotic +Plesianthropus +plesiobiosis +plesiobiotic +plesiomorphic +plesiomorphism +plesiomorphous +plesiosaur +Plesiosauri +Plesiosauria +plesiosaurian +plesiosauroid +Plesiosaurus +plesiotype +plessigraph +plessimeter +plessimetric +plessimetry +plessor +Plethodon +plethodontid +Plethodontidae +plethora +plethoretic +plethoretical +plethoric +plethorical +plethorically +plethorous +plethory +plethysmograph +plethysmographic +plethysmographically +plethysmography +pleura +Pleuracanthea +Pleuracanthidae +Pleuracanthini +pleuracanthoid +Pleuracanthus +pleural +pleuralgia +pleuralgic +pleurapophysial +pleurapophysis +pleurectomy +pleurenchyma +pleurenchymatous +pleuric +pleuriseptate +pleurisy +pleurite +pleuritic +pleuritical +pleuritically +pleuritis +Pleurobrachia +Pleurobrachiidae +pleurobranch +pleurobranchia +pleurobranchial +pleurobranchiate +pleurobronchitis +Pleurocapsa +Pleurocapsaceae +pleurocapsaceous +pleurocarp +Pleurocarpi +pleurocarpous +pleurocele +pleurocentesis +pleurocentral +pleurocentrum +Pleurocera +pleurocerebral +Pleuroceridae +pleuroceroid +Pleurococcaceae +pleurococcaceous +Pleurococcus +Pleurodelidae +Pleurodira +pleurodiran +pleurodire +pleurodirous +pleurodiscous +pleurodont +pleurodynia +pleurodynic +pleurogenic +pleurogenous +pleurohepatitis +pleuroid +pleurolith +pleurolysis +pleuron +Pleuronectes +pleuronectid +Pleuronectidae +pleuronectoid +Pleuronema +pleuropedal +pleuropericardial +pleuropericarditis +pleuroperitonaeal +pleuroperitoneal +pleuroperitoneum +pleuropneumonia +pleuropneumonic +pleuropodium +pleuropterygian +Pleuropterygii +pleuropulmonary +pleurorrhea +Pleurosaurus +Pleurosigma +pleurospasm +pleurosteal +Pleurosteon +pleurostict +Pleurosticti +Pleurostigma +pleurothotonic +pleurothotonus +Pleurotoma +Pleurotomaria +Pleurotomariidae +pleurotomarioid +Pleurotomidae +pleurotomine +pleurotomoid +pleurotomy +pleurotonic +pleurotonus +Pleurotremata +pleurotribal +pleurotribe +pleurotropous +Pleurotus +pleurotyphoid +pleurovisceral +pleurum +pleuston +pleustonic +plew +plex +plexal +plexicose +plexiform +pleximeter +pleximetric +pleximetry +plexodont +plexometer +plexor +plexure +plexus +pliability +pliable +pliableness +pliably +pliancy +pliant +pliantly +pliantness +plica +plicable +plical +plicate +plicated +plicately +plicateness +plicater +plicatile +plication +plicative +plicatocontorted +plicatocristate +plicatolacunose +plicatolobate +plicatopapillose +plicator +plicatoundulate +plicatulate +plicature +pliciferous +pliciform +plier +pliers +plight +plighted +plighter +plim +plimsoll +Plinian +plinth +plinther +plinthiform +plinthless +plinthlike +Pliny +Plinyism +Pliocene +Pliohippus +Pliopithecus +pliosaur +pliosaurian +Pliosauridae +Pliosaurus +pliothermic +Pliotron +pliskie +plisky +ploat +ploce +Ploceidae +ploceiform +Ploceinae +Ploceus +plock +plod +plodder +plodderly +plodding +ploddingly +ploddingness +plodge +Ploima +ploimate +plomb +plook +plop +ploration +ploratory +plosion +plosive +plot +plote +plotful +Plotinian +Plotinic +Plotinical +Plotinism +Plotinist +Plotinize +plotless +plotlessness +plotproof +plottage +plotted +plotter +plottery +plotting +plottingly +plotty +plough +ploughmanship +ploughtail +plouk +plouked +plouky +plounce +plousiocracy +plout +Plouteneion +plouter +plover +ploverlike +plovery +plow +plowable +plowbote +plowboy +plower +plowfish +plowfoot +plowgang +plowgate +plowgraith +plowhead +plowing +plowjogger +plowland +plowlight +plowline +plowmaker +plowman +plowmanship +plowmell +plowpoint +Plowrightia +plowshare +plowshoe +plowstaff +plowstilt +plowtail +plowwise +plowwoman +plowwright +ploy +ployment +Pluchea +pluck +pluckage +plucked +pluckedness +plucker +Pluckerian +pluckily +pluckiness +pluckless +plucklessness +plucky +plud +pluff +pluffer +pluffy +plug +plugboard +plugdrawer +pluggable +plugged +plugger +plugging +pluggingly +pluggy +plughole +plugless +pluglike +plugman +plugtray +plugtree +plum +pluma +plumaceous +plumach +plumade +plumage +plumaged +plumagery +plumasite +plumate +Plumatella +plumatellid +Plumatellidae +plumatelloid +plumb +plumbable +plumbage +Plumbaginaceae +plumbaginaceous +plumbagine +plumbaginous +plumbago +plumbate +plumbean +plumbeous +plumber +plumbership +plumbery +plumbet +plumbic +plumbiferous +plumbing +plumbism +plumbisolvent +plumbite +plumbless +plumbness +plumbog +plumbojarosite +plumboniobate +plumbosolvency +plumbosolvent +plumbous +plumbum +plumcot +plumdamas +plumdamis +plume +plumed +plumeless +plumelet +plumelike +plumemaker +plumemaking +plumeopicean +plumeous +plumer +plumery +plumet +plumette +plumicorn +plumier +Plumiera +plumieride +plumification +plumiform +plumiformly +plumify +plumigerous +pluminess +plumiped +plumipede +plumist +plumless +plumlet +plumlike +plummer +plummet +plummeted +plummetless +plummy +plumose +plumosely +plumoseness +plumosity +plumous +plump +plumpen +plumper +plumping +plumpish +plumply +plumpness +plumps +plumpy +plumula +plumulaceous +plumular +Plumularia +plumularian +Plumulariidae +plumulate +plumule +plumuliform +plumulose +plumy +plunder +plunderable +plunderage +plunderbund +plunderer +plunderess +plundering +plunderingly +plunderless +plunderous +plunderproof +plunge +plunger +plunging +plungingly +plunk +plunther +plup +plupatriotic +pluperfect +pluperfectly +pluperfectness +plural +pluralism +pluralist +pluralistic +pluralistically +plurality +pluralization +pluralize +pluralizer +plurally +plurative +plurennial +pluriaxial +pluricarinate +pluricarpellary +pluricellular +pluricentral +pluricipital +pluricuspid +pluricuspidate +pluridentate +pluries +plurifacial +plurifetation +plurification +pluriflagellate +pluriflorous +plurifoliate +plurifoliolate +plurify +pluriglandular +pluriguttulate +plurilateral +plurilingual +plurilingualism +plurilingualist +plurilocular +plurimammate +plurinominal +plurinucleate +pluripara +pluriparity +pluriparous +pluripartite +pluripetalous +pluripotence +pluripotent +pluripresence +pluriseptate +pluriserial +pluriseriate +pluriseriated +plurisetose +plurispiral +plurisporous +plurisyllabic +plurisyllable +plurivalent +plurivalve +plurivorous +plurivory +plus +plush +plushed +plushette +plushily +plushiness +plushlike +plushy +Plusia +Plusiinae +plusquamperfect +plussage +Plutarchian +Plutarchic +Plutarchical +Plutarchically +plutarchy +pluteal +plutean +pluteiform +Plutella +pluteus +Pluto +plutocracy +plutocrat +plutocratic +plutocratical +plutocratically +plutolatry +plutological +plutologist +plutology +plutomania +Plutonian +plutonian +plutonic +Plutonion +plutonism +plutonist +plutonite +Plutonium +plutonium +plutonometamorphism +plutonomic +plutonomist +plutonomy +pluvial +pluvialiform +pluvialine +Pluvialis +pluvian +pluvine +pluviograph +pluviographic +pluviographical +pluviography +pluviometer +pluviometric +pluviometrical +pluviometrically +pluviometry +pluvioscope +pluviose +pluviosity +pluvious +ply +plyer +plying +plyingly +Plymouth +Plymouthism +Plymouthist +Plymouthite +Plynlymmon +plywood +pneodynamics +pneograph +pneomanometer +pneometer +pneometry +pneophore +pneoscope +pneuma +pneumarthrosis +pneumathaemia +pneumatic +pneumatical +pneumatically +pneumaticity +pneumatics +pneumatism +pneumatist +pneumatize +pneumatized +pneumatocardia +pneumatocele +pneumatochemical +pneumatochemistry +pneumatocyst +pneumatocystic +pneumatode +pneumatogenic +pneumatogenous +pneumatogram +pneumatograph +pneumatographer +pneumatographic +pneumatography +pneumatolitic +pneumatologic +pneumatological +pneumatologist +pneumatology +pneumatolysis +pneumatolytic +Pneumatomachian +Pneumatomachist +Pneumatomachy +pneumatometer +pneumatometry +pneumatomorphic +pneumatonomy +pneumatophany +pneumatophilosophy +pneumatophobia +pneumatophonic +pneumatophony +pneumatophore +pneumatophorous +pneumatorrhachis +pneumatoscope +pneumatosic +pneumatosis +pneumatotactic +pneumatotherapeutics +pneumatotherapy +Pneumatria +pneumaturia +pneumectomy +pneumobacillus +Pneumobranchia +Pneumobranchiata +pneumocele +pneumocentesis +pneumochirurgia +pneumococcal +pneumococcemia +pneumococcic +pneumococcous +pneumococcus +pneumoconiosis +pneumoderma +pneumodynamic +pneumodynamics +pneumoencephalitis +pneumoenteritis +pneumogastric +pneumogram +pneumograph +pneumographic +pneumography +pneumohemothorax +pneumohydropericardium +pneumohydrothorax +pneumolith +pneumolithiasis +pneumological +pneumology +pneumolysis +pneumomalacia +pneumomassage +Pneumometer +pneumomycosis +pneumonalgia +pneumonectasia +pneumonectomy +pneumonedema +pneumonia +pneumonic +pneumonitic +pneumonitis +pneumonocace +pneumonocarcinoma +pneumonocele +pneumonocentesis +pneumonocirrhosis +pneumonoconiosis +pneumonodynia +pneumonoenteritis +pneumonoerysipelas +pneumonographic +pneumonography +pneumonokoniosis +pneumonolith +pneumonolithiasis +pneumonolysis +pneumonomelanosis +pneumonometer +pneumonomycosis +pneumonoparesis +pneumonopathy +pneumonopexy +pneumonophorous +pneumonophthisis +pneumonopleuritis +pneumonorrhagia +pneumonorrhaphy +pneumonosis +pneumonotherapy +pneumonotomy +pneumony +pneumopericardium +pneumoperitoneum +pneumoperitonitis +pneumopexy +pneumopleuritis +pneumopyothorax +pneumorrachis +pneumorrhachis +pneumorrhagia +pneumotactic +pneumotherapeutics +pneumotherapy +pneumothorax +pneumotomy +pneumotoxin +pneumotropic +pneumotropism +pneumotyphoid +pneumotyphus +pneumoventriculography +po +Poa +Poaceae +poaceous +poach +poachable +poacher +poachiness +poachy +Poales +poalike +pob +pobby +Poblacht +poblacion +pobs +pochade +pochard +pochay +poche +pochette +pocilliform +pock +pocket +pocketable +pocketableness +pocketbook +pocketed +pocketer +pocketful +pocketing +pocketknife +pocketless +pocketlike +pockety +pockhouse +pockily +pockiness +pockmanteau +pockmantie +pockmark +pockweed +pockwood +pocky +poco +pococurante +pococuranteism +pococurantic +pococurantish +pococurantism +pococurantist +pocosin +poculary +poculation +poculent +poculiform +pod +podagra +podagral +podagric +podagrical +podagrous +podal +podalgia +podalic +Podaliriidae +Podalirius +Podarge +Podargidae +Podarginae +podargine +podargue +Podargus +podarthral +podarthritis +podarthrum +podatus +Podaxonia +podaxonial +podded +podder +poddidge +poddish +poddle +poddy +podelcoma +podeon +podesta +podesterate +podetiiform +podetium +podex +podge +podger +podgily +podginess +podgy +podial +podiatrist +podiatry +podical +Podiceps +podices +Podicipedidae +podilegous +podite +poditic +poditti +podium +podler +podley +podlike +podobranch +podobranchia +podobranchial +podobranchiate +podocarp +Podocarpaceae +Podocarpineae +podocarpous +Podocarpus +podocephalous +pododerm +pododynia +podogyn +podogyne +podogynium +Podolian +podolite +podology +podomancy +podomere +podometer +podometry +Podophrya +Podophryidae +Podophthalma +Podophthalmata +podophthalmate +podophthalmatous +Podophthalmia +podophthalmian +podophthalmic +podophthalmite +podophthalmitic +podophthalmous +Podophyllaceae +podophyllic +podophyllin +podophyllotoxin +podophyllous +Podophyllum +podophyllum +podoscaph +podoscapher +podoscopy +Podosomata +podosomatous +podosperm +Podosphaera +Podostemaceae +podostemaceous +podostemad +Podostemon +Podostemonaceae +podostemonaceous +Podostomata +podostomatous +podotheca +podothecal +Podozamites +Podsnap +Podsnappery +podsol +podsolic +podsolization +podsolize +Podunk +Podura +poduran +podurid +Poduridae +podware +podzol +podzolic +podzolization +podzolize +poe +Poecile +Poeciliidae +poecilitic +Poecilocyttares +poecilocyttarous +poecilogonous +poecilogony +poecilomere +poecilonym +poecilonymic +poecilonymy +poecilopod +Poecilopoda +poecilopodous +poem +poematic +poemet +poemlet +Poephaga +poephagous +Poephagus +poesie +poesiless +poesis +poesy +poet +poetaster +poetastering +poetasterism +poetastery +poetastress +poetastric +poetastrical +poetastry +poetcraft +poetdom +poetesque +poetess +poethood +poetic +poetical +poeticality +poetically +poeticalness +poeticism +poeticize +poeticness +poetics +poeticule +poetito +poetization +poetize +poetizer +poetless +poetlike +poetling +poetly +poetomachia +poetress +poetry +poetryless +poetship +poetwise +pogamoggan +pogge +poggy +Pogo +Pogonatum +Pogonia +pogoniasis +pogoniate +pogonion +pogonip +pogoniris +pogonite +pogonological +pogonologist +pogonology +pogonotomy +pogonotrophy +pogrom +pogromist +pogromize +pogy +poh +poha +pohickory +pohna +pohutukawa +poi +Poiana +Poictesme +poietic +poignance +poignancy +poignant +poignantly +poignet +poikilitic +poikiloblast +poikiloblastic +poikilocyte +poikilocythemia +poikilocytosis +poikilotherm +poikilothermic +poikilothermism +poil +poilu +poimenic +poimenics +Poinciana +poind +poindable +poinder +poinding +Poinsettia +point +pointable +pointage +pointed +pointedly +pointedness +pointel +pointer +pointful +pointfully +pointfulness +pointillism +pointillist +pointing +pointingly +pointless +pointlessly +pointlessness +pointlet +pointleted +pointmaker +pointman +pointment +pointrel +pointsman +pointswoman +pointways +pointwise +pointy +poisable +poise +poised +poiser +poison +poisonable +poisonful +poisonfully +poisoning +poisonless +poisonlessness +poisonmaker +poisonous +poisonously +poisonousness +poisonproof +poisonweed +poisonwood +poitrail +poitrel +poivrade +pokable +Pokan +Pokanoket +poke +pokeberry +poked +pokeful +pokeloken +pokeout +poker +pokerish +pokerishly +pokerishness +pokeroot +pokeweed +pokey +pokily +pokiness +poking +Pokom +Pokomam +Pokomo +pokomoo +Pokonchi +pokunt +poky +pol +Polab +Polabian +Polabish +polacca +Polack +polack +polacre +Polander +Polanisia +polar +polaric +Polarid +polarigraphic +polarimeter +polarimetric +polarimetry +Polaris +polariscope +polariscopic +polariscopically +polariscopist +polariscopy +polaristic +polaristrobometer +polarity +polarizability +polarizable +polarization +polarize +polarizer +polarly +polarogram +polarograph +polarographic +polarographically +polarography +Polaroid +polarward +polaxis +poldavis +poldavy +polder +polderboy +polderman +Pole +pole +polearm +poleax +poleaxe +poleaxer +poleburn +polecat +polehead +poleless +poleman +polemarch +polemic +polemical +polemically +polemician +polemicist +polemics +polemist +polemize +Polemoniaceae +polemoniaceous +Polemoniales +Polemonium +polemoscope +polenta +poler +polesetter +Polesian +polesman +polestar +poleward +polewards +poley +poliad +poliadic +Polian +polianite +Polianthes +police +policed +policedom +policeless +policeman +policemanish +policemanism +policemanlike +policemanship +policewoman +Polichinelle +policial +policize +policizer +policlinic +policy +policyholder +poliencephalitis +poliencephalomyelitis +poligar +poligarship +poligraphical +Polinices +polio +polioencephalitis +polioencephalomyelitis +poliomyelitis +poliomyelopathy +polioneuromere +poliorcetic +poliorcetics +poliosis +polis +Polish +polish +polishable +polished +polishedly +polishedness +polisher +polishment +polisman +polissoir +Polistes +politarch +politarchic +Politbureau +Politburo +polite +politeful +politely +politeness +politesse +politic +political +politicalism +politicalize +politically +politicaster +politician +politicious +politicist +politicize +politicizer +politicly +politico +politicomania +politicophobia +politics +politied +Politique +politist +politize +polity +politzerization +politzerize +polk +polka +Poll +poll +pollable +pollack +polladz +pollage +pollakiuria +pollam +pollan +pollarchy +pollard +pollbook +polled +pollen +pollened +polleniferous +pollenigerous +pollenite +pollenivorous +pollenless +pollenlike +pollenproof +pollent +poller +polleten +pollex +pollical +pollicar +pollicate +pollicitation +pollinar +pollinarium +pollinate +pollination +pollinator +pollinctor +pollincture +polling +pollinia +pollinic +pollinical +polliniferous +pollinigerous +pollinium +pollinivorous +pollinization +pollinize +pollinizer +pollinodial +pollinodium +pollinoid +pollinose +pollinosis +polliwig +polliwog +pollock +polloi +pollster +pollucite +pollutant +pollute +polluted +pollutedly +pollutedness +polluter +polluting +pollutingly +pollution +Pollux +pollux +Polly +Pollyanna +Pollyannish +pollywog +polo +poloconic +polocyte +poloist +polonaise +Polonese +Polonia +Polonial +Polonian +Polonism +polonium +Polonius +Polonization +Polonize +polony +polos +polska +polt +poltergeist +poltfoot +poltfooted +poltina +poltinnik +poltophagic +poltophagist +poltophagy +poltroon +poltroonery +poltroonish +poltroonishly +poltroonism +poluphloisboic +poluphloisboiotatotic +poluphloisboiotic +polverine +poly +polyacanthus +polyacid +polyacoustic +polyacoustics +polyact +polyactinal +polyactine +Polyactinia +polyad +polyadelph +Polyadelphia +polyadelphian +polyadelphous +polyadenia +polyadenitis +polyadenoma +polyadenous +polyadic +polyaffectioned +polyalcohol +polyamide +polyamylose +Polyandria +polyandria +polyandrian +polyandrianism +polyandric +polyandrious +polyandrism +polyandrist +polyandrium +polyandrous +polyandry +Polyangium +polyangular +polyantha +polyanthous +polyanthus +polyanthy +polyarch +polyarchal +polyarchical +polyarchist +polyarchy +polyarteritis +polyarthric +polyarthritic +polyarthritis +polyarthrous +polyarticular +polyatomic +polyatomicity +polyautographic +polyautography +polyaxial +polyaxon +polyaxone +polyaxonic +polybasic +polybasicity +polybasite +polyblast +Polyborinae +polyborine +Polyborus +polybranch +Polybranchia +polybranchian +Polybranchiata +polybranchiate +polybromid +polybromide +polybunous +polybuny +polybuttoned +polycarboxylic +Polycarp +polycarpellary +polycarpic +Polycarpon +polycarpous +polycarpy +polycellular +polycentral +polycentric +polycephalic +polycephalous +polycephaly +Polychaeta +polychaete +polychaetous +polychasial +polychasium +polychloride +polychoerany +polychord +polychotomous +polychotomy +polychrest +polychrestic +polychrestical +polychresty +polychroic +polychroism +polychromasia +polychromate +polychromatic +polychromatism +polychromatist +polychromatize +polychromatophil +polychromatophile +polychromatophilia +polychromatophilic +polychrome +polychromia +polychromic +polychromism +polychromize +polychromous +polychromy +polychronious +polyciliate +polycitral +polyclad +Polycladida +polycladine +polycladose +polycladous +polyclady +Polycletan +polyclinic +polyclona +polycoccous +Polycodium +polyconic +polycormic +polycotyl +polycotyledon +polycotyledonary +polycotyledonous +polycotyledony +polycotylous +polycotyly +polycracy +polycrase +polycratic +polycrotic +polycrotism +polycrystalline +polyctenid +Polyctenidae +polycttarian +polycyanide +polycyclic +polycycly +polycyesis +polycystic +polycythemia +polycythemic +Polycyttaria +polydactyl +polydactyle +polydactylism +polydactylous +Polydactylus +polydactyly +polydaemoniac +polydaemonism +polydaemonist +polydaemonistic +polydemic +polydenominational +polydental +polydermous +polydermy +polydigital +polydimensional +polydipsia +polydisperse +polydomous +polydymite +polydynamic +polyeidic +polyeidism +polyembryonate +polyembryonic +polyembryony +polyemia +polyemic +polyenzymatic +polyergic +Polyergus +polyester +polyesthesia +polyesthetic +polyethnic +polyethylene +polyfenestral +polyflorous +polyfoil +polyfold +Polygala +Polygalaceae +polygalaceous +polygalic +polygam +Polygamia +polygamian +polygamic +polygamical +polygamically +polygamist +polygamistic +polygamize +polygamodioecious +polygamous +polygamously +polygamy +polyganglionic +polygastric +polygene +polygenesic +polygenesis +polygenesist +polygenetic +polygenetically +polygenic +polygenism +polygenist +polygenistic +polygenous +polygeny +polyglandular +polyglobulia +polyglobulism +polyglossary +polyglot +polyglotry +polyglottal +polyglottally +polyglotted +polyglotter +polyglottery +polyglottic +polyglottically +polyglottism +polyglottist +polyglottonic +polyglottous +polyglotwise +polyglycerol +polygon +Polygonaceae +polygonaceous +polygonal +Polygonales +polygonally +Polygonatum +Polygonella +polygoneutic +polygoneutism +Polygonia +polygonic +polygonically +polygonoid +polygonous +Polygonum +polygony +Polygordius +polygram +polygrammatic +polygraph +polygrapher +polygraphic +polygraphy +polygroove +polygrooved +polygyn +polygynaiky +Polygynia +polygynian +polygynic +polygynious +polygynist +polygynoecial +polygynous +polygyny +polygyral +polygyria +polyhaemia +polyhaemic +polyhalide +polyhalite +polyhalogen +polyharmonic +polyharmony +polyhedral +polyhedric +polyhedrical +polyhedroid +polyhedron +polyhedrosis +polyhedrous +polyhemia +polyhidrosis +polyhistor +polyhistorian +polyhistoric +polyhistory +polyhybrid +polyhydric +polyhydroxy +polyideic +polyideism +polyidrosis +polyiodide +polykaryocyte +polylaminated +polylemma +polylepidous +polylinguist +polylith +polylithic +polylobular +polylogy +polyloquent +polymagnet +polymastia +polymastic +Polymastiga +polymastigate +Polymastigida +Polymastigina +polymastigous +polymastism +Polymastodon +polymastodont +polymasty +polymath +polymathic +polymathist +polymathy +polymazia +polymelia +polymelian +polymely +polymer +polymere +polymeria +polymeric +polymeride +polymerism +polymerization +polymerize +polymerous +polymetallism +polymetameric +polymeter +polymethylene +polymetochia +polymetochic +polymicrian +polymicrobial +polymicrobic +polymicroscope +polymignite +Polymixia +polymixiid +Polymixiidae +Polymnestor +Polymnia +polymnite +polymolecular +polymolybdate +polymorph +Polymorpha +polymorphean +polymorphic +polymorphism +polymorphistic +polymorphonuclear +polymorphonucleate +polymorphosis +polymorphous +polymorphy +Polymyaria +polymyarian +Polymyarii +Polymyodi +polymyodian +polymyodous +polymyoid +polymyositis +polymythic +polymythy +polynaphthene +polynemid +Polynemidae +polynemoid +Polynemus +Polynesian +polynesic +polyneural +polyneuric +polyneuritic +polyneuritis +polyneuropathy +polynodal +Polynoe +polynoid +Polynoidae +polynome +polynomial +polynomialism +polynomialist +polynomic +polynucleal +polynuclear +polynucleate +polynucleated +polynucleolar +polynucleosis +Polyodon +polyodont +polyodontal +polyodontia +Polyodontidae +polyodontoid +polyoecious +polyoeciously +polyoeciousness +polyoecism +polyoecy +polyoicous +polyommatous +polyonomous +polyonomy +polyonychia +polyonym +polyonymal +polyonymic +polyonymist +polyonymous +polyonymy +polyophthalmic +polyopia +polyopic +polyopsia +polyopsy +polyorama +polyorchidism +polyorchism +polyorganic +polyose +polyoxide +polyoxymethylene +polyp +polypage +polypaged +polypapilloma +polyparasitic +polyparasitism +polyparesis +polyparia +polyparian +polyparium +polyparous +polypary +polypean +polyped +Polypedates +polypeptide +polypetal +Polypetalae +polypetalous +Polyphaga +polyphage +polyphagia +polyphagian +polyphagic +polyphagist +polyphagous +polyphagy +polyphalangism +polypharmacal +polypharmacist +polypharmacon +polypharmacy +polypharmic +polyphasal +polyphase +polyphaser +Polypheme +polyphemian +polyphemic +polyphemous +polyphenol +polyphloesboean +polyphloisboioism +polyphloisboism +polyphobia +polyphobic +polyphone +polyphoned +polyphonia +polyphonic +polyphonical +polyphonism +polyphonist +polyphonium +polyphonous +polyphony +polyphore +polyphosphoric +polyphotal +polyphote +polyphylesis +polyphyletic +polyphyletically +polyphylety +polyphylline +polyphyllous +polyphylly +polyphylogeny +polyphyly +polyphyodont +Polypi +polypi +polypian +polypide +polypidom +Polypifera +polypiferous +polypigerous +polypinnate +polypite +Polyplacophora +polyplacophoran +polyplacophore +polyplacophorous +polyplastic +Polyplectron +polyplegia +polyplegic +polyploid +polyploidic +polyploidy +polypnoea +polypnoeic +polypod +Polypoda +polypodia +Polypodiaceae +polypodiaceous +Polypodium +polypodous +polypody +polypoid +polypoidal +Polypomorpha +polypomorphic +Polyporaceae +polyporaceous +polypore +polyporite +polyporoid +polyporous +Polyporus +polypose +polyposis +polypotome +polypous +polypragmacy +polypragmatic +polypragmatical +polypragmatically +polypragmatism +polypragmatist +polypragmaty +polypragmist +polypragmon +polypragmonic +polypragmonist +polyprene +polyprism +polyprismatic +polyprothetic +polyprotodont +Polyprotodontia +polypseudonymous +polypsychic +polypsychical +polypsychism +polypterid +Polypteridae +polypteroid +Polypterus +polyptote +polyptoton +polyptych +polypus +polyrhizal +polyrhizous +polyrhythmic +polyrhythmical +polysaccharide +polysaccharose +Polysaccum +polysalicylide +polysarcia +polysarcous +polyschematic +polyschematist +polyscope +polyscopic +polysemant +polysemantic +polysemeia +polysemia +polysemous +polysemy +polysensuous +polysensuousness +polysepalous +polyseptate +polyserositis +polysided +polysidedness +polysilicate +polysilicic +Polysiphonia +polysiphonic +polysiphonous +polysomatic +polysomatous +polysomaty +polysomia +polysomic +polysomitic +polysomous +polysomy +polyspast +polyspaston +polyspermal +polyspermatous +polyspermia +polyspermic +polyspermous +polyspermy +polyspondylic +polyspondylous +polyspondyly +Polyspora +polysporangium +polyspore +polyspored +polysporic +polysporous +polystachyous +polystaurion +polystele +polystelic +polystemonous +polystichoid +polystichous +Polystichum +Polystictus +Polystomata +Polystomatidae +polystomatous +polystome +Polystomea +Polystomella +Polystomidae +polystomium +polystylar +polystyle +polystylous +polystyrene +polysulphide +polysulphuration +polysulphurization +polysyllabic +polysyllabical +polysyllabically +polysyllabicism +polysyllabicity +polysyllabism +polysyllable +polysyllogism +polysyllogistic +polysymmetrical +polysymmetrically +polysymmetry +polysyndetic +polysyndetically +polysyndeton +polysynthesis +polysynthesism +polysynthetic +polysynthetical +polysynthetically +polysyntheticism +polysynthetism +polysynthetize +polytechnic +polytechnical +polytechnics +polytechnist +polyterpene +Polythalamia +polythalamian +polythalamic +polythalamous +polythecial +polytheism +polytheist +polytheistic +polytheistical +polytheistically +polytheize +polythelia +polythelism +polythely +polythene +polythionic +polytitanic +polytocous +polytokous +polytoky +polytomous +polytomy +polytonal +polytonalism +polytonality +polytone +polytonic +polytony +polytope +polytopic +polytopical +Polytrichaceae +polytrichaceous +polytrichia +polytrichous +Polytrichum +polytrochal +polytrochous +polytrope +polytrophic +polytropic +polytungstate +polytungstic +polytype +polytypic +polytypical +polytypy +polyuresis +polyuria +polyuric +polyvalence +polyvalent +polyvinyl +polyvinylidene +polyvirulent +polyvoltine +Polyzoa +polyzoal +polyzoan +polyzoarial +polyzoarium +polyzoary +polyzoic +polyzoism +polyzonal +polyzooid +polyzoon +polzenite +pom +pomace +Pomaceae +pomacentrid +Pomacentridae +pomacentroid +Pomacentrus +pomaceous +pomade +Pomaderris +Pomak +pomander +pomane +pomarine +pomarium +pomate +pomato +pomatomid +Pomatomidae +Pomatomus +pomatorhine +pomatum +pombe +pombo +pome +pomegranate +pomelo +Pomeranian +pomeridian +pomerium +pomewater +pomey +pomfret +pomiculture +pomiculturist +pomiferous +pomiform +pomivorous +Pommard +pomme +pommee +pommel +pommeled +pommeler +pommet +pommey +pommy +Pomo +pomological +pomologically +pomologist +pomology +Pomona +pomonal +pomonic +pomp +pompa +Pompadour +pompadour +pompal +pompano +Pompeian +Pompeii +pompelmous +Pompey +pompey +pompholix +pompholygous +pompholyx +pomphus +pompier +pompilid +Pompilidae +pompiloid +Pompilus +pompion +pompist +pompless +pompoleon +pompon +pomposity +pompous +pompously +pompousness +pompster +Pomptine +pomster +pon +Ponca +ponce +ponceau +poncelet +poncho +ponchoed +Poncirus +pond +pondage +pondbush +ponder +ponderability +ponderable +ponderableness +ponderal +ponderance +ponderancy +ponderant +ponderary +ponderate +ponderation +ponderative +ponderer +pondering +ponderingly +ponderling +ponderment +ponderomotive +ponderosapine +ponderosity +ponderous +ponderously +ponderousness +pondfish +pondful +pondgrass +pondlet +pondman +Pondo +pondok +pondokkie +Pondomisi +pondside +pondus +pondweed +pondwort +pondy +pone +ponent +Ponera +Poneramoeba +ponerid +Poneridae +Ponerinae +ponerine +poneroid +ponerology +poney +pong +ponga +pongee +Pongidae +Pongo +poniard +ponica +ponier +ponja +pont +Pontac +Pontacq +pontage +pontal +Pontederia +Pontederiaceae +pontederiaceous +pontee +pontes +pontianak +Pontic +pontic +ponticello +ponticular +ponticulus +pontifex +pontiff +pontific +pontifical +pontificalia +pontificalibus +pontificality +pontifically +pontificate +pontification +pontifices +pontificial +pontificially +pontificious +pontify +pontil +pontile +pontin +Pontine +pontine +pontist +pontlevis +ponto +Pontocaspian +pontocerebellar +ponton +pontonier +pontoon +pontooneer +pontooner +pontooning +pontvolant +pony +ponzite +pooa +pooch +pooder +poodle +poodledom +poodleish +poodleship +poof +poogye +pooh +poohpoohist +pook +pooka +pookaun +pookoo +pool +pooler +pooli +poolroom +poolroot +poolside +poolwort +pooly +poon +poonac +poonga +poonghie +poop +pooped +poophyte +poophytic +poor +poorhouse +poorish +poorliness +poorling +poorly +poorlyish +poormaster +poorness +poorweed +poorwill +poot +Pop +pop +popadam +popal +popcorn +popdock +pope +Popean +popedom +popeholy +popehood +popeism +popeler +popeless +popelike +popeline +popely +popery +popeship +popess +popeye +popeyed +popglove +popgun +popgunner +popgunnery +Popian +popify +popinac +popinjay +Popish +popish +popishly +popishness +popjoy +poplar +poplared +Poplilia +poplin +poplinette +popliteal +popliteus +poplolly +Popocracy +Popocrat +Popolari +Popoloco +popomastic +popover +Popovets +poppa +poppability +poppable +poppean +poppel +popper +poppet +poppethead +poppied +poppin +popple +popply +poppy +poppycock +poppycockish +poppyfish +poppyhead +poppylike +poppywort +popshop +populace +popular +popularism +Popularist +popularity +popularization +popularize +popularizer +popularly +popularness +populate +population +populational +populationist +populationistic +populationless +populator +populicide +populin +Populism +Populist +Populistic +populous +populously +populousness +Populus +popweed +poral +porbeagle +porcate +porcated +porcelain +porcelainization +porcelainize +porcelainlike +porcelainous +porcelaneous +porcelanic +porcelanite +porcelanous +Porcellana +porcellanian +porcellanid +Porcellanidae +porcellanize +porch +porched +porching +porchless +porchlike +porcine +Porcula +porcupine +porcupinish +pore +pored +porelike +Porella +porencephalia +porencephalic +porencephalitis +porencephalon +porencephalous +porencephalus +porencephaly +porer +porge +porger +porgy +Poria +poricidal +Porifera +poriferal +poriferan +poriferous +poriform +porimania +poriness +poring +poringly +poriomanic +porism +porismatic +porismatical +porismatically +poristic +poristical +porite +Porites +Poritidae +poritoid +pork +porkburger +porker +porkery +porket +porkfish +porkish +porkless +porkling +porkman +Porkopolis +porkpie +porkwood +porky +pornerastic +pornocracy +pornocrat +pornograph +pornographer +pornographic +pornographically +pornographist +pornography +pornological +Porocephalus +porodine +porodite +porogam +porogamic +porogamous +porogamy +porokaiwhiria +porokeratosis +Porokoto +poroma +porometer +porophyllous +poroplastic +poroporo +pororoca +poros +poroscope +poroscopic +poroscopy +porose +poroseness +porosimeter +porosis +porosity +porotic +porotype +porous +porously +porousness +porpentine +porphine +Porphyra +Porphyraceae +porphyraceous +porphyratin +Porphyrean +porphyria +Porphyrian +porphyrian +Porphyrianist +porphyrin +porphyrine +porphyrinuria +Porphyrio +porphyrion +porphyrite +porphyritic +porphyroblast +porphyroblastic +porphyrogene +porphyrogenite +porphyrogenitic +porphyrogenitism +porphyrogeniture +porphyrogenitus +porphyroid +porphyrophore +porphyrous +porphyry +Porpita +porpitoid +porpoise +porpoiselike +porporate +porr +porraceous +porrect +porrection +porrectus +porret +porridge +porridgelike +porridgy +porriginous +porrigo +Porrima +porringer +porriwiggle +porry +port +porta +portability +portable +portableness +portably +portage +portague +portahepatis +portail +portal +portaled +portalled +portalless +portamento +portance +portass +portatile +portative +portcrayon +portcullis +porteacid +ported +porteligature +portend +portendance +portendment +Porteno +portension +portent +portention +portentosity +portentous +portentously +portentousness +porteous +porter +porterage +Porteranthus +porteress +porterhouse +porterlike +porterly +portership +portfire +portfolio +portglaive +portglave +portgrave +Porthetria +Portheus +porthole +porthook +porthors +porthouse +Portia +portia +portico +porticoed +portiere +portiered +portifory +portify +portio +portiomollis +portion +portionable +portional +portionally +portioner +portionist +portionize +portionless +portitor +Portlandian +portlast +portless +portlet +portligature +portlily +portliness +portly +portman +portmanmote +portmanteau +portmanteaux +portmantle +portmantologism +portment +portmoot +porto +portoise +portolan +portolano +Portor +portrait +portraitist +portraitlike +portraiture +portray +portrayable +portrayal +portrayer +portrayist +portrayment +portreeve +portreeveship +portress +portside +portsider +portsman +portuary +portugais +Portugal +Portugalism +Portugee +Portuguese +Portulaca +Portulacaceae +portulacaceous +Portulacaria +portulan +Portunalia +portunian +Portunidae +Portunus +portway +porty +porule +porulose +porulous +porus +porwigle +pory +Porzana +posadaship +posca +pose +Poseidon +Poseidonian +posement +poser +poseur +posey +posh +posing +posingly +posit +position +positional +positioned +positioner +positionless +positival +positive +positively +positiveness +positivism +positivist +positivistic +positivistically +positivity +positivize +positor +positron +positum +positure +Posnanian +posnet +posole +posologic +posological +posologist +posology +pospolite +poss +posse +posseman +possess +possessable +possessed +possessedly +possessedness +possessing +possessingly +possessingness +possession +possessional +possessionalism +possessionalist +possessionary +possessionate +possessioned +possessioner +possessionist +possessionless +possessionlessness +possessival +possessive +possessively +possessiveness +possessor +possessoress +possessorial +possessoriness +possessorship +possessory +posset +possibilism +possibilist +possibilitate +possibility +possible +possibleness +possibly +possum +possumwood +post +postabdomen +postabdominal +postable +postabortal +postacetabular +postadjunct +postage +postal +postallantoic +postally +postalveolar +postament +postamniotic +postanal +postanesthetic +postantennal +postaortic +postapoplectic +postappendicular +postarterial +postarthritic +postarticular +postarytenoid +postaspirate +postaspirated +postasthmatic +postatrial +postauditory +postauricular +postaxiad +postaxial +postaxially +postaxillary +postbag +postbaptismal +postbox +postboy +postbrachial +postbrachium +postbranchial +postbreakfast +postbronchial +postbuccal +postbulbar +postbursal +postcaecal +postcalcaneal +postcalcarine +postcanonical +postcardiac +postcardinal +postcarnate +postcarotid +postcart +postcartilaginous +postcatarrhal +postcava +postcaval +postcecal +postcenal +postcentral +postcentrum +postcephalic +postcerebellar +postcerebral +postcesarean +postcibal +postclassic +postclassical +postclassicism +postclavicle +postclavicula +postclavicular +postclimax +postclitellian +postclival +postcolon +postcolonial +postcolumellar +postcomitial +postcommissural +postcommissure +postcommunicant +Postcommunion +postconceptive +postcondylar +postconfinement +postconnubial +postconsonantal +postcontact +postcontract +postconvalescent +postconvulsive +postcordial +postcornu +postcosmic +postcostal +postcoxal +postcritical +postcrural +postcubital +postdate +postdental +postdepressive +postdetermined +postdevelopmental +postdiagnostic +postdiaphragmatic +postdiastolic +postdicrotic +postdigestive +postdigital +postdiluvial +postdiluvian +postdiphtheric +postdiphtheritic +postdisapproved +postdisseizin +postdisseizor +postdoctoral +postdoctorate +postdural +postdysenteric +posted +posteen +postelection +postelementary +postembryonal +postembryonic +postemporal +postencephalitic +postencephalon +postenteral +postentry +postepileptic +poster +posterette +posteriad +posterial +posterior +posterioric +posteriorically +posterioristic +posterioristically +posteriority +posteriorly +posteriormost +posteriors +posteriorums +posterish +posterishness +posterist +posterity +posterize +postern +posteroclusion +posterodorsad +posterodorsal +posterodorsally +posteroexternal +posteroinferior +posterointernal +posterolateral +posteromedial +posteromedian +posteromesial +posteroparietal +posterosuperior +posterotemporal +posteroterminal +posteroventral +posteruptive +postesophageal +posteternity +postethmoid +postexilian +postexilic +postexist +postexistence +postexistency +postexistent +postface +postfact +postfebrile +postfemoral +postfetal +postfix +postfixal +postfixation +postfixed +postfixial +postflection +postflexion +postform +postfoveal +postfrontal +postfurca +postfurcal +postganglionic +postgangrenal +postgastric +postgeminum +postgenial +postgeniture +postglacial +postglenoid +postglenoidal +postgonorrheic +postgracile +postgraduate +postgrippal +posthabit +posthaste +posthemiplegic +posthemorrhagic +posthepatic +posthetomist +posthetomy +posthexaplaric +posthippocampal +posthitis +postholder +posthole +posthouse +posthumeral +posthumous +posthumously +posthumousness +posthumus +posthyoid +posthypnotic +posthypnotically +posthypophyseal +posthypophysis +posthysterical +postic +postical +postically +posticous +posticteric +posticum +postil +postilion +postilioned +postillate +postillation +postillator +postimpressionism +postimpressionist +postimpressionistic +postinfective +postinfluenzal +posting +postingly +postintestinal +postique +postischial +postjacent +postjugular +postlabial +postlachrymal +postlaryngeal +postlegitimation +postlenticular +postless +postlike +postliminary +postliminiary +postliminious +postliminium +postliminous +postliminy +postloitic +postloral +postlude +postludium +postluetic +postmalarial +postmamillary +postmammary +postman +postmandibular +postmaniacal +postmarital +postmark +postmarriage +postmaster +postmasterlike +postmastership +postmastoid +postmaturity +postmaxillary +postmaximal +postmeatal +postmedia +postmedial +postmedian +postmediastinal +postmediastinum +postmedullary +postmeiotic +postmeningeal +postmenstrual +postmental +postmeridian +postmeridional +postmesenteric +postmillenarian +postmillenarianism +postmillennial +postmillennialism +postmillennialist +postmillennian +postmineral +postmistress +postmortal +postmortuary +postmundane +postmuscular +postmutative +postmycotic +postmyxedematous +postnarial +postnaris +postnasal +postnatal +postnate +postnati +postnecrotic +postnephritic +postneural +postneuralgic +postneuritic +postneurotic +postnodular +postnominal +postnotum +postnuptial +postnuptially +postobituary +postocular +postolivary +postomental +postoperative +postoptic +postoral +postorbital +postordination +postorgastic +postosseous +postotic +postpagan +postpaid +postpalatal +postpalatine +postpalpebral +postpaludal +postparalytic +postparietal +postparotid +postparotitic +postparoxysmal +postparturient +postpatellar +postpathological +postpericardial +postpharyngeal +postphlogistic +postphragma +postphrenic +postphthisic +postpituitary +postplace +postplegic +postpneumonic +postponable +postpone +postponement +postponence +postponer +postpontile +postpose +postposited +postposition +postpositional +postpositive +postpositively +postprandial +postprandially +postpredicament +postprophesy +postprostate +postpubertal +postpubescent +postpubic +postpubis +postpuerperal +postpulmonary +postpupillary +postpycnotic +postpyloric +postpyramidal +postpyretic +postrachitic +postramus +postrectal +postreduction +postremogeniture +postremote +postrenal +postresurrection +postresurrectional +postretinal +postrheumatic +postrhinal +postrider +postrorse +postrostral +postrubeolar +postsaccular +postsacral +postscalenus +postscapula +postscapular +postscapularis +postscarlatinal +postscenium +postscorbutic +postscribe +postscript +postscriptum +postscutellar +postscutellum +postseason +postsigmoid +postsign +postspasmodic +postsphenoid +postsphenoidal +postsphygmic +postspinous +postsplenial +postsplenic +poststernal +poststertorous +postsuppurative +postsurgical +postsynaptic +postsynsacral +postsyphilitic +postsystolic +posttabetic +posttarsal +posttetanic +postthalamic +postthoracic +postthyroidal +posttibial +posttonic +posttoxic +posttracheal +posttrapezoid +posttraumatic +posttreaty +posttubercular +posttussive +posttympanic +posttyphoid +postulancy +postulant +postulantship +postulata +postulate +postulation +postulational +postulator +postulatory +postulatum +postulnar +postumbilical +postumbonal +postural +posture +posturer +postureteric +posturist +posturize +postuterine +postvaccinal +postvaricellar +postvarioloid +postvelar +postvenereal +postvenous +postverbal +Postverta +postvertebral +postvesical +postvide +postvocalic +postwar +postward +postwise +postwoman +postxyphoid +postyard +postzygapophysial +postzygapophysis +posy +pot +potability +potable +potableness +potagerie +potagery +potamic +Potamobiidae +Potamochoerus +Potamogale +Potamogalidae +Potamogeton +Potamogetonaceae +potamogetonaceous +potamological +potamologist +potamology +potamometer +Potamonidae +potamophilous +potamoplankton +potash +potashery +potass +potassa +potassamide +potassic +potassiferous +potassium +potate +potation +potative +potato +potator +potatory +Potawatami +Potawatomi +potbank +potbellied +potbelly +potboil +potboiler +potboy +potboydom +potch +potcher +potcherman +potcrook +potdar +pote +potecary +poteen +potence +potency +potent +potentacy +potentate +potential +potentiality +potentialization +potentialize +potentially +potentialness +potentiate +potentiation +Potentilla +potentiometer +potentiometric +potentize +potently +potentness +poter +Poterium +potestal +potestas +potestate +potestative +poteye +potful +potgirl +potgun +pothanger +pothead +pothecary +potheen +pother +potherb +potherment +pothery +pothole +pothook +pothookery +Pothos +pothouse +pothousey +pothunt +pothunter +pothunting +poticary +potichomania +potichomanist +potifer +Potiguara +potion +potlatch +potleg +potlicker +potlid +potlike +potluck +potmaker +potmaking +potman +potomania +potomato +potometer +potong +potoo +Potoroinae +potoroo +Potorous +potpie +potpourri +potrack +potsherd +potshoot +potshooter +potstick +potstone +pott +pottage +pottagy +pottah +potted +potter +potterer +potteress +potteringly +pottery +Pottiaceae +potting +pottinger +pottle +pottled +potto +potty +potwaller +potwalling +potware +potwhisky +potwork +potwort +pouce +poucer +poucey +pouch +pouched +pouchful +pouchless +pouchlike +pouchy +poudrette +pouf +poulaine +poulard +poulardize +poulp +poulpe +poult +poulter +poulterer +poulteress +poultice +poulticewise +poultry +poultrydom +poultryist +poultryless +poultrylike +poultryman +poultryproof +pounamu +pounce +pounced +pouncer +pouncet +pouncing +pouncingly +pound +poundage +poundal +poundcake +pounder +pounding +poundkeeper +poundless +poundlike +poundman +poundmaster +poundmeal +poundstone +poundworth +pour +pourer +pourie +pouring +pouringly +pourparler +pourparley +pourpiece +pourpoint +pourpointer +pouser +poussette +pout +pouter +poutful +pouting +poutingly +pouty +poverish +poverishment +poverty +povertyweed +Povindah +pow +powder +powderable +powdered +powderer +powderiness +powdering +powderization +powderize +powderizer +powderlike +powderman +powdery +powdike +powdry +powellite +power +powerboat +powered +powerful +powerfully +powerfulness +powerhouse +powerless +powerlessly +powerlessness +powermonger +Powhatan +powitch +powldoody +pownie +powsoddy +powsowdy +powwow +powwower +powwowism +pox +poxy +poy +poyou +pozzolanic +pozzuolana +pozzuolanic +praam +prabble +prabhu +practic +practicability +practicable +practicableness +practicably +practical +practicalism +practicalist +practicality +practicalization +practicalize +practicalizer +practically +practicalness +practicant +practice +practiced +practicedness +practicer +practician +practicianism +practicum +practitional +practitioner +practitionery +prad +pradhana +praeabdomen +praeacetabular +praeanal +praecava +praecipe +praecipuum +praecoces +praecocial +praecognitum +praecoracoid +praecordia +praecordial +praecordium +praecornu +praecox +praecuneus +praedial +praedialist +praediality +praeesophageal +praefect +praefectorial +praefectus +praefervid +praefloration +praefoliation +praehallux +praelabrum +praelection +praelector +praelectorship +praelectress +praeludium +praemaxilla +praemolar +praemunire +praenarial +Praenestine +Praenestinian +praeneural +praenomen +praenomina +praenominal +praeoperculum +praepositor +praepostor +praepostorial +praepubis +praepuce +praescutum +Praesepe +praesertim +Praesian +praesidium +praesphenoid +praesternal +praesternum +praestomium +praesystolic +praetaxation +praetexta +praetor +praetorial +Praetorian +praetorian +praetorianism +praetorium +praetorship +praezygapophysis +pragmatic +pragmatica +pragmatical +pragmaticality +pragmatically +pragmaticalness +pragmaticism +pragmatics +pragmatism +pragmatist +pragmatistic +pragmatize +pragmatizer +prairie +prairiecraft +prairied +prairiedom +prairielike +prairieweed +prairillon +praisable +praisableness +praisably +praise +praiseful +praisefully +praisefulness +praiseless +praiseproof +praiser +praiseworthy +praising +praisingly +praisworthily +praisworthiness +Prajapati +prajna +Prakrit +prakriti +Prakritic +Prakritize +praline +pralltriller +pram +Pramnian +prana +prance +pranceful +prancer +prancing +prancingly +prancy +prandial +prandially +prank +pranked +pranker +prankful +prankfulness +pranking +prankingly +prankish +prankishly +prankishness +prankle +pranksome +pranksomeness +prankster +pranky +prase +praseocobaltic +praseodidymium +praseodymia +praseodymium +praseolite +prasine +prasinous +prasoid +prasophagous +prasophagy +prastha +prat +pratal +prate +prateful +pratement +pratensian +Prater +prater +pratey +pratfall +pratiloma +Pratincola +pratincole +pratincoline +pratincolous +prating +pratingly +pratique +pratiyasamutpada +prattfall +prattle +prattlement +prattler +prattling +prattlingly +prattly +prau +pravity +prawn +prawner +prawny +Praxean +Praxeanist +praxinoscope +praxiology +praxis +Praxitelean +pray +praya +prayer +prayerful +prayerfully +prayerfulness +prayerless +prayerlessly +prayerlessness +prayermaker +prayermaking +prayerwise +prayful +praying +prayingly +prayingwise +preabdomen +preabsorb +preabsorbent +preabstract +preabundance +preabundant +preabundantly +preaccept +preacceptance +preaccess +preaccessible +preaccidental +preaccidentally +preaccommodate +preaccommodating +preaccommodatingly +preaccommodation +preaccomplish +preaccomplishment +preaccord +preaccordance +preaccount +preaccounting +preaccredit +preaccumulate +preaccumulation +preaccusation +preaccuse +preaccustom +preaccustomed +preacetabular +preach +preachable +preacher +preacherdom +preacheress +preacherize +preacherless +preacherling +preachership +preachieved +preachification +preachify +preachily +preachiness +preaching +preachingly +preachman +preachment +preachy +preacid +preacidity +preacidly +preacidness +preacknowledge +preacknowledgment +preacquaint +preacquaintance +preacquire +preacquired +preacquit +preacquittal +preact +preaction +preactive +preactively +preactivity +preacute +preacutely +preacuteness +preadamic +preadamite +preadamitic +preadamitical +preadamitism +preadapt +preadaptable +preadaptation +preaddition +preadditional +preaddress +preadequacy +preadequate +preadequately +preadhere +preadherence +preadherent +preadjectival +preadjective +preadjourn +preadjournment +preadjunct +preadjust +preadjustable +preadjustment +preadministration +preadministrative +preadministrator +preadmire +preadmirer +preadmission +preadmit +preadmonish +preadmonition +preadolescent +preadopt +preadoption +preadoration +preadore +preadorn +preadornment +preadult +preadulthood +preadvance +preadvancement +preadventure +preadvertency +preadvertent +preadvertise +preadvertisement +preadvice +preadvisable +preadvise +preadviser +preadvisory +preadvocacy +preadvocate +preaestival +preaffect +preaffection +preaffidavit +preaffiliate +preaffiliation +preaffirm +preaffirmation +preaffirmative +preafflict +preaffliction +preafternoon +preaged +preaggravate +preaggravation +preaggression +preaggressive +preagitate +preagitation +preagonal +preagony +preagree +preagreement +preagricultural +preagriculture +prealarm +prealcohol +prealcoholic +prealgebra +prealgebraic +prealkalic +preallable +preallably +preallegation +preallege +prealliance +preallied +preallot +preallotment +preallow +preallowable +preallowably +preallowance +preallude +preallusion +preally +prealphabet +prealphabetical +prealtar +prealteration +prealveolar +preamalgamation +preambassadorial +preambition +preambitious +preamble +preambled +preambling +preambular +preambulary +preambulate +preambulation +preambulatory +preanal +preanaphoral +preanesthetic +preanimism +preannex +preannounce +preannouncement +preannouncer +preantepenult +preantepenultimate +preanterior +preanticipate +preantiquity +preantiseptic +preaortic +preappearance +preapperception +preapplication +preappoint +preappointment +preapprehension +preapprise +preapprobation +preapproval +preapprove +preaptitude +prearm +prearrange +prearrangement +prearrest +prearrestment +prearticulate +preartistic +preascertain +preascertainment +preascitic +preaseptic +preassigned +preassume +preassurance +preassure +preataxic +preattachment +preattune +preaudience +preauditory +preaver +preavowal +preaxiad +preaxial +preaxially +prebachelor +prebacillary +prebake +prebalance +preballot +preballoting +prebankruptcy +prebaptismal +prebaptize +prebarbaric +prebarbarous +prebargain +prebasal +prebasilar +prebeleve +prebelief +prebeliever +prebelieving +prebellum +prebeloved +prebend +prebendal +prebendary +prebendaryship +prebendate +prebenediction +prebeneficiary +prebenefit +prebeset +prebestow +prebestowal +prebetray +prebetrayal +prebetrothal +prebid +prebidding +prebill +prebless +preblessing +preblockade +preblooming +preboast +preboding +preboil +preborn +preborrowing +preboyhood +prebrachial +prebrachium +prebreathe +prebridal +prebroadcasting +prebromidic +prebronchial +prebronze +prebrute +prebuccal +prebudget +prebudgetary +prebullying +preburlesque +preburn +precalculable +precalculate +precalculation +precampaign +precancel +precancellation +precancerous +precandidacy +precandidature +precanning +precanonical +precant +precantation +precanvass +precapillary +precapitalist +precapitalistic +precaptivity +precapture +precarcinomatous +precardiac +precaria +precarious +precariously +precariousness +precarium +precarnival +precartilage +precartilaginous +precary +precast +precation +precative +precatively +precatory +precaudal +precausation +precaution +precautional +precautionary +precautious +precautiously +precautiousness +precava +precaval +precedable +precede +precedence +precedency +precedent +precedentable +precedentary +precedented +precedential +precedentless +precedently +preceder +preceding +precelebrant +precelebrate +precelebration +precensure +precensus +precent +precentor +precentorial +precentorship +precentory +precentral +precentress +precentrix +precentrum +precept +preception +preceptist +preceptive +preceptively +preceptor +preceptoral +preceptorate +preceptorial +preceptorially +preceptorship +preceptory +preceptress +preceptual +preceptually +preceramic +precerebellar +precerebral +precerebroid +preceremonial +preceremony +precertification +precertify +preces +precess +precession +precessional +prechallenge +prechampioned +prechampionship +precharge +prechart +precheck +prechemical +precherish +prechildhood +prechill +prechloric +prechloroform +prechoice +prechoose +prechordal +prechoroid +preciation +precinct +precinction +precinctive +preciosity +precious +preciously +preciousness +precipe +precipice +precipiced +precipitability +precipitable +precipitance +precipitancy +precipitant +precipitantly +precipitantness +precipitate +precipitated +precipitatedly +precipitately +precipitation +precipitative +precipitator +precipitin +precipitinogen +precipitinogenic +precipitous +precipitously +precipitousness +precirculate +precirculation +precis +precise +precisely +preciseness +precisian +precisianism +precisianist +precision +precisional +precisioner +precisionism +precisionist +precisionize +precisive +precitation +precite +precited +precivilization +preclaim +preclaimant +preclaimer +preclassic +preclassical +preclassification +preclassified +preclassify +preclean +precleaner +precleaning +preclerical +preclimax +preclinical +preclival +precloacal +preclose +preclosure +preclothe +precludable +preclude +preclusion +preclusive +preclusively +precoagulation +precoccygeal +precocial +precocious +precociously +precociousness +precocity +precogitate +precogitation +precognition +precognitive +precognizable +precognizant +precognize +precognosce +precoil +precoiler +precoincidence +precoincident +precoincidently +precollapsable +precollapse +precollect +precollectable +precollection +precollector +precollege +precollegiate +precollude +precollusion +precollusive +precolor +precolorable +precoloration +precoloring +precombat +precombatant +precombination +precombine +precombustion +precommand +precommend +precomment +precommercial +precommissural +precommissure +precommit +precommune +precommunicate +precommunication +precommunion +precompare +precomparison +precompass +precompel +precompensate +precompensation +precompilation +precompile +precompiler +precompleteness +precompletion +precompliance +precompliant +precomplicate +precomplication +precompose +precomposition +precompound +precompounding +precompoundly +precomprehend +precomprehension +precomprehensive +precompress +precompulsion +precomradeship +preconceal +preconcealment +preconcede +preconceivable +preconceive +preconceived +preconcentrate +preconcentrated +preconcentratedly +preconcentration +preconcept +preconception +preconceptional +preconceptual +preconcern +preconcernment +preconcert +preconcerted +preconcertedly +preconcertedness +preconcertion +preconcertive +preconcession +preconcessive +preconclude +preconclusion +preconcur +preconcurrence +preconcurrent +preconcurrently +precondemn +precondemnation +precondensation +precondense +precondition +preconditioned +preconduct +preconduction +preconductor +precondylar +precondyloid +preconfer +preconference +preconfess +preconfession +preconfide +preconfiguration +preconfigure +preconfine +preconfinedly +preconfinemnt +preconfirm +preconfirmation +preconflict +preconform +preconformity +preconfound +preconfuse +preconfusedly +preconfusion +precongenial +precongested +precongestion +precongestive +precongratulate +precongratulation +precongressional +preconizance +preconization +preconize +preconizer +preconjecture +preconnection +preconnective +preconnubial +preconquer +preconquest +preconquestal +preconquestual +preconscious +preconsciously +preconsciousness +preconsecrate +preconsecration +preconsent +preconsider +preconsideration +preconsign +preconsolidate +preconsolation +preconsole +preconsolidated +preconsolidation +preconsonantal +preconspiracy +preconspirator +preconspire +preconstituent +preconstitute +preconstruct +preconstruction +preconsult +preconsultation +preconsultor +preconsume +preconsumer +preconsumption +precontact +precontain +precontained +precontemn +precontemplate +precontemplation +precontemporaneous +precontemporary +precontend +precontent +precontention +precontently +precontentment +precontest +precontinental +precontract +precontractive +precontractual +precontribute +precontribution +precontributive +precontrivance +precontrive +precontrol +precontrolled +precontroversial +precontroversy +preconvention +preconversation +preconversational +preconversion +preconvert +preconvey +preconveyal +preconveyance +preconvict +preconviction +preconvince +precook +precooker +precool +precooler +precooling +precopy +precoracoid +precordia +precordial +precordiality +precordially +precordium +precorneal +precornu +precoronation +precorrect +precorrection +precorrectly +precorrectness +precorrespond +precorrespondence +precorrespondent +precorridor +precorrupt +precorruption +precorruptive +precorruptly +precoruptness +precosmic +precosmical +precostal +precounsel +precounsellor +precourse +precover +precovering +precox +precreate +precreation +precreative +precredit +precreditor +precreed +precritical +precriticism +precriticize +precrucial +precrural +precrystalline +precultivate +precultivation +precultural +preculturally +preculture +precuneal +precuneate +precuneus +precure +precurrent +precurricular +precurriculum +precursal +precurse +precursive +precursor +precursory +precurtain +precut +precyclone +precyclonic +precynical +precyst +precystic +predable +predacean +predaceous +predaceousness +predacity +predamage +predamn +predamnation +predark +predarkness +predata +predate +predation +predatism +predative +predator +predatorily +predatoriness +predatory +predawn +preday +predaylight +predaytime +predazzite +predealer +predealing +predeath +predeathly +predebate +predebater +predebit +predebtor +predecay +predecease +predeceaser +predeceive +predeceiver +predeception +predecession +predecessor +predecessorship +predecide +predecision +predecisive +predeclaration +predeclare +predeclination +predecline +predecree +prededicate +prededuct +prededuction +predefault +predefeat +predefect +predefective +predefence +predefend +predefense +predefiance +predeficiency +predeficient +predefine +predefinite +predefinition +predefray +predefrayal +predefy +predegeneracy +predegenerate +predegree +predeication +predelay +predelegate +predelegation +predeliberate +predeliberately +predeliberation +predelineate +predelineation +predelinquency +predelinquent +predelinquently +predeliver +predelivery +predella +predelude +predelusion +predemand +predemocracy +predemocratic +predemonstrate +predemonstration +predemonstrative +predenial +predental +predentary +Predentata +predentate +predeny +predepart +predepartmental +predeparture +predependable +predependence +predependent +predeplete +predepletion +predeposit +predepository +predepreciate +predepreciation +predepression +predeprivation +predeprive +prederivation +prederive +predescend +predescent +predescribe +predescription +predesert +predeserter +predesertion +predeserve +predeserving +predesign +predesignate +predesignation +predesignatory +predesirous +predesolate +predesolation +predespair +predesperate +predespicable +predespise +predespond +predespondency +predespondent +predestinable +predestinarian +predestinarianism +predestinate +predestinately +predestination +predestinational +predestinationism +predestinationist +predestinative +predestinator +predestine +predestiny +predestitute +predestitution +predestroy +predestruction +predetach +predetachment +predetail +predetain +predetainer +predetect +predetention +predeterminability +predeterminable +predeterminant +predeterminate +predeterminately +predetermination +predeterminative +predetermine +predeterminer +predeterminism +predeterministic +predetest +predetestation +predetrimental +predevelop +predevelopment +predevise +predevote +predevotion +predevour +prediagnosis +prediagnostic +predial +prediastolic +prediatory +predicability +predicable +predicableness +predicably +predicament +predicamental +predicamentally +predicant +predicate +predication +predicational +predicative +predicatively +predicator +predicatory +predicrotic +predict +predictability +predictable +predictably +predictate +predictation +prediction +predictional +predictive +predictively +predictiveness +predictor +predictory +prediet +predietary +predifferent +predifficulty +predigest +predigestion +predikant +predilect +predilected +predilection +prediligent +prediligently +prediluvial +prediluvian +prediminish +prediminishment +prediminution +predine +predinner +prediphtheritic +prediploma +prediplomacy +prediplomatic +predirect +predirection +predirector +predisability +predisable +predisadvantage +predisadvantageous +predisadvantageously +predisagree +predisagreeable +predisagreement +predisappointment +predisaster +predisastrous +prediscern +prediscernment +predischarge +prediscipline +predisclose +predisclosure +prediscontent +prediscontented +prediscontentment +prediscontinuance +prediscontinuation +prediscontinue +prediscount +prediscountable +prediscourage +prediscouragement +prediscourse +prediscover +prediscoverer +prediscovery +prediscreet +prediscretion +prediscretionary +prediscriminate +prediscrimination +prediscriminator +prediscuss +prediscussion +predisgrace +predisguise +predisgust +predislike +predismiss +predismissal +predismissory +predisorder +predisordered +predisorderly +predispatch +predispatcher +predisperse +predispersion +predisplace +predisplacement +predisplay +predisponency +predisponent +predisposable +predisposal +predispose +predisposed +predisposedly +predisposedness +predisposition +predispositional +predisputant +predisputation +predispute +predisregard +predisrupt +predisruption +predissatisfaction +predissolution +predissolve +predissuade +predistinct +predistinction +predistinguish +predistress +predistribute +predistribution +predistributor +predistrict +predistrust +predistrustful +predisturb +predisturbance +prediversion +predivert +predivide +predividend +predivider +predivinable +predivinity +predivision +predivorce +predivorcement +predoctorate +predocumentary +predomestic +predominance +predominancy +predominant +predominantly +predominate +predominately +predominatingly +predomination +predominator +predonate +predonation +predonor +predoom +predorsal +predoubt +predoubter +predoubtful +predraft +predrainage +predramatic +predraw +predrawer +predread +predreadnought +predrill +predriller +predrive +predriver +predry +preduplicate +preduplication +predusk +predwell +predynamite +predynastic +preen +preener +preeze +prefab +prefabricate +prefabrication +prefabricator +preface +prefaceable +prefacer +prefacial +prefacist +prefactor +prefactory +prefamiliar +prefamiliarity +prefamiliarly +prefamous +prefashion +prefatial +prefator +prefatorial +prefatorially +prefatorily +prefatory +prefavor +prefavorable +prefavorably +prefavorite +prefearful +prefearfully +prefeast +prefect +prefectly +prefectoral +prefectorial +prefectorially +prefectorian +prefectship +prefectual +prefectural +prefecture +prefecundation +prefecundatory +prefederal +prefelic +prefer +preferability +preferable +preferableness +preferably +preferee +preference +preferent +preferential +preferentialism +preferentialist +preferentially +preferment +prefermentation +preferred +preferredly +preferredness +preferrer +preferrous +prefertile +prefertility +prefertilization +prefertilize +prefervid +prefestival +prefeudal +prefeudalic +prefeudalism +prefiction +prefictional +prefigurate +prefiguration +prefigurative +prefiguratively +prefigurativeness +prefigure +prefigurement +prefiller +prefilter +prefinal +prefinance +prefinancial +prefine +prefinish +prefix +prefixable +prefixal +prefixally +prefixation +prefixed +prefixedly +prefixion +prefixture +preflagellate +preflatter +preflattery +preflavor +preflavoring +preflection +preflexion +preflight +preflood +prefloration +preflowering +prefoliation +prefool +preforbidden +preforceps +preforgive +preforgiveness +preforgotten +preform +preformant +preformation +preformationary +preformationism +preformationist +preformative +preformed +preformism +preformist +preformistic +preformulate +preformulation +prefortunate +prefortunately +prefortune +prefoundation +prefounder +prefragrance +prefragrant +prefrankness +prefraternal +prefraternally +prefraud +prefreeze +prefreshman +prefriendly +prefriendship +prefright +prefrighten +prefrontal +prefulfill +prefulfillment +prefulgence +prefulgency +prefulgent +prefunction +prefunctional +prefuneral +prefungoidal +prefurlough +prefurnish +pregain +pregainer +pregalvanize +preganglionic +pregather +pregathering +pregeminum +pregenerate +pregeneration +pregenerosity +pregenerous +pregenerously +pregenial +pregeniculatum +pregeniculum +pregenital +pregeological +pregirlhood +preglacial +pregladden +pregladness +preglenoid +preglenoidal +preglobulin +pregnability +pregnable +pregnance +pregnancy +pregnant +pregnantly +pregnantness +pregolden +pregolfing +pregracile +pregracious +pregrade +pregraduation +pregranite +pregranitic +pregratification +pregratify +pregreet +pregreeting +pregrievance +pregrowth +preguarantee +preguarantor +preguard +preguess +preguidance +preguide +preguilt +preguiltiness +preguilty +pregust +pregustant +pregustation +pregustator +pregustic +prehallux +prehalter +prehandicap +prehandle +prehaps +preharden +preharmonious +preharmoniousness +preharmony +preharsh +preharshness +preharvest +prehatred +prehaunt +prehaunted +prehaustorium +prehazard +prehazardous +preheal +prehearing +preheat +preheated +preheater +prehemiplegic +prehend +prehensible +prehensile +prehensility +prehension +prehensive +prehensiveness +prehensor +prehensorial +prehensory +prehepatic +prehepaticus +preheroic +prehesitancy +prehesitate +prehesitation +prehexameral +prehistorian +prehistoric +prehistorical +prehistorically +prehistorics +prehistory +prehnite +prehnitic +preholder +preholding +preholiday +prehorizon +prehorror +prehostile +prehostility +prehuman +prehumiliate +prehumiliation +prehumor +prehunger +prehydration +prehypophysis +preidea +preidentification +preidentify +preignition +preilluminate +preillumination +preillustrate +preillustration +preimage +preimaginary +preimagination +preimagine +preimbibe +preimbue +preimitate +preimitation +preimitative +preimmigration +preimpair +preimpairment +preimpart +preimperial +preimport +preimportance +preimportant +preimportantly +preimportation +preimposal +preimpose +preimposition +preimpress +preimpression +preimpressive +preimprove +preimprovement +preinaugural +preinaugurate +preincarnate +preincentive +preinclination +preincline +preinclude +preinclusion +preincorporate +preincorporation +preincrease +preindebted +preindebtedness +preindemnification +preindemnify +preindemnity +preindependence +preindependent +preindependently +preindesignate +preindicant +preindicate +preindication +preindispose +preindisposition +preinduce +preinducement +preinduction +preinductive +preindulge +preindulgence +preindulgent +preindustrial +preindustry +preinfect +preinfection +preinfer +preinference +preinflection +preinflectional +preinflict +preinfluence +preinform +preinformation +preinhabit +preinhabitant +preinhabitation +preinhere +preinherit +preinheritance +preinitial +preinitiate +preinitiation +preinjure +preinjurious +preinjury +preinquisition +preinscribe +preinscription +preinsert +preinsertion +preinsinuate +preinsinuating +preinsinuatingly +preinsinuation +preinsinuative +preinspect +preinspection +preinspector +preinspire +preinstall +preinstallation +preinstill +preinstillation +preinstruct +preinstruction +preinstructional +preinstructive +preinsula +preinsular +preinsulate +preinsulation +preinsult +preinsurance +preinsure +preintellectual +preintelligence +preintelligent +preintelligently +preintend +preintention +preintercede +preintercession +preinterchange +preintercourse +preinterest +preinterfere +preinterference +preinterpret +preinterpretation +preinterpretative +preinterview +preintone +preinvent +preinvention +preinventive +preinventory +preinvest +preinvestigate +preinvestigation +preinvestigator +preinvestment +preinvitation +preinvite +preinvocation +preinvolve +preinvolvement +preiotization +preiotize +preirrigation +preirrigational +preissuance +preissue +prejacent +prejournalistic +prejudge +prejudgement +prejudger +prejudgment +prejudication +prejudicative +prejudicator +prejudice +prejudiced +prejudicedly +prejudiceless +prejudiciable +prejudicial +prejudicially +prejudicialness +prejudicious +prejudiciously +prejunior +prejurisdiction +prejustification +prejustify +prejuvenile +Prekantian +prekindergarten +prekindle +preknit +preknow +preknowledge +prelabel +prelabial +prelabor +prelabrum +prelachrymal +prelacrimal +prelacteal +prelacy +prelanguage +prelapsarian +prelate +prelatehood +prelateship +prelatess +prelatial +prelatic +prelatical +prelatically +prelaticalness +prelation +prelatish +prelatism +prelatist +prelatize +prelatry +prelature +prelaunch +prelaunching +prelawful +prelawfully +prelawfulness +prelease +prelect +prelection +prelector +prelectorship +prelectress +prelecture +prelegacy +prelegal +prelegate +prelegatee +prelegend +prelegendary +prelegislative +preliability +preliable +prelibation +preliberal +preliberality +preliberally +preliberate +preliberation +prelicense +prelim +preliminarily +preliminary +prelimit +prelimitate +prelimitation +prelingual +prelinguistic +prelinpinpin +preliquidate +preliquidation +preliteral +preliterally +preliteralness +preliterary +preliterate +preliterature +prelithic +prelitigation +preloan +prelocalization +prelocate +prelogic +prelogical +preloral +preloreal +preloss +prelude +preluder +preludial +preludious +preludiously +preludium +preludize +prelumbar +prelusion +prelusive +prelusively +prelusorily +prelusory +preluxurious +premachine +premadness +premaintain +premaintenance +premake +premaker +premaking +premandibular +premanhood +premaniacal +premanifest +premanifestation +premankind +premanufacture +premanufacturer +premanufacturing +premarital +premarriage +premarry +premastery +prematch +premate +prematerial +prematernity +prematrimonial +prematuration +premature +prematurely +prematureness +prematurity +premaxilla +premaxillary +premeasure +premeasurement +premechanical +premedia +premedial +premedian +premedic +premedical +premedicate +premedication +premedieval +premedievalism +premeditate +premeditatedly +premeditatedness +premeditatingly +premeditation +premeditative +premeditator +premegalithic +prememorandum +premenace +premenstrual +premention +premeridian +premerit +premetallic +premethodical +premial +premiant +premiate +premidnight +premidsummer +premier +premieral +premiere +premieress +premierjus +premiership +premilitary +premillenarian +premillenarianism +premillennial +premillennialism +premillennialist +premillennialize +premillennially +premillennian +preminister +preministry +premious +premisal +premise +premisory +premisrepresent +premisrepresentation +premiss +premium +premix +premixer +premixture +premodel +premodern +premodification +premodify +premolar +premold +premolder +premolding +premonarchial +premonetary +Premongolian +premonish +premonishment +premonition +premonitive +premonitor +premonitorily +premonitory +premonopolize +premonopoly +Premonstrant +Premonstratensian +premonumental +premoral +premorality +premorally +premorbid +premorbidly +premorbidness +premorning +premorse +premortal +premortification +premortify +premortuary +premosaic +premotion +premourn +premove +premovement +premover +premuddle +premultiplication +premultiplier +premultiply +premundane +premunicipal +premunition +premunitory +premusical +premuster +premutative +premutiny +premycotic +premyelocyte +premythical +prename +Prenanthes +prenares +prenarial +prenaris +prenasal +prenatal +prenatalist +prenatally +prenational +prenative +prenatural +prenaval +prender +prendre +prenebular +prenecessitate +preneglect +preneglectful +prenegligence +prenegligent +prenegotiate +prenegotiation +preneolithic +prenephritic +preneural +preneuralgic +prenight +prenoble +prenodal +prenominal +prenominate +prenomination +prenominical +prenotation +prenotice +prenotification +prenotify +prenotion +prentice +prenticeship +prenumber +prenumbering +prenuncial +prenuptial +prenursery +preobedience +preobedient +preobject +preobjection +preobjective +preobligate +preobligation +preoblige +preobservance +preobservation +preobservational +preobserve +preobstruct +preobstruction +preobtain +preobtainable +preobtrude +preobtrusion +preobtrusive +preobviate +preobvious +preobviously +preobviousness +preoccasioned +preoccipital +preocclusion +preoccultation +preoccupancy +preoccupant +preoccupate +preoccupation +preoccupative +preoccupied +preoccupiedly +preoccupiedness +preoccupier +preoccupy +preoccur +preoccurrence +preoceanic +preocular +preodorous +preoffend +preoffense +preoffensive +preoffensively +preoffensiveness +preoffer +preoffering +preofficial +preofficially +preominate +preomission +preomit +preopen +preopening +preoperate +preoperation +preoperative +preoperatively +preoperator +preopercle +preopercular +preoperculum +preopinion +preopinionated +preoppose +preopposition +preoppress +preoppression +preoppressor +preoptic +preoptimistic +preoption +preoral +preorally +preorbital +preordain +preorder +preordination +preorganic +preorganization +preorganize +preoriginal +preoriginally +preornamental +preoutfit +preoutline +preoverthrow +prep +prepainful +prepalatal +prepalatine +prepaleolithic +prepanic +preparable +preparation +preparationist +preparative +preparatively +preparator +preparatorily +preparatory +prepardon +prepare +prepared +preparedly +preparedness +preparement +preparental +preparer +preparietal +preparingly +preparliamentary +preparoccipital +preparoxysmal +prepartake +preparticipation +prepartisan +prepartition +prepartnership +prepatellar +prepatent +prepatriotic +prepave +prepavement +prepay +prepayable +prepayment +prepeduncle +prepenetrate +prepenetration +prepenial +prepense +prepensely +prepeople +preperceive +preperception +preperceptive +preperitoneal +prepersuade +prepersuasion +prepersuasive +preperusal +preperuse +prepetition +prephragma +prephthisical +prepigmental +prepink +prepious +prepituitary +preplace +preplacement +preplacental +preplan +preplant +prepledge +preplot +prepoetic +prepoetical +prepoison +prepolice +prepolish +prepolitic +prepolitical +prepolitically +prepollence +prepollency +prepollent +prepollex +preponder +preponderance +preponderancy +preponderant +preponderantly +preponderate +preponderately +preponderating +preponderatingly +preponderation +preponderous +preponderously +prepontile +prepontine +preportray +preportrayal +prepose +preposition +prepositional +prepositionally +prepositive +prepositively +prepositor +prepositorial +prepositure +prepossess +prepossessed +prepossessing +prepossessingly +prepossessingness +prepossession +prepossessionary +prepossessor +preposterous +preposterously +preposterousness +prepostorship +prepotence +prepotency +prepotent +prepotential +prepotently +prepractical +prepractice +preprandial +prepreference +prepreparation +preprice +preprimary +preprimer +preprimitive +preprint +preprofess +preprofessional +preprohibition +prepromise +prepromote +prepromotion +prepronounce +prepronouncement +preprophetic +preprostatic +preprove +preprovide +preprovision +preprovocation +preprovoke +preprudent +preprudently +prepsychological +prepsychology +prepuberal +prepubertal +prepuberty +prepubescent +prepubic +prepubis +prepublication +prepublish +prepuce +prepunctual +prepunish +prepunishment +prepupa +prepupal +prepurchase +prepurchaser +prepurpose +preputial +preputium +prepyloric +prepyramidal +prequalification +prequalify +prequarantine +prequestion +prequotation +prequote +preracing +preradio +prerailroad +prerailroadite +prerailway +preramus +prerational +prereadiness +preready +prerealization +prerealize +prerebellion +prereceipt +prereceive +prereceiver +prerecital +prerecite +prereckon +prereckoning +prerecognition +prerecognize +prerecommend +prerecommendation +prereconcile +prereconcilement +prereconciliation +prerectal +preredeem +preredemption +prereduction +prerefer +prereference +prerefine +prerefinement +prereform +prereformation +prereformatory +prerefusal +prerefuse +preregal +preregister +preregistration +preregulate +preregulation +prereject +prerejection +prerejoice +prerelate +prerelation +prerelationship +prerelease +prereligious +prereluctation +preremit +preremittance +preremorse +preremote +preremoval +preremove +preremunerate +preremuneration +prerenal +prerent +prerental +prereport +prerepresent +prerepresentation +prereption +prerepublican +prerequest +prerequire +prerequirement +prerequisite +prerequisition +preresemblance +preresemble +preresolve +preresort +prerespectability +prerespectable +prerespiration +prerespire +preresponsibility +preresponsible +prerestoration +prerestrain +prerestraint +prerestrict +prerestriction +prereturn +prereveal +prerevelation +prerevenge +prereversal +prereverse +prereview +prerevise +prerevision +prerevival +prerevolutionary +prerheumatic +prerich +prerighteous +prerighteously +prerighteousness +prerogatival +prerogative +prerogatived +prerogatively +prerogativity +prerolandic +preromantic +preromanticism +preroute +preroutine +preroyal +preroyally +preroyalty +prerupt +preruption +presacral +presacrifice +presacrificial +presage +presageful +presagefully +presager +presagient +presaging +presagingly +presalvation +presanctification +presanctified +presanctify +presanguine +presanitary +presartorial +presatisfaction +presatisfactory +presatisfy +presavage +presavagery +presay +presbyacousia +presbyacusia +presbycousis +presbycusis +presbyope +presbyophrenia +presbyophrenic +presbyopia +presbyopic +presbyopy +presbyte +presbyter +presbyteral +presbyterate +presbyterated +presbyteress +presbyteria +presbyterial +presbyterially +Presbyterian +Presbyterianism +Presbyterianize +Presbyterianly +presbyterium +presbytership +presbytery +presbytia +presbytic +Presbytinae +Presbytis +presbytism +prescapula +prescapular +prescapularis +prescholastic +preschool +prescience +prescient +prescientific +presciently +prescind +prescindent +prescission +prescored +prescout +prescribable +prescribe +prescriber +prescript +prescriptibility +prescriptible +prescription +prescriptionist +prescriptive +prescriptively +prescriptiveness +prescriptorial +prescrive +prescutal +prescutum +preseal +presearch +preseason +preseasonal +presecular +presecure +presee +preselect +presell +preseminal +preseminary +presence +presenced +presenceless +presenile +presenility +presensation +presension +present +presentability +presentable +presentableness +presentably +presental +presentation +presentational +presentationism +presentationist +presentative +presentatively +presentee +presentence +presenter +presential +presentiality +presentially +presentialness +presentient +presentiment +presentimental +presentist +presentive +presentively +presentiveness +presently +presentment +presentness +presentor +preseparate +preseparation +preseparator +preservability +preservable +preserval +preservation +preservationist +preservative +preservatize +preservatory +preserve +preserver +preserveress +preses +presession +preset +presettle +presettlement +presexual +preshadow +preshape +preshare +presharpen +preshelter +preship +preshipment +preshortage +preshorten +preshow +preside +presidence +presidencia +presidency +president +presidente +presidentess +presidential +presidentially +presidentiary +presidentship +presider +presidial +presidially +presidiary +presidio +presidium +presift +presign +presignal +presignificance +presignificancy +presignificant +presignification +presignificative +presignificator +presignify +presimian +preslavery +presmooth +presocial +presocialism +presocialist +presolar +presolicit +presolicitation +presolution +presolve +presophomore +presound +prespecialist +prespecialize +prespecific +prespecifically +prespecification +prespecify +prespeculate +prespeculation +presphenoid +presphenoidal +presphygmic +prespinal +prespinous +prespiracular +presplendor +presplenomegalic +prespoil +prespontaneity +prespontaneous +prespontaneously +prespread +presprinkle +prespur +press +pressable +pressboard +pressdom +pressel +presser +pressfat +pressful +pressgang +pressible +pressing +pressingly +pressingness +pression +pressive +pressman +pressmanship +pressmark +pressor +presspack +pressroom +pressurage +pressural +pressure +pressureless +pressureproof +pressurize +pressurizer +presswoman +presswork +pressworker +prest +prestabilism +prestability +prestable +prestamp +prestandard +prestandardization +prestandardize +prestant +prestate +prestation +prestatistical +presteam +presteel +prester +presternal +presternum +prestidigital +prestidigitate +prestidigitation +prestidigitator +prestidigitatorial +prestige +prestigiate +prestigiation +prestigiator +prestigious +prestigiously +prestigiousness +prestimulate +prestimulation +prestimulus +prestissimo +presto +prestock +prestomial +prestomium +prestorage +prestore +prestraighten +prestrain +prestrengthen +prestress +prestretch +prestricken +prestruggle +prestubborn +prestudious +prestudiously +prestudiousness +prestudy +presubdue +presubiculum +presubject +presubjection +presubmission +presubmit +presubordinate +presubordination +presubscribe +presubscriber +presubscription +presubsist +presubsistence +presubsistent +presubstantial +presubstitute +presubstitution +presuccess +presuccessful +presuccessfully +presuffer +presuffering +presufficiency +presufficient +presufficiently +presuffrage +presuggest +presuggestion +presuggestive +presuitability +presuitable +presuitably +presumable +presumably +presume +presumedly +presumer +presuming +presumption +presumptious +presumptiously +presumptive +presumptively +presumptuous +presumptuously +presumptuousness +presuperficial +presuperficiality +presuperficially +presuperfluity +presuperfluous +presuperfluously +presuperintendence +presuperintendency +presupervise +presupervision +presupervisor +presupplemental +presupplementary +presupplicate +presupplication +presupply +presupport +presupposal +presuppose +presupposition +presuppositionless +presuppress +presuppression +presuppurative +presupremacy +presupreme +presurgery +presurgical +presurmise +presurprisal +presurprise +presurrender +presurround +presurvey +presusceptibility +presusceptible +presuspect +presuspend +presuspension +presuspicion +presuspicious +presuspiciously +presuspiciousness +presustain +presutural +preswallow +presylvian +presympathize +presympathy +presymphonic +presymphony +presymphysial +presymptom +presymptomatic +presynapsis +presynaptic +presystematic +presystematically +presystole +presystolic +pretabulate +pretabulation +pretan +pretangible +pretangibly +pretannage +pretardily +pretardiness +pretardy +pretariff +pretaste +preteach +pretechnical +pretechnically +pretelegraph +pretelegraphic +pretelephone +pretelephonic +pretell +pretemperate +pretemperately +pretemporal +pretend +pretendant +pretended +pretendedly +pretender +Pretenderism +pretendership +pretendingly +pretendingness +pretense +pretenseful +pretenseless +pretension +pretensional +pretensionless +pretensive +pretensively +pretensiveness +pretentative +pretentious +pretentiously +pretentiousness +pretercanine +preterchristian +preterconventional +preterdetermined +preterdeterminedly +preterdiplomatic +preterdiplomatically +preterequine +preteressential +pretergress +pretergression +preterhuman +preterience +preterient +preterintentional +preterist +preterit +preteriteness +preterition +preteritive +preteritness +preterlabent +preterlegal +preterlethal +preterminal +pretermission +pretermit +pretermitter +preternative +preternatural +preternaturalism +preternaturalist +preternaturality +preternaturally +preternaturalness +preternormal +preternotorious +preternuptial +preterpluperfect +preterpolitical +preterrational +preterregular +preterrestrial +preterritorial +preterroyal +preterscriptural +preterseasonable +pretersensual +pretervection +pretest +pretestify +pretestimony +pretext +pretexted +pretextuous +pretheological +prethoracic +prethoughtful +prethoughtfully +prethoughtfulness +prethreaten +prethrill +prethrust +pretibial +pretimeliness +pretimely +pretincture +pretire +pretoken +pretone +pretonic +pretorial +pretorship +pretorsional +pretorture +pretournament +pretrace +pretracheal +pretraditional +pretrain +pretraining +pretransact +pretransaction +pretranscribe +pretranscription +pretranslate +pretranslation +pretransmission +pretransmit +pretransport +pretransportation +pretravel +pretreat +pretreatment +pretreaty +pretrematic +pretribal +pretry +prettification +prettifier +prettify +prettikin +prettily +prettiness +pretty +prettyface +prettyish +prettyism +pretubercular +pretuberculous +pretympanic +pretyphoid +pretypify +pretypographical +pretyrannical +pretyranny +pretzel +preultimate +preultimately +preumbonal +preunderstand +preundertake +preunion +preunite +preutilizable +preutilization +preutilize +prevacate +prevacation +prevaccinate +prevaccination +prevail +prevailance +prevailer +prevailingly +prevailingness +prevailment +prevalence +prevalency +prevalent +prevalently +prevalentness +prevalescence +prevalescent +prevalid +prevalidity +prevalidly +prevaluation +prevalue +prevariation +prevaricate +prevarication +prevaricator +prevaricatory +prevascular +prevegetation +prevelar +prevenance +prevenancy +prevene +prevenience +prevenient +preveniently +prevent +preventability +preventable +preventative +preventer +preventible +preventingly +prevention +preventionism +preventionist +preventive +preventively +preventiveness +preventorium +preventure +preverb +preverbal +preverification +preverify +prevernal +preversion +prevertebral +prevesical +preveto +previctorious +previde +previdence +preview +previgilance +previgilant +previgilantly +previolate +previolation +previous +previously +previousness +previse +previsibility +previsible +previsibly +prevision +previsional +previsit +previsitor +previsive +previsor +prevocal +prevocalic +prevocally +prevocational +prevogue +prevoid +prevoidance +prevolitional +prevolunteer +prevomer +prevotal +prevote +prevoyance +prevoyant +prevue +prewar +prewarn +prewarrant +prewash +preweigh +prewelcome +prewhip +prewilling +prewillingly +prewillingness +prewire +prewireless +prewitness +prewonder +prewonderment +preworldliness +preworldly +preworship +preworthily +preworthiness +preworthy +prewound +prewrap +prexy +prey +preyer +preyful +preyingly +preyouthful +prezonal +prezone +prezygapophysial +prezygapophysis +prezygomatic +priacanthid +Priacanthidae +priacanthine +Priacanthus +Priapean +Priapic +priapism +Priapulacea +priapulid +Priapulida +Priapulidae +priapuloid +Priapuloidea +Priapulus +Priapus +Priapusian +price +priceable +priceably +priced +priceite +priceless +pricelessness +pricer +prich +prick +prickant +pricked +pricker +pricket +prickfoot +pricking +prickingly +prickish +prickle +prickleback +prickled +pricklefish +prickless +prickliness +prickling +pricklingly +pricklouse +prickly +pricklyback +prickmadam +prickmedainty +prickproof +pricks +prickseam +prickshot +prickspur +pricktimber +prickwood +pricky +pride +prideful +pridefully +pridefulness +prideless +pridelessly +prideling +prideweed +pridian +priding +pridingly +pridy +pried +prier +priest +priestal +priestcap +priestcraft +priestdom +priesteen +priestery +priestess +priestfish +priesthood +priestianity +priestish +priestism +priestless +priestlet +priestlike +priestliness +priestling +priestly +priestship +priestshire +prig +prigdom +prigger +priggery +priggess +priggish +priggishly +priggishness +priggism +prighood +prigman +prill +prillion +prim +prima +primacy +primage +primal +primality +primar +primarian +primaried +primarily +primariness +primary +primatal +primate +Primates +primateship +primatial +primatic +primatical +primavera +primaveral +prime +primegilt +primely +primeness +primer +primero +primerole +primeval +primevalism +primevally +primeverose +primevity +primevous +primevrin +Primianist +primigene +primigenial +primigenian +primigenious +primigenous +primigravida +primine +priming +primipara +primiparity +primiparous +primipilar +primitiae +primitial +primitias +primitive +primitively +primitivism +primitivist +primitivistic +primitivity +primly +primness +primogenetrix +primogenial +primogenital +primogenitary +primogenitive +primogenitor +primogeniture +primogenitureship +primogenous +primoprime +primoprimitive +primordality +primordia +primordial +primordialism +primordially +primordiate +primordium +primosity +primost +primp +primrose +primrosed +primrosetide +primrosetime +primrosy +primsie +Primula +primula +Primulaceae +primulaceous +Primulales +primulaverin +primulaveroside +primulic +primuline +Primulinus +Primus +primus +primwort +primy +prince +princeage +princecraft +princedom +princehood +Princeite +princekin +princeless +princelet +princelike +princeliness +princeling +princely +princeps +princeship +princess +princessdom +princesse +princesslike +princessly +princewood +princified +princify +principal +principality +principally +principalness +principalship +principate +Principes +principes +principia +principiant +principiate +principiation +principium +principle +principulus +princock +princox +prine +pringle +prink +prinker +prinkle +prinky +print +printability +printable +printableness +printed +printer +printerdom +printerlike +printery +printing +printless +printline +printscript +printworks +Priodon +priodont +Priodontes +prion +prionid +Prionidae +Prioninae +prionine +Prionodesmacea +prionodesmacean +prionodesmaceous +prionodesmatic +Prionodon +prionodont +Prionopinae +prionopine +Prionops +Prionus +prior +prioracy +prioral +priorate +prioress +prioristic +prioristically +priorite +priority +priorly +priorship +priory +prisable +prisage +prisal +priscan +Priscian +Priscianist +Priscilla +Priscillian +Priscillianism +Priscillianist +prism +prismal +prismatic +prismatical +prismatically +prismatization +prismatize +prismatoid +prismatoidal +prismed +prismoid +prismoidal +prismy +prisometer +prison +prisonable +prisondom +prisoner +prisonful +prisonlike +prisonment +prisonous +priss +prissily +prissiness +prissy +pristane +pristine +Pristipomatidae +Pristipomidae +Pristis +Pristodus +pritch +Pritchardia +pritchel +prithee +prius +privacity +privacy +privant +private +privateer +privateersman +privately +privateness +privation +privative +privatively +privativeness +privet +privilege +privileged +privileger +privily +priviness +privity +privy +prizable +prize +prizeable +prizeholder +prizeman +prizer +prizery +prizetaker +prizeworthy +pro +proa +proabolitionist +proabsolutism +proabsolutist +proabstinence +proacademic +proacceptance +proacquisition +proacquittal +proaction +proactor +proaddition +proadjournment +proadministration +proadmission +proadoption +proadvertising +proaesthetic +proaggressionist +proagitation +proagrarian +proagreement +proagricultural +proagule +proairesis +proairplane +proal +proalcoholism +proalien +proalliance +proallotment +proalteration +proamateur +proambient +proamendment +proamnion +proamniotic +proamusement +proanaphora +proanaphoral +proanarchic +proangiosperm +proangiospermic +proangiospermous +proanimistic +proannexation +proannexationist +proantarctic +proanthropos +proapostolic +proappointment +proapportionment +proappreciation +proappropriation +proapproval +proaquatic +proarbitration +proarbitrationist +proarchery +proarctic +proaristocratic +proarmy +Proarthri +proassessment +proassociation +proatheist +proatheistic +proathletic +proatlas +proattack +proattendance +proauction +proaudience +proaulion +proauthor +proauthority +proautomobile +proavian +proaviation +Proavis +proaward +prob +probabiliorism +probabiliorist +probabilism +probabilist +probabilistic +probability +probabilize +probabl +probable +probableness +probably +probachelor +probal +proballoon +probang +probanishment +probankruptcy +probant +probargaining +probaseball +probasketball +probate +probathing +probatical +probation +probational +probationary +probationer +probationerhood +probationership +probationism +probationist +probationship +probative +probatively +probator +probatory +probattle +probattleship +probe +probeable +probeer +prober +probetting +probiology +probituminous +probity +problem +problematic +problematical +problematically +problematist +problematize +problemdom +problemist +problemistic +problemize +problemwise +problockade +probonding +probonus +proborrowing +proboscidal +proboscidate +Proboscidea +proboscidean +proboscideous +proboscides +proboscidial +proboscidian +proboscidiferous +proboscidiform +probosciform +probosciformed +Probosciger +proboscis +proboscislike +probouleutic +proboulevard +probowling +proboxing +proboycott +probrick +probridge +probroadcasting +probudget +probudgeting +probuilding +probusiness +probuying +procacious +procaciously +procacity +procaine +procambial +procambium +procanal +procancellation +procapital +procapitalism +procapitalist +procarnival +procarp +procarpium +procarrier +procatalectic +procatalepsis +procatarctic +procatarxis +procathedral +Procavia +Procaviidae +procedendo +procedural +procedure +proceed +proceeder +proceeding +proceeds +proceleusmatic +Procellaria +procellarian +procellarid +Procellariidae +Procellariiformes +procellariine +procellas +procello +procellose +procellous +procensorship +procensure +procentralization +procephalic +procercoid +procereal +procerebral +procerebrum +proceremonial +proceremonialism +proceremonialist +proceres +procerite +proceritic +procerity +procerus +process +processal +procession +processional +processionalist +processionally +processionary +processioner +processionist +processionize +processionwise +processive +processor +processual +procharity +prochein +prochemical +prochlorite +prochondral +prochoos +prochordal +prochorion +prochorionic +prochromosome +prochronic +prochronism +prochronize +prochurch +prochurchian +procidence +procident +procidentia +procivic +procivilian +procivism +proclaim +proclaimable +proclaimant +proclaimer +proclaiming +proclaimingly +proclamation +proclamator +proclamatory +proclassic +proclassical +proclergy +proclerical +proclericalism +procline +proclisis +proclitic +proclive +proclivitous +proclivity +proclivous +proclivousness +Procne +procnemial +Procoelia +procoelia +procoelian +procoelous +procoercive +procollectivistic +procollegiate +procombat +procombination +procomedy +procommemoration +procomment +procommercial +procommission +procommittee +procommunal +procommunism +procommunist +procommutation +procompensation +procompetition +procompromise +procompulsion +proconcentration +proconcession +proconciliation +procondemnation +proconfederationist +proconference +proconfession +proconfessionist +proconfiscation +proconformity +Proconnesian +proconquest +proconscription +proconscriptive +proconservation +proconservationist +proconsolidation +proconstitutional +proconstitutionalism +proconsul +proconsular +proconsulary +proconsulate +proconsulship +proconsultation +procontinuation +proconvention +proconventional +proconviction +procoracoid +procoracoidal +procorporation +procosmetic +procosmopolitan +procotton +procourt +procrastinate +procrastinating +procrastinatingly +procrastination +procrastinative +procrastinatively +procrastinator +procrastinatory +procreant +procreate +procreation +procreative +procreativeness +procreator +procreatory +procreatress +procreatrix +procremation +Procris +procritic +procritique +Procrustean +Procrusteanism +Procrusteanize +Procrustes +procrypsis +procryptic +procryptically +proctal +proctalgia +proctalgy +proctatresia +proctatresy +proctectasia +proctectomy +procteurynter +proctitis +proctocele +proctoclysis +proctocolitis +proctocolonoscopy +proctocystoplasty +proctocystotomy +proctodaeal +proctodaeum +proctodynia +proctoelytroplastic +proctologic +proctological +proctologist +proctology +proctoparalysis +proctoplastic +proctoplasty +proctoplegia +proctopolypus +proctoptoma +proctoptosis +proctor +proctorage +proctoral +proctorial +proctorially +proctorical +proctorization +proctorize +proctorling +proctorrhagia +proctorrhaphy +proctorrhea +proctorship +proctoscope +proctoscopic +proctoscopy +proctosigmoidectomy +proctosigmoiditis +proctospasm +proctostenosis +proctostomy +proctotome +proctotomy +proctotresia +proctotrypid +Proctotrypidae +proctotrypoid +Proctotrypoidea +proctovalvotomy +Proculian +procumbent +procurable +procuracy +procural +procurance +procurate +procuration +procurative +procurator +procuratorate +procuratorial +procuratorship +procuratory +procuratrix +procure +procurement +procurer +procuress +procurrent +procursive +procurvation +procurved +Procyon +Procyonidae +procyoniform +Procyoniformia +Procyoninae +procyonine +proczarist +prod +prodatary +prodder +proddle +prodecoration +prodefault +prodefiance +prodelay +prodelision +prodemocratic +Prodenia +prodenominational +prodentine +prodeportation +prodespotic +prodespotism +prodialogue +prodigal +prodigalish +prodigalism +prodigality +prodigalize +prodigally +prodigiosity +prodigious +prodigiously +prodigiousness +prodigus +prodigy +prodisarmament +prodisplay +prodissoconch +prodissolution +prodistribution +prodition +proditorious +proditoriously +prodivision +prodivorce +prodproof +prodramatic +prodroma +prodromal +prodromatic +prodromatically +prodrome +prodromic +prodromous +prodromus +producal +produce +produceable +produceableness +produced +producent +producer +producership +producibility +producible +producibleness +product +producted +productibility +productible +productid +Productidae +productile +production +productional +productionist +productive +productively +productiveness +productivity +productoid +productor +productory +productress +Productus +proecclesiastical +proeconomy +proeducation +proeducational +proegumenal +proelectric +proelectrical +proelectrification +proelectrocution +proelimination +proem +proembryo +proembryonic +proemial +proemium +proemployee +proemptosis +proenforcement +proenlargement +proenzym +proenzyme +proepimeron +proepiscopist +proepisternum +proequality +proethical +proethnic +proethnically +proetid +Proetidae +Proetus +proevolution +proevolutionist +proexamination +proexecutive +proexemption +proexercise +proexperiment +proexpert +proexporting +proexposure +proextension +proextravagance +prof +profaculty +profanable +profanableness +profanably +profanation +profanatory +profanchise +profane +profanely +profanement +profaneness +profaner +profanism +profanity +profanize +profarmer +profection +profectional +profectitious +profederation +profeminism +profeminist +proferment +profert +profess +professable +professed +professedly +profession +professional +professionalism +professionalist +professionality +professionalization +professionalize +professionally +professionist +professionize +professionless +professive +professively +professor +professorate +professordom +professoress +professorial +professorialism +professorially +professoriate +professorlike +professorling +professorship +professory +proffer +profferer +proficience +proficiency +proficient +proficiently +proficientness +profiction +proficuous +proficuously +profile +profiler +profilist +profilograph +profit +profitability +profitable +profitableness +profitably +profiteer +profiteering +profiter +profiting +profitless +profitlessly +profitlessness +profitmonger +profitmongering +profitproof +proflated +proflavine +profligacy +profligate +profligately +profligateness +profligation +proflogger +profluence +profluent +profluvious +profluvium +proforeign +profound +profoundly +profoundness +profraternity +profugate +profulgent +profunda +profundity +profuse +profusely +profuseness +profusion +profusive +profusively +profusiveness +prog +progambling +progamete +progamic +proganosaur +Proganosauria +progenerate +progeneration +progenerative +progenital +progenitive +progenitiveness +progenitor +progenitorial +progenitorship +progenitress +progenitrix +progeniture +progenity +progeny +progeotropic +progeotropism +progeria +progermination +progestational +progesterone +progestin +progger +proglottic +proglottid +proglottidean +proglottis +prognathi +prognathic +prognathism +prognathous +prognathy +progne +prognose +prognosis +prognostic +prognosticable +prognostically +prognosticate +prognostication +prognosticative +prognosticator +prognosticatory +progoneate +progospel +progovernment +program +programist +programistic +programma +programmar +programmatic +programmatically +programmatist +programmer +progrede +progrediency +progredient +progress +progresser +progression +progressional +progressionally +progressionary +progressionism +progressionist +progressism +progressist +progressive +progressively +progressiveness +progressivism +progressivist +progressivity +progressor +proguardian +Progymnasium +progymnosperm +progymnospermic +progymnospermous +progypsy +prohaste +prohibit +prohibiter +prohibition +prohibitionary +prohibitionism +prohibitionist +prohibitive +prohibitively +prohibitiveness +prohibitor +prohibitorily +prohibitory +proholiday +prohostility +prohuman +prohumanistic +prohydrotropic +prohydrotropism +proidealistic +proimmunity +proinclusion +proincrease +proindemnity +proindustrial +proinjunction +proinnovationist +proinquiry +proinsurance +prointervention +proinvestment +proirrigation +projacient +project +projectable +projectedly +projectile +projecting +projectingly +projection +projectional +projectionist +projective +projectively +projectivity +projector +projectress +projectrix +projecture +projicience +projicient +projiciently +projournalistic +projudicial +proke +prokeimenon +proker +prokindergarten +proklausis +prolabium +prolabor +prolacrosse +prolactin +prolamin +prolan +prolapse +prolapsus +prolarva +prolarval +prolate +prolately +prolateness +prolation +prolative +prolatively +proleague +proleaguer +prolectite +proleg +prolegate +prolegislative +prolegomena +prolegomenal +prolegomenary +prolegomenist +prolegomenon +prolegomenous +proleniency +prolepsis +proleptic +proleptical +proleptically +proleptics +proletairism +proletarian +proletarianism +proletarianization +proletarianize +proletarianly +proletarianness +proletariat +proletariatism +proletarization +proletarize +proletary +proletcult +proleucocyte +proleukocyte +prolicense +prolicidal +prolicide +proliferant +proliferate +proliferation +proliferative +proliferous +proliferously +prolific +prolificacy +prolifical +prolifically +prolificalness +prolificate +prolification +prolificity +prolificly +prolificness +prolificy +prolify +proligerous +proline +proliquor +proliterary +proliturgical +proliturgist +prolix +prolixity +prolixly +prolixness +prolocution +prolocutor +prolocutorship +prolocutress +prolocutrix +prologist +prologize +prologizer +prologos +prologue +prologuelike +prologuer +prologuist +prologuize +prologuizer +prologus +prolong +prolongable +prolongableness +prolongably +prolongate +prolongation +prolonge +prolonger +prolongment +prolusion +prolusionize +prolusory +prolyl +promachinery +promachos +promagisterial +promagistracy +promagistrate +promajority +promammal +Promammalia +promammalian +promarriage +promatrimonial +promatrimonialist +promaximum +promemorial +promenade +promenader +promenaderess +promercantile +promercy +promerger +promeristem +promerit +promeritor +Promethea +Promethean +Prometheus +promethium +promic +promilitarism +promilitarist +promilitary +prominence +prominency +prominent +prominently +prominimum +proministry +prominority +promisable +promiscuity +promiscuous +promiscuously +promiscuousness +promise +promisee +promiseful +promiseless +promisemonger +promiseproof +promiser +promising +promisingly +promisingness +promisor +promissionary +promissive +promissor +promissorily +promissory +promitosis +promittor +promnesia +promoderation +promoderationist +promodernist +promodernistic +promonarchic +promonarchical +promonarchicalness +promonarchist +promonopolist +promonopoly +promontoried +promontory +promoral +promorph +promorphological +promorphologically +promorphologist +promorphology +promotable +promote +promotement +promoter +promotion +promotional +promotive +promotiveness +promotor +promotorial +promotress +promotrix +promovable +promovent +prompt +promptbook +prompter +promptitude +promptive +promptly +promptness +promptress +promptuary +prompture +promulgate +promulgation +promulgator +promulge +promulger +promuscidate +promuscis +promycelial +promycelium +promythic +pronaos +pronate +pronation +pronational +pronationalism +pronationalist +pronationalistic +pronative +pronatoflexor +pronator +pronaval +pronavy +prone +pronegotiation +pronegro +pronegroism +pronely +proneness +pronephric +pronephridiostome +pronephron +pronephros +proneur +prong +prongbuck +pronged +pronger +pronghorn +pronglike +pronic +pronograde +pronominal +pronominalize +pronominally +pronomination +pronotal +pronotum +pronoun +pronounal +pronounce +pronounceable +pronounced +pronouncedly +pronouncement +pronounceness +pronouncer +pronpl +pronto +Pronuba +pronuba +pronubial +pronuclear +pronucleus +pronumber +pronunciability +pronunciable +pronuncial +pronunciamento +pronunciation +pronunciative +pronunciator +pronunciatory +pronymph +pronymphal +proo +prooemiac +prooemion +prooemium +proof +proofer +proofful +proofing +proofless +prooflessly +proofness +proofread +proofreader +proofreading +proofroom +proofy +prop +propadiene +propaedeutic +propaedeutical +propaedeutics +propagability +propagable +propagableness +propagand +propaganda +propagandic +propagandism +propagandist +propagandistic +propagandistically +propagandize +propagate +propagation +propagational +propagative +propagator +propagatory +propagatress +propago +propagulum +propale +propalinal +propane +propanedicarboxylic +propanol +propanone +propapist +proparasceve +propargyl +propargylic +Proparia +proparian +proparliamental +proparoxytone +proparoxytonic +proparticipation +propatagial +propatagian +propatagium +propatriotic +propatriotism +propatronage +propayment +propellable +propellant +propellent +propeller +propelment +propend +propendent +propene +propenoic +propense +propensely +propenseness +propension +propensitude +propensity +propenyl +propenylic +proper +properispome +properispomenon +properitoneal +properly +properness +propertied +property +propertyless +propertyship +propessimism +propessimist +prophase +prophasis +prophecy +prophecymonger +prophesiable +prophesier +prophesy +prophet +prophetess +prophethood +prophetic +prophetical +propheticality +prophetically +propheticalness +propheticism +propheticly +prophetism +prophetize +prophetless +prophetlike +prophetry +prophetship +prophilosophical +prophloem +prophoric +prophototropic +prophototropism +prophylactic +prophylactical +prophylactically +prophylaxis +prophylaxy +prophyll +prophyllum +propination +propine +propinoic +propinquant +propinque +propinquity +propinquous +propiolaldehyde +propiolate +propiolic +propionate +propione +Propionibacterieae +Propionibacterium +propionic +propionitril +propionitrile +propionyl +Propithecus +propitiable +propitial +propitiate +propitiatingly +propitiation +propitiative +propitiator +propitiatorily +propitiatory +propitious +propitiously +propitiousness +proplasm +proplasma +proplastic +propless +propleural +propleuron +proplex +proplexus +Propliopithecus +propodeal +propodeon +propodeum +propodial +propodiale +propodite +propoditic +propodium +propolis +propolitical +propolization +propolize +propone +proponement +proponent +proponer +propons +Propontic +propooling +propopery +proportion +proportionability +proportionable +proportionableness +proportionably +proportional +proportionalism +proportionality +proportionally +proportionate +proportionately +proportionateness +proportioned +proportioner +proportionless +proportionment +proposable +proposal +proposant +propose +proposer +proposition +propositional +propositionally +propositionize +propositus +propound +propounder +propoundment +propoxy +proppage +propper +propraetor +propraetorial +propraetorian +proprecedent +propriation +proprietage +proprietarian +proprietariat +proprietarily +proprietary +proprietor +proprietorial +proprietorially +proprietorship +proprietory +proprietous +proprietress +proprietrix +propriety +proprioception +proprioceptive +proprioceptor +propriospinal +proprium +proprivilege +proproctor +proprofit +proprovincial +proprovost +props +propterygial +propterygium +proptosed +proptosis +propublication +propublicity +propugnacled +propugnaculum +propugnation +propugnator +propugner +propulsation +propulsatory +propulsion +propulsity +propulsive +propulsor +propulsory +propunishment +propupa +propupal +propurchase +Propus +propwood +propygidium +propyl +propylacetic +propylaeum +propylamine +propylation +propylene +propylic +propylidene +propylite +propylitic +propylitization +propylon +propyne +propynoic +proquaestor +proracing +prorailroad +prorata +proratable +prorate +proration +prore +proreader +prorealism +prorealist +prorealistic +proreality +prorean +prorebate +prorebel +prorecall +proreciprocation +prorecognition +proreconciliation +prorector +prorectorate +proredemption +proreduction +proreferendum +proreform +proreformist +proregent +prorelease +Proreptilia +proreptilian +proreption +prorepublican +proresearch +proreservationist +proresignation +prorestoration +prorestriction +prorevision +prorevisionist +prorevolution +prorevolutionary +prorevolutionist +prorhinal +Prorhipidoglossomorpha +proritual +proritualistic +prorogate +prorogation +prorogator +prorogue +proroguer +proromance +proromantic +proromanticism +proroyal +proroyalty +prorrhesis +prorsad +prorsal +proruption +prosabbath +prosabbatical +prosacral +prosaic +prosaical +prosaically +prosaicalness +prosaicism +prosaicness +prosaism +prosaist +prosar +Prosarthri +prosateur +proscapula +proscapular +proscenium +proscholastic +proschool +proscientific +proscolecine +proscolex +proscribable +proscribe +proscriber +proscript +proscription +proscriptional +proscriptionist +proscriptive +proscriptively +proscriptiveness +proscutellar +proscutellum +proscynemata +prose +prosecrecy +prosecretin +prosect +prosection +prosector +prosectorial +prosectorium +prosectorship +prosecutable +prosecute +prosecution +prosecutor +prosecutrix +proselenic +proselike +proselyte +proselyter +proselytical +proselytingly +proselytism +proselytist +proselytistic +proselytization +proselytize +proselytizer +proseman +proseminar +proseminary +proseminate +prosemination +prosencephalic +prosencephalon +prosenchyma +prosenchymatous +proseneschal +proser +Proserpinaca +prosethmoid +proseucha +proseuche +prosification +prosifier +prosify +prosiliency +prosilient +prosiliently +prosilverite +prosily +Prosimiae +prosimian +prosiness +prosing +prosingly +prosiphon +prosiphonal +prosiphonate +prosish +prosist +proslambanomenos +proslave +proslaver +proslavery +proslaveryism +prosneusis +proso +prosobranch +Prosobranchia +Prosobranchiata +prosobranchiate +prosocele +prosodal +prosode +prosodemic +prosodetic +prosodiac +prosodiacal +prosodiacally +prosodial +prosodially +prosodian +prosodic +prosodical +prosodically +prosodion +prosodist +prosodus +prosody +prosogaster +prosogyrate +prosogyrous +prosoma +prosomal +prosomatic +prosonomasia +prosopalgia +prosopalgic +prosopantritis +prosopectasia +prosophist +prosopic +prosopically +Prosopis +prosopite +Prosopium +prosoplasia +prosopography +prosopon +prosoponeuralgia +prosopoplegia +prosopoplegic +prosopopoeia +prosopopoeial +prosoposchisis +prosopospasm +prosopotocia +prosopyl +prosopyle +prosorus +prospect +prospection +prospective +prospectively +prospectiveness +prospectless +prospector +prospectus +prospectusless +prospeculation +prosper +prosperation +prosperity +prosperous +prosperously +prosperousness +prospicience +prosporangium +prosport +pross +prossy +prostatauxe +prostate +prostatectomy +prostatelcosis +prostatic +prostaticovesical +prostatism +prostatitic +prostatitis +prostatocystitis +prostatocystotomy +prostatodynia +prostatolith +prostatomegaly +prostatometer +prostatomyomectomy +prostatorrhea +prostatorrhoea +prostatotomy +prostatovesical +prostatovesiculectomy +prostatovesiculitis +prostemmate +prostemmatic +prosternal +prosternate +prosternum +prostheca +prosthenic +prosthesis +prosthetic +prosthetically +prosthetics +prosthetist +prosthion +prosthionic +prosthodontia +prosthodontist +Prostigmin +prostitute +prostitutely +prostitution +prostitutor +prostomial +prostomiate +prostomium +prostrate +prostration +prostrative +prostrator +prostrike +prostyle +prostylos +prosubmission +prosubscription +prosubstantive +prosubstitution +prosuffrage +prosupervision +prosupport +prosurgical +prosurrender +prosy +prosyllogism +prosyndicalism +prosyndicalist +protactic +protactinium +protagon +protagonism +protagonist +Protagorean +Protagoreanism +protalbumose +protamine +protandric +protandrism +protandrous +protandrously +protandry +protanomal +protanomalous +protanope +protanopia +protanopic +protargentum +protargin +Protargol +protariff +protarsal +protarsus +protasis +protaspis +protatic +protatically +protax +protaxation +protaxial +protaxis +prote +Protea +protea +Proteaceae +proteaceous +protead +protean +proteanly +proteanwise +protease +protechnical +protect +protectant +protectible +protecting +protectingly +protectingness +protection +protectional +protectionate +protectionism +protectionist +protectionize +protectionship +protective +protectively +protectiveness +Protectograph +protector +protectoral +protectorate +protectorial +protectorian +protectorless +protectorship +protectory +protectress +protectrix +protege +protegee +protegulum +proteic +Proteida +Proteidae +proteide +proteidean +proteidogenous +proteiform +protein +proteinaceous +proteinase +proteinic +proteinochromogen +proteinous +proteinuria +Proteles +Protelidae +Protelytroptera +protelytropteran +protelytropteron +protelytropterous +protemperance +protempirical +protemporaneous +protend +protension +protensity +protensive +protensively +proteoclastic +proteogenous +proteolysis +proteolytic +proteopectic +proteopexic +proteopexis +proteopexy +proteosaurid +Proteosauridae +Proteosaurus +proteose +Proteosoma +proteosomal +proteosome +proteosuria +protephemeroid +Protephemeroidea +proterandrous +proterandrousness +proterandry +proteranthous +proterobase +proteroglyph +Proteroglypha +proteroglyphic +proteroglyphous +proterogynous +proterogyny +proterothesis +proterotype +Proterozoic +protervity +protest +protestable +protestancy +protestant +Protestantish +Protestantishly +protestantism +Protestantize +Protestantlike +Protestantly +protestation +protestator +protestatory +protester +protestingly +protestive +protestor +protetrarch +Proteus +protevangel +protevangelion +protevangelium +protext +prothalamia +prothalamion +prothalamium +prothallia +prothallial +prothallic +prothalline +prothallium +prothalloid +prothallus +protheatrical +protheca +prothesis +prothetic +prothetical +prothetically +prothonotarial +prothonotariat +prothonotary +prothonotaryship +prothoracic +prothorax +prothrift +prothrombin +prothrombogen +prothyl +prothysteron +protide +protiodide +protist +Protista +protistan +protistic +protistological +protistologist +protistology +protiston +Protium +protium +proto +protoactinium +protoalbumose +protoamphibian +protoanthropic +protoapostate +protoarchitect +Protoascales +Protoascomycetes +protobacco +Protobasidii +Protobasidiomycetes +protobasidiomycetous +protobasidium +protobishop +protoblast +protoblastic +protoblattoid +Protoblattoidea +Protobranchia +Protobranchiata +protobranchiate +protocalcium +protocanonical +Protocaris +protocaseose +protocatechualdehyde +protocatechuic +Protoceras +Protoceratidae +Protoceratops +protocercal +protocerebral +protocerebrum +protochemist +protochemistry +protochloride +protochlorophyll +Protochorda +Protochordata +protochordate +protochromium +protochronicler +protocitizen +protoclastic +protocneme +Protococcaceae +protococcaceous +protococcal +Protococcales +protococcoid +Protococcus +protocol +protocolar +protocolary +Protocoleoptera +protocoleopteran +protocoleopteron +protocoleopterous +protocolist +protocolization +protocolize +protoconch +protoconchal +protocone +protoconid +protoconule +protoconulid +protocopper +protocorm +protodeacon +protoderm +protodevil +Protodonata +protodonatan +protodonate +protodont +Protodonta +protodramatic +protodynastic +protoelastose +protoepiphyte +protoforaminifer +protoforester +protogaster +protogelatose +protogenal +protogenes +protogenesis +protogenetic +protogenic +protogenist +Protogeometric +protogine +protoglobulose +protogod +protogonous +protogospel +protograph +protogynous +protogyny +protohematoblast +Protohemiptera +protohemipteran +protohemipteron +protohemipterous +protoheresiarch +Protohippus +protohistorian +protohistoric +protohistory +protohomo +protohuman +Protohydra +protohydrogen +Protohymenoptera +protohymenopteran +protohymenopteron +protohymenopterous +protoiron +protoleration +protoleucocyte +protoleukocyte +protolithic +protoliturgic +protolog +protologist +protoloph +protoma +protomagister +protomagnate +protomagnesium +protomala +protomalal +protomalar +protomammal +protomammalian +protomanganese +protomartyr +Protomastigida +protome +protomeristem +protomerite +protomeritic +protometal +protometallic +protometaphrast +Protominobacter +Protomonadina +protomonostelic +protomorph +protomorphic +Protomycetales +protomyosinose +proton +protone +protonegroid +protonema +protonemal +protonematal +protonematoid +protoneme +Protonemertini +protonephridial +protonephridium +protonephros +protoneuron +protoneurone +protonic +protonickel +protonitrate +protonotater +protonym +protonymph +protonymphal +protopapas +protopappas +protoparent +protopathia +protopathic +protopathy +protopatriarchal +protopatrician +protopattern +protopectin +protopectinase +protopepsia +Protoperlaria +protoperlarian +protophilosophic +protophloem +protophyll +Protophyta +protophyte +protophytic +protopin +protopine +protoplasm +protoplasma +protoplasmal +protoplasmatic +protoplasmic +protoplast +protoplastic +protopod +protopodial +protopodite +protopoditic +protopoetic +protopope +protoporphyrin +protopragmatic +protopresbyter +protopresbytery +protoprism +protoproteose +protoprotestant +protopteran +Protopteridae +protopteridophyte +protopterous +Protopterus +protopyramid +protore +protorebel +protoreligious +protoreptilian +Protorohippus +protorosaur +Protorosauria +protorosaurian +Protorosauridae +protorosauroid +Protorosaurus +Protorthoptera +protorthopteran +protorthopteron +protorthopterous +protosalt +protosaurian +protoscientific +Protoselachii +protosilicate +protosilicon +protosinner +Protosiphon +Protosiphonaceae +protosiphonaceous +protosocial +protosolution +protospasm +Protosphargis +Protospondyli +protospore +Protostega +Protostegidae +protostele +protostelic +protostome +protostrontium +protosulphate +protosulphide +protosyntonose +prototaxites +prototheca +protothecal +prototheme +protothere +Prototheria +prototherian +prototitanium +Prototracheata +prototraitor +prototroch +prototrochal +prototrophic +prototypal +prototype +prototypic +prototypical +prototypically +prototypographer +prototyrant +protovanadium +protoveratrine +protovertebra +protovertebral +protovestiary +protovillain +protovum +protoxide +protoxylem +Protozoa +protozoacidal +protozoacide +protozoal +protozoan +protozoea +protozoean +protozoiasis +protozoic +protozoological +protozoologist +protozoology +protozoon +protozoonal +Protracheata +protracheate +protract +protracted +protractedly +protractedness +protracter +protractible +protractile +protractility +protraction +protractive +protractor +protrade +protradition +protraditional +protragedy +protragical +protragie +protransfer +protranslation +protransubstantiation +protravel +protreasurer +protreaty +Protremata +protreptic +protreptical +protriaene +protropical +protrudable +protrude +protrudent +protrusible +protrusile +protrusion +protrusive +protrusively +protrusiveness +protuberance +protuberancy +protuberant +protuberantial +protuberantly +protuberantness +protuberate +protuberosity +protuberous +Protura +proturan +protutor +protutory +protyl +protyle +Protylopus +protype +proudful +proudhearted +proudish +proudishly +proudling +proudly +proudness +prouniformity +prounion +prounionist +prouniversity +proustite +provability +provable +provableness +provably +provaccinist +provand +provant +provascular +prove +provect +provection +proved +proveditor +provedly +provedor +provedore +proven +provenance +Provencal +Provencalize +Provence +Provencial +provender +provenience +provenient +provenly +proventricular +proventricule +proventriculus +prover +proverb +proverbial +proverbialism +proverbialist +proverbialize +proverbially +proverbic +proverbiologist +proverbiology +proverbize +proverblike +provicar +provicariate +providable +providance +provide +provided +providence +provident +providential +providentialism +providentially +providently +providentness +provider +providing +providore +providoring +province +provincial +provincialate +provincialism +provincialist +provinciality +provincialization +provincialize +provincially +provincialship +provinciate +provinculum +provine +proving +provingly +provision +provisional +provisionality +provisionally +provisionalness +provisionary +provisioner +provisioneress +provisionless +provisionment +provisive +proviso +provisor +provisorily +provisorship +provisory +provitamin +provivisection +provivisectionist +provocant +provocation +provocational +provocative +provocatively +provocativeness +provocator +provocatory +provokable +provoke +provokee +provoker +provoking +provokingly +provokingness +provolunteering +provost +provostal +provostess +provostorial +provostry +provostship +prow +prowar +prowarden +prowaterpower +prowed +prowersite +prowess +prowessed +prowessful +prowl +prowler +prowling +prowlingly +proxenet +proxenete +proxenetism +proxenos +proxenus +proxeny +proxically +proximad +proximal +proximally +proximate +proximately +proximateness +proximation +proximity +proximo +proximobuccal +proximolabial +proximolingual +proxy +proxyship +proxysm +prozone +prozoning +prozygapophysis +prozymite +prude +prudelike +prudely +Prudence +prudence +prudent +prudential +prudentialism +prudentialist +prudentiality +prudentially +prudentialness +prudently +prudery +prudish +prudishly +prudishness +prudist +prudity +Prudy +Prue +pruh +pruinate +pruinescence +pruinose +pruinous +prulaurasin +prunable +prunableness +prunably +Prunaceae +prunase +prunasin +prune +prunell +Prunella +prunella +prunelle +Prunellidae +prunello +pruner +prunetin +prunetol +pruniferous +pruniform +pruning +prunitrin +prunt +prunted +Prunus +prurience +pruriency +prurient +pruriently +pruriginous +prurigo +pruriousness +pruritic +pruritus +prusiano +Prussian +Prussianism +Prussianization +Prussianize +Prussianizer +prussiate +prussic +Prussification +Prussify +prut +prutah +pry +pryer +prying +pryingly +pryingness +pryler +pryproof +pryse +prytaneum +prytanis +prytanize +prytany +psalis +psalm +psalmic +psalmist +psalmister +psalmistry +psalmless +psalmodial +psalmodic +psalmodical +psalmodist +psalmodize +psalmody +psalmograph +psalmographer +psalmography +psalmy +psaloid +psalter +psalterial +psalterian +psalterion +psalterist +psalterium +psaltery +psaltes +psaltress +psammite +psammitic +psammocarcinoma +psammocharid +Psammocharidae +psammogenous +psammolithic +psammologist +psammology +psammoma +psammophile +psammophilous +Psammophis +psammophyte +psammophytic +psammosarcoma +psammotherapy +psammous +Psaronius +pschent +Psedera +Pselaphidae +Pselaphus +psellism +psellismus +psephism +psephisma +psephite +psephitic +psephomancy +Psephurus +Psetta +pseudaconine +pseudaconitine +pseudacusis +pseudalveolar +pseudambulacral +pseudambulacrum +pseudamoeboid +pseudamphora +pseudandry +pseudangina +pseudankylosis +pseudaphia +pseudaposematic +pseudaposporous +pseudapospory +pseudapostle +pseudarachnidan +pseudarthrosis +pseudataxic +pseudatoll +pseudaxine +pseudaxis +Pseudechis +pseudelephant +pseudelminth +pseudelytron +pseudembryo +pseudembryonic +pseudencephalic +pseudencephalus +pseudepigraph +pseudepigrapha +pseudepigraphal +pseudepigraphic +pseudepigraphical +pseudepigraphous +pseudepigraphy +pseudepiploic +pseudepiploon +pseudepiscopacy +pseudepiscopy +pseudepisematic +pseudesthesia +pseudhalteres +pseudhemal +pseudimaginal +pseudimago +pseudisodomum +pseudo +pseudoacaccia +pseudoacademic +pseudoacademical +pseudoaccidental +pseudoacid +pseudoaconitine +pseudoacromegaly +pseudoadiabatic +pseudoaesthetic +pseudoaffectionate +pseudoalkaloid +pseudoalum +pseudoalveolar +pseudoamateurish +pseudoamatory +pseudoanaphylactic +pseudoanaphylaxis +pseudoanatomic +pseudoanatomical +pseudoancestral +pseudoanemia +pseudoanemic +pseudoangelic +pseudoangina +pseudoankylosis +pseudoanthorine +pseudoanthropoid +pseudoanthropological +pseudoanthropology +pseudoantique +pseudoapologetic +pseudoapoplectic +pseudoapoplexy +pseudoappendicitis +pseudoaquatic +pseudoarchaic +pseudoarchaism +pseudoarchaist +pseudoaristocratic +pseudoarthrosis +pseudoarticulation +pseudoartistic +pseudoascetic +pseudoastringent +pseudoasymmetrical +pseudoasymmetry +pseudoataxia +pseudobacterium +pseudobasidium +pseudobenevolent +pseudobenthonic +pseudobenthos +pseudobinary +pseudobiological +pseudoblepsia +pseudoblepsis +pseudobrachial +pseudobrachium +pseudobranch +pseudobranchia +pseudobranchial +pseudobranchiate +Pseudobranchus +pseudobrookite +pseudobrotherly +pseudobulb +pseudobulbar +pseudobulbil +pseudobulbous +pseudobutylene +pseudocandid +pseudocapitulum +pseudocarbamide +pseudocarcinoid +pseudocarp +pseudocarpous +pseudocartilaginous +pseudocele +pseudocelian +pseudocelic +pseudocellus +pseudocentric +pseudocentrous +pseudocentrum +Pseudoceratites +pseudoceratitic +pseudocercaria +pseudoceryl +pseudocharitable +pseudochemical +pseudochina +pseudochromesthesia +pseudochromia +pseudochromosome +pseudochronism +pseudochronologist +pseudochrysalis +pseudochrysolite +pseudochylous +pseudocirrhosis +pseudoclassic +pseudoclassical +pseudoclassicism +pseudoclerical +Pseudococcinae +Pseudococcus +pseudococtate +pseudocollegiate +pseudocolumella +pseudocolumellar +pseudocommissure +pseudocommisural +pseudocompetitive +pseudoconcha +pseudoconclude +pseudocone +pseudoconglomerate +pseudoconglomeration +pseudoconhydrine +pseudoconjugation +pseudoconservative +pseudocorneous +pseudocortex +pseudocosta +pseudocotyledon +pseudocotyledonal +pseudocritical +pseudocroup +pseudocrystalline +pseudocubic +pseudocultivated +pseudocultural +pseudocumene +pseudocumenyl +pseudocumidine +pseudocumyl +pseudocyclosis +pseudocyesis +pseudocyst +pseudodeltidium +pseudodementia +pseudodemocratic +pseudoderm +pseudodermic +pseudodiagnosis +pseudodiastolic +pseudodiphtheria +pseudodiphtheritic +pseudodipteral +pseudodipterally +pseudodipteros +pseudodont +pseudodox +pseudodoxal +pseudodoxy +pseudodramatic +pseudodysentery +pseudoedema +pseudoelectoral +pseudoembryo +pseudoembryonic +pseudoemotional +pseudoencephalitic +pseudoenthusiastic +pseudoephedrine +pseudoepiscopal +pseudoequalitarian +pseudoerotic +pseudoeroticism +pseudoerysipelas +pseudoerysipelatous +pseudoerythrin +pseudoethical +pseudoetymological +pseudoeugenics +pseudoevangelical +pseudofamous +pseudofarcy +pseudofeminine +pseudofever +pseudofeverish +pseudofilaria +pseudofilarian +pseudofinal +pseudofluctuation +pseudofluorescence +pseudofoliaceous +pseudoform +pseudofossil +pseudogalena +pseudoganglion +pseudogaseous +pseudogaster +pseudogastrula +pseudogeneral +pseudogeneric +pseudogenerous +pseudogenteel +pseudogenus +pseudogeometry +pseudogermanic +pseudogeusia +pseudogeustia +pseudoglanders +pseudoglioma +pseudoglobulin +pseudoglottis +pseudograph +pseudographeme +pseudographer +pseudographia +pseudographize +pseudography +pseudograsserie +Pseudogryphus +pseudogyne +pseudogynous +pseudogyny +pseudogyrate +pseudohallucination +pseudohallucinatory +pseudohalogen +pseudohemal +pseudohermaphrodite +pseudohermaphroditic +pseudohermaphroditism +pseudoheroic +pseudohexagonal +pseudohistoric +pseudohistorical +pseudoholoptic +pseudohuman +pseudohydrophobia +pseudohyoscyamine +pseudohypertrophic +pseudohypertrophy +pseudoidentical +pseudoimpartial +pseudoindependent +pseudoinfluenza +pseudoinsane +pseudoinsoluble +pseudoisatin +pseudoism +pseudoisomer +pseudoisomeric +pseudoisomerism +pseudoisotropy +pseudojervine +pseudolabial +pseudolabium +pseudolalia +Pseudolamellibranchia +Pseudolamellibranchiata +pseudolamellibranchiate +pseudolaminated +Pseudolarix +pseudolateral +pseudolatry +pseudolegal +pseudolegendary +pseudoleucite +pseudoleucocyte +pseudoleukemia +pseudoleukemic +pseudoliberal +pseudolichen +pseudolinguistic +pseudoliterary +pseudolobar +pseudological +pseudologically +pseudologist +pseudologue +pseudology +pseudolunule +pseudomalachite +pseudomalaria +pseudomancy +pseudomania +pseudomaniac +pseudomantic +pseudomantist +pseudomasculine +pseudomedical +pseudomedieval +pseudomelanosis +pseudomembrane +pseudomembranous +pseudomeningitis +pseudomenstruation +pseudomer +pseudomeric +pseudomerism +pseudomery +pseudometallic +pseudometameric +pseudometamerism +pseudomica +pseudomilitarist +pseudomilitaristic +pseudomilitary +pseudoministerial +pseudomiraculous +pseudomitotic +pseudomnesia +pseudomodern +pseudomodest +Pseudomonas +pseudomonastic +pseudomonoclinic +pseudomonocotyledonous +pseudomonocyclic +pseudomonotropy +pseudomoral +pseudomorph +pseudomorphia +pseudomorphic +pseudomorphine +pseudomorphism +pseudomorphose +pseudomorphosis +pseudomorphous +pseudomorula +pseudomorular +pseudomucin +pseudomucoid +pseudomultilocular +pseudomultiseptate +pseudomythical +pseudonarcotic +pseudonational +pseudonavicella +pseudonavicellar +pseudonavicula +pseudonavicular +pseudoneuropter +Pseudoneuroptera +pseudoneuropteran +pseudoneuropterous +pseudonitrole +pseudonitrosite +pseudonuclein +pseudonucleolus +pseudonychium +pseudonym +pseudonymal +pseudonymic +pseudonymity +pseudonymous +pseudonymously +pseudonymousness +pseudonymuncle +pseudonymuncule +pseudopapaverine +pseudoparalysis +pseudoparalytic +pseudoparaplegia +pseudoparasitic +pseudoparasitism +pseudoparenchyma +pseudoparenchymatous +pseudoparenchyme +pseudoparesis +pseudoparthenogenesis +pseudopatriotic +pseudopediform +pseudopelletierine +pseudopercular +pseudoperculate +pseudoperculum +pseudoperianth +pseudoperidium +pseudoperiodic +pseudoperipteral +pseudopermanent +pseudoperoxide +pseudoperspective +Pseudopeziza +pseudophallic +pseudophellandrene +pseudophenanthrene +pseudophenanthroline +pseudophenocryst +pseudophilanthropic +pseudophilosophical +Pseudophoenix +pseudopionnotes +pseudopious +pseudoplasm +pseudoplasma +pseudoplasmodium +pseudopneumonia +pseudopod +pseudopodal +pseudopodia +pseudopodial +pseudopodian +pseudopodiospore +pseudopodium +pseudopoetic +pseudopoetical +pseudopolitic +pseudopolitical +pseudopopular +pseudopore +pseudoporphyritic +pseudopregnancy +pseudopregnant +pseudopriestly +pseudoprimitive +pseudoprimitivism +pseudoprincely +pseudoproboscis +pseudoprofessional +pseudoprofessorial +pseudoprophetic +pseudoprophetical +pseudoprosperous +pseudopsia +pseudopsychological +pseudoptics +pseudoptosis +pseudopupa +pseudopupal +pseudopurpurin +pseudopyriform +pseudoquinol +pseudorabies +pseudoracemic +pseudoracemism +pseudoramose +pseudoramulus +pseudorealistic +pseudoreduction +pseudoreformed +pseudoregal +pseudoreligious +pseudoreminiscence +pseudorganic +pseudorheumatic +pseudorhombohedral +pseudoromantic +pseudorunic +pseudosacred +pseudosacrilegious +pseudosalt +pseudosatirical +pseudoscarlatina +Pseudoscarus +pseudoscholarly +pseudoscholastic +pseudoscientific +Pseudoscines +pseudoscinine +pseudosclerosis +pseudoscope +pseudoscopic +pseudoscopically +pseudoscopy +pseudoscorpion +Pseudoscorpiones +Pseudoscorpionida +pseudoscutum +pseudosematic +pseudosensational +pseudoseptate +pseudoservile +pseudosessile +pseudosiphonal +pseudosiphuncal +pseudoskeletal +pseudoskeleton +pseudoskink +pseudosmia +pseudosocial +pseudosocialistic +pseudosolution +pseudosoph +pseudosopher +pseudosophical +pseudosophist +pseudosophy +pseudospectral +pseudosperm +pseudospermic +pseudospermium +pseudospermous +pseudosphere +pseudospherical +pseudospiracle +pseudospiritual +pseudosporangium +pseudospore +pseudosquamate +pseudostalactite +pseudostalactitical +pseudostalagmite +pseudostalagmitical +pseudostereoscope +pseudostereoscopic +pseudostereoscopism +pseudostigma +pseudostigmatic +pseudostoma +pseudostomatous +pseudostomous +pseudostratum +pseudosubtle +Pseudosuchia +pseudosuchian +pseudosweating +pseudosyllogism +pseudosymmetric +pseudosymmetrical +pseudosymmetry +pseudosymptomatic +pseudosyphilis +pseudosyphilitic +pseudotabes +pseudotachylite +pseudotetanus +pseudotetragonal +Pseudotetramera +pseudotetrameral +pseudotetramerous +pseudotrachea +pseudotracheal +pseudotribal +pseudotributary +Pseudotrimera +pseudotrimeral +pseudotrimerous +pseudotropine +Pseudotsuga +pseudotubercular +pseudotuberculosis +pseudotuberculous +pseudoturbinal +pseudotyphoid +pseudoval +pseudovarian +pseudovary +pseudovelar +pseudovelum +pseudoventricle +pseudoviaduct +pseudoviperine +pseudoviscosity +pseudoviscous +pseudovolcanic +pseudovolcano +pseudovum +pseudowhorl +pseudoxanthine +pseudoyohimbine +pseudozealot +pseudozoea +pseudozoogloeal +psha +Pshav +pshaw +psi +Psidium +psilanthropic +psilanthropism +psilanthropist +psilanthropy +psiloceran +Psiloceras +psiloceratan +psiloceratid +Psiloceratidae +psiloi +psilology +psilomelane +psilomelanic +Psilophytales +psilophyte +Psilophyton +psilosis +psilosopher +psilosophy +Psilotaceae +psilotaceous +psilothrum +psilotic +Psilotum +psithurism +Psithyrus +psittaceous +psittaceously +Psittaci +Psittacidae +Psittaciformes +Psittacinae +psittacine +psittacinite +psittacism +psittacistic +Psittacomorphae +psittacomorphic +psittacosis +Psittacus +psoadic +psoas +psoatic +psocid +Psocidae +psocine +psoitis +psomophagic +psomophagist +psomophagy +psora +Psoralea +psoriasic +psoriasiform +psoriasis +psoriatic +psoriatiform +psoric +psoroid +Psorophora +psorophthalmia +psorophthalmic +Psoroptes +psoroptic +psorosis +psorosperm +psorospermial +psorospermiasis +psorospermic +psorospermiform +psorospermosis +psorous +pssimistical +pst +psych +psychagogic +psychagogos +psychagogue +psychagogy +psychal +psychalgia +psychanalysis +psychanalysist +psychanalytic +psychasthenia +psychasthenic +Psyche +psyche +Psychean +psycheometry +psychesthesia +psychesthetic +psychiasis +psychiater +psychiatria +psychiatric +psychiatrical +psychiatrically +psychiatrist +psychiatrize +psychiatry +psychic +psychical +psychically +Psychichthys +psychicism +psychicist +psychics +psychid +Psychidae +psychism +psychist +psychoanalysis +psychoanalyst +psychoanalytic +psychoanalytical +psychoanalytically +psychoanalyze +psychoanalyzer +psychoautomatic +psychobiochemistry +psychobiologic +psychobiological +psychobiology +psychobiotic +psychocatharsis +psychoclinic +psychoclinical +psychoclinicist +Psychoda +psychodiagnostics +Psychodidae +psychodispositional +psychodrama +psychodynamic +psychodynamics +psychoeducational +psychoepilepsy +psychoethical +psychofugal +psychogalvanic +psychogalvanometer +psychogenesis +psychogenetic +psychogenetical +psychogenetically +psychogenetics +psychogenic +psychogeny +psychognosis +psychognostic +psychognosy +psychogonic +psychogonical +psychogony +psychogram +psychograph +psychographer +psychographic +psychographist +psychography +psychoid +psychokinesia +psychokinesis +psychokinetic +psychokyme +psycholepsy +psycholeptic +psychologer +psychologian +psychologic +psychological +psychologically +psychologics +psychologism +psychologist +psychologize +psychologue +psychology +psychomachy +psychomancy +psychomantic +psychometer +psychometric +psychometrical +psychometrically +psychometrician +psychometrics +psychometrist +psychometrize +psychometry +psychomonism +psychomoral +psychomorphic +psychomorphism +psychomotility +psychomotor +psychon +psychoneural +psychoneurological +psychoneurosis +psychoneurotic +psychonomic +psychonomics +psychonomy +psychony +psychoorganic +psychopannychian +psychopannychism +psychopannychist +psychopannychistic +psychopannychy +psychopanychite +psychopath +psychopathia +psychopathic +psychopathist +psychopathologic +psychopathological +psychopathologist +psychopathy +psychopetal +psychophobia +psychophysic +psychophysical +psychophysically +psychophysicist +psychophysics +psychophysiologic +psychophysiological +psychophysiologically +psychophysiologist +psychophysiology +psychoplasm +psychopomp +psychopompos +psychorealism +psychorealist +psychorealistic +psychoreflex +psychorhythm +psychorhythmia +psychorhythmic +psychorhythmical +psychorhythmically +psychorrhagic +psychorrhagy +psychosarcous +psychosensorial +psychosensory +psychoses +psychosexual +psychosexuality +psychosexually +psychosis +psychosocial +psychosomatic +psychosomatics +psychosome +psychosophy +psychostasy +psychostatic +psychostatical +psychostatically +psychostatics +psychosurgeon +psychosurgery +psychosynthesis +psychosynthetic +psychotaxis +psychotechnical +psychotechnician +psychotechnics +psychotechnological +psychotechnology +psychotheism +psychotherapeutic +psychotherapeutical +psychotherapeutics +psychotherapeutist +psychotherapist +psychotherapy +psychotic +Psychotria +psychotrine +psychovital +Psychozoic +psychroesthesia +psychrograph +psychrometer +psychrometric +psychrometrical +psychrometry +psychrophile +psychrophilic +psychrophobia +psychrophore +psychrophyte +psychurgy +psykter +Psylla +psylla +psyllid +Psyllidae +psyllium +ptarmic +Ptarmica +ptarmical +ptarmigan +Ptelea +Ptenoglossa +ptenoglossate +Pteranodon +pteranodont +Pteranodontidae +pteraspid +Pteraspidae +Pteraspis +ptereal +pterergate +Pterian +pteric +Pterichthyodes +Pterichthys +pterideous +pteridium +pteridography +pteridoid +pteridological +pteridologist +pteridology +pteridophilism +pteridophilist +pteridophilistic +Pteridophyta +pteridophyte +pteridophytic +pteridophytous +pteridosperm +Pteridospermae +Pteridospermaphyta +pteridospermaphytic +pteridospermous +pterion +Pteris +Pterobranchia +pterobranchiate +pterocarpous +Pterocarpus +Pterocarya +Pterocaulon +Pterocera +Pteroceras +Pterocles +Pterocletes +Pteroclidae +Pteroclomorphae +pteroclomorphic +pterodactyl +Pterodactyli +pterodactylian +pterodactylic +pterodactylid +Pterodactylidae +pterodactyloid +pterodactylous +Pterodactylus +pterographer +pterographic +pterographical +pterography +pteroid +pteroma +pteromalid +Pteromalidae +Pteromys +pteropaedes +pteropaedic +pteropegal +pteropegous +pteropegum +pterophorid +Pterophoridae +Pterophorus +Pterophryne +pteropid +Pteropidae +pteropine +pteropod +Pteropoda +pteropodal +pteropodan +pteropodial +Pteropodidae +pteropodium +pteropodous +Pteropsida +Pteropus +pterosaur +Pterosauri +Pterosauria +pterosaurian +pterospermous +Pterospora +Pterostemon +Pterostemonaceae +pterostigma +pterostigmal +pterostigmatic +pterostigmatical +pterotheca +pterothorax +pterotic +pteroylglutamic +pterygial +pterygiophore +pterygium +pterygobranchiate +pterygode +pterygodum +Pterygogenea +pterygoid +pterygoidal +pterygoidean +pterygomalar +pterygomandibular +pterygomaxillary +pterygopalatal +pterygopalatine +pterygopharyngeal +pterygopharyngean +pterygophore +pterygopodium +pterygoquadrate +pterygosphenoid +pterygospinous +pterygostaphyline +Pterygota +pterygote +pterygotous +pterygotrabecular +Pterygotus +pteryla +pterylographic +pterylographical +pterylography +pterylological +pterylology +pterylosis +Ptilichthyidae +Ptiliidae +Ptilimnium +ptilinal +ptilinum +Ptilocercus +Ptilonorhynchidae +Ptilonorhynchinae +ptilopaedes +ptilopaedic +ptilosis +Ptilota +ptinid +Ptinidae +ptinoid +Ptinus +ptisan +ptochocracy +ptochogony +ptochology +Ptolemaean +Ptolemaian +Ptolemaic +Ptolemaical +Ptolemaism +Ptolemaist +Ptolemean +Ptolemy +ptomain +ptomaine +ptomainic +ptomatropine +ptosis +ptotic +ptyalagogic +ptyalagogue +ptyalectasis +ptyalin +ptyalism +ptyalize +ptyalocele +ptyalogenic +ptyalolith +ptyalolithiasis +ptyalorrhea +Ptychoparia +ptychoparid +ptychopariid +ptychopterygial +ptychopterygium +Ptychosperma +ptysmagogue +ptyxis +pu +pua +puan +pub +pubal +pubble +puberal +pubertal +pubertic +puberty +puberulent +puberulous +pubes +pubescence +pubescency +pubescent +pubian +pubic +pubigerous +pubiotomy +pubis +public +Publican +publican +publicanism +publication +publichearted +publicheartedness +publicism +publicist +publicity +publicize +publicly +publicness +Publilian +publish +publishable +publisher +publisheress +publishership +publishment +pubococcygeal +pubofemoral +puboiliac +puboischiac +puboischial +puboischiatic +puboprostatic +puborectalis +pubotibial +pubourethral +pubovesical +Puccinia +Pucciniaceae +pucciniaceous +puccinoid +puccoon +puce +pucelage +pucellas +pucelle +Puchanahua +pucherite +puchero +puck +pucka +puckball +pucker +puckerbush +puckerel +puckerer +puckermouth +puckery +puckfist +puckish +puckishly +puckishness +puckle +pucklike +puckling +puckneedle +puckrel +puckster +pud +puddee +puddening +pudder +pudding +puddingberry +puddinghead +puddingheaded +puddinghouse +puddinglike +puddingwife +puddingy +puddle +puddled +puddlelike +puddler +puddling +puddly +puddock +puddy +pudency +pudenda +pudendal +pudendous +pudendum +pudent +pudge +pudgily +pudginess +pudgy +pudiano +pudibund +pudibundity +pudic +pudical +pudicitia +pudicity +pudsey +pudsy +Pudu +pudu +pueblito +Pueblo +pueblo +Puebloan +puebloization +puebloize +Puelche +Puelchean +Pueraria +puerer +puericulture +puerile +puerilely +puerileness +puerilism +puerility +puerman +puerpera +puerperal +puerperalism +puerperant +puerperium +puerperous +puerpery +puff +puffback +puffball +puffbird +puffed +puffer +puffery +puffily +puffin +puffiness +puffinet +puffing +puffingly +Puffinus +pufflet +puffwig +puffy +pug +pugged +pugger +puggi +pugginess +pugging +puggish +puggle +puggree +puggy +pugh +pugil +pugilant +pugilism +pugilist +pugilistic +pugilistical +pugilistically +puglianite +pugman +pugmill +pugmiller +pugnacious +pugnaciously +pugnaciousness +pugnacity +Puinavi +Puinavian +Puinavis +puisne +puissance +puissant +puissantly +puissantness +puist +puistie +puja +Pujunan +puka +pukatea +pukateine +puke +pukeko +puker +pukeweed +Pukhtun +pukish +pukishness +pukras +puku +puky +pul +pulahan +pulahanism +pulasan +pulaskite +Pulaya +Pulayan +pulchrify +pulchritude +pulchritudinous +pule +pulegol +pulegone +puler +Pulex +pulghere +puli +Pulian +pulicarious +pulicat +pulicene +pulicid +Pulicidae +pulicidal +pulicide +pulicine +pulicoid +pulicose +pulicosity +pulicous +puling +pulingly +pulish +pulk +pulka +pull +pullable +pullback +pullboat +pulldevil +pulldoo +pulldown +pulldrive +pullen +puller +pullery +pullet +pulley +pulleyless +pulli +Pullman +Pullmanize +pullorum +pullulant +pullulate +pullulation +pullus +pulmobranchia +pulmobranchial +pulmobranchiate +pulmocardiac +pulmocutaneous +pulmogastric +pulmometer +pulmometry +pulmonal +pulmonar +Pulmonaria +pulmonarian +pulmonary +Pulmonata +pulmonate +pulmonated +pulmonectomy +pulmonic +pulmonifer +Pulmonifera +pulmoniferous +pulmonitis +Pulmotor +pulmotracheal +Pulmotrachearia +pulmotracheary +pulmotracheate +pulp +pulpaceous +pulpal +pulpalgia +pulpamenta +pulpboard +pulpectomy +pulpefaction +pulper +pulpifier +pulpify +pulpily +pulpiness +pulpit +pulpital +pulpitarian +pulpiteer +pulpiter +pulpitful +pulpitic +pulpitical +pulpitically +pulpitis +pulpitish +pulpitism +pulpitize +pulpitless +pulpitly +pulpitolatry +pulpitry +pulpless +pulplike +pulpotomy +pulpous +pulpousness +pulpstone +pulpwood +pulpy +pulque +pulsant +pulsatance +pulsate +pulsatile +pulsatility +Pulsatilla +pulsation +pulsational +pulsative +pulsatively +pulsator +pulsatory +pulse +pulseless +pulselessly +pulselessness +pulselike +pulsellum +pulsidge +pulsific +pulsimeter +pulsion +pulsive +pulsojet +pulsometer +pultaceous +pulton +pulu +pulveraceous +pulverant +pulverate +pulveration +pulvereous +pulverin +pulverizable +pulverizate +pulverization +pulverizator +pulverize +pulverizer +pulverous +pulverulence +pulverulent +pulverulently +pulvic +pulvil +pulvillar +pulvilliform +pulvillus +pulvinar +Pulvinaria +pulvinarian +pulvinate +pulvinated +pulvinately +pulvination +pulvinic +pulviniform +pulvino +pulvinule +pulvinulus +pulvinus +pulviplume +pulwar +puly +puma +Pume +pumicate +pumice +pumiced +pumiceous +pumicer +pumiciform +pumicose +pummel +pummice +pump +pumpable +pumpage +pumpellyite +pumper +pumpernickel +pumpkin +pumpkinification +pumpkinify +pumpkinish +pumpkinity +pumple +pumpless +pumplike +pumpman +pumpsman +pumpwright +pun +puna +punaise +punalua +punaluan +Punan +punatoo +punch +punchable +punchboard +puncheon +puncher +punchinello +punching +punchless +punchlike +punchproof +punchy +punct +punctal +punctate +punctated +punctation +punctator +puncticular +puncticulate +puncticulose +punctiform +punctiliar +punctilio +punctiliomonger +punctiliosity +punctilious +punctiliously +punctiliousness +punctist +punctographic +punctual +punctualist +punctuality +punctually +punctualness +punctuate +punctuation +punctuational +punctuationist +punctuative +punctuator +punctuist +punctulate +punctulated +punctulation +punctule +punctulum +punctum +puncturation +puncture +punctured +punctureless +punctureproof +puncturer +pundigrion +pundit +pundita +punditic +punditically +punditry +pundonor +pundum +puneca +pung +punga +pungapung +pungar +pungence +pungency +pungent +pungently +punger +pungey +pungi +pungle +pungled +Punic +Punica +Punicaceae +punicaceous +puniceous +punicial +punicin +punicine +punily +puniness +punish +punishability +punishable +punishableness +punishably +punisher +punishment +punishmentproof +punition +punitional +punitionally +punitive +punitively +punitiveness +punitory +Punjabi +punjum +punk +punkah +punketto +punkie +punkwood +punky +punless +punlet +punnable +punnage +punner +punnet +punnic +punnical +punnigram +punningly +punnology +Puno +punproof +punster +punstress +punt +punta +puntabout +puntal +puntel +punter +punti +puntil +puntist +Puntlatsh +punto +puntout +puntsman +punty +puny +punyish +punyism +pup +pupa +pupahood +pupal +puparial +puparium +pupate +pupation +pupelo +Pupidae +pupiferous +pupiform +pupigenous +pupigerous +pupil +pupilability +pupilage +pupilar +pupilate +pupildom +pupiled +pupilize +pupillarity +pupillary +pupilless +Pupillidae +pupillometer +pupillometry +pupilloscope +pupilloscoptic +pupilloscopy +Pupipara +pupiparous +Pupivora +pupivore +pupivorous +pupoid +puppet +puppetdom +puppeteer +puppethood +puppetish +puppetism +puppetize +puppetlike +puppetly +puppetman +puppetmaster +puppetry +puppify +puppily +Puppis +puppy +puppydom +puppyfish +puppyfoot +puppyhood +puppyish +puppyism +puppylike +puppysnatch +pupulo +Pupuluca +pupunha +Puquina +Puquinan +pur +purana +puranic +puraque +Purasati +Purbeck +Purbeckian +purblind +purblindly +purblindness +purchasability +purchasable +purchase +purchaser +purchasery +purdah +purdy +pure +pureblood +purebred +pured +puree +purehearted +purely +pureness +purer +purfle +purfled +purfler +purfling +purfly +purga +purgation +purgative +purgatively +purgatorial +purgatorian +purgatory +purge +purgeable +purger +purgery +purging +purificant +purification +purificative +purificator +purificatory +purifier +puriform +purify +purine +puriri +purism +purist +puristic +puristical +Puritan +puritandom +Puritaness +puritanic +puritanical +puritanically +puritanicalness +Puritanism +puritanism +Puritanize +Puritanizer +puritanlike +Puritanly +puritano +purity +Purkinje +Purkinjean +purl +purler +purlhouse +purlicue +purlieu +purlieuman +purlin +purlman +purloin +purloiner +purohepatitis +purolymph +puromucous +purpart +purparty +purple +purplelip +purplely +purpleness +purplescent +purplewood +purplewort +purplish +purplishness +purply +purport +purportless +purpose +purposedly +purposeful +purposefully +purposefulness +purposeless +purposelessly +purposelessness +purposelike +purposely +purposer +purposive +purposively +purposiveness +purposivism +purposivist +purposivistic +purpresture +purpura +purpuraceous +purpurate +purpure +purpureal +purpurean +purpureous +purpurescent +purpuric +purpuriferous +purpuriform +purpurigenous +purpurin +purpurine +purpuriparous +purpurite +purpurize +purpurogallin +purpurogenous +purpuroid +purpuroxanthin +purr +purre +purree +purreic +purrel +purrer +purring +purringly +purrone +purry +purse +pursed +purseful +purseless +purselike +purser +pursership +Purshia +pursily +pursiness +purslane +purslet +pursley +pursuable +pursual +pursuance +pursuant +pursuantly +pursue +pursuer +pursuit +pursuitmeter +pursuivant +pursy +purtenance +Puru +Puruha +purulence +purulency +purulent +purulently +puruloid +Purupuru +purusha +purushartha +purvey +purveyable +purveyal +purveyance +purveyancer +purveyor +purveyoress +purview +purvoe +purwannah +pus +Puschkinia +Puseyism +Puseyistical +Puseyite +push +pushball +pushcart +pusher +pushful +pushfully +pushfulness +pushing +pushingly +pushingness +pushmobile +pushover +pushpin +Pushtu +pushwainling +pusillanimity +pusillanimous +pusillanimously +pusillanimousness +puss +pusscat +pussley +pusslike +pussy +pussycat +pussyfoot +pussyfooted +pussyfooter +pussyfooting +pussyfootism +pussytoe +pustulant +pustular +pustulate +pustulated +pustulation +pustulatous +pustule +pustuled +pustulelike +pustuliform +pustulose +pustulous +put +putage +putamen +putaminous +putanism +putation +putationary +putative +putatively +putback +putchen +putcher +puteal +putelee +puther +puthery +putid +putidly +putidness +putlog +putois +Putorius +putredinal +putredinous +putrefacient +putrefactible +putrefaction +putrefactive +putrefactiveness +putrefiable +putrefier +putrefy +putresce +putrescence +putrescency +putrescent +putrescibility +putrescible +putrescine +putricide +putrid +putridity +putridly +putridness +putrifacted +putriform +putrilage +putrilaginous +putrilaginously +putschism +putschist +putt +puttee +putter +putterer +putteringly +puttier +puttock +putty +puttyblower +puttyhead +puttyhearted +puttylike +puttyroot +puttywork +puture +puxy +Puya +Puyallup +puzzle +puzzleation +puzzled +puzzledly +puzzledness +puzzledom +puzzlehead +puzzleheaded +puzzleheadedly +puzzleheadedness +puzzleman +puzzlement +puzzlepate +puzzlepated +puzzlepatedness +puzzler +puzzling +puzzlingly +puzzlingness +pya +pyal +pyarthrosis +pyche +Pycnanthemum +pycnia +pycnial +pycnid +pycnidia +pycnidial +pycnidiophore +pycnidiospore +pycnidium +pycniospore +pycnite +pycnium +Pycnocoma +pycnoconidium +pycnodont +Pycnodonti +Pycnodontidae +pycnodontoid +Pycnodus +pycnogonid +Pycnogonida +pycnogonidium +pycnogonoid +pycnometer +pycnometochia +pycnometochic +pycnomorphic +pycnomorphous +Pycnonotidae +Pycnonotinae +pycnonotine +Pycnonotus +pycnosis +pycnospore +pycnosporic +pycnostyle +pycnotic +pyelectasis +pyelic +pyelitic +pyelitis +pyelocystitis +pyelogram +pyelograph +pyelographic +pyelography +pyelolithotomy +pyelometry +pyelonephritic +pyelonephritis +pyelonephrosis +pyeloplasty +pyeloscopy +pyelotomy +pyeloureterogram +pyemesis +pyemia +pyemic +pygal +pygalgia +pygarg +pygargus +pygidial +pygidid +Pygididae +Pygidium +pygidium +pygmaean +Pygmalion +pygmoid +Pygmy +pygmy +pygmydom +pygmyhood +pygmyish +pygmyism +pygmyship +pygmyweed +Pygobranchia +Pygobranchiata +pygobranchiate +pygofer +pygopagus +pygopod +Pygopodes +Pygopodidae +pygopodine +pygopodous +Pygopus +pygostyle +pygostyled +pygostylous +pyic +pyin +pyjama +pyjamaed +pyke +pyknatom +pyknic +pyknotic +pyla +Pylades +pylagore +pylangial +pylangium +pylar +pylephlebitic +pylephlebitis +pylethrombophlebitis +pylethrombosis +pylic +pylon +pyloralgia +pylorectomy +pyloric +pyloristenosis +pyloritis +pylorocleisis +pylorodilator +pylorogastrectomy +pyloroplasty +pyloroptosis +pyloroschesis +pyloroscirrhus +pyloroscopy +pylorospasm +pylorostenosis +pylorostomy +pylorus +pyobacillosis +pyocele +pyoctanin +pyocyanase +pyocyanin +pyocyst +pyocyte +pyodermatitis +pyodermatosis +pyodermia +pyodermic +pyogenesis +pyogenetic +pyogenic +pyogenin +pyogenous +pyohemothorax +pyoid +pyolabyrinthitis +pyolymph +pyometra +pyometritis +pyonephritis +pyonephrosis +pyonephrotic +pyopericarditis +pyopericardium +pyoperitoneum +pyoperitonitis +pyophagia +pyophthalmia +pyophylactic +pyoplania +pyopneumocholecystitis +pyopneumocyst +pyopneumopericardium +pyopneumoperitoneum +pyopneumoperitonitis +pyopneumothorax +pyopoiesis +pyopoietic +pyoptysis +pyorrhea +pyorrheal +pyorrheic +pyosalpingitis +pyosalpinx +pyosepticemia +pyosepticemic +pyosis +pyospermia +pyotherapy +pyothorax +pyotoxinemia +pyoureter +pyovesiculosis +pyoxanthose +pyr +pyracanth +Pyracantha +Pyraceae +pyracene +pyral +Pyrales +pyralid +Pyralidae +pyralidan +pyralidid +Pyralididae +pyralidiform +Pyralidoidea +pyralis +pyraloid +Pyrameis +pyramid +pyramidaire +pyramidal +pyramidale +pyramidalis +Pyramidalism +Pyramidalist +pyramidally +pyramidate +Pyramidella +pyramidellid +Pyramidellidae +pyramider +pyramides +pyramidia +pyramidic +pyramidical +pyramidically +pyramidicalness +pyramidion +Pyramidist +pyramidize +pyramidlike +pyramidoattenuate +pyramidoidal +pyramidologist +pyramidoprismatic +pyramidwise +pyramoidal +pyran +pyranometer +pyranyl +pyrargyrite +Pyrausta +Pyraustinae +pyrazine +pyrazole +pyrazoline +pyrazolone +pyrazolyl +pyre +pyrectic +pyrena +pyrene +Pyrenean +pyrenematous +pyrenic +pyrenin +pyrenocarp +pyrenocarpic +pyrenocarpous +Pyrenochaeta +pyrenodean +pyrenodeine +pyrenodeous +pyrenoid +pyrenolichen +Pyrenomycetales +pyrenomycete +Pyrenomycetes +Pyrenomycetineae +pyrenomycetous +Pyrenopeziza +pyrethrin +Pyrethrum +pyrethrum +pyretic +pyreticosis +pyretogenesis +pyretogenetic +pyretogenic +pyretogenous +pyretography +pyretology +pyretolysis +pyretotherapy +pyrewinkes +Pyrex +pyrex +pyrexia +pyrexial +pyrexic +pyrexical +pyrgeometer +pyrgocephalic +pyrgocephaly +pyrgoidal +pyrgologist +pyrgom +pyrheliometer +pyrheliometric +pyrheliometry +pyrheliophor +pyribole +pyridazine +pyridic +pyridine +pyridinium +pyridinize +pyridone +pyridoxine +pyridyl +pyriform +pyriformis +pyrimidine +pyrimidyl +pyritaceous +pyrite +pyrites +pyritic +pyritical +pyritiferous +pyritization +pyritize +pyritohedral +pyritohedron +pyritoid +pyritology +pyritous +pyro +pyroacetic +pyroacid +pyroantimonate +pyroantimonic +pyroarsenate +pyroarsenic +pyroarsenious +pyroarsenite +pyrobelonite +pyrobituminous +pyroborate +pyroboric +pyrocatechin +pyrocatechinol +pyrocatechol +pyrocatechuic +pyrocellulose +pyrochemical +pyrochemically +pyrochlore +pyrochromate +pyrochromic +pyrocinchonic +pyrocitric +pyroclastic +pyrocoll +pyrocollodion +pyrocomenic +pyrocondensation +pyroconductivity +pyrocotton +pyrocrystalline +Pyrocystis +Pyrodine +pyroelectric +pyroelectricity +pyrogallate +pyrogallic +pyrogallol +pyrogen +pyrogenation +pyrogenesia +pyrogenesis +pyrogenetic +pyrogenetically +pyrogenic +pyrogenous +pyroglutamic +pyrognomic +pyrognostic +pyrognostics +pyrograph +pyrographer +pyrographic +pyrography +pyrogravure +pyroguaiacin +pyroheliometer +pyroid +Pyrola +Pyrolaceae +pyrolaceous +pyrolater +pyrolatry +pyroligneous +pyrolignic +pyrolignite +pyrolignous +pyrolite +pyrollogical +pyrologist +pyrology +pyrolusite +pyrolysis +pyrolytic +pyrolyze +pyromachy +pyromagnetic +pyromancer +pyromancy +pyromania +pyromaniac +pyromaniacal +pyromantic +pyromeconic +pyromellitic +pyrometallurgy +pyrometamorphic +pyrometamorphism +pyrometer +pyrometric +pyrometrical +pyrometrically +pyrometry +Pyromorphidae +pyromorphism +pyromorphite +pyromorphous +pyromotor +pyromucate +pyromucic +pyromucyl +pyronaphtha +pyrone +Pyronema +pyronine +pyronomics +pyronyxis +pyrope +pyropen +pyrophanite +pyrophanous +pyrophile +pyrophilous +pyrophobia +pyrophone +pyrophoric +pyrophorous +pyrophorus +pyrophosphate +pyrophosphoric +pyrophosphorous +pyrophotograph +pyrophotography +pyrophotometer +pyrophyllite +pyrophysalite +pyropuncture +pyropus +pyroracemate +pyroracemic +pyroscope +pyroscopy +pyrosis +pyrosmalite +Pyrosoma +Pyrosomatidae +pyrosome +Pyrosomidae +pyrosomoid +pyrosphere +pyrostat +pyrostereotype +pyrostilpnite +pyrosulphate +pyrosulphite +pyrosulphuric +pyrosulphuryl +pyrotantalate +pyrotartaric +pyrotartrate +pyrotechnian +pyrotechnic +pyrotechnical +pyrotechnically +pyrotechnician +pyrotechnics +pyrotechnist +pyrotechny +pyroterebic +pyrotheology +Pyrotheria +Pyrotherium +pyrotic +pyrotoxin +pyrotritaric +pyrotritartric +pyrouric +pyrovanadate +pyrovanadic +pyroxanthin +pyroxene +pyroxenic +pyroxenite +pyroxmangite +pyroxonium +pyroxyle +pyroxylene +pyroxylic +pyroxylin +Pyrrhic +pyrrhic +pyrrhichian +pyrrhichius +pyrrhicist +Pyrrhocoridae +Pyrrhonean +Pyrrhonian +Pyrrhonic +Pyrrhonism +Pyrrhonist +Pyrrhonistic +Pyrrhonize +pyrrhotine +pyrrhotism +pyrrhotist +pyrrhotite +pyrrhous +Pyrrhuloxia +Pyrrhus +pyrrodiazole +pyrrol +pyrrole +pyrrolic +pyrrolidine +pyrrolidone +pyrrolidyl +pyrroline +pyrrolylene +pyrrophyllin +pyrroporphyrin +pyrrotriazole +pyrroyl +pyrryl +pyrrylene +Pyrula +Pyrularia +pyruline +pyruloid +Pyrus +pyruvaldehyde +pyruvate +pyruvic +pyruvil +pyruvyl +pyrylium +Pythagorean +Pythagoreanism +Pythagoreanize +Pythagoreanly +Pythagoric +Pythagorical +Pythagorically +Pythagorism +Pythagorist +Pythagorize +Pythagorizer +Pythia +Pythiaceae +Pythiacystis +Pythiad +Pythiambic +Pythian +Pythic +Pythios +Pythium +Pythius +pythogenesis +pythogenetic +pythogenic +pythogenous +python +pythoness +pythonic +pythonical +pythonid +Pythonidae +pythoniform +Pythoninae +pythonine +pythonism +Pythonissa +pythonist +pythonize +pythonoid +pythonomorph +Pythonomorpha +pythonomorphic +pythonomorphous +pyuria +pyvuril +pyx +Pyxidanthera +pyxidate +pyxides +pyxidium +pyxie +Pyxis +pyxis +Q +q +qasida +qere +qeri +qintar +Qoheleth +qoph +qua +quab +quabird +quachil +quack +quackery +quackhood +quackish +quackishly +quackishness +quackism +quackle +quacksalver +quackster +quacky +quad +quadded +quaddle +Quader +Quadi +quadmeter +quadra +quadrable +quadragenarian +quadragenarious +Quadragesima +quadragesimal +quadragintesimal +quadral +quadrangle +quadrangled +quadrangular +quadrangularly +quadrangularness +quadrangulate +quadrans +quadrant +quadrantal +quadrantes +Quadrantid +quadrantile +quadrantlike +quadrantly +quadrat +quadrate +quadrated +quadrateness +quadratic +quadratical +quadratically +quadratics +Quadratifera +quadratiferous +quadratojugal +quadratomandibular +quadratosquamosal +quadratrix +quadratum +quadrature +quadratus +quadrauricular +quadrennia +quadrennial +quadrennially +quadrennium +quadriad +quadrialate +quadriannulate +quadriarticulate +quadriarticulated +quadribasic +quadric +quadricapsular +quadricapsulate +quadricarinate +quadricellular +quadricentennial +quadriceps +quadrichord +quadriciliate +quadricinium +quadricipital +quadricone +quadricorn +quadricornous +quadricostate +quadricotyledonous +quadricovariant +quadricrescentic +quadricrescentoid +quadricuspid +quadricuspidal +quadricuspidate +quadricycle +quadricycler +quadricyclist +quadridentate +quadridentated +quadriderivative +quadridigitate +quadriennial +quadriennium +quadrienniumutile +quadrifarious +quadrifariously +quadrifid +quadrifilar +quadrifocal +quadrifoil +quadrifoliate +quadrifoliolate +quadrifolious +quadrifolium +quadriform +quadrifrons +quadrifrontal +quadrifurcate +quadrifurcated +quadrifurcation +quadriga +quadrigabled +quadrigamist +quadrigate +quadrigatus +quadrigeminal +quadrigeminate +quadrigeminous +quadrigeminum +quadrigenarious +quadriglandular +quadrihybrid +quadrijugal +quadrijugate +quadrijugous +quadrilaminar +quadrilaminate +quadrilateral +quadrilaterally +quadrilateralness +quadrilingual +quadriliteral +quadrille +quadrilled +quadrillion +quadrillionth +quadrilobate +quadrilobed +quadrilocular +quadriloculate +quadrilogue +quadrilogy +quadrimembral +quadrimetallic +quadrimolecular +quadrimum +quadrinodal +quadrinomial +quadrinomical +quadrinominal +quadrinucleate +quadrioxalate +quadriparous +quadripartite +quadripartitely +quadripartition +quadripennate +quadriphosphate +quadriphyllous +quadripinnate +quadriplanar +quadriplegia +quadriplicate +quadriplicated +quadripolar +quadripole +quadriportico +quadriporticus +quadripulmonary +quadriquadric +quadriradiate +quadrireme +quadrisect +quadrisection +quadriseptate +quadriserial +quadrisetose +quadrispiral +quadristearate +quadrisulcate +quadrisulcated +quadrisulphide +quadrisyllabic +quadrisyllabical +quadrisyllable +quadrisyllabous +quadriternate +quadritubercular +quadrituberculate +quadriurate +quadrivalence +quadrivalency +quadrivalent +quadrivalently +quadrivalve +quadrivalvular +quadrivial +quadrivious +quadrivium +quadrivoltine +quadroon +quadrual +Quadrula +quadrum +Quadrumana +quadrumanal +quadrumane +quadrumanous +quadruped +quadrupedal +quadrupedan +quadrupedant +quadrupedantic +quadrupedantical +quadrupedate +quadrupedation +quadrupedism +quadrupedous +quadruplane +quadruplator +quadruple +quadrupleness +quadruplet +quadruplex +quadruplicate +quadruplication +quadruplicature +quadruplicity +quadruply +quadrupole +quaedam +Quaequae +quaesitum +quaestor +quaestorial +quaestorian +quaestorship +quaestuary +quaff +quaffer +quaffingly +quag +quagga +quagginess +quaggle +quaggy +quagmire +quagmiry +quahog +quail +quailberry +quailery +quailhead +quaillike +quaily +quaint +quaintance +quaintise +quaintish +quaintly +quaintness +Quaitso +quake +quakeful +quakeproof +Quaker +quaker +quakerbird +Quakerdom +Quakeress +Quakeric +Quakerish +Quakerishly +Quakerishness +Quakerism +Quakerization +Quakerize +Quakerlet +Quakerlike +Quakerly +Quakership +Quakery +quaketail +quakiness +quaking +quakingly +quaky +quale +qualifiable +qualification +qualificative +qualificator +qualificatory +qualified +qualifiedly +qualifiedness +qualifier +qualify +qualifyingly +qualimeter +qualitative +qualitatively +qualitied +quality +qualityless +qualityship +qualm +qualminess +qualmish +qualmishly +qualmishness +qualmproof +qualmy +qualmyish +qualtagh +Quamasia +Quamoclit +quan +quandary +quandong +quandy +quannet +quant +quanta +quantic +quantical +quantifiable +quantifiably +quantification +quantifier +quantify +quantimeter +quantitate +quantitative +quantitatively +quantitativeness +quantitied +quantitive +quantitively +quantity +quantivalence +quantivalency +quantivalent +quantization +quantize +quantometer +quantulum +quantum +Quapaw +quaquaversal +quaquaversally +quar +quarantinable +quarantine +quarantiner +quaranty +quardeel +quare +quarenden +quarender +quarentene +quark +quarl +quarle +quarred +quarrel +quarreled +quarreler +quarreling +quarrelingly +quarrelproof +quarrelsome +quarrelsomely +quarrelsomeness +quarriable +quarried +quarrier +quarry +quarryable +quarrying +quarryman +quarrystone +quart +quartan +quartane +quartation +quartenylic +quarter +quarterage +quarterback +quarterdeckish +quartered +quarterer +quartering +quarterization +quarterland +quarterly +quarterman +quartermaster +quartermasterlike +quartermastership +quartern +quarterpace +quarters +quartersaw +quartersawed +quarterspace +quarterstaff +quarterstetch +quartet +quartette +quartetto +quartful +quartic +quartile +quartine +quartiparous +quarto +Quartodeciman +quartodecimanism +quartole +quartz +quartzic +quartziferous +quartzite +quartzitic +quartzless +quartzoid +quartzose +quartzous +quartzy +quash +Quashee +quashey +quashy +quasi +quasijudicial +Quasimodo +quasky +quassation +quassative +Quassia +quassiin +quassin +quat +quata +quatch +quatercentenary +quatern +quaternal +quaternarian +quaternarius +quaternary +quaternate +quaternion +quaternionic +quaternionist +quaternitarian +quaternity +quaters +quatertenses +quatorzain +quatorze +quatrain +quatral +quatrayle +quatre +quatrefeuille +quatrefoil +quatrefoiled +quatrefoliated +quatrible +quatrin +quatrino +quatrocentism +quatrocentist +quatrocento +Quatsino +quattie +quattrini +quatuor +quatuorvirate +quauk +quave +quaver +quaverer +quavering +quaveringly +quaverous +quavery +quaverymavery +quaw +quawk +quay +quayage +quayful +quaylike +quayman +quayside +quaysider +qubba +queach +queachy +queak +queal +quean +queanish +queasily +queasiness +queasom +queasy +quebrachamine +quebrachine +quebrachitol +quebracho +quebradilla +Quechua +Quechuan +quedful +queechy +queen +queencake +queencraft +queencup +queendom +queenfish +queenhood +queening +queenite +queenless +queenlet +queenlike +queenliness +queenly +queenright +queenroot +queensberry +queenship +queenweed +queenwood +queer +queerer +queerish +queerishness +queerity +queerly +queerness +queersome +queery +queest +queesting +queet +queeve +quegh +quei +queintise +quelch +Quelea +quell +queller +quemado +queme +quemeful +quemefully +quemely +quench +quenchable +quenchableness +quencher +quenchless +quenchlessly +quenchlessness +quenelle +quenselite +quercetagetin +quercetic +quercetin +quercetum +quercic +Querciflorae +quercimeritrin +quercin +quercine +quercinic +quercitannic +quercitannin +quercite +quercitin +quercitol +quercitrin +quercitron +quercivorous +Quercus +Querecho +Querendi +Querendy +querent +Queres +querier +queriman +querimonious +querimoniously +querimoniousness +querimony +querist +querken +querl +quern +quernal +Quernales +quernstone +querulent +querulential +querulist +querulity +querulosity +querulous +querulously +querulousness +query +querying +queryingly +queryist +quesited +quesitive +quest +quester +questeur +questful +questingly +question +questionability +questionable +questionableness +questionably +questionary +questionee +questioner +questioningly +questionist +questionless +questionlessly +questionnaire +questionous +questionwise +questman +questor +questorial +questorship +quet +quetch +quetenite +quetzal +queue +quey +Quiangan +quiapo +quib +quibble +quibbleproof +quibbler +quibblingly +quiblet +quica +Quiche +quick +quickbeam +quickborn +quicken +quickenance +quickenbeam +quickener +quickfoot +quickhatch +quickhearted +quickie +quicklime +quickly +quickness +quicksand +quicksandy +quickset +quicksilver +quicksilvering +quicksilverish +quicksilverishness +quicksilvery +quickstep +quickthorn +quickwork +quid +Quidae +quiddative +quidder +Quiddist +quiddit +quidditative +quidditatively +quiddity +quiddle +quiddler +quidnunc +quiesce +quiescence +quiescency +quiescent +quiescently +quiet +quietable +quieten +quietener +quieter +quieting +quietism +quietist +quietistic +quietive +quietlike +quietly +quietness +quietsome +quietude +quietus +quiff +quiffing +Quiina +Quiinaceae +quiinaceous +quila +quiles +Quileute +quilkin +quill +Quillagua +quillai +quillaic +Quillaja +quillaja +quillback +quilled +quiller +quillet +quilleted +quillfish +quilling +quilltail +quillwork +quillwort +quilly +quilt +quilted +quilter +quilting +Quimbaya +Quimper +quin +quina +quinacrine +Quinaielt +quinaldic +quinaldine +quinaldinic +quinaldinium +quinaldyl +quinamicine +quinamidine +quinamine +quinanisole +quinaquina +quinarian +quinarius +quinary +quinate +quinatoxine +Quinault +quinazoline +quinazolyl +quince +quincentenary +quincentennial +quincewort +quinch +quincubital +quincubitalism +quincuncial +quincuncially +quincunx +quincunxial +quindecad +quindecagon +quindecangle +quindecasyllabic +quindecemvir +quindecemvirate +quindecennial +quindecim +quindecima +quindecylic +quindene +quinetum +quingentenary +quinhydrone +quinia +quinible +quinic +quinicine +quinidia +quinidine +quinin +quinina +quinine +quininiazation +quininic +quininism +quininize +quiniretin +quinisext +quinisextine +quinism +quinite +quinitol +quinizarin +quinize +quink +quinnat +quinnet +Quinnipiac +quinoa +quinocarbonium +quinoform +quinogen +quinoid +quinoidal +quinoidation +quinoidine +quinol +quinoline +quinolinic +quinolinium +quinolinyl +quinologist +quinology +quinolyl +quinometry +quinone +quinonediimine +quinonic +quinonimine +quinonization +quinonize +quinonoid +quinonyl +quinopyrin +quinotannic +quinotoxine +quinova +quinovatannic +quinovate +quinovic +quinovin +quinovose +quinoxaline +quinoxalyl +quinoyl +quinquagenarian +quinquagenary +Quinquagesima +quinquagesimal +quinquarticular +Quinquatria +Quinquatrus +quinquecapsular +quinquecostate +quinquedentate +quinquedentated +quinquefarious +quinquefid +quinquefoliate +quinquefoliated +quinquefoliolate +quinquegrade +quinquejugous +quinquelateral +quinqueliteral +quinquelobate +quinquelobated +quinquelobed +quinquelocular +quinqueloculine +quinquenary +quinquenerval +quinquenerved +quinquennalia +quinquennia +quinquenniad +quinquennial +quinquennialist +quinquennially +quinquennium +quinquepartite +quinquepedal +quinquepedalian +quinquepetaloid +quinquepunctal +quinquepunctate +quinqueradial +quinqueradiate +quinquereme +quinquertium +quinquesect +quinquesection +quinqueseptate +quinqueserial +quinqueseriate +quinquesyllabic +quinquesyllable +quinquetubercular +quinquetuberculate +quinquevalence +quinquevalency +quinquevalent +quinquevalve +quinquevalvous +quinquevalvular +quinqueverbal +quinqueverbial +quinquevir +quinquevirate +quinquiliteral +quinquina +quinquino +quinse +quinsied +quinsy +quinsyberry +quinsywort +quint +quintad +quintadena +quintadene +quintain +quintal +quintan +quintant +quintary +quintato +quinte +quintelement +quintennial +quinternion +quinteron +quinteroon +quintessence +quintessential +quintessentiality +quintessentially +quintessentiate +quintet +quintette +quintetto +quintic +quintile +Quintilis +Quintillian +quintillion +quintillionth +Quintin +quintin +quintiped +Quintius +quinto +quintocubital +quintocubitalism +quintole +quinton +quintroon +quintuple +quintuplet +quintuplicate +quintuplication +quintuplinerved +quintupliribbed +quintus +quinuclidine +quinyl +quinze +quinzieme +quip +quipful +quipo +quipper +quippish +quippishness +quippy +quipsome +quipsomeness +quipster +quipu +quira +quire +quirewise +Quirinal +Quirinalia +quirinca +quiritarian +quiritary +Quirite +Quirites +quirk +quirkiness +quirkish +quirksey +quirksome +quirky +quirl +quirquincho +quirt +quis +quisby +quiscos +quisle +quisling +Quisqualis +quisqueite +quisquilian +quisquiliary +quisquilious +quisquous +quisutsch +quit +quitch +quitclaim +quite +Quitemoca +Quiteno +quitrent +quits +quittable +quittance +quitted +quitter +quittor +Quitu +quiver +quivered +quiverer +quiverful +quivering +quiveringly +quiverish +quiverleaf +quivery +Quixote +quixotic +quixotical +quixotically +quixotism +quixotize +quixotry +quiz +quizzability +quizzable +quizzacious +quizzatorial +quizzee +quizzer +quizzery +quizzical +quizzicality +quizzically +quizzicalness +quizzification +quizzify +quizziness +quizzingly +quizzish +quizzism +quizzity +quizzy +Qung +quo +quod +quoddies +quoddity +quodlibet +quodlibetal +quodlibetarian +quodlibetary +quodlibetic +quodlibetical +quodlibetically +quoilers +quoin +quoined +quoining +quoit +quoiter +quoitlike +quoits +quondam +quondamly +quondamship +quoniam +quop +Quoratean +quorum +quot +quota +quotability +quotable +quotableness +quotably +quotation +quotational +quotationally +quotationist +quotative +quote +quotee +quoteless +quotennial +quoter +quoteworthy +quoth +quotha +quotidian +quotidianly +quotidianness +quotient +quotiety +quotingly +quotity +quotlibet +quotum +Qurti +R +r +ra +raad +raash +Rab +rab +raband +rabanna +rabat +rabatine +rabatte +rabattement +rabbanist +rabbanite +rabbet +rabbeting +rabbi +rabbin +rabbinate +rabbindom +Rabbinic +rabbinic +Rabbinica +rabbinical +rabbinically +rabbinism +rabbinist +rabbinistic +rabbinistical +rabbinite +rabbinize +rabbinship +rabbiship +rabbit +rabbitberry +rabbiter +rabbithearted +rabbitlike +rabbitmouth +rabbitproof +rabbitroot +rabbitry +rabbitskin +rabbitweed +rabbitwise +rabbitwood +rabbity +rabble +rabblelike +rabblement +rabbleproof +rabbler +rabblesome +rabboni +rabbonim +Rabelaisian +Rabelaisianism +Rabelaism +Rabi +rabic +rabid +rabidity +rabidly +rabidness +rabies +rabietic +rabific +rabiform +rabigenic +rabinet +rabirubia +rabitic +rabulistic +rabulous +raccoon +raccoonberry +raccroc +race +raceabout +racebrood +racecourse +racegoer +racegoing +racelike +racemate +racemation +raceme +racemed +racemic +racemiferous +racemiform +racemism +racemization +racemize +racemocarbonate +racemocarbonic +racemomethylate +racemose +racemosely +racemous +racemously +racemule +racemulose +racer +raceway +rach +rache +Rachel +rachial +rachialgia +rachialgic +rachianalgesia +Rachianectes +rachianesthesia +rachicentesis +rachides +rachidial +rachidian +rachiform +Rachiglossa +rachiglossate +rachigraph +rachilla +rachiocentesis +rachiococainize +rachiocyphosis +rachiodont +rachiodynia +rachiometer +rachiomyelitis +rachioparalysis +rachioplegia +rachioscoliosis +rachiotome +rachiotomy +rachipagus +rachis +rachischisis +rachitic +rachitis +rachitism +rachitogenic +rachitome +rachitomous +rachitomy +Rachycentridae +Rachycentron +racial +racialism +racialist +raciality +racialization +racialize +racially +racily +raciness +racing +racinglike +racism +racist +rack +rackabones +rackan +rackboard +racker +racket +racketeer +racketeering +racketer +racketing +racketlike +racketproof +racketry +rackett +rackettail +rackety +rackful +racking +rackingly +rackle +rackless +rackmaster +rackproof +rackrentable +rackway +rackwork +racloir +racon +raconteur +racoon +Racovian +racy +rad +rada +radar +radarman +radarscope +raddle +raddleman +raddlings +radectomy +radiability +radiable +radial +radiale +radialia +radiality +radialization +radialize +radially +radian +radiance +radiancy +radiant +radiantly +Radiata +radiate +radiated +radiately +radiateness +radiatics +radiatiform +radiation +radiational +radiative +radiatopatent +radiatoporose +radiatoporous +radiator +radiatory +radiatostriate +radiatosulcate +radiature +radical +radicalism +radicality +radicalization +radicalize +radically +radicalness +radicand +radicant +radicate +radicated +radicating +radication +radicel +radices +radicicola +radicicolous +radiciferous +radiciflorous +radiciform +radicivorous +radicle +radicolous +radicose +Radicula +radicular +radicule +radiculectomy +radiculitis +radiculose +radiectomy +radiescent +radiferous +radii +radio +radioacoustics +radioactinium +radioactivate +radioactive +radioactively +radioactivity +radioamplifier +radioanaphylaxis +radioautograph +radioautographic +radioautography +radiobicipital +radiobroadcast +radiobroadcaster +radiobroadcasting +radiobserver +radiocarbon +radiocarpal +radiocast +radiocaster +radiochemical +radiochemistry +radiocinematograph +radioconductor +radiode +radiodermatitis +radiodetector +radiodiagnosis +radiodigital +radiodontia +radiodontic +radiodontist +radiodynamic +radiodynamics +radioelement +radiogenic +radiogoniometer +radiogoniometric +radiogoniometry +radiogram +radiograph +radiographer +radiographic +radiographical +radiographically +radiography +radiohumeral +radioisotope +Radiolaria +radiolarian +radiolead +radiolite +Radiolites +radiolitic +Radiolitidae +radiolocation +radiolocator +radiologic +radiological +radiologist +radiology +radiolucency +radiolucent +radioluminescence +radioluminescent +radioman +radiomedial +radiometallography +radiometeorograph +radiometer +radiometric +radiometrically +radiometry +radiomicrometer +radiomovies +radiomuscular +radionecrosis +radioneuritis +radionics +radiopacity +radiopalmar +radiopaque +radiopelvimetry +radiophare +radiophone +radiophonic +radiophony +radiophosphorus +radiophotograph +radiophotography +radiopraxis +radioscope +radioscopic +radioscopical +radioscopy +radiosensibility +radiosensitive +radiosensitivity +radiosonde +radiosonic +radiostereoscopy +radiosurgery +radiosurgical +radiosymmetrical +radiotechnology +radiotelegram +radiotelegraph +radiotelegraphic +radiotelegraphy +radiotelephone +radiotelephonic +radiotelephony +radioteria +radiothallium +radiotherapeutic +radiotherapeutics +radiotherapeutist +radiotherapist +radiotherapy +radiothermy +radiothorium +radiotoxemia +radiotransparency +radiotransparent +radiotrician +Radiotron +radiotropic +radiotropism +radiovision +radish +radishlike +radium +radiumization +radiumize +radiumlike +radiumproof +radiumtherapy +radius +radix +radknight +radman +radome +radon +radsimir +radula +radulate +raduliferous +raduliform +Rafe +raff +Raffaelesque +raffe +raffee +raffery +raffia +raffinase +raffinate +raffing +raffinose +raffish +raffishly +raffishness +raffle +raffler +Rafflesia +rafflesia +Rafflesiaceae +rafflesiaceous +raft +raftage +rafter +raftiness +raftlike +raftman +raftsman +rafty +rag +raga +ragabash +ragabrash +ragamuffin +ragamuffinism +ragamuffinly +rage +rageful +ragefully +rageless +rageous +rageously +rageousness +rageproof +rager +ragesome +ragfish +ragged +raggedly +raggedness +raggedy +raggee +ragger +raggery +raggety +raggil +raggily +ragging +raggle +raggled +raggy +raghouse +raging +ragingly +raglan +raglanite +raglet +raglin +ragman +ragout +ragpicker +ragseller +ragshag +ragsorter +ragstone +ragtag +ragtime +ragtimer +ragtimey +ragule +raguly +ragweed +ragwort +rah +Rahanwin +rahdar +rahdaree +Raia +raia +Raiae +raid +raider +raidproof +Raiidae +raiiform +rail +railage +railbird +railer +railhead +railing +railingly +raillery +railless +raillike +railly +railman +railroad +railroadana +railroader +railroadiana +railroading +railroadish +railroadship +railway +railwaydom +railwayless +Raimannia +raiment +raimentless +rain +rainband +rainbird +rainbound +rainbow +rainbowlike +rainbowweed +rainbowy +rainburst +raincoat +raindrop +rainer +rainfall +rainfowl +rainful +rainily +raininess +rainless +rainlessness +rainlight +rainproof +rainproofer +rainspout +rainstorm +raintight +rainwash +rainworm +rainy +raioid +Rais +rais +raisable +raise +raised +raiseman +raiser +raisin +raising +raisiny +raj +Raja +raja +Rajah +rajah +rajaship +Rajasthani +rajbansi +Rajidae +Rajput +rakan +rake +rakeage +rakeful +rakehell +rakehellish +rakehelly +raker +rakery +rakesteel +rakestele +rakh +raki +rakily +raking +rakish +rakishly +rakishness +rakit +rakshasa +raku +rallentando +ralliance +Rallidae +rallier +ralliform +Rallinae +ralline +Rallus +rally +Ralph +ralph +ralstonite +ram +Rama +ramada +ramage +Ramaism +Ramaite +ramal +Raman +ramanas +ramarama +ramass +ramate +rambeh +ramberge +ramble +rambler +rambling +ramblingly +ramblingness +Rambo +rambong +rambooze +Rambouillet +rambunctious +rambutan +ramdohrite +rame +rameal +Ramean +ramed +ramekin +ramellose +rament +ramentaceous +ramental +ramentiferous +ramentum +rameous +ramequin +Rameses +Rameseum +Ramessid +Ramesside +ramet +ramex +ramfeezled +ramgunshoch +ramhead +ramhood +rami +ramicorn +ramie +ramiferous +ramificate +ramification +ramified +ramiflorous +ramiform +ramify +ramigerous +Ramillie +Ramillied +ramiparous +ramisection +ramisectomy +Ramism +Ramist +Ramistical +ramlike +ramline +rammack +rammel +rammelsbergite +rammer +rammerman +rammish +rammishly +rammishness +rammy +Ramnenses +Ramnes +Ramona +Ramoosii +ramose +ramosely +ramosity +ramosopalmate +ramosopinnate +ramososubdivided +ramous +ramp +rampacious +rampaciously +rampage +rampageous +rampageously +rampageousness +rampager +rampagious +rampancy +rampant +rampantly +rampart +ramped +ramper +Ramphastidae +Ramphastides +Ramphastos +rampick +rampike +ramping +rampingly +rampion +rampire +rampler +ramplor +rampsman +ramrace +ramrod +ramroddy +ramscallion +ramsch +ramshackle +ramshackled +ramshackleness +ramshackly +ramson +ramstam +ramtil +ramular +ramule +ramuliferous +ramulose +ramulous +ramulus +ramus +ramuscule +Ramusi +Ran +ran +Rana +rana +ranal +Ranales +ranarian +ranarium +Ranatra +rance +rancel +rancellor +rancelman +rancer +rancescent +ranch +ranche +rancher +rancheria +ranchero +ranchless +ranchman +rancho +ranchwoman +rancid +rancidification +rancidify +rancidity +rancidly +rancidness +rancor +rancorous +rancorously +rancorousness +rancorproof +rand +Randal +Randallite +randan +randannite +randem +rander +Randia +randing +randir +Randite +randle +random +randomish +randomization +randomize +randomly +randomness +randomwise +randy +rane +Ranella +Ranere +rang +rangatira +range +ranged +rangeless +rangeman +ranger +rangership +rangework +rangey +Rangifer +rangiferine +ranginess +ranging +rangle +rangler +rangy +rani +ranid +Ranidae +raniferous +raniform +Ranina +Raninae +ranine +raninian +ranivorous +rank +ranked +ranker +rankish +rankle +rankless +ranklingly +rankly +rankness +ranksman +rankwise +rann +rannel +rannigal +ranny +Ranquel +ransack +ransacker +ransackle +ransel +ranselman +ransom +ransomable +ransomer +ransomfree +ransomless +ranstead +rant +rantan +rantankerous +rantepole +ranter +Ranterism +ranting +rantingly +rantipole +rantock +ranty +ranula +ranular +Ranunculaceae +ranunculaceous +Ranunculales +ranunculi +Ranunculus +Ranzania +Raoulia +rap +Rapaces +rapaceus +rapacious +rapaciously +rapaciousness +rapacity +rapakivi +Rapallo +Rapanea +Rapateaceae +rapateaceous +rape +rapeful +raper +rapeseed +Raphael +Raphaelesque +Raphaelic +Raphaelism +Raphaelite +Raphaelitism +raphania +Raphanus +raphany +raphe +Raphia +raphide +raphides +raphidiferous +raphidiid +Raphidiidae +Raphidodea +Raphidoidea +Raphiolepis +raphis +rapic +rapid +rapidity +rapidly +rapidness +rapier +rapiered +rapillo +rapine +rapiner +raping +rapinic +rapist +raploch +rappage +rapparee +rappe +rappel +rapper +rapping +Rappist +rappist +Rappite +rapport +rapscallion +rapscallionism +rapscallionly +rapscallionry +rapt +raptatorial +raptatory +raptly +raptness +raptor +Raptores +raptorial +raptorious +raptril +rapture +raptured +raptureless +rapturist +rapturize +rapturous +rapturously +rapturousness +raptury +raptus +rare +rarebit +rarefaction +rarefactional +rarefactive +rarefiable +rarefication +rarefier +rarefy +rarely +rareness +rareripe +Rareyfy +rariconstant +rarish +rarity +Rarotongan +ras +rasa +Rasalas +Rasalhague +rasamala +rasant +rascacio +rascal +rascaldom +rascaless +rascalion +rascalism +rascality +rascalize +rascallike +rascallion +rascally +rascalry +rascalship +rasceta +rascette +rase +rasen +Rasenna +raser +rasgado +rash +rasher +rashful +rashing +rashlike +rashly +rashness +Rashti +rasion +Raskolnik +Rasores +rasorial +rasp +raspatorium +raspatory +raspberriade +raspberry +raspberrylike +rasped +rasper +rasping +raspingly +raspingness +raspings +raspish +raspite +raspy +rasse +Rasselas +rassle +Rastaban +raster +rastik +rastle +Rastus +rasure +rat +rata +ratability +ratable +ratableness +ratably +ratafee +ratafia +ratal +ratanhia +rataplan +ratbite +ratcatcher +ratcatching +ratch +ratchel +ratchelly +ratcher +ratchet +ratchetlike +ratchety +ratching +ratchment +rate +rated +ratel +rateless +ratement +ratepayer +ratepaying +rater +ratfish +rath +rathe +rathed +rathely +ratheness +rather +ratherest +ratheripe +ratherish +ratherly +rathest +rathite +rathole +rathskeller +raticidal +raticide +ratification +ratificationist +ratifier +ratify +ratihabition +ratine +rating +ratio +ratiocinant +ratiocinate +ratiocination +ratiocinative +ratiocinator +ratiocinatory +ratiometer +ration +rationable +rationably +rational +rationale +rationalism +rationalist +rationalistic +rationalistical +rationalistically +rationalisticism +rationality +rationalizable +rationalization +rationalize +rationalizer +rationally +rationalness +rationate +rationless +rationment +Ratitae +ratite +ratitous +ratlike +ratline +ratliner +ratoon +ratooner +ratproof +ratsbane +ratskeller +rattage +rattail +rattan +ratteen +ratten +rattener +ratter +rattery +ratti +rattinet +rattish +rattle +rattlebag +rattlebones +rattlebox +rattlebrain +rattlebrained +rattlebush +rattled +rattlehead +rattleheaded +rattlejack +rattlemouse +rattlenut +rattlepate +rattlepated +rattlepod +rattleproof +rattler +rattleran +rattleroot +rattlertree +rattles +rattleskull +rattleskulled +rattlesnake +rattlesome +rattletrap +rattleweed +rattlewort +rattling +rattlingly +rattlingness +rattly +ratton +rattoner +rattrap +Rattus +ratty +ratwa +ratwood +raucid +raucidity +raucity +raucous +raucously +raucousness +raught +raugrave +rauk +raukle +rauli +raun +raunge +raupo +rauque +Rauraci +Raurici +Rauwolfia +ravage +ravagement +ravager +rave +ravehook +raveinelike +ravel +raveler +ravelin +raveling +ravelly +ravelment +ravelproof +raven +Ravenala +ravendom +ravenduck +Ravenelia +ravener +ravenhood +ravening +ravenish +ravenlike +ravenous +ravenously +ravenousness +ravenry +ravens +Ravensara +ravensara +ravenstone +ravenwise +raver +Ravi +ravigote +ravin +ravinate +ravine +ravined +ravinement +raviney +raving +ravingly +ravioli +ravish +ravishedly +ravisher +ravishing +ravishingly +ravishment +ravison +ravissant +raw +rawboned +rawbones +rawhead +rawhide +rawhider +rawish +rawishness +rawness +rax +Ray +ray +raya +rayage +rayed +rayful +rayless +raylessness +raylet +Raymond +rayon +rayonnance +rayonnant +raze +razee +razer +razoo +razor +razorable +razorback +razorbill +razoredge +razorless +razormaker +razormaking +razorman +razorstrop +Razoumofskya +razz +razzia +razzly +re +rea +reaal +reabandon +reabolish +reabolition +reabridge +reabsence +reabsent +reabsolve +reabsorb +reabsorption +reabuse +reacceptance +reaccess +reaccession +reacclimatization +reacclimatize +reaccommodate +reaccompany +reaccomplish +reaccomplishment +reaccord +reaccost +reaccount +reaccredit +reaccrue +reaccumulate +reaccumulation +reaccusation +reaccuse +reaccustom +reacetylation +reach +reachable +reacher +reachieve +reachievement +reaching +reachless +reachy +reacidification +reacidify +reacknowledge +reacknowledgment +reacquaint +reacquaintance +reacquire +reacquisition +react +reactance +reactant +reaction +reactional +reactionally +reactionariness +reactionarism +reactionarist +reactionary +reactionaryism +reactionism +reactionist +reactivate +reactivation +reactive +reactively +reactiveness +reactivity +reactological +reactology +reactor +reactualization +reactualize +reactuate +read +readability +readable +readableness +readably +readapt +readaptability +readaptable +readaptation +readaptive +readaptiveness +readd +readdition +readdress +reader +readerdom +readership +readhere +readhesion +readily +readiness +reading +readingdom +readjourn +readjournment +readjudicate +readjust +readjustable +readjuster +readjustment +readmeasurement +readminister +readmiration +readmire +readmission +readmit +readmittance +readopt +readoption +readorn +readvance +readvancement +readvent +readventure +readvertency +readvertise +readvertisement +readvise +readvocate +ready +reaeration +reaffect +reaffection +reaffiliate +reaffiliation +reaffirm +reaffirmance +reaffirmation +reaffirmer +reafflict +reafford +reafforest +reafforestation +reaffusion +reagency +reagent +reaggravate +reaggravation +reaggregate +reaggregation +reaggressive +reagin +reagitate +reagitation +reagree +reagreement +reak +real +realarm +reales +realest +realgar +realienate +realienation +realign +realignment +realism +realist +realistic +realistically +realisticize +reality +realive +realizability +realizable +realizableness +realizably +realization +realize +realizer +realizing +realizingly +reallegation +reallege +reallegorize +realliance +reallocate +reallocation +reallot +reallotment +reallow +reallowance +reallude +reallusion +really +realm +realmless +realmlet +realness +realter +realteration +realtor +realty +ream +reamage +reamalgamate +reamalgamation +reamass +reambitious +reamend +reamendment +reamer +reamerer +reaminess +reamputation +reamuse +reamy +reanalysis +reanalyze +reanchor +reanimalize +reanimate +reanimation +reanneal +reannex +reannexation +reannotate +reannounce +reannouncement +reannoy +reannoyance +reanoint +reanswer +reanvil +reanxiety +reap +reapable +reapdole +reaper +reapologize +reapology +reapparel +reapparition +reappeal +reappear +reappearance +reappease +reapplaud +reapplause +reappliance +reapplicant +reapplication +reapplier +reapply +reappoint +reappointment +reapportion +reapportionment +reapposition +reappraisal +reappraise +reappraisement +reappreciate +reappreciation +reapprehend +reapprehension +reapproach +reapprobation +reappropriate +reappropriation +reapproval +reapprove +rear +rearbitrate +rearbitration +rearer +reargue +reargument +rearhorse +rearisal +rearise +rearling +rearm +rearmament +rearmost +rearousal +rearouse +rearrange +rearrangeable +rearrangement +rearranger +rearray +rearrest +rearrival +rearrive +rearward +rearwardly +rearwardness +rearwards +reascend +reascendancy +reascendant +reascendency +reascendent +reascension +reascensional +reascent +reascertain +reascertainment +reashlar +reasiness +reask +reason +reasonability +reasonable +reasonableness +reasonably +reasoned +reasonedly +reasoner +reasoning +reasoningly +reasonless +reasonlessly +reasonlessness +reasonproof +reaspire +reassail +reassault +reassay +reassemblage +reassemble +reassembly +reassent +reassert +reassertion +reassertor +reassess +reassessment +reasseverate +reassign +reassignation +reassignment +reassimilate +reassimilation +reassist +reassistance +reassociate +reassociation +reassort +reassortment +reassume +reassumption +reassurance +reassure +reassured +reassuredly +reassurement +reassurer +reassuring +reassuringly +reastiness +reastonish +reastonishment +reastray +reasty +reasy +reattach +reattachment +reattack +reattain +reattainment +reattempt +reattend +reattendance +reattention +reattentive +reattest +reattire +reattract +reattraction +reattribute +reattribution +reatus +reaudit +reauthenticate +reauthentication +reauthorization +reauthorize +reavail +reavailable +reave +reaver +reavoid +reavoidance +reavouch +reavow +reawait +reawake +reawaken +reawakening +reawakenment +reaward +reaware +reb +rebab +reback +rebag +rebait +rebake +rebalance +rebale +reballast +reballot +reban +rebandage +rebanish +rebanishment +rebankrupt +rebankruptcy +rebaptism +rebaptismal +rebaptization +rebaptize +rebaptizer +rebar +rebarbarization +rebarbarize +rebarbative +rebargain +rebase +rebasis +rebatable +rebate +rebateable +rebatement +rebater +rebathe +rebato +rebawl +rebeamer +rebear +rebeat +rebeautify +rebec +Rebecca +Rebeccaism +Rebeccaites +rebeck +rebecome +rebed +rebeg +rebeget +rebeggar +rebegin +rebeginner +rebeginning +rebeguile +rebehold +Rebekah +rebel +rebeldom +rebelief +rebelieve +rebeller +rebellike +rebellion +rebellious +rebelliously +rebelliousness +rebellow +rebelly +rebelong +rebelove +rebelproof +rebemire +rebend +rebenediction +rebenefit +rebeset +rebesiege +rebestow +rebestowal +rebetake +rebetray +rebewail +rebia +rebias +rebid +rebill +rebillet +rebilling +rebind +rebirth +rebite +reblade +reblame +reblast +rebleach +reblend +rebless +reblock +rebloom +reblossom +reblot +reblow +reblue +rebluff +reblunder +reboant +reboantic +reboard +reboast +rebob +reboil +reboiler +reboise +reboisement +rebold +rebolt +rebone +rebook +rebop +rebore +reborn +reborrow +rebottle +Reboulia +rebounce +rebound +reboundable +rebounder +reboundingness +rebourbonize +rebox +rebrace +rebraid +rebranch +rebrand +rebrandish +rebreathe +rebreed +rebrew +rebribe +rebrick +rebridge +rebring +rebringer +rebroach +rebroadcast +rebronze +rebrown +rebrush +rebrutalize +rebubble +rebuckle +rebud +rebudget +rebuff +rebuffable +rebuffably +rebuffet +rebuffproof +rebuild +rebuilder +rebuilt +rebukable +rebuke +rebukeable +rebukeful +rebukefully +rebukefulness +rebukeproof +rebuker +rebukingly +rebulk +rebunch +rebundle +rebunker +rebuoy +rebuoyage +reburden +reburgeon +reburial +reburn +reburnish +reburst +rebury +rebus +rebush +rebusy +rebut +rebute +rebutment +rebuttable +rebuttal +rebutter +rebutton +rebuy +recable +recadency +recage +recalcination +recalcine +recalcitrance +recalcitrant +recalcitrate +recalcitration +recalculate +recalculation +recalesce +recalescence +recalescent +recalibrate +recalibration +recalk +recall +recallable +recallist +recallment +recampaign +recancel +recancellation +recandescence +recandidacy +recant +recantation +recanter +recantingly +recanvas +recap +recapacitate +recapitalization +recapitalize +recapitulate +recapitulation +recapitulationist +recapitulative +recapitulator +recapitulatory +recappable +recapper +recaption +recaptivate +recaptivation +recaptor +recapture +recapturer +recarbon +recarbonate +recarbonation +recarbonization +recarbonize +recarbonizer +recarburization +recarburize +recarburizer +recarnify +recarpet +recarriage +recarrier +recarry +recart +recarve +recase +recash +recasket +recast +recaster +recasting +recatalogue +recatch +recaulescence +recausticize +recce +recco +reccy +recede +recedence +recedent +receder +receipt +receiptable +receiptless +receiptor +receipts +receivability +receivable +receivables +receivablness +receival +receive +received +receivedness +receiver +receivership +recelebrate +recelebration +recement +recementation +recency +recense +recension +recensionist +recensor +recensure +recensus +recent +recenter +recently +recentness +recentralization +recentralize +recentre +recept +receptacle +receptacular +receptaculite +Receptaculites +receptaculitid +Receptaculitidae +receptaculitoid +receptaculum +receptant +receptibility +receptible +reception +receptionism +receptionist +receptitious +receptive +receptively +receptiveness +receptivity +receptor +receptoral +receptorial +receptual +receptually +recercelee +recertificate +recertify +recess +recesser +recession +recessional +recessionary +recessive +recessively +recessiveness +recesslike +recessor +Rechabite +Rechabitism +rechafe +rechain +rechal +rechallenge +rechamber +rechange +rechant +rechaos +rechar +recharge +recharter +rechase +rechaser +rechasten +rechaw +recheat +recheck +recheer +recherche +rechew +rechip +rechisel +rechoose +rechristen +rechuck +rechurn +recidivation +recidive +recidivism +recidivist +recidivistic +recidivity +recidivous +recipe +recipiangle +recipience +recipiency +recipiend +recipiendary +recipient +recipiomotor +reciprocable +reciprocal +reciprocality +reciprocalize +reciprocally +reciprocalness +reciprocate +reciprocation +reciprocative +reciprocator +reciprocatory +reciprocitarian +reciprocity +recircle +recirculate +recirculation +recision +recission +recissory +recitable +recital +recitalist +recitatif +recitation +recitationalism +recitationist +recitative +recitatively +recitativical +recitativo +recite +recitement +reciter +recivilization +recivilize +reck +reckla +reckless +recklessly +recklessness +reckling +reckon +reckonable +reckoner +reckoning +reclaim +reclaimable +reclaimableness +reclaimably +reclaimant +reclaimer +reclaimless +reclaimment +reclama +reclamation +reclang +reclasp +reclass +reclassification +reclassify +reclean +recleaner +recleanse +reclear +reclearance +reclimb +reclinable +reclinate +reclinated +reclination +recline +recliner +reclose +reclothe +reclothing +recluse +reclusely +recluseness +reclusery +reclusion +reclusive +reclusiveness +reclusory +recoach +recoagulation +recoal +recoast +recoat +recock +recoct +recoction +recode +recodification +recodify +recogitate +recogitation +recognition +recognitive +recognitor +recognitory +recognizability +recognizable +recognizably +recognizance +recognizant +recognize +recognizedly +recognizee +recognizer +recognizingly +recognizor +recognosce +recohabitation +recoil +recoiler +recoilingly +recoilment +recoin +recoinage +recoiner +recoke +recollapse +recollate +recollation +Recollect +recollectable +recollected +recollectedly +recollectedness +recollectible +recollection +recollective +recollectively +recollectiveness +Recollet +recolonization +recolonize +recolor +recomb +recombination +recombine +recomember +recomfort +recommand +recommence +recommencement +recommencer +recommend +recommendability +recommendable +recommendableness +recommendably +recommendation +recommendatory +recommendee +recommender +recommission +recommit +recommitment +recommittal +recommunicate +recommunion +recompact +recompare +recomparison +recompass +recompel +recompensable +recompensate +recompensation +recompense +recompenser +recompensive +recompete +recompetition +recompetitor +recompilation +recompile +recompilement +recomplain +recomplaint +recomplete +recompletion +recompliance +recomplicate +recomplication +recomply +recompose +recomposer +recomposition +recompound +recomprehend +recomprehension +recompress +recompression +recomputation +recompute +recon +reconceal +reconcealment +reconcede +reconceive +reconcentrate +reconcentration +reconception +reconcert +reconcession +reconcilability +reconcilable +reconcilableness +reconcilably +reconcile +reconcilee +reconcileless +reconcilement +reconciler +reconciliability +reconciliable +reconciliate +reconciliation +reconciliative +reconciliator +reconciliatory +reconciling +reconcilingly +reconclude +reconclusion +reconcoct +reconcrete +reconcur +recondemn +recondemnation +recondensation +recondense +recondite +reconditely +reconditeness +recondition +recondole +reconduct +reconduction +reconfer +reconfess +reconfide +reconfine +reconfinement +reconfirm +reconfirmation +reconfiscate +reconfiscation +reconform +reconfound +reconfront +reconfuse +reconfusion +recongeal +recongelation +recongest +recongestion +recongratulate +recongratulation +reconjoin +reconjunction +reconnaissance +reconnect +reconnection +reconnoissance +reconnoiter +reconnoiterer +reconnoiteringly +reconnoitre +reconnoitrer +reconnoitringly +reconquer +reconqueror +reconquest +reconsecrate +reconsecration +reconsent +reconsider +reconsideration +reconsign +reconsignment +reconsole +reconsolidate +reconsolidation +reconstituent +reconstitute +reconstitution +reconstruct +reconstructed +reconstruction +reconstructional +reconstructionary +reconstructionist +reconstructive +reconstructiveness +reconstructor +reconstrue +reconsult +reconsultation +recontact +recontemplate +recontemplation +recontend +recontest +recontinuance +recontinue +recontract +recontraction +recontrast +recontribute +recontribution +recontrivance +recontrive +recontrol +reconvalesce +reconvalescence +reconvalescent +reconvene +reconvention +reconventional +reconverge +reconverse +reconversion +reconvert +reconvertible +reconvey +reconveyance +reconvict +reconviction +reconvince +reconvoke +recook +recool +recooper +recopper +recopy +recopyright +record +recordable +recordant +recordation +recordative +recordatively +recordatory +recordedly +recorder +recordership +recording +recordist +recordless +recork +recorporification +recorporify +recorrect +recorrection +recorrupt +recorruption +recostume +recounsel +recount +recountable +recountal +recountenance +recounter +recountless +recoup +recoupable +recouper +recouple +recoupment +recourse +recover +recoverability +recoverable +recoverableness +recoverance +recoveree +recoverer +recoveringly +recoverless +recoveror +recovery +recramp +recrank +recrate +recreance +recreancy +recreant +recreantly +recreantness +recrease +recreate +recreation +recreational +recreationist +recreative +recreatively +recreativeness +recreator +recreatory +recredit +recrement +recremental +recrementitial +recrementitious +recrescence +recrew +recriminate +recrimination +recriminative +recriminator +recriminatory +recriticize +recroon +recrop +recross +recrowd +recrown +recrucify +recrudency +recrudesce +recrudescence +recrudescency +recrudescent +recruit +recruitable +recruitage +recruital +recruitee +recruiter +recruithood +recruiting +recruitment +recruity +recrush +recrusher +recrystallization +recrystallize +rect +recta +rectal +rectalgia +rectally +rectangle +rectangled +rectangular +rectangularity +rectangularly +rectangularness +rectangulate +rectangulometer +rectectomy +recti +rectifiable +rectification +rectificative +rectificator +rectificatory +rectified +rectifier +rectify +rectigrade +Rectigraph +rectilineal +rectilineally +rectilinear +rectilinearism +rectilinearity +rectilinearly +rectilinearness +rectilineation +rectinerved +rection +rectipetality +rectirostral +rectischiac +rectiserial +rectitic +rectitis +rectitude +rectitudinous +recto +rectoabdominal +rectocele +rectoclysis +rectococcygeal +rectococcygeus +rectocolitic +rectocolonic +rectocystotomy +rectogenital +rectopexy +rectoplasty +rector +rectoral +rectorate +rectoress +rectorial +rectorrhaphy +rectorship +rectory +rectoscope +rectoscopy +rectosigmoid +rectostenosis +rectostomy +rectotome +rectotomy +rectovaginal +rectovesical +rectress +rectricial +rectrix +rectum +rectus +recubant +recubate +recultivate +recultivation +recumbence +recumbency +recumbent +recumbently +recuperability +recuperance +recuperate +recuperation +recuperative +recuperativeness +recuperator +recuperatory +recur +recure +recureful +recureless +recurl +recurrence +recurrency +recurrent +recurrently +recurrer +recurring +recurringly +recurse +recursion +recursive +recurtain +recurvant +recurvate +recurvation +recurvature +recurve +Recurvirostra +recurvirostral +Recurvirostridae +recurvopatent +recurvoternate +recurvous +recusance +recusancy +recusant +recusation +recusative +recusator +recuse +recushion +recussion +recut +recycle +Red +red +redact +redaction +redactional +redactor +redactorial +redamage +redamnation +redan +redare +redargue +redargution +redargutive +redargutory +redarken +redarn +redart +redate +redaub +redawn +redback +redbait +redbeard +redbelly +redberry +redbill +redbird +redbone +redbreast +redbrush +redbuck +redbud +redcap +redcoat +redd +redden +reddendo +reddendum +reddening +redder +redding +reddingite +reddish +reddishness +reddition +reddleman +reddock +reddsman +reddy +rede +redeal +redebate +redebit +redeceive +redecide +redecimate +redecision +redeck +redeclaration +redeclare +redecline +redecorate +redecoration +redecrease +redecussate +rededicate +rededication +rededicatory +rededuct +rededuction +redeed +redeem +redeemability +redeemable +redeemableness +redeemably +redeemer +redeemeress +redeemership +redeemless +redefault +redefeat +redefecate +redefer +redefiance +redefine +redefinition +redeflect +redefy +redeify +redelay +redelegate +redelegation +redeliberate +redeliberation +redeliver +redeliverance +redeliverer +redelivery +redemand +redemandable +redemise +redemolish +redemonstrate +redemonstration +redemptible +Redemptine +redemption +redemptional +redemptioner +Redemptionist +redemptionless +redemptive +redemptively +redemptor +redemptorial +Redemptorist +redemptory +redemptress +redemptrice +redenigrate +redeny +redepend +redeploy +redeployment +redeposit +redeposition +redepreciate +redepreciation +redeprive +rederivation +redescend +redescent +redescribe +redescription +redesertion +redeserve +redesign +redesignate +redesignation +redesire +redesirous +redesman +redespise +redetect +redetention +redetermination +redetermine +redevelop +redeveloper +redevelopment +redevise +redevote +redevotion +redeye +redfin +redfinch +redfish +redfoot +redhead +redheaded +redheadedly +redheadedness +redhearted +redhibition +redhibitory +redhoop +redia +redictate +redictation +redient +redifferentiate +redifferentiation +redig +redigest +redigestion +rediminish +redingote +redintegrate +redintegration +redintegrative +redintegrator +redip +redipper +redirect +redirection +redisable +redisappear +redisburse +redisbursement +redischarge +rediscipline +rediscount +rediscourage +rediscover +rediscoverer +rediscovery +rediscuss +rediscussion +redisembark +redismiss +redispatch +redispel +redisperse +redisplay +redispose +redisposition +redispute +redissect +redissection +redisseise +redisseisin +redisseisor +redisseize +redisseizin +redisseizor +redissoluble +redissolution +redissolvable +redissolve +redistend +redistill +redistillation +redistiller +redistinguish +redistrain +redistrainer +redistribute +redistributer +redistribution +redistributive +redistributor +redistributory +redistrict +redisturb +redive +rediversion +redivert +redivertible +redivide +redivision +redivive +redivivous +redivivus +redivorce +redivorcement +redivulge +redivulgence +redjacket +redknees +redleg +redlegs +redly +redmouth +redness +redo +redock +redocket +redolence +redolency +redolent +redolently +redominate +redondilla +redoom +redouble +redoublement +redoubler +redoubling +redoubt +redoubtable +redoubtableness +redoubtably +redoubted +redound +redowa +redox +redpoll +redraft +redrag +redrape +redraw +redrawer +redream +redredge +redress +redressable +redressal +redresser +redressible +redressive +redressless +redressment +redressor +redrill +redrive +redroot +redry +redsear +redshank +redshirt +redskin +redstart +redstreak +redtab +redtail +redthroat +redtop +redub +redubber +reduce +reduceable +reduceableness +reduced +reducement +reducent +reducer +reducibility +reducible +reducibleness +reducibly +reducing +reduct +reductant +reductase +reductibility +reduction +reductional +reductionism +reductionist +reductionistic +reductive +reductively +reductor +reductorial +redue +Redunca +redundance +redundancy +redundant +redundantly +reduplicate +reduplication +reduplicative +reduplicatively +reduplicatory +reduplicature +reduviid +Reduviidae +reduvioid +Reduvius +redux +redward +redware +redweed +redwing +redwithe +redwood +redye +Ree +ree +reechy +reed +reedbird +reedbuck +reedbush +reeded +reeden +reeder +reediemadeasy +reedily +reediness +reeding +reedish +reedition +reedless +reedlike +reedling +reedmaker +reedmaking +reedman +reedplot +reedwork +reedy +reef +reefable +reefer +reefing +reefy +reek +reeker +reekingly +reeky +reel +reelable +reeled +reeler +reelingly +reelrall +reem +reeming +reemish +reen +reenge +reeper +reese +reeshle +reesk +reesle +reest +reester +reestle +reesty +reet +reetam +reetle +reeve +reeveland +reeveship +ref +reface +refacilitate +refall +refallow +refan +refascinate +refascination +refashion +refashioner +refashionment +refasten +refathered +refavor +refect +refection +refectionary +refectioner +refective +refectorarian +refectorary +refectorer +refectorial +refectorian +refectory +refederate +refeed +refeel +refeign +refel +refence +refer +referable +referee +reference +referenda +referendal +referendary +referendaryship +referendum +referent +referential +referentially +referently +referment +referral +referrer +referrible +referribleness +refertilization +refertilize +refetch +refight +refigure +refill +refillable +refilm +refilter +refinable +refinage +refinance +refind +refine +refined +refinedly +refinedness +refinement +refiner +refinery +refinger +refining +refiningly +refinish +refire +refit +refitment +refix +refixation +refixture +reflag +reflagellate +reflame +reflash +reflate +reflation +reflationism +reflect +reflectance +reflected +reflectedly +reflectedness +reflectent +reflecter +reflectibility +reflectible +reflecting +reflectingly +reflection +reflectional +reflectionist +reflectionless +reflective +reflectively +reflectiveness +reflectivity +reflectometer +reflectometry +reflector +reflectoscope +refledge +reflee +reflex +reflexed +reflexibility +reflexible +reflexism +reflexive +reflexively +reflexiveness +reflexivity +reflexly +reflexness +reflexogenous +reflexological +reflexologist +reflexology +refling +refloat +refloatation +reflog +reflood +refloor +reflorescence +reflorescent +reflourish +reflourishment +reflow +reflower +refluctuation +refluence +refluency +refluent +reflush +reflux +refluxed +refly +refocillate +refocillation +refocus +refold +refoment +refont +refool +refoot +reforbid +reforce +reford +reforecast +reforest +reforestation +reforestization +reforestize +reforestment +reforfeit +reforfeiture +reforge +reforger +reforget +reforgive +reform +reformability +reformable +reformableness +reformado +reformandum +Reformati +reformation +reformational +reformationary +reformationist +reformative +reformatively +reformatness +reformatory +reformed +reformedly +reformer +reformeress +reformingly +reformism +reformist +reformistic +reformproof +reformulate +reformulation +reforsake +refortification +refortify +reforward +refound +refoundation +refounder +refract +refractable +refracted +refractedly +refractedness +refractile +refractility +refracting +refraction +refractional +refractionate +refractionist +refractive +refractively +refractiveness +refractivity +refractometer +refractometric +refractometry +refractor +refractorily +refractoriness +refractory +refracture +refragability +refragable +refragableness +refrain +refrainer +refrainment +reframe +refrangent +refrangibility +refrangible +refrangibleness +refreeze +refrenation +refrenzy +refresh +refreshant +refreshen +refreshener +refresher +refreshful +refreshfully +refreshing +refreshingly +refreshingness +refreshment +refrigerant +refrigerate +refrigerating +refrigeration +refrigerative +refrigerator +refrigeratory +refrighten +refringence +refringency +refringent +refront +refrustrate +reft +refuel +refueling +refuge +refugee +refugeeism +refugeeship +refulge +refulgence +refulgency +refulgent +refulgently +refulgentness +refunction +refund +refunder +refundment +refurbish +refurbishment +refurl +refurnish +refurnishment +refusable +refusal +refuse +refuser +refusing +refusingly +refusion +refusive +refutability +refutable +refutably +refutal +refutation +refutative +refutatory +refute +refuter +reg +regain +regainable +regainer +regainment +regal +regale +Regalecidae +Regalecus +regalement +regaler +regalia +regalian +regalism +regalist +regality +regalize +regallop +regally +regalness +regalvanization +regalvanize +regard +regardable +regardance +regardancy +regardant +regarder +regardful +regardfully +regardfulness +regarding +regardless +regardlessly +regardlessness +regarment +regarnish +regarrison +regather +regatta +regauge +regelate +regelation +regency +regeneracy +regenerance +regenerant +regenerate +regenerateness +regeneration +regenerative +regeneratively +regenerator +regeneratory +regeneratress +regeneratrix +regenesis +regent +regental +regentess +regentship +regerminate +regermination +reges +reget +Regga +Reggie +regia +regicidal +regicide +regicidism +regift +regifuge +regild +regill +regime +regimen +regimenal +regiment +regimental +regimentaled +regimentalled +regimentally +regimentals +regimentary +regimentation +regiminal +regin +reginal +Reginald +region +regional +regionalism +regionalist +regionalistic +regionalization +regionalize +regionally +regionary +regioned +register +registered +registerer +registership +registrability +registrable +registral +registrant +registrar +registrarship +registrary +registrate +registration +registrational +registrationist +registrator +registrer +registry +regive +regladden +reglair +reglaze +regle +reglement +reglementary +reglementation +reglementist +reglet +reglorified +regloss +reglove +reglow +reglue +regma +regmacarp +regnal +regnancy +regnant +regnerable +regolith +regorge +regovern +regradation +regrade +regraduate +regraduation +regraft +regrant +regrasp +regrass +regrate +regrater +regratification +regratify +regrating +regratingly +regrator +regratress +regravel +regrede +regreen +regreet +regress +regression +regressionist +regressive +regressively +regressiveness +regressivity +regressor +regret +regretful +regretfully +regretfulness +regretless +regrettable +regrettableness +regrettably +regretter +regrettingly +regrind +regrinder +regrip +regroup +regroupment +regrow +regrowth +reguarantee +reguard +reguardant +reguide +regula +regulable +regular +Regulares +Regularia +regularity +regularization +regularize +regularizer +regularly +regularness +regulatable +regulate +regulated +regulation +regulationist +regulative +regulatively +regulator +regulatorship +regulatory +regulatress +regulatris +reguli +reguline +regulize +Regulus +regulus +regur +regurge +regurgitant +regurgitate +regurgitation +regush +reh +rehabilitate +rehabilitation +rehabilitative +rehair +rehale +rehallow +rehammer +rehandicap +rehandle +rehandler +rehandling +rehang +rehappen +reharden +reharm +reharmonize +reharness +reharrow +reharvest +rehash +rehaul +rehazard +rehead +reheal +reheap +rehear +rehearing +rehearsal +rehearse +rehearser +rehearten +reheat +reheater +Reheboth +rehedge +reheel +reheighten +Rehoboam +Rehoboth +Rehobothan +rehoe +rehoist +rehollow +rehonor +rehonour +rehood +rehook +rehoop +rehouse +rehumanize +rehumble +rehumiliate +rehumiliation +rehung +rehybridize +rehydrate +rehydration +rehypothecate +rehypothecation +rehypothecator +reichsgulden +Reichsland +Reichslander +reichsmark +reichspfennig +reichstaler +reidentification +reidentify +reif +reification +reify +reign +reignite +reignition +reignore +reillume +reilluminate +reillumination +reillumine +reillustrate +reillustration +reim +reimage +reimagination +reimagine +reimbark +reimbarkation +reimbibe +reimbody +reimbursable +reimburse +reimbursement +reimburser +reimbush +reimbushment +reimkennar +reimmerge +reimmerse +reimmersion +reimmigrant +reimmigration +reimpact +reimpark +reimpart +reimpatriate +reimpatriation +reimpel +reimplant +reimplantation +reimply +reimport +reimportation +reimportune +reimpose +reimposition +reimposure +reimpregnate +reimpress +reimpression +reimprint +reimprison +reimprisonment +reimprove +reimprovement +reimpulse +rein +reina +reinability +reinaugurate +reinauguration +reincapable +reincarnadine +reincarnate +reincarnation +reincarnationism +reincarnationist +reincense +reincentive +reincidence +reincidency +reincite +reinclination +reincline +reinclude +reinclusion +reincorporate +reincorporation +reincrease +reincrudate +reincrudation +reinculcate +reincur +reindebted +reindebtedness +reindeer +reindependence +reindicate +reindication +reindict +reindictment +reindifferent +reindorse +reinduce +reinducement +reindue +reindulge +reindulgence +reinette +reinfect +reinfection +reinfectious +reinfer +reinfest +reinfestation +reinflame +reinflate +reinflation +reinflict +reinfliction +reinfluence +reinforce +reinforcement +reinforcer +reinform +reinfuse +reinfusion +reingraft +reingratiate +reingress +reinhabit +reinhabitation +reinherit +reinitiate +reinitiation +reinject +reinjure +reinless +reinoculate +reinoculation +reinquire +reinquiry +reins +reinsane +reinsanity +reinscribe +reinsert +reinsertion +reinsist +reinsman +reinspect +reinspection +reinspector +reinsphere +reinspiration +reinspire +reinspirit +reinstall +reinstallation +reinstallment +reinstalment +reinstate +reinstatement +reinstation +reinstator +reinstauration +reinstil +reinstill +reinstitute +reinstitution +reinstruct +reinstruction +reinsult +reinsurance +reinsure +reinsurer +reintegrate +reintegration +reintend +reinter +reintercede +reintercession +reinterchange +reinterest +reinterfere +reinterference +reinterment +reinterpret +reinterpretation +reinterrogate +reinterrogation +reinterrupt +reinterruption +reintervene +reintervention +reinterview +reinthrone +reintimate +reintimation +reintitule +reintrench +reintroduce +reintroduction +reintrude +reintrusion +reintuition +reintuitive +reinvade +reinvasion +reinvent +reinvention +reinventor +reinversion +reinvert +reinvest +reinvestigate +reinvestigation +reinvestiture +reinvestment +reinvigorate +reinvigoration +reinvitation +reinvite +reinvoice +reinvolve +Reinwardtia +reirrigate +reirrigation +reis +reisolation +reissuable +reissue +reissuement +reissuer +reit +reitbok +reitbuck +reitemize +reiter +reiterable +reiterance +reiterant +reiterate +reiterated +reiteratedly +reiteratedness +reiteration +reiterative +reiteratively +reiver +rejail +Rejang +reject +rejectable +rejectableness +rejectage +rejectamenta +rejecter +rejectingly +rejection +rejective +rejectment +rejector +rejerk +rejoice +rejoiceful +rejoicement +rejoicer +rejoicing +rejoicingly +rejoin +rejoinder +rejolt +rejourney +rejudge +rejumble +rejunction +rejustification +rejustify +rejuvenant +rejuvenate +rejuvenation +rejuvenative +rejuvenator +rejuvenesce +rejuvenescence +rejuvenescent +rejuvenize +Reki +rekick +rekill +rekindle +rekindlement +rekindler +reking +rekiss +reknit +reknow +rel +relabel +relace +relacquer +relade +reladen +relais +relament +relamp +reland +relap +relapper +relapsable +relapse +relapseproof +relapser +relapsing +relast +relaster +relata +relatability +relatable +relatch +relate +related +relatedness +relater +relatinization +relation +relational +relationality +relationally +relationary +relationism +relationist +relationless +relationship +relatival +relative +relatively +relativeness +relativism +relativist +relativistic +relativity +relativization +relativize +relator +relatrix +relatum +relaunch +relax +relaxable +relaxant +relaxation +relaxative +relaxatory +relaxed +relaxedly +relaxedness +relaxer +relay +relayman +relbun +relead +releap +relearn +releasable +release +releasee +releasement +releaser +releasor +releather +relection +relegable +relegate +relegation +relend +relent +relenting +relentingly +relentless +relentlessly +relentlessness +relentment +relessee +relessor +relet +reletter +relevance +relevancy +relevant +relevantly +relevate +relevation +relevator +relevel +relevy +reliability +reliable +reliableness +reliably +reliance +reliant +reliantly +reliberate +relic +relicary +relicense +relick +reliclike +relicmonger +relict +relicted +reliction +relief +reliefless +relier +relievable +relieve +relieved +relievedly +reliever +relieving +relievingly +relievo +relift +religate +religation +relight +relightable +relighten +relightener +relighter +religion +religionary +religionate +religioner +religionism +religionist +religionistic +religionize +religionless +religiose +religiosity +religious +religiously +religiousness +relime +relimit +relimitation +reline +reliner +relink +relinquent +relinquish +relinquisher +relinquishment +reliquaire +reliquary +reliquefy +reliquiae +reliquian +reliquidate +reliquidation +reliquism +relish +relishable +relisher +relishing +relishingly +relishsome +relishy +relist +relisten +relitigate +relive +Rellyan +Rellyanism +Rellyanite +reload +reloan +relocable +relocate +relocation +relocator +relock +relodge +relook +relose +relost +relot +relove +relower +relucent +reluct +reluctance +reluctancy +reluctant +reluctantly +reluctate +reluctation +reluctivity +relume +relumine +rely +remade +remagnetization +remagnetize +remagnification +remagnify +remail +remain +remainder +remainderman +remaindership +remainer +remains +remaintain +remaintenance +remake +remaker +reman +remanage +remanagement +remanation +remancipate +remancipation +remand +remandment +remanence +remanency +remanent +remanet +remanipulate +remanipulation +remantle +remanufacture +remanure +remap +remarch +remargin +remark +remarkability +remarkable +remarkableness +remarkably +remarkedly +remarker +remarket +remarque +remarriage +remarry +remarshal +remask +remass +remast +remasticate +remastication +rematch +rematerialize +remble +Rembrandt +Rembrandtesque +Rembrandtish +Rembrandtism +remeant +remeasure +remeasurement +remede +remediable +remediableness +remediably +remedial +remedially +remediation +remediless +remedilessly +remedilessness +remeditate +remeditation +remedy +remeet +remelt +remember +rememberability +rememberable +rememberably +rememberer +remembrance +remembrancer +remembrancership +rememorize +remenace +remend +remerge +remetal +remex +Remi +remica +remicate +remication +remicle +remiform +remigate +remigation +remiges +remigial +remigrant +remigrate +remigration +Remijia +remilitarization +remilitarize +remill +remimic +remind +remindal +reminder +remindful +remindingly +remineralization +remineralize +remingle +reminisce +reminiscence +reminiscenceful +reminiscencer +reminiscency +reminiscent +reminiscential +reminiscentially +reminiscently +reminiscer +reminiscitory +remint +remiped +remirror +remise +remisrepresent +remisrepresentation +remiss +remissful +remissibility +remissible +remissibleness +remission +remissive +remissively +remissiveness +remissly +remissness +remissory +remisunderstand +remit +remitment +remittable +remittal +remittance +remittancer +remittee +remittence +remittency +remittent +remittently +remitter +remittitur +remittor +remix +remixture +remnant +remnantal +remobilization +remobilize +Remoboth +remock +remodel +remodeler +remodeller +remodelment +remodification +remodify +remolade +remold +remollient +remonetization +remonetize +remonstrance +remonstrant +remonstrantly +remonstrate +remonstrating +remonstratingly +remonstration +remonstrative +remonstratively +remonstrator +remonstratory +remontado +remontant +remontoir +remop +remora +remord +remorse +remorseful +remorsefully +remorsefulness +remorseless +remorselessly +remorselessness +remorseproof +remortgage +remote +remotely +remoteness +remotion +remotive +remould +remount +removability +removable +removableness +removably +removal +remove +removed +removedly +removedness +removement +remover +removing +remultiplication +remultiply +remunerability +remunerable +remunerably +remunerate +remuneration +remunerative +remuneratively +remunerativeness +remunerator +remuneratory +remurmur +Remus +remuster +remutation +renable +renably +renail +Renaissance +renaissance +Renaissancist +Renaissant +renal +rename +Renardine +renascence +renascency +renascent +renascible +renascibleness +renature +renavigate +renavigation +rencontre +rencounter +renculus +rend +render +renderable +renderer +rendering +renderset +rendezvous +rendibility +rendible +rendition +rendlewood +rendrock +rendzina +reneague +Renealmia +renecessitate +reneg +renegade +renegadism +renegado +renegation +renege +reneger +reneglect +renegotiable +renegotiate +renegotiation +renegotiations +renegue +renerve +renes +renet +renew +renewability +renewable +renewably +renewal +renewedly +renewedness +renewer +renewment +renicardiac +renickel +renidification +renidify +reniform +Renilla +Renillidae +renin +renipericardial +reniportal +renipuncture +renish +renishly +renitence +renitency +renitent +renk +renky +renne +rennet +renneting +rennin +renniogen +renocutaneous +renogastric +renography +renointestinal +renominate +renomination +renopericardial +renopulmonary +renormalize +renotation +renotice +renotification +renotify +renounce +renounceable +renouncement +renouncer +renourish +renovate +renovater +renovatingly +renovation +renovative +renovator +renovatory +renovize +renown +renowned +renownedly +renownedness +renowner +renownful +renownless +rensselaerite +rent +rentability +rentable +rentage +rental +rentaler +rentaller +rented +rentee +renter +rentless +rentrant +rentrayeuse +renumber +renumerate +renumeration +renunciable +renunciance +renunciant +renunciate +renunciation +renunciative +renunciator +renunciatory +renunculus +renverse +renvoi +renvoy +reobject +reobjectivization +reobjectivize +reobligate +reobligation +reoblige +reobscure +reobservation +reobserve +reobtain +reobtainable +reobtainment +reoccasion +reoccupation +reoccupy +reoccur +reoccurrence +reoffend +reoffense +reoffer +reoffset +reoil +reometer +reomission +reomit +reopen +reoperate +reoperation +reoppose +reopposition +reoppress +reoppression +reorchestrate +reordain +reorder +reordinate +reordination +reorganization +reorganizationist +reorganize +reorganizer +reorient +reorientation +reornament +reoutfit +reoutline +reoutput +reoutrage +reovercharge +reoverflow +reovertake +reoverwork +reown +reoxidation +reoxidize +reoxygenate +reoxygenize +rep +repace +repacification +repacify +repack +repackage +repacker +repaganization +repaganize +repaganizer +repage +repaint +repair +repairable +repairableness +repairer +repairman +repale +repand +repandly +repandodentate +repandodenticulate +repandolobate +repandous +repandousness +repanel +repaper +reparability +reparable +reparably +reparagraph +reparate +reparation +reparative +reparatory +repark +repartable +repartake +repartee +reparticipate +reparticipation +repartition +repartitionable +repass +repassable +repassage +repasser +repast +repaste +repasture +repatch +repatency +repatent +repatriable +repatriate +repatriation +repatronize +repattern +repave +repavement +repawn +repay +repayable +repayal +repaying +repayment +repeal +repealability +repealable +repealableness +repealer +repealist +repealless +repeat +repeatability +repeatable +repeatal +repeated +repeatedly +repeater +repeg +repel +repellance +repellant +repellence +repellency +repellent +repellently +repeller +repelling +repellingly +repellingness +repen +repenetrate +repension +repent +repentable +repentance +repentant +repentantly +repenter +repentingly +repeople +reperceive +repercept +reperception +repercolation +repercuss +repercussion +repercussive +repercussively +repercussiveness +repercutient +reperform +reperformance +reperfume +reperible +repermission +repermit +reperplex +repersonalization +repersonalize +repersuade +repersuasion +repertoire +repertorial +repertorily +repertorium +repertory +reperusal +reperuse +repetend +repetition +repetitional +repetitionary +repetitious +repetitiously +repetitiousness +repetitive +repetitively +repetitiveness +repetitory +repetticoat +repew +Rephael +rephase +rephonate +rephosphorization +rephosphorize +rephotograph +rephrase +repic +repick +repicture +repiece +repile +repin +repine +repineful +repinement +repiner +repiningly +repipe +repique +repitch +repkie +replace +replaceability +replaceable +replacement +replacer +replait +replan +replane +replant +replantable +replantation +replanter +replaster +replate +replay +replead +repleader +repleat +repledge +repledger +replenish +replenisher +replenishingly +replenishment +replete +repletely +repleteness +repletion +repletive +repletively +repletory +repleviable +replevin +replevisable +replevisor +replevy +repliant +replica +replicate +replicated +replicatile +replication +replicative +replicatively +replicatory +replier +replight +replod +replot +replotment +replotter +replough +replow +replum +replume +replunder +replunge +reply +replyingly +repocket +repoint +repolish +repoll +repollute +repolon +repolymerization +repolymerize +reponder +repone +repope +repopulate +repopulation +report +reportable +reportage +reportedly +reporter +reporteress +reporterism +reportership +reportingly +reportion +reportorial +reportorially +reposal +repose +reposed +reposedly +reposedness +reposeful +reposefully +reposefulness +reposer +reposit +repositary +reposition +repositor +repository +repossess +repossession +repossessor +repost +repostpone +repot +repound +repour +repowder +repp +repped +repractice +repray +repreach +reprecipitate +reprecipitation +repredict +reprefer +reprehend +reprehendable +reprehendatory +reprehender +reprehensibility +reprehensible +reprehensibleness +reprehensibly +reprehension +reprehensive +reprehensively +reprehensory +repreparation +reprepare +represcribe +represent +representability +representable +representamen +representant +representation +representational +representationalism +representationalist +representationary +representationism +representationist +representative +representatively +representativeness +representativeship +representativity +representer +representment +represide +repress +repressed +repressedly +represser +repressible +repressibly +repression +repressionary +repressionist +repressive +repressively +repressiveness +repressment +repressor +repressory +repressure +reprice +reprieval +reprieve +repriever +reprimand +reprimander +reprimanding +reprimandingly +reprime +reprimer +reprint +reprinter +reprisal +reprisalist +reprise +repristinate +repristination +reprivatization +reprivatize +reprivilege +reproach +reproachable +reproachableness +reproachably +reproacher +reproachful +reproachfully +reproachfulness +reproachingly +reproachless +reproachlessness +reprobacy +reprobance +reprobate +reprobateness +reprobater +reprobation +reprobationary +reprobationer +reprobative +reprobatively +reprobator +reprobatory +reproceed +reprocess +reproclaim +reproclamation +reprocurable +reprocure +reproduce +reproduceable +reproducer +reproducibility +reproducible +reproduction +reproductionist +reproductive +reproductively +reproductiveness +reproductivity +reproductory +reprofane +reprofess +reprohibit +repromise +repromulgate +repromulgation +repronounce +repronunciation +reproof +reproofless +repropagate +repropitiate +repropitiation +reproportion +reproposal +repropose +reprosecute +reprosecution +reprosper +reprotect +reprotection +reprotest +reprovable +reprovableness +reprovably +reproval +reprove +reprover +reprovide +reprovingly +reprovision +reprovocation +reprovoke +reprune +reps +reptant +reptatorial +reptatory +reptile +reptiledom +reptilelike +reptilferous +Reptilia +reptilian +reptiliary +reptiliform +reptilious +reptiliousness +reptilism +reptility +reptilivorous +reptiloid +republic +republican +republicanism +republicanization +republicanize +republicanizer +republication +republish +republisher +republishment +repuddle +repudiable +repudiate +repudiation +repudiationist +repudiative +repudiator +repudiatory +repuff +repugn +repugnable +repugnance +repugnancy +repugnant +repugnantly +repugnantness +repugnate +repugnatorial +repugner +repullulate +repullulation +repullulative +repullulescent +repulpit +repulse +repulseless +repulseproof +repulser +repulsion +repulsive +repulsively +repulsiveness +repulsory +repulverize +repump +repunish +repunishment +repurchase +repurchaser +repurge +repurification +repurify +repurple +repurpose +repursue +repursuit +reputability +reputable +reputableness +reputably +reputation +reputationless +reputative +reputatively +repute +reputed +reputedly +reputeless +requalification +requalify +requarantine +requeen +requench +request +requester +requestion +requiem +Requienia +requiescence +requin +requirable +require +requirement +requirer +requisite +requisitely +requisiteness +requisition +requisitionary +requisitioner +requisitionist +requisitor +requisitorial +requisitory +requit +requitable +requital +requitative +requite +requiteful +requitement +requiter +requiz +requotation +requote +rerack +reracker +reradiation +rerail +reraise +rerake +rerank +rerate +reread +rereader +rerebrace +reredos +reree +rereel +rereeve +rerefief +reregister +reregistration +reregulate +reregulation +rereign +reremouse +rerent +rerental +reresupper +rerig +rering +rerise +rerival +rerivet +rerob +rerobe +reroll +reroof +reroot +rerope +reroute +rerow +reroyalize +rerub +rerummage +rerun +resaca +resack +resacrifice +resaddle +resail +resalable +resale +resalt +resalutation +resalute +resalvage +resample +resanctify +resanction +resatisfaction +resatisfy +resaw +resawer +resawyer +resay +resazurin +rescan +reschedule +rescind +rescindable +rescinder +rescindment +rescissible +rescission +rescissory +rescore +rescramble +rescratch +rescribe +rescript +rescription +rescriptive +rescriptively +rescrub +rescuable +rescue +rescueless +rescuer +reseal +reseam +research +researcher +researchful +researchist +reseat +resecrete +resecretion +resect +resection +resectional +Reseda +reseda +Resedaceae +resedaceous +resee +reseed +reseek +resegment +resegmentation +reseise +reseiser +reseize +reseizer +reseizure +reselect +reselection +reself +resell +reseller +resemblable +resemblance +resemblant +resemble +resembler +resemblingly +reseminate +resend +resene +resensation +resensitization +resensitize +resent +resentationally +resentence +resenter +resentful +resentfullness +resentfully +resentience +resentingly +resentless +resentment +resepulcher +resequent +resequester +resequestration +reserene +reservable +reserval +reservation +reservationist +reservatory +reserve +reserved +reservedly +reservedness +reservee +reserveful +reserveless +reserver +reservery +reservice +reservist +reservoir +reservor +reset +resettable +resetter +resettle +resettlement +resever +resew +resex +resh +reshake +reshape +reshare +resharpen +reshave +reshear +reshearer +resheathe +reshelve +reshift +reshine +reshingle +reship +reshipment +reshipper +reshoe +reshoot +reshoulder +reshovel +reshower +reshrine +reshuffle +reshun +reshunt +reshut +reshuttle +resiccate +reside +residence +residencer +residency +resident +residental +residenter +residential +residentiality +residentially +residentiary +residentiaryship +residentship +resider +residua +residual +residuary +residuation +residue +residuent +residuous +residuum +resift +resigh +resign +resignal +resignatary +resignation +resignationism +resigned +resignedly +resignedness +resignee +resigner +resignful +resignment +resile +resilement +resilial +resiliate +resilience +resiliency +resilient +resilifer +resiliometer +resilition +resilium +resilver +resin +resina +resinaceous +resinate +resinbush +resiner +resinfiable +resing +resinic +resiniferous +resinification +resinifluous +resiniform +resinify +resinize +resink +resinlike +resinoelectric +resinoextractive +resinogenous +resinoid +resinol +resinolic +resinophore +resinosis +resinous +resinously +resinousness +resinovitreous +resiny +resipiscence +resipiscent +resist +resistability +resistable +resistableness +resistance +resistant +resistantly +resister +resistful +resistibility +resistible +resistibleness +resistibly +resisting +resistingly +resistive +resistively +resistiveness +resistivity +resistless +resistlessly +resistlessness +resistor +resitting +resize +resizer +resketch +reskin +reslash +reslate +reslay +reslide +reslot +resmell +resmelt +resmile +resmooth +resnap +resnatch +resnatron +resnub +resoak +resoap +resoften +resoil +resojourn +resolder +resole +resolemnize +resolicit +resolidification +resolidify +resolubility +resoluble +resolubleness +resolute +resolutely +resoluteness +resolution +resolutioner +resolutionist +resolutory +resolvability +resolvable +resolvableness +resolvancy +resolve +resolved +resolvedly +resolvedness +resolvent +resolver +resolvible +resonance +resonancy +resonant +resonantly +resonate +resonator +resonatory +resoothe +resorb +resorbence +resorbent +resorcin +resorcine +resorcinism +resorcinol +resorcinolphthalein +resorcinum +resorcylic +resorption +resorptive +resort +resorter +resorufin +resought +resound +resounder +resounding +resoundingly +resource +resourceful +resourcefully +resourcefulness +resourceless +resourcelessness +resoutive +resow +resp +respace +respade +respan +respangle +resparkle +respeak +respect +respectability +respectabilize +respectable +respectableness +respectably +respectant +respecter +respectful +respectfully +respectfulness +respecting +respective +respectively +respectiveness +respectless +respectlessly +respectlessness +respectworthy +respell +respersive +respin +respirability +respirable +respirableness +respiration +respirational +respirative +respirator +respiratored +respiratorium +respiratory +respire +respirit +respirometer +respite +respiteless +resplend +resplendence +resplendency +resplendent +resplendently +resplice +resplit +respoke +respond +responde +respondence +respondency +respondent +respondentia +responder +responsal +responsary +response +responseless +responser +responsibility +responsible +responsibleness +responsibly +responsion +responsive +responsively +responsiveness +responsivity +responsorial +responsory +respot +respray +respread +respring +resprout +respue +resquare +resqueak +ressaidar +ressala +ressaldar +ressaut +rest +restable +restack +restaff +restain +restainable +restake +restamp +restandardization +restandardize +restant +restart +restate +restatement +restaur +restaurant +restaurate +restaurateur +restauration +restbalk +resteal +resteel +resteep +restem +restep +rester +resterilize +restes +restful +restfully +restfulness +restharrow +resthouse +Restiaceae +restiaceous +restiad +restibrachium +restiff +restiffen +restiffener +restiffness +restifle +restiform +restigmatize +restimulate +restimulation +resting +restingly +Restio +Restionaceae +restionaceous +restipulate +restipulation +restipulatory +restir +restis +restitch +restitute +restitution +restitutionism +restitutionist +restitutive +restitutor +restitutory +restive +restively +restiveness +restless +restlessly +restlessness +restock +restopper +restorable +restorableness +restoral +restoration +restorationer +restorationism +restorationist +restorative +restoratively +restorativeness +restorator +restoratory +restore +restorer +restow +restowal +restproof +restraighten +restrain +restrainability +restrained +restrainedly +restrainedness +restrainer +restraining +restrainingly +restraint +restraintful +restrap +restratification +restream +restrengthen +restress +restretch +restrict +restricted +restrictedly +restrictedness +restriction +restrictionary +restrictionist +restrictive +restrictively +restrictiveness +restrike +restring +restringe +restringency +restringent +restrip +restrive +restroke +restudy +restuff +restward +restwards +resty +restyle +resubject +resubjection +resubjugate +resublimation +resublime +resubmerge +resubmission +resubmit +resubordinate +resubscribe +resubscriber +resubscription +resubstitute +resubstitution +resucceed +resuck +resudation +resue +resuffer +resufferance +resuggest +resuggestion +resuing +resuit +result +resultance +resultancy +resultant +resultantly +resultative +resultful +resultfully +resulting +resultingly +resultive +resultless +resultlessly +resultlessness +resumability +resumable +resume +resumer +resummon +resummons +resumption +resumptive +resumptively +resun +resup +resuperheat +resupervise +resupinate +resupinated +resupination +resupine +resupply +resupport +resuppose +resupposition +resuppress +resuppression +resurface +resurge +resurgence +resurgency +resurgent +resurprise +resurrect +resurrectible +resurrection +resurrectional +resurrectionary +resurrectioner +resurrectioning +resurrectionism +resurrectionist +resurrectionize +resurrective +resurrector +resurrender +resurround +resurvey +resuscitable +resuscitant +resuscitate +resuscitation +resuscitative +resuscitator +resuspect +resuspend +resuspension +reswage +reswallow +resward +reswarm +reswear +resweat +resweep +reswell +reswill +reswim +resyllabification +resymbolization +resymbolize +resynthesis +resynthesize +ret +retable +retack +retackle +retag +retail +retailer +retailment +retailor +retain +retainability +retainable +retainableness +retainal +retainder +retainer +retainership +retaining +retake +retaker +retaliate +retaliation +retaliationist +retaliative +retaliator +retaliatory +retalk +retama +retame +retan +retanner +retape +retard +retardance +retardant +retardate +retardation +retardative +retardatory +retarded +retardence +retardent +retarder +retarding +retardingly +retardive +retardment +retardure +retare +retariff +retaste +retation +retattle +retax +retaxation +retch +reteach +retecious +retelegraph +retelephone +retell +retelling +retem +retemper +retempt +retemptation +retenant +retender +retene +retent +retention +retentionist +retentive +retentively +retentiveness +retentivity +retentor +Retepora +retepore +Reteporidae +retest +retexture +rethank +rethatch +rethaw +rethe +retheness +rethicken +rethink +rethrash +rethread +rethreaten +rethresh +rethresher +rethrill +rethrive +rethrone +rethrow +rethrust +rethunder +retia +retial +Retiariae +retiarian +retiarius +retiary +reticella +reticello +reticence +reticency +reticent +reticently +reticket +reticle +reticula +reticular +Reticularia +reticularian +reticularly +reticulary +reticulate +reticulated +reticulately +reticulation +reticulatocoalescent +reticulatogranulate +reticulatoramose +reticulatovenose +reticule +reticuled +reticulin +reticulitis +reticulocyte +reticulocytosis +reticuloramose +Reticulosa +reticulose +reticulovenose +reticulum +retie +retier +retiform +retighten +retile +retill +retimber +retime +retin +retina +retinacular +retinaculate +retinaculum +retinal +retinalite +retinasphalt +retinasphaltum +retincture +retinene +retinerved +retinian +retinispora +retinite +retinitis +retinize +retinker +retinoblastoma +retinochorioid +retinochorioidal +retinochorioiditis +retinoid +retinol +retinopapilitis +retinophoral +retinophore +retinoscope +retinoscopic +retinoscopically +retinoscopist +retinoscopy +Retinospora +retinue +retinula +retinular +retinule +retip +retiracied +retiracy +retirade +retiral +retire +retired +retiredly +retiredness +retirement +retirer +retiring +retiringly +retiringness +retistene +retoast +retold +retolerate +retoleration +retomb +retonation +retook +retool +retooth +retoother +retort +retortable +retorted +retorter +retortion +retortive +retorture +retoss +retotal +retouch +retoucher +retouching +retouchment +retour +retourable +retrace +retraceable +retracement +retrack +retract +retractability +retractable +retractation +retracted +retractibility +retractible +retractile +retractility +retraction +retractive +retractively +retractiveness +retractor +retrad +retrade +retradition +retrahent +retrain +retral +retrally +retramp +retrample +retranquilize +retranscribe +retranscription +retransfer +retransference +retransfigure +retransform +retransformation +retransfuse +retransit +retranslate +retranslation +retransmission +retransmissive +retransmit +retransmute +retransplant +retransport +retransportation +retravel +retraverse +retraxit +retread +retreat +retreatal +retreatant +retreater +retreatful +retreating +retreatingness +retreative +retreatment +retree +retrench +retrenchable +retrencher +retrenchment +retrial +retribute +retribution +retributive +retributively +retributor +retributory +retricked +retrievability +retrievable +retrievableness +retrievably +retrieval +retrieve +retrieveless +retrievement +retriever +retrieverish +retrim +retrimmer +retrip +retroact +retroaction +retroactive +retroactively +retroactivity +retroalveolar +retroauricular +retrobronchial +retrobuccal +retrobulbar +retrocaecal +retrocardiac +retrocecal +retrocede +retrocedence +retrocedent +retrocervical +retrocession +retrocessional +retrocessionist +retrocessive +retrochoir +retroclavicular +retroclusion +retrocognition +retrocognitive +retrocolic +retroconsciousness +retrocopulant +retrocopulation +retrocostal +retrocouple +retrocoupler +retrocurved +retrodate +retrodeviation +retrodisplacement +retroduction +retrodural +retroesophageal +retroflected +retroflection +retroflex +retroflexed +retroflexion +retroflux +retroform +retrofract +retrofracted +retrofrontal +retrogastric +retrogenerative +retrogradation +retrogradatory +retrograde +retrogradely +retrogradient +retrogradingly +retrogradism +retrogradist +retrogress +retrogression +retrogressionist +retrogressive +retrogressively +retrohepatic +retroinfection +retroinsular +retroiridian +retroject +retrojection +retrojugular +retrolabyrinthine +retrolaryngeal +retrolingual +retrolocation +retromammary +retromammillary +retromandibular +retromastoid +retromaxillary +retromigration +retromingent +retromingently +retromorphosed +retromorphosis +retronasal +retroperitoneal +retroperitoneally +retropharyngeal +retropharyngitis +retroplacental +retroplexed +retroposed +retroposition +retropresbyteral +retropubic +retropulmonary +retropulsion +retropulsive +retroreception +retrorectal +retroreflective +retrorenal +retrorse +retrorsely +retroserrate +retroserrulate +retrospect +retrospection +retrospective +retrospectively +retrospectiveness +retrospectivity +retrosplenic +retrostalsis +retrostaltic +retrosternal +retrosusception +retrot +retrotarsal +retrotemporal +retrothyroid +retrotracheal +retrotransfer +retrotransference +retrotympanic +retrousse +retrovaccinate +retrovaccination +retrovaccine +retroverse +retroversion +retrovert +retrovision +retroxiphoid +retrude +retrue +retrusible +retrusion +retrust +retry +retted +retter +rettery +retting +rettory +retube +retuck +retumble +retumescence +retune +returban +returf +returfer +return +returnability +returnable +returned +returner +returnless +returnlessly +retuse +retwine +retwist +retying +retype +retzian +Reub +Reuben +Reubenites +Reuchlinian +Reuchlinism +Reuel +reundercut +reundergo +reundertake +reundulate +reundulation +reune +reunfold +reunification +reunify +reunion +reunionism +reunionist +reunionistic +reunitable +reunite +reunitedly +reuniter +reunition +reunitive +reunpack +reuphold +reupholster +reuplift +reurge +reuse +reutilization +reutilize +reutter +reutterance +rev +revacate +revaccinate +revaccination +revalenta +revalescence +revalescent +revalidate +revalidation +revalorization +revalorize +revaluate +revaluation +revalue +revamp +revamper +revampment +revaporization +revaporize +revarnish +revary +reve +reveal +revealability +revealable +revealableness +revealed +revealedly +revealer +revealing +revealingly +revealingness +revealment +revegetate +revegetation +revehent +reveil +reveille +revel +revelability +revelant +revelation +revelational +revelationer +revelationist +revelationize +revelative +revelator +revelatory +reveler +revellent +revelly +revelment +revelrout +revelry +revenant +revend +revender +revendicate +revendication +reveneer +revenge +revengeable +revengeful +revengefully +revengefulness +revengeless +revengement +revenger +revengingly +revent +reventilate +reventure +revenual +revenue +revenued +revenuer +rever +reverable +reverb +reverbatory +reverberant +reverberate +reverberation +reverberative +reverberator +reverberatory +reverbrate +reverdure +revere +revered +reverence +reverencer +reverend +reverendly +reverendship +reverent +reverential +reverentiality +reverentially +reverentialness +reverently +reverentness +reverer +reverie +reverification +reverify +reverist +revers +reversability +reversable +reversal +reverse +reversed +reversedly +reverseful +reverseless +reversely +reversement +reverser +reverseways +reversewise +reversi +reversibility +reversible +reversibleness +reversibly +reversification +reversifier +reversify +reversing +reversingly +reversion +reversionable +reversional +reversionally +reversionary +reversioner +reversionist +reversis +reversist +reversive +reverso +revert +revertal +reverter +revertibility +revertible +revertive +revertively +revery +revest +revestiary +revestry +revet +revete +revetement +revetment +revibrate +revibration +revibrational +revictorious +revictory +revictual +revictualment +revie +review +reviewability +reviewable +reviewage +reviewal +reviewer +revieweress +reviewish +reviewless +revigorate +revigoration +revile +revilement +reviler +reviling +revilingly +revindicate +revindication +reviolate +reviolation +revirescence +revirescent +Revisable +revisable +revisableness +revisal +revise +revisee +reviser +revisership +revisible +revision +revisional +revisionary +revisionism +revisionist +revisit +revisitant +revisitation +revisor +revisory +revisualization +revisualize +revitalization +revitalize +revitalizer +revivability +revivable +revivably +revival +revivalism +revivalist +revivalistic +revivalize +revivatory +revive +revivement +reviver +revivification +revivifier +revivify +reviving +revivingly +reviviscence +reviviscency +reviviscent +reviviscible +revivor +revocability +revocable +revocableness +revocably +revocation +revocative +revocatory +revoice +revokable +revoke +revokement +revoker +revokingly +revolant +revolatilize +revolt +revolter +revolting +revoltingly +revoltress +revolubility +revoluble +revolubly +revolunteer +revolute +revoluted +revolution +revolutional +revolutionally +revolutionarily +revolutionariness +revolutionary +revolutioneering +revolutioner +revolutionism +revolutionist +revolutionize +revolutionizement +revolutionizer +revolvable +revolvably +revolve +revolvement +revolvency +revolver +revolving +revolvingly +revomit +revote +revue +revuette +revuist +revulsed +revulsion +revulsionary +revulsive +revulsively +rewade +rewager +rewake +rewaken +rewall +rewallow +reward +rewardable +rewardableness +rewardably +rewardedly +rewarder +rewardful +rewardfulness +rewarding +rewardingly +rewardless +rewardproof +rewarehouse +rewarm +rewarn +rewash +rewater +rewave +rewax +rewaybill +rewayle +reweaken +rewear +reweave +rewed +reweigh +reweigher +reweight +rewelcome +reweld +rewend +rewet +rewhelp +rewhirl +rewhisper +rewhiten +rewiden +rewin +rewind +rewinder +rewirable +rewire +rewish +rewithdraw +rewithdrawal +rewood +reword +rework +reworked +rewound +rewove +rewoven +rewrap +rewrite +rewriter +Rex +rex +rexen +reyield +Reynard +Reynold +reyoke +reyouth +rezbanyite +rhabdite +rhabditiform +Rhabditis +rhabdium +Rhabdocarpum +Rhabdocoela +rhabdocoelan +rhabdocoele +Rhabdocoelida +rhabdocoelidan +rhabdocoelous +rhabdoid +rhabdoidal +rhabdolith +rhabdom +rhabdomal +rhabdomancer +rhabdomancy +rhabdomantic +rhabdomantist +Rhabdomonas +rhabdomyoma +rhabdomyosarcoma +rhabdomysarcoma +rhabdophane +rhabdophanite +Rhabdophora +rhabdophoran +Rhabdopleura +rhabdopod +rhabdos +rhabdosome +rhabdosophy +rhabdosphere +rhabdus +Rhacianectes +Rhacomitrium +Rhacophorus +Rhadamanthine +Rhadamanthus +Rhadamanthys +Rhaetian +Rhaetic +rhagades +rhagadiform +rhagiocrin +rhagionid +Rhagionidae +rhagite +Rhagodia +rhagon +rhagonate +rhagose +rhamn +Rhamnaceae +rhamnaceous +rhamnal +Rhamnales +rhamnetin +rhamninase +rhamninose +rhamnite +rhamnitol +rhamnohexite +rhamnohexitol +rhamnohexose +rhamnonic +rhamnose +rhamnoside +Rhamnus +rhamphoid +Rhamphorhynchus +Rhamphosuchus +rhamphotheca +Rhapidophyllum +Rhapis +rhapontic +rhaponticin +rhapontin +rhapsode +rhapsodic +rhapsodical +rhapsodically +rhapsodie +rhapsodism +rhapsodist +rhapsodistic +rhapsodize +rhapsodomancy +rhapsody +Rhaptopetalaceae +rhason +rhasophore +rhatania +rhatany +rhe +Rhea +rhea +rheadine +Rheae +rhebok +rhebosis +rheeboc +rheebok +rheen +rhegmatype +rhegmatypy +Rhegnopteri +rheic +Rheidae +Rheiformes +rhein +rheinic +rhema +rhematic +rhematology +rheme +Rhemish +Rhemist +Rhenish +rhenium +rheobase +rheocrat +rheologist +rheology +rheometer +rheometric +rheometry +rheophile +rheophore +rheophoric +rheoplankton +rheoscope +rheoscopic +rheostat +rheostatic +rheostatics +rheotactic +rheotan +rheotaxis +rheotome +rheotrope +rheotropic +rheotropism +rhesian +rhesus +rhetor +rhetoric +rhetorical +rhetorically +rhetoricalness +rhetoricals +rhetorician +rhetorize +Rheum +rheum +rheumarthritis +rheumatalgia +rheumatic +rheumatical +rheumatically +rheumaticky +rheumatism +rheumatismal +rheumatismoid +rheumative +rheumatiz +rheumatize +rheumatoid +rheumatoidal +rheumatoidally +rheumed +rheumic +rheumily +rheuminess +rheumy +Rhexia +rhexis +rhigolene +rhigosis +rhigotic +Rhina +rhinal +rhinalgia +Rhinanthaceae +Rhinanthus +rhinarium +rhincospasm +rhine +Rhineland +Rhinelander +rhinencephalic +rhinencephalon +rhinencephalous +rhinenchysis +Rhineodon +Rhineodontidae +rhinestone +Rhineura +rhineurynter +Rhinidae +rhinion +rhinitis +rhino +Rhinobatidae +Rhinobatus +rhinobyon +rhinocaul +rhinocele +rhinocelian +rhinocerial +rhinocerian +rhinocerine +rhinoceroid +rhinoceros +rhinoceroslike +rhinocerotic +Rhinocerotidae +rhinocerotiform +rhinocerotine +rhinocerotoid +rhinochiloplasty +Rhinoderma +rhinodynia +rhinogenous +rhinolalia +rhinolaryngology +rhinolaryngoscope +rhinolite +rhinolith +rhinolithic +rhinological +rhinologist +rhinology +rhinolophid +Rhinolophidae +rhinolophine +rhinopharyngeal +rhinopharyngitis +rhinopharynx +Rhinophidae +Rhinophis +rhinophonia +rhinophore +rhinophyma +rhinoplastic +rhinoplasty +rhinopolypus +Rhinoptera +Rhinopteridae +rhinorrhagia +rhinorrhea +rhinorrheal +rhinoscleroma +rhinoscope +rhinoscopic +rhinoscopy +rhinosporidiosis +Rhinosporidium +rhinotheca +rhinothecal +Rhinthonic +Rhinthonica +rhipidate +rhipidion +Rhipidistia +rhipidistian +rhipidium +Rhipidoglossa +rhipidoglossal +rhipidoglossate +Rhipidoptera +rhipidopterous +rhipiphorid +Rhipiphoridae +Rhipiptera +rhipipteran +rhipipterous +Rhipsalis +Rhiptoglossa +rhizanthous +rhizautoicous +Rhizina +Rhizinaceae +rhizine +rhizinous +Rhizobium +rhizocarp +Rhizocarpeae +rhizocarpean +rhizocarpian +rhizocarpic +rhizocarpous +rhizocaul +rhizocaulus +Rhizocephala +rhizocephalan +rhizocephalous +rhizocorm +Rhizoctonia +rhizoctoniose +rhizodermis +Rhizodus +Rhizoflagellata +rhizoflagellate +rhizogen +rhizogenetic +rhizogenic +rhizogenous +rhizoid +rhizoidal +rhizoma +rhizomatic +rhizomatous +rhizome +rhizomelic +rhizomic +rhizomorph +rhizomorphic +rhizomorphoid +rhizomorphous +rhizoneure +rhizophagous +rhizophilous +Rhizophora +Rhizophoraceae +rhizophoraceous +rhizophore +rhizophorous +rhizophyte +rhizoplast +rhizopod +Rhizopoda +rhizopodal +rhizopodan +rhizopodist +rhizopodous +Rhizopogon +Rhizopus +rhizosphere +Rhizostomae +Rhizostomata +rhizostomatous +rhizostome +rhizostomous +Rhizota +rhizotaxis +rhizotaxy +rhizote +rhizotic +rhizotomi +rhizotomy +rho +Rhoda +rhodaline +Rhodamine +rhodamine +rhodanate +Rhodanian +rhodanic +rhodanine +rhodanthe +rhodeose +Rhodes +Rhodesian +Rhodesoid +rhodeswood +Rhodian +rhodic +rhoding +rhodinol +rhodite +rhodium +rhodizite +rhodizonic +Rhodobacteriaceae +Rhodobacterioideae +rhodochrosite +Rhodococcus +Rhodocystis +rhodocyte +rhododendron +rhodolite +Rhodomelaceae +rhodomelaceous +rhodonite +Rhodope +rhodophane +Rhodophyceae +rhodophyceous +rhodophyll +Rhodophyllidaceae +Rhodophyta +rhodoplast +rhodopsin +Rhodora +Rhodoraceae +rhodorhiza +rhodosperm +Rhodospermeae +rhodospermin +rhodospermous +Rhodospirillum +Rhodothece +Rhodotypos +Rhodymenia +Rhodymeniaceae +rhodymeniaceous +Rhodymeniales +Rhoeadales +Rhoecus +Rhoeo +rhomb +rhombencephalon +rhombenporphyr +rhombic +rhombical +rhombiform +rhomboclase +rhomboganoid +Rhomboganoidei +rhombogene +rhombogenic +rhombogenous +rhombohedra +rhombohedral +rhombohedrally +rhombohedric +rhombohedron +rhomboid +rhomboidal +rhomboidally +rhomboideus +rhomboidly +rhomboquadratic +rhomborectangular +rhombos +rhombovate +Rhombozoa +rhombus +rhonchal +rhonchial +rhonchus +rhopalic +rhopalism +rhopalium +Rhopalocera +rhopaloceral +rhopalocerous +Rhopalura +rhotacism +rhotacismus +rhotacistic +rhotacize +rhubarb +rhubarby +rhumb +rhumba +rhumbatron +Rhus +rhyacolite +rhyme +rhymeless +rhymelet +rhymemaker +rhymemaking +rhymeproof +rhymer +rhymery +rhymester +rhymewise +rhymic +rhymist +rhymy +Rhynchobdellae +Rhynchobdellida +Rhynchocephala +Rhynchocephali +Rhynchocephalia +rhynchocephalian +rhynchocephalic +rhynchocephalous +Rhynchocoela +rhynchocoelan +rhynchocoelic +rhynchocoelous +rhyncholite +Rhynchonella +Rhynchonellacea +Rhynchonellidae +rhynchonelloid +Rhynchophora +rhynchophoran +rhynchophore +rhynchophorous +Rhynchopinae +Rhynchops +Rhynchosia +Rhynchospora +Rhynchota +rhynchotal +rhynchote +rhynchotous +rhynconellid +Rhyncostomi +Rhynia +Rhyniaceae +Rhynocheti +Rhynsburger +rhyobasalt +rhyodacite +rhyolite +rhyolitic +rhyotaxitic +rhyparographer +rhyparographic +rhyparographist +rhyparography +rhypography +rhyptic +rhyptical +rhysimeter +Rhyssa +rhythm +rhythmal +rhythmic +rhythmical +rhythmicality +rhythmically +rhythmicity +rhythmicize +rhythmics +rhythmist +rhythmizable +rhythmization +rhythmize +rhythmless +rhythmometer +rhythmopoeia +rhythmproof +Rhytidodon +rhytidome +rhytidosis +Rhytina +Rhytisma +rhyton +ria +rial +riancy +riant +riantly +riata +rib +ribald +ribaldish +ribaldly +ribaldrous +ribaldry +riband +Ribandism +Ribandist +ribandlike +ribandmaker +ribandry +ribat +ribaudequin +ribaudred +ribband +ribbandry +ribbed +ribber +ribbet +ribbidge +ribbing +ribble +ribbon +ribbonback +ribboner +ribbonfish +Ribbonism +ribbonlike +ribbonmaker +Ribbonman +ribbonry +ribbonweed +ribbonwood +ribbony +ribby +ribe +Ribes +Ribhus +ribless +riblet +riblike +riboflavin +ribonic +ribonuclease +ribonucleic +ribose +ribroast +ribroaster +ribroasting +ribskin +ribspare +Ribston +ribwork +ribwort +Ricardian +Ricardianism +Riccia +Ricciaceae +ricciaceous +Ricciales +rice +ricebird +riceland +ricer +ricey +rich +Richard +Richardia +Richardsonia +richdom +Richebourg +richellite +richen +riches +richesse +richling +richly +Richmond +Richmondena +richness +richt +richterite +richweed +ricin +ricine +ricinelaidic +ricinelaidinic +ricinic +ricinine +ricininic +ricinium +ricinoleate +ricinoleic +ricinolein +ricinolic +Ricinulei +Ricinus +ricinus +rick +rickardite +ricker +ricketily +ricketiness +ricketish +rickets +Rickettsia +rickettsial +Rickettsiales +rickettsialpox +rickety +rickey +rickle +rickmatic +rickrack +ricksha +rickshaw +rickstaddle +rickstand +rickstick +rickyard +ricochet +ricolettaite +ricrac +rictal +rictus +rid +ridable +ridableness +ridably +riddam +riddance +riddel +ridden +ridder +ridding +riddle +riddlemeree +riddler +riddling +riddlingly +riddlings +ride +rideable +rideau +riden +rident +rider +ridered +rideress +riderless +ridge +ridgeband +ridgeboard +ridgebone +ridged +ridgel +ridgelet +ridgelike +ridgeling +ridgepiece +ridgeplate +ridgepole +ridgepoled +ridger +ridgerope +ridgetree +ridgeway +ridgewise +ridgil +ridging +ridgingly +ridgling +ridgy +ridibund +ridicule +ridiculer +ridiculize +ridiculosity +ridiculous +ridiculously +ridiculousness +riding +ridingman +ridotto +rie +riebeckite +riem +Riemannean +Riemannian +riempie +rier +Riesling +rife +rifely +rifeness +Riff +riff +Riffi +Riffian +riffle +riffler +riffraff +Rifi +Rifian +rifle +riflebird +rifledom +rifleman +riflemanship +rifleproof +rifler +riflery +rifleshot +rifling +rift +rifter +riftless +rifty +rig +rigadoon +rigamajig +rigamarole +rigation +rigbane +Rigel +Rigelian +rigescence +rigescent +riggald +rigger +rigging +riggish +riggite +riggot +right +rightabout +righten +righteous +righteously +righteousness +righter +rightful +rightfully +rightfulness +rightheaded +righthearted +rightist +rightle +rightless +rightlessness +rightly +rightmost +rightness +righto +rightship +rightward +rightwardly +rightwards +righty +rigid +rigidify +rigidist +rigidity +rigidly +rigidness +rigidulous +rigling +rigmaree +rigmarole +rigmarolery +rigmarolic +rigmarolish +rigmarolishly +rignum +rigol +rigolette +rigor +rigorism +rigorist +rigoristic +rigorous +rigorously +rigorousness +rigsby +rigsdaler +Rigsmaal +Rigsmal +rigwiddie +rigwiddy +Rikari +rikisha +rikk +riksha +rikshaw +Riksmaal +Riksmal +rilawa +rile +riley +rill +rillet +rillett +rillette +rillock +rillstone +rilly +rim +rima +rimal +rimate +rimbase +rime +rimeless +rimer +rimester +rimfire +rimiform +rimland +rimless +rimmaker +rimmaking +rimmed +rimmer +rimose +rimosely +rimosity +rimous +rimpi +rimple +rimption +rimrock +rimu +rimula +rimulose +rimy +Rinaldo +rinceau +rinch +rincon +Rind +rind +Rinde +rinded +rinderpest +rindle +rindless +rindy +rine +ring +ringable +Ringatu +ringbark +ringbarker +ringbill +ringbird +ringbolt +ringbone +ringboned +ringcraft +ringdove +ringe +ringed +ringent +ringer +ringeye +ringgiver +ringgiving +ringgoer +ringhals +ringhead +ringiness +ringing +ringingly +ringingness +ringite +ringle +ringlead +ringleader +ringleaderless +ringleadership +ringless +ringlet +ringleted +ringlety +ringlike +ringmaker +ringmaking +ringman +ringmaster +ringneck +ringsail +ringside +ringsider +ringster +ringtail +ringtaw +ringtime +ringtoss +ringwalk +ringwall +ringwise +ringworm +ringy +rink +rinka +rinker +rinkite +rinncefada +rinneite +rinner +rinsable +rinse +rinser +rinsing +rinthereout +rintherout +Rio +rio +riot +rioter +rioting +riotingly +riotist +riotistic +riotocracy +riotous +riotously +riotousness +riotproof +riotry +rip +ripa +ripal +riparial +riparian +Riparii +riparious +ripcord +ripe +ripelike +ripely +ripen +ripener +ripeness +ripening +ripeningly +riper +ripgut +ripicolous +ripidolite +ripienist +ripieno +ripier +ripost +riposte +rippable +ripper +ripperman +rippet +rippier +ripping +rippingly +rippingness +rippit +ripple +rippleless +rippler +ripplet +rippling +ripplingly +ripply +rippon +riprap +riprapping +ripsack +ripsaw +ripsnorter +ripsnorting +Ripuarian +ripup +riroriro +risala +risberm +rise +risen +riser +rishi +rishtadar +risibility +risible +risibleness +risibles +risibly +rising +risk +risker +riskful +riskfulness +riskily +riskiness +riskish +riskless +riskproof +risky +risorial +risorius +risp +risper +risque +risquee +Riss +rissel +risser +Rissian +rissle +Rissoa +rissoid +Rissoidae +rist +ristori +rit +Rita +rita +ritardando +rite +riteless +ritelessness +ritling +ritornel +ritornelle +ritornello +Ritschlian +Ritschlianism +rittingerite +ritual +ritualism +ritualist +ritualistic +ritualistically +rituality +ritualize +ritualless +ritually +ritzy +riva +rivage +rival +rivalable +rivaless +rivalism +rivality +rivalize +rivalless +rivalrous +rivalry +rivalship +rive +rivel +rivell +riven +river +riverain +riverbank +riverbush +riverdamp +rivered +riverhead +riverhood +riverine +riverish +riverless +riverlet +riverlike +riverling +riverly +riverman +riverscape +riverside +riversider +riverward +riverwards +riverwash +riverway +riverweed +riverwise +rivery +rivet +riveter +rivethead +riveting +rivetless +rivetlike +Rivina +riving +rivingly +Rivinian +rivose +Rivularia +Rivulariaceae +rivulariaceous +rivulation +rivulet +rivulose +rix +rixatrix +rixy +riyal +riziform +rizzar +rizzle +rizzom +rizzomed +rizzonite +Ro +roach +roachback +road +roadability +roadable +roadbed +roadblock +roadbook +roadcraft +roaded +roader +roadfellow +roadhead +roadhouse +roading +roadite +roadless +roadlessness +roadlike +roadman +roadmaster +roadside +roadsider +roadsman +roadstead +roadster +roadstone +roadtrack +roadway +roadweed +roadwise +roadworthiness +roadworthy +roam +roamage +roamer +roaming +roamingly +roan +roanoke +roar +roarer +roaring +roaringly +roast +roastable +roaster +roasting +roastingly +Rob +rob +robalito +robalo +roband +robber +robberproof +robbery +robbin +robbing +robe +robeless +Robenhausian +rober +roberd +Roberdsman +Robert +Robigalia +Robigus +Robin +robin +robinet +robing +Robinia +robinin +robinoside +roble +robomb +roborant +roborate +roboration +roborative +roborean +roboreous +robot +robotesque +robotian +robotism +robotistic +robotization +robotize +robotlike +robotry +robur +roburite +robust +robustful +robustfully +robustfulness +robustic +robusticity +robustious +robustiously +robustiousness +robustity +robustly +robustness +roc +rocambole +Roccella +Roccellaceae +roccellic +roccellin +roccelline +Rochea +rochelime +Rochelle +rocher +rochet +rocheted +rock +rockable +rockably +rockaby +rockabye +rockallite +Rockaway +rockaway +rockbell +rockberry +rockbird +rockborn +rockbrush +rockcist +rockcraft +rockelay +rocker +rockery +rocket +rocketeer +rocketer +rocketlike +rocketor +rocketry +rockety +rockfall +rockfish +rockfoil +rockhair +rockhearted +Rockies +rockiness +rocking +rockingly +rockish +rocklay +rockless +rocklet +rocklike +rockling +rockman +rockrose +rockshaft +rockslide +rockstaff +rocktree +rockward +rockwards +rockweed +rockwood +rockwork +rocky +rococo +Rocouyenne +rocta +rod +rodd +roddikin +roddin +rodding +rode +rodent +Rodentia +rodential +rodentially +rodentian +rodenticidal +rodenticide +rodentproof +rodeo +Roderic +Roderick +rodge +rodham +Rodinal +Rodinesque +roding +rodingite +rodknight +rodless +rodlet +rodlike +rodmaker +rodman +rodney +Rodolph +Rodolphus +rodomont +rodomontade +rodomontadist +rodomontador +rodsman +rodster +rodwood +roe +roeblingite +roebuck +roed +roelike +roentgen +roentgenism +roentgenization +roentgenize +roentgenogram +roentgenograph +roentgenographic +roentgenographically +roentgenography +roentgenologic +roentgenological +roentgenologically +roentgenologist +roentgenology +roentgenometer +roentgenometry +roentgenoscope +roentgenoscopic +roentgenoscopy +roentgenotherapy +roentgentherapy +roer +roestone +roey +rog +rogan +rogation +Rogationtide +rogative +rogatory +Roger +roger +Rogero +rogersite +roggle +rogue +roguedom +rogueling +roguery +rogueship +roguing +roguish +roguishly +roguishness +rohan +Rohilla +rohob +rohun +rohuna +roi +roid +roil +roily +Roist +roister +roisterer +roistering +roisteringly +roisterly +roisterous +roisterously +roit +Rok +roka +roke +rokeage +rokee +rokelay +roker +rokey +roky +Roland +Rolandic +role +roleo +roll +rollable +rollback +rolled +rollejee +roller +rollerer +rollermaker +rollermaking +rollerman +rollerskater +rollerskating +rolley +rolleyway +rolleywayman +rolliche +rollichie +rollick +rollicker +rollicking +rollickingly +rollickingness +rollicksome +rollicksomeness +rollicky +rolling +rollingly +Rollinia +rollix +rollmop +Rollo +rollock +rollway +roloway +Romaean +Romagnese +Romagnol +Romagnole +Romaic +romaika +romaine +Romaji +romal +Roman +Romance +romance +romancealist +romancean +romanceful +romanceish +romanceishness +romanceless +romancelet +romancelike +romancemonger +romanceproof +romancer +romanceress +romancical +romancing +romancist +romancy +Romandom +Romane +Romanes +Romanese +Romanesque +Romanhood +Romanian +Romanic +Romaniform +Romanish +Romanism +Romanist +Romanistic +Romanite +Romanity +romanium +Romanization +Romanize +Romanizer +Romanly +Romansch +Romansh +romantic +romantical +romanticalism +romanticality +romantically +romanticalness +romanticism +romanticist +romanticistic +romanticity +romanticize +romanticly +romanticness +romantism +romantist +Romany +romanza +romaunt +rombos +rombowline +Rome +romeite +Romeo +romerillo +romero +Romescot +Romeshot +Romeward +Romewards +Romic +Romipetal +Romish +Romishly +Romishness +rommack +Rommany +Romney +Romneya +romp +romper +romping +rompingly +rompish +rompishly +rompishness +rompu +rompy +Romulian +Romulus +roncador +Roncaglian +roncet +ronco +rond +rondache +rondacher +rondawel +ronde +rondeau +rondel +rondelet +Rondeletia +rondelier +rondelle +rondellier +rondino +rondle +rondo +rondoletto +rondure +rone +Rong +Ronga +rongeur +ronquil +Ronsardian +Ronsardism +Ronsardist +Ronsardize +Ronsdorfer +Ronsdorfian +rontgen +ronyon +rood +roodebok +roodle +roodstone +roof +roofage +roofer +roofing +roofless +rooflet +rooflike +roofman +rooftree +roofward +roofwise +roofy +rooibok +rooinek +rook +rooker +rookeried +rookery +rookie +rookish +rooklet +rooklike +rooky +rool +room +roomage +roomed +roomer +roomful +roomie +roomily +roominess +roomkeeper +roomless +roomlet +roommate +roomstead +roomth +roomthily +roomthiness +roomthy +roomward +roomy +roon +roorback +roosa +Roosevelt +Rooseveltian +roost +roosted +rooster +roosterfish +roosterhood +roosterless +roosters +roostership +root +rootage +rootcap +rooted +rootedly +rootedness +rooter +rootery +rootfast +rootfastness +roothold +rootiness +rootle +rootless +rootlessness +rootlet +rootlike +rootling +rootstalk +rootstock +rootwalt +rootward +rootwise +rootworm +rooty +roove +ropable +rope +ropeable +ropeband +ropebark +ropedance +ropedancer +ropedancing +ropelayer +ropelaying +ropelike +ropemaker +ropemaking +ropeman +roper +roperipe +ropery +ropes +ropesmith +ropetrick +ropewalk +ropewalker +ropeway +ropework +ropily +ropiness +roping +ropish +ropishness +ropp +ropy +roque +roquelaure +roquer +roquet +roquette +roquist +roral +roratorio +Rori +roric +Roridula +Roridulaceae +roriferous +rorifluent +Roripa +Rorippa +roritorious +rorqual +rorty +rorulent +rory +Rosa +Rosabel +Rosabella +Rosaceae +rosacean +rosaceous +rosal +Rosales +Rosalia +Rosalie +Rosalind +Rosaline +Rosamond +rosanilin +rosaniline +rosarian +rosario +rosarium +rosaruby +rosary +rosated +Roschach +roscherite +roscid +roscoelite +rose +roseal +roseate +roseately +rosebay +rosebud +rosebush +rosed +rosedrop +rosefish +rosehead +rosehill +rosehiller +roseine +rosel +roseless +roselet +roselike +roselite +rosella +rosellate +roselle +Rosellinia +rosemary +Rosenbergia +rosenbuschite +roseola +roseolar +roseoliform +roseolous +roseous +roseroot +rosery +roset +rosetan +rosetangle +rosetime +Rosetta +rosette +rosetted +rosetty +rosetum +rosety +roseways +rosewise +rosewood +rosewort +Rosicrucian +Rosicrucianism +rosied +rosier +rosieresite +rosilla +rosillo +rosily +rosin +rosinate +rosinduline +Rosine +rosiness +rosinous +rosinweed +rosinwood +rosiny +rosland +rosmarine +Rosmarinus +Rosminian +Rosminianism +rosoli +rosolic +rosolio +rosolite +rosorial +ross +rosser +rossite +rostel +rostellar +Rostellaria +rostellarian +rostellate +rostelliform +rostellum +roster +rostra +rostral +rostrally +rostrate +rostrated +rostriferous +rostriform +rostroantennary +rostrobranchial +rostrocarinate +rostrocaudal +rostroid +rostrolateral +rostrular +rostrulate +rostrulum +rostrum +rosular +rosulate +rosy +rot +rota +rotacism +Rotal +rotal +Rotala +Rotalia +rotalian +rotaliform +rotaliiform +rotaman +rotameter +rotan +Rotanev +rotang +Rotarian +Rotarianism +rotarianize +Rotary +rotary +rotascope +rotatable +rotate +rotated +rotating +rotation +rotational +rotative +rotatively +rotativism +rotatodentate +rotatoplane +rotator +Rotatoria +rotatorian +rotatory +rotch +rote +rotella +rotenone +roter +rotge +rotgut +rother +rothermuck +rotifer +Rotifera +rotiferal +rotiferan +rotiferous +rotiform +rotisserie +roto +rotograph +rotogravure +rotor +rotorcraft +rotproof +Rotse +rottan +rotten +rottenish +rottenly +rottenness +rottenstone +rotter +rotting +rottle +rottlera +rottlerin +rottock +rottolo +rotula +rotulad +rotular +rotulet +rotulian +rotuliform +rotulus +rotund +rotunda +rotundate +rotundifoliate +rotundifolious +rotundiform +rotundify +rotundity +rotundly +rotundness +rotundo +rotundotetragonal +roub +roucou +roud +roue +rouelle +rouge +rougeau +rougeberry +rougelike +rougemontite +rougeot +rough +roughage +roughcast +roughcaster +roughdraft +roughdraw +roughdress +roughdry +roughen +roughener +rougher +roughet +roughhearted +roughheartedness +roughhew +roughhewer +roughhewn +roughhouse +roughhouser +roughhousing +roughhousy +roughie +roughing +roughings +roughish +roughishly +roughishness +roughleg +roughly +roughness +roughometer +roughride +roughrider +roughroot +roughscuff +roughsetter +roughshod +roughslant +roughsome +roughstring +roughstuff +roughtail +roughtailed +roughwork +roughwrought +roughy +rougy +rouille +rouky +roulade +rouleau +roulette +Rouman +Roumeliote +roun +rounce +rounceval +rouncy +round +roundabout +roundaboutly +roundaboutness +rounded +roundedly +roundedness +roundel +roundelay +roundeleer +rounder +roundfish +roundhead +roundheaded +roundheadedness +roundhouse +rounding +roundish +roundishness +roundlet +roundline +roundly +roundmouthed +roundness +roundnose +roundnosed +roundridge +roundseam +roundsman +roundtail +roundtop +roundtree +roundup +roundwise +roundwood +roundworm +roundy +roup +rouper +roupet +roupily +roupingwife +roupit +roupy +rouse +rouseabout +rousedness +rousement +rouser +rousing +rousingly +Rousseau +Rousseauan +Rousseauism +Rousseauist +Rousseauistic +Rousseauite +Roussellian +roussette +Roussillon +roust +roustabout +rouster +rousting +rout +route +router +routh +routhercock +routhie +routhiness +routhy +routinary +routine +routineer +routinely +routing +routinish +routinism +routinist +routinization +routinize +routivarite +routous +routously +rouvillite +rove +rover +rovet +rovetto +roving +rovingly +rovingness +row +rowable +rowan +rowanberry +rowboat +rowdily +rowdiness +rowdy +rowdydow +rowdydowdy +rowdyish +rowdyishly +rowdyishness +rowdyism +rowdyproof +rowed +rowel +rowelhead +rowen +Rowena +rower +rowet +rowiness +rowing +Rowland +rowlandite +Rowleian +rowlet +Rowley +Rowleyan +rowlock +rowport +rowty +rowy +rox +Roxana +Roxane +Roxburgh +Roxburghiaceae +Roxbury +Roxolani +Roxy +roxy +Roy +royal +royale +royalet +royalism +royalist +royalization +royalize +royally +royalty +Royena +royet +royetness +royetous +royetously +Roystonea +royt +rozum +Rua +ruach +ruana +rub +rubasse +rubato +rubbed +rubber +rubberer +rubberize +rubberless +rubberneck +rubbernecker +rubbernose +rubbers +rubberstone +rubberwise +rubbery +rubbing +rubbingstone +rubbish +rubbishing +rubbishingly +rubbishly +rubbishry +rubbishy +rubble +rubbler +rubblestone +rubblework +rubbly +rubdown +Rube +rubedinous +rubedity +rubefacient +rubefaction +rubelet +rubella +rubelle +rubellite +rubellosis +Rubensian +rubeola +rubeolar +rubeoloid +ruberythric +ruberythrinic +rubescence +rubescent +Rubia +Rubiaceae +rubiaceous +Rubiales +rubianic +rubiate +rubiator +rubican +rubicelle +Rubicola +Rubicon +rubiconed +rubicund +rubicundity +rubidic +rubidine +rubidium +rubied +rubific +rubification +rubificative +rubify +rubiginous +rubijervine +rubine +rubineous +rubious +ruble +rublis +rubor +rubric +rubrica +rubrical +rubricality +rubrically +rubricate +rubrication +rubricator +rubrician +rubricism +rubricist +rubricity +rubricize +rubricose +rubrific +rubrification +rubrify +rubrisher +rubrospinal +rubstone +Rubus +ruby +rubylike +rubytail +rubythroat +rubywise +rucervine +Rucervus +Ruchbah +ruche +ruching +ruck +rucker +ruckle +ruckling +rucksack +rucksey +ruckus +rucky +ructation +ruction +rud +rudas +Rudbeckia +rudd +rudder +rudderhead +rudderhole +rudderless +rudderlike +rudderpost +rudderstock +ruddied +ruddily +ruddiness +ruddle +ruddleman +ruddock +ruddy +ruddyish +rude +rudely +rudeness +rudented +rudenture +ruderal +rudesby +Rudesheimer +rudge +rudiment +rudimental +rudimentarily +rudimentariness +rudimentary +rudimentation +rudish +Rudista +Rudistae +rudistan +rudistid +rudity +Rudmasday +Rudolph +Rudolphus +rue +rueful +ruefully +ruefulness +ruelike +ruelle +Ruellia +ruen +ruer +ruesome +ruesomeness +ruewort +rufescence +rufescent +ruff +ruffable +ruffed +ruffer +ruffian +ruffianage +ruffiandom +ruffianhood +ruffianish +ruffianism +ruffianize +ruffianlike +ruffianly +ruffiano +ruffin +ruffle +ruffled +ruffleless +rufflement +ruffler +rufflike +ruffliness +ruffling +ruffly +ruficarpous +ruficaudate +ruficoccin +ruficornate +rufigallic +rufoferruginous +rufofulvous +rufofuscous +rufopiceous +rufotestaceous +rufous +rufter +rufulous +Rufus +rufus +rug +ruga +rugate +Rugbeian +Rugby +rugged +ruggedly +ruggedness +Rugger +rugging +ruggle +ruggy +rugheaded +ruglike +rugmaker +rugmaking +Rugosa +rugosa +rugose +rugosely +rugosity +rugous +rugulose +ruin +ruinable +ruinate +ruination +ruinatious +ruinator +ruined +ruiner +ruing +ruiniform +ruinlike +ruinous +ruinously +ruinousness +ruinproof +Rukbat +rukh +rulable +Rulander +rule +ruledom +ruleless +rulemonger +ruler +rulership +ruling +rulingly +rull +ruller +rullion +Rum +rum +rumal +Ruman +Rumanian +rumbelow +rumble +rumblegarie +rumblegumption +rumblement +rumbler +rumbling +rumblingly +rumbly +rumbo +rumbooze +rumbowline +rumbowling +rumbullion +rumbumptious +rumbustical +rumbustious +rumbustiousness +rumchunder +Rumelian +rumen +rumenitis +rumenocentesis +rumenotomy +Rumex +rumfustian +rumgumption +rumgumptious +ruminal +ruminant +Ruminantia +ruminantly +ruminate +ruminating +ruminatingly +rumination +ruminative +ruminatively +ruminator +rumkin +rumless +rumly +rummage +rummager +rummagy +rummer +rummily +rumminess +rummish +rummy +rumness +rumney +rumor +rumorer +rumormonger +rumorous +rumorproof +rumourmonger +rump +rumpad +rumpadder +rumpade +Rumper +rumple +rumpless +rumply +rumpscuttle +rumpuncheon +rumpus +rumrunner +rumrunning +rumshop +rumswizzle +rumtytoo +run +runabout +runagate +runaround +runaway +runback +runboard +runby +runch +runchweed +runcinate +rundale +Rundi +rundle +rundlet +rune +runecraft +runed +runefolk +runeless +runelike +runer +runesmith +runestaff +runeword +runfish +rung +runghead +rungless +runholder +runic +runically +runiform +runite +runkeeper +runkle +runkly +runless +runlet +runman +runnable +runnel +runner +runnet +running +runningly +runny +runoff +runologist +runology +runout +runover +runproof +runrig +runround +runt +runted +runtee +runtiness +runtish +runtishly +runtishness +runty +runway +rupa +rupee +Rupert +rupestral +rupestrian +rupestrine +rupia +rupiah +rupial +Rupicapra +Rupicaprinae +rupicaprine +Rupicola +Rupicolinae +rupicoline +rupicolous +rupie +rupitic +Ruppia +ruptile +ruption +ruptive +ruptuary +rupturable +rupture +ruptured +rupturewort +rural +ruralism +ruralist +ruralite +rurality +ruralization +ruralize +rurally +ruralness +rurban +ruridecanal +rurigenous +Ruritania +Ruritanian +ruru +Rus +Rusa +Ruscus +ruse +rush +rushbush +rushed +rushen +rusher +rushiness +rushing +rushingly +rushingness +rushland +rushlight +rushlighted +rushlike +rushlit +rushy +Rusin +rusine +rusk +ruskin +Ruskinian +rusky +rusma +rusot +ruspone +Russ +russel +Russelia +Russellite +Russene +russet +russeting +russetish +russetlike +russety +Russia +russia +Russian +Russianism +Russianist +Russianization +Russianize +Russification +Russificator +Russifier +Russify +Russine +Russism +Russniak +Russolatrous +Russolatry +Russomania +Russomaniac +Russomaniacal +Russophile +Russophilism +Russophilist +Russophobe +Russophobia +Russophobiac +Russophobism +Russophobist +russud +Russula +rust +rustable +rustful +rustic +rustical +rustically +rusticalness +rusticate +rustication +rusticator +rusticial +rusticism +rusticity +rusticize +rusticly +rusticness +rusticoat +rustily +rustiness +rustle +rustler +rustless +rustling +rustlingly +rustlingness +rustly +rustproof +rustre +rustred +rusty +rustyback +rustyish +ruswut +rut +Ruta +rutabaga +Rutaceae +rutaceous +rutaecarpine +rutate +rutch +rutelian +Rutelinae +Ruth +ruth +ruthenate +Ruthene +Ruthenian +ruthenic +ruthenious +ruthenium +ruthenous +ruther +rutherford +rutherfordine +rutherfordite +ruthful +ruthfully +ruthfulness +ruthless +ruthlessly +ruthlessness +rutic +rutidosis +rutilant +rutilated +rutile +rutilous +rutin +rutinose +Rutiodon +ruttee +rutter +ruttiness +ruttish +ruttishly +ruttishness +rutty +Rutuli +rutyl +rutylene +ruvid +rux +rvulsant +ryal +ryania +rybat +ryder +rye +ryen +Rymandra +ryme +Rynchospora +rynchosporous +rynd +rynt +ryot +ryotwar +ryotwari +rype +rypeck +rytidosis +Rytina +Ryukyu +S +s +sa +saa +Saan +Saarbrucken +sab +Saba +sabadilla +sabadine +sabadinine +Sabaean +Sabaeanism +Sabaeism +sabaigrass +Sabaism +Sabaist +Sabal +Sabalaceae +sabalo +Saban +sabanut +Sabaoth +Sabathikos +Sabazian +Sabazianism +Sabazios +sabbat +Sabbatarian +Sabbatarianism +Sabbatary +Sabbatean +Sabbath +sabbath +Sabbathaian +Sabbathaic +Sabbathaist +Sabbathbreaker +Sabbathbreaking +Sabbathism +Sabbathize +Sabbathkeeper +Sabbathkeeping +Sabbathless +Sabbathlike +Sabbathly +Sabbatia +sabbatia +Sabbatian +Sabbatic +sabbatic +Sabbatical +sabbatical +Sabbatically +Sabbaticalness +sabbatine +sabbatism +Sabbatist +Sabbatization +Sabbatize +sabbaton +sabbitha +sabdariffa +sabe +sabeca +Sabella +sabella +sabellan +Sabellaria +sabellarian +Sabelli +Sabellian +Sabellianism +Sabellianize +sabellid +Sabellidae +sabelloid +saber +saberbill +sabered +saberleg +saberlike +saberproof +sabertooth +saberwing +Sabia +Sabiaceae +sabiaceous +Sabian +Sabianism +sabicu +Sabik +Sabina +sabina +Sabine +sabine +Sabinian +sabino +Sabir +sable +sablefish +sableness +sably +sabora +saboraim +sabot +sabotage +saboted +saboteur +sabotine +Sabra +sabra +sabretache +Sabrina +Sabromin +sabromin +Sabuja +sabuline +sabulite +sabulose +sabulosity +sabulous +sabulum +saburra +saburral +saburration +sabutan +sabzi +Sac +sac +Sacae +sacalait +sacaline +sacaton +sacatra +sacbrood +saccade +saccadic +Saccammina +saccate +saccated +Saccha +saccharamide +saccharase +saccharate +saccharated +saccharephidrosis +saccharic +saccharide +sacchariferous +saccharification +saccharifier +saccharify +saccharilla +saccharimeter +saccharimetric +saccharimetrical +saccharimetry +saccharin +saccharinate +saccharinated +saccharine +saccharineish +saccharinely +saccharinic +saccharinity +saccharization +saccharize +saccharobacillus +saccharobiose +saccharobutyric +saccharoceptive +saccharoceptor +saccharochemotropic +saccharocolloid +saccharofarinaceous +saccharogalactorrhea +saccharogenic +saccharohumic +saccharoid +saccharoidal +saccharolactonic +saccharolytic +saccharometabolic +saccharometabolism +saccharometer +saccharometric +saccharometry +saccharomucilaginous +Saccharomyces +saccharomyces +Saccharomycetaceae +saccharomycetaceous +Saccharomycetales +saccharomycete +Saccharomycetes +saccharomycetic +saccharomycosis +saccharon +saccharonate +saccharone +saccharonic +saccharophylly +saccharorrhea +saccharoscope +saccharose +saccharostarchy +saccharosuria +saccharotriose +saccharous +saccharulmic +saccharulmin +Saccharum +saccharum +saccharuria +sacciferous +sacciform +Saccobranchiata +saccobranchiate +Saccobranchus +saccoderm +Saccolabium +saccolabium +saccomyian +saccomyid +Saccomyidae +Saccomyina +saccomyine +saccomyoid +Saccomyoidea +saccomyoidean +Saccomys +Saccopharyngidae +Saccopharynx +Saccorhiza +saccos +saccular +sacculate +sacculated +sacculation +saccule +Sacculina +sacculoutricular +sacculus +saccus +sacellum +sacerdocy +sacerdotage +sacerdotal +sacerdotalism +sacerdotalist +sacerdotalize +sacerdotally +sacerdotical +sacerdotism +sachamaker +sachem +sachemdom +sachemic +sachemship +sachet +Sacheverell +Sacian +sack +sackage +sackamaker +sackbag +sackbut +sackcloth +sackclothed +sackdoudle +sacked +sacken +sacker +sackful +sacking +sackless +sacklike +sackmaker +sackmaking +sackman +sacktime +saclike +saco +sacope +sacque +sacra +sacrad +sacral +sacralgia +sacralization +sacrament +sacramental +sacramentalism +sacramentalist +sacramentality +sacramentally +sacramentalness +Sacramentarian +sacramentarian +sacramentarianism +sacramentarist +Sacramentary +sacramentary +sacramenter +sacramentism +sacramentize +Sacramento +sacramentum +sacraria +sacrarial +sacrarium +sacrectomy +sacred +sacredly +sacredness +sacrificable +sacrificant +Sacrificati +sacrification +sacrificator +sacrificatory +sacrificature +sacrifice +sacrificer +sacrificial +sacrificially +sacrificing +sacrilege +sacrileger +sacrilegious +sacrilegiously +sacrilegiousness +sacrilegist +sacrilumbal +sacrilumbalis +sacring +Sacripant +sacrist +sacristan +sacristy +sacro +sacrocaudal +sacrococcygeal +sacrococcygean +sacrococcygeus +sacrococcyx +sacrocostal +sacrocotyloid +sacrocotyloidean +sacrocoxalgia +sacrocoxitis +sacrodorsal +sacrodynia +sacrofemoral +sacroiliac +sacroinguinal +sacroischiac +sacroischiadic +sacroischiatic +sacrolumbal +sacrolumbalis +sacrolumbar +sacropectineal +sacroperineal +sacropictorial +sacroposterior +sacropubic +sacrorectal +sacrosanct +sacrosanctity +sacrosanctness +sacrosciatic +sacrosecular +sacrospinal +sacrospinalis +sacrospinous +sacrotomy +sacrotuberous +sacrovertebral +sacrum +sad +Sadachbia +Sadalmelik +Sadalsuud +sadden +saddening +saddeningly +saddik +saddirham +saddish +saddle +saddleback +saddlebag +saddlebow +saddlecloth +saddled +saddleleaf +saddleless +saddlelike +saddlenose +saddler +saddlery +saddlesick +saddlesore +saddlesoreness +saddlestead +saddletree +saddlewise +saddling +Sadducaic +Sadducean +Sadducee +Sadduceeism +Sadduceeist +Sadducism +Sadducize +sade +sadh +sadhe +sadhearted +sadhu +sadic +Sadie +sadiron +sadism +sadist +sadistic +sadistically +Sadite +sadly +sadness +sado +sadomasochism +Sadr +sadr +saecula +saeculum +Saeima +saernaite +saeter +saeume +Safar +safari +Safavi +Safawid +safe +safeblower +safeblowing +safebreaker +safebreaking +safecracking +safeguard +safeguarder +safehold +safekeeper +safekeeping +safelight +safely +safemaker +safemaking +safen +safener +safeness +safety +Saffarian +Saffarid +saffian +safflor +safflorite +safflow +safflower +saffron +saffroned +saffrontree +saffronwood +saffrony +Safi +Safine +Safini +safranin +safranine +safranophile +safrole +saft +sag +saga +sagaciate +sagacious +sagaciously +sagaciousness +sagacity +Sagai +sagaie +sagaman +sagamite +sagamore +sagapenum +sagathy +sage +sagebrush +sagebrusher +sagebush +sageleaf +sagely +sagene +sageness +sagenite +sagenitic +Sageretia +sagerose +sageship +sagewood +sagger +sagging +saggon +saggy +saghavart +Sagina +saginate +sagination +saging +Sagitarii +sagitta +sagittal +sagittally +Sagittaria +Sagittariid +Sagittarius +sagittarius +Sagittary +sagittary +sagittate +Sagittid +sagittiferous +sagittiform +sagittocyst +sagittoid +sagless +sago +sagoin +sagolike +Sagra +saguaro +Saguerus +sagum +saguran +sagvandite +sagwire +sagy +sah +Sahadeva +Sahaptin +Sahara +Saharan +Saharian +Saharic +sahh +sahib +Sahibah +Sahidic +sahme +Saho +sahoukar +sahukar +sai +saic +said +Saidi +saiga +sail +sailable +sailage +sailboat +sailcloth +sailed +sailer +sailfish +sailflying +sailing +sailingly +sailless +sailmaker +sailmaking +sailor +sailoring +sailorizing +sailorless +sailorlike +sailorly +sailorman +sailorproof +sailplane +sailship +sailsman +saily +saim +saimiri +saimy +sain +Sainfoin +saint +saintdom +sainted +saintess +sainthood +saintish +saintism +saintless +saintlike +saintlily +saintliness +saintling +saintly +saintologist +saintology +Saintpaulia +saintship +saip +Saiph +sair +sairly +sairve +sairy +Saite +saithe +Saitic +Saiva +Saivism +saj +sajou +Sak +Saka +Sakai +Sakalava +sake +sakeber +sakeen +Sakel +Sakelarides +Sakell +Sakellaridis +saker +sakeret +Sakha +saki +sakieh +Sakkara +Saktism +sakulya +Sakyamuni +sal +salaam +salaamlike +salability +salable +salableness +salably +salaceta +salacious +salaciously +salaciousness +salacity +salacot +salad +salading +salago +salagrama +salal +salamandarin +salamander +salamanderlike +Salamandra +salamandrian +Salamandridae +salamandriform +Salamandrina +salamandrine +salamandroid +salambao +Salaminian +salamo +salampore +salangane +salangid +Salangidae +Salar +salar +salariat +salaried +salary +salaryless +salat +salay +sale +salegoer +salele +salema +salenixon +salep +saleratus +saleroom +salesclerk +Salesian +saleslady +salesman +salesmanship +salespeople +salesperson +salesroom +saleswoman +salework +saleyard +salfern +Salian +Saliaric +Salic +salic +Salicaceae +salicaceous +Salicales +Salicariaceae +salicetum +salicin +salicional +salicorn +Salicornia +salicyl +salicylal +salicylaldehyde +salicylamide +salicylanilide +salicylase +salicylate +salicylic +salicylide +salicylidene +salicylism +salicylize +salicylous +salicyluric +salicylyl +salience +salient +Salientia +salientian +saliently +saliferous +salifiable +salification +salify +saligenin +saligot +salimeter +salimetry +Salina +salina +Salinan +salination +saline +Salinella +salinelle +salineness +saliniferous +salinification +saliniform +salinity +salinize +salinometer +salinometry +salinosulphureous +salinoterreous +Salisburia +Salish +Salishan +salite +salited +Saliva +saliva +salival +Salivan +salivant +salivary +salivate +salivation +salivator +salivatory +salivous +Salix +salix +salle +sallee +salleeman +sallenders +sallet +sallier +salloo +sallow +sallowish +sallowness +sallowy +Sally +sally +Sallybloom +sallyman +sallywood +Salm +salma +salmagundi +salmiac +salmine +salmis +Salmo +Salmon +salmon +salmonberry +Salmonella +salmonella +salmonellae +salmonellosis +salmonet +salmonid +Salmonidae +salmoniform +salmonlike +salmonoid +Salmonoidea +Salmonoidei +salmonsite +salmwood +salnatron +Salol +salol +Salome +salometer +salometry +salomon +Salomonia +Salomonian +Salomonic +salon +saloon +saloonist +saloonkeeper +saloop +Salopian +salopian +salp +Salpa +salpa +salpacean +salpian +salpicon +Salpidae +salpiform +Salpiglossis +salpiglossis +salpingectomy +salpingemphraxis +salpinges +salpingian +salpingion +salpingitic +salpingitis +salpingocatheterism +salpingocele +salpingocyesis +salpingomalleus +salpingonasal +salpingopalatal +salpingopalatine +salpingoperitonitis +salpingopexy +salpingopharyngeal +salpingopharyngeus +salpingopterygoid +salpingorrhaphy +salpingoscope +salpingostaphyline +salpingostenochoria +salpingostomatomy +salpingostomy +salpingotomy +salpinx +salpoid +salse +salsifis +salsify +salsilla +Salsola +Salsolaceae +salsolaceous +salsuginous +salt +salta +saltant +saltarella +saltarello +saltary +saltate +saltation +saltativeness +Saltator +saltator +Saltatoria +saltatorial +saltatorian +saltatoric +saltatorious +saltatory +saltbush +saltcat +saltcatch +saltcellar +salted +saltee +salten +salter +saltern +saltery +saltfat +saltfoot +salthouse +saltier +saltierra +saltierwise +Saltigradae +saltigrade +saltimbanco +saltimbank +saltimbankery +saltine +saltiness +salting +saltish +saltishly +saltishness +saltless +saltlessness +saltly +saltmaker +saltmaking +saltman +saltmouth +saltness +saltometer +saltorel +saltpan +saltpeter +saltpetrous +saltpond +saltspoon +saltspoonful +saltsprinkler +saltus +saltweed +saltwife +saltworker +saltworks +saltwort +salty +salubrify +salubrious +salubriously +salubriousness +salubrity +saluki +salung +salutarily +salutariness +salutary +salutation +salutational +salutationless +salutatious +salutatorian +salutatorily +salutatorium +salutatory +salute +saluter +salutiferous +salutiferously +Salva +salvability +salvable +salvableness +salvably +Salvadora +salvadora +Salvadoraceae +salvadoraceous +Salvadoran +Salvadorian +salvage +salvageable +salvagee +salvageproof +salvager +salvaging +Salvarsan +salvarsan +salvatella +salvation +salvational +salvationism +salvationist +salvatory +salve +salveline +Salvelinus +salver +salverform +Salvia +salvianin +salvific +salvifical +salvifically +Salvinia +Salviniaceae +salviniaceous +Salviniales +salviol +salvo +salvor +salvy +Salwey +salzfelle +Sam +sam +Samadera +samadh +samadhi +samaj +Samal +saman +Samandura +Samani +Samanid +Samantha +samara +samaria +samariform +Samaritan +Samaritaness +Samaritanism +samarium +Samarkand +samaroid +samarra +samarskite +Samas +samba +Sambal +sambal +sambaqui +sambar +Sambara +Sambathe +sambhogakaya +Sambo +sambo +Sambucaceae +Sambucus +sambuk +sambuke +sambunigrin +Samburu +same +samekh +samel +sameliness +samely +samen +sameness +samesome +Samgarnebo +samh +Samhain +samhita +Samian +samiel +samiresite +samiri +samisen +Samish +samite +samkara +samlet +sammel +sammer +sammier +Sammy +sammy +Samnani +Samnite +Samoan +Samogitian +samogonka +Samolus +Samosatenian +samothere +Samotherium +Samothracian +samovar +Samoyed +Samoyedic +samp +sampaguita +sampaloc +sampan +samphire +sampi +sample +sampleman +sampler +samplery +sampling +Sampsaean +Samsam +samsara +samshu +Samsien +samskara +Samson +samson +Samsoness +Samsonian +Samsonic +Samsonistic +samsonite +Samucan +Samucu +Samuel +samurai +Samydaceae +San +san +sanability +sanable +sanableness +sanai +sanative +sanativeness +sanatoria +sanatorium +sanatory +Sanballat +sanbenito +sancho +sanct +sancta +sanctanimity +sanctifiable +sanctifiableness +sanctifiably +sanctificate +sanctification +sanctified +sanctifiedly +sanctifier +sanctify +sanctifyingly +sanctilogy +sanctiloquent +sanctimonial +sanctimonious +sanctimoniously +sanctimoniousness +sanctimony +sanction +sanctionable +sanctionary +sanctionative +sanctioner +sanctionist +sanctionless +sanctionment +sanctitude +sanctity +sanctologist +Sanctology +sanctorium +sanctuaried +sanctuarize +sanctuary +sanctum +Sanctus +Sancy +sancyite +sand +sandak +sandal +sandaled +sandaliform +sandaling +sandalwood +sandalwort +sandan +sandarac +sandaracin +sandastros +Sandawe +sandbag +sandbagger +sandbank +sandbin +sandblast +sandboard +sandbox +sandboy +sandbur +sandclub +sandculture +sanded +Sandemanian +Sandemanianism +Sandemanism +Sander +sander +sanderling +sanders +sandfish +sandflower +sandglass +sandheat +sandhi +sandiferous +sandiness +sanding +sandiver +sandix +sandlapper +sandless +sandlike +sandling +sandman +sandnatter +sandnecker +sandpaper +sandpaperer +sandpeep +sandpiper +sandproof +sandrock +sandspit +sandspur +sandstay +sandstone +sandstorm +sandust +sandweed +sandweld +sandwich +sandwood +sandworm +sandwort +Sandy +sandy +sandyish +sane +sanely +saneness +Sanetch +Sanforized +sang +sanga +Sangamon +sangar +sangaree +sangei +sanger +sangerbund +sangerfest +Sanggil +sangha +Sangir +Sangirese +sanglant +sangley +Sangraal +sangreeroot +sangrel +sangsue +sanguicolous +sanguifacient +sanguiferous +sanguification +sanguifier +sanguifluous +sanguimotor +sanguimotory +sanguinaceous +Sanguinaria +sanguinarily +sanguinariness +sanguinary +sanguine +sanguineless +sanguinely +sanguineness +sanguineobilious +sanguineophlegmatic +sanguineous +sanguineousness +sanguineovascular +sanguinicolous +sanguiniferous +sanguinification +sanguinism +sanguinity +sanguinivorous +sanguinocholeric +sanguinolency +sanguinolent +sanguinopoietic +sanguinous +Sanguisorba +Sanguisorbaceae +sanguisuge +sanguisugent +sanguisugous +sanguivorous +Sanhedrim +Sanhedrin +Sanhedrist +Sanhita +sanicle +Sanicula +sanidine +sanidinic +sanidinite +sanies +sanification +sanify +sanious +sanipractic +sanitarian +sanitarily +sanitarist +sanitarium +sanitary +sanitate +sanitation +sanitationist +sanitist +sanitize +sanity +sanjak +sanjakate +sanjakbeg +sanjakship +sank +sankha +Sankhya +sannaite +Sannoisian +sannup +sannyasi +sannyasin +sanopurulent +sanoserous +Sanpoil +sans +Sansar +sansei +Sansevieria +sanshach +sansi +Sanskrit +Sanskritic +Sanskritist +Sanskritization +Sanskritize +sant +Santa +Santal +santal +Santalaceae +santalaceous +Santalales +Santali +santalic +santalin +santalol +Santalum +santalwood +santapee +Santee +santene +Santiago +santimi +santims +santir +Santo +Santolina +santon +santonica +santonin +santoninic +santorinite +Santos +sanukite +Sanvitalia +Sanyakoan +sao +Saoshyant +sap +sapa +sapajou +sapan +sapanwood +sapbush +sapek +Saperda +sapful +Sapharensian +saphead +sapheaded +sapheadedness +saphena +saphenal +saphenous +saphie +sapid +sapidity +sapidless +sapidness +sapience +sapiency +sapient +sapiential +sapientially +sapientize +sapiently +sapin +sapinda +Sapindaceae +sapindaceous +Sapindales +sapindaship +Sapindus +Sapium +sapiutan +saple +sapless +saplessness +sapling +saplinghood +sapo +sapodilla +sapogenin +saponaceous +saponaceousness +saponacity +Saponaria +saponarin +saponary +Saponi +saponifiable +saponification +saponifier +saponify +saponin +saponite +sapophoric +sapor +saporific +saporosity +saporous +Sapota +sapota +Sapotaceae +sapotaceous +sapote +sapotilha +sapotilla +sapotoxin +sappanwood +sappare +sapper +Sapphic +sapphic +sapphire +sapphireberry +sapphired +sapphirewing +sapphiric +sapphirine +Sapphism +Sapphist +Sappho +sappiness +sapping +sapples +sappy +sapremia +sapremic +saprine +saprocoll +saprodil +saprodontia +saprogenic +saprogenous +Saprolegnia +Saprolegniaceae +saprolegniaceous +Saprolegniales +saprolegnious +saprolite +saprolitic +sapropel +sapropelic +sapropelite +saprophagan +saprophagous +saprophile +saprophilous +saprophyte +saprophytic +saprophytically +saprophytism +saprostomous +saprozoic +sapsago +sapskull +sapsuck +sapsucker +sapucaia +sapucainha +sapwood +sapwort +sar +Sara +saraad +sarabacan +Sarabaite +saraband +Saracen +Saracenian +Saracenic +Saracenical +Saracenism +Saracenlike +Sarada +saraf +Sarah +Sarakolet +Sarakolle +Saramaccaner +Saran +sarangi +sarangousty +Saratoga +Saratogan +Saravan +Sarawakese +sarawakite +Sarawan +sarbacane +sarbican +sarcasm +sarcasmproof +sarcast +sarcastic +sarcastical +sarcastically +sarcasticalness +sarcasticness +sarcelle +sarcenet +sarcilis +Sarcina +sarcine +sarcitis +sarcle +sarcler +sarcoadenoma +Sarcobatus +sarcoblast +sarcocarcinoma +sarcocarp +sarcocele +Sarcococca +Sarcocolla +sarcocollin +sarcocyst +Sarcocystidea +sarcocystidean +sarcocystidian +Sarcocystis +sarcocystoid +sarcocyte +sarcode +sarcoderm +Sarcodes +sarcodic +sarcodictyum +Sarcodina +sarcodous +sarcoenchondroma +sarcogenic +sarcogenous +sarcoglia +Sarcogyps +sarcoid +sarcolactic +sarcolemma +sarcolemmic +sarcolemmous +sarcoline +sarcolite +sarcologic +sarcological +sarcologist +sarcology +sarcolysis +sarcolyte +sarcolytic +sarcoma +sarcomatoid +sarcomatosis +sarcomatous +sarcomere +Sarcophaga +sarcophagal +sarcophagi +sarcophagic +sarcophagid +Sarcophagidae +sarcophagine +sarcophagize +sarcophagous +sarcophagus +sarcophagy +sarcophile +sarcophilous +Sarcophilus +sarcoplasm +sarcoplasma +sarcoplasmatic +sarcoplasmic +sarcoplast +sarcoplastic +sarcopoietic +Sarcopsylla +Sarcopsyllidae +Sarcoptes +sarcoptic +sarcoptid +Sarcoptidae +Sarcorhamphus +sarcosepsis +sarcosepta +sarcoseptum +sarcosine +sarcosis +sarcosoma +sarcosperm +sarcosporid +Sarcosporida +Sarcosporidia +sarcosporidial +sarcosporidian +sarcosporidiosis +sarcostosis +sarcostyle +sarcotheca +sarcotherapeutics +sarcotherapy +sarcotic +sarcous +Sarcura +Sard +sard +sardachate +Sardanapalian +Sardanapalus +sardel +Sardian +sardine +sardinewise +Sardinian +sardius +Sardoin +sardonic +sardonical +sardonically +sardonicism +sardonyx +sare +sargasso +Sargassum +sargassum +sargo +Sargonic +Sargonid +Sargonide +sargus +sari +sarif +Sarigue +sarigue +sarinda +sarip +sark +sarkar +sarkful +sarkical +sarkine +sarking +sarkinite +sarkit +sarkless +sarlak +sarlyk +Sarmatian +Sarmatic +sarmatier +sarment +sarmenta +sarmentaceous +sarmentiferous +sarmentose +sarmentous +sarmentum +sarna +sarod +saron +sarong +saronic +saronide +saros +Sarothamnus +Sarothra +sarothrum +sarpler +sarpo +sarra +Sarracenia +sarracenia +Sarraceniaceae +sarraceniaceous +sarracenial +Sarraceniales +sarraf +sarrazin +sarrusophone +sarrusophonist +sarsa +sarsaparilla +sarsaparillin +Sarsar +Sarsechim +sarsen +sarsenet +Sarsi +Sart +sart +sartage +sartain +Sartish +sartor +sartoriad +sartorial +sartorially +sartorian +sartorite +sartorius +Saruk +sarus +Sarvarthasiddha +sarwan +Sarzan +sasa +sasan +sasani +sasanqua +sash +sashay +sashery +sashing +sashless +sasin +sasine +saskatoon +sassaby +sassafac +sassafrack +sassafras +Sassak +Sassanian +Sassanid +Sassanidae +Sassanide +Sassenach +sassolite +sassy +sassywood +Sastean +sat +satable +Satan +satan +Satanael +Satanas +satang +satanic +satanical +satanically +satanicalness +Satanism +Satanist +satanist +Satanistic +Satanity +satanize +Satanology +Satanophany +Satanophil +Satanophobia +Satanship +satara +satchel +satcheled +sate +sateen +sateenwood +sateless +satelles +satellitarian +satellite +satellited +satellitesimal +satellitian +satellitic +satellitious +satellitium +satellitoid +satellitory +satelloid +satiability +satiable +satiableness +satiably +satiate +satiation +Satieno +satient +satiety +satin +satinbush +satine +satined +satinette +satinfin +satinflower +satinite +satinity +satinize +satinleaf +satinlike +satinpod +satinwood +satiny +satire +satireproof +satiric +satirical +satirically +satiricalness +satirist +satirizable +satirize +satirizer +satisdation +satisdiction +satisfaction +satisfactional +satisfactionist +satisfactionless +satisfactive +satisfactorily +satisfactoriness +satisfactorious +satisfactory +satisfiable +satisfice +satisfied +satisfiedly +satisfiedness +satisfier +satisfy +satisfying +satisfyingly +satisfyingness +satispassion +satlijk +Satrae +satrap +satrapal +satrapess +satrapic +satrapical +satrapy +satron +Satsuma +sattle +sattva +satura +saturability +saturable +saturant +saturate +saturated +saturater +saturation +saturator +Saturday +Satureia +Saturn +Saturnal +Saturnale +Saturnalia +saturnalia +Saturnalian +saturnalian +Saturnia +Saturnian +saturnian +Saturnicentric +saturniid +Saturniidae +Saturnine +saturnine +saturninely +saturnineness +saturninity +saturnism +saturnity +saturnize +Saturnus +satyagrahi +satyashodak +satyr +satyresque +satyress +satyriasis +satyric +Satyridae +Satyrinae +satyrine +satyrion +satyrism +satyrlike +satyromaniac +sauce +sauceboat +saucebox +saucedish +sauceless +sauceline +saucemaker +saucemaking +sauceman +saucepan +sauceplate +saucer +saucerful +saucerleaf +saucerless +saucerlike +saucily +sauciness +saucy +Sauerbraten +sauerkraut +sauf +sauger +saugh +saughen +Saul +sauld +saulie +sault +saulter +Saulteur +saum +saumon +saumont +Saumur +sauna +saunders +saunderswood +saunter +saunterer +sauntering +saunteringly +sauqui +saur +Saura +Sauraseni +Saurauia +Saurauiaceae +saurel +Sauria +saurian +sauriasis +sauriosis +Saurischia +saurischian +Sauroctonos +saurodont +Saurodontidae +Saurognathae +saurognathism +saurognathous +Sauromatian +saurophagous +sauropod +Sauropoda +sauropodous +sauropsid +Sauropsida +sauropsidan +sauropsidian +Sauropterygia +sauropterygian +Saurornithes +saurornithic +Saururaceae +saururaceous +Saururae +saururan +saururous +Saururus +saury +sausage +sausagelike +sausinger +Saussurea +saussurite +saussuritic +saussuritization +saussuritize +saut +saute +sauterelle +sauterne +sauternes +sauteur +sauty +Sauvagesia +sauve +sauvegarde +savable +savableness +savacu +savage +savagedom +savagely +savageness +savagerous +savagery +savagess +savagism +savagize +savanilla +savanna +Savannah +savant +Savara +savarin +savation +save +saved +saveloy +saver +Savery +savin +saving +savingly +savingness +savior +savioress +saviorhood +saviorship +Saviour +Savitar +Savitri +savola +Savonarolist +Savonnerie +savor +savored +savorer +savorily +savoriness +savoringly +savorless +savorous +savorsome +savory +savour +savoy +Savoyard +savoyed +savoying +savssat +savvy +saw +sawah +Sawaiori +sawali +Sawan +sawarra +sawback +sawbelly +sawbill +sawbones +sawbuck +sawbwa +sawder +sawdust +sawdustish +sawdustlike +sawdusty +sawed +sawer +sawfish +sawfly +sawhorse +sawing +sawish +sawlike +sawmaker +sawmaking +sawman +sawmill +sawmiller +sawmilling +sawmon +sawmont +sawn +Sawney +sawney +sawsetter +sawsharper +sawsmith +sawt +sawway +sawworker +sawwort +sawyer +sax +saxatile +saxboard +saxcornet +Saxe +saxhorn +Saxicava +saxicavous +Saxicola +saxicole +Saxicolidae +Saxicolinae +saxicoline +saxicolous +Saxifraga +Saxifragaceae +saxifragaceous +saxifragant +saxifrage +saxifragous +saxifrax +saxigenous +Saxish +Saxon +Saxondom +Saxonian +Saxonic +Saxonical +Saxonically +Saxonish +Saxonism +Saxonist +saxonite +Saxonization +Saxonize +Saxonly +Saxony +saxophone +saxophonist +saxotromba +saxpence +saxten +saxtie +saxtuba +say +saya +sayability +sayable +sayableness +Sayal +sayer +sayette +sayid +saying +sazen +Sbaikian +sblood +sbodikins +scab +scabbard +scabbardless +scabbed +scabbedness +scabbery +scabbily +scabbiness +scabble +scabbler +scabbling +scabby +scabellum +scaberulous +scabid +scabies +scabietic +scabinus +Scabiosa +scabiosity +scabious +scabish +scabland +scabrate +scabrescent +scabrid +scabridity +scabridulous +scabrities +scabriusculose +scabriusculous +scabrosely +scabrous +scabrously +scabrousness +scabwort +scacchic +scacchite +scad +scaddle +scads +Scaean +scaff +scaffer +scaffery +scaffie +scaffle +scaffold +scaffoldage +scaffolder +scaffolding +scaglia +scagliola +scagliolist +scala +scalable +scalableness +scalably +scalage +scalar +scalare +Scalaria +scalarian +scalariform +Scalariidae +scalarwise +scalation +scalawag +scalawaggery +scalawaggy +scald +scaldberry +scalded +scalder +scaldfish +scaldic +scalding +scaldweed +scaldy +scale +scaleback +scalebark +scaleboard +scaled +scaledrake +scalefish +scaleful +scaleless +scalelet +scalelike +scaleman +scalena +scalene +scalenohedral +scalenohedron +scalenon +scalenous +scalenum +scalenus +scalepan +scaleproof +scaler +scales +scalesman +scalesmith +scaletail +scalewing +scalewise +scalework +scalewort +scaliger +scaliness +scaling +scall +scalled +scallion +scallola +scallom +scallop +scalloper +scalloping +scallopwise +scalma +scaloni +Scalops +Scalopus +scalp +scalpeen +scalpel +scalpellar +scalpellic +scalpellum +scalpellus +scalper +scalping +scalpless +scalpriform +scalprum +scalpture +scalt +scaly +scalytail +scam +scamander +Scamandrius +scamble +scambler +scambling +scamell +scamler +scamles +scammoniate +scammonin +scammony +scammonyroot +scamp +scampavia +scamper +scamperer +scamphood +scamping +scampingly +scampish +scampishly +scampishness +scampsman +scan +scandal +scandalization +scandalize +scandalizer +scandalmonger +scandalmongering +scandalmongery +scandalmonging +scandalous +scandalously +scandalousness +scandalproof +scandaroon +scandent +scandia +Scandian +scandic +scandicus +Scandinavia +Scandinavian +Scandinavianism +scandium +Scandix +Scania +Scanian +Scanic +scanmag +scannable +scanner +scanning +scanningly +scansion +scansionist +Scansores +scansorial +scansorious +scant +scanties +scantily +scantiness +scantity +scantle +scantling +scantlinged +scantly +scantness +scanty +scap +scape +scapegallows +scapegoat +scapegoatism +scapegrace +scapel +scapeless +scapement +scapethrift +scapha +Scaphander +Scaphandridae +scaphion +Scaphiopodidae +Scaphiopus +scaphism +scaphite +Scaphites +Scaphitidae +scaphitoid +scaphocephalic +scaphocephalism +scaphocephalous +scaphocephalus +scaphocephaly +scaphocerite +scaphoceritic +scaphognathite +scaphognathitic +scaphoid +scapholunar +scaphopod +Scaphopoda +scaphopodous +scapiform +scapigerous +scapoid +scapolite +scapolitization +scapose +scapple +scappler +scapula +scapulalgia +scapular +scapulare +scapulary +scapulated +scapulectomy +scapulet +scapulimancy +scapuloaxillary +scapulobrachial +scapuloclavicular +scapulocoracoid +scapulodynia +scapulohumeral +scapulopexy +scapuloradial +scapulospinal +scapulothoracic +scapuloulnar +scapulovertebral +scapus +scar +scarab +scarabaean +scarabaei +scarabaeid +Scarabaeidae +scarabaeidoid +scarabaeiform +Scarabaeinae +scarabaeoid +scarabaeus +scarabee +scaraboid +Scaramouch +scaramouch +scarce +scarcelins +scarcely +scarcement +scarcen +scarceness +scarcity +scare +scarebabe +scarecrow +scarecrowish +scarecrowy +scareful +scarehead +scaremonger +scaremongering +scareproof +scarer +scaresome +scarf +scarface +scarfed +scarfer +scarflike +scarfpin +scarfskin +scarfwise +scarfy +scarid +Scaridae +scarification +scarificator +scarifier +scarify +scarily +scariose +scarious +scarlatina +scarlatinal +scarlatiniform +scarlatinoid +scarlatinous +scarless +scarlet +scarletberry +scarletseed +scarlety +scarman +scarn +scaroid +scarp +scarpines +scarping +scarpment +scarproof +scarred +scarrer +scarring +scarry +scart +scarth +Scarus +scarus +scarved +scary +scase +scasely +scat +scatch +scathe +scatheful +scatheless +scathelessly +scathing +scathingly +Scaticook +scatland +scatologia +scatologic +scatological +scatology +scatomancy +scatophagid +Scatophagidae +scatophagoid +scatophagous +scatophagy +scatoscopy +scatter +scatterable +scatteration +scatteraway +scatterbrain +scatterbrained +scatterbrains +scattered +scatteredly +scatteredness +scatterer +scattergood +scattering +scatteringly +scatterling +scattermouch +scattery +scatty +scatula +scaturient +scaul +scaum +scaup +scauper +scaur +scaurie +scaut +scavage +scavel +scavenage +scavenge +scavenger +scavengerism +scavengership +scavengery +scavenging +scaw +scawd +scawl +scazon +scazontic +sceat +scelalgia +scelerat +scelidosaur +scelidosaurian +scelidosauroid +Scelidosaurus +Scelidotherium +Sceliphron +sceloncus +Sceloporus +scelotyrbe +scena +scenario +scenarioist +scenarioization +scenarioize +scenarist +scenarization +scenarize +scenary +scend +scene +scenecraft +Scenedesmus +sceneful +sceneman +scenery +sceneshifter +scenewright +scenic +scenical +scenically +scenist +scenite +scenograph +scenographer +scenographic +scenographical +scenographically +scenography +Scenopinidae +scent +scented +scenter +scentful +scenting +scentless +scentlessness +scentproof +scentwood +scepsis +scepter +scepterdom +sceptered +scepterless +sceptic +sceptral +sceptropherous +sceptrosophy +sceptry +scerne +sceuophorion +sceuophylacium +sceuophylax +schaapsteker +Schaefferia +schairerite +schalmei +schalmey +schalstein +schanz +schapbachite +schappe +schapped +schapping +scharf +Scharlachberger +schatchen +Scheat +Schedar +schediasm +schediastic +Schedius +schedular +schedulate +schedule +schedulize +scheelite +scheffel +schefferite +schelling +Schellingian +Schellingianism +Schellingism +schelly +scheltopusik +schema +schemata +schematic +schematically +schematism +schematist +schematization +schematize +schematizer +schematogram +schematograph +schematologetically +schematomancy +schematonics +scheme +schemeful +schemeless +schemer +schemery +scheming +schemingly +schemist +schemy +schene +schepel +schepen +scherm +scherzando +scherzi +scherzo +schesis +Scheuchzeria +Scheuchzeriaceae +scheuchzeriaceous +schiavone +Schiedam +schiffli +schiller +schillerfels +schillerization +schillerize +schilling +schimmel +schindylesis +schindyletic +Schinus +schipperke +Schisandra +Schisandraceae +schism +schisma +schismatic +schismatical +schismatically +schismaticalness +schismatism +schismatist +schismatize +schismic +schismless +schist +schistaceous +schistic +schistocelia +schistocephalus +Schistocerca +schistocoelia +schistocormia +schistocormus +schistocyte +schistocytosis +schistoglossia +schistoid +schistomelia +schistomelus +schistoprosopia +schistoprosopus +schistorrhachis +schistoscope +schistose +schistosity +Schistosoma +schistosome +schistosomia +schistosomiasis +schistosomus +schistosternia +schistothorax +schistous +schistus +Schizaea +Schizaeaceae +schizaeaceous +Schizanthus +schizanthus +schizaxon +schizocarp +schizocarpic +schizocarpous +schizochroal +schizocoele +schizocoelic +schizocoelous +schizocyte +schizocytosis +schizodinic +schizogamy +schizogenesis +schizogenetic +schizogenetically +schizogenic +schizogenous +schizogenously +schizognath +Schizognathae +schizognathism +schizognathous +schizogonic +schizogony +Schizogregarinae +schizogregarine +Schizogregarinida +schizoid +schizoidism +Schizolaenaceae +schizolaenaceous +schizolite +schizolysigenous +Schizomeria +schizomycete +Schizomycetes +schizomycetic +schizomycetous +schizomycosis +Schizonemertea +schizonemertean +schizonemertine +Schizoneura +Schizonotus +schizont +schizopelmous +Schizopetalon +schizophasia +Schizophragma +schizophrene +schizophrenia +schizophreniac +schizophrenic +Schizophyceae +Schizophyllum +Schizophyta +schizophyte +schizophytic +schizopod +Schizopoda +schizopodal +schizopodous +schizorhinal +schizospore +schizostele +schizostelic +schizostely +schizothecal +schizothoracic +schizothyme +schizothymia +schizothymic +schizotrichia +Schizotrypanum +schiztic +Schlauraffenland +Schleichera +schlemiel +schlemihl +schlenter +schlieren +schlieric +schloop +Schmalkaldic +schmaltz +schmelz +schmelze +schnabel +Schnabelkanne +schnapper +schnapps +schnauzer +schneider +Schneiderian +schnitzel +schnorchel +schnorkel +schnorrer +scho +schochat +schochet +schoenobatic +schoenobatist +Schoenocaulon +Schoenus +schoenus +Schoharie +schola +scholae +scholaptitude +scholar +scholarch +scholardom +scholarian +scholarism +scholarless +scholarlike +scholarliness +scholarly +scholarship +scholasm +scholastic +scholastical +scholastically +scholasticate +scholasticism +scholasticly +scholia +scholiast +scholiastic +scholion +scholium +Schomburgkia +schone +schonfelsite +Schoodic +School +school +schoolable +schoolbag +schoolbook +schoolbookish +schoolboy +schoolboydom +schoolboyhood +schoolboyish +schoolboyishly +schoolboyishness +schoolboyism +schoolbutter +schoolcraft +schooldame +schooldom +schooled +schoolery +schoolfellow +schoolfellowship +schoolful +schoolgirl +schoolgirlhood +schoolgirlish +schoolgirlishly +schoolgirlishness +schoolgirlism +schoolgirly +schoolgoing +schoolhouse +schooling +schoolingly +schoolish +schoolkeeper +schoolkeeping +schoolless +schoollike +schoolmaam +schoolmaamish +schoolmaid +schoolman +schoolmaster +schoolmasterhood +schoolmastering +schoolmasterish +schoolmasterishly +schoolmasterishness +schoolmasterism +schoolmasterly +schoolmastership +schoolmastery +schoolmate +schoolmiss +schoolmistress +schoolmistressy +schoolroom +schoolteacher +schoolteacherish +schoolteacherly +schoolteachery +schoolteaching +schooltide +schooltime +schoolward +schoolwork +schoolyard +schoon +schooner +Schopenhauereanism +Schopenhauerian +Schopenhauerism +schoppen +schorenbergite +schorl +schorlaceous +schorlomite +schorlous +schorly +schottische +schottish +schout +schraubthaler +Schrebera +schreiner +schreinerize +schriesheimite +Schrund +schtoff +schuh +schuhe +schuit +schule +schultenite +schungite +schuss +schute +schwa +schwabacher +Schwalbea +schwarz +Schwarzian +schweizer +schweizerkase +Schwendenerian +Schwenkfelder +Schwenkfeldian +Sciadopitys +Sciaena +sciaenid +Sciaenidae +sciaeniform +Sciaeniformes +sciaenoid +scialytic +sciamachy +Scian +sciapod +sciapodous +Sciara +sciarid +Sciaridae +Sciarinae +sciatheric +sciatherical +sciatherically +sciatic +sciatica +sciatical +sciatically +sciaticky +scibile +science +scienced +scient +sciential +scientician +scientific +scientifical +scientifically +scientificalness +scientificogeographical +scientificohistorical +scientificophilosophical +scientificopoetic +scientificoreligious +scientificoromantic +scientintically +scientism +Scientist +scientist +scientistic +scientistically +scientize +scientolism +scilicet +Scilla +scillain +scillipicrin +Scillitan +scillitin +scillitoxin +Scillonian +scimitar +scimitared +scimitarpod +scincid +Scincidae +scincidoid +scinciform +scincoid +scincoidian +Scincomorpha +Scincus +scind +sciniph +scintilla +scintillant +scintillantly +scintillate +scintillating +scintillatingly +scintillation +scintillator +scintillescent +scintillize +scintillometer +scintilloscope +scintillose +scintillously +scintle +scintler +scintling +sciograph +sciographic +sciography +sciolism +sciolist +sciolistic +sciolous +sciomachiology +sciomachy +sciomancy +sciomantic +scion +sciophilous +sciophyte +scioptic +sciopticon +scioptics +scioptric +sciosophist +sciosophy +Sciot +scioterical +scioterique +sciotheism +sciotheric +sciotherical +sciotherically +scious +scirenga +Scirophoria +Scirophorion +Scirpus +scirrhi +scirrhogastria +scirrhoid +scirrhoma +scirrhosis +scirrhous +scirrhus +scirrosity +scirtopod +Scirtopoda +scirtopodous +scissel +scissible +scissile +scission +scissiparity +scissor +scissorbill +scissorbird +scissorer +scissoring +scissorium +scissorlike +scissorlikeness +scissors +scissorsbird +scissorsmith +scissorstail +scissortail +scissorwise +scissura +scissure +Scissurella +scissurellid +Scissurellidae +Scitaminales +Scitamineae +sciurid +Sciuridae +sciurine +sciuroid +sciuromorph +Sciuromorpha +sciuromorphic +Sciuropterus +Sciurus +sclaff +sclate +sclater +Sclav +Sclavonian +sclaw +scler +sclera +scleral +scleranth +Scleranthaceae +Scleranthus +scleratogenous +sclere +sclerectasia +sclerectomy +scleredema +sclereid +sclerema +sclerencephalia +sclerenchyma +sclerenchymatous +sclerenchyme +sclererythrin +scleretinite +Scleria +scleriasis +sclerification +sclerify +sclerite +scleritic +scleritis +sclerized +sclerobase +sclerobasic +scleroblast +scleroblastema +scleroblastemic +scleroblastic +sclerocauly +sclerochorioiditis +sclerochoroiditis +scleroconjunctival +scleroconjunctivitis +sclerocornea +sclerocorneal +sclerodactylia +sclerodactyly +scleroderm +Scleroderma +scleroderma +Sclerodermaceae +Sclerodermata +Sclerodermatales +sclerodermatitis +sclerodermatous +Sclerodermi +sclerodermia +sclerodermic +sclerodermite +sclerodermitic +sclerodermitis +sclerodermous +sclerogen +Sclerogeni +sclerogenoid +sclerogenous +scleroid +scleroiritis +sclerokeratitis +sclerokeratoiritis +scleroma +scleromata +scleromeninx +scleromere +sclerometer +sclerometric +scleronychia +scleronyxis +Scleropages +Scleroparei +sclerophthalmia +sclerophyll +sclerophyllous +sclerophylly +scleroprotein +sclerosal +sclerosarcoma +Scleroscope +scleroscope +sclerose +sclerosed +scleroseptum +sclerosis +scleroskeletal +scleroskeleton +Sclerospora +sclerostenosis +Sclerostoma +sclerostomiasis +sclerotal +sclerote +sclerotia +sclerotial +sclerotic +sclerotica +sclerotical +scleroticectomy +scleroticochorioiditis +scleroticochoroiditis +scleroticonyxis +scleroticotomy +Sclerotinia +sclerotinial +sclerotiniose +sclerotioid +sclerotitic +sclerotitis +sclerotium +sclerotized +sclerotoid +sclerotome +sclerotomic +sclerotomy +sclerous +scleroxanthin +sclerozone +scliff +sclim +sclimb +scoad +scob +scobby +scobicular +scobiform +scobs +scoff +scoffer +scoffery +scoffing +scoffingly +scoffingstock +scofflaw +scog +scoggan +scogger +scoggin +scogginism +scogginist +scoinson +scoke +scolb +scold +scoldable +scoldenore +scolder +scolding +scoldingly +scoleces +scoleciasis +scolecid +Scolecida +scoleciform +scolecite +scolecoid +scolecology +scolecophagous +scolecospore +scoleryng +scolex +Scolia +scolia +scolices +scoliid +Scoliidae +scoliograptic +scoliokyposis +scoliometer +scolion +scoliorachitic +scoliosis +scoliotic +scoliotone +scolite +scollop +scolog +scolopaceous +Scolopacidae +scolopacine +Scolopax +Scolopendra +scolopendra +Scolopendrella +Scolopendrellidae +scolopendrelloid +scolopendrid +Scolopendridae +scolopendriform +scolopendrine +Scolopendrium +scolopendroid +scolophore +scolopophore +Scolymus +scolytid +Scolytidae +scolytoid +Scolytus +Scomber +scomberoid +Scombresocidae +Scombresox +scombrid +Scombridae +scombriform +Scombriformes +scombrine +scombroid +Scombroidea +scombroidean +scombrone +sconce +sconcer +sconcheon +sconcible +scone +scoon +scoop +scooped +scooper +scoopful +scooping +scoopingly +scoot +scooter +scopa +scoparin +scoparius +scopate +scope +scopeless +scopelid +Scopelidae +scopeliform +scopelism +scopeloid +Scopelus +scopet +scopic +Scopidae +scopiferous +scopiform +scopiformly +scopine +scopiped +scopola +scopolamine +scopoleine +scopoletin +scopoline +scopperil +scops +scoptical +scoptically +scoptophilia +scoptophiliac +scoptophilic +scoptophobia +scopula +Scopularia +scopularian +scopulate +scopuliferous +scopuliform +scopuliped +Scopulipedes +scopulite +scopulous +scopulousness +Scopus +scorbute +scorbutic +scorbutical +scorbutically +scorbutize +scorbutus +scorch +scorched +scorcher +scorching +scorchingly +scorchingness +scorchproof +score +scoreboard +scorebook +scored +scorekeeper +scorekeeping +scoreless +scorer +scoria +scoriac +scoriaceous +scoriae +scorification +scorifier +scoriform +scorify +scoring +scorious +scorn +scorned +scorner +scornful +scornfully +scornfulness +scorningly +scornproof +scorny +scorodite +Scorpaena +scorpaenid +Scorpaenidae +scorpaenoid +scorpene +scorper +Scorpidae +Scorpididae +Scorpii +Scorpiid +Scorpio +scorpioid +scorpioidal +Scorpioidea +scorpion +Scorpiones +scorpionic +scorpionid +Scorpionida +Scorpionidea +Scorpionis +scorpionweed +scorpionwort +Scorpiurus +Scorpius +scorse +scortation +scortatory +Scorzonera +Scot +scot +scotale +Scotch +scotch +scotcher +Scotchery +Scotchification +Scotchify +Scotchiness +scotching +Scotchman +scotchman +Scotchness +Scotchwoman +Scotchy +scote +scoter +scoterythrous +Scotia +scotia +Scotic +scotino +Scotism +Scotist +Scotistic +Scotistical +Scotize +Scotlandwards +scotodinia +scotogram +scotograph +scotographic +scotography +scotoma +scotomata +scotomatic +scotomatical +scotomatous +scotomia +scotomic +scotomy +scotophobia +scotopia +scotopic +scotoscope +scotosis +Scots +Scotsman +Scotswoman +Scotticism +Scotticize +Scottie +Scottification +Scottify +Scottish +Scottisher +Scottishly +Scottishman +Scottishness +Scotty +scouch +scouk +scoundrel +scoundreldom +scoundrelish +scoundrelism +scoundrelly +scoundrelship +scoup +scour +scourage +scoured +scourer +scouress +scourfish +scourge +scourger +scourging +scourgingly +scouriness +scouring +scourings +scourway +scourweed +scourwort +scoury +scouse +scout +scoutcraft +scoutdom +scouter +scouth +scouther +scouthood +scouting +scoutingly +scoutish +scoutmaster +scoutwatch +scove +scovel +scovillite +scovy +scow +scowbank +scowbanker +scowder +scowl +scowler +scowlful +scowling +scowlingly +scowlproof +scowman +scrab +scrabble +scrabbled +scrabbler +scrabe +scrae +scraffle +scrag +scragged +scraggedly +scraggedness +scragger +scraggily +scragginess +scragging +scraggled +scraggling +scraggly +scraggy +scraily +scram +scramasax +scramble +scramblement +scrambler +scrambling +scramblingly +scrambly +scrampum +scran +scranch +scrank +scranky +scrannel +scranning +scranny +scrap +scrapable +scrapbook +scrape +scrapeage +scraped +scrapepenny +scraper +scrapie +scraping +scrapingly +scrapler +scraplet +scrapling +scrapman +scrapmonger +scrappage +scrapped +scrapper +scrappet +scrappily +scrappiness +scrapping +scrappingly +scrapple +scrappler +scrappy +scrapworks +scrapy +scrat +scratch +scratchable +scratchably +scratchback +scratchboard +scratchbrush +scratchcard +scratchcarding +scratchcat +scratcher +scratches +scratchification +scratchiness +scratching +scratchingly +scratchless +scratchlike +scratchman +scratchproof +scratchweed +scratchwork +scratchy +scrath +scratter +scrattle +scrattling +scrauch +scrauchle +scraunch +scraw +scrawk +scrawl +scrawler +scrawliness +scrawly +scrawm +scrawnily +scrawniness +scrawny +scray +scraze +screak +screaking +screaky +scream +screamer +screaminess +screaming +screamingly +screamproof +screamy +scree +screech +screechbird +screecher +screechily +screechiness +screeching +screechingly +screechy +screed +screek +screel +screeman +screen +screenable +screenage +screencraft +screendom +screened +screener +screening +screenless +screenlike +screenman +screenplay +screensman +screenwise +screenwork +screenwriter +screeny +screet +screeve +screeved +screever +screich +screigh +screve +screver +screw +screwable +screwage +screwball +screwbarrel +screwdrive +screwdriver +screwed +screwer +screwhead +screwiness +screwing +screwish +screwless +screwlike +screwman +screwmatics +screwship +screwsman +screwstem +screwstock +screwwise +screwworm +screwy +scribable +scribacious +scribaciousness +scribal +scribatious +scribatiousness +scribblage +scribblative +scribblatory +scribble +scribbleable +scribbled +scribbledom +scribbleism +scribblemania +scribblement +scribbleomania +scribbler +scribbling +scribblingly +scribbly +scribe +scriber +scribeship +scribing +scribism +scribophilous +scride +scrieve +scriever +scriggle +scriggler +scriggly +scrike +scrim +scrime +scrimer +scrimmage +scrimmager +scrimp +scrimped +scrimpily +scrimpiness +scrimpingly +scrimply +scrimpness +scrimption +scrimpy +scrimshander +scrimshandy +scrimshank +scrimshanker +scrimshaw +scrimshon +scrimshorn +scrin +scrinch +scrine +scringe +scriniary +scrip +scripee +scripless +scrippage +script +scription +scriptitious +scriptitiously +scriptitory +scriptive +scriptor +scriptorial +scriptorium +scriptory +scriptural +Scripturalism +scripturalism +Scripturalist +scripturalist +Scripturality +scripturality +scripturalize +scripturally +scripturalness +Scripturarian +Scripture +scripture +Scriptured +scriptured +Scriptureless +scripturiency +scripturient +Scripturism +scripturism +Scripturist +scripula +scripulum +scritch +scritoire +scrivaille +scrive +scrivello +scriven +scrivener +scrivenership +scrivenery +scrivening +scrivenly +scriver +scrob +scrobble +scrobe +scrobicula +scrobicular +scrobiculate +scrobiculated +scrobicule +scrobiculus +scrobis +scrod +scrodgill +scroff +scrofula +scrofularoot +scrofulaweed +scrofulide +scrofulism +scrofulitic +scrofuloderm +scrofuloderma +scrofulorachitic +scrofulosis +scrofulotuberculous +scrofulous +scrofulously +scrofulousness +scrog +scroggy +scrolar +scroll +scrolled +scrollery +scrollhead +scrollwise +scrollwork +scrolly +scronach +scroo +scrooch +scrooge +scroop +Scrophularia +Scrophulariaceae +scrophulariaceous +scrota +scrotal +scrotectomy +scrotiform +scrotitis +scrotocele +scrotofemoral +scrotum +scrouge +scrouger +scrounge +scrounger +scrounging +scrout +scrow +scroyle +scrub +scrubbable +scrubbed +scrubber +scrubbery +scrubbily +scrubbiness +scrubbird +scrubbly +scrubboard +scrubby +scrubgrass +scrubland +scrubwood +scruf +scruff +scruffle +scruffman +scruffy +scruft +scrum +scrummage +scrummager +scrump +scrumple +scrumption +scrumptious +scrumptiously +scrumptiousness +scrunch +scrunchy +scrunge +scrunger +scrunt +scruple +scrupleless +scrupler +scruplesome +scruplesomeness +scrupula +scrupular +scrupuli +scrupulist +scrupulosity +scrupulous +scrupulously +scrupulousness +scrupulum +scrupulus +scrush +scrutability +scrutable +scrutate +scrutation +scrutator +scrutatory +scrutinant +scrutinate +scrutineer +scrutinization +scrutinize +scrutinizer +scrutinizingly +scrutinous +scrutinously +scrutiny +scruto +scrutoire +scruze +scry +scryer +scud +scuddaler +scuddawn +scudder +scuddick +scuddle +scuddy +scudi +scudler +scudo +scuff +scuffed +scuffer +scuffle +scuffler +scufflingly +scuffly +scuffy +scuft +scufter +scug +scuggery +sculch +sculduddery +scull +sculler +scullery +scullful +scullion +scullionish +scullionize +scullionship +scullog +sculp +sculper +sculpin +sculpt +sculptile +sculptitory +sculptograph +sculptography +Sculptor +sculptor +Sculptorid +sculptress +sculptural +sculpturally +sculpturation +sculpture +sculptured +sculpturer +sculpturesque +sculpturesquely +sculpturesqueness +sculpturing +sculsh +scum +scumber +scumble +scumbling +scumboard +scumfish +scumless +scumlike +scummed +scummer +scumming +scummy +scumproof +scun +scuncheon +scunder +scunner +scup +scupful +scuppaug +scupper +scuppernong +scuppet +scuppler +scur +scurdy +scurf +scurfer +scurfily +scurfiness +scurflike +scurfy +scurrier +scurrile +scurrilist +scurrility +scurrilize +scurrilous +scurrilously +scurrilousness +scurry +scurvied +scurvily +scurviness +scurvish +scurvy +scurvyweed +scusation +scuse +scut +scuta +scutage +scutal +scutate +scutated +scutatiform +scutation +scutch +scutcheon +scutcheoned +scutcheonless +scutcheonlike +scutcheonwise +scutcher +scutching +scute +scutel +scutella +scutellae +scutellar +Scutellaria +scutellarin +scutellate +scutellated +scutellation +scutellerid +Scutelleridae +scutelliform +scutelligerous +scutelliplantar +scutelliplantation +scutellum +scutibranch +Scutibranchia +scutibranchian +scutibranchiate +scutifer +scutiferous +scutiform +scutiger +Scutigera +scutigeral +Scutigeridae +scutigerous +scutiped +scutter +scuttle +scuttlebutt +scuttleful +scuttleman +scuttler +scuttling +scuttock +scutty +scutula +scutular +scutulate +scutulated +scutulum +Scutum +scutum +scybala +scybalous +scybalum +scye +scyelite +Scyld +Scylla +Scyllaea +Scyllaeidae +scyllarian +Scyllaridae +scyllaroid +Scyllarus +Scyllidae +Scylliidae +scyllioid +Scylliorhinidae +scylliorhinoid +Scylliorhinus +scyllite +scyllitol +Scyllium +scypha +scyphae +scyphate +scyphi +scyphiferous +scyphiform +scyphiphorous +scyphistoma +scyphistomae +scyphistomoid +scyphistomous +scyphoi +scyphomancy +Scyphomedusae +scyphomedusan +scyphomedusoid +scyphophore +Scyphophori +scyphophorous +scyphopolyp +scyphose +scyphostoma +Scyphozoa +scyphozoan +scyphula +scyphulus +scyphus +scyt +scytale +Scyth +scythe +scytheless +scythelike +scytheman +scythesmith +scythestone +scythework +Scythian +Scythic +Scythize +scytitis +scytoblastema +scytodepsic +Scytonema +Scytonemataceae +scytonemataceous +scytonematoid +scytonematous +Scytopetalaceae +scytopetalaceous +Scytopetalum +sdeath +sdrucciola +se +sea +seabeach +seabeard +Seabee +seaberry +seaboard +seaborderer +seabound +seacannie +seacatch +seacoast +seaconny +seacraft +seacrafty +seacunny +seadog +seadrome +seafardinger +seafare +seafarer +seafaring +seaflood +seaflower +seafolk +Seaforthia +seafowl +Seaghan +seagirt +seagoer +seagoing +seah +seahound +seak +seal +sealable +sealant +sealch +sealed +sealer +sealery +sealess +sealet +sealette +sealflower +sealike +sealine +sealing +sealless +seallike +sealskin +sealwort +Sealyham +seam +seaman +seamancraft +seamanite +seamanlike +seamanly +seamanship +seamark +Seamas +seambiter +seamed +seamer +seaminess +seaming +seamless +seamlessly +seamlessness +seamlet +seamlike +seamost +seamrend +seamrog +seamster +seamstress +Seamus +seamy +seance +seapiece +seaplane +seaport +seaquake +sear +searce +searcer +search +searchable +searchableness +searchant +searcher +searcheress +searcherlike +searchership +searchful +searching +searchingly +searchingness +searchless +searchlight +searchment +searcloth +seared +searedness +searer +searing +searlesite +searness +seary +Seasan +seascape +seascapist +seascout +seascouting +seashine +seashore +seasick +seasickness +seaside +seasider +season +seasonable +seasonableness +seasonably +seasonal +seasonality +seasonally +seasonalness +seasoned +seasonedly +seasoner +seasoning +seasoninglike +seasonless +seastrand +seastroke +seat +seatang +seated +seater +seathe +seating +seatless +seatrain +seatron +seatsman +seatwork +seave +seavy +seawant +seaward +seawardly +seaware +seaway +seaweed +seaweedy +seawife +seawoman +seaworn +seaworthiness +seaworthy +seax +Seba +sebacate +sebaceous +sebacic +sebait +Sebastian +sebastianite +Sebastichthys +Sebastodes +sebate +sebesten +sebiferous +sebific +sebilla +sebiparous +sebkha +sebolith +seborrhagia +seborrhea +seborrheal +seborrheic +seborrhoic +Sebright +sebum +sebundy +sec +secability +secable +Secale +secalin +secaline +secalose +Secamone +secancy +secant +secantly +secateur +secede +Seceder +seceder +secern +secernent +secernment +secesh +secesher +Secessia +Secession +secession +Secessional +secessional +secessionalist +Secessiondom +secessioner +secessionism +secessionist +sech +Sechium +Sechuana +seck +Seckel +seclude +secluded +secludedly +secludedness +secluding +secluse +seclusion +seclusionist +seclusive +seclusively +seclusiveness +secodont +secohm +secohmmeter +second +secondar +secondarily +secondariness +secondary +seconde +seconder +secondhand +secondhanded +secondhandedly +secondhandedness +secondly +secondment +secondness +secos +secpar +secque +secre +secrecy +secret +secreta +secretage +secretagogue +secretarial +secretarian +Secretariat +secretariat +secretariate +secretary +secretaryship +secrete +secretin +secretion +secretional +secretionary +secretitious +secretive +secretively +secretiveness +secretly +secretmonger +secretness +secreto +secretomotor +secretor +secretory +secretum +sect +sectarial +sectarian +sectarianism +sectarianize +sectarianly +sectarism +sectarist +sectary +sectator +sectile +sectility +section +sectional +sectionalism +sectionalist +sectionality +sectionalization +sectionalize +sectionally +sectionary +sectionist +sectionize +sectioplanography +sectism +sectist +sectiuncle +sective +sector +sectoral +sectored +sectorial +sectroid +sectwise +secular +secularism +secularist +secularistic +secularity +secularization +secularize +secularizer +secularly +secularness +secund +secundate +secundation +secundiflorous +secundigravida +secundine +secundipara +secundiparity +secundiparous +secundly +secundogeniture +secundoprimary +secundus +securable +securance +secure +securely +securement +secureness +securer +securicornate +securifer +Securifera +securiferous +securiform +Securigera +securigerous +securitan +security +Sedaceae +Sedan +sedan +Sedang +sedanier +sedate +sedately +sedateness +sedation +sedative +sedent +Sedentaria +sedentarily +sedentariness +sedentary +sedentation +Seder +sederunt +sedge +sedged +sedgelike +sedging +sedgy +sedigitate +sedigitated +sedile +sedilia +sediment +sedimental +sedimentarily +sedimentary +sedimentate +sedimentation +sedimentous +sedimetric +sedimetrical +sedition +seditionary +seditionist +seditious +seditiously +seditiousness +sedjadeh +seduce +seduceable +seducee +seducement +seducer +seducible +seducing +seducingly +seducive +seduct +seduction +seductionist +seductive +seductively +seductiveness +seductress +sedulity +sedulous +sedulously +sedulousness +Sedum +sedum +see +seeable +seeableness +Seebeck +seecatch +seech +seed +seedage +seedbed +seedbird +seedbox +seedcake +seedcase +seedeater +seeded +Seeder +seeder +seedful +seedgall +seedily +seediness +seedkin +seedless +seedlessness +seedlet +seedlike +seedling +seedlip +seedman +seedness +seedsman +seedstalk +seedtime +seedy +seege +seeing +seeingly +seeingness +seek +seeker +Seekerism +seeking +seel +seelful +seely +seem +seemable +seemably +seemer +seeming +seemingly +seemingness +seemless +seemlihead +seemlily +seemliness +seemly +seen +seenie +seep +seepage +seeped +seepweed +seepy +seer +seerband +seercraft +seeress +seerfish +seerhand +seerhood +seerlike +seerpaw +seership +seersucker +seesaw +seesawiness +seesee +seethe +seething +seethingly +seetulputty +Sefekhet +seg +seggar +seggard +segged +seggrom +Seginus +segment +segmental +segmentally +segmentary +segmentate +segmentation +segmented +sego +segol +segolate +segreant +segregable +segregant +segregate +segregateness +segregation +segregational +segregationist +segregative +segregator +seiche +Seid +Seidel +seidel +Seidlitz +seigneur +seigneurage +seigneuress +seigneurial +seigneury +seignior +seigniorage +seignioral +seignioralty +seigniorial +seigniority +seigniorship +seigniory +seignorage +seignoral +seignorial +seignorize +seignory +seilenoi +seilenos +seine +seiner +seirospore +seirosporic +seise +seism +seismal +seismatical +seismetic +seismic +seismically +seismicity +seismism +seismochronograph +seismogram +seismograph +seismographer +seismographic +seismographical +seismography +seismologic +seismological +seismologically +seismologist +seismologue +seismology +seismometer +seismometric +seismometrical +seismometrograph +seismometry +seismomicrophone +seismoscope +seismoscopic +seismotectonic +seismotherapy +seismotic +seit +seity +Seiurus +Seiyuhonto +Seiyukai +seizable +seize +seizer +seizin +seizing +seizor +seizure +sejant +sejoin +sejoined +sejugate +sejugous +sejunct +sejunctive +sejunctively +sejunctly +Sekane +Sekani +Seker +Sekhwan +sekos +selachian +Selachii +selachoid +Selachoidei +Selachostome +Selachostomi +selachostomous +seladang +Selaginaceae +Selaginella +Selaginellaceae +selaginellaceous +selagite +Selago +selah +selamin +selamlik +selbergite +Selbornian +seldom +seldomcy +seldomer +seldomly +seldomness +seldor +seldseen +sele +select +selectable +selected +selectedly +selectee +selection +selectionism +selectionist +selective +selectively +selectiveness +selectivity +selectly +selectman +selectness +selector +Selena +selenate +Selene +selenian +seleniate +selenic +Selenicereus +selenide +Selenidera +seleniferous +selenigenous +selenion +selenious +Selenipedium +selenite +selenitic +selenitical +selenitiferous +selenitish +selenium +seleniuret +selenobismuthite +selenocentric +selenodont +Selenodonta +selenodonty +selenograph +selenographer +selenographic +selenographical +selenographically +selenographist +selenography +selenolatry +selenological +selenologist +selenology +selenomancy +selenoscope +selenosis +selenotropic +selenotropism +selenotropy +selensilver +selensulphur +Seleucian +Seleucid +Seleucidae +Seleucidan +Seleucidean +Seleucidian +Seleucidic +self +selfcide +selfdom +selfful +selffulness +selfheal +selfhood +selfish +selfishly +selfishness +selfism +selfist +selfless +selflessly +selflessness +selfly +selfness +selfpreservatory +selfsame +selfsameness +selfward +selfwards +selictar +seligmannite +selihoth +Selina +Selinuntine +selion +Seljuk +Seljukian +sell +sella +sellable +sellably +sellaite +sellar +sellate +sellenders +seller +Selli +sellie +selliform +selling +sellout +selly +selsoviet +selsyn +selt +Selter +Seltzer +seltzogene +Selung +selva +selvage +selvaged +selvagee +selvedge +selzogene +Semaeostomae +Semaeostomata +Semang +semanteme +semantic +semantical +semantically +semantician +semanticist +semantics +semantological +semantology +semantron +semaphore +semaphoric +semaphorical +semaphorically +semaphorist +semarum +semasiological +semasiologically +semasiologist +semasiology +semateme +sematic +sematographic +sematography +sematology +sematrope +semball +semblable +semblably +semblance +semblant +semblative +semble +seme +Semecarpus +semeed +semeia +semeiography +semeiologic +semeiological +semeiologist +semeiology +semeion +semeiotic +semeiotical +semeiotics +semelfactive +semelincident +semen +semence +Semeostoma +semese +semester +semestral +semestrial +semi +semiabstracted +semiaccomplishment +semiacid +semiacidified +semiacquaintance +semiadherent +semiadjectively +semiadnate +semiaerial +semiaffectionate +semiagricultural +Semiahmoo +semialbinism +semialcoholic +semialien +semiallegiance +semialpine +semialuminous +semiamplexicaul +semiamplitude +semianarchist +semianatomical +semianatropal +semianatropous +semiangle +semiangular +semianimal +semianimate +semianimated +semiannealed +semiannual +semiannually +semiannular +semianthracite +semiantiministerial +semiantique +semiape +semiaperiodic +semiaperture +semiappressed +semiaquatic +semiarborescent +semiarc +semiarch +semiarchitectural +semiarid +semiaridity +semiarticulate +semiasphaltic +semiatheist +semiattached +semiautomatic +semiautomatically +semiautonomous +semiaxis +semibacchanalian +semibachelor +semibald +semibalked +semiball +semiballoon +semiband +semibarbarian +semibarbarianism +semibarbaric +semibarbarism +semibarbarous +semibaronial +semibarren +semibase +semibasement +semibastion +semibay +semibeam +semibejan +semibelted +semibifid +semibituminous +semibleached +semiblind +semiblunt +semibody +semiboiled +semibolshevist +semibolshevized +semibouffant +semibourgeois +semibreve +semibull +semiburrowing +semic +semicadence +semicalcareous +semicalcined +semicallipygian +semicanal +semicanalis +semicannibalic +semicantilever +semicarbazide +semicarbazone +semicarbonate +semicarbonize +semicardinal +semicartilaginous +semicastrate +semicastration +semicatholicism +semicaudate +semicelestial +semicell +semicellulose +semicentenarian +semicentenary +semicentennial +semicentury +semichannel +semichaotic +semichemical +semicheviot +semichevron +semichiffon +semichivalrous +semichoric +semichorus +semichrome +semicircle +semicircled +semicircular +semicircularity +semicircularly +semicircularness +semicircumference +semicircumferentor +semicircumvolution +semicirque +semicitizen +semicivilization +semicivilized +semiclassic +semiclassical +semiclause +semicleric +semiclerical +semiclimber +semiclimbing +semiclose +semiclosed +semiclosure +semicoagulated +semicoke +semicollapsible +semicollar +semicollegiate +semicolloid +semicolloquial +semicolon +semicolonial +semicolumn +semicolumnar +semicoma +semicomatose +semicombined +semicombust +semicomic +semicomical +semicommercial +semicompact +semicompacted +semicomplete +semicomplicated +semiconceal +semiconcrete +semiconducting +semiconductor +semicone +semiconfident +semiconfinement +semiconfluent +semiconformist +semiconformity +semiconic +semiconical +semiconnate +semiconnection +semiconoidal +semiconscious +semiconsciously +semiconsciousness +semiconservative +semiconsonant +semiconsonantal +semiconspicuous +semicontinent +semicontinuum +semicontraction +semicontradiction +semiconvergence +semiconvergent +semiconversion +semiconvert +semicordate +semicordated +semicoriaceous +semicorneous +semicoronate +semicoronated +semicoronet +semicostal +semicostiferous +semicotton +semicotyle +semicounterarch +semicountry +semicrepe +semicrescentic +semicretin +semicretinism +semicriminal +semicroma +semicrome +semicrustaceous +semicrystallinc +semicubical +semicubit +semicup +semicupium +semicupola +semicured +semicurl +semicursive +semicurvilinear +semicyclic +semicycloid +semicylinder +semicylindric +semicylindrical +semicynical +semidaily +semidangerous +semidark +semidarkness +semidead +semideaf +semidecay +semidecussation +semidefinite +semideific +semideification +semideistical +semideity +semidelight +semidelirious +semideltaic +semidemented +semidenatured +semidependence +semidependent +semideponent +semidesert +semidestructive +semidetached +semidetachment +semideveloped +semidiagrammatic +semidiameter +semidiapason +semidiapente +semidiaphaneity +semidiaphanous +semidiatessaron +semidifference +semidigested +semidigitigrade +semidigression +semidilapidation +semidine +semidirect +semidisabled +semidisk +semiditone +semidiurnal +semidivided +semidivine +semidocumentary +semidodecagon +semidole +semidome +semidomed +semidomestic +semidomesticated +semidomestication +semidomical +semidormant +semidouble +semidrachm +semidramatic +semidress +semidressy +semidried +semidry +semidrying +semiductile +semidull +semiduplex +semiduration +semieducated +semieffigy +semiegg +semiegret +semielastic +semielision +semiellipse +semiellipsis +semiellipsoidal +semielliptic +semielliptical +semienclosed +semiengaged +semiequitant +semierect +semieremitical +semiessay +semiexecutive +semiexpanded +semiexplanation +semiexposed +semiexternal +semiextinct +semiextinction +semifable +semifabulous +semifailure +semifamine +semifascia +semifasciated +semifashion +semifast +semifatalistic +semiferal +semiferous +semifeudal +semifeudalism +semifib +semifiction +semifictional +semifigurative +semifigure +semifinal +semifinalist +semifine +semifinish +semifinished +semifiscal +semifistular +semifit +semifitting +semifixed +semiflashproof +semiflex +semiflexed +semiflexible +semiflexion +semiflexure +semiflint +semifloating +semifloret +semifloscular +semifloscule +semiflosculose +semiflosculous +semifluctuant +semifluctuating +semifluid +semifluidic +semifluidity +semifoaming +semiforbidding +semiforeign +semiform +semiformal +semiformed +semifossil +semifossilized +semifrantic +semifriable +semifrontier +semifuddle +semifunctional +semifused +semifusion +semify +semigala +semigelatinous +semigentleman +semigenuflection +semigirder +semiglaze +semiglazed +semiglobe +semiglobose +semiglobular +semiglobularly +semiglorious +semiglutin +semigod +semigovernmental +semigrainy +semigranitic +semigranulate +semigravel +semigroove +semihand +semihard +semiharden +semihardy +semihastate +semihepatization +semiherbaceous +semiheterocercal +semihexagon +semihexagonal +semihiant +semihiatus +semihibernation +semihigh +semihistorical +semihobo +semihonor +semihoral +semihorny +semihostile +semihot +semihuman +semihumanitarian +semihumanized +semihumbug +semihumorous +semihumorously +semihyaline +semihydrate +semihydrobenzoinic +semihyperbola +semihyperbolic +semihyperbolical +semijealousy +semijubilee +semijudicial +semijuridical +semilanceolate +semilatent +semilatus +semileafless +semilegendary +semilegislative +semilens +semilenticular +semilethal +semiliberal +semilichen +semiligneous +semilimber +semilined +semiliquid +semiliquidity +semiliterate +semilocular +semilogarithmic +semilogical +semilong +semilooper +semiloose +semiloyalty +semilucent +semilunar +semilunare +semilunary +semilunate +semilunation +semilune +semiluxation +semiluxury +semimachine +semimade +semimadman +semimagical +semimagnetic +semimajor +semimalignant +semimanufacture +semimanufactured +semimarine +semimarking +semimathematical +semimature +semimechanical +semimedicinal +semimember +semimembranosus +semimembranous +semimenstrual +semimercerized +semimessianic +semimetal +semimetallic +semimetamorphosis +semimicrochemical +semimild +semimilitary +semimill +semimineral +semimineralized +semiminim +semiminor +semimolecule +semimonastic +semimonitor +semimonopoly +semimonster +semimonthly +semimoron +semimucous +semimute +semimystic +semimystical +semimythical +seminaked +seminal +seminality +seminally +seminaphthalidine +seminaphthylamine +seminar +seminarcosis +seminarial +seminarian +seminarianism +seminarist +seminaristic +seminarize +seminary +seminasal +seminase +seminatant +seminate +semination +seminationalization +seminative +seminebulous +seminecessary +seminegro +seminervous +seminiferal +seminiferous +seminific +seminifical +seminification +seminist +seminium +seminivorous +seminocturnal +Seminole +seminoma +seminomad +seminomadic +seminomata +seminonconformist +seminonflammable +seminonsensical +seminormal +seminose +seminovel +seminovelty +seminude +seminudity +seminule +seminuliferous +seminuria +seminvariant +seminvariantive +semioblivion +semioblivious +semiobscurity +semioccasional +semioccasionally +semiocclusive +semioctagonal +semiofficial +semiofficially +semiography +Semionotidae +Semionotus +semiopacity +semiopacous +semiopal +semiopalescent +semiopaque +semiopened +semiorb +semiorbicular +semiorbicularis +semiorbiculate +semiordinate +semiorganized +semioriental +semioscillation +semiosseous +semiostracism +semiotic +semiotician +semioval +semiovaloid +semiovate +semioviparous +semiovoid +semiovoidal +semioxidated +semioxidized +semioxygenated +semioxygenized +semipagan +semipalmate +semipalmated +semipalmation +semipanic +semipapal +semipapist +semiparallel +semiparalysis +semiparameter +semiparasitic +semiparasitism +semipaste +semipastoral +semipasty +semipause +semipeace +semipectinate +semipectinated +semipectoral +semiped +semipedal +semipellucid +semipellucidity +semipendent +semipenniform +semiperfect +semiperimeter +semiperimetry +semiperiphery +semipermanent +semipermeability +semipermeable +semiperoid +semiperspicuous +semipertinent +semipervious +semipetaloid +semipetrified +semiphase +semiphilologist +semiphilosophic +semiphilosophical +semiphlogisticated +semiphonotypy +semiphosphorescent +semipinacolic +semipinacolin +semipinnate +semipiscine +semiplantigrade +semiplastic +semiplumaceous +semiplume +semipolar +semipolitical +semipolitician +semipoor +semipopish +semipopular +semiporcelain +semiporous +semiporphyritic +semiportable +semipostal +semipractical +semiprecious +semipreservation +semiprimigenous +semiprivacy +semiprivate +semipro +semiprofane +semiprofessional +semiprofessionalized +semipronation +semiprone +semipronominal +semiproof +semiproselyte +semiprosthetic +semiprostrate +semiprotectorate +semiproven +semipublic +semipupa +semipurulent +semiputrid +semipyramidal +semipyramidical +semipyritic +semiquadrangle +semiquadrantly +semiquadrate +semiquantitative +semiquantitatively +semiquartile +semiquaver +semiquietism +semiquietist +semiquinquefid +semiquintile +semiquote +semiradial +semiradiate +Semiramis +Semiramize +semirapacious +semirare +semirattlesnake +semiraw +semirebellion +semirecondite +semirecumbent +semirefined +semireflex +semiregular +semirelief +semireligious +semireniform +semirepublican +semiresinous +semiresolute +semirespectability +semirespectable +semireticulate +semiretirement +semiretractile +semireverberatory +semirevolute +semirevolution +semirevolutionist +semirhythm +semiriddle +semirigid +semiring +semiroll +semirotary +semirotating +semirotative +semirotatory +semirotund +semirotunda +semiround +semiroyal +semiruin +semirural +semirustic +semis +semisacerdotal +semisacred +semisagittate +semisaint +semisaline +semisaltire +semisaprophyte +semisaprophytic +semisarcodic +semisatiric +semisaturation +semisavage +semisavagedom +semisavagery +semiscenic +semischolastic +semiscientific +semiseafaring +semisecondary +semisecrecy +semisecret +semisection +semisedentary +semisegment +semisensuous +semisentient +semisentimental +semiseparatist +semiseptate +semiserf +semiserious +semiseriously +semiseriousness +semiservile +semisevere +semiseverely +semiseverity +semisextile +semishady +semishaft +semisheer +semishirker +semishrub +semishrubby +semisightseeing +semisilica +semisimious +semisimple +semisingle +semisixth +semiskilled +semislave +semismelting +semismile +semisocial +semisocialism +semisociative +semisocinian +semisoft +semisolemn +semisolemnity +semisolemnly +semisolid +semisolute +semisomnambulistic +semisomnolence +semisomnous +semisopor +semisovereignty +semispan +semispeculation +semisphere +semispheric +semispherical +semispheroidal +semispinalis +semispiral +semispiritous +semispontaneity +semispontaneous +semispontaneously +semispontaneousness +semisport +semisporting +semisquare +semistagnation +semistaminate +semistarvation +semistarved +semistate +semisteel +semistiff +semistill +semistock +semistory +semistratified +semistriate +semistriated +semistuporous +semisubterranean +semisuburban +semisuccess +semisuccessful +semisuccessfully +semisucculent +semisupernatural +semisupinated +semisupination +semisupine +semisuspension +semisymmetric +semita +semitact +semitae +semitailored +semital +semitandem +semitangent +semitaur +Semite +semitechnical +semiteetotal +semitelic +semitendinosus +semitendinous +semiterete +semiterrestrial +semitertian +semitesseral +semitessular +semitheological +semithoroughfare +Semitic +Semiticism +Semiticize +Semitics +semitime +Semitism +Semitist +Semitization +Semitize +semitonal +semitonally +semitone +semitonic +semitonically +semitontine +semitorpid +semitour +semitrailer +semitrained +semitransept +semitranslucent +semitransparency +semitransparent +semitransverse +semitreasonable +semitrimmed +semitropic +semitropical +semitropics +semitruth +semituberous +semitubular +semiuncial +semiundressed +semiuniversalist +semiupright +semiurban +semiurn +semivalvate +semivault +semivector +semivegetable +semivertebral +semiverticillate +semivibration +semivirtue +semiviscid +semivital +semivitreous +semivitrification +semivitrified +semivocal +semivocalic +semivolatile +semivolcanic +semivoluntary +semivowel +semivulcanized +semiwaking +semiwarfare +semiweekly +semiwild +semiwoody +semiyearly +semmet +semmit +Semnae +Semnones +Semnopithecinae +semnopithecine +Semnopithecus +semola +semolella +semolina +semological +semology +Semostomae +semostomeous +semostomous +semperannual +sempergreen +semperidentical +semperjuvenescent +sempervirent +sempervirid +Sempervivum +sempitern +sempiternal +sempiternally +sempiternity +sempiternize +sempiternous +sempstrywork +semsem +semuncia +semuncial +sen +Senaah +senaite +senam +senarian +senarius +senarmontite +senary +senate +senator +senatorial +senatorially +senatorian +senatorship +senatory +senatress +senatrices +senatrix +sence +Senci +sencion +send +sendable +sendal +sendee +sender +sending +Seneca +Senecan +Senecio +senecioid +senecionine +senectitude +senectude +senectuous +senega +Senegal +Senegalese +Senegambian +senegin +senesce +senescence +senescent +seneschal +seneschally +seneschalship +seneschalsy +seneschalty +sengreen +senicide +Senijextee +senile +senilely +senilism +senility +senilize +senior +seniority +seniorship +Senlac +Senna +senna +sennegrass +sennet +sennight +sennit +sennite +senocular +Senones +Senonian +sensa +sensable +sensal +sensate +sensation +sensational +sensationalism +sensationalist +sensationalistic +sensationalize +sensationally +sensationary +sensationish +sensationism +sensationist +sensationistic +sensationless +sensatorial +sensatory +sense +sensed +senseful +senseless +senselessly +senselessness +sensibilia +sensibilisin +sensibilitist +sensibilitous +sensibility +sensibilium +sensibilization +sensibilize +sensible +sensibleness +sensibly +sensical +sensifacient +sensiferous +sensific +sensificatory +sensifics +sensify +sensigenous +sensile +sensilia +sensilla +sensillum +sension +sensism +sensist +sensistic +sensitive +sensitively +sensitiveness +sensitivity +sensitization +sensitize +sensitizer +sensitometer +sensitometric +sensitometry +sensitory +sensive +sensize +senso +sensomobile +sensomobility +sensomotor +sensoparalysis +sensor +sensoria +sensorial +sensoriglandular +sensorimotor +sensorimuscular +sensorium +sensorivascular +sensorivasomotor +sensorivolitional +sensory +sensual +sensualism +sensualist +sensualistic +sensuality +sensualization +sensualize +sensually +sensualness +sensuism +sensuist +sensum +sensuosity +sensuous +sensuously +sensuousness +sensyne +sent +sentence +sentencer +sentential +sententially +sententiarian +sententiarist +sententiary +sententiosity +sententious +sententiously +sententiousness +sentience +sentiendum +sentient +sentiently +sentiment +sentimental +sentimentalism +sentimentalist +sentimentality +sentimentalization +sentimentalize +sentimentalizer +sentimentally +sentimenter +sentimentless +sentinel +sentinellike +sentinelship +sentinelwise +sentisection +sentition +sentry +Senusi +Senusian +Senusism +sepad +sepal +sepaled +sepaline +sepalled +sepalody +sepaloid +separability +separable +separableness +separably +separata +separate +separatedly +separately +separateness +separates +separatical +separating +separation +separationism +separationist +separatism +separatist +separatistic +separative +separatively +separativeness +separator +separatory +separatress +separatrix +separatum +Sepharad +Sephardi +Sephardic +Sephardim +Sepharvites +sephen +sephiric +sephirothic +sepia +sepiaceous +sepialike +sepian +sepiarian +sepiary +sepic +sepicolous +Sepiidae +sepiment +sepioid +Sepioidea +Sepiola +Sepiolidae +sepiolite +sepion +sepiost +sepiostaire +sepium +sepone +sepoy +seppuku +seps +Sepsidae +sepsine +sepsis +Sept +sept +septa +septal +septan +septane +septangle +septangled +septangular +septangularness +septarian +septariate +septarium +septate +septated +septation +septatoarticulate +septavalent +septave +septcentenary +septectomy +September +Septemberer +Septemberism +Septemberist +Septembral +Septembrian +Septembrist +Septembrize +Septembrizer +septemdecenary +septemfid +septemfluous +septemfoliate +septemfoliolate +septemia +septempartite +septemplicate +septemvious +septemvir +septemvirate +septemviri +septenar +septenarian +septenarius +septenary +septenate +septendecennial +septendecimal +septennary +septennate +septenniad +septennial +septennialist +septenniality +septennially +septennium +septenous +Septentrio +Septentrion +septentrional +septentrionality +septentrionally +septentrionate +septentrionic +septerium +septet +septfoil +Septi +Septibranchia +Septibranchiata +septic +septical +septically +septicemia +septicemic +septicidal +septicidally +septicity +septicization +septicolored +septicopyemia +septicopyemic +septier +septifarious +septiferous +septifluous +septifolious +septiform +septifragal +septifragally +septilateral +septile +septillion +septillionth +septimal +septimanal +septimanarian +septime +septimetritis +septimole +septinsular +septipartite +septisyllabic +septisyllable +septivalent +septleva +Septobasidium +septocosta +septocylindrical +Septocylindrium +septodiarrhea +septogerm +Septogloeum +septoic +septole +septomarginal +septomaxillary +septonasal +Septoria +septotomy +septship +septuagenarian +septuagenarianism +septuagenary +septuagesima +Septuagint +septuagint +Septuagintal +septulate +septulum +septum +septuncial +septuor +septuple +septuplet +septuplicate +septuplication +sepulcher +sepulchral +sepulchralize +sepulchrally +sepulchrous +sepultural +sepulture +sequa +sequacious +sequaciously +sequaciousness +sequacity +Sequan +Sequani +Sequanian +sequel +sequela +sequelae +sequelant +sequence +sequencer +sequency +sequent +sequential +sequentiality +sequentially +sequently +sequest +sequester +sequestered +sequesterment +sequestra +sequestrable +sequestral +sequestrate +sequestration +sequestrator +sequestratrices +sequestratrix +sequestrectomy +sequestrotomy +sequestrum +sequin +sequitur +Sequoia +ser +sera +serab +Serabend +seragli +seraglio +serai +serail +seral +seralbumin +seralbuminous +serang +serape +Serapea +Serapeum +seraph +seraphic +seraphical +seraphically +seraphicalness +seraphicism +seraphicness +seraphim +seraphina +seraphine +seraphism +seraphlike +seraphtide +Serapias +Serapic +Serapis +Serapist +serasker +seraskerate +seraskier +seraskierat +serau +seraw +Serb +Serbdom +Serbian +Serbize +Serbonian +Serbophile +Serbophobe +sercial +serdab +Sere +sere +Serean +sereh +Serena +serenade +serenader +serenata +serenate +Serendib +serendibite +serendipity +serendite +serene +serenely +sereneness +serenify +serenissime +serenissimi +serenissimo +serenity +serenize +Serenoa +Serer +Seres +sereward +serf +serfage +serfdom +serfhood +serfish +serfishly +serfishness +serfism +serflike +serfship +Serge +serge +sergeancy +sergeant +sergeantcy +sergeantess +sergeantry +sergeantship +sergeanty +sergedesoy +serger +sergette +serging +Sergius +serglobulin +Seri +serial +serialist +seriality +serialization +serialize +serially +Serian +seriary +seriate +seriately +seriatim +seriation +Seric +Sericana +sericate +sericated +sericea +sericeotomentose +sericeous +sericicultural +sericiculture +sericiculturist +sericin +sericipary +sericite +sericitic +sericitization +Sericocarpus +sericteria +sericterium +serictery +sericultural +sericulture +sericulturist +seriema +series +serif +serific +Seriform +serigraph +serigrapher +serigraphy +serimeter +serin +serine +serinette +seringa +seringal +seringhi +Serinus +serio +seriocomedy +seriocomic +seriocomical +seriocomically +seriogrotesque +Seriola +Seriolidae +serioline +serioludicrous +seriopantomimic +serioridiculous +seriosity +serious +seriously +seriousness +seripositor +Serjania +serjeant +serment +sermo +sermocination +sermocinatrix +sermon +sermoneer +sermoner +sermonesque +sermonet +sermonettino +sermonic +sermonically +sermonics +sermonish +sermonism +sermonist +sermonize +sermonizer +sermonless +sermonoid +sermonolatry +sermonology +sermonproof +sermonwise +sermuncle +sernamby +sero +seroalbumin +seroalbuminuria +seroanaphylaxis +serobiological +serocolitis +serocyst +serocystic +serodermatosis +serodermitis +serodiagnosis +serodiagnostic +seroenteritis +seroenzyme +serofibrinous +serofibrous +serofluid +serogelatinous +serohemorrhagic +serohepatitis +seroimmunity +serolactescent +serolemma +serolin +serolipase +serologic +serological +serologically +serologist +serology +seromaniac +seromembranous +seromucous +seromuscular +seron +seronegative +seronegativity +seroon +seroot +seroperitoneum +serophthisis +serophysiology +seroplastic +seropneumothorax +seropositive +seroprevention +seroprognosis +seroprophylaxis +seroprotease +seropuriform +seropurulent +seropus +seroreaction +serosa +serosanguineous +serosanguinolent +seroscopy +serositis +serosity +serosynovial +serosynovitis +serotherapeutic +serotherapeutics +serotherapist +serotherapy +serotina +serotinal +serotine +serotinous +serotoxin +serous +serousness +serovaccine +serow +serozyme +Serpari +serpedinous +Serpens +Serpent +serpent +serpentaria +Serpentarian +Serpentarii +serpentarium +Serpentarius +serpentary +serpentcleide +serpenteau +Serpentes +serpentess +Serpentian +serpenticidal +serpenticide +Serpentid +serpentiferous +serpentiform +serpentina +serpentine +serpentinely +Serpentinian +serpentinic +serpentiningly +serpentinization +serpentinize +serpentinoid +serpentinous +Serpentis +serpentivorous +serpentize +serpentlike +serpently +serpentoid +serpentry +serpentwood +serphid +Serphidae +serphoid +Serphoidea +serpierite +serpiginous +serpiginously +serpigo +serpivolant +serpolet +Serpula +serpula +Serpulae +serpulae +serpulan +serpulid +Serpulidae +serpulidan +serpuline +serpulite +serpulitic +serpuloid +serra +serradella +serrage +serran +serrana +serranid +Serranidae +Serrano +serrano +serranoid +Serranus +Serrasalmo +serrate +serrated +serratic +serratiform +serratile +serration +serratirostral +serratocrenate +serratodentate +serratodenticulate +serratoglandulous +serratospinose +serrature +serricorn +Serricornia +Serridentines +Serridentinus +serried +serriedly +serriedness +Serrifera +serriferous +serriform +serriped +serrirostrate +serrulate +serrulated +serrulation +serry +sert +serta +Sertularia +sertularian +Sertulariidae +sertularioid +sertule +sertulum +sertum +serum +serumal +serut +servable +servage +serval +servaline +servant +servantcy +servantdom +servantess +servantless +servantlike +servantry +servantship +servation +serve +servente +serventism +server +servery +servet +Servetian +Servetianism +Servian +service +serviceability +serviceable +serviceableness +serviceably +serviceberry +serviceless +servicelessness +serviceman +Servidor +servidor +servient +serviential +serviette +servile +servilely +servileness +servilism +servility +servilize +serving +servingman +servist +Servite +servitor +servitorial +servitorship +servitress +servitrix +servitude +serviture +Servius +servo +servomechanism +servomotor +servulate +serwamby +sesame +sesamoid +sesamoidal +sesamoiditis +Sesamum +Sesban +Sesbania +sescuple +Seseli +Seshat +Sesia +Sesiidae +sesma +sesqui +sesquialter +sesquialtera +sesquialteral +sesquialteran +sesquialterous +sesquibasic +sesquicarbonate +sesquicentennial +sesquichloride +sesquiduplicate +sesquihydrate +sesquihydrated +sesquinona +sesquinonal +sesquioctava +sesquioctaval +sesquioxide +sesquipedal +sesquipedalian +sesquipedalianism +sesquipedality +sesquiplicate +sesquiquadrate +sesquiquarta +sesquiquartal +sesquiquartile +sesquiquinta +sesquiquintal +sesquiquintile +sesquisalt +sesquiseptimal +sesquisextal +sesquisilicate +sesquisquare +sesquisulphate +sesquisulphide +sesquisulphuret +sesquiterpene +sesquitertia +sesquitertial +sesquitertian +sesquitertianal +sess +sessile +sessility +Sessiliventres +session +sessional +sessionary +sessions +sesterce +sestertium +sestet +sesti +sestiad +Sestian +sestina +sestine +sestole +sestuor +Sesuto +Sesuvium +set +seta +setaceous +setaceously +setae +setal +Setaria +setarious +setback +setbolt +setdown +setfast +Seth +seth +sethead +Sethian +Sethic +Sethite +Setibo +setier +Setifera +setiferous +setiform +setigerous +setiparous +setirostral +setline +setness +setoff +seton +Setophaga +Setophaginae +setophagine +setose +setous +setout +setover +setscrew +setsman +sett +settable +settaine +settee +setter +settergrass +setterwort +setting +settle +settleable +settled +settledly +settledness +settlement +settler +settlerdom +settling +settlings +settlor +settsman +setula +setule +setuliform +setulose +setulous +setup +setwall +setwise +setwork +seugh +Sevastopol +seven +sevenbark +sevener +sevenfold +sevenfolded +sevenfoldness +sevennight +sevenpence +sevenpenny +sevenscore +seventeen +seventeenfold +seventeenth +seventeenthly +seventh +seventhly +seventieth +seventy +seventyfold +sever +severable +several +severalfold +severality +severalize +severally +severalness +severalth +severalty +severance +severation +severe +severedly +severely +severeness +severer +Severian +severingly +severish +severity +severization +severize +severy +Sevillian +sew +sewable +sewage +sewan +sewed +sewellel +sewen +sewer +sewerage +sewered +sewerless +sewerlike +sewerman +sewery +sewing +sewless +sewn +sewround +sex +sexadecimal +sexagenarian +sexagenarianism +sexagenary +Sexagesima +sexagesimal +sexagesimally +sexagesimals +sexagonal +sexangle +sexangled +sexangular +sexangularly +sexannulate +sexarticulate +sexcentenary +sexcuspidate +sexdigital +sexdigitate +sexdigitated +sexdigitism +sexed +sexenary +sexennial +sexennially +sexennium +sexern +sexfarious +sexfid +sexfoil +sexhood +sexifid +sexillion +sexiped +sexipolar +sexisyllabic +sexisyllable +sexitubercular +sexivalence +sexivalency +sexivalent +sexless +sexlessly +sexlessness +sexlike +sexlocular +sexly +sexological +sexologist +sexology +sexpartite +sexradiate +sext +sextactic +sextain +sextan +sextans +Sextant +sextant +sextantal +sextar +sextarii +sextarius +sextary +sextennial +sextern +sextet +sextic +sextile +Sextilis +sextillion +sextillionth +sextipara +sextipartite +sextipartition +sextiply +sextipolar +sexto +sextodecimo +sextole +sextolet +sexton +sextoness +sextonship +sextry +sextubercular +sextuberculate +sextula +sextulary +sextumvirate +sextuple +sextuplet +sextuplex +sextuplicate +sextuply +sexual +sexuale +sexualism +sexualist +sexuality +sexualization +sexualize +sexually +sexuous +sexupara +sexuparous +sexy +sey +seybertite +Seymeria +sfoot +Sgad +sgraffiato +sgraffito +sh +sha +shaatnez +shab +Shaban +shabash +Shabbath +shabbed +shabbify +shabbily +shabbiness +shabble +shabby +shabbyish +shabrack +shabunder +Shabuoth +shachle +shachly +shack +shackanite +shackatory +shackbolt +shackland +shackle +shacklebone +shackledom +shackler +shacklewise +shackling +shackly +shacky +shad +shadbelly +shadberry +shadbird +shadbush +shadchan +shaddock +shade +shaded +shadeful +shadeless +shadelessness +shader +shadetail +shadflower +shadily +shadine +shadiness +shading +shadkan +shadoof +shadow +shadowable +shadowbox +shadowboxing +shadowed +shadower +shadowfoot +shadowgram +shadowgraph +shadowgraphic +shadowgraphist +shadowgraphy +shadowily +shadowiness +shadowing +shadowishly +shadowist +shadowland +shadowless +shadowlessness +shadowlike +shadowly +shadowy +shadrach +shady +shaffle +Shafiite +shaft +shafted +shafter +shaftfoot +shafting +shaftless +shaftlike +shaftman +shaftment +shaftsman +shaftway +shafty +shag +shaganappi +shagbag +shagbark +shagged +shaggedness +shaggily +shagginess +shaggy +Shagia +shaglet +shaglike +shagpate +shagrag +shagreen +shagreened +shagroon +shagtail +shah +Shahaptian +shaharith +shahdom +shahi +shahin +shahzada +Shaigia +shaikh +Shaikiyeh +shaitan +Shaiva +Shaivism +Shaka +shakable +shake +shakeable +shakebly +shakedown +shakefork +shaken +shakenly +shakeout +shakeproof +Shaker +shaker +shakerag +Shakerdom +Shakeress +Shakerism +Shakerlike +shakers +shakescene +Shakespearean +Shakespeareana +Shakespeareanism +Shakespeareanly +Shakespearize +Shakespearolater +Shakespearolatry +shakha +shakily +shakiness +shaking +shakingly +shako +shaksheer +Shakta +Shakti +shakti +Shaktism +shaku +shaky +Shakyamuni +Shalako +shale +shalelike +shaleman +shall +shallal +shallon +shalloon +shallop +shallopy +shallot +shallow +shallowbrained +shallowhearted +shallowish +shallowist +shallowly +shallowness +shallowpate +shallowpated +shallows +shallowy +shallu +shalom +shalt +shalwar +shaly +Sham +sham +shama +shamable +shamableness +shamably +shamal +shamalo +shaman +shamaness +shamanic +shamanism +shamanist +shamanistic +shamanize +shamateur +shamba +Shambala +shamble +shambling +shamblingly +shambrier +Shambu +shame +shameable +shamed +shameface +shamefaced +shamefacedly +shamefacedness +shamefast +shamefastly +shamefastness +shameful +shamefully +shamefulness +shameless +shamelessly +shamelessness +shameproof +shamer +shamesick +shameworthy +shamianah +shamir +Shammar +shammed +shammer +shammick +shamming +shammish +shammock +shammocking +shammocky +shammy +shampoo +shampooer +shamrock +shamroot +shamsheer +Shan +shan +shanachas +shanachie +Shandean +shandry +shandrydan +Shandy +shandy +shandygaff +Shandyism +Shang +Shangalla +shangan +Shanghai +shanghai +shanghaier +shank +shanked +shanker +shankings +shankpiece +shanksman +shanna +shanny +shansa +shant +Shantung +shanty +shantylike +shantyman +shantytown +shap +shapable +Shape +shape +shaped +shapeful +shapeless +shapelessly +shapelessness +shapeliness +shapely +shapen +shaper +shapeshifter +shapesmith +shaping +shapingly +shapometer +shaps +Shaptan +shapy +sharable +shard +Shardana +sharded +shardy +share +shareable +sharebone +sharebroker +sharecrop +sharecropper +shareholder +shareholdership +shareman +sharepenny +sharer +shareship +sharesman +sharewort +Sharezer +shargar +Sharia +Sharira +shark +sharkful +sharkish +sharklet +sharklike +sharkship +sharkskin +sharky +sharn +sharnbud +sharny +sharp +sharpen +sharpener +sharper +sharpie +sharpish +sharply +sharpness +sharps +sharpsaw +sharpshin +sharpshod +sharpshooter +sharpshooting +sharptail +sharpware +sharpy +Sharra +sharrag +sharry +Shasta +shastaite +Shastan +shaster +shastra +shastraik +shastri +shastrik +shat +shatan +shathmont +shatter +shatterbrain +shatterbrained +shatterer +shatterheaded +shattering +shatteringly +shatterment +shatterpated +shatterproof +shatterwit +shattery +shattuckite +shauchle +shaugh +shaul +Shaula +shaup +shauri +shauwe +shavable +shave +shaveable +shaved +shavee +shaveling +shaven +shaver +shavery +Shavese +shavester +shavetail +shaveweed +Shavian +Shaviana +Shavianism +shaving +shavings +shaw +Shawanese +Shawano +shawl +shawled +shawling +shawlless +shawllike +shawlwise +shawm +Shawnee +shawneewood +shawny +Shawwal +shawy +shay +Shaysite +she +shea +sheading +sheaf +sheafage +sheaflike +sheafripe +sheafy +sheal +shealing +shear +shearbill +sheard +shearer +sheargrass +shearhog +shearing +shearless +shearling +shearman +shearmouse +shears +shearsman +sheartail +shearwater +shearwaters +sheat +sheatfish +sheath +sheathbill +sheathe +sheathed +sheather +sheathery +sheathing +sheathless +sheathlike +sheathy +sheave +sheaved +sheaveless +sheaveman +shebang +Shebat +shebeen +shebeener +Shechem +Shechemites +shed +shedded +shedder +shedding +sheder +shedhand +shedlike +shedman +shedwise +shee +sheely +sheen +sheenful +sheenless +sheenly +sheeny +sheep +sheepback +sheepberry +sheepbine +sheepbiter +sheepbiting +sheepcote +sheepcrook +sheepfaced +sheepfacedly +sheepfacedness +sheepfold +sheepfoot +sheepgate +sheephead +sheepheaded +sheephearted +sheepherder +sheepherding +sheephook +sheephouse +sheepify +sheepish +sheepishly +sheepishness +sheepkeeper +sheepkeeping +sheepkill +sheepless +sheeplet +sheeplike +sheepling +sheepman +sheepmaster +sheepmonger +sheepnose +sheepnut +sheeppen +sheepshank +sheepshead +sheepsheadism +sheepshear +sheepshearer +sheepshearing +sheepshed +sheepskin +sheepsplit +sheepsteal +sheepstealer +sheepstealing +sheepwalk +sheepwalker +sheepweed +sheepy +sheer +sheered +sheering +sheerly +sheerness +sheet +sheetage +sheeted +sheeter +sheetflood +sheetful +sheeting +sheetless +sheetlet +sheetlike +sheetling +sheetways +sheetwise +sheetwork +sheetwriting +sheety +Sheffield +shehitah +sheik +sheikdom +sheikhlike +sheikhly +sheiklike +sheikly +Sheila +shekel +Shekinah +shela +sheld +sheldapple +shelder +sheldfowl +sheldrake +shelduck +shelf +shelfback +shelffellow +shelfful +shelflist +shelfmate +shelfpiece +shelfroom +shelfworn +shelfy +shell +shellac +shellacker +shellacking +shellapple +shellback +shellblow +shellblowing +shellbound +shellburst +shellcracker +shelleater +shelled +sheller +Shelleyan +Shelleyana +shellfire +shellfish +shellfishery +shellflower +shellful +shellhead +shelliness +shelling +shellman +shellmonger +shellproof +shellshake +shellum +shellwork +shellworker +shelly +shellycoat +shelta +shelter +shelterage +sheltered +shelterer +shelteringly +shelterless +shelterlessness +shelterwood +sheltery +sheltron +shelty +shelve +shelver +shelving +shelvingly +shelvingness +shelvy +Shelyak +Shemaka +sheminith +Shemite +Shemitic +Shemitish +Shemu +Shen +shenanigan +shend +sheng +Shenshai +Sheol +sheolic +shepherd +shepherdage +shepherddom +shepherdess +shepherdhood +Shepherdia +shepherdish +shepherdism +shepherdize +shepherdless +shepherdlike +shepherdling +shepherdly +shepherdry +sheppeck +sheppey +shepstare +sher +Sherani +Sherardia +sherardize +sherardizer +Sheratan +Sheraton +sherbacha +sherbet +sherbetlee +sherbetzide +sheriat +sherif +sherifa +sherifate +sheriff +sheriffalty +sheriffdom +sheriffess +sheriffhood +sheriffry +sheriffship +sheriffwick +sherifi +sherifian +sherify +sheristadar +Sheriyat +sherlock +Sherpa +Sherramoor +sherry +Sherrymoor +sherryvallies +Shesha +sheth +Shetland +Shetlander +Shetlandic +sheugh +sheva +shevel +sheveled +shevri +shewa +shewbread +shewel +sheyle +shi +Shiah +shibah +shibar +shibboleth +shibbolethic +shibuichi +shice +shicer +shicker +shickered +shide +shied +shiel +shield +shieldable +shieldboard +shielddrake +shielded +shielder +shieldflower +shielding +shieldless +shieldlessly +shieldlessness +shieldlike +shieldling +shieldmaker +shieldmay +shieldtail +shieling +shier +shies +shiest +shift +shiftable +shiftage +shifter +shiftful +shiftfulness +shiftily +shiftiness +shifting +shiftingly +shiftingness +shiftless +shiftlessly +shiftlessness +shifty +Shigella +shiggaion +shigram +shih +Shiism +Shiite +Shiitic +Shik +shikar +shikara +shikargah +shikari +shikasta +shikimi +shikimic +shikimole +shikimotoxin +shikken +shiko +shikra +shilf +shilfa +Shilh +Shilha +shill +shilla +shillaber +shillelagh +shillet +shillety +shillhouse +shillibeer +shilling +shillingless +shillingsworth +shilloo +Shilluh +Shilluk +Shiloh +shilpit +shim +shimal +Shimei +shimmer +shimmering +shimmeringly +shimmery +shimmy +Shimonoseki +shimose +shimper +shin +Shina +shinaniging +shinarump +shinbone +shindig +shindle +shindy +shine +shineless +shiner +shingle +shingled +shingler +shingles +shinglewise +shinglewood +shingling +shingly +shinily +shininess +shining +shiningly +shiningness +shinleaf +Shinnecock +shinner +shinnery +shinning +shinny +shinplaster +shintiyan +Shinto +Shintoism +Shintoist +Shintoistic +Shintoize +shinty +Shinwari +shinwood +shiny +shinza +ship +shipboard +shipbound +shipboy +shipbreaking +shipbroken +shipbuilder +shipbuilding +shipcraft +shipentine +shipful +shipkeeper +shiplap +shipless +shiplessly +shiplet +shipload +shipman +shipmanship +shipmast +shipmaster +shipmate +shipmatish +shipment +shipowner +shipowning +shippable +shippage +shipped +shipper +shipping +shipplane +shippo +shippon +shippy +shipshape +shipshapely +shipside +shipsmith +shipward +shipwards +shipway +shipwork +shipworm +shipwreck +shipwrecky +shipwright +shipwrightery +shipwrightry +shipyard +shirakashi +shirallee +Shiraz +shire +shirehouse +shireman +shirewick +shirk +shirker +shirky +shirl +shirlcock +shirpit +shirr +shirring +shirt +shirtband +shirtiness +shirting +shirtless +shirtlessness +shirtlike +shirtmaker +shirtmaking +shirtman +shirttail +shirtwaist +shirty +Shirvan +shish +shisham +shisn +shita +shitepoke +shither +shittah +shittim +shittimwood +shiv +Shivaism +Shivaist +Shivaistic +Shivaite +shivaree +shive +shiver +shivereens +shiverer +shivering +shiveringly +shiverproof +shiversome +shiverweed +shivery +shivey +shivoo +shivy +shivzoku +Shkupetar +Shlu +Shluh +sho +Shoa +shoad +shoader +shoal +shoalbrain +shoaler +shoaliness +shoalness +shoalwise +shoaly +shoat +shock +shockability +shockable +shockedness +shocker +shockheaded +shocking +shockingly +shockingness +shocklike +shockproof +shod +shodden +shoddily +shoddiness +shoddy +shoddydom +shoddyism +shoddyite +shoddylike +shoddyward +shoddywards +shode +shoder +shoe +shoebill +shoebinder +shoebindery +shoebinding +shoebird +shoeblack +shoeboy +shoebrush +shoecraft +shoeflower +shoehorn +shoeing +shoeingsmith +shoelace +shoeless +shoemaker +shoemaking +shoeman +shoepack +shoer +shoescraper +shoeshine +shoeshop +shoesmith +shoestring +shoewoman +shoful +shog +shogaol +shoggie +shoggle +shoggly +shogi +shogun +shogunal +shogunate +shohet +shoji +Shojo +shola +shole +Shona +shone +shoneen +shonkinite +shoo +shood +shoofa +shoofly +shooi +shook +shool +shooldarry +shooler +shoop +shoopiltie +shoor +shoot +shootable +shootboard +shootee +shooter +shoother +shooting +shootist +shootman +shop +shopboard +shopbook +shopboy +shopbreaker +shopbreaking +shopfolk +shopful +shopgirl +shopgirlish +shophar +shopkeeper +shopkeeperess +shopkeeperish +shopkeeperism +shopkeepery +shopkeeping +shopland +shoplet +shoplifter +shoplifting +shoplike +shopmaid +shopman +shopmark +shopmate +shopocracy +shopocrat +shoppe +shopper +shopping +shoppish +shoppishness +shoppy +shopster +shoptalk +shopwalker +shopwear +shopwife +shopwindow +shopwoman +shopwork +shopworker +shopworn +shoq +Shor +shor +shoran +shore +Shorea +shoreberry +shorebush +shored +shoregoing +shoreland +shoreless +shoreman +shorer +shoreside +shoresman +shoreward +shorewards +shoreweed +shoreyer +shoring +shorling +shorn +short +shortage +shortbread +shortcake +shortchange +shortchanger +shortclothes +shortcoat +shortcomer +shortcoming +shorten +shortener +shortening +shorter +shortfall +shorthand +shorthanded +shorthandedness +shorthander +shorthead +shorthorn +Shortia +shortish +shortly +shortness +shorts +shortschat +shortsighted +shortsightedly +shortsightedness +shortsome +shortstaff +shortstop +shorttail +Shortzy +Shoshonean +shoshonite +shot +shotbush +shote +shotgun +shotless +shotlike +shotmaker +shotman +shotproof +shotsman +shotstar +shott +shotted +shotten +shotter +shotty +Shotweld +shou +should +shoulder +shouldered +shoulderer +shoulderette +shouldering +shouldna +shouldnt +shoupeltin +shout +shouter +shouting +shoutingly +shoval +shove +shovegroat +shovel +shovelard +shovelbill +shovelboard +shovelfish +shovelful +shovelhead +shovelmaker +shovelman +shovelnose +shovelweed +shover +show +showable +showance +showbird +showboard +showboat +showboater +showboating +showcase +showdom +showdown +shower +showerer +showerful +showeriness +showerless +showerlike +showerproof +showery +showily +showiness +showing +showish +showless +showman +showmanism +showmanry +showmanship +shown +showpiece +showroom +showup +showworthy +showy +showyard +shoya +shrab +shraddha +shradh +shraf +shrag +shram +shrank +shrap +shrapnel +shrave +shravey +shreadhead +shred +shredcock +shredder +shredding +shreddy +shredless +shredlike +Shree +shree +shreeve +shrend +shrew +shrewd +shrewdish +shrewdly +shrewdness +shrewdom +shrewdy +shrewish +shrewishly +shrewishness +shrewlike +shrewly +shrewmouse +shrewstruck +shriek +shrieker +shriekery +shriekily +shriekiness +shriekingly +shriekproof +shrieky +shrieval +shrievalty +shrift +shrike +shrill +shrilling +shrillish +shrillness +shrilly +shrimp +shrimper +shrimpfish +shrimpi +shrimpish +shrimpishness +shrimplike +shrimpy +shrinal +Shrine +shrine +shrineless +shrinelet +shrinelike +Shriner +shrink +shrinkable +shrinkage +shrinkageproof +shrinker +shrinkhead +shrinking +shrinkingly +shrinkproof +shrinky +shrip +shrite +shrive +shrivel +shriven +shriver +shriving +shroff +shrog +Shropshire +shroud +shrouded +shrouding +shroudless +shroudlike +shroudy +Shrove +shrove +shrover +Shrovetide +shrub +shrubbed +shrubbery +shrubbiness +shrubbish +shrubby +shrubland +shrubless +shrublet +shrublike +shrubwood +shruff +shrug +shruggingly +shrunk +shrunken +shrups +Shtokavski +shtreimel +Shu +shuba +shubunkin +shuck +shucker +shucking +shuckins +shuckpen +shucks +shudder +shudderful +shudderiness +shudderingly +shuddersome +shuddery +shuff +shuffle +shuffleboard +shufflecap +shuffler +shufflewing +shuffling +shufflingly +shug +Shuhali +Shukria +Shukulumbwe +shul +Shulamite +shuler +shulwaurs +shumac +shun +Shunammite +shune +shunless +shunnable +shunner +shunt +shunter +shunting +shure +shurf +shush +shusher +Shuswap +shut +shutdown +shutness +shutoff +shutout +shuttance +shutten +shutter +shuttering +shutterless +shutterwise +shutting +shuttle +shuttlecock +shuttleheaded +shuttlelike +shuttlewise +shwanpan +shy +shydepoke +shyer +shyish +Shylock +Shylockism +shyly +shyness +shyster +si +Sia +siak +sial +sialaden +sialadenitis +sialadenoncus +sialagogic +sialagogue +sialagoguic +sialemesis +Sialia +sialic +sialid +Sialidae +sialidan +Sialis +sialoangitis +sialogenous +sialoid +sialolith +sialolithiasis +sialology +sialorrhea +sialoschesis +sialosemeiology +sialosis +sialostenosis +sialosyrinx +sialozemia +Siam +siamang +Siamese +sib +Sibbaldus +sibbed +sibbens +sibber +sibboleth +sibby +Siberian +Siberic +siberite +sibilance +sibilancy +sibilant +sibilantly +sibilate +sibilatingly +sibilator +sibilatory +sibilous +sibilus +Sibiric +sibling +sibness +sibrede +sibship +sibyl +sibylesque +sibylic +sibylism +sibylla +sibylline +sibyllist +sic +Sicambri +Sicambrian +Sicana +Sicani +Sicanian +sicarian +sicarious +sicarius +sicca +siccaneous +siccant +siccate +siccation +siccative +siccimeter +siccity +sice +Sicel +Siceliot +Sicilian +sicilian +siciliana +Sicilianism +sicilica +sicilicum +sicilienne +sicinnian +sick +sickbed +sicken +sickener +sickening +sickeningly +sicker +sickerly +sickerness +sickhearted +sickish +sickishly +sickishness +sickle +sicklebill +sickled +sicklelike +sickleman +sicklemia +sicklemic +sicklepod +sickler +sicklerite +sickless +sickleweed +sicklewise +sicklewort +sicklied +sicklily +sickliness +sickling +sickly +sickness +sicknessproof +sickroom +sicsac +sicula +sicular +Siculi +Siculian +Sicyonian +Sicyonic +Sicyos +Sida +Sidalcea +sidder +Siddha +Siddhanta +Siddhartha +Siddhi +siddur +side +sideage +sidearm +sideboard +sidebone +sidebones +sideburns +sidecar +sidecarist +sidecheck +sided +sidedness +sideflash +sidehead +sidehill +sidekicker +sidelang +sideless +sideline +sideling +sidelings +sidelingwise +sidelong +sidenote +sidepiece +sider +sideral +sideration +siderealize +sidereally +siderean +siderin +siderism +siderite +sideritic +Sideritis +siderognost +siderographic +siderographical +siderographist +siderography +siderolite +siderology +sideromagnetic +sideromancy +sideromelane +sideronatrite +sideronym +sideroscope +siderose +siderosis +siderostat +siderostatic +siderotechny +siderous +Sideroxylon +sidership +siderurgical +siderurgy +sides +sidesaddle +sideshake +sideslip +sidesman +sidesplitter +sidesplitting +sidesplittingly +sidesway +sideswipe +sideswiper +sidetrack +sidewalk +sideward +sidewards +sideway +sideways +sidewinder +sidewipe +sidewiper +sidewise +sidhe +sidi +siding +sidle +sidler +sidling +sidlingly +Sidney +Sidonian +Sidrach +sidth +sidy +sie +siege +siegeable +siegecraft +siegenite +sieger +siegework +Siegfried +Sieglingia +Siegmund +Siena +Sienese +sienna +sier +siering +sierozem +Sierra +sierra +sierran +siesta +siestaland +Sieva +sieve +sieveful +sievelike +siever +Sieversia +sievings +sievy +sifac +sifaka +Sifatite +sife +siffilate +siffle +sifflement +sifflet +sifflot +sift +siftage +sifted +sifter +sifting +sig +Siganidae +Siganus +sigatoka +Sigaultian +sigger +sigh +sigher +sighful +sighfully +sighing +sighingly +sighingness +sighless +sighlike +sight +sightable +sighted +sighten +sightening +sighter +sightful +sightfulness +sighthole +sighting +sightless +sightlessly +sightlessness +sightlily +sightliness +sightly +sightproof +sightworthiness +sightworthy +sighty +sigil +sigilative +Sigillaria +Sigillariaceae +sigillariaceous +sigillarian +sigillarid +sigillarioid +sigillarist +sigillaroid +sigillary +sigillate +sigillated +sigillation +sigillistic +sigillographer +sigillographical +sigillography +sigillum +sigla +siglarian +siglos +Sigma +sigma +sigmaspire +sigmate +sigmatic +sigmation +sigmatism +sigmodont +Sigmodontes +sigmoid +sigmoidal +sigmoidally +sigmoidectomy +sigmoiditis +sigmoidopexy +sigmoidoproctostomy +sigmoidorectostomy +sigmoidoscope +sigmoidoscopy +sigmoidostomy +Sigmund +sign +signable +signal +signalee +signaler +signalese +signaletic +signaletics +signalism +signalist +signality +signalize +signally +signalman +signalment +signary +signatary +signate +signation +signator +signatory +signatural +signature +signatureless +signaturist +signboard +signee +signer +signet +signetwise +signifer +signifiable +significal +significance +significancy +significant +significantly +significantness +significate +signification +significatist +significative +significatively +significativeness +significator +significatory +significatrix +significature +significavit +significian +significs +signifier +signify +signior +signiorship +signist +signless +signlike +signman +signorial +signorship +signory +signpost +signum +signwriter +Sihasapa +Sika +sika +sikar +sikatch +sike +sikerly +sikerness +siket +Sikh +sikhara +Sikhism +sikhra +Sikinnis +Sikkimese +Siksika +sil +silage +silaginoid +silane +Silas +silbergroschen +silcrete +sile +silen +Silenaceae +silenaceous +Silenales +silence +silenced +silencer +silency +Silene +sileni +silenic +silent +silential +silentiary +silentious +silentish +silently +silentness +silenus +silesia +Silesian +Siletz +silex +silexite +silhouette +silhouettist +silhouettograph +silica +silicam +silicane +silicate +silication +silicatization +Silicea +silicean +siliceocalcareous +siliceofelspathic +siliceofluoric +siliceous +silicic +silicicalcareous +silicicolous +silicide +silicidize +siliciferous +silicification +silicifluoric +silicifluoride +silicify +siliciophite +silicious +Silicispongiae +silicium +siliciuretted +silicize +silicle +silico +silicoacetic +silicoalkaline +silicoaluminate +silicoarsenide +silicocalcareous +silicochloroform +silicocyanide +silicoethane +silicoferruginous +Silicoflagellata +Silicoflagellatae +silicoflagellate +Silicoflagellidae +silicofluoric +silicofluoride +silicohydrocarbon +Silicoidea +silicomagnesian +silicomanganese +silicomethane +silicon +silicone +siliconize +silicononane +silicopropane +silicosis +Silicospongiae +silicotalcose +silicotic +silicotitanate +silicotungstate +silicotungstic +silicula +silicular +silicule +siliculose +siliculous +silicyl +Silipan +siliqua +siliquaceous +siliquae +Siliquaria +Siliquariidae +silique +siliquiferous +siliquiform +siliquose +siliquous +silk +silkalene +silkaline +silked +silken +silker +silkflower +silkgrower +silkie +silkily +silkiness +silklike +silkman +silkness +silksman +silktail +silkweed +silkwoman +silkwood +silkwork +silkworks +silkworm +silky +sill +sillabub +silladar +Sillaginidae +Sillago +sillandar +sillar +siller +Sillery +sillibouk +sillikin +sillily +sillimanite +silliness +sillock +sillograph +sillographer +sillographist +sillometer +sillon +silly +sillyhood +sillyhow +sillyish +sillyism +sillyton +silo +siloist +Silpha +silphid +Silphidae +silphium +silt +siltage +siltation +silting +siltlike +silty +silundum +Silures +Silurian +Siluric +silurid +Siluridae +Siluridan +siluroid +Siluroidei +Silurus +silva +silvan +silvanity +silvanry +Silvanus +silvendy +silver +silverback +silverbeater +silverbelly +silverberry +silverbill +silverboom +silverbush +silvered +silverer +silvereye +silverfin +silverfish +silverhead +silverily +silveriness +silvering +silverish +silverite +silverize +silverizer +silverleaf +silverless +silverlike +silverling +silverly +silvern +silverness +silverpoint +silverrod +silverside +silversides +silverskin +silversmith +silversmithing +silverspot +silvertail +silvertip +silvertop +silvervine +silverware +silverweed +silverwing +silverwood +silverwork +silverworker +silvery +Silvester +Silvia +silvical +silvicolous +silvics +silvicultural +silviculturally +silviculture +silviculturist +Silvius +Silybum +silyl +Sim +sima +Simaba +simal +simar +Simarouba +Simaroubaceae +simaroubaceous +simball +simbil +simblin +simblot +Simblum +sime +Simeon +Simeonism +Simeonite +Simia +simiad +simial +simian +simianity +simiesque +Simiidae +Simiinae +similar +similarity +similarize +similarly +similative +simile +similimum +similiter +similitive +similitude +similitudinize +simility +similize +similor +simioid +simious +simiousness +simity +simkin +simlin +simling +simmer +simmeringly +simmon +simnel +simnelwise +simoleon +Simon +simoniac +simoniacal +simoniacally +Simonian +Simonianism +simonious +simonism +Simonist +simonist +simony +simool +simoom +simoon +Simosaurus +simous +simp +simpai +simper +simperer +simperingly +simple +simplehearted +simpleheartedly +simpleheartedness +simpleness +simpler +simpleton +simpletonian +simpletonianism +simpletonic +simpletonish +simpletonism +simplex +simplexed +simplexity +simplicident +Simplicidentata +simplicidentate +simplicist +simplicitarian +simplicity +simplicize +simplification +simplificative +simplificator +simplified +simplifiedly +simplifier +simplify +simplism +simplist +simplistic +simply +simsim +simson +simulacra +simulacral +simulacre +simulacrize +simulacrum +simulance +simulant +simular +simulate +simulation +simulative +simulatively +simulator +simulatory +simulcast +simuler +simuliid +Simuliidae +simulioid +Simulium +simultaneity +simultaneous +simultaneously +simultaneousness +sin +sina +Sinae +Sinaean +Sinaic +sinaite +Sinaitic +sinal +sinalbin +Sinaloa +sinamay +sinamine +sinapate +sinapic +sinapine +sinapinic +Sinapis +sinapis +sinapism +sinapize +sinapoline +sinarchism +sinarchist +sinarquism +sinarquist +sinarquista +sinawa +sincaline +since +sincere +sincerely +sincereness +sincerity +sincipital +sinciput +sind +sinder +Sindhi +sindle +sindoc +sindon +sindry +sine +sinecural +sinecure +sinecureship +sinecurism +sinecurist +Sinesian +sinew +sinewed +sinewiness +sinewless +sinewous +sinewy +sinfonia +sinfonie +sinfonietta +sinful +sinfully +sinfulness +sing +singability +singable +singableness +singally +singarip +singe +singed +singeing +singeingly +singer +singey +Singfo +singh +Singhalese +singillatim +singing +singingly +singkamas +single +singlebar +singled +singlehanded +singlehandedly +singlehandedness +singlehearted +singleheartedly +singleheartedness +singlehood +singleness +singler +singles +singlestick +singlesticker +singlet +singleton +singletree +singlings +singly +Singpho +Singsing +singsong +singsongy +Singspiel +singspiel +singstress +singular +singularism +singularist +singularity +singularization +singularize +singularly +singularness +singult +singultous +singultus +sinh +Sinhalese +Sinian +Sinic +Sinicism +Sinicization +Sinicize +Sinico +Sinification +Sinify +sinigrin +sinigrinase +sinigrosid +sinigroside +Sinisian +Sinism +sinister +sinisterly +sinisterness +sinisterwise +sinistrad +sinistral +sinistrality +sinistrally +sinistration +sinistrin +sinistrocerebral +sinistrocular +sinistrodextral +sinistrogyrate +sinistrogyration +sinistrogyric +sinistromanual +sinistrorsal +sinistrorsally +sinistrorse +sinistrous +sinistrously +sinistruous +Sinite +Sinitic +sink +sinkable +sinkage +sinker +sinkerless +sinkfield +sinkhead +sinkhole +sinking +Sinkiuse +sinkless +sinklike +sinkroom +sinkstone +sinky +sinless +sinlessly +sinlessness +sinlike +sinnable +sinnableness +sinnen +sinner +sinneress +sinnership +sinnet +Sinningia +sinningly +sinningness +sinoatrial +sinoauricular +Sinogram +sinoidal +Sinolog +Sinologer +Sinological +Sinologist +Sinologue +Sinology +sinomenine +Sinonism +Sinophile +Sinophilism +sinopia +Sinopic +sinopite +sinople +sinproof +Sinsiga +sinsion +sinsring +sinsyne +sinter +Sinto +sintoc +Sintoism +Sintoist +Sintsink +Sintu +sinuate +sinuated +sinuatedentate +sinuately +sinuation +sinuatocontorted +sinuatodentate +sinuatodentated +sinuatopinnatifid +sinuatoserrated +sinuatoundulate +sinuatrial +sinuauricular +sinuitis +sinuose +sinuosely +sinuosity +sinuous +sinuously +sinuousness +Sinupallia +sinupallial +Sinupallialia +Sinupalliata +sinupalliate +sinus +sinusal +sinusitis +sinuslike +sinusoid +sinusoidal +sinusoidally +sinuventricular +sinward +siol +Sion +sion +Sionite +Siouan +Sioux +sip +sipage +sipe +siper +siphoid +siphon +siphonaceous +siphonage +siphonal +Siphonales +Siphonaptera +siphonapterous +Siphonaria +siphonariid +Siphonariidae +Siphonata +siphonate +Siphoneae +siphoneous +siphonet +siphonia +siphonial +Siphoniata +siphonic +Siphonifera +siphoniferous +siphoniform +siphonium +siphonless +siphonlike +Siphonobranchiata +siphonobranchiate +Siphonocladales +Siphonocladiales +siphonogam +Siphonogama +siphonogamic +siphonogamous +siphonogamy +siphonoglyph +siphonoglyphe +siphonognathid +Siphonognathidae +siphonognathous +Siphonognathus +Siphonophora +siphonophoran +siphonophore +siphonophorous +siphonoplax +siphonopore +siphonorhinal +siphonorhine +siphonosome +siphonostele +siphonostelic +siphonostely +Siphonostoma +Siphonostomata +siphonostomatous +siphonostome +siphonostomous +siphonozooid +siphonula +siphorhinal +siphorhinian +siphosome +siphuncle +siphuncled +siphuncular +Siphunculata +siphunculate +siphunculated +Sipibo +sipid +sipidity +siping +sipling +sipper +sippet +sippingly +sippio +Sipunculacea +sipunculacean +sipunculid +Sipunculida +sipunculoid +Sipunculoidea +Sipunculus +sipylite +Sir +sir +sircar +sirdar +sirdarship +sire +Siredon +sireless +siren +sirene +Sirenia +sirenian +sirenic +sirenical +sirenically +Sirenidae +sirening +sirenize +sirenlike +sirenoid +Sirenoidea +Sirenoidei +sireny +sireship +siress +sirgang +Sirian +sirian +Sirianian +siriasis +siricid +Siricidae +Siricoidea +sirih +siriometer +Sirione +siris +Sirius +sirkeer +sirki +sirky +sirloin +sirloiny +Sirmian +Sirmuellera +siroc +sirocco +siroccoish +siroccoishly +sirpea +sirple +sirpoon +sirrah +sirree +sirship +siruaballi +siruelas +sirup +siruped +siruper +sirupy +Siryan +Sis +sis +sisal +siscowet +sise +sisel +siserara +siserary +siserskite +sish +sisham +sisi +siskin +Sisley +sismotherapy +siss +Sisseton +sissification +sissify +sissiness +sissoo +Sissu +sissy +sissyish +sissyism +sist +Sistani +sister +sisterhood +sisterin +sistering +sisterize +sisterless +sisterlike +sisterliness +sisterly +sistern +Sistine +sistle +sistomensin +sistrum +Sistrurus +Sisymbrium +Sisyphean +Sisyphian +Sisyphides +Sisyphism +Sisyphist +Sisyphus +Sisyrinchium +sisyrinchium +sit +Sita +sitao +sitar +sitatunga +sitch +site +sitfast +sith +sithcund +sithe +sithement +sithence +sithens +sitient +sitio +sitiology +sitiomania +sitiophobia +Sitka +Sitkan +sitology +sitomania +Sitophilus +sitophobia +sitophobic +sitosterin +sitosterol +sitotoxism +Sitta +sittee +sitten +sitter +Sittidae +Sittinae +sittine +sitting +sittringy +situal +situate +situated +situation +situational +situla +situlae +situs +Sium +Siusi +Siuslaw +Siva +siva +Sivaism +Sivaist +Sivaistic +Sivaite +Sivan +Sivapithecus +sivathere +Sivatheriidae +Sivatheriinae +sivatherioid +Sivatherium +siver +sivvens +Siwan +Siwash +siwash +six +sixain +sixer +sixfoil +sixfold +sixhaend +sixhynde +sixpence +sixpenny +sixpennyworth +sixscore +sixsome +sixte +sixteen +sixteener +sixteenfold +sixteenmo +sixteenth +sixteenthly +sixth +sixthet +sixthly +sixtieth +Sixtowns +Sixtus +sixty +sixtyfold +sixtypenny +sizable +sizableness +sizably +sizal +sizar +sizarship +size +sized +sizeman +sizer +sizes +siziness +sizing +sizy +sizygia +sizygium +sizz +sizzard +sizzing +sizzle +sizzling +sizzlingly +sjambok +skaddle +skaff +skaffie +skag +skaillie +skainsmate +skair +skaitbird +skal +skalawag +skaldship +skance +Skanda +skandhas +skart +skasely +Skat +skat +skate +skateable +skater +skatikas +skatiku +skating +skatist +skatole +skatosine +skatoxyl +skaw +skean +skeanockle +skedaddle +skedaddler +skedge +skedgewith +skedlock +skee +skeed +skeeg +skeel +skeeling +skeely +skeen +skeenyie +skeer +skeered +skeery +skeesicks +skeet +skeeter +skeezix +skeg +skegger +skeif +skeigh +skeily +skein +skeiner +skeipp +skel +skelder +skelderdrake +skeldrake +skeletal +skeletin +skeletogenous +skeletogeny +skeletomuscular +skeleton +skeletonian +skeletonic +skeletonization +skeletonize +skeletonizer +skeletonless +skeletonweed +skeletony +skelf +skelgoose +skelic +skell +skellat +skeller +skelloch +skellum +skelly +skelp +skelper +skelpin +skelping +skelter +Skeltonian +Skeltonic +Skeltonical +Skeltonics +skemmel +skemp +sken +skene +skeo +skeough +skep +skepful +skeppist +skeppund +skeptic +skeptical +skeptically +skepticalness +skepticism +skepticize +sker +skere +skerret +skerrick +skerry +sketch +sketchability +sketchable +sketchbook +sketchee +sketcher +sketchily +sketchiness +sketching +sketchingly +sketchist +sketchlike +sketchy +skete +sketiotai +skeuomorph +skeuomorphic +skevish +skew +skewback +skewbacked +skewbald +skewed +skewer +skewerer +skewerwood +skewings +skewl +skewly +skewness +skewwhiff +skewwise +skewy +skey +skeyting +ski +skiagram +skiagraph +skiagrapher +skiagraphic +skiagraphical +skiagraphically +skiagraphy +skiameter +skiametry +skiapod +skiapodous +skiascope +skiascopy +skibby +skibslast +skice +skid +skidded +skidder +skidding +skiddingly +skiddoo +skiddy +Skidi +skidpan +skidproof +skidway +skied +skieppe +skiepper +skier +skies +skiff +skiffless +skiffling +skift +skiing +skijore +skijorer +skijoring +skil +skilder +skildfel +skilfish +skill +skillagalee +skilled +skillenton +skillessness +skillet +skillful +skillfully +skillfulness +skilligalee +skilling +skillion +skilly +skilpot +skilts +skim +skimback +skime +skimmed +skimmer +skimmerton +Skimmia +skimming +skimmingly +skimmington +skimmity +skimp +skimpily +skimpiness +skimpingly +skimpy +skin +skinbound +skinch +skinflint +skinflintily +skinflintiness +skinflinty +skinful +skink +skinker +skinking +skinkle +skinless +skinlike +skinned +skinner +skinnery +skinniness +skinning +skinny +skintight +skinworm +skiogram +skiograph +skiophyte +skip +skipbrain +Skipetar +skipjack +skipjackly +skipkennel +skipman +skippable +skippel +skipper +skippered +skippership +skippery +skippet +skipping +skippingly +skipple +skippund +skippy +skiptail +skirl +skirlcock +skirling +skirmish +skirmisher +skirmishing +skirmishingly +skirp +skirr +skirreh +skirret +skirt +skirtboard +skirted +skirter +skirting +skirtingly +skirtless +skirtlike +skirty +skirwhit +skirwort +skit +skite +skiter +skither +Skitswish +Skittaget +Skittagetan +skitter +skittish +skittishly +skittishness +skittle +skittled +skittler +skittles +skitty +skittyboot +skiv +skive +skiver +skiverwood +skiving +skivvies +sklate +sklater +sklent +skleropelite +sklinter +skoal +Skodaic +skogbolite +Skoinolon +skokiaan +Skokomish +skomerite +skoo +skookum +Skopets +skoptsy +skout +skraeling +skraigh +skrike +skrimshander +skrupul +skua +skulduggery +skulk +skulker +skulking +skulkingly +skull +skullbanker +skullcap +skulled +skullery +skullfish +skullful +skully +skulp +skun +skunk +skunkbill +skunkbush +skunkdom +skunkery +skunkhead +skunkish +skunklet +skunktop +skunkweed +skunky +Skupshtina +skuse +skutterudite +sky +skybal +skycraft +Skye +skyey +skyful +skyish +skylark +skylarker +skyless +skylight +skylike +skylook +skyman +skyphoi +skyphos +skyplast +skyre +skyrgaliard +skyrocket +skyrockety +skysail +skyscape +skyscraper +skyscraping +skyshine +skyugle +skyward +skywards +skyway +skywrite +skywriter +skywriting +sla +slab +slabbed +slabber +slabberer +slabbery +slabbiness +slabbing +slabby +slabman +slabness +slabstone +slack +slackage +slacked +slacken +slackener +slacker +slackerism +slacking +slackingly +slackly +slackness +slad +sladang +slade +slae +slag +slaggability +slaggable +slagger +slagging +slaggy +slagless +slaglessness +slagman +slain +slainte +slaister +slaistery +slait +slake +slakeable +slakeless +slaker +slaking +slaky +slam +slammakin +slammerkin +slammock +slammocking +slammocky +slamp +slampamp +slampant +slander +slanderer +slanderful +slanderfully +slandering +slanderingly +slanderous +slanderously +slanderousness +slanderproof +slane +slang +slangily +slanginess +slangish +slangishly +slangism +slangkop +slangous +slangster +slanguage +slangular +slangy +slank +slant +slantindicular +slantindicularly +slanting +slantingly +slantingways +slantly +slantways +slantwise +slap +slapdash +slapdashery +slape +slaphappy +slapjack +slapper +slapping +slapstick +slapsticky +slare +slart +slarth +slash +slashed +slasher +slashing +slashingly +slashy +slat +slatch +slate +slateful +slatelike +slatemaker +slatemaking +slater +slateworks +slateyard +slath +slather +slatify +slatiness +slating +slatish +slatted +slatter +slattern +slatternish +slatternliness +slatternly +slatternness +slattery +slatting +slaty +slaughter +slaughterer +slaughterhouse +slaughteringly +slaughterman +slaughterous +slaughterously +slaughteryard +slaum +Slav +Slavdom +Slave +slave +slaveborn +slaved +slaveholder +slaveholding +slaveland +slaveless +slavelet +slavelike +slaveling +slavemonger +slaveowner +slaveownership +slavepen +slaver +slaverer +slavering +slaveringly +slavery +Slavey +slavey +Slavi +Slavian +Slavic +Slavicism +Slavicize +Slavification +Slavify +slavikite +slaving +Slavish +slavish +slavishly +slavishness +Slavism +Slavist +Slavistic +Slavization +Slavize +slavocracy +slavocrat +slavocratic +Slavonian +Slavonianize +Slavonic +Slavonically +Slavonicize +Slavonish +Slavonism +Slavonization +Slavonize +Slavophile +Slavophilism +Slavophobe +Slavophobist +slaw +slay +slayable +slayer +slaying +sleathy +sleave +sleaved +sleaziness +sleazy +Sleb +sleck +sled +sledded +sledder +sledding +sledful +sledge +sledgeless +sledgemeter +sledger +sledging +sledlike +slee +sleech +sleechy +sleek +sleeken +sleeker +sleeking +sleekit +sleekly +sleekness +sleeky +sleep +sleeper +sleepered +sleepful +sleepfulness +sleepify +sleepily +sleepiness +sleeping +sleepingly +sleepland +sleepless +sleeplessly +sleeplessness +sleeplike +sleepmarken +sleepproof +sleepry +sleepwaker +sleepwaking +sleepwalk +sleepwalker +sleepwalking +sleepward +sleepwort +sleepy +sleepyhead +sleer +sleet +sleetiness +sleeting +sleetproof +sleety +sleeve +sleeveband +sleeveboard +sleeved +sleeveen +sleevefish +sleeveful +sleeveless +sleevelessness +sleevelet +sleevelike +sleever +sleigh +sleigher +sleighing +sleight +sleightful +sleighty +slendang +slender +slenderish +slenderize +slenderly +slenderness +slent +slepez +slept +slete +sleuth +sleuthdog +sleuthful +sleuthhound +sleuthlike +slew +slewed +slewer +slewing +sley +sleyer +slice +sliceable +sliced +slicer +slich +slicht +slicing +slicingly +slick +slicken +slickens +slickenside +slicker +slickered +slickery +slicking +slickly +slickness +slid +slidable +slidableness +slidably +slidage +slidden +slidder +sliddery +slide +slideable +slideableness +slideably +slided +slidehead +slideman +slideproof +slider +slideway +sliding +slidingly +slidingness +slidometer +slifter +slight +slighted +slighter +slightily +slightiness +slighting +slightingly +slightish +slightly +slightness +slighty +slim +slime +slimeman +slimer +slimily +sliminess +slimish +slimishness +slimly +slimmish +slimness +slimpsy +slimsy +slimy +sline +sling +slingball +slinge +slinger +slinging +slingshot +slingsman +slingstone +slink +slinker +slinkily +slinkiness +slinking +slinkingly +slinkskin +slinkweed +slinky +slip +slipback +slipband +slipboard +slipbody +slipcase +slipcoach +slipcoat +slipe +slipgibbet +sliphorn +sliphouse +slipknot +slipless +slipman +slipover +slippage +slipped +slipper +slippered +slipperflower +slipperily +slipperiness +slipperlike +slipperweed +slipperwort +slippery +slipperyback +slipperyroot +slippiness +slipping +slippingly +slipproof +slippy +slipshod +slipshoddiness +slipshoddy +slipshodness +slipshoe +slipslap +slipslop +slipsloppish +slipsloppism +slipsole +slipstep +slipstring +sliptopped +slipway +slirt +slish +slit +slitch +slite +slither +slithering +slitheroo +slithers +slithery +slithy +slitless +slitlike +slitshell +slitted +slitter +slitting +slitty +slitwise +slive +sliver +sliverer +sliverlike +sliverproof +slivery +sliving +slivovitz +sloan +Sloanea +slob +slobber +slobberchops +slobberer +slobbers +slobbery +slobby +slock +slocken +slod +slodder +slodge +slodger +sloe +sloeberry +sloebush +sloetree +slog +slogan +sloganeer +sloganize +slogger +slogging +slogwood +sloka +sloke +slommock +slon +slone +slonk +sloo +sloom +sloomy +sloop +sloopman +sloosh +slop +slopdash +slope +sloped +slopely +slopeness +sloper +slopeways +slopewise +sloping +slopingly +slopingness +slopmaker +slopmaking +sloppage +slopped +sloppery +sloppily +sloppiness +slopping +sloppy +slops +slopseller +slopselling +slopshop +slopstone +slopwork +slopworker +slopy +slorp +slosh +slosher +sloshily +sloshiness +sloshy +slot +slote +sloted +sloth +slothful +slothfully +slothfulness +slothound +slotted +slotter +slottery +slotting +slotwise +slouch +sloucher +slouchily +slouchiness +slouching +slouchingly +slouchy +slough +sloughiness +sloughy +slour +sloush +Slovak +Slovakian +Slovakish +sloven +Slovene +Slovenian +Slovenish +slovenlike +slovenliness +slovenly +slovenwood +Slovintzi +slow +slowbellied +slowbelly +slowdown +slowgoing +slowheaded +slowhearted +slowheartedness +slowhound +slowish +slowly +slowmouthed +slowpoke +slowrie +slows +slowworm +sloyd +slub +slubber +slubberdegullion +slubberer +slubbering +slubberingly +slubberly +slubbery +slubbing +slubby +slud +sludder +sluddery +sludge +sludged +sludger +sludgy +slue +sluer +slug +slugabed +sluggard +sluggarding +sluggardize +sluggardliness +sluggardly +sluggardness +sluggardry +slugged +slugger +slugging +sluggingly +sluggish +sluggishly +sluggishness +sluggy +sluglike +slugwood +sluice +sluicelike +sluicer +sluiceway +sluicing +sluicy +sluig +sluit +slum +slumber +slumberer +slumberful +slumbering +slumberingly +slumberland +slumberless +slumberous +slumberously +slumberousness +slumberproof +slumbersome +slumbery +slumbrous +slumdom +slumgullion +slumgum +slumland +slummage +slummer +slumminess +slumming +slummock +slummocky +slummy +slump +slumpproof +slumproof +slumpwork +slumpy +slumward +slumwise +slung +slungbody +slunge +slunk +slunken +slur +slurbow +slurp +slurry +slush +slusher +slushily +slushiness +slushy +slut +slutch +slutchy +sluther +sluthood +slutter +sluttery +sluttikin +sluttish +sluttishly +sluttishness +slutty +sly +slyboots +slyish +slyly +slyness +slype +sma +smachrie +smack +smackee +smacker +smackful +smacking +smackingly +smacksman +smaik +Smalcaldian +Smalcaldic +small +smallage +smallclothes +smallcoal +smallen +smaller +smallhearted +smallholder +smalling +smallish +smallmouth +smallmouthed +smallness +smallpox +smalls +smallsword +smalltime +smallware +smally +smalm +smalt +smalter +smaltine +smaltite +smalts +smaragd +smaragdine +smaragdite +smaragdus +smarm +smarmy +smart +smarten +smarting +smartingly +smartish +smartism +smartless +smartly +smartness +smartweed +smarty +smash +smashable +smashage +smashboard +smasher +smashery +smashing +smashingly +smashment +smashup +smatter +smatterer +smattering +smatteringly +smattery +smaze +smear +smearcase +smeared +smearer +smeariness +smearless +smeary +smectic +smectis +smectite +Smectymnuan +Smectymnuus +smeddum +smee +smeech +smeek +smeeky +smeer +smeeth +smegma +smell +smellable +smellage +smelled +smeller +smellful +smellfungi +smellfungus +smelliness +smelling +smellproof +smellsome +smelly +smelt +smelter +smelterman +smeltery +smeltman +smeth +smethe +smeuse +smew +smich +smicker +smicket +smiddie +smiddum +smidge +smidgen +smifligate +smifligation +smiggins +Smilacaceae +smilacaceous +Smilaceae +smilaceous +smilacin +Smilacina +Smilax +smilax +smile +smileable +smileage +smileful +smilefulness +smileless +smilelessly +smilelessness +smilemaker +smilemaking +smileproof +smiler +smilet +smiling +smilingly +smilingness +Smilodon +smily +Smintheus +Sminthian +sminthurid +Sminthuridae +Sminthurus +smirch +smircher +smirchless +smirchy +smiris +smirk +smirker +smirking +smirkingly +smirkish +smirkle +smirkly +smirky +smirtle +smit +smitch +smite +smiter +smith +smitham +smithcraft +smither +smithereens +smithery +Smithian +Smithianism +smithing +smithite +Smithsonian +smithsonite +smithwork +smithy +smithydander +smiting +smitten +smitting +smock +smocker +smockface +smocking +smockless +smocklike +smog +smokables +smoke +smokeable +smokebox +smokebush +smoked +smokefarthings +smokehouse +smokejack +smokeless +smokelessly +smokelessness +smokelike +smokeproof +smoker +smokery +smokestack +smokestone +smoketight +smokewood +smokily +smokiness +smoking +smokish +smoky +smokyseeming +smolder +smolderingness +smolt +smooch +smoochy +smoodge +smoodger +smook +smoorich +Smoos +smoot +smooth +smoothable +smoothback +smoothbore +smoothbored +smoothcoat +smoothen +smoother +smoothification +smoothify +smoothing +smoothingly +smoothish +smoothly +smoothmouthed +smoothness +smoothpate +smopple +smore +smorgasbord +smote +smother +smotherable +smotheration +smothered +smotherer +smotheriness +smothering +smotheringly +smothery +smotter +smouch +smoucher +smous +smouse +smouser +smout +smriti +smudge +smudged +smudgedly +smudgeless +smudgeproof +smudger +smudgily +smudginess +smudgy +smug +smuggery +smuggish +smuggishly +smuggishness +smuggle +smuggleable +smuggler +smugglery +smuggling +smugism +smugly +smugness +smuisty +smur +smurr +smurry +smuse +smush +smut +smutch +smutchin +smutchless +smutchy +smutproof +smutted +smutter +smuttily +smuttiness +smutty +Smyrna +Smyrnaite +Smyrnean +Smyrniot +Smyrniote +smyth +smytrie +snab +snabbie +snabble +snack +snackle +snackman +snaff +snaffle +snaffles +snafu +snag +snagbush +snagged +snagger +snaggled +snaggletooth +snaggy +snagrel +snail +snaileater +snailery +snailfish +snailflower +snailish +snailishly +snaillike +snails +snaily +snaith +snake +snakebark +snakeberry +snakebird +snakebite +snakefish +snakeflower +snakehead +snakeholing +snakeleaf +snakeless +snakelet +snakelike +snakeling +snakemouth +snakeneck +snakeology +snakephobia +snakepiece +snakepipe +snakeproof +snaker +snakeroot +snakery +snakeship +snakeskin +snakestone +snakeweed +snakewise +snakewood +snakeworm +snakewort +snakily +snakiness +snaking +snakish +snaky +snap +snapback +snapbag +snapberry +snapdragon +snape +snaper +snaphead +snapholder +snapjack +snapless +snappable +snapped +snapper +snappily +snappiness +snapping +snappingly +snappish +snappishly +snappishness +snapps +snappy +snaps +snapsack +snapshot +snapshotter +snapweed +snapwood +snapwort +snapy +snare +snareless +snarer +snaringly +snark +snarl +snarler +snarleyyow +snarlingly +snarlish +snarly +snary +snaste +snatch +snatchable +snatched +snatcher +snatchily +snatching +snatchingly +snatchproof +snatchy +snath +snathe +snavel +snavvle +snaw +snead +sneak +sneaker +sneakiness +sneaking +sneakingly +sneakingness +sneakish +sneakishly +sneakishness +sneaksby +sneaksman +sneaky +sneap +sneath +sneathe +sneb +sneck +sneckdraw +sneckdrawing +sneckdrawn +snecker +snecket +sned +snee +sneer +sneerer +sneerful +sneerfulness +sneering +sneeringly +sneerless +sneery +sneesh +sneeshing +sneest +sneesty +sneeze +sneezeless +sneezeproof +sneezer +sneezeweed +sneezewood +sneezewort +sneezing +sneezy +snell +snelly +Snemovna +snerp +snew +snib +snibble +snibbled +snibbler +snibel +snicher +snick +snickdraw +snickdrawing +snicker +snickering +snickeringly +snickersnee +snicket +snickey +snickle +sniddle +snide +snideness +sniff +sniffer +sniffily +sniffiness +sniffing +sniffingly +sniffish +sniffishness +sniffle +sniffler +sniffly +sniffy +snift +snifter +snifty +snig +snigger +sniggerer +sniggering +sniggle +sniggler +sniggoringly +snip +snipe +snipebill +snipefish +snipelike +sniper +sniperscope +sniping +snipish +snipjack +snipnose +snipocracy +snipper +snippersnapper +snipperty +snippet +snippetiness +snippety +snippiness +snipping +snippish +snippy +snipsnapsnorum +sniptious +snipy +snirl +snirt +snirtle +snitch +snitcher +snite +snithe +snithy +snittle +snivel +sniveled +sniveler +sniveling +snively +snivy +snob +snobber +snobbery +snobbess +snobbing +snobbish +snobbishly +snobbishness +snobbism +snobby +snobdom +snobling +snobocracy +snobocrat +snobographer +snobography +snobologist +snobonomer +snobscat +snocher +snock +snocker +snod +snodly +snoek +snoeking +snog +snoga +Snohomish +snoke +Snonowas +snood +snooded +snooding +snook +snooker +snookered +snoop +snooper +snooperscope +snoopy +snoose +snoot +snootily +snootiness +snooty +snoove +snooze +snoozer +snooziness +snoozle +snoozy +snop +Snoqualmie +Snoquamish +snore +snoreless +snorer +snoring +snoringly +snork +snorkel +snorker +snort +snorter +snorting +snortingly +snortle +snorty +snot +snotter +snottily +snottiness +snotty +snouch +snout +snouted +snouter +snoutish +snoutless +snoutlike +snouty +Snow +snow +Snowball +snowball +snowbank +snowbell +snowberg +snowberry +snowbird +snowblink +snowbound +snowbreak +snowbush +snowcap +snowcraft +Snowdonian +snowdrift +snowdrop +snowfall +snowflake +snowflight +snowflower +snowfowl +snowhammer +snowhouse +snowie +snowily +snowiness +snowish +snowk +snowl +snowland +snowless +snowlike +snowmanship +snowmobile +snowplow +snowproof +snowscape +snowshade +snowshed +snowshine +snowshoe +snowshoed +snowshoeing +snowshoer +snowslide +snowslip +snowstorm +snowsuit +snowworm +snowy +snozzle +snub +snubbable +snubbed +snubbee +snubber +snubbiness +snubbing +snubbingly +snubbish +snubbishly +snubbishness +snubby +snubproof +snuck +snudge +snuff +snuffbox +snuffboxer +snuffcolored +snuffer +snuffers +snuffiness +snuffing +snuffingly +snuffish +snuffle +snuffler +snuffles +snuffless +snuffliness +snuffling +snufflingly +snuffly +snuffman +snuffy +snug +snugger +snuggery +snuggish +snuggle +snugify +snugly +snugness +snum +snup +snupper +snur +snurl +snurly +snurp +snurt +snuzzle +sny +snying +so +soak +soakage +soakaway +soaked +soaken +soaker +soaking +soakingly +soakman +soaky +soally +soam +soap +soapbark +soapberry +soapbox +soapboxer +soapbubbly +soapbush +soaper +soapery +soapfish +soapily +soapiness +soaplees +soapless +soaplike +soapmaker +soapmaking +soapmonger +soaprock +soaproot +soapstone +soapsud +soapsuddy +soapsuds +soapsudsy +soapweed +soapwood +soapwort +soapy +soar +soarability +soarable +soarer +soaring +soaringly +soary +sob +sobber +sobbing +sobbingly +sobby +sobeit +sober +soberer +sobering +soberingly +soberize +soberlike +soberly +soberness +sobersault +sobersided +sobersides +soberwise +sobful +soboles +soboliferous +sobproof +Sobralia +sobralite +Sobranje +sobrevest +sobriety +sobriquet +sobriquetical +soc +socage +socager +soccer +soccerist +soccerite +soce +socht +sociability +sociable +sociableness +sociably +social +Sociales +socialism +socialist +socialistic +socialite +sociality +socializable +socialization +socialize +socializer +socially +socialness +sociation +sociative +societal +societally +societarian +societarianism +societary +societified +societism +societist +societologist +societology +society +societyish +societyless +socii +Socinian +Socinianism +Socinianistic +Socinianize +sociobiological +sociocentric +sociocracy +sociocrat +sociocratic +sociocultural +sociodrama +sociodramatic +socioeconomic +socioeducational +sociogenesis +sociogenetic +sociogeny +sociography +sociolatry +sociolegal +sociologian +sociologic +sociological +sociologically +sociologism +sociologist +sociologistic +sociologize +sociologizer +sociologizing +sociology +sociomedical +sociometric +sociometry +socionomic +socionomics +socionomy +sociophagous +sociopolitical +socioreligious +socioromantic +sociostatic +sociotechnical +socius +sock +sockdolager +socker +socket +socketful +socketless +sockeye +sockless +socklessness +sockmaker +sockmaking +socky +socle +socman +socmanry +soco +Socotran +Socotri +Socotrine +Socratean +Socratic +Socratical +Socratically +Socraticism +Socratism +Socratist +Socratize +sod +soda +sodaclase +sodaic +sodaless +sodalist +sodalite +sodalithite +sodality +sodamide +sodbuster +sodded +sodden +soddenly +soddenness +sodding +soddite +soddy +sodic +sodio +sodioaluminic +sodioaurous +sodiocitrate +sodiohydric +sodioplatinic +sodiosalicylate +sodiotartrate +sodium +sodless +sodoku +Sodom +sodomic +Sodomist +Sodomite +sodomitess +sodomitic +sodomitical +sodomitically +Sodomitish +sodomy +sodwork +sody +soe +soekoe +soever +sofa +sofane +sofar +soffit +Sofronia +soft +softa +softball +softbrained +soften +softener +softening +softhead +softheaded +softhearted +softheartedly +softheartedness +softhorn +softish +softling +softly +softner +softness +softship +softtack +softwood +softy +sog +Soga +Sogdian +Sogdianese +Sogdianian +Sogdoite +soger +soget +soggarth +soggendalite +soggily +sogginess +sogging +soggy +soh +soho +Soiesette +soiesette +soil +soilage +soiled +soiling +soilless +soilproof +soilure +soily +soiree +soixantine +Soja +soja +sojourn +sojourner +sojourney +sojournment +sok +soka +soke +sokeman +sokemanemot +sokemanry +soken +Sokoki +Sokotri +Sokulk +Sol +sol +sola +solace +solaceful +solacement +solaceproof +solacer +solacious +solaciously +solaciousness +solan +Solanaceae +solanaceous +solanal +Solanales +solander +solaneine +solaneous +solanidine +solanine +Solanum +solanum +solar +solarism +solarist +solaristic +solaristically +solaristics +Solarium +solarium +solarization +solarize +solarometer +solate +solatia +solation +solatium +solay +sold +soldado +Soldan +soldan +soldanel +Soldanella +soldanelle +soldanrie +solder +solderer +soldering +solderless +soldi +soldier +soldierbird +soldierbush +soldierdom +soldieress +soldierfish +soldierhearted +soldierhood +soldiering +soldierize +soldierlike +soldierliness +soldierly +soldierproof +soldiership +soldierwise +soldierwood +soldiery +soldo +sole +Solea +solea +soleas +solecism +solecist +solecistic +solecistical +solecistically +solecize +solecizer +Soleidae +soleiform +soleil +soleless +solely +solemn +solemncholy +solemnify +solemnitude +solemnity +solemnization +solemnize +solemnizer +solemnly +solemnness +Solen +solen +solenacean +solenaceous +soleness +solenette +solenial +Solenidae +solenite +solenitis +solenium +solenoconch +Solenoconcha +solenocyte +Solenodon +solenodont +Solenodontidae +solenogaster +Solenogastres +solenoglyph +Solenoglypha +solenoglyphic +solenoid +solenoidal +solenoidally +Solenopsis +solenostele +solenostelic +solenostomid +Solenostomidae +solenostomoid +solenostomous +Solenostomus +solent +solentine +solepiece +soleplate +soleprint +soler +Solera +soles +soleus +soleyn +solfataric +solfeggio +solferino +soli +soliative +solicit +solicitant +solicitation +solicitationism +solicited +solicitee +soliciter +soliciting +solicitor +solicitorship +solicitous +solicitously +solicitousness +solicitress +solicitrix +solicitude +solicitudinous +solid +Solidago +solidago +solidaric +solidarily +solidarism +solidarist +solidaristic +solidarity +solidarize +solidary +solidate +solidi +solidifiability +solidifiable +solidifiableness +solidification +solidifier +solidiform +solidify +solidish +solidism +solidist +solidistic +solidity +solidly +solidness +solidum +Solidungula +solidungular +solidungulate +solidus +solifidian +solifidianism +solifluction +solifluctional +soliform +Solifugae +solifuge +solifugean +solifugid +solifugous +soliloquacious +soliloquist +soliloquium +soliloquize +soliloquizer +soliloquizing +soliloquizingly +soliloquy +solilunar +Solio +solio +soliped +solipedal +solipedous +solipsism +solipsismal +solipsist +solipsistic +solist +solitaire +solitarian +solitarily +solitariness +solitary +soliterraneous +solitidal +solitude +solitudinarian +solitudinize +solitudinous +solivagant +solivagous +sollar +solleret +Sollya +solmizate +solmization +solo +solod +solodi +solodization +solodize +soloecophanes +soloist +Solomon +Solomonian +Solomonic +Solomonical +Solomonitic +Solon +solon +solonchak +solonetz +solonetzic +solonetzicity +Solonian +Solonic +solonist +soloth +solotink +solotnik +solpugid +Solpugida +Solpugidea +Solpugides +solstice +solsticion +solstitia +solstitial +solstitially +solstitium +solubility +solubilization +solubilize +soluble +solubleness +solubly +solum +solute +solution +solutional +solutioner +solutionist +solutize +solutizer +Solutrean +solvability +solvable +solvableness +solvate +solvation +solve +solvement +solvency +solvend +solvent +solvently +solventproof +solver +solvolysis +solvolytic +solvolyze +solvsbergite +Solyma +Solymaean +soma +somacule +Somal +somal +Somali +somaplasm +Somaschian +somasthenia +somata +somatasthenia +Somateria +somatic +somatical +somatically +somaticosplanchnic +somaticovisceral +somatics +somatism +somatist +somatization +somatochrome +somatocyst +somatocystic +somatoderm +somatogenetic +somatogenic +somatognosis +somatognostic +somatologic +somatological +somatologically +somatologist +somatology +somatome +somatomic +somatophyte +somatophytic +somatoplasm +somatopleural +somatopleure +somatopleuric +somatopsychic +somatosplanchnic +somatotonia +somatotonic +somatotropic +somatotropically +somatotropism +somatotype +somatotyper +somatotypy +somatous +somber +somberish +somberly +somberness +sombre +sombrerite +sombrero +sombreroed +sombrous +sombrously +sombrousness +some +somebody +someday +somedeal +somegate +somehow +someone +somepart +someplace +somers +somersault +somerset +Somersetian +somervillite +somesthesia +somesthesis +somesthetic +something +somethingness +sometime +sometimes +someway +someways +somewhat +somewhatly +somewhatness +somewhen +somewhence +somewhere +somewheres +somewhile +somewhiles +somewhither +somewhy +somewise +somital +somite +somitic +somma +sommaite +sommelier +somnambulance +somnambulancy +somnambulant +somnambular +somnambulary +somnambulate +somnambulation +somnambulator +somnambule +somnambulency +somnambulic +somnambulically +somnambulism +somnambulist +somnambulistic +somnambulize +somnambulous +somnial +somniative +somnifacient +somniferous +somniferously +somnific +somnifuge +somnify +somniloquacious +somniloquence +somniloquent +somniloquism +somniloquist +somniloquize +somniloquous +somniloquy +Somniosus +somnipathist +somnipathy +somnivolency +somnivolent +somnolence +somnolency +somnolent +somnolently +somnolescence +somnolescent +somnolism +somnolize +somnopathy +somnorific +somnus +sompay +sompne +sompner +son +sonable +sonance +sonancy +sonant +sonantal +sonantic +sonantina +sonantized +sonar +sonata +sonatina +sonation +Sonchus +sond +sondation +sondeli +Sonderbund +sonderclass +Sondergotter +Sondylomorum +soneri +song +songbird +songbook +songcraft +songfest +songful +songfully +songfulness +Songhai +Songish +songish +songland +songle +songless +songlessly +songlessness +songlet +songlike +songman +Songo +Songoi +songster +songstress +songworthy +songwright +songy +sonhood +sonic +soniferous +sonification +soniou +sonk +sonless +sonlike +sonlikeness +sonly +Sonneratia +Sonneratiaceae +sonneratiaceous +sonnet +sonnetary +sonneteer +sonneteeress +sonnetic +sonneting +sonnetish +sonnetist +sonnetize +sonnetlike +sonnetwise +sonnikins +sonny +sonobuoy +sonometer +Sonoran +sonorant +sonorescence +sonorescent +sonoric +sonoriferous +sonoriferously +sonorific +sonority +sonorophone +sonorosity +sonorous +sonorously +sonorousness +Sonrai +sons +sonship +sonsy +sontag +soodle +soodly +sook +Sooke +sooky +sool +sooloos +soon +sooner +soonish +soonly +Soorah +soorawn +soord +soorkee +Soot +soot +sooter +sooterkin +sooth +soothe +soother +sootherer +soothful +soothing +soothingly +soothingness +soothless +soothsay +soothsayer +soothsayership +soothsaying +sootily +sootiness +sootless +sootlike +sootproof +sooty +sootylike +sop +sope +soph +Sopheric +Sopherim +Sophia +sophia +Sophian +sophic +sophical +sophically +sophiologic +sophiology +sophism +Sophist +sophister +sophistic +sophistical +sophistically +sophisticalness +sophisticant +sophisticate +sophisticated +sophistication +sophisticative +sophisticator +sophisticism +Sophistress +sophistress +sophistry +Sophoclean +sophomore +sophomoric +sophomorical +sophomorically +Sophora +sophoria +Sophronia +sophronize +Sophy +sophy +sopite +sopition +sopor +soporiferous +soporiferously +soporiferousness +soporific +soporifical +soporifically +soporose +sopper +soppiness +sopping +soppy +soprani +sopranino +sopranist +soprano +sora +Sorabian +sorage +soral +Sorb +sorb +Sorbaria +sorbate +sorbefacient +sorbent +Sorbian +sorbic +sorbile +sorbin +sorbinose +Sorbish +sorbite +sorbitic +sorbitize +sorbitol +Sorbonic +Sorbonical +Sorbonist +Sorbonne +sorbose +sorboside +Sorbus +sorbus +sorcer +sorcerer +sorceress +sorcering +sorcerous +sorcerously +sorcery +sorchin +sorda +Sordaria +Sordariaceae +sordawalite +sordellina +Sordello +sordes +sordid +sordidity +sordidly +sordidness +sordine +sordino +sordor +sore +soredia +soredial +sorediate +sorediferous +sorediform +soredioid +soredium +soree +sorefalcon +sorefoot +sorehawk +sorehead +soreheaded +soreheadedly +soreheadedness +sorehearted +sorehon +sorely +sorema +soreness +Sorex +sorgho +Sorghum +sorghum +sorgo +sori +soricid +Soricidae +soricident +Soricinae +soricine +soricoid +Soricoidea +soriferous +sorite +sorites +soritical +sorn +sornare +sornari +sorner +sorning +soroban +Soroptimist +sororal +sororate +sororial +sororially +sororicidal +sororicide +sorority +sororize +sorose +sorosis +sorosphere +Sorosporella +Sorosporium +sorption +sorra +sorrel +sorrento +sorrily +sorriness +sorroa +sorrow +sorrower +sorrowful +sorrowfully +sorrowfulness +sorrowing +sorrowingly +sorrowless +sorrowproof +sorrowy +sorry +sorryhearted +sorryish +sort +sortable +sortably +sortal +sortation +sorted +sorter +sortie +sortilege +sortileger +sortilegic +sortilegious +sortilegus +sortilegy +sortiment +sortition +sortly +sorty +sorus +sorva +sory +sosh +soshed +Sosia +soso +sosoish +Sospita +soss +sossle +sostenuto +sot +Sotadean +Sotadic +Soter +Soteres +soterial +soteriologic +soteriological +soteriology +Sothiac +Sothiacal +Sothic +Sothis +Sotho +sotie +Sotik +sotnia +sotnik +sotol +sots +sottage +sotted +sotter +sottish +sottishly +sottishness +sou +souari +soubise +soubrette +soubrettish +soucar +souchet +Souchong +souchong +souchy +soud +soudagur +souffle +souffleed +sough +sougher +soughing +sought +Souhegan +soul +soulack +soulcake +souled +Souletin +soulful +soulfully +soulfulness +soulical +soulish +soulless +soullessly +soullessness +soullike +Soulmass +soulsaving +soulward +souly +soum +soumansite +soumarque +sound +soundable +soundage +soundboard +sounder +soundful +soundheaded +soundheadedness +soundhearted +soundheartednes +sounding +soundingly +soundingness +soundless +soundlessly +soundlessness +soundly +soundness +soundproof +soundproofing +soup +soupbone +soupcon +souper +souple +soupless +souplike +soupspoon +soupy +sour +sourbelly +sourberry +sourbread +sourbush +sourcake +source +sourceful +sourcefulness +sourceless +sourcrout +sourdeline +sourdine +soured +souredness +souren +sourer +sourhearted +souring +sourish +sourishly +sourishness +sourjack +sourling +sourly +sourness +sourock +soursop +sourtop +sourweed +sourwood +soury +sousaphone +sousaphonist +souse +souser +souslik +soutane +souter +souterrain +South +south +southard +southbound +Southcottian +Southdown +southeast +southeaster +southeasterly +southeastern +southeasternmost +southeastward +southeastwardly +southeastwards +souther +southerland +southerliness +southerly +southermost +southern +Southerner +southerner +southernism +southernize +southernliness +southernly +southernmost +southernness +southernwood +southing +southland +southlander +southmost +southness +southpaw +Southron +southron +Southronie +Southumbrian +southward +southwardly +southwards +southwest +southwester +southwesterly +southwestern +Southwesterner +southwesternmost +southwestward +southwestwardly +souvenir +souverain +souwester +sov +sovereign +sovereigness +sovereignly +sovereignness +sovereignship +sovereignty +soviet +sovietdom +sovietic +sovietism +sovietist +sovietization +sovietize +sovite +sovkhose +sovkhoz +sovran +sovranty +sow +sowable +sowan +sowans +sowar +sowarry +sowback +sowbacked +sowbane +sowbelly +sowbread +sowdones +sowel +sowens +sower +sowfoot +sowing +sowins +sowl +sowle +sowlike +sowlth +sown +sowse +sowt +sowte +Soxhlet +soy +soya +soybean +Soyot +sozin +sozolic +sozzle +sozzly +spa +space +spaceband +spaced +spaceful +spaceless +spacer +spacesaving +spaceship +spaciness +spacing +spaciosity +spaciotemporal +spacious +spaciously +spaciousness +spack +spacy +spad +spade +spadebone +spaded +spadefish +spadefoot +spadeful +spadelike +spademan +spader +spadesman +spadewise +spadework +spadger +spadiceous +spadices +spadicifloral +spadiciflorous +spadiciform +spadicose +spadilla +spadille +spading +spadix +spadone +spadonic +spadonism +spadrone +spadroon +spae +spaebook +spaecraft +spaedom +spaeman +spaer +spaewife +spaewoman +spaework +spaewright +spaghetti +Spagnuoli +spagyric +spagyrical +spagyrically +spagyrist +spahi +spaid +spaik +spairge +spak +Spalacidae +spalacine +Spalax +spald +spalder +spalding +spale +spall +spallation +spaller +spalling +spalpeen +spalt +span +spancel +spandle +spandrel +spandy +spane +spanemia +spanemy +spang +spanghew +spangle +spangled +spangler +spanglet +spangly +spangolite +Spaniard +Spaniardization +Spaniardize +Spaniardo +spaniel +spaniellike +spanielship +spaning +Spaniol +Spaniolate +Spanioli +Spaniolize +spanipelagic +Spanish +Spanishize +Spanishly +spank +spanker +spankily +spanking +spankingly +spanky +spanless +spann +spannel +spanner +spannerman +spanopnoea +spanpiece +spantoon +spanule +spanworm +Spar +spar +sparable +sparada +sparadrap +sparagrass +sparagus +Sparassis +sparassodont +Sparassodonta +Sparaxis +sparaxis +sparch +spare +spareable +spareless +sparely +spareness +sparer +sparerib +sparesome +Sparganiaceae +Sparganium +sparganium +sparganosis +sparganum +sparge +sparger +spargosis +sparhawk +sparid +Sparidae +sparing +sparingly +sparingness +spark +sparkback +sparked +sparker +sparkiness +sparking +sparkish +sparkishly +sparkishness +sparkle +sparkleberry +sparkler +sparkless +sparklessly +sparklet +sparklike +sparkliness +sparkling +sparklingly +sparklingness +sparkly +sparkproof +sparks +sparky +sparlike +sparling +sparm +Sparmannia +Sparnacian +sparoid +sparpiece +sparred +sparrer +sparring +sparringly +sparrow +sparrowbill +sparrowcide +sparrowdom +sparrowgrass +sparrowish +sparrowless +sparrowlike +sparrowtail +sparrowtongue +sparrowwort +sparrowy +sparry +sparse +sparsedly +sparsely +sparsile +sparsioplast +sparsity +spart +Spartacan +Spartacide +Spartacism +Spartacist +spartacist +Spartan +Spartanhood +Spartanic +Spartanically +Spartanism +Spartanize +Spartanlike +Spartanly +sparteine +sparterie +sparth +Spartiate +Spartina +Spartium +spartle +Sparus +sparver +spary +spasm +spasmatic +spasmatical +spasmatomancy +spasmed +spasmic +spasmodic +spasmodical +spasmodically +spasmodicalness +spasmodism +spasmodist +spasmolytic +spasmophilia +spasmophilic +spasmotin +spasmotoxin +spasmous +spastic +spastically +spasticity +spat +spatalamancy +Spatangida +Spatangina +spatangoid +Spatangoida +Spatangoidea +spatangoidean +Spatangus +spatchcock +spate +spatha +spathaceous +spathal +spathe +spathed +spatheful +spathic +Spathiflorae +spathilae +spathilla +spathose +spathous +spathulate +Spathyema +spatial +spatiality +spatialization +spatialize +spatially +spatiate +spatiation +spatilomancy +spatiotemporal +spatling +spatted +spatter +spatterdashed +spatterdasher +spatterdock +spattering +spatteringly +spatterproof +spatterwork +spatting +spattle +spattlehoe +Spatula +spatula +spatulamancy +spatular +spatulate +spatulation +spatule +spatuliform +spatulose +spave +spaver +spavie +spavied +spaviet +spavin +spavindy +spavined +spawn +spawneater +spawner +spawning +spawny +spay +spayad +spayard +spaying +speak +speakable +speakableness +speakably +speaker +speakeress +speakership +speakhouse +speakies +speaking +speakingly +speakingness +speakless +speaklessly +speal +spealbone +spean +spear +spearcast +spearer +spearfish +spearflower +spearhead +spearing +spearman +spearmanship +spearmint +spearproof +spearsman +spearwood +spearwort +speary +spec +specchie +spece +special +specialism +specialist +specialistic +speciality +specialization +specialize +specialized +specializer +specially +specialness +specialty +speciation +specie +species +speciestaler +specifiable +specific +specifical +specificality +specifically +specificalness +specificate +specification +specificative +specificatively +specificity +specificize +specificly +specificness +specifier +specifist +specify +specillum +specimen +specimenize +speciology +speciosity +specious +speciously +speciousness +speck +specked +speckedness +speckfall +speckiness +specking +speckle +specklebelly +specklebreast +speckled +speckledbill +speckledness +speckless +specklessly +specklessness +speckling +speckly +speckproof +specks +specksioneer +specky +specs +spectacle +spectacled +spectacleless +spectaclelike +spectaclemaker +spectaclemaking +spectacles +spectacular +spectacularism +spectacularity +spectacularly +spectator +spectatordom +spectatorial +spectatorship +spectatory +spectatress +spectatrix +specter +spectered +specterlike +spectra +spectral +spectralism +spectrality +spectrally +spectralness +spectrobolograph +spectrobolographic +spectrobolometer +spectrobolometric +spectrochemical +spectrochemistry +spectrocolorimetry +spectrocomparator +spectroelectric +spectrogram +spectrograph +spectrographic +spectrographically +spectrography +spectroheliogram +spectroheliograph +spectroheliographic +spectrohelioscope +spectrological +spectrologically +spectrology +spectrometer +spectrometric +spectrometry +spectromicroscope +spectromicroscopical +spectrophobia +spectrophone +spectrophonic +spectrophotoelectric +spectrophotograph +spectrophotography +spectrophotometer +spectrophotometric +spectrophotometry +spectropolarimeter +spectropolariscope +spectropyrheliometer +spectropyrometer +spectroradiometer +spectroradiometric +spectroradiometry +spectroscope +spectroscopic +spectroscopically +spectroscopist +spectroscopy +spectrotelescope +spectrous +spectrum +spectry +specula +specular +Specularia +specularly +speculate +speculation +speculatist +speculative +speculatively +speculativeness +speculativism +speculator +speculatory +speculatrices +speculatrix +speculist +speculum +specus +sped +speech +speechcraft +speecher +speechful +speechfulness +speechification +speechifier +speechify +speeching +speechless +speechlessly +speechlessness +speechlore +speechmaker +speechmaking +speechment +speed +speedaway +speedboat +speedboating +speedboatman +speeder +speedful +speedfully +speedfulness +speedily +speediness +speeding +speedingly +speedless +speedometer +speedster +speedway +speedwell +speedy +speel +speelken +speelless +speen +speer +speering +speerity +speiskobalt +speiss +spekboom +spelaean +spelder +spelding +speldring +speleological +speleologist +speleology +spelk +spell +spellable +spellbind +spellbinder +spellbinding +spellbound +spellcraft +spelldown +speller +spellful +spelling +spellingdown +spellingly +spellmonger +spellproof +spellword +spellwork +spelt +spelter +spelterman +speltoid +speltz +speluncar +speluncean +spelunk +spelunker +spence +Spencean +spencer +Spencerian +Spencerianism +Spencerism +spencerite +spend +spendable +spender +spendful +spendible +spending +spendless +spendthrift +spendthrifty +Spenerism +spense +Spenserian +spent +speos +Speotyto +sperable +Speranza +sperate +Spergula +Spergularia +sperity +sperket +sperling +sperm +sperma +spermaceti +spermacetilike +spermaduct +spermalist +Spermaphyta +spermaphyte +spermaphytic +spermarium +spermary +spermashion +spermatangium +spermatheca +spermathecal +spermatic +spermatically +spermatid +spermatiferous +spermatin +spermatiogenous +spermation +spermatiophore +spermatism +spermatist +spermatitis +spermatium +spermatize +spermatoblast +spermatoblastic +spermatocele +spermatocyst +spermatocystic +spermatocystitis +spermatocytal +spermatocyte +spermatogemma +spermatogenesis +spermatogenetic +spermatogenic +spermatogenous +spermatogeny +spermatogonial +spermatogonium +spermatoid +spermatolysis +spermatolytic +spermatophoral +spermatophore +spermatophorous +Spermatophyta +spermatophyte +spermatophytic +spermatoplasm +spermatoplasmic +spermatoplast +spermatorrhea +spermatospore +spermatotheca +spermatova +spermatovum +spermatoxin +spermatozoa +spermatozoal +spermatozoan +spermatozoic +spermatozoid +spermatozoon +spermaturia +spermic +spermidine +spermiducal +spermiduct +spermigerous +spermine +spermiogenesis +spermism +spermist +spermoblast +spermoblastic +spermocarp +spermocenter +spermoderm +spermoduct +spermogenesis +spermogenous +spermogone +spermogoniferous +spermogonium +spermogonous +spermologer +spermological +spermologist +spermology +spermolysis +spermolytic +spermophile +spermophiline +Spermophilus +spermophore +spermophorium +Spermophyta +spermophyte +spermophytic +spermosphere +spermotheca +spermotoxin +spermous +spermoviduct +spermy +speronara +speronaro +sperone +sperrylite +spessartite +spet +spetch +spetrophoby +speuchan +spew +spewer +spewiness +spewing +spewy +spex +sphacel +Sphacelaria +Sphacelariaceae +sphacelariaceous +Sphacelariales +sphacelate +sphacelated +sphacelation +sphacelia +sphacelial +sphacelism +sphaceloderma +Sphaceloma +sphacelotoxin +sphacelous +sphacelus +Sphaeralcea +sphaeraphides +Sphaerella +sphaerenchyma +Sphaeriaceae +sphaeriaceous +Sphaeriales +sphaeridia +sphaeridial +sphaeridium +Sphaeriidae +Sphaerioidaceae +sphaeristerium +sphaerite +Sphaerium +sphaeroblast +Sphaerobolaceae +Sphaerobolus +Sphaerocarpaceae +Sphaerocarpales +Sphaerocarpus +sphaerocobaltite +Sphaerococcaceae +sphaerococcaceous +Sphaerococcus +sphaerolite +sphaerolitic +Sphaeroma +Sphaeromidae +Sphaerophoraceae +Sphaerophorus +Sphaeropsidaceae +Sphaeropsidales +Sphaeropsis +sphaerosiderite +sphaerosome +sphaerospore +Sphaerostilbe +Sphaerotheca +Sphaerotilus +sphagion +Sphagnaceae +sphagnaceous +Sphagnales +sphagnicolous +sphagnologist +sphagnology +sphagnous +Sphagnum +sphagnum +Sphakiot +sphalerite +Sphargis +sphecid +Sphecidae +Sphecina +Sphecoidea +spheges +sphegid +Sphegidae +Sphegoidea +sphendone +sphene +sphenethmoid +sphenethmoidal +sphenic +sphenion +Sphenisci +Spheniscidae +Sphenisciformes +spheniscine +spheniscomorph +Spheniscomorphae +spheniscomorphic +Spheniscus +sphenobasilar +sphenobasilic +sphenocephalia +sphenocephalic +sphenocephalous +sphenocephaly +Sphenodon +sphenodon +sphenodont +Sphenodontia +Sphenodontidae +sphenoethmoid +sphenoethmoidal +sphenofrontal +sphenogram +sphenographic +sphenographist +sphenography +sphenoid +sphenoidal +sphenoiditis +sphenolith +sphenomalar +sphenomandibular +sphenomaxillary +sphenopalatine +sphenoparietal +sphenopetrosal +Sphenophorus +Sphenophyllaceae +sphenophyllaceous +Sphenophyllales +Sphenophyllum +Sphenopteris +sphenosquamosal +sphenotemporal +sphenotic +sphenotribe +sphenotripsy +sphenoturbinal +sphenovomerine +sphenozygomatic +spherable +spheral +spherality +spheraster +spheration +sphere +sphereless +spheric +spherical +sphericality +spherically +sphericalness +sphericist +sphericity +sphericle +sphericocylindrical +sphericotetrahedral +sphericotriangular +spherics +spheriform +spherify +spheroconic +spherocrystal +spherograph +spheroidal +spheroidally +spheroidic +spheroidical +spheroidically +spheroidicity +spheroidism +spheroidity +spheroidize +spheromere +spherometer +spheroquartic +spherula +spherular +spherulate +spherule +spherulite +spherulitic +spherulitize +sphery +spheterize +Sphex +sphexide +sphincter +sphincteral +sphincteralgia +sphincterate +sphincterectomy +sphincterial +sphincteric +sphincterismus +sphincteroscope +sphincteroscopy +sphincterotomy +sphindid +Sphindidae +Sphindus +sphingal +sphinges +sphingid +Sphingidae +sphingiform +sphingine +sphingoid +sphingometer +sphingomyelin +sphingosine +Sphingurinae +Sphingurus +sphinx +sphinxian +sphinxianness +sphinxlike +Sphoeroides +sphragide +sphragistic +sphragistics +sphygmia +sphygmic +sphygmochronograph +sphygmodic +sphygmogram +sphygmograph +sphygmographic +sphygmography +sphygmoid +sphygmology +sphygmomanometer +sphygmomanometric +sphygmomanometry +sphygmometer +sphygmometric +sphygmophone +sphygmophonic +sphygmoscope +sphygmus +Sphyraena +sphyraenid +Sphyraenidae +sphyraenoid +Sphyrapicus +Sphyrna +Sphyrnidae +Spica +spica +spical +spicant +Spicaria +spicate +spicated +spiccato +spice +spiceable +spiceberry +spicebush +spicecake +spiced +spiceful +spicehouse +spiceland +spiceless +spicelike +spicer +spicery +spicewood +spiciferous +spiciform +spicigerous +spicilege +spicily +spiciness +spicing +spick +spicket +spickle +spicknel +spicose +spicosity +spicous +spicousness +spicula +spiculae +spicular +spiculate +spiculated +spiculation +spicule +spiculiferous +spiculiform +spiculigenous +spiculigerous +spiculofiber +spiculose +spiculous +spiculum +spiculumamoris +spicy +spider +spidered +spiderflower +spiderish +spiderless +spiderlike +spiderling +spiderly +spiderweb +spiderwork +spiderwort +spidery +spidger +spied +spiegel +spiegeleisen +spiel +spieler +spier +spiff +spiffed +spiffily +spiffiness +spiffing +spiffy +spiflicate +spiflicated +spiflication +spig +Spigelia +Spigeliaceae +Spigelian +spiggoty +spignet +spigot +spike +spikebill +spiked +spikedness +spikefish +spikehorn +spikelet +spikelike +spikenard +spiker +spiketail +spiketop +spikeweed +spikewise +spikily +spikiness +spiking +spiky +Spilanthes +spile +spilehole +spiler +spileworm +spilikin +spiling +spilite +spilitic +spill +spillage +spiller +spillet +spillproof +spillway +spilly +Spilogale +spiloma +spilosite +spilt +spilth +spilus +spin +spina +spinacene +spinaceous +spinach +spinachlike +Spinacia +spinae +spinage +spinal +spinales +spinalis +spinally +spinate +spinder +spindlage +spindle +spindleage +spindled +spindleful +spindlehead +spindlelegs +spindlelike +spindler +spindleshanks +spindletail +spindlewise +spindlewood +spindleworm +spindliness +spindling +spindly +spindrift +spine +spinebill +spinebone +spined +spinel +spineless +spinelessly +spinelessness +spinelet +spinelike +spinescence +spinescent +spinet +spinetail +spingel +spinibulbar +spinicarpous +spinicerebellar +spinidentate +spiniferous +Spinifex +spinifex +spiniform +spinifugal +spinigerous +spinigrade +spininess +spinipetal +spinitis +spinituberculate +spink +spinnable +spinnaker +spinner +spinneret +spinnerular +spinnerule +spinnery +spinney +spinning +spinningly +spinobulbar +spinocarpous +spinocerebellar +spinogalvanization +spinoglenoid +spinoid +spinomuscular +spinoneural +spinoperipheral +spinose +spinosely +spinoseness +spinosity +spinosodentate +spinosodenticulate +spinosotubercular +spinosotuberculate +spinosympathetic +spinotectal +spinothalamic +spinotuberculous +spinous +spinousness +Spinozism +Spinozist +Spinozistic +spinster +spinsterdom +spinsterhood +spinsterial +spinsterish +spinsterishly +spinsterism +spinsterlike +spinsterly +spinsterous +spinstership +spinstress +spintext +spinthariscope +spinthariscopic +spintherism +spinulate +spinulation +spinule +spinulescent +spinuliferous +spinuliform +Spinulosa +spinulose +spinulosely +spinulosociliate +spinulosodentate +spinulosodenticulate +spinulosogranulate +spinulososerrate +spinulous +spiny +spionid +Spionidae +Spioniformia +spiracle +spiracula +spiracular +spiraculate +spiraculiferous +spiraculiform +spiraculum +Spiraea +Spiraeaceae +spiral +spirale +spiraled +spiraliform +spiralism +spirality +spiralization +spiralize +spirally +spiraloid +spiraltail +spiralwise +spiran +spirant +Spiranthes +spiranthic +spiranthy +spirantic +spirantize +spiraster +spirate +spirated +spiration +spire +spirea +spired +spiregrass +spireless +spirelet +spireme +spirepole +spireward +spirewise +spiricle +Spirifer +Spirifera +Spiriferacea +spiriferid +Spiriferidae +spiriferoid +spiriferous +spiriform +spirignath +spirignathous +spirilla +Spirillaceae +spirillaceous +spirillar +spirillolysis +spirillosis +spirillotropic +spirillotropism +spirillum +spiring +spirit +spiritally +spiritdom +spirited +spiritedly +spiritedness +spiriter +spiritful +spiritfully +spiritfulness +spirithood +spiriting +spiritism +spiritist +spiritistic +spiritize +spiritland +spiritleaf +spiritless +spiritlessly +spiritlessness +spiritlike +spiritmonger +spiritous +spiritrompe +spiritsome +spiritual +spiritualism +spiritualist +spiritualistic +spiritualistically +spirituality +spiritualization +spiritualize +spiritualizer +spiritually +spiritualness +spiritualship +spiritualty +spirituosity +spirituous +spirituously +spirituousness +spiritus +spiritweed +spirity +spirivalve +spirket +spirketing +spirling +spiro +Spirobranchia +Spirobranchiata +spirobranchiate +Spirochaeta +Spirochaetaceae +spirochaetal +Spirochaetales +Spirochaete +spirochetal +spirochete +spirochetemia +spirochetic +spirocheticidal +spirocheticide +spirochetosis +spirochetotic +Spirodela +spirogram +spirograph +spirographidin +spirographin +Spirographis +Spirogyra +spiroid +spiroloculine +spirometer +spirometric +spirometrical +spirometry +Spironema +spiropentane +Spirophyton +Spirorbis +spiroscope +Spirosoma +spirous +spirt +Spirula +spirulate +spiry +spise +spissated +spissitude +Spisula +spit +spital +spitball +spitballer +spitbox +spitchcock +spite +spiteful +spitefully +spitefulness +spiteless +spiteproof +spitfire +spitful +spithamai +spithame +spitish +spitpoison +spitscocked +spitstick +spitted +spitten +spitter +spitting +spittle +spittlefork +spittlestaff +spittoon +spitz +Spitzenburg +spitzkop +spiv +spivery +Spizella +spizzerinctum +Splachnaceae +splachnaceous +splachnoid +Splachnum +splacknuck +splairge +splanchnapophysial +splanchnapophysis +splanchnectopia +splanchnemphraxis +splanchnesthesia +splanchnesthetic +splanchnic +splanchnoblast +splanchnocoele +splanchnoderm +splanchnodiastasis +splanchnodynia +splanchnographer +splanchnographical +splanchnography +splanchnolith +splanchnological +splanchnologist +splanchnology +splanchnomegalia +splanchnomegaly +splanchnopathy +splanchnopleural +splanchnopleure +splanchnopleuric +splanchnoptosia +splanchnoptosis +splanchnosclerosis +splanchnoscopy +splanchnoskeletal +splanchnoskeleton +splanchnosomatic +splanchnotomical +splanchnotomy +splanchnotribe +splash +splashboard +splashed +splasher +splashiness +splashing +splashingly +splashproof +splashy +splat +splatch +splatcher +splatchy +splathering +splatter +splatterdash +splatterdock +splatterer +splatterfaced +splatterwork +splay +splayed +splayer +splayfoot +splayfooted +splaymouth +splaymouthed +spleen +spleenful +spleenfully +spleenish +spleenishly +spleenishness +spleenless +spleenwort +spleeny +spleet +spleetnew +splenadenoma +splenalgia +splenalgic +splenalgy +splenatrophia +splenatrophy +splenauxe +splenculus +splendacious +splendaciously +splendaciousness +splendent +splendently +splender +splendescent +splendid +splendidly +splendidness +splendiferous +splendiferously +splendiferousness +splendor +splendorous +splendorproof +splendourproof +splenectama +splenectasis +splenectomist +splenectomize +splenectomy +splenectopia +splenectopy +splenelcosis +splenemia +splenemphraxis +spleneolus +splenepatitis +splenetic +splenetical +splenetically +splenetive +splenial +splenic +splenical +splenicterus +splenification +spleniform +splenitis +splenitive +splenium +splenius +splenization +splenoblast +splenocele +splenoceratosis +splenocleisis +splenocolic +splenocyte +splenodiagnosis +splenodynia +splenography +splenohemia +splenoid +splenolaparotomy +splenology +splenolymph +splenolymphatic +splenolysin +splenolysis +splenoma +splenomalacia +splenomedullary +splenomegalia +splenomegalic +splenomegaly +splenomyelogenous +splenoncus +splenonephric +splenopancreatic +splenoparectama +splenoparectasis +splenopathy +splenopexia +splenopexis +splenopexy +splenophrenic +splenopneumonia +splenoptosia +splenoptosis +splenorrhagia +splenorrhaphy +splenotomy +splenotoxin +splenotyphoid +splenulus +splenunculus +splet +spleuchan +splice +spliceable +splicer +splicing +splinder +spline +splineway +splint +splintage +splinter +splinterd +splinterless +splinternew +splinterproof +splintery +splintwood +splinty +split +splitbeak +splitfinger +splitfruit +splitmouth +splitnew +splitsaw +splittail +splitten +splitter +splitting +splitworm +splodge +splodgy +splore +splosh +splotch +splotchily +splotchiness +splotchy +splother +splunge +splurge +splurgily +splurgy +splurt +spluther +splutter +splutterer +spoach +spode +spodiosite +spodium +spodogenic +spodogenous +spodomancy +spodomantic +spodumene +spoffish +spoffle +spoffy +spogel +spoil +spoilable +spoilage +spoilation +spoiled +spoiler +spoilfive +spoilful +spoiling +spoilless +spoilment +spoilsman +spoilsmonger +spoilsport +spoilt +Spokan +spoke +spokeless +spoken +spokeshave +spokesman +spokesmanship +spokester +spokeswoman +spokeswomanship +spokewise +spoky +spole +spolia +spoliarium +spoliary +spoliate +spoliation +spoliator +spoliatory +spolium +spondaic +spondaical +spondaize +spondean +spondee +spondiac +Spondiaceae +Spondias +spondulics +spondyl +spondylalgia +spondylarthritis +spondylarthrocace +spondylexarthrosis +spondylic +spondylid +Spondylidae +spondylioid +spondylitic +spondylitis +spondylium +spondylizema +spondylocace +Spondylocladium +spondylodiagnosis +spondylodidymia +spondylodymus +spondyloid +spondylolisthesis +spondylolisthetic +spondylopathy +spondylopyosis +spondyloschisis +spondylosis +spondylosyndesis +spondylotherapeutics +spondylotherapist +spondylotherapy +spondylotomy +spondylous +Spondylus +spondylus +spong +sponge +spongecake +sponged +spongeful +spongeless +spongelet +spongelike +spongeous +spongeproof +sponger +spongewood +Spongiae +spongian +spongicolous +spongiculture +Spongida +spongiferous +spongiform +Spongiidae +Spongilla +spongillid +Spongillidae +spongilline +spongily +spongin +sponginblast +sponginblastic +sponginess +sponging +spongingly +spongioblast +spongioblastoma +spongiocyte +spongiolin +spongiopilin +spongioplasm +spongioplasmic +spongiose +spongiosity +spongiousness +Spongiozoa +spongiozoon +spongoblast +spongoblastic +spongoid +spongology +spongophore +Spongospora +spongy +sponsal +sponsalia +sponsibility +sponsible +sponsing +sponsion +sponsional +sponson +sponsor +sponsorial +sponsorship +sponspeck +spontaneity +spontaneous +spontaneously +spontaneousness +spontoon +spoof +spoofer +spoofery +spoofish +spook +spookdom +spookery +spookily +spookiness +spookish +spookism +spookist +spookological +spookologist +spookology +spooky +spool +spooler +spoolful +spoollike +spoolwood +spoom +spoon +spoonbill +spoondrift +spooner +spoonerism +spooneyism +spooneyly +spooneyness +spoonflower +spoonful +spoonhutch +spoonily +spooniness +spooning +spoonism +spoonless +spoonlike +spoonmaker +spoonmaking +spoonways +spoonwood +spoony +spoonyism +spoor +spoorer +spoot +spor +sporabola +sporaceous +sporades +sporadial +sporadic +sporadical +sporadically +sporadicalness +sporadicity +sporadism +sporadosiderite +sporal +sporange +sporangia +sporangial +sporangidium +sporangiferous +sporangiform +sporangioid +sporangiola +sporangiole +sporangiolum +sporangiophore +sporangiospore +sporangite +Sporangites +sporangium +sporation +spore +spored +sporeformer +sporeforming +sporeling +sporicide +sporid +sporidesm +sporidia +sporidial +sporidiferous +sporidiole +sporidiolum +sporidium +sporiferous +sporification +sporiparity +sporiparous +sporoblast +Sporobolus +sporocarp +sporocarpium +Sporochnaceae +Sporochnus +sporocyst +sporocystic +sporocystid +sporocyte +sporodochia +sporodochium +sporoduct +sporogenesis +sporogenic +sporogenous +sporogeny +sporogone +sporogonial +sporogonic +sporogonium +sporogony +sporoid +sporologist +sporomycosis +sporont +sporophore +sporophoric +sporophorous +sporophydium +sporophyll +sporophyllary +sporophyllum +sporophyte +sporophytic +sporoplasm +sporosac +sporostegium +sporostrote +sporotrichosis +sporotrichotic +Sporotrichum +sporous +Sporozoa +sporozoal +sporozoan +sporozoic +sporozoite +sporozoon +sporran +sport +sportability +sportable +sportance +sporter +sportful +sportfully +sportfulness +sportily +sportiness +sporting +sportingly +sportive +sportively +sportiveness +sportless +sportling +sportly +sports +sportsman +sportsmanlike +sportsmanliness +sportsmanly +sportsmanship +sportsome +sportswear +sportswoman +sportswomanly +sportswomanship +sportula +sportulae +sporty +sporular +sporulate +sporulation +sporule +sporuliferous +sporuloid +sposh +sposhy +spot +spotless +spotlessly +spotlessness +spotlight +spotlighter +spotlike +spotrump +spotsman +spottable +spotted +spottedly +spottedness +spotteldy +spotter +spottily +spottiness +spotting +spottle +spotty +spoucher +spousage +spousal +spousally +spouse +spousehood +spouseless +spousy +spout +spouter +spoutiness +spouting +spoutless +spoutlike +spoutman +spouty +sprachle +sprack +sprackish +sprackle +sprackly +sprackness +sprad +spraddle +sprag +spragger +spraggly +spraich +sprain +spraint +spraints +sprang +sprangle +sprangly +sprank +sprat +spratter +spratty +sprauchle +sprawl +sprawler +sprawling +sprawlingly +sprawly +spray +sprayboard +sprayer +sprayey +sprayful +sprayfully +sprayless +spraylike +sprayproof +spread +spreadation +spreadboard +spreaded +spreader +spreadhead +spreading +spreadingly +spreadingness +spreadover +spready +spreaghery +spreath +spreckle +spree +spreeuw +Sprekelia +spreng +sprent +spret +sprew +sprewl +spridhogue +spried +sprier +spriest +sprig +sprigged +sprigger +spriggy +sprightful +sprightfully +sprightfulness +sprightlily +sprightliness +sprightly +sprighty +spriglet +sprigtail +Spring +spring +springal +springald +springboard +springbok +springbuck +springe +springer +springerle +springfinger +springfish +springful +springhaas +springhalt +springhead +springhouse +springily +springiness +springing +springingly +springle +springless +springlet +springlike +springly +springmaker +springmaking +springtail +springtide +springtime +springtrap +springwood +springworm +springwort +springwurzel +springy +sprink +sprinkle +sprinkled +sprinkleproof +sprinkler +sprinklered +sprinkling +sprint +sprinter +sprit +sprite +spritehood +spritsail +sprittail +sprittie +spritty +sproat +sprocket +sprod +sprogue +sproil +sprong +sprose +sprottle +sprout +sproutage +sprouter +sproutful +sprouting +sproutland +sproutling +sprowsy +spruce +sprucely +spruceness +sprucery +sprucification +sprucify +sprue +spruer +sprug +spruiker +spruit +sprung +sprunny +sprunt +spruntly +spry +spryly +spryness +spud +spudder +spuddle +spuddy +spuffle +spug +spuilyie +spuilzie +spuke +spume +spumescence +spumescent +spumiferous +spumification +spumiform +spumone +spumose +spumous +spumy +spun +spung +spunk +spunkie +spunkily +spunkiness +spunkless +spunky +spunny +spur +spurflower +spurgall +spurge +spurgewort +spuriae +spuriosity +spurious +spuriously +spuriousness +Spurius +spurl +spurless +spurlet +spurlike +spurling +spurmaker +spurmoney +spurn +spurner +spurnpoint +spurnwater +spurproof +spurred +spurrer +spurrial +spurrier +spurrings +spurrite +spurry +spurt +spurter +spurtive +spurtively +spurtle +spurway +spurwing +spurwinged +spurwort +sput +sputa +sputative +sputter +sputterer +sputtering +sputteringly +sputtery +sputum +sputumary +sputumose +sputumous +spy +spyboat +spydom +spyer +spyfault +spyglass +spyhole +spyism +spyproof +spyship +spytower +squab +squabash +squabasher +squabbed +squabbish +squabble +squabbler +squabbling +squabblingly +squabbly +squabby +squacco +squad +squaddy +squadrate +squadrism +squadron +squadrone +squadroned +squail +squailer +squalene +Squali +squalid +Squalida +Squalidae +squalidity +squalidly +squalidness +squaliform +squall +squaller +squallery +squallish +squally +squalm +Squalodon +squalodont +Squalodontidae +squaloid +Squaloidei +squalor +Squalus +squam +squama +squamaceous +squamae +Squamariaceae +Squamata +squamate +squamated +squamatine +squamation +squamatogranulous +squamatotuberculate +squame +squamella +squamellate +squamelliferous +squamelliform +squameous +squamiferous +squamiform +squamify +squamigerous +squamipennate +Squamipennes +squamipinnate +Squamipinnes +squamocellular +squamoepithelial +squamoid +squamomastoid +squamoparietal +squamopetrosal +squamosa +squamosal +squamose +squamosely +squamoseness +squamosis +squamosity +squamosodentated +squamosoimbricated +squamosomaxillary +squamosoparietal +squamosoradiate +squamosotemporal +squamosozygomatic +squamosphenoid +squamosphenoidal +squamotemporal +squamous +squamously +squamousness +squamozygomatic +Squamscot +squamula +squamulae +squamulate +squamulation +squamule +squamuliform +squamulose +squander +squanderer +squanderingly +squandermania +squandermaniac +squantum +squarable +square +squareage +squarecap +squared +squaredly +squareface +squareflipper +squarehead +squarelike +squarely +squareman +squaremouth +squareness +squarer +squaretail +squarewise +squaring +squarish +squarishly +squark +squarrose +squarrosely +squarrous +squarrulose +squarson +squarsonry +squary +squash +squashberry +squasher +squashily +squashiness +squashy +squat +Squatarola +squatarole +Squatina +squatina +squatinid +Squatinidae +squatinoid +Squatinoidei +squatly +squatment +squatmore +squatness +squattage +squatted +squatter +squatterarchy +squatterdom +squatterproof +squattily +squattiness +squatting +squattingly +squattish +squattocracy +squattocratic +squatty +squatwise +squaw +squawberry +squawbush +squawdom +squawfish +squawflower +squawk +squawker +squawkie +squawking +squawkingly +squawky +Squawmish +squawroot +Squawtits +squawweed +Squaxon +squdge +squdgy +squeak +squeaker +squeakery +squeakily +squeakiness +squeaking +squeakingly +squeaklet +squeakproof +squeaky +squeakyish +squeal +squeald +squealer +squealing +squeam +squeamish +squeamishly +squeamishness +squeamous +squeamy +Squedunk +squeege +squeegee +squeezability +squeezable +squeezableness +squeezably +squeeze +squeezeman +squeezer +squeezing +squeezingly +squeezy +squelch +squelcher +squelchily +squelchiness +squelching +squelchingly +squelchingness +squelchy +squench +squencher +squeteague +squib +squibber +squibbery +squibbish +squiblet +squibling +squid +squiddle +squidge +squidgereen +squidgy +squiffed +squiffer +squiffy +squiggle +squiggly +squilgee +squilgeer +Squill +Squilla +squilla +squillagee +squillery +squillian +squillid +Squillidae +squilloid +Squilloidea +squimmidge +squin +squinance +squinancy +squinch +squinny +squinsy +squint +squinted +squinter +squinting +squintingly +squintingness +squintly +squintness +squinty +squirage +squiralty +squire +squirearch +squirearchal +squirearchical +squirearchy +squiredom +squireen +squirehood +squireless +squirelet +squirelike +squireling +squirely +squireocracy +squireship +squiress +squiret +squirewise +squirish +squirism +squirk +squirm +squirminess +squirming +squirmingly +squirmy +squirr +squirrel +squirrelfish +squirrelian +squirreline +squirrelish +squirrellike +squirrelproof +squirreltail +squirt +squirter +squirtiness +squirting +squirtingly +squirtish +squirty +squish +squishy +squit +squitch +squitchy +squitter +squoze +squush +squushy +sraddha +sramana +Sri +sri +sruti +ssu +st +staab +Staatsrat +stab +stabber +stabbing +stabbingly +stabile +stabilify +stabilist +stabilitate +stability +stabilization +stabilizator +stabilize +stabilizer +stable +stableboy +stableful +stablekeeper +stablelike +stableman +stableness +stabler +stablestand +stableward +stablewards +stabling +stablishment +stably +staboy +stabproof +stabulate +stabulation +stabwort +staccato +stacher +stachydrin +stachydrine +stachyose +Stachys +stachys +Stachytarpheta +Stachyuraceae +stachyuraceous +Stachyurus +stack +stackage +stackencloud +stacker +stackfreed +stackful +stackgarth +Stackhousia +Stackhousiaceae +stackhousiaceous +stackless +stackman +stackstand +stackyard +stacte +stactometer +stadda +staddle +staddling +stade +stadholder +stadholderate +stadholdership +stadhouse +stadia +stadic +stadimeter +stadiometer +stadion +stadium +stafette +staff +staffed +staffelite +staffer +staffless +staffman +stag +stagbush +stage +stageability +stageable +stageableness +stageably +stagecoach +stagecoaching +stagecraft +staged +stagedom +stagehand +stagehouse +stageland +stagelike +stageman +stager +stagery +stagese +stagewise +stageworthy +stagewright +staggard +staggart +staggarth +stagger +staggerbush +staggerer +staggering +staggeringly +staggers +staggerweed +staggerwort +staggery +staggie +staggy +staghead +staghorn +staghound +staghunt +staghunter +staghunting +stagiary +stagily +staginess +staging +Stagirite +Stagiritic +staglike +stagmometer +stagnance +stagnancy +stagnant +stagnantly +stagnantness +stagnate +stagnation +stagnatory +stagnature +stagnicolous +stagnize +stagnum +Stagonospora +stagskin +stagworm +stagy +Stahlhelm +Stahlhelmer +Stahlhelmist +Stahlian +Stahlianism +Stahlism +staia +staid +staidly +staidness +stain +stainability +stainable +stainableness +stainably +stainer +stainful +stainierite +staining +stainless +stainlessly +stainlessness +stainproof +staio +stair +stairbeak +stairbuilder +stairbuilding +staircase +staired +stairhead +stairless +stairlike +stairstep +stairway +stairwise +stairwork +stairy +staith +staithman +staiver +stake +stakehead +stakeholder +stakemaster +staker +stakerope +Stakhanovism +Stakhanovite +stalactic +stalactical +stalactiform +stalactital +stalactite +stalactited +stalactitic +stalactitical +stalactitically +stalactitiform +stalactitious +stalagma +stalagmite +stalagmitic +stalagmitical +stalagmitically +stalagmometer +stalagmometric +stalagmometry +stale +stalely +stalemate +staleness +staling +Stalinism +Stalinist +Stalinite +stalk +stalkable +stalked +stalker +stalkily +stalkiness +stalking +stalkingly +stalkless +stalklet +stalklike +stalko +stalky +stall +stallage +stallar +stallboard +stallenger +staller +stallership +stalling +stallion +stallionize +stallman +stallment +stalwart +stalwartism +stalwartize +stalwartly +stalwartness +stam +stambha +stambouline +stamen +stamened +stamin +stamina +staminal +staminate +stamineal +stamineous +staminiferous +staminigerous +staminode +staminodium +staminody +stammel +stammer +stammerer +stammering +stammeringly +stammeringness +stammerwort +stamnos +stamp +stampable +stampage +stampedable +stampede +stampeder +stampedingly +stampee +stamper +stampery +stamphead +Stampian +stamping +stample +stampless +stampman +stampsman +stampweed +stance +stanch +stanchable +stanchel +stancheled +stancher +stanchion +stanchless +stanchly +stanchness +stand +standage +standard +standardbred +standardizable +standardization +standardize +standardized +standardizer +standardwise +standee +standel +standelwelks +standelwort +stander +standergrass +standerwort +standfast +standing +standish +standoff +standoffish +standoffishness +standout +standpat +standpatism +standpatter +standpipe +standpoint +standpost +standstill +stane +stanechat +stang +Stangeria +stanhope +Stanhopea +stanine +stanjen +stank +stankie +stannane +stannary +stannate +stannator +stannel +stanner +stannery +stannic +stannide +stanniferous +stannite +stanno +stannotype +stannous +stannoxyl +stannum +stannyl +stanza +stanzaed +stanzaic +stanzaical +stanzaically +stanze +stap +stapedectomy +stapedial +stapediform +stapediovestibular +stapedius +Stapelia +stapelia +stapes +staphisagria +staphyle +Staphylea +Staphyleaceae +staphyleaceous +staphylectomy +staphyledema +staphylematoma +staphylic +staphyline +staphylinic +staphylinid +Staphylinidae +staphylinideous +Staphylinoidea +Staphylinus +staphylion +staphylitis +staphyloangina +staphylococcal +staphylococci +staphylococcic +Staphylococcus +staphylococcus +staphylodermatitis +staphylodialysis +staphyloedema +staphylohemia +staphylolysin +staphyloma +staphylomatic +staphylomatous +staphylomycosis +staphyloncus +staphyloplastic +staphyloplasty +staphyloptosia +staphyloptosis +staphyloraphic +staphylorrhaphic +staphylorrhaphy +staphyloschisis +staphylosis +staphylotome +staphylotomy +staphylotoxin +staple +stapled +stapler +staplewise +stapling +Star +star +starblind +starbloom +starboard +starbolins +starbright +starch +starchboard +starched +starchedly +starchedness +starcher +starchflower +starchily +starchiness +starchless +starchlike +starchly +starchmaker +starchmaking +starchman +starchness +starchroot +starchworks +starchwort +starchy +starcraft +stardom +stare +staree +starer +starets +starfish +starflower +starfruit +starful +stargaze +stargazer +stargazing +staring +staringly +stark +starken +starkly +starkness +starky +starless +starlessly +starlessness +starlet +starlight +starlighted +starlights +starlike +starling +starlit +starlite +starlitten +starmonger +starn +starnel +starnie +starnose +Staroobriadtsi +starost +starosta +starosty +starred +starrily +starriness +starring +starringly +starry +starshake +starshine +starship +starshoot +starshot +starstone +starstroke +start +starter +startful +startfulness +starthroat +starting +startingly +startish +startle +startler +startling +startlingly +startlingness +startlish +startlishness +startly +startor +starty +starvation +starve +starveacre +starved +starvedly +starveling +starver +starvy +starward +starwise +starworm +starwort +stary +stases +stash +stashie +stasidion +stasimetric +stasimon +stasimorphy +stasiphobia +stasis +stassfurtite +statable +statal +statant +statcoulomb +State +state +statecraft +stated +statedly +stateful +statefully +statefulness +statehood +Statehouse +stateless +statelet +statelich +statelily +stateliness +stately +statement +statemonger +statequake +stater +stateroom +statesboy +stateside +statesider +statesman +statesmanese +statesmanlike +statesmanly +statesmanship +statesmonger +stateswoman +stateway +statfarad +stathmoi +stathmos +static +statical +statically +Statice +staticproof +statics +station +stational +stationarily +stationariness +stationary +stationer +stationery +stationman +stationmaster +statiscope +statism +statist +statistic +statistical +statistically +statistician +statisticize +statistics +statistology +stative +statoblast +statocracy +statocyst +statolatry +statolith +statolithic +statometer +stator +statoreceptor +statorhab +statoscope +statospore +statuarism +statuarist +statuary +statue +statuecraft +statued +statueless +statuelike +statuesque +statuesquely +statuesqueness +statuette +stature +statured +status +statutable +statutableness +statutably +statutary +statute +statutorily +statutory +statvolt +staucher +stauk +staumer +staun +staunch +staunchable +staunchly +staunchness +staup +stauracin +stauraxonia +stauraxonial +staurion +staurolatry +staurolite +staurolitic +staurology +Stauromedusae +stauromedusan +stauropegial +stauropegion +stauroscope +stauroscopic +stauroscopically +staurotide +stauter +stave +staveable +staveless +staver +stavers +staverwort +stavesacre +stavewise +stavewood +staving +stavrite +staw +stawn +staxis +stay +stayable +stayed +stayer +staylace +stayless +staylessness +staymaker +staymaking +staynil +stays +staysail +stayship +stchi +stead +steadfast +steadfastly +steadfastness +steadier +steadily +steadiment +steadiness +steading +steadman +steady +steadying +steadyingly +steadyish +steak +steal +stealability +stealable +stealage +stealed +stealer +stealing +stealingly +stealth +stealthful +stealthfully +stealthily +stealthiness +stealthless +stealthlike +stealthwise +stealthy +stealy +steam +steamboat +steamboating +steamboatman +steamcar +steamer +steamerful +steamerless +steamerload +steamily +steaminess +steaming +steamless +steamlike +steampipe +steamproof +steamship +steamtight +steamtightness +steamy +stean +steaning +steapsin +stearate +stearic +steariform +stearin +stearolactone +stearone +stearoptene +stearrhea +stearyl +steatin +steatite +steatitic +steatocele +steatogenous +steatolysis +steatolytic +steatoma +steatomatous +steatopathic +steatopyga +steatopygia +steatopygic +steatopygous +Steatornis +Steatornithes +Steatornithidae +steatorrhea +steatosis +stech +stechados +steckling +steddle +Stedman +steed +steedless +steedlike +steek +steekkan +steekkannen +steel +Steelboy +steeler +steelhead +steelhearted +steelification +steelify +steeliness +steeling +steelless +steellike +steelmaker +steelmaking +steelproof +steelware +steelwork +steelworker +steelworks +steely +steelyard +steen +steenboc +steenbock +steenbok +Steenie +steenkirk +steenstrupine +steenth +steep +steepdown +steepen +steeper +steepgrass +steepish +steeple +steeplebush +steeplechase +steeplechaser +steeplechasing +steepled +steepleless +steeplelike +steepletop +steeply +steepness +steepweed +steepwort +steepy +steer +steerability +steerable +steerage +steerageway +steerer +steering +steeringly +steerling +steerman +steermanship +steersman +steerswoman +steeve +steevely +steever +steeving +steg +steganogram +steganographical +steganographist +steganography +Steganophthalmata +steganophthalmate +steganophthalmatous +Steganophthalmia +steganopod +steganopodan +Steganopodes +steganopodous +stegnosis +stegnotic +stegocarpous +Stegocephalia +stegocephalian +stegocephalous +Stegodon +stegodont +stegodontine +Stegomus +Stegomyia +stegosaur +Stegosauria +stegosaurian +stegosauroid +Stegosaurus +steid +steigh +Stein +stein +Steinberger +steinbok +Steinerian +steinful +steinkirk +Steironema +stekan +stela +stelae +stelai +stelar +stele +stell +Stella +stella +stellar +Stellaria +stellary +stellate +stellated +stellately +stellature +stelleridean +stellerine +stelliferous +stellification +stelliform +stellify +stelling +stellionate +stelliscript +Stellite +stellite +stellular +stellularly +stellulate +stelography +stem +stema +stemhead +stemless +stemlet +stemlike +stemma +stemmata +stemmatiform +stemmatous +stemmed +stemmer +stemmery +stemming +stemmy +Stemona +Stemonaceae +stemonaceous +stemple +stempost +stemson +stemwards +stemware +sten +stenar +stench +stenchel +stenchful +stenching +stenchion +stenchy +stencil +stenciler +stencilmaker +stencilmaking +stend +steng +stengah +stenion +steno +stenobathic +stenobenthic +stenobragmatic +stenobregma +stenocardia +stenocardiac +Stenocarpus +stenocephalia +stenocephalic +stenocephalous +stenocephaly +stenochoria +stenochrome +stenochromy +stenocoriasis +stenocranial +stenocrotaphia +Stenofiber +stenog +stenogastric +stenogastry +Stenoglossa +stenograph +stenographer +stenographic +stenographical +stenographically +stenographist +stenography +stenohaline +stenometer +stenopaic +Stenopelmatidae +stenopetalous +stenophile +Stenophragma +stenophyllous +stenorhyncous +stenosed +stenosepalous +stenosis +stenosphere +stenostomatous +stenostomia +Stenotaphrum +stenotelegraphy +stenothermal +stenothorax +stenotic +stenotype +stenotypic +stenotypist +stenotypy +stent +stenter +stenterer +stenton +Stentor +stentorian +stentorianly +stentorine +stentorious +stentoriously +stentoriousness +stentoronic +stentorophonic +stentrel +step +stepaunt +stepbairn +stepbrother +stepbrotherhood +stepchild +stepdame +stepdaughter +stepfather +stepfatherhood +stepfatherly +stepgrandchild +stepgrandfather +stepgrandmother +stepgrandson +Stephana +stephane +stephanial +Stephanian +stephanic +stephanion +stephanite +Stephanoceros +Stephanokontae +stephanome +stephanos +Stephanotis +stephanotis +Stephanurus +Stephen +stepladder +stepless +steplike +stepminnie +stepmother +stepmotherhood +stepmotherless +stepmotherliness +stepmotherly +stepnephew +stepniece +stepparent +steppe +stepped +steppeland +stepper +stepping +steppingstone +steprelation +steprelationship +stepsire +stepsister +stepson +stepstone +stept +stepuncle +stepway +stepwise +steradian +stercobilin +stercolin +stercophagic +stercophagous +stercoraceous +stercoral +Stercoranism +Stercoranist +Stercorariidae +Stercorariinae +stercorarious +Stercorarius +stercorary +stercorate +stercoration +stercorean +stercoremia +stercoreous +Stercorianism +stercoricolous +Stercorist +stercorite +stercorol +stercorous +stercovorous +Sterculia +Sterculiaceae +sterculiaceous +sterculiad +stere +stereagnosis +Sterelmintha +sterelminthic +sterelminthous +stereo +stereobate +stereobatic +stereoblastula +stereocamera +stereocampimeter +stereochemic +stereochemical +stereochemically +stereochemistry +stereochromatic +stereochromatically +stereochrome +stereochromic +stereochromically +stereochromy +stereocomparagraph +stereocomparator +stereoelectric +stereofluoroscopic +stereofluoroscopy +stereogastrula +stereognosis +stereognostic +stereogoniometer +stereogram +stereograph +stereographer +stereographic +stereographical +stereographically +stereography +stereoisomer +stereoisomeric +stereoisomerical +stereoisomeride +stereoisomerism +stereomatrix +stereome +stereomer +stereomeric +stereomerical +stereomerism +stereometer +stereometric +stereometrical +stereometrically +stereometry +stereomicrometer +stereomonoscope +stereoneural +stereophantascope +stereophonic +stereophony +stereophotogrammetry +stereophotograph +stereophotographic +stereophotography +stereophotomicrograph +stereophotomicrography +stereophysics +stereopicture +stereoplanigraph +stereoplanula +stereoplasm +stereoplasma +stereoplasmic +stereopsis +stereoptician +stereopticon +stereoradiograph +stereoradiography +Stereornithes +stereornithic +stereoroentgenogram +stereoroentgenography +stereoscope +stereoscopic +stereoscopically +stereoscopism +stereoscopist +stereoscopy +Stereospondyli +stereospondylous +stereostatic +stereostatics +stereotactic +stereotactically +stereotaxis +stereotelemeter +stereotelescope +stereotomic +stereotomical +stereotomist +stereotomy +stereotropic +stereotropism +stereotypable +stereotype +stereotyped +stereotyper +stereotypery +stereotypic +stereotypical +stereotyping +stereotypist +stereotypographer +stereotypography +stereotypy +Stereum +sterhydraulic +steri +steric +sterically +sterics +steride +sterigma +sterigmata +sterigmatic +sterile +sterilely +sterileness +sterilisable +sterility +sterilizability +sterilizable +sterilization +sterilize +sterilizer +sterin +sterk +sterlet +Sterling +sterling +sterlingly +sterlingness +Stern +stern +Sterna +sterna +sternad +sternage +sternal +sternalis +sternbergite +sterncastle +sterneber +sternebra +sternebrae +sternebral +sterned +sternforemost +Sterninae +sternite +sternitic +sternly +sternman +sternmost +sternness +Sterno +sternoclavicular +sternocleidomastoid +sternoclidomastoid +sternocoracoid +sternocostal +sternofacial +sternofacialis +sternoglossal +sternohumeral +sternohyoid +sternohyoidean +sternomancy +sternomastoid +sternomaxillary +sternonuchal +sternopericardiac +sternopericardial +sternoscapular +sternothere +Sternotherus +sternothyroid +sternotracheal +sternotribe +sternovertebral +sternoxiphoid +sternpost +sternson +sternum +sternutation +sternutative +sternutator +sternutatory +sternward +sternway +sternways +sternworks +stero +steroid +sterol +Sterope +sterrinck +stert +stertor +stertorious +stertoriously +stertoriousness +stertorous +stertorously +stertorousness +sterve +Stesichorean +stet +stetch +stetharteritis +stethogoniometer +stethograph +stethographic +stethokyrtograph +stethometer +stethometric +stethometry +stethoparalysis +stethophone +stethophonometer +stethoscope +stethoscopic +stethoscopical +stethoscopically +stethoscopist +stethoscopy +stethospasm +stevedorage +stevedore +stevedoring +stevel +Steven +steven +Stevensonian +Stevensoniana +Stevia +stevia +stew +stewable +steward +stewardess +stewardly +stewardry +stewardship +Stewart +Stewartia +stewartry +stewarty +stewed +stewpan +stewpond +stewpot +stewy +stey +sthenia +sthenic +sthenochire +stib +stibbler +stibblerig +stibethyl +stibial +stibialism +stibiate +stibiated +stibic +stibiconite +stibine +stibious +stibium +stibnite +stibonium +sticcado +stich +sticharion +sticheron +stichic +stichically +stichid +stichidium +stichomancy +stichometric +stichometrical +stichometrically +stichometry +stichomythic +stichomythy +stick +stickability +stickable +stickadore +stickadove +stickage +stickball +sticked +sticker +stickers +stickfast +stickful +stickily +stickiness +sticking +stickit +stickle +stickleaf +stickleback +stickler +stickless +sticklike +stickling +stickly +stickpin +sticks +stickseed +sticksmanship +sticktail +sticktight +stickum +stickwater +stickweed +stickwork +sticky +Sticta +Stictaceae +Stictidaceae +stictiform +Stictis +stid +stiddy +stife +stiff +stiffen +stiffener +stiffening +stiffhearted +stiffish +stiffleg +stifflike +stiffly +stiffneck +stiffness +stiffrump +stifftail +stifle +stifledly +stifler +stifling +stiflingly +stigma +stigmai +stigmal +stigmaria +stigmarian +stigmarioid +stigmasterol +stigmata +stigmatal +stigmatic +stigmatical +stigmatically +stigmaticalness +stigmatiferous +stigmatiform +stigmatism +stigmatist +stigmatization +stigmatize +stigmatizer +stigmatoid +stigmatose +stigme +stigmeology +stigmonose +stigonomancy +Stikine +Stilbaceae +Stilbella +stilbene +stilbestrol +stilbite +stilboestrol +Stilbum +stile +stileman +stilet +stiletto +stilettolike +still +stillage +stillatitious +stillatory +stillbirth +stillborn +stiller +stillhouse +stillicide +stillicidium +stilliform +stilling +Stillingia +stillion +stillish +stillman +stillness +stillroom +stillstand +Stillwater +stilly +Stilophora +Stilophoraceae +stilpnomelane +stilpnosiderite +stilt +stiltbird +stilted +stilter +stiltify +stiltiness +stiltish +stiltlike +Stilton +stilty +stim +stime +stimpart +stimpert +stimulability +stimulable +stimulance +stimulancy +stimulant +stimulate +stimulatingly +stimulation +stimulative +stimulator +stimulatory +stimulatress +stimulatrix +stimuli +stimulogenous +stimulus +stimy +stine +sting +stingaree +stingareeing +stingbull +stinge +stinger +stingfish +stingily +stinginess +stinging +stingingly +stingingness +stingless +stingo +stingproof +stingray +stingtail +stingy +stink +stinkard +stinkardly +stinkball +stinkberry +stinkbird +stinkbug +stinkbush +stinkdamp +stinker +stinkhorn +stinking +stinkingly +stinkingness +stinkpot +stinkstone +stinkweed +stinkwood +stinkwort +stint +stinted +stintedly +stintedness +stinter +stintingly +stintless +stinty +stion +stionic +Stipa +stipe +stiped +stipel +stipellate +stipend +stipendial +stipendiarian +stipendiary +stipendiate +stipendium +stipendless +stipes +stipiform +stipitate +stipitiform +stipiture +Stipiturus +stippen +stipple +stippled +stippler +stippling +stipply +stipula +stipulable +stipulaceous +stipulae +stipular +stipulary +stipulate +stipulation +stipulator +stipulatory +stipule +stipuled +stipuliferous +stipuliform +stir +stirabout +stirk +stirless +stirlessly +stirlessness +stirp +stirpicultural +stirpiculture +stirpiculturist +stirps +stirra +stirrable +stirrage +stirrer +stirring +stirringly +stirrup +stirrupless +stirruplike +stirrupwise +stitch +stitchbird +stitchdown +stitcher +stitchery +stitching +stitchlike +stitchwhile +stitchwork +stitchwort +stite +stith +stithy +stive +stiver +stivy +Stizolobium +stoa +stoach +stoat +stoater +stob +stocah +stoccado +stoccata +stochastic +stochastical +stochastically +stock +stockade +stockannet +stockbow +stockbreeder +stockbreeding +Stockbridge +stockbroker +stockbrokerage +stockbroking +stockcar +stocker +stockfather +stockfish +stockholder +stockholding +stockhouse +stockily +stockiness +stockinet +stocking +stockinger +stockingless +stockish +stockishly +stockishness +stockjobber +stockjobbery +stockjobbing +stockjudging +stockkeeper +stockkeeping +stockless +stocklike +stockmaker +stockmaking +stockman +stockowner +stockpile +stockpot +stockproof +stockrider +stockriding +stocks +stockstone +stocktaker +stocktaking +Stockton +stockwork +stockwright +stocky +stockyard +stod +stodge +stodger +stodgery +stodgily +stodginess +stodgy +stoechas +stoep +stof +stoff +stog +stoga +stogie +stogy +Stoic +stoic +stoical +stoically +stoicalness +stoicharion +stoichiological +stoichiology +stoichiometric +stoichiometrical +stoichiometrically +stoichiometry +Stoicism +stoicism +Stokavci +Stokavian +Stokavski +stoke +stokehold +stokehole +stoker +stokerless +Stokesia +stokesite +stola +stolae +stole +stoled +stolelike +stolen +stolenly +stolenness +stolenwise +stolewise +stolid +stolidity +stolidly +stolidness +stolist +stolkjaerre +stollen +stolon +stolonate +stoloniferous +stoloniferously +stolonlike +stolzite +stoma +stomacace +stomach +stomachable +stomachal +stomacher +stomachful +stomachfully +stomachfulness +stomachic +stomachically +stomachicness +stomaching +stomachless +stomachlessness +stomachy +stomapod +Stomapoda +stomapodiform +stomapodous +stomata +stomatal +stomatalgia +stomate +stomatic +stomatiferous +stomatitic +stomatitis +stomatocace +Stomatoda +stomatodaeal +stomatodaeum +stomatode +stomatodeum +stomatodynia +stomatogastric +stomatograph +stomatography +stomatolalia +stomatologic +stomatological +stomatologist +stomatology +stomatomalacia +stomatomenia +stomatomy +stomatomycosis +stomatonecrosis +stomatopathy +Stomatophora +stomatophorous +stomatoplastic +stomatoplasty +stomatopod +Stomatopoda +stomatopodous +stomatorrhagia +stomatoscope +stomatoscopy +stomatose +stomatosepsis +stomatotomy +stomatotyphus +stomatous +stomenorrhagia +stomium +stomodaea +stomodaeal +stomodaeum +Stomoisia +stomoxys +stomp +stomper +stonable +stond +Stone +stone +stoneable +stonebird +stonebiter +stoneboat +stonebow +stonebrash +stonebreak +stonebrood +stonecast +stonechat +stonecraft +stonecrop +stonecutter +stoned +stonedamp +stonefish +stonegale +stonegall +stonehand +stonehatch +stonehead +stonehearted +Stonehenge +stonelayer +stonelaying +stoneless +stonelessness +stonelike +stoneman +stonemason +stonemasonry +stonen +stonepecker +stoner +stoneroot +stoneseed +stoneshot +stonesmatch +stonesmich +stonesmitch +stonesmith +stonewall +stonewaller +stonewally +stoneware +stoneweed +stonewise +stonewood +stonework +stoneworker +stonewort +stoneyard +stong +stonied +stonifiable +stonify +stonily +stoniness +stoning +stonish +stonishment +stonker +stony +stonyhearted +stonyheartedly +stonyheartedness +stood +stooded +stooden +stoof +stooge +stook +stooker +stookie +stool +stoolball +stoollike +stoon +stoond +stoop +stooper +stoopgallant +stooping +stoopingly +stoory +stoot +stoothing +stop +stopa +stopback +stopblock +stopboard +stopcock +stope +stoper +stopgap +stophound +stoping +stopless +stoplessness +stopover +stoppability +stoppable +stoppableness +stoppably +stoppage +stopped +stopper +stopperless +stoppeur +stopping +stoppit +stopple +stopwater +stopwork +storable +storage +storax +store +storeen +storehouse +storehouseman +storekeep +storekeeper +storekeeping +storeman +storer +storeroom +storeship +storesman +storge +storiate +storiation +storied +storier +storiette +storify +storiological +storiologist +storiology +stork +storken +storkish +storklike +storkling +storkwise +storm +stormable +Stormberg +stormbird +stormbound +stormcock +stormer +stormful +stormfully +stormfulness +stormily +storminess +storming +stormingly +stormish +stormless +stormlessness +stormlike +stormproof +stormward +stormwind +stormwise +stormy +Storting +story +storybook +storyless +storymaker +storymonger +storyteller +storytelling +storywise +storywork +stosh +stoss +stosston +stot +stotinka +stotter +stotterel +stoun +stound +stoundmeal +stoup +stoupful +stour +stouring +stourliness +stourness +stoury +stoush +stout +stouten +stouth +stouthearted +stoutheartedly +stoutheartedness +stoutish +stoutly +stoutness +stoutwood +stouty +stove +stovebrush +stoveful +stovehouse +stoveless +stovemaker +stovemaking +stoveman +stoven +stovepipe +stover +stovewood +stow +stowable +stowage +stowaway +stowbord +stowbordman +stowce +stowdown +stower +stowing +stownlins +stowwood +stra +strabism +strabismal +strabismally +strabismic +strabismical +strabismometer +strabismometry +strabismus +strabometer +strabometry +strabotome +strabotomy +strack +strackling +stract +Strad +strad +stradametrical +straddle +straddleback +straddlebug +straddler +straddleways +straddlewise +straddling +straddlingly +strade +stradine +stradiot +Stradivari +Stradivarius +stradl +stradld +stradlings +strae +strafe +strafer +Straffordian +strag +straggle +straggler +straggling +stragglingly +straggly +stragular +stragulum +straight +straightabout +straightaway +straightedge +straighten +straightener +straightforward +straightforwardly +straightforwardness +straightforwards +straighthead +straightish +straightly +straightness +straighttail +straightup +straightwards +straightway +straightways +straightwise +straik +strain +strainable +strainableness +strainably +strained +strainedly +strainedness +strainer +strainerman +straining +strainingly +strainless +strainlessly +strainproof +strainslip +straint +strait +straiten +straitlacedness +straitlacing +straitly +straitness +straitsman +straitwork +strake +straked +straky +stram +stramash +stramazon +stramineous +stramineously +strammel +strammer +stramonium +stramony +stramp +strand +strandage +strander +stranding +strandless +strandward +strang +strange +strangeling +strangely +strangeness +stranger +strangerdom +strangerhood +strangerlike +strangership +strangerwise +strangle +strangleable +stranglement +strangler +strangles +strangletare +strangleweed +strangling +stranglingly +strangulable +strangulate +strangulation +strangulative +strangulatory +strangullion +strangurious +strangury +stranner +strany +strap +straphang +straphanger +straphead +strapless +straplike +strappable +strappado +strappan +strapped +strapper +strapping +strapple +strapwork +strapwort +strass +strata +stratagem +stratagematic +stratagematical +stratagematically +stratagematist +stratagemical +stratagemically +stratal +stratameter +stratege +strategetic +strategetics +strategi +strategian +strategic +strategical +strategically +strategics +strategist +strategize +strategos +strategy +Stratfordian +strath +strathspey +strati +stratic +straticulate +straticulation +stratification +stratified +stratiform +stratify +stratigrapher +stratigraphic +stratigraphical +stratigraphically +stratigraphist +stratigraphy +Stratiomyiidae +Stratiotes +stratlin +stratochamber +stratocracy +stratocrat +stratocratic +stratographic +stratographical +stratographically +stratography +stratonic +Stratonical +stratopedarch +stratoplane +stratose +stratosphere +stratospheric +stratospherical +stratotrainer +stratous +stratum +stratus +straucht +strauchten +stravage +strave +straw +strawberry +strawberrylike +strawbill +strawboard +strawbreadth +strawen +strawer +strawflower +strawfork +strawless +strawlike +strawman +strawmote +strawsmall +strawsmear +strawstack +strawstacker +strawwalker +strawwork +strawworm +strawy +strawyard +stray +strayaway +strayer +strayling +stre +streahte +streak +streaked +streakedly +streakedness +streaker +streakily +streakiness +streaklike +streakwise +streaky +stream +streamer +streamful +streamhead +streaminess +streaming +streamingly +streamless +streamlet +streamlike +streamline +streamlined +streamliner +streamling +streamside +streamward +streamway +streamwort +streamy +streck +streckly +stree +streek +streel +streeler +streen +streep +street +streetage +streetcar +streetful +streetless +streetlet +streetlike +streets +streetside +streetwalker +streetwalking +streetward +streetway +streetwise +streite +streke +Strelitz +Strelitzi +strelitzi +Strelitzia +Streltzi +streltzi +stremma +stremmatograph +streng +strengite +strength +strengthen +strengthener +strengthening +strengtheningly +strengthful +strengthfulness +strengthily +strengthless +strengthlessly +strengthlessness +strengthy +strent +strenth +strenuity +strenuosity +strenuous +strenuously +strenuousness +strepen +strepent +strepera +streperous +strephonade +strephosymbolia +strepitant +strepitantly +strepitation +strepitous +strepor +Strepsiceros +strepsiceros +strepsinema +Strepsiptera +strepsipteral +strepsipteran +strepsipteron +strepsipterous +strepsis +strepsitene +streptaster +streptobacilli +streptobacillus +Streptocarpus +streptococcal +streptococci +streptococcic +Streptococcus +streptococcus +streptolysin +Streptomyces +streptomycin +Streptoneura +streptoneural +streptoneurous +streptosepticemia +streptothricial +streptothricin +streptothricosis +Streptothrix +streptotrichal +streptotrichosis +stress +stresser +stressful +stressfully +stressless +stresslessness +stret +stretch +stretchable +stretchberry +stretcher +stretcherman +stretchiness +stretchneck +stretchproof +stretchy +stretman +strette +stretti +stretto +strew +strewage +strewer +strewment +strewn +strey +streyne +stria +striae +strial +Striaria +Striariaceae +striatal +striate +striated +striation +striatum +striature +strich +striche +strick +stricken +strickenly +strickenness +stricker +strickle +strickler +strickless +strict +striction +strictish +strictly +strictness +stricture +strictured +strid +stridden +striddle +stride +strideleg +stridelegs +stridence +stridency +strident +stridently +strider +strideways +stridhan +stridhana +stridhanum +stridingly +stridling +stridlins +stridor +stridulant +stridulate +stridulation +stridulator +stridulatory +stridulent +stridulous +stridulously +stridulousness +strife +strifeful +strifeless +strifemaker +strifemaking +strifemonger +strifeproof +striffen +strig +Striga +striga +strigae +strigal +strigate +Striges +striggle +stright +Strigidae +Strigiformes +strigil +strigilate +strigilation +strigilator +strigiles +strigilis +strigillose +strigilous +Striginae +strigine +strigose +strigous +strigovite +Strigula +Strigulaceae +strigulose +strike +strikeboat +strikebreaker +strikebreaking +strikeless +striker +striking +strikingly +strikingness +strind +string +stringboard +stringcourse +stringed +stringency +stringene +stringent +stringently +stringentness +stringer +stringful +stringhalt +stringhalted +stringhaltedness +stringiness +stringing +stringless +stringlike +stringmaker +stringmaking +stringman +stringpiece +stringsman +stringways +stringwood +stringy +stringybark +strinkle +striola +striolae +striolate +striolated +striolet +strip +stripe +striped +stripeless +striper +striplet +stripling +strippage +stripped +stripper +stripping +strippit +strippler +stript +stripy +strit +strive +strived +striven +striver +striving +strivingly +Strix +strix +stroam +strobic +strobila +strobilaceous +strobilae +strobilate +strobilation +strobile +strobili +strobiliferous +strobiliform +strobiline +strobilization +strobiloid +Strobilomyces +Strobilophyta +strobilus +stroboscope +stroboscopic +stroboscopical +stroboscopy +strobotron +strockle +stroddle +strode +stroil +stroke +stroker +strokesman +stroking +stroky +strold +stroll +strolld +stroller +strom +stroma +stromal +stromata +Stromateidae +stromateoid +stromatic +stromatiform +stromatology +Stromatopora +Stromatoporidae +stromatoporoid +Stromatoporoidea +stromatous +stromb +Strombidae +strombiform +strombite +stromboid +strombolian +strombuliferous +strombuliform +Strombus +strome +stromeyerite +stromming +strone +strong +strongback +strongbark +strongbox +strongbrained +strongfully +stronghand +stronghead +strongheadedly +strongheadedness +stronghearted +stronghold +strongish +stronglike +strongly +strongness +strongylate +strongyle +strongyliasis +strongylid +Strongylidae +strongylidosis +strongyloid +Strongyloides +strongyloidosis +strongylon +Strongyloplasmata +Strongylosis +strongylosis +Strongylus +strontia +strontian +strontianiferous +strontianite +strontic +strontion +strontitic +strontium +strook +strooken +stroot +strop +strophaic +strophanhin +Strophanthus +Stropharia +strophe +strophic +strophical +strophically +strophiolate +strophiolated +strophiole +strophoid +Strophomena +Strophomenacea +strophomenid +Strophomenidae +strophomenoid +strophosis +strophotaxis +strophulus +stropper +stroppings +stroth +stroud +strouding +strounge +stroup +strouthiocamel +strouthiocamelian +strouthocamelian +strove +strow +strowd +strown +stroy +stroyer +stroygood +strub +strubbly +struck +strucken +structural +structuralism +structuralist +structuralization +structuralize +structurally +structuration +structure +structured +structureless +structurely +structurist +strudel +strue +struggle +struggler +struggling +strugglingly +Struldbrug +Struldbruggian +Struldbruggism +strum +struma +strumae +strumatic +strumaticness +strumectomy +Strumella +strumiferous +strumiform +strumiprivic +strumiprivous +strumitis +strummer +strumose +strumous +strumousness +strumpet +strumpetlike +strumpetry +strumstrum +strumulose +strung +strunt +strut +struth +struthian +struthiform +Struthio +struthioid +Struthiomimus +Struthiones +Struthionidae +struthioniform +Struthioniformes +Struthiopteris +struthious +struthonine +strutter +strutting +struttingly +struv +struvite +strych +strychnia +strychnic +strychnin +strychnine +strychninic +strychninism +strychninization +strychninize +strychnize +strychnol +Strychnos +Strymon +Stuart +Stuartia +stub +stubachite +stubb +stubbed +stubbedness +stubber +stubbiness +stubble +stubbleberry +stubbled +stubbleward +stubbly +stubborn +stubbornhearted +stubbornly +stubbornness +stubboy +stubby +stubchen +stuber +stuboy +stubrunner +stucco +stuccoer +stuccowork +stuccoworker +stuccoyer +stuck +stuckling +stucturelessness +stud +studbook +studder +studdie +studding +studdle +stude +student +studenthood +studentless +studentlike +studentry +studentship +studerite +studfish +studflower +studhorse +studia +studiable +studied +studiedly +studiedness +studier +studio +studious +studiously +studiousness +Studite +Studium +studium +studwork +study +stue +stuff +stuffed +stuffender +stuffer +stuffgownsman +stuffily +stuffiness +stuffing +stuffy +stug +stuggy +stuiver +stull +stuller +stulm +stultification +stultifier +stultify +stultiloquence +stultiloquently +stultiloquious +stultioquy +stultloquent +stum +stumble +stumbler +stumbling +stumblingly +stumbly +stumer +stummer +stummy +stump +stumpage +stumper +stumpily +stumpiness +stumpish +stumpless +stumplike +stumpling +stumpnose +stumpwise +stumpy +stun +Stundism +Stundist +stung +stunk +stunkard +stunner +stunning +stunningly +stunpoll +stunsail +stunsle +stunt +stunted +stuntedly +stuntedness +stunter +stuntiness +stuntness +stunty +stupa +stupe +stupefacient +stupefaction +stupefactive +stupefactiveness +stupefied +stupefiedness +stupefier +stupefy +stupend +stupendly +stupendous +stupendously +stupendousness +stupent +stupeous +stupex +stupid +stupidhead +stupidish +stupidity +stupidly +stupidness +stupor +stuporific +stuporose +stuporous +stupose +stupp +stuprate +stupration +stuprum +stupulose +sturdied +sturdily +sturdiness +sturdy +sturdyhearted +sturgeon +sturine +Sturiones +sturionine +sturk +Sturmian +Sturnella +Sturnidae +sturniform +Sturninae +sturnine +sturnoid +Sturnus +sturt +sturtan +sturtin +sturtion +sturtite +stuss +stut +stutter +stutterer +stuttering +stutteringly +sty +styan +styca +styceric +stycerin +stycerinol +stychomythia +styful +styfziekte +Stygial +Stygian +stylar +Stylaster +Stylasteridae +stylate +style +stylebook +styledom +styleless +stylelessness +stylelike +styler +stylet +stylewort +Stylidiaceae +stylidiaceous +Stylidium +styliferous +styliform +styline +styling +stylish +stylishly +stylishness +stylist +stylistic +stylistical +stylistically +stylistics +stylite +stylitic +stylitism +stylization +stylize +stylizer +stylo +styloauricularis +stylobate +Stylochus +styloglossal +styloglossus +stylogonidium +stylograph +stylographic +stylographical +stylographically +stylography +stylohyal +stylohyoid +stylohyoidean +stylohyoideus +styloid +stylolite +stylolitic +stylomandibular +stylomastoid +stylomaxillary +stylometer +Stylommatophora +stylommatophorous +stylomyloid +Stylonurus +Stylonychia +stylopharyngeal +stylopharyngeus +stylopid +Stylopidae +stylopization +stylopized +stylopod +stylopodium +Stylops +stylops +Stylosanthes +stylospore +stylosporous +stylostegium +stylotypite +stylus +stymie +Stymphalian +Stymphalid +Stymphalides +Styphelia +styphnate +styphnic +stypsis +styptic +styptical +stypticalness +stypticity +stypticness +Styracaceae +styracaceous +styracin +Styrax +styrax +styrene +Styrian +styrogallol +styrol +styrolene +styrone +styryl +styrylic +stythe +styward +Styx +Styxian +suability +suable +suably +suade +Suaeda +suaharo +Sualocin +Suanitian +suant +suantly +suasible +suasion +suasionist +suasive +suasively +suasiveness +suasory +suavastika +suave +suavely +suaveness +suaveolent +suavify +suaviloquence +suaviloquent +suavity +sub +subabbot +subabdominal +subability +subabsolute +subacademic +subaccount +subacetate +subacid +subacidity +subacidly +subacidness +subacidulous +subacrid +subacrodrome +subacromial +subact +subacuminate +subacute +subacutely +subadditive +subadjacent +subadjutor +subadministrate +subadministration +subadministrator +subadult +subaduncate +subaerate +subaeration +subaerial +subaerially +subaetheric +subaffluent +subage +subagency +subagent +subaggregate +subah +subahdar +subahdary +subahship +subaid +Subakhmimic +subalary +subalate +subalgebra +subalkaline +suballiance +subalmoner +subalpine +subaltern +subalternant +subalternate +subalternately +subalternating +subalternation +subalternity +subanal +subandean +subangled +subangular +subangulate +subangulated +subanniversary +subantarctic +subantichrist +subantique +Subanun +subapical +subaponeurotic +subapostolic +subapparent +subappearance +subappressed +subapprobation +subapterous +subaquatic +subaquean +subaqueous +subarachnoid +subarachnoidal +subarachnoidean +subarboraceous +subarboreal +subarborescent +subarch +subarchesporial +subarchitect +subarctic +subarcuate +subarcuated +subarcuation +subarea +subareolar +subareolet +Subarian +subarmor +subarouse +subarrhation +subartesian +subarticle +subarytenoid +subascending +subassemblage +subassembly +subassociation +subastragalar +subastragaloid +subastral +subastringent +subatom +subatomic +subattenuate +subattenuated +subattorney +subaud +subaudible +subaudition +subauditionist +subauditor +subauditur +subaural +subauricular +subautomatic +subaverage +subaxillar +subaxillary +subbailie +subbailiff +subbailiwick +subballast +subband +subbank +subbasal +subbasaltic +subbase +subbasement +subbass +subbeadle +subbeau +subbias +subbifid +subbing +subbituminous +subbookkeeper +subboreal +subbourdon +subbrachycephalic +subbrachycephaly +subbrachyskelic +subbranch +subbranched +subbranchial +subbreed +subbrigade +subbrigadier +subbroker +subbromid +subbromide +subbronchial +subbureau +subcaecal +subcalcareous +subcalcarine +subcaliber +subcallosal +subcampanulate +subcancellate +subcandid +subcantor +subcapsular +subcaptain +subcaption +subcarbide +subcarbonate +Subcarboniferous +subcarbureted +subcarburetted +subcardinal +subcarinate +subcartilaginous +subcase +subcash +subcashier +subcasino +subcast +subcaste +subcategory +subcaudal +subcaudate +subcaulescent +subcause +subcavate +subcavity +subcelestial +subcell +subcellar +subcenter +subcentral +subcentrally +subchairman +subchamberer +subchancel +subchanter +subchapter +subchaser +subchela +subchelate +subcheliform +subchief +subchloride +subchondral +subchordal +subchorioid +subchorioidal +subchorionic +subchoroid +subchoroidal +subcinctorium +subcineritious +subcingulum +subcircuit +subcircular +subcision +subcity +subclaim +Subclamatores +subclan +subclass +subclassify +subclause +subclavate +subclavia +subclavian +subclavicular +subclavioaxillary +subclaviojugular +subclavius +subclerk +subclimate +subclimax +subclinical +subclover +subcoastal +subcollateral +subcollector +subcollegiate +subcolumnar +subcommander +subcommendation +subcommended +subcommissary +subcommissaryship +subcommission +subcommissioner +subcommit +subcommittee +subcompany +subcompensate +subcompensation +subcompressed +subconcave +subconcession +subconcessionaire +subconchoidal +subconference +subconformable +subconical +subconjunctival +subconjunctively +subconnate +subconnect +subconnivent +subconscience +subconscious +subconsciously +subconsciousness +subconservator +subconsideration +subconstable +subconstellation +subconsul +subcontained +subcontest +subcontiguous +subcontinent +subcontinental +subcontinual +subcontinued +subcontinuous +subcontract +subcontracted +subcontractor +subcontraoctave +subcontrariety +subcontrarily +subcontrary +subcontrol +subconvex +subconvolute +subcool +subcoracoid +subcordate +subcordiform +subcoriaceous +subcorneous +subcorporation +subcortex +subcortical +subcortically +subcorymbose +subcosta +subcostal +subcostalis +subcouncil +subcranial +subcreative +subcreek +subcrenate +subcrepitant +subcrepitation +subcrescentic +subcrest +subcriminal +subcrossing +subcrureal +subcrureus +subcrust +subcrustaceous +subcrustal +subcrystalline +subcubical +subcuboidal +subcultrate +subcultural +subculture +subcurate +subcurator +subcuratorship +subcurrent +subcutaneous +subcutaneously +subcutaneousness +subcuticular +subcutis +subcyaneous +subcyanide +subcylindric +subcylindrical +subdatary +subdate +subdeacon +subdeaconate +subdeaconess +subdeaconry +subdeaconship +subdealer +subdean +subdeanery +subdeb +subdebutante +subdecanal +subdecimal +subdecuple +subdeducible +subdefinition +subdelegate +subdelegation +subdelirium +subdeltaic +subdeltoid +subdeltoidal +subdemonstrate +subdemonstration +subdenomination +subdentate +subdentated +subdented +subdenticulate +subdepartment +subdeposit +subdepository +subdepot +subdepressed +subdeputy +subderivative +subdermal +subdeterminant +subdevil +subdiaconal +subdiaconate +subdial +subdialect +subdialectal +subdialectally +subdiapason +subdiapente +subdiaphragmatic +subdichotomize +subdichotomous +subdichotomously +subdichotomy +subdie +subdilated +subdirector +subdiscoidal +subdisjunctive +subdistich +subdistichous +subdistinction +subdistinguish +subdistinguished +subdistrict +subdititious +subdititiously +subdivecious +subdiversify +subdividable +subdivide +subdivider +subdividing +subdividingly +subdivine +subdivisible +subdivision +subdivisional +subdivisive +subdoctor +subdolent +subdolichocephalic +subdolichocephaly +subdolous +subdolously +subdolousness +subdominant +subdorsal +subdorsally +subdouble +subdrain +subdrainage +subdrill +subdruid +subduable +subduableness +subduably +subdual +subduce +subduct +subduction +subdue +subdued +subduedly +subduedness +subduement +subduer +subduing +subduingly +subduple +subduplicate +subdural +subdurally +subecho +subectodermal +subedit +subeditor +subeditorial +subeditorship +subeffective +subelection +subelectron +subelement +subelementary +subelliptic +subelliptical +subelongate +subemarginate +subencephalon +subencephaltic +subendocardial +subendorse +subendorsement +subendothelial +subendymal +subenfeoff +subengineer +subentire +subentitle +subentry +subepidermal +subepiglottic +subepithelial +subepoch +subequal +subequality +subequally +subequatorial +subequilateral +subequivalve +suber +suberane +suberate +suberect +subereous +suberic +suberiferous +suberification +suberiform +suberin +suberinization +suberinize +Suberites +Suberitidae +suberization +suberize +suberone +suberose +suberous +subescheator +subesophageal +subessential +subetheric +subexaminer +subexcitation +subexcite +subexecutor +subexternal +subface +subfacies +subfactor +subfactorial +subfactory +subfalcate +subfalcial +subfalciform +subfamily +subfascial +subfastigiate +subfebrile +subferryman +subfestive +subfeu +subfeudation +subfeudatory +subfibrous +subfief +subfigure +subfissure +subfix +subflavor +subflexuose +subfloor +subflooring +subflora +subflush +subfluvial +subfocal +subfoliar +subforeman +subform +subformation +subfossil +subfossorial +subfoundation +subfraction +subframe +subfreshman +subfrontal +subfulgent +subfumigation +subfumose +subfunctional +subfusc +subfuscous +subfusiform +subfusk +subgalea +subgallate +subganger +subgape +subgelatinous +subgeneric +subgenerical +subgenerically +subgeniculate +subgenital +subgens +subgenual +subgenus +subgeometric +subget +subgit +subglabrous +subglacial +subglacially +subglenoid +subglobose +subglobosely +subglobular +subglobulose +subglossal +subglossitis +subglottic +subglumaceous +subgod +subgoverness +subgovernor +subgrade +subgranular +subgrin +subgroup +subgular +subgwely +subgyre +subgyrus +subhalid +subhalide +subhall +subharmonic +subhastation +subhatchery +subhead +subheading +subheadquarters +subheadwaiter +subhealth +subhedral +subhemispherical +subhepatic +subherd +subhero +subhexagonal +subhirsute +subhooked +subhorizontal +subhornblendic +subhouse +subhuman +subhumid +subhyaline +subhyaloid +subhymenial +subhymenium +subhyoid +subhyoidean +subhypothesis +subhysteria +subicle +subicteric +subicular +subiculum +subidar +subidea +subideal +subimaginal +subimago +subimbricate +subimbricated +subimposed +subimpressed +subincandescent +subincident +subincise +subincision +subincomplete +subindex +subindicate +subindication +subindicative +subindices +subindividual +subinduce +subinfer +subinfeud +subinfeudate +subinfeudation +subinfeudatory +subinflammation +subinflammatory +subinform +subingression +subinguinal +subinitial +subinoculate +subinoculation +subinsert +subinsertion +subinspector +subinspectorship +subintegumental +subintellection +subintelligential +subintelligitur +subintent +subintention +subintercessor +subinternal +subinterval +subintestinal +subintroduce +subintroduction +subintroductory +subinvoluted +subinvolution +subiodide +subirrigate +subirrigation +subitane +subitaneous +subitem +Subiya +subjacency +subjacent +subjacently +subjack +subject +subjectability +subjectable +subjectdom +subjected +subjectedly +subjectedness +subjecthood +subjectibility +subjectible +subjectification +subjectify +subjectile +subjection +subjectional +subjectist +subjective +subjectively +subjectiveness +subjectivism +subjectivist +subjectivistic +subjectivistically +subjectivity +subjectivize +subjectivoidealistic +subjectless +subjectlike +subjectness +subjectship +subjee +subjicible +subjoin +subjoinder +subjoint +subjudge +subjudiciary +subjugable +subjugal +subjugate +subjugation +subjugator +subjugular +subjunct +subjunction +subjunctive +subjunctively +subjunior +subking +subkingdom +sublabial +sublaciniate +sublacustrine +sublanate +sublanceolate +sublanguage +sublapsarian +sublapsarianism +sublapsary +sublaryngeal +sublate +sublateral +sublation +sublative +subleader +sublease +sublecturer +sublegislation +sublegislature +sublenticular +sublessee +sublessor +sublet +sublethal +sublettable +subletter +sublevaminous +sublevate +sublevation +sublevel +sublibrarian +sublicense +sublicensee +sublid +sublieutenancy +sublieutenant +subligation +sublighted +sublimable +sublimableness +sublimant +sublimate +sublimation +sublimational +sublimationist +sublimator +sublimatory +sublime +sublimed +sublimely +sublimeness +sublimer +subliminal +subliminally +sublimish +sublimitation +sublimity +sublimize +sublinear +sublineation +sublingua +sublinguae +sublingual +sublinguate +sublittoral +sublobular +sublong +subloral +subloreal +sublot +sublumbar +sublunar +sublunary +sublunate +sublustrous +subluxate +subluxation +submaid +submain +submakroskelic +submammary +subman +submanager +submania +submanic +submanor +submarginal +submarginally +submarginate +submargined +submarine +submariner +submarinism +submarinist +submarshal +submaster +submaxilla +submaxillary +submaximal +submeaning +submedial +submedian +submediant +submediation +submediocre +submeeting +submember +submembranaceous +submembranous +submeningeal +submental +submentum +submerge +submerged +submergement +submergence +submergibility +submergible +submerse +submersed +submersibility +submersible +submersion +submetallic +submeter +submetering +submicron +submicroscopic +submicroscopically +submiliary +submind +subminimal +subminister +submiss +submissible +submission +submissionist +submissive +submissively +submissiveness +submissly +submissness +submit +submittal +submittance +submitter +submittingly +submolecule +submonition +submontagne +submontane +submontanely +submontaneous +submorphous +submortgage +submotive +submountain +submucosa +submucosal +submucous +submucronate +submultiple +submundane +submuriate +submuscular +Submytilacea +subnarcotic +subnasal +subnascent +subnatural +subnect +subnervian +subness +subneural +subnex +subnitrate +subnitrated +subniveal +subnivean +subnormal +subnormality +subnotation +subnote +subnotochordal +subnubilar +subnucleus +subnude +subnumber +subnuvolar +suboblique +subobscure +subobscurely +subobtuse +suboccipital +subocean +suboceanic +suboctave +suboctile +suboctuple +subocular +suboesophageal +suboffice +subofficer +subofficial +subolive +subopaque +subopercle +subopercular +suboperculum +subopposite +suboptic +suboptimal +suboptimum +suboral +suborbicular +suborbiculate +suborbiculated +suborbital +suborbitar +suborbitary +subordain +suborder +subordinacy +subordinal +subordinary +subordinate +subordinately +subordinateness +subordinating +subordinatingly +subordination +subordinationism +subordinationist +subordinative +suborganic +suborn +subornation +subornative +suborner +Suboscines +suboval +subovate +subovated +suboverseer +subovoid +suboxidation +suboxide +subpackage +subpagoda +subpallial +subpalmate +subpanel +subparagraph +subparallel +subpart +subpartition +subpartitioned +subpartitionment +subparty +subpass +subpassage +subpastor +subpatron +subpattern +subpavement +subpectinate +subpectoral +subpeduncle +subpeduncular +subpedunculate +subpellucid +subpeltate +subpeltated +subpentagonal +subpentangular +subpericardial +subperiod +subperiosteal +subperiosteally +subperitoneal +subperitoneally +subpermanent +subpermanently +subperpendicular +subpetiolar +subpetiolate +subpharyngeal +subphosphate +subphratry +subphrenic +subphylar +subphylum +subpial +subpilose +subpimp +subpiston +subplacenta +subplant +subplantigrade +subplat +subpleural +subplinth +subplot +subplow +subpodophyllous +subpoena +subpoenal +subpolar +subpolygonal +subpool +subpopular +subpopulation +subporphyritic +subport +subpostmaster +subpostmastership +subpostscript +subpotency +subpotent +subpreceptor +subpreceptorial +subpredicate +subpredication +subprefect +subprefectorial +subprefecture +subprehensile +subpress +subprimary +subprincipal +subprior +subprioress +subproblem +subproctor +subproduct +subprofessional +subprofessor +subprofessoriate +subprofitable +subproportional +subprotector +subprovince +subprovincial +subpubescent +subpubic +subpulmonary +subpulverizer +subpunch +subpunctuation +subpurchaser +subpurlin +subputation +subpyramidal +subpyriform +subquadrangular +subquadrate +subquality +subquestion +subquinquefid +subquintuple +subrace +subradial +subradiance +subradiate +subradical +subradius +subradular +subrailway +subrameal +subramose +subramous +subrange +subrational +subreader +subreason +subrebellion +subrectangular +subrector +subreference +subregent +subregion +subregional +subregular +subreguli +subregulus +subrelation +subreligion +subreniform +subrent +subrepand +subrepent +subreport +subreptary +subreption +subreptitious +subreputable +subresin +subretinal +subrhombic +subrhomboid +subrhomboidal +subrictal +subrident +subridently +subrigid +subrision +subrisive +subrisory +subrogate +subrogation +subroot +subrostral +subround +subrule +subruler +subsacral +subsale +subsaline +subsalt +subsample +subsartorial +subsatiric +subsatirical +subsaturated +subsaturation +subscapular +subscapularis +subscapulary +subschedule +subscheme +subschool +subscience +subscleral +subsclerotic +subscribable +subscribe +subscriber +subscribership +subscript +subscription +subscriptionist +subscriptive +subscriptively +subscripture +subscrive +subscriver +subsea +subsecive +subsecretarial +subsecretary +subsect +subsection +subsecurity +subsecute +subsecutive +subsegment +subsemifusa +subsemitone +subsensation +subsensible +subsensual +subsensuous +subsept +subseptuple +subsequence +subsequency +subsequent +subsequential +subsequentially +subsequently +subsequentness +subseries +subserosa +subserous +subserrate +subserve +subserviate +subservience +subserviency +subservient +subserviently +subservientness +subsessile +subset +subsewer +subsextuple +subshaft +subsheriff +subshire +subshrub +subshrubby +subside +subsidence +subsidency +subsident +subsider +subsidiarie +subsidiarily +subsidiariness +subsidiary +subsiding +subsidist +subsidizable +subsidization +subsidize +subsidizer +subsidy +subsilicate +subsilicic +subsill +subsimilation +subsimious +subsimple +subsinuous +subsist +subsistence +subsistency +subsistent +subsistential +subsistingly +subsizar +subsizarship +subsmile +subsneer +subsocial +subsoil +subsoiler +subsolar +subsolid +subsonic +subsorter +subsovereign +subspace +subspatulate +subspecialist +subspecialize +subspecialty +subspecies +subspecific +subspecifically +subsphenoidal +subsphere +subspherical +subspherically +subspinous +subspiral +subspontaneous +subsquadron +substage +substalagmite +substalagmitic +substance +substanceless +substanch +substandard +substandardize +substant +substantiability +substantial +substantialia +substantialism +substantialist +substantiality +substantialize +substantially +substantialness +substantiate +substantiation +substantiative +substantiator +substantify +substantious +substantival +substantivally +substantive +substantively +substantiveness +substantivity +substantivize +substantize +substation +substernal +substituent +substitutable +substitute +substituted +substituter +substituting +substitutingly +substitution +substitutional +substitutionally +substitutionary +substitutive +substitutively +substock +substoreroom +substory +substract +substraction +substratal +substrate +substrati +substrative +substrator +substratose +substratosphere +substratospheric +substratum +substriate +substruct +substruction +substructional +substructural +substructure +substylar +substyle +subsulfid +subsulfide +subsulphate +subsulphid +subsulphide +subsult +subsultive +subsultorily +subsultorious +subsultory +subsultus +subsumable +subsume +subsumption +subsumptive +subsuperficial +subsurety +subsurface +subsyndicate +subsynod +subsynodical +subsystem +subtack +subtacksman +subtangent +subtarget +subtartarean +subtectal +subtegminal +subtegulaneous +subtemperate +subtenancy +subtenant +subtend +subtense +subtenure +subtepid +subteraqueous +subterbrutish +subtercelestial +subterconscious +subtercutaneous +subterethereal +subterfluent +subterfluous +subterfuge +subterhuman +subterjacent +subtermarine +subterminal +subternatural +subterpose +subterposition +subterrane +subterraneal +subterranean +subterraneanize +subterraneanly +subterraneous +subterraneously +subterraneousness +subterranity +subterraqueous +subterrene +subterrestrial +subterritorial +subterritory +subtersensual +subtersensuous +subtersuperlative +subtersurface +subtertian +subtext +subthalamic +subthalamus +subthoracic +subthrill +subtile +subtilely +subtileness +subtilin +subtilism +subtilist +subtility +subtilization +subtilize +subtilizer +subtill +subtillage +subtilty +subtitle +subtitular +subtle +subtleness +subtlety +subtlist +subtly +subtone +subtonic +subtorrid +subtotal +subtotem +subtower +subtract +subtracter +subtraction +subtractive +subtrahend +subtranslucent +subtransparent +subtransverse +subtrapezoidal +subtread +subtreasurer +subtreasurership +subtreasury +subtrench +subtriangular +subtriangulate +subtribal +subtribe +subtribual +subtrifid +subtrigonal +subtrihedral +subtriplicate +subtriplicated +subtriquetrous +subtrist +subtrochanteric +subtrochlear +subtropic +subtropical +subtropics +subtrousers +subtrude +subtruncate +subtrunk +subtuberant +subtunic +subtunnel +subturbary +subturriculate +subturriculated +subtutor +subtwined +subtype +subtypical +subulate +subulated +subulicorn +Subulicornia +subuliform +subultimate +subumbellate +subumbonal +subumbral +subumbrella +subumbrellar +subuncinate +subunequal +subungual +subunguial +Subungulata +subungulate +subunit +subuniverse +suburb +suburban +suburbandom +suburbanhood +suburbanism +suburbanite +suburbanity +suburbanization +suburbanize +suburbanly +suburbed +suburbia +suburbican +suburbicarian +suburbicary +suburethral +subursine +subvaginal +subvaluation +subvarietal +subvariety +subvassal +subvassalage +subvein +subvendee +subvene +subvention +subventionary +subventioned +subventionize +subventitious +subventive +subventral +subventricose +subvermiform +subversal +subverse +subversed +subversion +subversionary +subversive +subversivism +subvert +subvertebral +subverter +subvertible +subvertical +subverticillate +subvesicular +subvestment +subvicar +subvicarship +subvillain +subvirate +subvirile +subvisible +subvitalized +subvitreous +subvocal +subvola +subwarden +subwater +subway +subwealthy +subweight +subwink +subworker +subworkman +subzonal +subzone +subzygomatic +succade +succedanea +succedaneous +succedaneum +succedent +succeed +succeedable +succeeder +succeeding +succeedingly +succent +succentor +succenturiate +succenturiation +success +successful +successfully +successfulness +succession +successional +successionally +successionist +successionless +successive +successively +successiveness +successivity +successless +successlessly +successlessness +successor +successoral +successorship +successory +succi +succin +succinamate +succinamic +succinamide +succinanil +succinate +succinct +succinctly +succinctness +succinctorium +succinctory +succincture +succinic +succiniferous +succinimide +succinite +succinoresinol +succinosulphuric +succinous +succinyl +Succisa +succise +succivorous +succor +succorable +succorer +succorful +succorless +succorrhea +succory +succotash +succourful +succourless +succous +succub +succuba +succubae +succube +succubine +succubous +succubus +succula +succulence +succulency +succulent +succulently +succulentness +succulous +succumb +succumbence +succumbency +succumbent +succumber +succursal +succuss +succussation +succussatory +succussion +succussive +such +suchlike +suchness +Suchos +suchwise +sucivilized +suck +suckable +suckabob +suckage +suckauhock +sucken +suckener +sucker +suckerel +suckerfish +suckerlike +suckfish +suckhole +sucking +suckle +suckler +suckless +suckling +suckstone +suclat +sucramine +sucrate +sucre +sucroacid +sucrose +suction +suctional +Suctoria +suctorial +suctorian +suctorious +sucupira +sucuri +sucuriu +sucuruju +sud +sudadero +sudamen +sudamina +sudaminal +Sudan +Sudanese +Sudani +Sudanian +Sudanic +sudarium +sudary +sudate +sudation +sudatorium +sudatory +Sudburian +sudburite +sudd +sudden +suddenly +suddenness +suddenty +Sudder +sudder +suddle +suddy +Sudic +sudiform +sudoral +sudoresis +sudoric +sudoriferous +sudoriferousness +sudorific +sudoriparous +sudorous +Sudra +suds +sudsman +sudsy +sue +Suecism +suede +suer +Suerre +Suessiones +suet +suety +Sueve +Suevi +Suevian +Suevic +Sufeism +suff +suffect +suffection +suffer +sufferable +sufferableness +sufferably +sufferance +sufferer +suffering +sufferingly +suffete +suffice +sufficeable +sufficer +sufficiency +sufficient +sufficiently +sufficientness +sufficing +sufficingly +sufficingness +suffiction +suffix +suffixal +suffixation +suffixion +suffixment +sufflaminate +sufflamination +sufflate +sufflation +sufflue +suffocate +suffocating +suffocatingly +suffocation +suffocative +Suffolk +suffragan +suffraganal +suffraganate +suffragancy +suffraganeous +suffragatory +suffrage +suffragette +suffragettism +suffragial +suffragism +suffragist +suffragistic +suffragistically +suffragitis +suffrago +suffrutescent +suffrutex +suffruticose +suffruticous +suffruticulose +suffumigate +suffumigation +suffusable +suffuse +suffused +suffusedly +suffusion +suffusive +Sufi +Sufiism +Sufiistic +Sufism +Sufistic +sugamo +sugan +sugar +sugarberry +sugarbird +sugarbush +sugared +sugarelly +sugarer +sugarhouse +sugariness +sugarless +sugarlike +sugarplum +sugarsweet +sugarworks +sugary +sugent +sugescent +suggest +suggestable +suggestedness +suggester +suggestibility +suggestible +suggestibleness +suggestibly +suggesting +suggestingly +suggestion +suggestionability +suggestionable +suggestionism +suggestionist +suggestionize +suggestive +suggestively +suggestiveness +suggestivity +suggestment +suggestress +suggestum +suggillate +suggillation +sugh +sugi +suguaro +suhuaro +Sui +suicidal +suicidalism +suicidally +suicidalwise +suicide +suicidical +suicidism +suicidist +suid +Suidae +suidian +suiform +suilline +suimate +Suina +suine +suing +suingly +suint +Suiogoth +Suiogothic +Suiones +suisimilar +suist +suit +suitability +suitable +suitableness +suitably +suitcase +suite +suithold +suiting +suitor +suitoress +suitorship +suity +suji +Suk +Sukey +sukiyaki +sukkenye +Suku +Sula +Sulaba +Sulafat +Sulaib +sulbasutra +sulcal +sulcalization +sulcalize +sulcar +sulcate +sulcated +sulcation +sulcatoareolate +sulcatocostate +sulcatorimose +sulciform +sulcomarginal +sulcular +sulculate +sulculus +sulcus +suld +sulea +sulfa +sulfacid +sulfadiazine +sulfaguanidine +sulfamate +sulfamerazin +sulfamerazine +sulfamethazine +sulfamethylthiazole +sulfamic +sulfamidate +sulfamide +sulfamidic +sulfamine +sulfaminic +sulfamyl +sulfanilamide +sulfanilic +sulfanilylguanidine +sulfantimonide +sulfapyrazine +sulfapyridine +sulfaquinoxaline +sulfarsenide +sulfarsenite +sulfarseniuret +sulfarsphenamine +Sulfasuxidine +sulfatase +sulfathiazole +sulfatic +sulfatize +sulfato +sulfazide +sulfhydrate +sulfhydric +sulfhydryl +sulfindigotate +sulfindigotic +sulfindylic +sulfion +sulfionide +sulfoacid +sulfoamide +sulfobenzide +sulfobenzoate +sulfobenzoic +sulfobismuthite +sulfoborite +sulfocarbamide +sulfocarbimide +sulfocarbolate +sulfocarbolic +sulfochloride +sulfocyan +sulfocyanide +sulfofication +sulfogermanate +sulfohalite +sulfohydrate +sulfoindigotate +sulfoleic +sulfolysis +sulfomethylic +sulfonamic +sulfonamide +sulfonate +sulfonation +sulfonator +sulfonephthalein +sulfonethylmethane +sulfonic +sulfonium +sulfonmethane +sulfonyl +sulfophthalein +sulfopurpurate +sulfopurpuric +sulforicinate +sulforicinic +sulforicinoleate +sulforicinoleic +sulfoselenide +sulfosilicide +sulfostannide +sulfotelluride +sulfourea +sulfovinate +sulfovinic +sulfowolframic +sulfoxide +sulfoxism +sulfoxylate +sulfoxylic +sulfurage +sulfuran +sulfurate +sulfuration +sulfurator +sulfurea +sulfureous +sulfureously +sulfureousness +sulfuret +sulfuric +sulfurization +sulfurize +sulfurosyl +sulfurous +sulfury +sulfuryl +Sulidae +Sulides +Suliote +sulk +sulka +sulker +sulkily +sulkiness +sulky +sulkylike +sull +sulla +sullage +Sullan +sullen +sullenhearted +sullenly +sullenness +sulliable +sullow +sully +sulpha +sulphacid +sulphaldehyde +sulphamate +sulphamic +sulphamidate +sulphamide +sulphamidic +sulphamine +sulphaminic +sulphamino +sulphammonium +sulphamyl +sulphanilate +sulphanilic +sulphantimonate +sulphantimonial +sulphantimonic +sulphantimonide +sulphantimonious +sulphantimonite +sulpharsenate +sulpharseniate +sulpharsenic +sulpharsenide +sulpharsenious +sulpharsenite +sulpharseniuret +sulpharsphenamine +sulphatase +sulphate +sulphated +sulphatic +sulphation +sulphatization +sulphatize +sulphato +sulphatoacetic +sulphatocarbonic +sulphazide +sulphazotize +sulphbismuthite +sulphethylate +sulphethylic +sulphhemoglobin +sulphichthyolate +sulphidation +sulphide +sulphidic +sulphidize +sulphimide +sulphinate +sulphindigotate +sulphine +sulphinic +sulphinide +sulphinyl +sulphitation +sulphite +sulphitic +sulphmethemoglobin +sulpho +sulphoacetic +sulphoamid +sulphoamide +sulphoantimonate +sulphoantimonic +sulphoantimonious +sulphoantimonite +sulphoarsenic +sulphoarsenious +sulphoarsenite +sulphoazotize +sulphobenzide +sulphobenzoate +sulphobenzoic +sulphobismuthite +sulphoborite +sulphobutyric +sulphocarbamic +sulphocarbamide +sulphocarbanilide +sulphocarbimide +sulphocarbolate +sulphocarbolic +sulphocarbonate +sulphocarbonic +sulphochloride +sulphochromic +sulphocinnamic +sulphocyan +sulphocyanate +sulphocyanic +sulphocyanide +sulphocyanogen +sulphodichloramine +sulphofication +sulphofy +sulphogallic +sulphogel +sulphogermanate +sulphogermanic +sulphohalite +sulphohaloid +sulphohydrate +sulphoichthyolate +sulphoichthyolic +sulphoindigotate +sulphoindigotic +sulpholeate +sulpholeic +sulpholipin +sulpholysis +sulphonal +sulphonalism +sulphonamic +sulphonamide +sulphonamido +sulphonamine +sulphonaphthoic +sulphonate +sulphonated +sulphonation +sulphonator +sulphoncyanine +sulphone +sulphonephthalein +sulphonethylmethane +sulphonic +sulphonium +sulphonmethane +sulphonphthalein +sulphonyl +sulphoparaldehyde +sulphophosphate +sulphophosphite +sulphophosphoric +sulphophosphorous +sulphophthalein +sulphophthalic +sulphopropionic +sulphoproteid +sulphopupuric +sulphopurpurate +sulphoricinate +sulphoricinic +sulphoricinoleate +sulphoricinoleic +sulphosalicylic +sulphoselenide +sulphoselenium +sulphosilicide +sulphosol +sulphostannate +sulphostannic +sulphostannide +sulphostannite +sulphostannous +sulphosuccinic +sulphosulphurous +sulphotannic +sulphotelluride +sulphoterephthalic +sulphothionyl +sulphotoluic +sulphotungstate +sulphotungstic +sulphourea +sulphovanadate +sulphovinate +sulphovinic +sulphowolframic +sulphoxide +sulphoxism +sulphoxylate +sulphoxylic +sulphoxyphosphate +sulphozincate +sulphur +sulphurage +sulphuran +sulphurate +sulphuration +sulphurator +sulphurea +sulphurean +sulphureity +sulphureonitrous +sulphureosaline +sulphureosuffused +sulphureous +sulphureously +sulphureousness +sulphureovirescent +sulphuret +sulphureted +sulphuric +sulphuriferous +sulphurity +sulphurization +sulphurize +sulphurless +sulphurlike +sulphurosyl +sulphurous +sulphurously +sulphurousness +sulphurproof +sulphurweed +sulphurwort +sulphury +sulphuryl +sulphydrate +sulphydric +sulphydryl +Sulpician +sultam +sultan +sultana +sultanaship +sultanate +sultane +sultanesque +sultaness +sultanian +sultanic +sultanin +sultanism +sultanist +sultanize +sultanlike +sultanry +sultanship +sultone +sultrily +sultriness +sultry +Sulu +Suluan +sulung +sulvanite +sulvasutra +sum +sumac +Sumak +Sumass +Sumatra +sumatra +Sumatran +sumbul +sumbulic +Sumdum +Sumerian +Sumerology +sumless +sumlessness +summability +summable +summage +summand +summar +summarily +summariness +summarist +summarization +summarize +summarizer +summary +summate +summation +summational +summative +summatory +summed +summer +summerbird +summercastle +summerer +summerhead +summeriness +summering +summerings +summerish +summerite +summerize +summerland +summerlay +summerless +summerlike +summerliness +summerling +summerly +summerproof +summertide +summertime +summertree +summerward +summerwood +summery +summist +summit +summital +summitless +summity +summon +summonable +summoner +summoningly +summons +summula +summulist +summut +sumner +Sumo +sump +sumpage +sumper +sumph +sumphish +sumphishly +sumphishness +sumphy +sumpit +sumpitan +sumple +sumpman +sumpsimus +sumpter +sumption +sumptuary +sumptuosity +sumptuous +sumptuously +sumptuousness +sun +sunbeam +sunbeamed +sunbeamy +sunberry +sunbird +sunblink +sunbonnet +sunbonneted +sunbow +sunbreak +sunburn +sunburned +sunburnedness +sunburnproof +sunburnt +sunburntness +sunburst +suncherchor +suncup +sundae +Sundanese +Sundanesian +sundang +sundari +Sunday +Sundayfied +Sundayish +Sundayism +Sundaylike +Sundayness +Sundayproof +sundek +sunder +sunderable +sunderance +sunderer +sunderment +sunderwise +sundew +sundial +sundik +sundog +sundown +sundowner +sundowning +sundra +sundri +sundries +sundriesman +sundrily +sundriness +sundrops +sundry +sundryman +sune +sunfall +sunfast +sunfish +sunfisher +sunfishery +sunflower +Sung +sung +sungha +sunglade +sunglass +sunglo +sunglow +sunk +sunken +sunket +sunkland +sunlamp +sunland +sunless +sunlessly +sunlessness +sunlet +sunlight +sunlighted +sunlike +sunlit +sunn +Sunna +Sunni +Sunniah +sunnily +sunniness +Sunnism +Sunnite +sunnud +sunny +sunnyhearted +sunnyheartedness +sunproof +sunquake +sunray +sunrise +sunrising +sunroom +sunscald +sunset +sunsetting +sunsetty +sunshade +sunshine +sunshineless +sunshining +sunshiny +sunsmit +sunsmitten +sunspot +sunspotted +sunspottedness +sunspottery +sunspotty +sunsquall +sunstone +sunstricken +sunstroke +sunt +sunup +sunward +sunwards +sunway +sunways +sunweed +sunwise +sunyie +Suomi +Suomic +suovetaurilia +sup +supa +Supai +supari +supawn +supe +supellex +super +superabduction +superabhor +superability +superable +superableness +superably +superabnormal +superabominable +superabomination +superabound +superabstract +superabsurd +superabundance +superabundancy +superabundant +superabundantly +superaccession +superaccessory +superaccommodating +superaccomplished +superaccrue +superaccumulate +superaccumulation +superaccurate +superacetate +superachievement +superacid +superacidulated +superacknowledgment +superacquisition +superacromial +superactive +superactivity +superacute +superadaptable +superadd +superaddition +superadditional +superadequate +superadequately +superadjacent +superadministration +superadmirable +superadmiration +superadorn +superadornment +superaerial +superaesthetical +superaffiliation +superaffiuence +superagency +superaggravation +superagitation +superagrarian +superalbal +superalbuminosis +superalimentation +superalkaline +superalkalinity +superallowance +superaltar +superaltern +superambitious +superambulacral +superanal +superangelic +superangelical +superanimal +superannuate +superannuation +superannuitant +superannuity +superapology +superappreciation +superaqueous +superarbiter +superarbitrary +superarctic +superarduous +superarrogant +superarseniate +superartificial +superartificially +superaspiration +superassertion +superassociate +superassume +superastonish +superastonishment +superattachment +superattainable +superattendant +superattraction +superattractive +superauditor +superaural +superaverage +superavit +superaward +superaxillary +superazotation +superb +superbelief +superbeloved +superbenefit +superbenevolent +superbenign +superbias +superbious +superbity +superblessed +superblunder +superbly +superbness +superbold +superborrow +superbrain +superbrave +superbrute +superbuild +superbungalow +superbusy +supercabinet +supercalender +supercallosal +supercandid +supercanine +supercanonical +supercanonization +supercanopy +supercapable +supercaption +supercarbonate +supercarbonization +supercarbonize +supercarbureted +supercargo +supercargoship +supercarpal +supercatastrophe +supercatholic +supercausal +supercaution +supercelestial +supercensure +supercentral +supercentrifuge +supercerebellar +supercerebral +superceremonious +supercharge +supercharged +supercharger +superchemical +superchivalrous +superciliary +superciliosity +supercilious +superciliously +superciliousness +supercilium +supercivil +supercivilization +supercivilized +superclaim +superclass +superclassified +supercloth +supercoincidence +supercolossal +supercolumnar +supercolumniation +supercombination +supercombing +supercommendation +supercommentary +supercommentator +supercommercial +supercompetition +supercomplete +supercomplex +supercomprehension +supercompression +superconception +superconductive +superconductivity +superconductor +superconfident +superconfirmation +superconformable +superconformist +superconformity +superconfusion +supercongestion +superconscious +superconsciousness +superconsecrated +superconsequency +superconservative +superconstitutional +supercontest +supercontribution +supercontrol +supercool +supercordial +supercorporation +supercow +supercredit +supercrescence +supercrescent +supercrime +supercritic +supercritical +supercrowned +supercrust +supercube +supercultivated +supercurious +supercycle +supercynical +superdainty +superdanger +superdebt +superdeclamatory +superdecoration +superdeficit +superdeity +superdejection +superdelegate +superdelicate +superdemand +superdemocratic +superdemonic +superdemonstration +superdensity +superdeposit +superdesirous +superdevelopment +superdevilish +superdevotion +superdiabolical +superdiabolically +superdicrotic +superdifficult +superdiplomacy +superdirection +superdiscount +superdistention +superdistribution +superdividend +superdivine +superdivision +superdoctor +superdominant +superdomineering +superdonation +superdose +superdramatist +superdreadnought +superdubious +superduplication +superdural +superdying +superearthly +supereconomy +superedification +superedify +supereducation +supereffective +supereffluence +supereffluently +superego +superelaborate +superelastic +superelated +superelegance +superelementary +superelevated +superelevation +supereligible +supereloquent +supereminence +supereminency +supereminent +supereminently +superemphasis +superemphasize +superendorse +superendorsement +superendow +superenergetic +superenforcement +superengrave +superenrollment +superepic +superepoch +superequivalent +supererogant +supererogantly +supererogate +supererogation +supererogative +supererogator +supererogatorily +supererogatory +superespecial +superessential +superessentially +superestablish +superestablishment +supereternity +superether +superethical +superethmoidal +superevangelical +superevident +superexacting +superexalt +superexaltation +superexaminer +superexceed +superexceeding +superexcellence +superexcellency +superexcellent +superexcellently +superexceptional +superexcitation +superexcited +superexcitement +superexcrescence +superexert +superexertion +superexiguity +superexist +superexistent +superexpand +superexpansion +superexpectation +superexpenditure +superexplicit +superexport +superexpressive +superexquisite +superexquisitely +superexquisiteness +superextend +superextension +superextol +superextreme +superfamily +superfantastic +superfarm +superfat +superfecundation +superfecundity +superfee +superfeminine +superfervent +superfetate +superfetation +superfeudation +superfibrination +superficial +superficialism +superficialist +superficiality +superficialize +superficially +superficialness +superficiary +superficies +superfidel +superfinance +superfine +superfinical +superfinish +superfinite +superfissure +superfit +superfix +superfleet +superflexion +superfluent +superfluid +superfluitance +superfluity +superfluous +superfluously +superfluousness +superflux +superfoliaceous +superfoliation +superfolly +superformal +superformation +superformidable +superfortunate +superfriendly +superfrontal +superfructified +superfulfill +superfulfillment +superfunction +superfunctional +superfuse +superfusibility +superfusible +superfusion +supergaiety +supergallant +supergene +supergeneric +supergenerosity +supergenerous +supergenual +supergiant +superglacial +superglorious +superglottal +supergoddess +supergoodness +supergovern +supergovernment +supergraduate +supergrant +supergratification +supergratify +supergravitate +supergravitation +superguarantee +supergun +superhandsome +superhearty +superheat +superheater +superheresy +superhero +superheroic +superhet +superheterodyne +superhighway +superhirudine +superhistoric +superhistorical +superhive +superhuman +superhumanity +superhumanize +superhumanly +superhumanness +superhumeral +superhypocrite +superideal +superignorant +superillustrate +superillustration +superimpend +superimpending +superimpersonal +superimply +superimportant +superimposable +superimpose +superimposed +superimposition +superimposure +superimpregnated +superimpregnation +superimprobable +superimproved +superincentive +superinclination +superinclusive +superincomprehensible +superincrease +superincumbence +superincumbency +superincumbent +superincumbently +superindependent +superindiction +superindifference +superindifferent +superindignant +superindividual +superindividualism +superindividualist +superinduce +superinducement +superinduct +superinduction +superindulgence +superindulgent +superindustrious +superindustry +superinenarrable +superinfection +superinfer +superinference +superinfeudation +superinfinite +superinfinitely +superinfirmity +superinfluence +superinformal +superinfuse +superinfusion +superingenious +superingenuity +superinitiative +superinjustice +superinnocent +superinquisitive +superinsaniated +superinscription +superinsist +superinsistence +superinsistent +superinstitute +superinstitution +superintellectual +superintend +superintendence +superintendency +superintendent +superintendential +superintendentship +superintender +superintense +superintolerable +superinundation +superior +superioress +superiority +superiorly +superiorness +superiorship +superirritability +superius +superjacent +superjudicial +superjurisdiction +superjustification +superknowledge +superlabial +superlaborious +superlactation +superlapsarian +superlaryngeal +superlation +superlative +superlatively +superlativeness +superlenient +superlie +superlikelihood +superline +superlocal +superlogical +superloyal +superlucky +superlunary +superlunatical +superluxurious +supermagnificent +supermagnificently +supermalate +superman +supermanhood +supermanifest +supermanism +supermanliness +supermanly +supermannish +supermarginal +supermarine +supermarket +supermarvelous +supermasculine +supermaterial +supermathematical +supermaxilla +supermaxillary +supermechanical +supermedial +supermedicine +supermediocre +supermental +supermentality +supermetropolitan +supermilitary +supermishap +supermixture +supermodest +supermoisten +supermolten +supermoral +supermorose +supermunicipal +supermuscan +supermystery +supernacular +supernaculum +supernal +supernalize +supernally +supernatant +supernatation +supernation +supernational +supernationalism +supernatural +supernaturaldom +supernaturalism +supernaturalist +supernaturality +supernaturalize +supernaturally +supernaturalness +supernature +supernecessity +supernegligent +supernormal +supernormally +supernormalness +supernotable +supernova +supernumeral +supernumerariness +supernumerary +supernumeraryship +supernumerous +supernutrition +superoanterior +superobedience +superobedient +superobese +superobject +superobjection +superobjectionable +superobligation +superobstinate +superoccipital +superoctave +superocular +superodorsal +superoexternal +superoffensive +superofficious +superofficiousness +superofrontal +superointernal +superolateral +superomedial +superoposterior +superopposition +superoptimal +superoptimist +superoratorical +superorbital +superordain +superorder +superordinal +superordinary +superordinate +superordination +superorganic +superorganism +superorganization +superorganize +superornament +superornamental +superosculate +superoutput +superoxalate +superoxide +superoxygenate +superoxygenation +superparamount +superparasite +superparasitic +superparasitism +superparliamentary +superpassage +superpatient +superpatriotic +superpatriotism +superperfect +superperfection +superperson +superpersonal +superpersonalism +superpetrosal +superphlogisticate +superphlogistication +superphosphate +superphysical +superpigmentation +superpious +superplausible +superplease +superplus +superpolite +superpolitic +superponderance +superponderancy +superponderant +superpopulation +superposable +superpose +superposed +superposition +superpositive +superpower +superpowered +superpraise +superprecarious +superprecise +superprelatical +superpreparation +superprinting +superprobability +superproduce +superproduction +superproportion +superprosperous +superpublicity +superpure +superpurgation +superquadrupetal +superqualify +superquote +superradical +superrational +superrationally +superreaction +superrealism +superrealist +superrefine +superrefined +superrefinement +superreflection +superreform +superreformation +superregal +superregeneration +superregenerative +superregistration +superregulation +superreliance +superremuneration +superrenal +superrequirement +superrespectable +superresponsible +superrestriction +superreward +superrheumatized +superrighteous +superromantic +superroyal +supersacerdotal +supersacral +supersacred +supersacrifice +supersafe +supersagacious +supersaint +supersaintly +supersalesman +supersaliency +supersalient +supersalt +supersanction +supersanguine +supersanity +supersarcastic +supersatisfaction +supersatisfy +supersaturate +supersaturation +superscandal +superscholarly +superscientific +superscribe +superscript +superscription +superscrive +superseaman +supersecret +supersecretion +supersecular +supersecure +supersedable +supersede +supersedeas +supersedence +superseder +supersedure +superselect +superseminate +supersemination +superseminator +supersensible +supersensibly +supersensitive +supersensitiveness +supersensitization +supersensory +supersensual +supersensualism +supersensualist +supersensualistic +supersensuality +supersensually +supersensuous +supersensuousness +supersentimental +superseptal +superseptuaginarian +superseraphical +superserious +superservice +superserviceable +superserviceableness +superserviceably +supersesquitertial +supersession +supersessive +supersevere +supershipment +supersignificant +supersilent +supersimplicity +supersimplify +supersincerity +supersingular +supersistent +supersize +supersmart +supersocial +supersoil +supersolar +supersolemn +supersolemness +supersolemnity +supersolemnly +supersolicit +supersolicitation +supersolid +supersonant +supersonic +supersovereign +supersovereignty +superspecialize +superspecies +superspecification +supersphenoid +supersphenoidal +superspinous +superspiritual +superspirituality +supersquamosal +superstage +superstamp +superstandard +superstate +superstatesman +superstimulate +superstimulation +superstition +superstitionist +superstitionless +superstitious +superstitiously +superstitiousness +superstoical +superstrain +superstrata +superstratum +superstrenuous +superstrict +superstrong +superstruct +superstruction +superstructor +superstructory +superstructural +superstructure +superstuff +superstylish +supersublimated +supersuborder +supersubsist +supersubstantial +supersubstantiality +supersubstantiate +supersubtilized +supersubtle +supersufficiency +supersufficient +supersulcus +supersulphate +supersulphuret +supersulphureted +supersulphurize +supersuperabundance +supersuperabundant +supersuperabundantly +supersuperb +supersuperior +supersupremacy +supersupreme +supersurprise +supersuspicious +supersweet +supersympathy +supersyndicate +supersystem +supertare +supertartrate +supertax +supertaxation +supertemporal +supertempt +supertemptation +supertension +superterranean +superterraneous +superterrene +superterrestrial +superthankful +superthorough +superthyroidism +supertoleration +supertonic +supertotal +supertower +supertragic +supertragical +supertrain +supertramp +supertranscendent +supertranscendently +supertreason +supertrivial +supertuchun +supertunic +supertutelary +superugly +superultrafrostified +superunfit +superunit +superunity +superuniversal +superuniverse +superurgent +supervalue +supervast +supervene +supervenience +supervenient +supervenosity +supervention +supervestment +supervexation +supervictorious +supervigilant +supervigorous +supervirulent +supervisal +supervisance +supervise +supervision +supervisionary +supervisive +supervisor +supervisorial +supervisorship +supervisory +supervisual +supervisure +supervital +supervive +supervolition +supervoluminous +supervolute +superwager +superwealthy +superweening +superwise +superwoman +superworldly +superwrought +superyacht +superzealous +supinate +supination +supinator +supine +supinely +supineness +suppedaneum +supper +suppering +supperless +suppertime +supperwards +supping +supplace +supplant +supplantation +supplanter +supplantment +supple +supplejack +supplely +supplement +supplemental +supplementally +supplementarily +supplementary +supplementation +supplementer +suppleness +suppletion +suppletive +suppletively +suppletorily +suppletory +suppliable +supplial +suppliance +suppliancy +suppliant +suppliantly +suppliantness +supplicancy +supplicant +supplicantly +supplicat +supplicate +supplicating +supplicatingly +supplication +supplicationer +supplicative +supplicator +supplicatory +supplicavit +supplice +supplier +suppling +supply +support +supportability +supportable +supportableness +supportably +supportance +supporter +supportful +supporting +supportingly +supportive +supportless +supportlessly +supportress +supposable +supposableness +supposably +supposal +suppose +supposed +supposedly +supposer +supposing +supposition +suppositional +suppositionally +suppositionary +suppositionless +suppositious +supposititious +supposititiously +supposititiousness +suppositive +suppositively +suppository +suppositum +suppost +suppress +suppressal +suppressed +suppressedly +suppresser +suppressible +suppression +suppressionist +suppressive +suppressively +suppressor +supprise +suppurant +suppurate +suppuration +suppurative +suppuratory +suprabasidorsal +suprabranchial +suprabuccal +supracaecal +supracargo +supracaudal +supracensorious +supracentenarian +suprachorioid +suprachorioidal +suprachorioidea +suprachoroid +suprachoroidal +suprachoroidea +supraciliary +supraclavicle +supraclavicular +supraclusion +supracommissure +supraconduction +supraconductor +supracondylar +supracondyloid +supraconscious +supraconsciousness +supracoralline +supracostal +supracoxal +supracranial +supracretaceous +supradecompound +supradental +supradorsal +supradural +suprafeminine +suprafine +suprafoliaceous +suprafoliar +supraglacial +supraglenoid +supraglottic +supragovernmental +suprahepatic +suprahistorical +suprahuman +suprahumanity +suprahyoid +suprailiac +suprailium +supraintellectual +suprainterdorsal +suprajural +supralabial +supralapsarian +supralapsarianism +supralateral +supralegal +supraliminal +supraliminally +supralineal +supralinear +supralocal +supralocally +supraloral +supralunar +supralunary +supramammary +supramarginal +supramarine +supramastoid +supramaxilla +supramaxillary +supramaximal +suprameatal +supramechanical +supramedial +supramental +supramolecular +supramoral +supramortal +supramundane +supranasal +supranational +supranatural +supranaturalism +supranaturalist +supranaturalistic +supranature +supranervian +supraneural +supranormal +supranuclear +supraoccipital +supraocclusion +supraocular +supraoesophagal +supraoesophageal +supraoptimal +supraoptional +supraoral +supraorbital +supraorbitar +supraordinary +supraordinate +supraordination +suprapapillary +suprapedal +suprapharyngeal +supraposition +supraprotest +suprapubian +suprapubic +suprapygal +supraquantivalence +supraquantivalent +suprarational +suprarationalism +suprarationality +suprarenal +suprarenalectomize +suprarenalectomy +suprarenalin +suprarenine +suprarimal +suprasaturate +suprascapula +suprascapular +suprascapulary +suprascript +suprasegmental +suprasensible +suprasensitive +suprasensual +suprasensuous +supraseptal +suprasolar +suprasoriferous +suprasphanoidal +supraspinal +supraspinate +supraspinatus +supraspinous +suprasquamosal +suprastandard +suprastapedial +suprastate +suprasternal +suprastigmal +suprasubtle +supratemporal +supraterraneous +supraterrestrial +suprathoracic +supratonsillar +supratrochlear +supratropical +supratympanic +supravaginal +supraventricular +supraversion +supravital +supraworld +supremacy +suprematism +supreme +supremely +supremeness +supremity +sur +sura +suraddition +surah +surahi +sural +suralimentation +suranal +surangular +surat +surbase +surbased +surbasement +surbate +surbater +surbed +surcease +surcharge +surcharger +surcingle +surcoat +surcrue +surculi +surculigerous +surculose +surculous +surculus +surd +surdation +surdeline +surdent +surdimutism +surdity +surdomute +sure +surely +sureness +sures +surette +surety +suretyship +surexcitation +surf +surface +surfaced +surfacedly +surfaceless +surfacely +surfaceman +surfacer +surfacing +surfactant +surfacy +surfbird +surfboard +surfboarding +surfboat +surfboatman +surfeit +surfeiter +surfer +surficial +surfle +surflike +surfman +surfmanship +surfrappe +surfuse +surfusion +surfy +surge +surgeful +surgeless +surgent +surgeon +surgeoncy +surgeoness +surgeonfish +surgeonless +surgeonship +surgeproof +surgerize +surgery +surgical +surgically +surginess +surging +surgy +Suriana +Surianaceae +Suricata +suricate +suriga +Surinam +surinamine +surlily +surliness +surly +surma +surmark +surmaster +surmisable +surmisal +surmisant +surmise +surmised +surmisedly +surmiser +surmount +surmountable +surmountableness +surmountal +surmounted +surmounter +surmullet +surname +surnamer +surnap +surnay +surnominal +surpass +surpassable +surpasser +surpassing +surpassingly +surpassingness +surpeopled +surplice +surpliced +surplicewise +surplician +surplus +surplusage +surpreciation +surprint +surprisable +surprisal +surprise +surprisedly +surprisement +surpriseproof +surpriser +surprising +surprisingly +surprisingness +surquedry +surquidry +surquidy +surra +surrealism +surrealist +surrealistic +surrealistically +surrebound +surrebut +surrebuttal +surrebutter +surrection +surrejoin +surrejoinder +surrenal +surrender +surrenderee +surrenderer +surrenderor +surreption +surreptitious +surreptitiously +surreptitiousness +surreverence +surreverently +surrey +surrogacy +surrogate +surrogateship +surrogation +surrosion +surround +surrounded +surroundedly +surrounder +surrounding +surroundings +sursaturation +sursolid +sursumduction +sursumvergence +sursumversion +surtax +surtout +surturbrand +surveillance +surveillant +survey +surveyable +surveyage +surveyal +surveyance +surveying +surveyor +surveyorship +survigrous +survivability +survivable +survival +survivalism +survivalist +survivance +survivancy +survive +surviver +surviving +survivor +survivoress +survivorship +Sus +Susan +Susanchite +Susanna +susannite +suscept +susceptance +susceptibility +susceptible +susceptibleness +susceptibly +susception +susceptive +susceptiveness +susceptivity +susceptor +suscitate +suscitation +susi +Susian +Susianian +Susie +suslik +susotoxin +suspect +suspectable +suspected +suspectedness +suspecter +suspectful +suspectfulness +suspectible +suspectless +suspector +suspend +suspended +suspender +suspenderless +suspenders +suspendibility +suspendible +suspensation +suspense +suspenseful +suspensely +suspensibility +suspensible +suspension +suspensive +suspensively +suspensiveness +suspensoid +suspensor +suspensorial +suspensorium +suspensory +suspercollate +suspicion +suspicionable +suspicional +suspicionful +suspicionless +suspicious +suspiciously +suspiciousness +suspiration +suspiratious +suspirative +suspire +suspirious +Susquehanna +Sussex +sussexite +Sussexman +sussultatory +sussultorial +sustain +sustainable +sustained +sustainer +sustaining +sustainingly +sustainment +sustanedly +sustenance +sustenanceless +sustentacula +sustentacular +sustentaculum +sustentation +sustentational +sustentative +sustentator +sustention +sustentive +sustentor +Susu +susu +Susuhunan +Susuidae +susurr +susurrant +susurrate +susurration +susurringly +susurrous +susurrus +Sutaio +suterbery +suther +Sutherlandia +sutile +sutler +sutlerage +sutleress +sutlership +sutlery +Suto +sutor +sutorial +sutorian +sutorious +sutra +Suttapitaka +suttee +sutteeism +sutten +suttin +suttle +Sutu +sutural +suturally +suturation +suture +suum +suwarro +suwe +suz +suzerain +suzeraine +suzerainship +suzerainty +Suzy +Svan +Svanetian +Svanish +Svantovit +svarabhakti +svarabhaktic +Svarloka +svelte +Svetambara +sviatonosite +swa +Swab +swab +swabber +swabberly +swabble +Swabian +swack +swacken +swacking +swad +swaddle +swaddlebill +swaddler +swaddling +swaddy +Swadeshi +Swadeshism +swag +swagbellied +swagbelly +swage +swager +swagger +swaggerer +swaggering +swaggeringly +swaggie +swaggy +swaglike +swagman +swagsman +Swahilese +Swahili +Swahilian +Swahilize +swaimous +swain +swainish +swainishness +swainship +Swainsona +swainsona +swaird +swale +swaler +swaling +swalingly +swallet +swallo +swallow +swallowable +swallower +swallowlike +swallowling +swallowpipe +swallowtail +swallowwort +swam +swami +swamp +swampable +swampberry +swamper +swampish +swampishness +swampland +swampside +swampweed +swampwood +swampy +swan +swandown +swanflower +swang +swangy +swanherd +swanhood +swanimote +swank +swanker +swankily +swankiness +swanking +swanky +swanlike +swanmark +swanmarker +swanmarking +swanneck +swannecked +swanner +swannery +swannish +swanny +swanskin +Swantevit +swanweed +swanwort +swap +swape +swapper +swapping +swaraj +swarajism +swarajist +swarbie +sward +swardy +sware +swarf +swarfer +swarm +swarmer +swarming +swarmy +swarry +swart +swartback +swarth +swarthily +swarthiness +swarthness +swarthy +swartish +swartly +swartness +swartrutter +swartrutting +swarty +Swartzbois +Swartzia +swarve +swash +swashbuckle +swashbuckler +swashbucklerdom +swashbucklering +swashbucklery +swashbuckling +swasher +swashing +swashway +swashwork +swashy +swastika +swastikaed +Swat +swat +swatch +Swatchel +swatcher +swatchway +swath +swathable +swathband +swathe +swatheable +swather +swathy +Swati +Swatow +swatter +swattle +swaver +sway +swayable +swayed +swayer +swayful +swaying +swayingly +swayless +Swazi +Swaziland +sweal +sweamish +swear +swearer +swearingly +swearword +sweat +sweatband +sweatbox +sweated +sweater +sweatful +sweath +sweatily +sweatiness +sweating +sweatless +sweatproof +sweatshop +sweatweed +sweaty +Swede +Swedenborgian +Swedenborgianism +Swedenborgism +swedge +Swedish +sweeny +sweep +sweepable +sweepage +sweepback +sweepboard +sweepdom +sweeper +sweeperess +sweepforward +sweeping +sweepingly +sweepingness +sweepings +sweepstake +sweepwasher +sweepwashings +sweepy +sweer +sweered +sweet +sweetberry +sweetbread +sweetbrier +sweetbriery +sweeten +sweetener +sweetening +sweetfish +sweetful +sweetheart +sweetheartdom +sweethearted +sweetheartedness +sweethearting +sweetheartship +sweetie +sweeting +sweetish +sweetishly +sweetishness +sweetleaf +sweetless +sweetlike +sweetling +sweetly +sweetmaker +sweetmeat +sweetmouthed +sweetness +sweetroot +sweetshop +sweetsome +sweetsop +sweetwater +sweetweed +sweetwood +sweetwort +sweety +swego +swelchie +swell +swellage +swelldom +swelldoodle +swelled +sweller +swellfish +swelling +swellish +swellishness +swellmobsman +swellness +swelltoad +swelly +swelp +swelt +swelter +sweltering +swelteringly +swelth +sweltry +swelty +swep +swept +swerd +Swertia +swerve +swerveless +swerver +swervily +swick +swidge +Swietenia +swift +swiften +swifter +swiftfoot +swiftlet +swiftlike +swiftness +swifty +swig +swigger +swiggle +swile +swill +swillbowl +swiller +swilltub +swim +swimmable +swimmer +swimmeret +swimmily +swimminess +swimming +swimmingly +swimmingness +swimmist +swimmy +swimsuit +swimy +Swinburnesque +Swinburnian +swindle +swindleable +swindledom +swindler +swindlership +swindlery +swindling +swindlingly +swine +swinebread +swinecote +swinehead +swineherd +swineherdship +swinehood +swinehull +swinelike +swinely +swinepipe +swinery +swinestone +swinesty +swiney +swing +swingable +swingback +swingdevil +swingdingle +swinge +swingeing +swinger +swinging +swingingly +Swingism +swingle +swinglebar +swingletail +swingletree +swingstock +swingtree +swingy +swinish +swinishly +swinishness +swink +swinney +swipe +swiper +swipes +swiple +swipper +swipy +swird +swire +swirl +swirlingly +swirly +swirring +swish +swisher +swishing +swishingly +swishy +Swiss +swiss +Swissess +swissing +switch +switchback +switchbacker +switchboard +switched +switchel +switcher +switchgear +switching +switchkeeper +switchlike +switchman +switchy +switchyard +swith +swithe +swithen +swither +Swithin +Switzer +Switzeress +swivel +swiveled +swiveleye +swiveleyed +swivellike +swivet +swivetty +swiz +swizzle +swizzler +swob +swollen +swollenly +swollenness +swom +swonken +swoon +swooned +swooning +swooningly +swoony +swoop +swooper +swoosh +sword +swordbill +swordcraft +swordfish +swordfisherman +swordfishery +swordfishing +swordick +swording +swordless +swordlet +swordlike +swordmaker +swordmaking +swordman +swordmanship +swordplay +swordplayer +swordproof +swordsman +swordsmanship +swordsmith +swordster +swordstick +swordswoman +swordtail +swordweed +swore +sworn +swosh +swot +swotter +swounds +swow +swum +swung +swungen +swure +syagush +sybarism +sybarist +Sybarital +Sybaritan +Sybarite +Sybaritic +Sybaritical +Sybaritically +Sybaritish +sybaritism +Sybil +sybotic +sybotism +sycamine +sycamore +syce +sycee +sychnocarpous +sycock +sycoma +sycomancy +Sycon +Syconaria +syconarian +syconate +Sycones +syconid +Syconidae +syconium +syconoid +syconus +sycophancy +sycophant +sycophantic +sycophantical +sycophantically +sycophantish +sycophantishly +sycophantism +sycophantize +sycophantry +sycosiform +sycosis +Sydneian +Sydneyite +sye +syenite +syenitic +syenodiorite +syenogabbro +sylid +syllab +syllabarium +syllabary +syllabatim +syllabation +syllabe +syllabi +syllabic +syllabical +syllabically +syllabicate +syllabication +syllabicness +syllabification +syllabify +syllabism +syllabize +syllable +syllabled +syllabus +syllepsis +sylleptic +sylleptical +sylleptically +Syllidae +syllidian +Syllis +sylloge +syllogism +syllogist +syllogistic +syllogistical +syllogistically +syllogistics +syllogization +syllogize +syllogizer +sylph +sylphic +sylphid +sylphidine +sylphish +sylphize +sylphlike +Sylphon +sylphy +sylva +sylvae +sylvage +sylvan +sylvanesque +sylvanite +sylvanitic +sylvanity +sylvanize +sylvanly +sylvanry +sylvate +sylvatic +Sylvester +sylvester +sylvestral +sylvestrene +Sylvestrian +sylvestrian +Sylvestrine +Sylvia +Sylvian +sylvic +Sylvicolidae +sylvicoline +Sylviidae +Sylviinae +sylviine +sylvine +sylvinite +sylvite +symbasic +symbasical +symbasically +symbasis +symbiogenesis +symbiogenetic +symbiogenetically +symbion +symbiont +symbiontic +symbionticism +symbiosis +symbiot +symbiote +symbiotic +symbiotically +symbiotics +symbiotism +symbiotrophic +symblepharon +symbol +symbolaeography +symbolater +symbolatrous +symbolatry +symbolic +symbolical +symbolically +symbolicalness +symbolicly +symbolics +symbolism +symbolist +symbolistic +symbolistical +symbolistically +symbolization +symbolize +symbolizer +symbolofideism +symbological +symbologist +symbolography +symbology +symbololatry +symbolology +symbolry +symbouleutic +symbranch +Symbranchia +symbranchiate +symbranchoid +symbranchous +symmachy +symmedian +symmelia +symmelian +symmelus +symmetalism +symmetral +symmetric +symmetrical +symmetricality +symmetrically +symmetricalness +symmetrist +symmetrization +symmetrize +symmetroid +symmetrophobia +symmetry +symmorphic +symmorphism +sympalmograph +sympathectomize +sympathectomy +sympathetectomy +sympathetic +sympathetical +sympathetically +sympatheticism +sympatheticity +sympatheticness +sympatheticotonia +sympatheticotonic +sympathetoblast +sympathicoblast +sympathicotonia +sympathicotonic +sympathicotripsy +sympathism +sympathist +sympathize +sympathizer +sympathizing +sympathizingly +sympathoblast +sympatholysis +sympatholytic +sympathomimetic +sympathy +sympatric +sympatry +Sympetalae +sympetalous +Symphalangus +symphenomena +symphenomenal +symphile +symphilic +symphilism +symphilous +symphily +symphogenous +symphonetic +symphonia +symphonic +symphonically +symphonion +symphonious +symphoniously +symphonist +symphonize +symphonous +symphony +Symphoricarpos +symphoricarpous +symphrase +symphronistic +symphyantherous +symphycarpous +Symphyla +symphylan +symphyllous +symphylous +symphynote +symphyogenesis +symphyogenetic +symphyostemonous +symphyseal +symphyseotomy +symphysial +symphysian +symphysic +symphysion +symphysiotomy +symphysis +symphysodactylia +symphysotomy +symphysy +Symphyta +symphytic +symphytically +symphytism +symphytize +Symphytum +sympiesometer +symplasm +symplectic +Symplegades +symplesite +Symplocaceae +symplocaceous +Symplocarpus +symploce +Symplocos +sympode +sympodia +sympodial +sympodially +sympodium +sympolity +symposia +symposiac +symposiacal +symposial +symposiarch +symposiast +symposiastic +symposion +symposium +symptom +symptomatic +symptomatical +symptomatically +symptomatics +symptomatize +symptomatography +symptomatological +symptomatologically +symptomatology +symptomical +symptomize +symptomless +symptosis +symtomology +synacme +synacmic +synacmy +synactic +synadelphite +synaeresis +synagogal +synagogian +synagogical +synagogism +synagogist +synagogue +synalgia +synalgic +synallactic +synallagmatic +synaloepha +synanastomosis +synange +synangia +synangial +synangic +synangium +synanthema +synantherological +synantherologist +synantherology +synantherous +synanthesis +synanthetic +synanthic +synanthous +synanthrose +synanthy +synaphea +synaposematic +synapse +synapses +Synapsida +synapsidan +synapsis +synaptai +synaptase +synapte +synaptene +Synaptera +synapterous +synaptic +synaptical +synaptically +synapticula +synapticulae +synapticular +synapticulate +synapticulum +Synaptosauria +synaptychus +synarchical +synarchism +synarchy +synarmogoid +Synarmogoidea +synarquism +synartesis +synartete +synartetic +synarthrodia +synarthrodial +synarthrodially +synarthrosis +Synascidiae +synascidian +synastry +synaxar +synaxarion +synaxarist +synaxarium +synaxary +synaxis +sync +Syncarida +syncarp +syncarpia +syncarpium +syncarpous +syncarpy +syncategorematic +syncategorematical +syncategorematically +syncategoreme +syncephalic +syncephalus +syncerebral +syncerebrum +synch +synchitic +synchondoses +synchondrosial +synchondrosially +synchondrosis +synchondrotomy +synchoresis +synchro +synchroflash +synchromesh +synchronal +synchrone +synchronic +synchronical +synchronically +synchronism +synchronistic +synchronistical +synchronistically +synchronizable +synchronization +synchronize +synchronized +synchronizer +synchronograph +synchronological +synchronology +synchronous +synchronously +synchronousness +synchrony +synchroscope +synchrotron +synchysis +Synchytriaceae +Synchytrium +syncladous +synclastic +synclinal +synclinally +syncline +synclinical +synclinore +synclinorial +synclinorian +synclinorium +synclitic +syncliticism +synclitism +syncoelom +syncopal +syncopate +syncopated +syncopation +syncopator +syncope +syncopic +syncopism +syncopist +syncopize +syncotyledonous +syncracy +syncraniate +syncranterian +syncranteric +syncrasy +syncretic +syncretical +syncreticism +syncretion +syncretism +syncretist +syncretistic +syncretistical +syncretize +syncrisis +Syncrypta +syncryptic +syncytia +syncytial +syncytioma +syncytiomata +syncytium +syndactyl +syndactylia +syndactylic +syndactylism +syndactylous +syndactyly +syndectomy +synderesis +syndesis +syndesmectopia +syndesmitis +syndesmography +syndesmology +syndesmoma +Syndesmon +syndesmoplasty +syndesmorrhaphy +syndesmosis +syndesmotic +syndesmotomy +syndetic +syndetical +syndetically +syndic +syndical +syndicalism +syndicalist +syndicalistic +syndicalize +syndicate +syndicateer +syndication +syndicator +syndicship +syndoc +syndrome +syndromic +syndyasmian +Syndyoceras +syne +synecdoche +synecdochic +synecdochical +synecdochically +synecdochism +synechia +synechiological +synechiology +synechological +synechology +synechotomy +synechthran +synechthry +synecology +synecphonesis +synectic +synecticity +Synedra +synedral +Synedria +synedria +synedrial +synedrian +Synedrion +synedrion +Synedrium +synedrium +synedrous +syneidesis +synema +synemmenon +synenergistic +synenergistical +synenergistically +synentognath +Synentognathi +synentognathous +syneresis +synergastic +synergetic +synergia +synergic +synergically +synergid +synergidae +synergidal +synergism +synergist +synergistic +synergistical +synergistically +synergize +synergy +synerize +synesis +synesthesia +synesthetic +synethnic +syngamic +syngamous +syngamy +Syngenesia +syngenesian +syngenesious +syngenesis +syngenetic +syngenic +syngenism +syngenite +Syngnatha +Syngnathi +syngnathid +Syngnathidae +syngnathoid +syngnathous +Syngnathus +syngraph +synizesis +synkaryon +synkatathesis +synkinesia +synkinesis +synkinetic +synneurosis +synneusis +synochoid +synochus +synocreate +synod +synodal +synodalian +synodalist +synodally +synodical +synodically +synodist +synodite +synodontid +Synodontidae +synodontoid +synodsman +Synodus +synoecete +synoeciosis +synoecious +synoeciously +synoeciousness +synoecism +synoecize +synoecy +synoicous +synomosy +synonym +synonymatic +synonymic +synonymical +synonymicon +synonymics +synonymist +synonymity +synonymize +synonymous +synonymously +synonymousness +synonymy +synophthalmus +synopses +synopsis +synopsize +synopsy +synoptic +synoptical +synoptically +Synoptist +synoptist +Synoptistic +synorchidism +synorchism +synorthographic +synosteology +synosteosis +synostose +synostosis +synostotic +synostotical +synostotically +synousiacs +synovectomy +synovia +synovial +synovially +synoviparous +synovitic +synovitis +synpelmous +synrhabdosome +synsacral +synsacrum +synsepalous +synspermous +synsporous +syntactic +syntactical +syntactically +syntactician +syntactics +syntagma +syntan +syntasis +syntax +syntaxis +syntaxist +syntechnic +syntectic +syntelome +syntenosis +synteresis +syntexis +syntheme +synthermal +syntheses +synthesis +synthesism +synthesist +synthesization +synthesize +synthesizer +synthete +synthetic +synthetical +synthetically +syntheticism +synthetism +synthetist +synthetization +synthetize +synthetizer +synthol +synthroni +synthronoi +synthronos +synthronus +syntomia +syntomy +syntone +syntonic +syntonical +syntonically +syntonin +syntonization +syntonize +syntonizer +syntonolydian +syntonous +syntony +syntripsis +syntrope +syntrophic +syntropic +syntropical +syntropy +syntype +syntypic +syntypicism +Synura +synusia +synusiast +syodicon +sypher +syphilide +syphilidography +syphilidologist +syphiliphobia +syphilis +syphilitic +syphilitically +syphilization +syphilize +syphiloderm +syphilodermatous +syphilogenesis +syphilogeny +syphilographer +syphilography +syphiloid +syphilologist +syphilology +syphiloma +syphilomatous +syphilophobe +syphilophobia +syphilophobic +syphilopsychosis +syphilosis +syphilous +Syracusan +syre +Syriac +Syriacism +Syriacist +Syrian +Syrianic +Syrianism +Syrianize +Syriarch +Syriasm +syringa +syringadenous +syringe +syringeal +syringeful +syringes +syringin +syringitis +syringium +syringocoele +syringomyelia +syringomyelic +syringotome +syringotomy +syrinx +Syriologist +Syrma +syrma +Syrmian +Syrnium +Syrophoenician +syrphian +syrphid +Syrphidae +syrt +syrtic +Syrtis +syrup +syruped +syruper +syruplike +syrupy +Syryenian +syssarcosis +syssel +sysselman +syssiderite +syssitia +syssition +systaltic +systasis +systatic +system +systematic +systematical +systematicality +systematically +systematician +systematicness +systematics +systematism +systematist +systematization +systematize +systematizer +systematology +systemed +systemic +systemically +systemist +systemizable +systemization +systemize +systemizer +systemless +systemproof +systemwise +systilius +systolated +systole +systolic +systyle +systylous +syzygetic +syzygetically +syzygial +syzygium +syzygy +szaibelyite +Szekler +szlachta +szopelka +T +t +ta +taa +Taal +Taalbond +taar +Tab +tab +tabacin +tabacosis +tabacum +tabanid +Tabanidae +tabaniform +tabanuco +Tabanus +tabard +tabarded +tabaret +Tabasco +tabasheer +tabashir +tabaxir +tabbarea +tabber +tabbinet +Tabby +tabby +Tabebuia +tabefaction +tabefy +tabella +Tabellaria +Tabellariaceae +tabellion +taberdar +taberna +tabernacle +tabernacler +tabernacular +Tabernaemontana +tabernariae +tabes +tabescence +tabescent +tabet +tabetic +tabetiform +tabetless +tabic +tabid +tabidly +tabidness +tabific +tabifical +tabinet +Tabira +Tabitha +tabitude +tabla +tablature +table +tableau +tableaux +tablecloth +tableclothwise +tableclothy +tabled +tablefellow +tablefellowship +tableful +tableity +tableland +tableless +tablelike +tablemaid +tablemaker +tablemaking +tableman +tablemate +tabler +tables +tablespoon +tablespoonful +tablet +tabletary +tableware +tablewise +tabling +tablinum +Tabloid +tabloid +tabog +taboo +tabooism +tabooist +taboot +taboparalysis +taboparesis +taboparetic +tabophobia +tabor +taborer +taboret +taborin +Taborite +tabour +tabourer +tabouret +tabret +Tabriz +tabu +tabula +tabulable +tabular +tabulare +tabularium +tabularization +tabularize +tabularly +tabulary +Tabulata +tabulate +tabulated +tabulation +tabulator +tabulatory +tabule +tabuliform +tabut +tacahout +tacamahac +Tacana +Tacanan +Tacca +Taccaceae +taccaceous +taccada +tach +Tachardia +Tachardiinae +tache +tacheless +tacheography +tacheometer +tacheometric +tacheometry +tacheture +tachhydrite +tachibana +Tachina +Tachinaria +tachinarian +tachinid +Tachinidae +tachiol +tachistoscope +tachistoscopic +tachogram +tachograph +tachometer +tachometry +tachoscope +tachycardia +tachycardiac +tachygen +tachygenesis +tachygenetic +tachygenic +tachyglossal +tachyglossate +Tachyglossidae +Tachyglossus +tachygraph +tachygrapher +tachygraphic +tachygraphical +tachygraphically +tachygraphist +tachygraphometer +tachygraphometry +tachygraphy +tachyhydrite +tachyiatry +tachylalia +tachylite +tachylyte +tachylytic +tachymeter +tachymetric +tachymetry +tachyphagia +tachyphasia +tachyphemia +tachyphrasia +tachyphrenia +tachypnea +tachyscope +tachyseism +tachysterol +tachysystole +tachythanatous +tachytomy +tachytype +tacit +Tacitean +tacitly +tacitness +taciturn +taciturnist +taciturnity +taciturnly +tack +tacker +tacket +tackety +tackey +tackiness +tacking +tackingly +tackle +tackled +tackleless +tackleman +tackler +tackless +tackling +tackproof +tacksman +tacky +taclocus +tacmahack +tacnode +Taconian +Taconic +taconite +tacso +Tacsonia +tact +tactable +tactful +tactfully +tactfulness +tactic +tactical +tactically +tactician +tactics +tactile +tactilist +tactility +tactilogical +tactinvariant +taction +tactite +tactive +tactless +tactlessly +tactlessness +tactometer +tactor +tactosol +tactual +tactualist +tactuality +tactually +tactus +tacuacine +Taculli +Tad +tad +tade +Tadjik +Tadousac +tadpole +tadpoledom +tadpolehood +tadpolelike +tadpolism +tae +tael +taen +taenia +taeniacidal +taeniacide +Taeniada +taeniafuge +taenial +taenian +taeniasis +Taeniata +taeniate +taenicide +Taenidia +taenidium +taeniform +taenifuge +taeniiform +Taeniobranchia +taeniobranchiate +Taeniodonta +Taeniodontia +Taeniodontidae +Taenioglossa +taenioglossate +taenioid +taeniosome +Taeniosomi +taeniosomous +taenite +taennin +Taetsia +taffarel +tafferel +taffeta +taffety +taffle +taffrail +Taffy +taffy +taffylike +taffymaker +taffymaking +taffywise +tafia +tafinagh +taft +tafwiz +tag +Tagabilis +Tagakaolo +Tagal +Tagala +Tagalize +Tagalo +Tagalog +tagasaste +Tagassu +Tagassuidae +tagatose +Tagaur +Tagbanua +tagboard +Tagetes +tagetol +tagetone +tagged +tagger +taggle +taggy +Taghlik +tagilite +Tagish +taglet +Tagliacotian +Tagliacozzian +taglike +taglock +tagrag +tagraggery +tagsore +tagtail +tagua +taguan +Tagula +tagwerk +taha +Tahami +taheen +tahil +tahin +Tahiti +Tahitian +tahkhana +Tahltan +tahr +tahseeldar +tahsil +tahsildar +tahua +Tai +tai +taiaha +taich +taiga +taigle +taiglesome +taihoa +taikhana +tail +tailage +tailband +tailboard +tailed +tailender +tailer +tailet +tailfirst +tailflower +tailforemost +tailge +tailhead +tailing +tailings +taille +tailless +taillessly +taillessness +taillie +taillight +taillike +tailor +tailorage +tailorbird +tailorcraft +tailordom +tailoress +tailorhood +tailoring +tailorism +tailorization +tailorize +tailorless +tailorlike +tailorly +tailorman +tailorship +tailorwise +tailory +tailpiece +tailpin +tailpipe +tailrace +tailsman +tailstock +Tailte +tailward +tailwards +tailwise +taily +tailzee +tailzie +taimen +taimyrite +tain +Tainan +Taino +taint +taintable +taintless +taintlessly +taintlessness +taintment +taintor +taintproof +tainture +taintworm +Tainui +taipan +Taipi +Taiping +taipo +tairge +tairger +tairn +taisch +taise +Taisho +taissle +taistrel +taistril +tait +taiver +taivers +taivert +Taiwanhemp +Taiyal +taj +Tajik +takable +takamaka +takar +take +takedown +takedownable +takeful +Takelma +taken +taker +Takhaar +Takhtadjy +Takilman +takin +taking +takingly +takingness +takings +Takitumu +takosis +takt +Taku +taky +takyr +tal +tala +talabon +talahib +Talaing +talaje +talak +talalgia +Talamanca +Talamancan +talanton +talao +talapoin +talar +talari +talaria +talaric +talayot +talbot +talbotype +talc +talcer +Talcher +talcky +talclike +talcochlorite +talcoid +talcomicaceous +talcose +talcous +talcum +tald +tale +talebearer +talebearing +talebook +talecarrier +talecarrying +taled +taleful +Talegallinae +Talegallus +talemaster +talemonger +talemongering +talent +talented +talentless +talepyet +taler +tales +talesman +taleteller +taletelling +tali +Taliacotian +taliage +taliation +taliera +taligrade +Talinum +talion +talionic +talipat +taliped +talipedic +talipes +talipomanus +talipot +talis +talisay +Talishi +talisman +talismanic +talismanical +talismanically +talismanist +talite +Talitha +talitol +talk +talkability +talkable +talkathon +talkative +talkatively +talkativeness +talker +talkfest +talkful +talkie +talkiness +talking +talkworthy +talky +tall +tallage +tallageability +tallageable +tallboy +tallegalane +taller +tallero +talles +tallet +talliable +talliage +talliar +talliate +tallier +tallis +tallish +tallit +tallith +tallness +talloel +tallote +tallow +tallowberry +tallower +tallowiness +tallowing +tallowish +tallowlike +tallowmaker +tallowmaking +tallowman +tallowroot +tallowweed +tallowwood +tallowy +tallwood +tally +tallyho +tallyman +tallymanship +tallywag +tallywalka +tallywoman +talma +talmouse +Talmud +Talmudic +Talmudical +Talmudism +Talmudist +Talmudistic +Talmudistical +Talmudization +Talmudize +talocalcaneal +talocalcanean +talocrural +talofibular +talon +talonavicular +taloned +talonic +talonid +taloscaphoid +talose +talotibial +Talpa +talpacoti +talpatate +talpetate +talpicide +talpid +Talpidae +talpiform +talpify +talpine +talpoid +talthib +Taltushtuntude +Taluche +Taluhet +taluk +taluka +talukdar +talukdari +talus +taluto +talwar +talwood +Talyshin +tam +Tama +tamability +tamable +tamableness +tamably +Tamaceae +Tamachek +tamacoare +tamale +Tamanac +Tamanaca +Tamanaco +tamandu +tamandua +tamanoas +tamanoir +tamanowus +tamanu +Tamara +tamara +tamarack +tamaraite +tamarao +Tamaricaceae +tamaricaceous +tamarin +tamarind +Tamarindus +tamarisk +Tamarix +Tamaroa +tamas +tamasha +Tamashek +Tamaulipecan +tambac +tambaroora +tamber +tambo +tamboo +Tambookie +tambookie +tambor +Tambouki +tambour +tamboura +tambourer +tambouret +tambourgi +tambourin +tambourinade +tambourine +tambourist +tambreet +Tambuki +tamburan +tamburello +Tame +tame +tamehearted +tameheartedness +tamein +tameless +tamelessly +tamelessness +tamely +tameness +tamer +Tamerlanism +Tamias +tamidine +Tamil +Tamilian +Tamilic +tamis +tamise +tamlung +Tammanial +Tammanize +Tammany +Tammanyism +Tammanyite +Tammanyize +tammie +tammock +tammy +Tamonea +Tamoyo +tamp +tampala +tampan +tampang +tamper +tamperer +tamperproof +tampin +tamping +tampion +tampioned +tampon +tamponade +tamponage +tamponment +tampoon +Tamul +Tamulian +Tamulic +Tamus +Tamworth +Tamzine +tan +tana +tanacetin +tanacetone +Tanacetum +tanacetyl +tanach +tanager +Tanagra +Tanagraean +Tanagridae +tanagrine +tanagroid +Tanaidacea +tanaist +tanak +Tanala +tanan +tanbark +tanbur +tancel +Tanchelmian +tanchoir +tandan +tandem +tandemer +tandemist +tandemize +tandemwise +tandle +tandour +tane +tanekaha +Tang +tang +tanga +Tangaloa +tangalung +tangantangan +Tangaridae +Tangaroa +Tangaroan +tanged +tangeite +tangelo +tangence +tangency +tangent +tangental +tangentally +tangential +tangentiality +tangentially +tangently +tanger +Tangerine +tangfish +tangham +tanghan +tanghin +Tanghinia +tanghinin +tangi +tangibile +tangibility +tangible +tangibleness +tangibly +tangie +Tangier +tangilin +Tangipahoa +tangka +tanglad +tangle +tangleberry +tanglefish +tanglefoot +tanglement +tangleproof +tangler +tangleroot +tanglesome +tangless +tanglewrack +tangling +tanglingly +tangly +tango +tangoreceptor +tangram +tangs +tangue +tanguile +tangum +tangun +Tangut +tangy +tanh +tanha +tanhouse +tania +tanica +tanier +tanist +tanistic +tanistry +tanistship +Tanite +Tanitic +tanjib +tanjong +tank +tanka +tankage +tankah +tankard +tanked +tanker +tankerabogus +tankert +tankette +tankful +tankle +tankless +tanklike +tankmaker +tankmaking +tankman +tankodrome +tankroom +tankwise +tanling +tannable +tannage +tannaic +tannaim +tannaitic +tannalbin +tannase +tannate +tanned +tanner +tannery +tannic +tannide +tanniferous +tannin +tannined +tanning +tanninlike +tannocaffeic +tannogallate +tannogallic +tannogelatin +tannogen +tannoid +tannometer +tannyl +Tano +tanoa +Tanoan +tanproof +tanquam +Tanquelinian +tanquen +tanrec +tanstuff +tansy +tantadlin +tantafflin +tantalate +Tantalean +Tantalian +Tantalic +tantalic +tantaliferous +tantalifluoride +tantalite +tantalization +tantalize +tantalizer +tantalizingly +tantalizingness +tantalofluoride +tantalum +Tantalus +tantamount +tantara +tantarabobus +tantarara +tanti +tantivy +tantle +Tantony +tantra +tantric +tantrik +tantrism +tantrist +tantrum +tantum +tanwood +tanworks +tanyard +Tanyoan +Tanystomata +tanystomatous +tanystome +tanzeb +tanzib +Tanzine +tanzy +tao +Taoism +Taoist +Taoistic +Taonurus +Taos +taotai +taoyin +tap +Tapa +tapa +Tapachula +Tapachulteca +tapacolo +tapaculo +Tapacura +tapadera +tapadero +Tapajo +tapalo +tapamaker +tapamaking +tapas +tapasvi +Tape +tape +Tapeats +tapeinocephalic +tapeinocephalism +tapeinocephaly +tapeless +tapelike +tapeline +tapemaker +tapemaking +tapeman +tapen +taper +taperbearer +tapered +taperer +tapering +taperingly +taperly +tapermaker +tapermaking +taperness +taperwise +tapesium +tapestring +tapestry +tapestrylike +tapet +tapetal +tapete +tapeti +tapetless +tapetum +tapework +tapeworm +taphephobia +taphole +taphouse +Taphria +Taphrina +Taphrinaceae +tapia +Tapijulapane +tapinceophalism +tapinocephalic +tapinocephaly +Tapinoma +tapinophobia +tapinophoby +tapinosis +tapioca +tapir +Tapiridae +tapiridian +tapirine +Tapiro +tapiroid +Tapirus +tapis +tapism +tapist +taplash +taplet +Tapleyism +tapmost +tapnet +tapoa +Taposa +tapoun +tappa +tappable +tappableness +tappall +tappaul +tappen +tapper +tapperer +Tappertitian +tappet +tappietoorie +tapping +tappoon +Taprobane +taproom +taproot +taprooted +taps +tapster +tapsterlike +tapsterly +tapstress +tapu +tapul +Tapuya +Tapuyan +Tapuyo +taqua +tar +tara +tarabooka +taraf +tarafdar +tarage +Tarahumar +Tarahumara +Tarahumare +Tarahumari +Tarai +tarairi +tarakihi +Taraktogenos +taramellite +Taramembe +Taranchi +tarand +Tarandean +Tarandian +tarantara +tarantass +tarantella +tarantism +tarantist +tarantula +tarantular +tarantulary +tarantulated +tarantulid +Tarantulidae +tarantulism +tarantulite +tarantulous +tarapatch +taraph +tarapin +Tarapon +Tarasc +Tarascan +Tarasco +tarassis +tarata +taratah +taratantara +taratantarize +tarau +taraxacerin +taraxacin +Taraxacum +Tarazed +tarbadillo +tarbet +tarboard +tarbogan +tarboggin +tarboosh +tarbooshed +tarboy +tarbrush +tarbush +tarbuttite +Tardenoisian +Tardigrada +tardigrade +tardigradous +tardily +tardiness +tarditude +tardive +tardle +tardy +tare +tarea +tarefa +tarefitch +tarentala +tarente +Tarentine +tarentism +tarentola +tarepatch +tarfa +tarflower +targe +targeman +targer +target +targeted +targeteer +targetlike +targetman +Targum +Targumic +Targumical +Targumist +Targumistic +Targumize +Tarheel +Tarheeler +tarhood +tari +Tariana +tarie +tariff +tariffable +tariffication +tariffism +tariffist +tariffite +tariffize +tariffless +tarin +Tariri +tariric +taririnic +tarish +Tarkalani +Tarkani +tarkashi +tarkeean +tarkhan +tarlatan +tarlataned +tarletan +tarlike +tarltonize +Tarmac +tarmac +tarman +tarmined +tarn +tarnal +tarnally +tarnation +tarnish +tarnishable +tarnisher +tarnishment +tarnishproof +tarnlike +tarnside +taro +taroc +tarocco +tarok +taropatch +tarot +tarp +tarpan +tarpaulin +tarpaulinmaker +Tarpeia +Tarpeian +tarpon +tarpot +tarpum +Tarquin +Tarquinish +tarr +tarrack +tarradiddle +tarradiddler +tarragon +tarragona +tarras +tarrass +Tarrateen +Tarratine +tarred +tarrer +tarri +tarriance +tarrie +tarrier +tarrify +tarrily +tarriness +tarrish +tarrock +tarrow +tarry +tarrying +tarryingly +tarryingness +tars +tarsadenitis +tarsal +tarsale +tarsalgia +tarse +tarsectomy +tarsectopia +tarsi +tarsia +tarsier +Tarsiidae +tarsioid +Tarsipedidae +Tarsipedinae +Tarsipes +tarsitis +Tarsius +tarsochiloplasty +tarsoclasis +tarsomalacia +tarsome +tarsometatarsal +tarsometatarsus +tarsonemid +Tarsonemidae +Tarsonemus +tarsophalangeal +tarsophyma +tarsoplasia +tarsoplasty +tarsoptosis +tarsorrhaphy +tarsotarsal +tarsotibal +tarsotomy +tarsus +tart +tartago +Tartan +tartan +tartana +tartane +Tartar +tartar +tartarated +Tartarean +Tartareous +tartareous +tartaret +Tartarian +Tartaric +tartaric +Tartarin +tartarish +Tartarism +Tartarization +tartarization +Tartarize +tartarize +Tartarized +Tartarlike +tartarly +Tartarology +tartarous +tartarproof +tartarum +Tartarus +Tartary +tartemorion +tarten +tartish +tartishly +tartle +tartlet +tartly +tartness +tartramate +tartramic +tartramide +tartrate +tartrated +tartratoferric +tartrazine +tartrazinic +tartro +tartronate +tartronic +tartronyl +tartronylurea +tartrous +tartryl +tartrylic +Tartufe +tartufery +tartufian +tartufish +tartufishly +tartufism +tartwoman +Taruma +Tarumari +tarve +Tarvia +tarweed +tarwhine +tarwood +tarworks +taryard +Taryba +Tarzan +Tarzanish +tasajo +tascal +tasco +taseometer +tash +tasheriff +tashie +tashlik +Tashnagist +Tashnakist +tashreef +tashrif +Tasian +tasimeter +tasimetric +tasimetry +task +taskage +tasker +taskit +taskless +tasklike +taskmaster +taskmastership +taskmistress +tasksetter +tasksetting +taskwork +taslet +Tasmanian +tasmanite +Tass +tass +tassago +tassah +tassal +tassard +tasse +tassel +tasseler +tasselet +tasselfish +tassellus +tasselmaker +tasselmaking +tassely +tasser +tasset +tassie +tassoo +tastable +tastableness +tastably +taste +tasteable +tasteableness +tasteably +tasted +tasteful +tastefully +tastefulness +tastekin +tasteless +tastelessly +tastelessness +tasten +taster +tastily +tastiness +tasting +tastingly +tasty +tasu +Tat +tat +Tatar +Tatarian +Tataric +Tatarization +Tatarize +Tatary +tataupa +tatbeb +tatchy +tate +tater +Tates +tath +Tatian +Tatianist +tatie +tatinek +tatler +tatou +tatouay +tatpurusha +Tatsanottine +tatsman +tatta +tatter +tatterdemalion +tatterdemalionism +tatterdemalionry +tattered +tatteredly +tatteredness +tatterly +tatterwallop +tattery +tatther +tattied +tatting +tattle +tattlement +tattler +tattlery +tattletale +tattling +tattlingly +tattoo +tattooage +tattooer +tattooing +tattooist +tattooment +tattva +tatty +Tatu +tatu +tatukira +Tatusia +Tatusiidae +tau +Taube +Tauchnitz +taught +taula +Tauli +taum +taun +Taungthu +taunt +taunter +taunting +tauntingly +tauntingness +Taunton +tauntress +taupe +taupo +taupou +taur +tauranga +taurean +Tauri +Taurian +taurian +Tauric +tauric +tauricide +tauricornous +Taurid +Tauridian +tauriferous +tauriform +taurine +Taurini +taurite +taurobolium +tauroboly +taurocephalous +taurocholate +taurocholic +taurocol +taurocolla +Tauroctonus +taurodont +tauroesque +taurokathapsia +taurolatry +tauromachian +tauromachic +tauromachy +tauromorphic +tauromorphous +taurophile +taurophobe +Tauropolos +Taurotragus +Taurus +tauryl +taut +tautaug +tauted +tautegorical +tautegory +tauten +tautirite +tautit +tautly +tautness +tautochrone +tautochronism +tautochronous +tautog +tautologic +tautological +tautologically +tautologicalness +tautologism +tautologist +tautologize +tautologizer +tautologous +tautologously +tautology +tautomer +tautomeral +tautomeric +tautomerism +tautomerizable +tautomerization +tautomerize +tautomery +tautometer +tautometric +tautometrical +tautomorphous +tautonym +tautonymic +tautonymy +tautoousian +tautoousious +tautophonic +tautophonical +tautophony +tautopodic +tautopody +tautosyllabic +tautotype +tautourea +tautousian +tautousious +tautozonal +tautozonality +tav +Tavast +Tavastian +Tave +tave +tavell +taver +tavern +taverner +tavernize +tavernless +tavernlike +tavernly +tavernous +tavernry +tavernwards +tavers +tavert +Tavghi +tavistockite +tavola +tavolatite +Tavy +taw +tawa +tawdered +tawdrily +tawdriness +tawdry +tawer +tawery +Tawgi +tawie +tawite +tawkee +tawkin +tawn +tawney +tawnily +tawniness +tawnle +tawny +tawpi +tawpie +taws +tawse +tawtie +tax +taxability +taxable +taxableness +taxably +Taxaceae +taxaceous +taxameter +taxaspidean +taxation +taxational +taxative +taxatively +taxator +taxeater +taxeating +taxed +taxeme +taxemic +taxeopod +Taxeopoda +taxeopodous +taxeopody +taxer +taxgatherer +taxgathering +taxi +taxiable +taxiarch +taxiauto +taxibus +taxicab +Taxidea +taxidermal +taxidermic +taxidermist +taxidermize +taxidermy +taximan +taximeter +taximetered +taxine +taxing +taxingly +taxinomic +taxinomist +taxinomy +taxiplane +taxis +taxite +taxitic +taxless +taxlessly +taxlessness +taxman +Taxodiaceae +Taxodium +taxodont +taxology +taxometer +taxon +taxonomer +taxonomic +taxonomical +taxonomically +taxonomist +taxonomy +taxor +taxpaid +taxpayer +taxpaying +Taxus +taxwax +taxy +tay +Tayassu +Tayassuidae +tayer +Taygeta +tayir +Taylor +Taylorism +Taylorite +taylorite +Taylorize +tayra +Tayrona +taysaam +tazia +Tcawi +tch +tchai +tcharik +tchast +tche +tcheirek +Tcheka +Tcherkess +tchervonets +tchervonetz +Tchetchentsish +Tchetnitsi +Tchi +tchick +tchu +Tchwi +tck +Td +te +tea +teaberry +teaboard +teabox +teaboy +teacake +teacart +teach +teachability +teachable +teachableness +teachably +teache +teacher +teacherage +teacherdom +teacheress +teacherhood +teacherless +teacherlike +teacherly +teachership +teachery +teaching +teachingly +teachless +teachment +teachy +teacup +teacupful +tead +teadish +teaer +teaey +teagardeny +teagle +Teague +Teagueland +Teaguelander +teahouse +teaish +teaism +teak +teakettle +teakwood +teal +tealeafy +tealery +tealess +teallite +team +teamaker +teamaking +teaman +teameo +teamer +teaming +teamland +teamless +teamman +teammate +teamsman +teamster +teamwise +teamwork +tean +teanal +teap +teapot +teapotful +teapottykin +teapoy +tear +tearable +tearableness +tearably +tearage +tearcat +teardown +teardrop +tearer +tearful +tearfully +tearfulness +tearing +tearless +tearlessly +tearlessness +tearlet +tearlike +tearoom +tearpit +tearproof +tearstain +teart +tearthroat +tearthumb +teary +teasable +teasableness +teasably +tease +teaseable +teaseableness +teaseably +teasehole +teasel +teaseler +teaseller +teasellike +teaselwort +teasement +teaser +teashop +teasiness +teasing +teasingly +teasler +teaspoon +teaspoonful +teasy +teat +teataster +teated +teatfish +teathe +teather +teatime +teatlike +teatling +teatman +teaty +teave +teaware +teaze +teazer +tebbet +Tebet +Tebeth +Tebu +tec +Teca +teca +tecali +Tech +tech +techily +techiness +technetium +technic +technica +technical +technicalism +technicalist +technicality +technicalize +technically +technicalness +technician +technicism +technicist +technicological +technicology +Technicolor +technicon +technics +techniphone +technique +techniquer +technism +technist +technocausis +technochemical +technochemistry +technocracy +technocrat +technocratic +technographer +technographic +technographical +technographically +technography +technolithic +technologic +technological +technologically +technologist +technologue +technology +technonomic +technonomy +technopsychology +techous +techy +teck +Tecla +tecnoctonia +tecnology +Teco +Tecoma +tecomin +tecon +Tecpanec +tectal +tectibranch +Tectibranchia +tectibranchian +Tectibranchiata +tectibranchiate +tectiform +tectocephalic +tectocephaly +tectological +tectology +Tectona +tectonic +tectonics +tectorial +tectorium +Tectosages +tectosphere +tectospinal +Tectospondyli +tectospondylic +tectospondylous +tectrices +tectricial +tectum +tecum +tecuma +Tecuna +ted +Teda +tedder +Teddy +tedescan +tedge +tediosity +tedious +tediously +tediousness +tediousome +tedisome +tedium +tee +teedle +teel +teem +teemer +teemful +teemfulness +teeming +teemingly +teemingness +teemless +teems +teen +teenage +teenet +teens +teensy +teenty +teeny +teer +teerer +teest +Teeswater +teet +teetaller +teetan +teeter +teeterboard +teeterer +teetertail +teeth +teethache +teethbrush +teethe +teethful +teethily +teething +teethless +teethlike +teethridge +teethy +teeting +teetotal +teetotaler +teetotalism +teetotalist +teetotally +teetotum +teetotumism +teetotumize +teetotumwise +teety +teevee +teewhaap +teff +teg +Tegean +Tegeticula +tegmen +tegmental +tegmentum +tegmina +tegminal +Tegmine +tegua +teguexin +Teguima +tegula +tegular +tegularly +tegulated +tegumen +tegument +tegumental +tegumentary +tegumentum +tegurium +Teheran +tehseel +tehseeldar +tehsil +tehsildar +Tehuantepecan +Tehueco +Tehuelche +Tehuelchean +Tehuelet +Teian +teicher +teiglech +Teiidae +teil +teind +teindable +teinder +teinland +teinoscope +teioid +Teiresias +Tejon +tejon +teju +tekiah +Tekintsi +Tekke +tekke +tekken +Tekkintzi +teknonymous +teknonymy +tektite +tekya +telacoustic +telakucha +telamon +telang +telangiectasia +telangiectasis +telangiectasy +telangiectatic +telangiosis +Telanthera +telar +telarian +telary +telautogram +telautograph +telautographic +telautographist +telautography +telautomatic +telautomatically +telautomatics +Telchines +Telchinic +tele +teleanemograph +teleangiectasia +telebarograph +telebarometer +telecast +telecaster +telechemic +telechirograph +telecinematography +telecode +telecommunication +telecryptograph +telectroscope +teledendrion +teledendrite +teledendron +teledu +telega +telegenic +Telegn +telegnosis +telegnostic +telegonic +telegonous +telegony +telegram +telegrammatic +telegrammic +telegraph +telegraphee +telegrapheme +telegrapher +telegraphese +telegraphic +telegraphical +telegraphically +telegraphist +telegraphone +telegraphophone +telegraphoscope +telegraphy +Telegu +telehydrobarometer +Telei +Teleia +teleianthous +teleiosis +telekinematography +telekinesis +telekinetic +telelectric +telelectrograph +telelectroscope +telemanometer +Telemark +telemark +Telembi +telemechanic +telemechanics +telemechanism +telemetacarpal +telemeteorograph +telemeteorographic +telemeteorography +telemeter +telemetric +telemetrical +telemetrist +telemetrograph +telemetrographic +telemetrography +telemetry +telemotor +telencephal +telencephalic +telencephalon +telenergic +telenergy +teleneurite +teleneuron +Telenget +telengiscope +Telenomus +teleobjective +Teleocephali +teleocephalous +Teleoceras +Teleodesmacea +teleodesmacean +teleodesmaceous +teleodont +teleologic +teleological +teleologically +teleologism +teleologist +teleology +teleometer +teleophobia +teleophore +teleophyte +teleoptile +teleorganic +teleoroentgenogram +teleoroentgenography +teleosaur +teleosaurian +Teleosauridae +Teleosaurus +teleost +teleostean +Teleostei +teleosteous +teleostomate +teleostome +Teleostomi +teleostomian +teleostomous +teleotemporal +teleotrocha +teleozoic +teleozoon +telepathic +telepathically +telepathist +telepathize +telepathy +telepheme +telephone +telephoner +telephonic +telephonical +telephonically +telephonist +telephonograph +telephonographic +telephony +telephote +telephoto +telephotograph +telephotographic +telephotography +Telephus +telepicture +teleplasm +teleplasmic +teleplastic +telepost +teleprinter +teleradiophone +teleran +telergic +telergical +telergically +telergy +telescope +telescopic +telescopical +telescopically +telescopiform +telescopist +Telescopium +telescopy +telescriptor +teleseism +teleseismic +teleseismology +teleseme +telesia +telesis +telesmeter +telesomatic +telespectroscope +telestereograph +telestereography +telestereoscope +telesterion +telesthesia +telesthetic +telestial +telestic +telestich +teletactile +teletactor +teletape +teletherapy +telethermogram +telethermograph +telethermometer +telethermometry +telethon +teletopometer +teletranscription +Teletype +teletype +teletyper +teletypesetter +teletypewriter +teletyping +Teleut +teleuto +teleutoform +teleutosorus +teleutospore +teleutosporic +teleutosporiferous +teleview +televiewer +televise +television +televisional +televisionary +televisor +televisual +televocal +televox +telewriter +Telfairia +telfairic +telfer +telferage +telford +telfordize +telharmonic +telharmonium +telharmony +teli +telial +telic +telical +telically +teliferous +Telinga +teliosorus +teliospore +teliosporic +teliosporiferous +teliostage +telium +tell +tellable +tellach +tellee +teller +tellership +telligraph +Tellima +Tellina +Tellinacea +tellinacean +tellinaceous +telling +tellingly +Tellinidae +tellinoid +tellsome +tellt +telltale +telltalely +telltruth +tellural +tellurate +telluret +tellureted +tellurethyl +telluretted +tellurhydric +tellurian +telluric +telluride +telluriferous +tellurion +tellurism +tellurist +tellurite +tellurium +tellurize +telluronium +tellurous +telmatological +telmatology +teloblast +teloblastic +telocentric +telodendrion +telodendron +telodynamic +telokinesis +telolecithal +telolemma +telome +telomic +telomitic +telonism +Teloogoo +Telopea +telophase +telophragma +telopsis +teloptic +telosynapsis +telosynaptic +telosynaptist +teloteropathic +teloteropathically +teloteropathy +Telotremata +telotrematous +telotroch +telotrocha +telotrochal +telotrochous +telotrophic +telotype +telpath +telpher +telpherage +telpherman +telpherway +telson +telsonic +telt +Telugu +telurgy +telyn +Tema +temacha +temalacatl +Teman +teman +Temanite +tembe +temblor +Tembu +temenos +temerarious +temerariously +temerariousness +temeritous +temerity +temerous +temerously +temerousness +temiak +temin +Temiskaming +Temne +Temnospondyli +temnospondylous +temp +Tempe +Tempean +temper +tempera +temperability +temperable +temperably +temperality +temperament +temperamental +temperamentalist +temperamentally +temperamented +temperance +temperate +temperately +temperateness +temperative +temperature +tempered +temperedly +temperedness +temperer +temperish +temperless +tempersome +tempery +tempest +tempestical +tempestive +tempestively +tempestivity +tempestuous +tempestuously +tempestuousness +tempesty +tempi +Templar +templar +templardom +templarism +templarlike +templarlikeness +templary +template +templater +temple +templed +templeful +templeless +templelike +templet +Templetonia +templeward +templize +tempo +tempora +temporal +temporale +temporalism +temporalist +temporality +temporalize +temporally +temporalness +temporalty +temporaneous +temporaneously +temporaneousness +temporarily +temporariness +temporary +temporator +temporization +temporizer +temporizing +temporizingly +temporoalar +temporoauricular +temporocentral +temporocerebellar +temporofacial +temporofrontal +temporohyoid +temporomalar +temporomandibular +temporomastoid +temporomaxillary +temporooccipital +temporoparietal +temporopontine +temporosphenoid +temporosphenoidal +temporozygomatic +tempre +temprely +tempt +temptability +temptable +temptableness +temptation +temptational +temptationless +temptatious +temptatory +tempter +tempting +temptingly +temptingness +temptress +Tempyo +temse +temser +temulence +temulency +temulent +temulentive +temulently +ten +tenability +tenable +tenableness +tenably +tenace +tenacious +tenaciously +tenaciousness +tenacity +tenaculum +tenai +tenaille +tenaillon +Tenaktak +tenancy +tenant +tenantable +tenantableness +tenanter +tenantism +tenantless +tenantlike +tenantry +tenantship +tench +tenchweed +Tencteri +tend +tendance +tendant +tendence +tendency +tendent +tendential +tendentious +tendentiously +tendentiousness +tender +tenderability +tenderable +tenderably +tenderee +tenderer +tenderfoot +tenderfootish +tenderful +tenderfully +tenderheart +tenderhearted +tenderheartedly +tenderheartedness +tenderish +tenderize +tenderling +tenderloin +tenderly +tenderness +tenderometer +tendersome +tendinal +tending +tendingly +tendinitis +tendinous +tendinousness +tendomucoid +tendon +tendonous +tendoplasty +tendosynovitis +tendotome +tendotomy +tendour +tendovaginal +tendovaginitis +tendresse +tendril +tendriled +tendriliferous +tendrillar +tendrilly +tendrilous +tendron +tenebra +Tenebrae +tenebricose +tenebrific +tenebrificate +Tenebrio +tenebrionid +Tenebrionidae +tenebrious +tenebriously +tenebrity +tenebrose +tenebrosity +tenebrous +tenebrously +tenebrousness +tenectomy +tenement +tenemental +tenementary +tenementer +tenementization +tenementize +tenendas +tenendum +tenent +teneral +Teneriffe +tenesmic +tenesmus +tenet +tenfold +tenfoldness +teng +tengere +tengerite +Tenggerese +tengu +teniacidal +teniacide +tenible +Tenino +tenio +tenline +tenmantale +tennantite +tenne +tenner +Tennessean +tennis +tennisdom +tennisy +Tennysonian +Tennysonianism +Tenochtitlan +tenodesis +tenodynia +tenography +tenology +tenomyoplasty +tenomyotomy +tenon +tenonectomy +tenoner +Tenonian +tenonitis +tenonostosis +tenontagra +tenontitis +tenontodynia +tenontography +tenontolemmitis +tenontology +tenontomyoplasty +tenontomyotomy +tenontophyma +tenontoplasty +tenontothecitis +tenontotomy +tenophony +tenophyte +tenoplastic +tenoplasty +tenor +tenorist +tenorister +tenorite +tenorless +tenoroon +tenorrhaphy +tenositis +tenostosis +tenosuture +tenotome +tenotomist +tenotomize +tenotomy +tenovaginitis +tenpence +tenpenny +tenpin +tenrec +Tenrecidae +tense +tenseless +tenselessness +tensely +tenseness +tensibility +tensible +tensibleness +tensibly +tensify +tensile +tensilely +tensileness +tensility +tensimeter +tensiometer +tension +tensional +tensionless +tensity +tensive +tenson +tensor +tent +tentability +tentable +tentacle +tentacled +tentaclelike +tentacula +tentacular +Tentaculata +tentaculate +tentaculated +Tentaculifera +tentaculite +Tentaculites +Tentaculitidae +tentaculocyst +tentaculoid +tentaculum +tentage +tentamen +tentation +tentative +tentatively +tentativeness +tented +tenter +tenterbelly +tenterer +tenterhook +tentful +tenth +tenthly +tenthmeter +tenthredinid +Tenthredinidae +tenthredinoid +Tenthredinoidea +Tenthredo +tentiform +tentigo +tentillum +tention +tentless +tentlet +tentlike +tentmaker +tentmaking +tentmate +tentorial +tentorium +tenture +tentwards +tentwise +tentwork +tentwort +tenty +tenuate +tenues +tenuicostate +tenuifasciate +tenuiflorous +tenuifolious +tenuious +tenuiroster +tenuirostral +tenuirostrate +Tenuirostres +tenuis +tenuistriate +tenuity +tenuous +tenuously +tenuousness +tenure +tenurial +tenurially +teocalli +teopan +teosinte +Teotihuacan +tepache +tepal +Tepanec +Tepecano +tepee +tepefaction +tepefy +Tepehua +Tepehuane +tepetate +Tephillah +tephillin +tephramancy +tephrite +tephritic +tephroite +tephromalacia +tephromyelitic +Tephrosia +tephrosis +tepid +tepidarium +tepidity +tepidly +tepidness +tepomporize +teponaztli +tepor +tequila +Tequistlateca +Tequistlatecan +tera +teraglin +terakihi +teramorphous +terap +teraphim +teras +teratical +teratism +teratoblastoma +teratogenesis +teratogenetic +teratogenic +teratogenous +teratogeny +teratoid +teratological +teratologist +teratology +teratoma +teratomatous +teratoscopy +teratosis +terbia +terbic +terbium +tercel +tercelet +tercentenarian +tercentenarize +tercentenary +tercentennial +tercer +terceron +tercet +terchloride +tercia +tercine +tercio +terdiurnal +terebate +terebella +terebellid +Terebellidae +terebelloid +terebellum +terebene +terebenic +terebenthene +terebic +terebilic +terebinic +terebinth +Terebinthaceae +terebinthial +terebinthian +terebinthic +terebinthina +terebinthinate +terebinthine +terebinthinous +Terebinthus +terebra +terebral +terebrant +Terebrantia +terebrate +terebration +Terebratula +terebratular +terebratulid +Terebratulidae +terebratuliform +terebratuline +terebratulite +terebratuloid +Terebridae +Teredinidae +teredo +terek +Terence +Terentian +terephthalate +terephthalic +Teresian +Teresina +terete +teretial +tereticaudate +teretifolious +teretipronator +teretiscapular +teretiscapularis +teretish +tereu +Tereus +terfez +Terfezia +Terfeziaceae +tergal +tergant +tergeminate +tergeminous +tergiferous +tergite +tergitic +tergiversant +tergiversate +tergiversation +tergiversator +tergiversatory +tergiverse +tergolateral +tergum +terlinguaite +term +terma +termagancy +Termagant +termagant +termagantish +termagantism +termagantly +termage +termatic +termen +termer +Termes +termillenary +termin +terminability +terminable +terminableness +terminably +terminal +Terminalia +Terminaliaceae +terminalization +terminalized +terminally +terminant +terminate +termination +terminational +terminative +terminatively +terminator +terminatory +termine +terminer +termini +terminine +terminism +terminist +terministic +terminize +termino +terminological +terminologically +terminologist +terminology +terminus +termital +termitarium +termitary +termite +termitic +termitid +Termitidae +termitophagous +termitophile +termitophilous +termless +termlessly +termlessness +termly +termolecular +termon +termor +termtime +tern +terna +ternal +ternar +ternariant +ternarious +ternary +ternate +ternately +ternatipinnate +ternatisect +ternatopinnate +terne +terneplate +ternery +ternion +ternize +ternlet +Ternstroemia +Ternstroemiaceae +teroxide +terp +terpadiene +terpane +terpene +terpeneless +terphenyl +terpilene +terpin +terpine +terpinene +terpineol +terpinol +terpinolene +terpodion +Terpsichore +terpsichoreal +terpsichoreally +Terpsichorean +terpsichorean +Terraba +terrace +terraceous +terracer +terracette +terracewards +terracewise +terracework +terraciform +terracing +terraculture +terraefilial +terraefilian +terrage +terrain +terral +terramara +terramare +terrane +terranean +terraneous +Terrapene +terrapin +terraquean +terraqueous +terraqueousness +terrar +terrarium +terrazzo +terrella +terremotive +terrene +terrenely +terreneness +terreplein +terrestrial +terrestrialism +terrestriality +terrestrialize +terrestrially +terrestrialness +terrestricity +terrestrious +terret +terreted +terribility +terrible +terribleness +terribly +terricole +terricoline +terricolous +terrier +terrierlike +terrific +terrifical +terrifically +terrification +terrificly +terrificness +terrifiedly +terrifier +terrify +terrifying +terrifyingly +terrigenous +terrine +Territelae +territelarian +territorial +territorialism +territorialist +territoriality +territorialization +territorialize +territorially +territorian +territoried +territory +terron +terror +terrorful +terrorific +terrorism +terrorist +terroristic +terroristical +terrorization +terrorize +terrorizer +terrorless +terrorproof +terrorsome +Terry +terry +terse +tersely +terseness +tersion +tersulphate +tersulphide +tersulphuret +tertenant +tertia +tertial +tertian +tertiana +tertianship +tertiarian +tertiary +tertiate +tertius +terton +tertrinal +Tertullianism +Tertullianist +teruncius +terutero +tervalence +tervalency +tervalent +tervariant +tervee +terzetto +terzina +terzo +tesack +tesarovitch +teschenite +teschermacherite +teskere +teskeria +Tess +tessara +tessarace +tessaraconter +tessaradecad +tessaraglot +tessaraphthong +tessarescaedecahedron +tessel +tessella +tessellar +tessellate +tessellated +tessellation +tessera +tesseract +tesseradecade +tesseraic +tesseral +Tesserants +tesserarian +tesserate +tesserated +tesseratomic +tesseratomy +tessular +test +testa +testable +Testacea +testacean +testaceography +testaceology +testaceous +testaceousness +testacy +testament +testamental +testamentally +testamentalness +testamentarily +testamentary +testamentate +testamentation +testamentum +testamur +testar +testata +testate +testation +testator +testatorship +testatory +testatrices +testatrix +testatum +teste +tested +testee +tester +testes +testibrachial +testibrachium +testicardinate +testicardine +Testicardines +testicle +testicond +testicular +testiculate +testiculated +testiere +testificate +testification +testificator +testificatory +testifier +testify +testily +testimonial +testimonialist +testimonialization +testimonialize +testimonializer +testimonium +testimony +testiness +testing +testingly +testis +teston +testone +testoon +testor +testosterone +testril +testudinal +Testudinaria +testudinarious +Testudinata +testudinate +testudinated +testudineal +testudineous +Testudinidae +testudinous +testudo +testy +Tesuque +tetanic +tetanical +tetanically +tetaniform +tetanigenous +tetanilla +tetanine +tetanism +tetanization +tetanize +tetanoid +tetanolysin +tetanomotor +tetanospasmin +tetanotoxin +tetanus +tetany +tetarcone +tetarconid +tetard +tetartemorion +tetartocone +tetartoconid +tetartohedral +tetartohedrally +tetartohedrism +tetartohedron +tetartoid +tetartosymmetry +tetch +tetchy +tete +tetel +teterrimous +teth +tethelin +tether +tetherball +tethery +tethydan +Tethys +Teton +tetra +tetraamylose +tetrabasic +tetrabasicity +Tetrabelodon +tetrabelodont +tetrabiblos +tetraborate +tetraboric +tetrabrach +tetrabranch +Tetrabranchia +tetrabranchiate +tetrabromid +tetrabromide +tetrabromo +tetrabromoethane +tetracadactylity +tetracarboxylate +tetracarboxylic +tetracarpellary +tetraceratous +tetracerous +Tetracerus +tetrachical +tetrachlorid +tetrachloride +tetrachloro +tetrachloroethane +tetrachloroethylene +tetrachloromethane +tetrachord +tetrachordal +tetrachordon +tetrachoric +tetrachotomous +tetrachromatic +tetrachromic +tetrachronous +tetracid +tetracoccous +tetracoccus +tetracolic +tetracolon +tetracoral +Tetracoralla +tetracoralline +tetracosane +tetract +tetractinal +tetractine +tetractinellid +Tetractinellida +tetractinellidan +tetractinelline +tetractinose +tetracyclic +tetrad +tetradactyl +tetradactylous +tetradactyly +tetradarchy +tetradecane +tetradecanoic +tetradecapod +Tetradecapoda +tetradecapodan +tetradecapodous +tetradecyl +Tetradesmus +tetradiapason +tetradic +Tetradite +tetradrachma +tetradrachmal +tetradrachmon +tetradymite +Tetradynamia +tetradynamian +tetradynamious +tetradynamous +tetraedron +tetraedrum +tetraethylsilane +tetrafluoride +tetrafolious +tetragamy +tetragenous +tetraglot +tetraglottic +tetragon +tetragonal +tetragonally +tetragonalness +Tetragonia +Tetragoniaceae +tetragonidium +tetragonous +tetragonus +tetragram +tetragrammatic +Tetragrammaton +tetragrammatonic +tetragyn +Tetragynia +tetragynian +tetragynous +tetrahedral +tetrahedrally +tetrahedric +tetrahedrite +tetrahedroid +tetrahedron +tetrahexahedral +tetrahexahedron +tetrahydrate +tetrahydrated +tetrahydric +tetrahydride +tetrahydro +tetrahydroxy +tetraiodid +tetraiodide +tetraiodo +tetraiodophenolphthalein +tetrakaidecahedron +tetraketone +tetrakisazo +tetrakishexahedron +tetralemma +Tetralin +tetralogic +tetralogue +tetralogy +tetralophodont +tetramastia +tetramastigote +Tetramera +tetrameral +tetrameralian +tetrameric +tetramerism +tetramerous +tetrameter +tetramethyl +tetramethylammonium +tetramethylene +tetramethylium +tetramin +tetramine +tetrammine +tetramorph +tetramorphic +tetramorphism +tetramorphous +tetrander +Tetrandria +tetrandrian +tetrandrous +tetrane +tetranitrate +tetranitro +tetranitroaniline +tetranuclear +Tetranychus +Tetrao +Tetraodon +tetraodont +Tetraodontidae +tetraonid +Tetraonidae +Tetraoninae +tetraonine +Tetrapanax +tetrapartite +tetrapetalous +tetraphalangeate +tetrapharmacal +tetrapharmacon +tetraphenol +tetraphony +tetraphosphate +tetraphyllous +tetrapla +tetraplegia +tetrapleuron +tetraploid +tetraploidic +tetraploidy +tetraplous +Tetrapneumona +Tetrapneumones +tetrapneumonian +tetrapneumonous +tetrapod +Tetrapoda +tetrapodic +tetrapody +tetrapolar +tetrapolis +tetrapolitan +tetrapous +tetraprostyle +tetrapteran +tetrapteron +tetrapterous +tetraptote +Tetrapturus +tetraptych +tetrapylon +tetrapyramid +tetrapyrenous +tetraquetrous +tetrarch +tetrarchate +tetrarchic +tetrarchy +tetrasaccharide +tetrasalicylide +tetraselenodont +tetraseme +tetrasemic +tetrasepalous +tetraskelion +tetrasome +tetrasomic +tetrasomy +tetraspermal +tetraspermatous +tetraspermous +tetraspheric +tetrasporange +tetrasporangiate +tetrasporangium +tetraspore +tetrasporic +tetrasporiferous +tetrasporous +tetraster +tetrastich +tetrastichal +tetrastichic +Tetrastichidae +tetrastichous +Tetrastichus +tetrastoon +tetrastyle +tetrastylic +tetrastylos +tetrastylous +tetrasubstituted +tetrasubstitution +tetrasulphide +tetrasyllabic +tetrasyllable +tetrasymmetry +tetrathecal +tetratheism +tetratheite +tetrathionates +tetrathionic +tetratomic +tetratone +tetravalence +tetravalency +tetravalent +tetraxial +tetraxon +Tetraxonia +tetraxonian +tetraxonid +Tetraxonida +tetrazane +tetrazene +tetrazin +tetrazine +tetrazo +tetrazole +tetrazolium +tetrazolyl +tetrazone +tetrazotization +tetrazotize +tetrazyl +tetremimeral +tetrevangelium +tetric +tetrical +tetricity +tetricous +tetrigid +Tetrigidae +tetriodide +Tetrix +tetrobol +tetrobolon +tetrode +Tetrodon +tetrodont +Tetrodontidae +tetrole +tetrolic +tetronic +tetronymal +tetrose +tetroxalate +tetroxide +tetrsyllabical +tetryl +tetrylene +tetter +tetterish +tetterous +tetterwort +tettery +Tettigidae +tettigoniid +Tettigoniidae +tettix +Tetum +Teucer +Teucri +Teucrian +teucrin +Teucrium +teufit +teuk +Teutolatry +Teutomania +Teutomaniac +Teuton +Teutondom +Teutonesque +Teutonia +Teutonic +Teutonically +Teutonicism +Teutonism +Teutonist +Teutonity +Teutonization +Teutonize +Teutonomania +Teutonophobe +Teutonophobia +Teutophil +Teutophile +Teutophilism +Teutophobe +Teutophobia +Teutophobism +teviss +tew +Tewa +tewel +tewer +tewit +tewly +tewsome +Texan +Texas +Texcocan +texguino +text +textarian +textbook +textbookless +textiferous +textile +textilist +textlet +textman +textorial +textrine +textual +textualism +textualist +textuality +textually +textuarist +textuary +textural +texturally +texture +textureless +tez +Tezcatlipoca +Tezcatzoncatl +Tezcucan +tezkere +th +tha +thack +thacker +Thackerayan +Thackerayana +Thackerayesque +thackless +Thai +Thais +thakur +thakurate +thalamencephalic +thalamencephalon +thalami +thalamic +Thalamiflorae +thalamifloral +thalamiflorous +thalamite +thalamium +thalamocele +thalamocoele +thalamocortical +thalamocrural +thalamolenticular +thalamomammillary +thalamopeduncular +Thalamophora +thalamotegmental +thalamotomy +thalamus +Thalarctos +thalassal +Thalassarctos +thalassian +thalassic +thalassinid +Thalassinidea +thalassinidian +thalassinoid +thalassiophyte +thalassiophytous +thalasso +Thalassochelys +thalassocracy +thalassocrat +thalassographer +thalassographic +thalassographical +thalassography +thalassometer +thalassophilous +thalassophobia +thalassotherapy +thalattology +thalenite +thaler +Thalesia +Thalesian +Thalessa +Thalia +Thaliacea +thaliacean +Thalian +Thaliard +Thalictrum +thalli +thallic +thalliferous +thalliform +thalline +thallious +thallium +thallochlore +thallodal +thallogen +thallogenic +thallogenous +thalloid +thallome +Thallophyta +thallophyte +thallophytic +thallose +thallous +thallus +thalposis +thalpotic +thalthan +thameng +Thamesis +Thamnidium +thamnium +thamnophile +Thamnophilinae +thamnophiline +Thamnophilus +Thamnophis +Thamudean +Thamudene +Thamudic +thamuria +Thamus +Thamyras +than +thana +thanadar +thanage +thanan +thanatism +thanatist +thanatobiologic +thanatognomonic +thanatographer +thanatography +thanatoid +thanatological +thanatologist +thanatology +thanatomantic +thanatometer +thanatophidia +thanatophidian +thanatophobe +thanatophobia +thanatophobiac +thanatophoby +thanatopsis +Thanatos +thanatosis +thanatotic +thanatousia +thane +thanedom +thanehood +thaneland +thaneship +thank +thankee +thanker +thankful +thankfully +thankfulness +thankless +thanklessly +thanklessness +thanks +thanksgiver +thanksgiving +thankworthily +thankworthiness +thankworthy +thapes +Thapsia +thapsia +thar +tharf +tharfcake +Thargelion +tharginyah +tharm +Thasian +Thaspium +that +thatch +thatcher +thatching +thatchless +thatchwood +thatchwork +thatchy +thatn +thatness +thats +thaught +Thaumantian +Thaumantias +thaumasite +thaumatogeny +thaumatography +thaumatolatry +thaumatology +thaumatrope +thaumatropical +thaumaturge +thaumaturgia +thaumaturgic +thaumaturgical +thaumaturgics +thaumaturgism +thaumaturgist +thaumaturgy +thaumoscopic +thave +thaw +thawer +thawless +thawn +thawy +the +Thea +Theaceae +theaceous +theah +theandric +theanthropic +theanthropical +theanthropism +theanthropist +theanthropology +theanthropophagy +theanthropos +theanthroposophy +theanthropy +thearchic +thearchy +theasum +theat +theater +theatergoer +theatergoing +theaterless +theaterlike +theaterward +theaterwards +theaterwise +Theatine +theatral +theatric +theatricable +theatrical +theatricalism +theatricality +theatricalization +theatricalize +theatrically +theatricalness +theatricals +theatrician +theatricism +theatricize +theatrics +theatrize +theatrocracy +theatrograph +theatromania +theatromaniac +theatron +theatrophile +theatrophobia +theatrophone +theatrophonic +theatropolis +theatroscope +theatry +theave +theb +Thebaic +Thebaid +thebaine +Thebais +thebaism +Theban +Thebesian +theca +thecae +thecal +Thecamoebae +thecaphore +thecasporal +thecaspore +thecaspored +thecasporous +Thecata +thecate +thecia +thecitis +thecium +Thecla +thecla +theclan +thecodont +thecoglossate +thecoid +Thecoidea +Thecophora +Thecosomata +thecosomatous +thee +theek +theeker +theelin +theelol +Theemim +theer +theet +theetsee +theezan +theft +theftbote +theftdom +theftless +theftproof +theftuous +theftuously +thegether +thegidder +thegither +thegn +thegndom +thegnhood +thegnland +thegnlike +thegnly +thegnship +thegnworthy +theiform +Theileria +theine +theinism +their +theirn +theirs +theirselves +theirsens +theism +theist +theistic +theistical +theistically +thelalgia +Thelemite +thelemite +Thelephora +Thelephoraceae +Theligonaceae +theligonaceous +Theligonum +thelitis +thelium +Thelodontidae +Thelodus +theloncus +thelorrhagia +Thelphusa +thelphusian +Thelphusidae +thelyblast +thelyblastic +thelyotokous +thelyotoky +Thelyphonidae +Thelyphonus +thelyplasty +thelytocia +thelytoky +thelytonic +them +thema +themata +thematic +thematical +thematically +thematist +theme +themeless +themelet +themer +Themis +themis +Themistian +themsel +themselves +then +thenabouts +thenadays +thenal +thenar +thenardite +thence +thenceafter +thenceforth +thenceforward +thenceforwards +thencefrom +thenceward +thenness +theoanthropomorphic +theoanthropomorphism +theoastrological +Theobald +Theobroma +theobromic +theobromine +theocentric +theocentricism +theocentrism +theochristic +theocollectivism +theocollectivist +theocracy +theocrasia +theocrasical +theocrasy +theocrat +theocratic +theocratical +theocratically +theocratist +Theocritan +Theocritean +theodemocracy +theodicaea +theodicean +theodicy +theodidact +theodolite +theodolitic +Theodora +Theodore +Theodoric +Theodosia +Theodosian +Theodotian +theodrama +theody +theogamy +theogeological +theognostic +theogonal +theogonic +theogonism +theogonist +theogony +theohuman +theokrasia +theoktonic +theoktony +theolatrous +theolatry +theolepsy +theoleptic +theologal +theologaster +theologastric +theologate +theologeion +theologer +theologi +theologian +theologic +theological +theologically +theologician +theologicoastronomical +theologicoethical +theologicohistorical +theologicometaphysical +theologicomilitary +theologicomoral +theologiconatural +theologicopolitical +theologics +theologism +theologist +theologium +theologization +theologize +theologizer +theologoumena +theologoumenon +theologue +theologus +theology +theomachia +theomachist +theomachy +theomammomist +theomancy +theomania +theomaniac +theomantic +theomastix +theomicrist +theomisanthropist +theomorphic +theomorphism +theomorphize +theomythologer +theomythology +theonomy +theopantism +Theopaschist +Theopaschitally +Theopaschite +Theopaschitic +Theopaschitism +theopathetic +theopathic +theopathy +theophagic +theophagite +theophagous +theophagy +Theophania +theophania +theophanic +theophanism +theophanous +theophany +Theophila +theophilanthrope +theophilanthropic +theophilanthropism +theophilanthropist +theophilanthropy +theophile +theophilist +theophilosophic +Theophilus +theophobia +theophoric +theophorous +Theophrastaceae +theophrastaceous +Theophrastan +Theophrastean +theophylline +theophysical +theopneust +theopneusted +theopneustia +theopneustic +theopneusty +theopolitician +theopolitics +theopolity +theopsychism +theorbist +theorbo +theorem +theorematic +theorematical +theorematically +theorematist +theoremic +theoretic +theoretical +theoreticalism +theoretically +theoretician +theoreticopractical +theoretics +theoria +theoriai +theoric +theorical +theorically +theorician +theoricon +theorics +theorism +theorist +theorization +theorize +theorizer +theorum +theory +theoryless +theorymonger +theosoph +theosopheme +theosophic +theosophical +theosophically +theosophism +theosophist +theosophistic +theosophistical +theosophize +theosophy +theotechnic +theotechnist +theotechny +theoteleological +theoteleology +theotherapy +Theotokos +theow +theowdom +theowman +Theraean +theralite +therapeusis +Therapeutae +Therapeutic +therapeutic +therapeutical +therapeutically +therapeutics +therapeutism +therapeutist +Theraphosa +theraphose +theraphosid +Theraphosidae +theraphosoid +therapist +therapsid +Therapsida +therapy +therblig +there +thereabouts +thereabove +thereacross +thereafter +thereafterward +thereagainst +thereamong +thereamongst +thereanent +thereanents +therearound +thereas +thereat +thereaway +thereaways +therebeside +therebesides +therebetween +thereby +thereckly +therefor +therefore +therefrom +therehence +therein +thereinafter +thereinbefore +thereinto +therence +thereness +thereof +thereoid +thereologist +thereology +thereon +thereout +thereover +thereright +theres +Theresa +therese +therethrough +theretill +thereto +theretofore +theretoward +thereunder +thereuntil +thereunto +thereup +thereupon +Thereva +therevid +Therevidae +therewhile +therewith +therewithal +therewithin +Theria +theriac +theriaca +theriacal +therial +therianthropic +therianthropism +theriatrics +theridiid +Theridiidae +Theridion +theriodic +theriodont +Theriodonta +Theriodontia +theriolatry +theriomancy +theriomaniac +theriomimicry +theriomorph +theriomorphic +theriomorphism +theriomorphosis +theriomorphous +theriotheism +theriotrophical +theriozoic +therm +thermacogenesis +thermae +thermal +thermalgesia +thermality +thermally +thermanalgesia +thermanesthesia +thermantic +thermantidote +thermatologic +thermatologist +thermatology +thermesthesia +thermesthesiometer +thermetograph +thermetrograph +thermic +thermically +Thermidorian +thermion +thermionic +thermionically +thermionics +thermistor +Thermit +thermit +thermite +thermo +thermoammeter +thermoanalgesia +thermoanesthesia +thermobarograph +thermobarometer +thermobattery +thermocautery +thermochemic +thermochemical +thermochemically +thermochemist +thermochemistry +thermochroic +thermochrosy +thermocline +thermocouple +thermocurrent +thermodiffusion +thermoduric +thermodynamic +thermodynamical +thermodynamically +thermodynamician +thermodynamicist +thermodynamics +thermodynamist +thermoelectric +thermoelectrical +thermoelectrically +thermoelectricity +thermoelectrometer +thermoelectromotive +thermoelement +thermoesthesia +thermoexcitory +thermogalvanometer +thermogen +thermogenerator +thermogenesis +thermogenetic +thermogenic +thermogenous +thermogeny +thermogeographical +thermogeography +thermogram +thermograph +thermography +thermohyperesthesia +thermojunction +thermokinematics +thermolabile +thermolability +thermological +thermology +thermoluminescence +thermoluminescent +thermolysis +thermolytic +thermolyze +thermomagnetic +thermomagnetism +thermometamorphic +thermometamorphism +thermometer +thermometerize +thermometric +thermometrical +thermometrically +thermometrograph +thermometry +thermomotive +thermomotor +thermomultiplier +thermonastic +thermonasty +thermonatrite +thermoneurosis +thermoneutrality +thermonous +thermonuclear +thermopair +thermopalpation +thermopenetration +thermoperiod +thermoperiodic +thermoperiodicity +thermoperiodism +thermophile +thermophilic +thermophilous +thermophobous +thermophone +thermophore +thermophosphor +thermophosphorescence +thermopile +thermoplastic +thermoplasticity +thermoplegia +thermopleion +thermopolymerization +thermopolypnea +thermopolypneic +Thermopsis +thermoradiotherapy +thermoreduction +thermoregulation +thermoregulator +thermoresistance +thermoresistant +thermos +thermoscope +thermoscopic +thermoscopical +thermoscopically +thermosetting +thermosiphon +thermostability +thermostable +thermostat +thermostatic +thermostatically +thermostatics +thermostimulation +thermosynthesis +thermosystaltic +thermosystaltism +thermotactic +thermotank +thermotaxic +thermotaxis +thermotelephone +thermotensile +thermotension +thermotherapeutics +thermotherapy +thermotic +thermotical +thermotically +thermotics +thermotropic +thermotropism +thermotropy +thermotype +thermotypic +thermotypy +thermovoltaic +therodont +theroid +therolatry +therologic +therological +therologist +therology +Theromora +Theromores +theromorph +Theromorpha +theromorphia +theromorphic +theromorphism +theromorphological +theromorphology +theromorphous +Theron +theropod +Theropoda +theropodous +thersitean +Thersites +thersitical +thesauri +thesaurus +these +Thesean +theses +Theseum +Theseus +thesial +thesicle +thesis +Thesium +Thesmophoria +Thesmophorian +Thesmophoric +thesmothetae +thesmothete +thesmothetes +thesocyte +Thespesia +Thespesius +Thespian +Thessalian +Thessalonian +thestreen +theta +thetch +thetic +thetical +thetically +thetics +thetin +thetine +Thetis +theurgic +theurgical +theurgically +theurgist +theurgy +Thevetia +thevetin +thew +thewed +thewless +thewness +thewy +they +theyll +theyre +thiacetic +thiadiazole +thialdine +thiamide +thiamin +thiamine +thianthrene +thiasi +thiasine +thiasite +thiasoi +thiasos +thiasote +thiasus +thiazine +thiazole +thiazoline +thick +thickbrained +thicken +thickener +thickening +thicket +thicketed +thicketful +thickety +thickhead +thickheaded +thickheadedly +thickheadedness +thickish +thickleaf +thicklips +thickly +thickneck +thickness +thicknessing +thickset +thickskin +thickskull +thickskulled +thickwind +thickwit +thief +thiefcraft +thiefdom +thiefland +thiefmaker +thiefmaking +thiefproof +thieftaker +thiefwise +Thielavia +Thielaviopsis +thienone +thienyl +thievable +thieve +thieveless +thiever +thievery +thieving +thievingly +thievish +thievishly +thievishness +thig +thigger +thigging +thigh +thighbone +thighed +thight +thightness +thigmonegative +thigmopositive +thigmotactic +thigmotactically +thigmotaxis +thigmotropic +thigmotropically +thigmotropism +Thilanottine +thilk +thill +thiller +thilly +thimber +thimble +thimbleberry +thimbled +thimbleflower +thimbleful +thimblelike +thimblemaker +thimblemaking +thimbleman +thimblerig +thimblerigger +thimbleriggery +thimblerigging +thimbleweed +thin +thinbrained +thine +thing +thingal +thingamabob +thinghood +thinginess +thingish +thingless +thinglet +thinglike +thinglikeness +thingliness +thingly +thingman +thingness +thingstead +thingum +thingumajig +thingumbob +thingummy +thingy +think +thinkable +thinkableness +thinkably +thinker +thinkful +thinking +thinkingly +thinkingpart +thinkling +thinly +thinner +thinness +thinning +thinnish +Thinocoridae +Thinocorus +thinolite +thio +thioacetal +thioacetic +thioalcohol +thioaldehyde +thioamide +thioantimonate +thioantimoniate +thioantimonious +thioantimonite +thioarsenate +thioarseniate +thioarsenic +thioarsenious +thioarsenite +Thiobacillus +Thiobacteria +thiobacteria +Thiobacteriales +thiobismuthite +thiocarbamic +thiocarbamide +thiocarbamyl +thiocarbanilide +thiocarbimide +thiocarbonate +thiocarbonic +thiocarbonyl +thiochloride +thiochrome +thiocresol +thiocyanate +thiocyanation +thiocyanic +thiocyanide +thiocyano +thiocyanogen +thiodiazole +thiodiphenylamine +thiofuran +thiofurane +thiofurfuran +thiofurfurane +thiogycolic +thiohydrate +thiohydrolysis +thiohydrolyze +thioindigo +thioketone +thiol +thiolacetic +thiolactic +thiolic +thionamic +thionaphthene +thionate +thionation +thioneine +thionic +thionine +thionitrite +thionium +thionobenzoic +thionthiolic +thionurate +thionyl +thionylamine +thiophen +thiophene +thiophenic +thiophenol +thiophosgene +thiophosphate +thiophosphite +thiophosphoric +thiophosphoryl +thiophthene +thiopyran +thioresorcinol +thiosinamine +Thiospira +thiostannate +thiostannic +thiostannite +thiostannous +thiosulphate +thiosulphonic +thiosulphuric +Thiothrix +thiotolene +thiotungstate +thiotungstic +thiouracil +thiourea +thiourethan +thiourethane +thioxene +thiozone +thiozonide +thir +third +thirdborough +thirdings +thirdling +thirdly +thirdness +thirdsman +thirl +thirlage +thirling +thirst +thirster +thirstful +thirstily +thirstiness +thirsting +thirstingly +thirstland +thirstle +thirstless +thirstlessness +thirstproof +thirsty +thirt +thirteen +thirteener +thirteenfold +thirteenth +thirteenthly +thirtieth +thirty +thirtyfold +thirtyish +this +thishow +thislike +thisn +thisness +thissen +thistle +thistlebird +thistled +thistledown +thistlelike +thistleproof +thistlery +thistlish +thistly +thiswise +thither +thitherto +thitherward +thitsiol +thiuram +thivel +thixle +thixolabile +thixotropic +thixotropy +Thlaspi +Thlingchadinne +Thlinget +thlipsis +Tho +tho +thob +thocht +thof +thoft +thoftfellow +thoke +thokish +thole +tholeiite +tholepin +tholi +tholoi +tholos +tholus +Thomaean +Thomas +Thomasa +Thomasine +thomasing +Thomasite +thomisid +Thomisidae +Thomism +Thomist +Thomistic +Thomistical +Thomite +Thomomys +thomsenolite +Thomsonian +Thomsonianism +thomsonite +thon +thonder +Thondracians +Thondraki +Thondrakians +thone +thong +Thonga +thonged +thongman +thongy +thoo +thooid +thoom +thoracalgia +thoracaorta +thoracectomy +thoracentesis +thoraces +thoracic +Thoracica +thoracical +thoracicoabdominal +thoracicoacromial +thoracicohumeral +thoracicolumbar +thoraciform +thoracispinal +thoracoabdominal +thoracoacromial +thoracobronchotomy +thoracoceloschisis +thoracocentesis +thoracocyllosis +thoracocyrtosis +thoracodelphus +thoracodidymus +thoracodorsal +thoracodynia +thoracogastroschisis +thoracograph +thoracohumeral +thoracolumbar +thoracolysis +thoracomelus +thoracometer +thoracometry +thoracomyodynia +thoracopagus +thoracoplasty +thoracoschisis +thoracoscope +thoracoscopy +Thoracostei +thoracostenosis +thoracostomy +Thoracostraca +thoracostracan +thoracostracous +thoracotomy +thoral +thorascope +thorax +thore +thoria +thorianite +thoriate +thoric +thoriferous +thorina +thorite +thorium +thorn +thornback +thornbill +thornbush +thorned +thornen +thornhead +thornily +thorniness +thornless +thornlessness +thornlet +thornlike +thornproof +thornstone +thorntail +thorny +thoro +thorocopagous +thorogummite +thoron +thorough +Thoroughbred +thoroughbred +thoroughbredness +thoroughfare +thoroughfarer +thoroughfaresome +thoroughfoot +thoroughgoing +thoroughgoingly +thoroughgoingness +thoroughgrowth +thoroughly +thoroughness +thoroughpaced +thoroughpin +thoroughsped +thoroughstem +thoroughstitch +thoroughstitched +thoroughwax +thoroughwort +thorp +thort +thorter +thortveitite +Thos +those +thou +though +thought +thoughted +thoughten +thoughtful +thoughtfully +thoughtfulness +thoughtkin +thoughtless +thoughtlessly +thoughtlessness +thoughtlet +thoughtness +thoughtsick +thoughty +thousand +thousandfold +thousandfoldly +thousandth +thousandweight +thouse +thow +thowel +thowless +thowt +Thraces +Thracian +thrack +thraep +thrail +thrain +thrall +thrallborn +thralldom +thram +thrammle +thrang +thrangity +thranite +thranitic +thrap +thrapple +thrash +thrashel +thrasher +thrasherman +thrashing +thrasonic +thrasonical +thrasonically +thrast +Thraupidae +thrave +thraver +thraw +thrawcrook +thrawn +thrawneen +Thrax +thread +threadbare +threadbareness +threadbarity +threaded +threaden +threader +threadfin +threadfish +threadflower +threadfoot +threadiness +threadle +threadless +threadlet +threadlike +threadmaker +threadmaking +threadway +threadweed +threadworm +thready +threap +threaper +threat +threaten +threatenable +threatener +threatening +threateningly +threatful +threatfully +threatless +threatproof +three +threefold +threefolded +threefoldedness +threefoldly +threefoldness +threeling +threeness +threepence +threepenny +threepennyworth +threescore +threesome +thremmatology +threne +threnetic +threnetical +threnode +threnodial +threnodian +threnodic +threnodical +threnodist +threnody +threnos +threonin +threonine +threose +threpsology +threptic +thresh +threshel +thresher +thresherman +threshingtime +threshold +Threskiornithidae +Threskiornithinae +threw +thribble +thrice +thricecock +thridacium +thrift +thriftbox +thriftily +thriftiness +thriftless +thriftlessly +thriftlessness +thriftlike +thrifty +thrill +thriller +thrillful +thrillfully +thrilling +thrillingly +thrillingness +thrillproof +thrillsome +thrilly +thrimble +thrimp +Thrinax +thring +thrinter +thrioboly +thrip +thripel +Thripidae +thripple +thrips +thrive +thriveless +thriven +thriver +thriving +thrivingly +thrivingness +thro +throat +throatal +throatband +throated +throatful +throatily +throatiness +throating +throatlash +throatlatch +throatless +throatlet +throatroot +throatstrap +throatwort +throaty +throb +throbber +throbbingly +throbless +throck +throdden +throddy +throe +thrombase +thrombin +thromboangiitis +thromboarteritis +thrombocyst +thrombocyte +thrombocytopenia +thrombogen +thrombogenic +thromboid +thrombokinase +thrombolymphangitis +thrombopenia +thrombophlebitis +thromboplastic +thromboplastin +thrombose +thrombosis +thrombostasis +thrombotic +thrombus +thronal +throne +thronedom +throneless +thronelet +thronelike +throneward +throng +thronger +throngful +throngingly +thronize +thropple +throstle +throstlelike +throttle +throttler +throttling +throttlingly +throu +throuch +throucht +through +throughbear +throughbred +throughcome +throughgang +throughganging +throughgoing +throughgrow +throughknow +throughout +throughput +throve +throw +throwaway +throwback +throwdown +thrower +throwing +thrown +throwoff +throwout +throwster +throwwort +thrum +thrummer +thrummers +thrummy +thrumwort +thrush +thrushel +thrushlike +thrushy +thrust +thruster +thrustful +thrustfulness +thrusting +thrustings +thrutch +thrutchings +Thruthvang +thruv +thrymsa +Thryonomys +Thuban +Thucydidean +thud +thudding +thuddingly +thug +thugdom +thuggee +thuggeeism +thuggery +thuggess +thuggish +thuggism +Thuidium +Thuja +thujene +thujin +thujone +Thujopsis +thujyl +Thule +thulia +thulir +thulite +thulium +thulr +thuluth +thumb +thumbbird +thumbed +thumber +thumbkin +thumble +thumbless +thumblike +thumbmark +thumbnail +thumbpiece +thumbprint +thumbrope +thumbscrew +thumbstall +thumbstring +thumbtack +thumby +thumlungur +thump +thumper +thumping +thumpingly +Thunar +Thunbergia +thunbergilene +thunder +thunderation +thunderball +thunderbearer +thunderbearing +thunderbird +thunderblast +thunderbolt +thunderburst +thunderclap +thundercloud +thundercrack +thunderer +thunderfish +thunderflower +thunderful +thunderhead +thunderheaded +thundering +thunderingly +thunderless +thunderlike +thunderous +thunderously +thunderousness +thunderpeal +thunderplump +thunderproof +thundershower +thundersmite +thundersquall +thunderstick +thunderstone +thunderstorm +thunderstrike +thunderstroke +thunderstruck +thunderwood +thunderworm +thunderwort +thundery +thundrous +thundrously +thung +thunge +Thunnidae +Thunnus +Thunor +thuoc +Thurberia +thurible +thuribuler +thuribulum +thurifer +thuriferous +thurificate +thurificati +thurification +thurify +Thuringian +thuringite +Thurio +thurl +thurm +thurmus +Thurnia +Thurniaceae +thurrock +Thursday +thurse +thurt +thus +thusgate +Thushi +thusly +thusness +thuswise +thutter +Thuyopsis +thwack +thwacker +thwacking +thwackingly +thwackstave +thwaite +thwart +thwartedly +thwarteous +thwarter +thwarting +thwartingly +thwartly +thwartman +thwartness +thwartover +thwartsaw +thwartship +thwartships +thwartways +thwartwise +thwite +thwittle +thy +Thyestean +Thyestes +thyine +thylacine +thylacitis +Thylacoleo +Thylacynus +thymacetin +Thymallidae +Thymallus +thymate +thyme +thymectomize +thymectomy +thymegol +Thymelaea +Thymelaeaceae +thymelaeaceous +Thymelaeales +thymelcosis +thymele +thymelic +thymelical +thymelici +thymene +thymetic +thymic +thymicolymphatic +thymine +thymiosis +thymitis +thymocyte +thymogenic +thymol +thymolate +thymolize +thymolphthalein +thymolsulphonephthalein +thymoma +thymonucleic +thymopathy +thymoprivic +thymoprivous +thymopsyche +thymoquinone +thymotactic +thymotic +Thymus +thymus +thymy +thymyl +thymylic +thynnid +Thynnidae +Thyraden +thyratron +thyreoadenitis +thyreoantitoxin +thyreoarytenoid +thyreoarytenoideus +thyreocervical +thyreocolloid +Thyreocoridae +thyreoepiglottic +thyreogenic +thyreogenous +thyreoglobulin +thyreoglossal +thyreohyal +thyreohyoid +thyreoid +thyreoidal +thyreoideal +thyreoidean +thyreoidectomy +thyreoiditis +thyreoitis +thyreolingual +thyreoprotein +thyreosis +thyreotomy +thyreotoxicosis +thyreotropic +thyridial +Thyrididae +thyridium +Thyris +thyrisiferous +thyroadenitis +thyroantitoxin +thyroarytenoid +thyroarytenoideus +thyrocardiac +thyrocele +thyrocervical +thyrocolloid +thyrocricoid +thyroepiglottic +thyroepiglottidean +thyrogenic +thyroglobulin +thyroglossal +thyrohyal +thyrohyoid +thyrohyoidean +thyroid +thyroidal +thyroidea +thyroideal +thyroidean +thyroidectomize +thyroidectomy +thyroidism +thyroiditis +thyroidization +thyroidless +thyroidotomy +thyroiodin +thyrolingual +thyronine +thyroparathyroidectomize +thyroparathyroidectomy +thyroprival +thyroprivia +thyroprivic +thyroprivous +thyroprotein +Thyrostraca +thyrostracan +thyrotherapy +thyrotomy +thyrotoxic +thyrotoxicosis +thyrotropic +thyroxine +thyrse +thyrsiflorous +thyrsiform +thyrsoid +thyrsoidal +thyrsus +Thysanocarpus +thysanopter +Thysanoptera +thysanopteran +thysanopteron +thysanopterous +Thysanoura +thysanouran +thysanourous +Thysanura +thysanuran +thysanurian +thysanuriform +thysanurous +thysel +thyself +thysen +ti +Tiahuanacan +Tiam +tiang +tiao +tiar +tiara +tiaralike +tiarella +Tiatinagua +tib +Tibbie +Tibbu +tibby +Tiberian +Tiberine +Tiberius +tibet +Tibetan +tibey +tibia +tibiad +tibiae +tibial +tibiale +tibicinist +tibiocalcanean +tibiofemoral +tibiofibula +tibiofibular +tibiometatarsal +tibionavicular +tibiopopliteal +tibioscaphoid +tibiotarsal +tibiotarsus +Tibouchina +tibourbou +tiburon +Tiburtine +tic +tical +ticca +tice +ticement +ticer +Tichodroma +tichodrome +tichorrhine +tick +tickbean +tickbird +tickeater +ticked +ticken +ticker +ticket +ticketer +ticketing +ticketless +ticketmonger +tickey +tickicide +tickie +ticking +tickle +tickleback +ticklebrain +tickled +ticklely +ticklenburg +tickleness +tickleproof +tickler +ticklesome +tickless +tickleweed +tickling +ticklingly +ticklish +ticklishly +ticklishness +tickly +tickney +tickproof +tickseed +tickseeded +ticktack +ticktacker +ticktacktoe +ticktick +ticktock +tickweed +ticky +ticul +Ticuna +Ticunan +tid +tidal +tidally +tidbit +tiddle +tiddledywinks +tiddler +tiddley +tiddling +tiddlywink +tiddlywinking +tiddy +tide +tided +tideful +tidehead +tideland +tideless +tidelessness +tidelike +tidely +tidemaker +tidemaking +tidemark +tiderace +tidesman +tidesurveyor +Tideswell +tidewaiter +tidewaitership +tideward +tidewater +tideway +tidiable +tidily +tidiness +tiding +tidingless +tidings +tidley +tidological +tidology +tidy +tidyism +tidytips +tie +tieback +tied +tiemaker +tiemaking +tiemannite +tien +tiepin +tier +tierce +tierced +tierceron +tiered +tierer +tierlike +tiersman +tietick +tiewig +tiewigged +tiff +tiffany +tiffanyite +tiffie +tiffin +tiffish +tiffle +tiffy +tifinagh +tift +tifter +tig +tige +tigella +tigellate +tigelle +tigellum +tigellus +tiger +tigerbird +tigereye +tigerflower +tigerfoot +tigerhearted +tigerhood +tigerish +tigerishly +tigerishness +tigerism +tigerkin +tigerlike +tigerling +tigerly +tigernut +tigerproof +tigerwood +tigery +tigger +tight +tighten +tightener +tightfisted +tightish +tightly +tightness +tightrope +tights +tightwad +tightwire +tiglaldehyde +tiglic +tiglinic +tignum +Tigrai +Tigre +Tigrean +tigress +tigresslike +Tigridia +Tigrina +tigrine +Tigris +tigroid +tigrolysis +tigrolytic +tigtag +Tigua +Tigurine +Tiki +tikitiki +tikka +tikker +tiklin +tikolosh +tikor +tikur +til +tilaite +tilaka +tilasite +tilbury +Tilda +tilde +tile +tiled +tilefish +tilelike +tilemaker +tilemaking +tiler +tileroot +tilery +tileseed +tilestone +tileways +tilework +tileworks +tilewright +tileyard +Tilia +Tiliaceae +tiliaceous +tilikum +tiling +till +tillable +Tillaea +Tillaeastrum +tillage +Tillamook +Tillandsia +tiller +tillering +tillerless +tillerman +Tilletia +Tilletiaceae +tilletiaceous +tilley +tillite +tillodont +Tillodontia +Tillodontidae +tillot +tillotter +tilly +tilmus +tilpah +Tilsit +tilt +tiltable +tiltboard +tilter +tilth +tilting +tiltlike +tiltmaker +tiltmaking +tiltup +tilty +tiltyard +tilyer +Tim +timable +Timaeus +Timalia +Timaliidae +Timaliinae +timaliine +timaline +Timani +timar +timarau +timawa +timazite +timbal +timbale +timbang +timbe +timber +timbered +timberer +timberhead +timbering +timberjack +timberland +timberless +timberlike +timberling +timberman +timbermonger +timbern +timbersome +timbertuned +timberwood +timberwork +timberwright +timbery +timberyard +Timbira +timbo +timbre +timbrel +timbreled +timbreler +timbrologist +timbrology +timbromania +timbromaniac +timbromanist +timbrophilic +timbrophilism +timbrophilist +timbrophily +time +timeable +timecard +timed +timeful +timefully +timefulness +timekeep +timekeeper +timekeepership +timeless +timelessly +timelessness +Timelia +Timeliidae +timeliine +timelily +timeliness +timeling +timely +timenoguy +timeous +timeously +timepiece +timepleaser +timeproof +timer +times +timesaver +timesaving +timeserver +timeserving +timeservingness +timetable +timetaker +timetaking +timeward +timework +timeworker +timeworn +Timias +timid +timidity +timidly +timidness +timing +timish +timist +Timne +timocracy +timocratic +timocratical +Timon +timon +timoneer +Timonian +Timonism +Timonist +Timonize +timor +Timorese +timorous +timorously +timorousness +Timote +Timotean +Timothean +Timothy +timothy +timpani +timpanist +timpano +Timucua +Timucuan +Timuquan +Timuquanan +tin +Tina +Tinamidae +tinamine +tinamou +tinampipi +tincal +tinchel +tinchill +tinclad +tinct +tinction +tinctorial +tinctorially +tinctorious +tinctumutation +tincture +tind +tindal +tindalo +tinder +tinderbox +tindered +tinderish +tinderlike +tinderous +tindery +tine +tinea +tineal +tinean +tined +tinegrass +tineid +Tineidae +Tineina +tineine +tineman +tineoid +Tineoidea +tinetare +tinety +tineweed +tinful +Ting +ting +tinge +tinged +tinger +Tinggian +tingi +tingibility +tingible +tingid +Tingidae +Tingis +tingitid +Tingitidae +tinglass +tingle +tingler +tingletangle +tingling +tinglingly +tinglish +tingly +tingtang +tinguaite +tinguaitic +Tinguian +tinguy +tinhorn +tinhouse +tinily +tininess +tining +tink +tinker +tinkerbird +tinkerdom +tinkerer +tinkerlike +tinkerly +tinkershire +tinkershue +tinkerwise +tinkle +tinkler +tinklerman +tinkling +tinklingly +tinkly +tinlet +tinlike +tinman +Tinne +tinned +tinner +tinnery +tinnet +Tinni +tinnified +tinnily +tinniness +tinning +tinnitus +tinnock +tinny +Tino +Tinoceras +tinosa +tinsel +tinsellike +tinselly +tinselmaker +tinselmaking +tinselry +tinselweaver +tinselwork +tinsman +tinsmith +tinsmithing +tinsmithy +tinstone +tinstuff +tint +tinta +tintage +tintamarre +tintarron +tinted +tinter +tintie +tintiness +tinting +tintingly +tintinnabula +tintinnabulant +tintinnabular +tintinnabulary +tintinnabulate +tintinnabulation +tintinnabulatory +tintinnabulism +tintinnabulist +tintinnabulous +tintinnabulum +tintist +tintless +tintometer +tintometric +tintometry +tinty +tintype +tintyper +tinwald +tinware +tinwoman +tinwork +tinworker +tinworking +tiny +tinzenite +Tionontates +Tionontati +Tiou +tip +tipburn +tipcart +tipcat +tipe +tipful +tiphead +Tiphia +Tiphiidae +tipiti +tiple +tipless +tiplet +tipman +tipmost +tiponi +tippable +tipped +tippee +tipper +tippet +tipping +tipple +tippleman +tippler +tipply +tipproof +tippy +tipsification +tipsifier +tipsify +tipsily +tipsiness +tipstaff +tipster +tipstock +tipsy +tiptail +tipteerer +tiptilt +tiptoe +tiptoeing +tiptoeingly +tiptop +tiptopness +tiptopper +tiptoppish +tiptoppishness +tiptopsome +Tipula +Tipularia +tipulid +Tipulidae +tipuloid +Tipuloidea +tipup +Tipura +tirade +tiralee +tire +tired +tiredly +tiredness +tiredom +tirehouse +tireless +tirelessly +tirelessness +tiremaid +tiremaker +tiremaking +tireman +tirer +tireroom +tiresmith +tiresome +tiresomely +tiresomeness +tiresomeweed +tirewoman +Tirhutia +tiriba +tiring +tiringly +tirl +tirma +tirocinium +Tirolean +Tirolese +Tironian +tirr +tirralirra +tirret +Tirribi +tirrivee +tirrlie +tirrwirr +tirthankara +Tirurai +tirve +tirwit +tisane +tisar +Tishiya +Tishri +Tisiphone +tissual +tissue +tissued +tissueless +tissuelike +tissuey +tisswood +tiswin +tit +Titan +titanate +titanaugite +Titanesque +Titaness +titania +Titanian +Titanic +titanic +Titanical +Titanically +Titanichthyidae +Titanichthys +titaniferous +titanifluoride +Titanism +titanite +titanitic +titanium +Titanlike +titano +titanocolumbate +titanocyanide +titanofluoride +Titanolater +Titanolatry +Titanomachia +Titanomachy +titanomagnetite +titanoniobate +titanosaur +Titanosaurus +titanosilicate +titanothere +Titanotheridae +Titanotherium +titanous +titanyl +titar +titbit +titbitty +tite +titer +titeration +titfish +tithable +tithal +tithe +tithebook +titheless +tithemonger +tithepayer +tither +titheright +tithing +tithingman +tithingpenny +tithonic +tithonicity +tithonographic +tithonometer +Tithymalopsis +Tithymalus +titi +Titian +titian +Titianesque +Titianic +titien +Tities +titilate +titillability +titillant +titillater +titillating +titillatingly +titillation +titillative +titillator +titillatory +titivate +titivation +titivator +titlark +title +titleboard +titled +titledom +titleholder +titleless +titleproof +titler +titleship +titlike +titling +titlist +titmal +titman +Titmarsh +Titmarshian +titmouse +Titoism +Titoist +titoki +titrable +titratable +titrate +titration +titre +titrimetric +titrimetry +titter +titterel +titterer +tittering +titteringly +tittery +tittie +tittle +tittlebat +tittler +tittup +tittupy +titty +tittymouse +titubancy +titubant +titubantly +titubate +titubation +titular +titularity +titularly +titulary +titulation +titule +titulus +Titurel +Titus +tiver +Tivoli +tivoli +tivy +Tiwaz +tiza +tizeur +tizzy +tjanting +tji +tjosite +tlaco +Tlakluit +Tlapallan +Tlascalan +Tlingit +tmema +Tmesipteris +tmesis +to +toa +toad +toadback +toadeat +toadeater +toader +toadery +toadess +toadfish +toadflax +toadflower +toadhead +toadier +toadish +toadless +toadlet +toadlike +toadlikeness +toadling +toadpipe +toadroot +toadship +toadstone +toadstool +toadstoollike +toadwise +toady +toadyish +toadyism +toadyship +Toag +toast +toastable +toastee +toaster +toastiness +toastmaster +toastmastery +toastmistress +toasty +toat +toatoa +Toba +tobacco +tobaccofied +tobaccoism +tobaccoite +tobaccoless +tobaccolike +tobaccoman +tobacconalian +tobacconist +tobacconistical +tobacconize +tobaccophil +tobaccoroot +tobaccoweed +tobaccowood +tobaccoy +tobe +Tobiah +Tobias +Tobikhar +tobine +tobira +toboggan +tobogganeer +tobogganer +tobogganist +Toby +toby +tobyman +tocalote +toccata +Tocharese +Tocharian +Tocharic +Tocharish +tocher +tocherless +tock +toco +Tocobaga +tocodynamometer +tocogenetic +tocogony +tocokinin +tocological +tocologist +tocology +tocome +tocometer +tocopherol +tocororo +tocsin +tocusso +Tod +tod +Toda +today +todayish +todder +toddick +toddite +toddle +toddlekins +toddler +toddy +toddyize +toddyman +tode +Todea +Todidae +Todus +tody +toe +toeboard +toecap +toecapped +toed +toeless +toelike +toellite +toenail +toeplate +toernebohmite +toetoe +toff +toffee +toffeeman +toffing +toffish +toffy +toffyman +Tofieldia +toft +tofter +toftman +toftstead +tofu +tog +toga +togaed +togalike +togata +togate +togated +togawise +together +togetherhood +togetheriness +togetherness +toggel +toggery +toggle +toggler +togless +togs +togt +togue +toher +toheroa +toho +Tohome +tohubohu +tohunga +toi +toil +toiled +toiler +toilet +toileted +toiletry +toilette +toiletted +toiletware +toilful +toilfully +toilinet +toiling +toilingly +toilless +toillessness +toilsome +toilsomely +toilsomeness +toilworn +toise +toit +toitish +toity +Tokay +tokay +toke +Tokelau +token +tokened +tokenless +toko +tokology +tokonoma +tokopat +tol +tolamine +tolan +tolane +tolbooth +told +toldo +tole +Toledan +Toledo +Toledoan +tolerability +tolerable +tolerableness +tolerablish +tolerably +tolerance +tolerancy +tolerant +tolerantism +tolerantly +tolerate +toleration +tolerationism +tolerationist +tolerative +tolerator +tolerism +Toletan +tolfraedic +tolguacha +tolidine +tolite +toll +tollable +tollage +tollbooth +toller +tollery +tollgate +tollgatherer +tollhouse +tolliker +tolling +tollkeeper +tollman +tollmaster +tollpenny +tolltaker +tolly +Tolowa +tolpatch +tolpatchery +tolsester +tolsey +Tolstoyan +Tolstoyism +Tolstoyist +tolt +Toltec +Toltecan +tolter +tolu +tolualdehyde +toluate +toluene +toluic +toluide +toluidide +toluidine +toluidino +toluido +Toluifera +tolunitrile +toluol +toluquinaldine +tolusafranine +toluyl +toluylene +toluylenediamine +toluylic +tolyl +tolylene +tolylenediamine +Tolypeutes +tolypeutine +Tom +Toma +tomahawk +tomahawker +tomalley +toman +tomatillo +tomato +tomb +tombac +tombal +tombe +tombic +tombless +tomblet +tomblike +tombola +tombolo +tomboy +tomboyful +tomboyish +tomboyishly +tomboyishness +tomboyism +tombstone +tomcat +tomcod +tome +tomeful +tomelet +toment +tomentose +tomentous +tomentulose +tomentum +tomfool +tomfoolery +tomfoolish +tomfoolishness +tomial +tomin +tomish +Tomistoma +tomium +tomjohn +Tomkin +tomkin +Tommer +Tomming +Tommy +tommy +tommybag +tommycod +tommyrot +tomnoddy +tomnoup +tomogram +tomographic +tomography +Tomopteridae +Tomopteris +tomorn +tomorrow +tomorrower +tomorrowing +tomorrowness +tomosis +Tompion +tompiper +tompon +tomtate +tomtit +Tomtitmouse +ton +tonal +tonalamatl +tonalist +tonalite +tonalitive +tonality +tonally +tonant +tonation +tondino +tone +toned +toneless +tonelessly +tonelessness +toneme +toneproof +toner +tonetic +tonetically +tonetician +tonetics +tong +Tonga +tonga +Tongan +Tongas +tonger +tongkang +tongman +Tongrian +tongs +tongsman +tongue +tonguecraft +tongued +tonguedoughty +tonguefence +tonguefencer +tongueflower +tongueful +tongueless +tonguelet +tonguelike +tongueman +tonguemanship +tongueplay +tongueproof +tonguer +tongueshot +tonguesman +tonguesore +tonguester +tonguetip +tonguey +tonguiness +tonguing +tonic +tonically +tonicity +tonicize +tonicobalsamic +tonicoclonic +tonicostimulant +tonify +tonight +Tonikan +tonish +tonishly +tonishness +tonite +tonitrocirrus +tonitruant +tonitruone +tonitruous +tonjon +tonk +Tonkawa +Tonkawan +tonkin +Tonkinese +tonlet +Tonna +tonnage +tonneau +tonneaued +tonner +tonnish +tonnishly +tonnishness +tonoclonic +tonogram +tonograph +tonological +tonology +tonometer +tonometric +tonometry +tonophant +tonoplast +tonoscope +tonotactic +tonotaxis +tonous +tonsbergite +tonsil +tonsilectomy +tonsilitic +tonsillar +tonsillary +tonsillectome +tonsillectomic +tonsillectomize +tonsillectomy +tonsillith +tonsillitic +tonsillitis +tonsillolith +tonsillotome +tonsillotomy +tonsilomycosis +tonsor +tonsorial +tonsurate +tonsure +tonsured +tontine +tontiner +Tonto +tonus +Tony +tony +tonyhoop +too +toodle +toodleloodle +took +tooken +tool +toolbox +toolbuilder +toolbuilding +tooler +toolhead +toolholder +toolholding +tooling +toolless +toolmaker +toolmaking +toolman +toolmark +toolmarking +toolplate +toolroom +toolsetter +toolslide +toolsmith +toolstock +toolstone +toom +toomly +toon +Toona +toonwood +toop +toorie +toorock +tooroo +toosh +toot +tooter +tooth +toothache +toothaching +toothachy +toothbill +toothbrush +toothbrushy +toothchiseled +toothcomb +toothcup +toothdrawer +toothdrawing +toothed +toother +toothflower +toothful +toothill +toothing +toothless +toothlessly +toothlessness +toothlet +toothleted +toothlike +toothpick +toothplate +toothproof +toothsome +toothsomely +toothsomeness +toothstick +toothwash +toothwork +toothwort +toothy +tootle +tootler +tootlish +tootsy +toozle +toozoo +top +topalgia +toparch +toparchia +toparchical +toparchy +topass +Topatopa +topaz +topazfels +topazine +topazite +topazolite +topazy +topcap +topcast +topchrome +topcoat +topcoating +tope +topectomy +topee +topeewallah +topeng +topepo +toper +toperdom +topesthesia +topflight +topfull +topgallant +toph +tophaceous +tophaike +Tophet +tophetic +tophetize +tophus +tophyperidrosis +topi +topia +topiarian +topiarist +topiarius +topiary +topic +topical +topicality +topically +topinambou +Topinish +topknot +topknotted +topless +toplighted +toplike +topline +toploftical +toploftily +toploftiness +toplofty +topmaker +topmaking +topman +topmast +topmost +topmostly +topnotch +topnotcher +topo +topoalgia +topochemical +topognosia +topognosis +topograph +topographer +topographic +topographical +topographically +topographics +topographist +topographize +topographometric +topography +topolatry +topologic +topological +topologist +topology +toponarcosis +toponym +toponymal +toponymic +toponymical +toponymics +toponymist +toponymy +topophobia +topophone +topotactic +topotaxis +topotype +topotypic +topotypical +topped +topper +toppiece +topping +toppingly +toppingness +topple +toppler +topply +toppy +toprail +toprope +tops +topsail +topsailite +topside +topsl +topsman +topsoil +topstone +topswarm +Topsy +topsyturn +toptail +topwise +toque +tor +tora +torah +Toraja +toral +toran +torbanite +torbanitic +torbernite +torc +torcel +torch +torchbearer +torchbearing +torcher +torchless +torchlight +torchlighted +torchlike +torchman +torchon +torchweed +torchwood +torchwort +torcular +torculus +tordrillite +tore +toreador +tored +Torenia +torero +toreumatography +toreumatology +toreutic +toreutics +torfaceous +torfel +torgoch +Torgot +toric +Toriest +Torified +torii +Torilis +Torinese +Toriness +torma +tormen +torment +tormenta +tormentable +tormentation +tormentative +tormented +tormentedly +tormentful +tormentil +tormentilla +tormenting +tormentingly +tormentingness +tormentive +tormentor +tormentous +tormentress +tormentry +tormentum +tormina +torminal +torminous +tormodont +torn +tornachile +tornade +tornadic +tornado +tornadoesque +tornadoproof +tornal +tornaria +tornarian +tornese +torney +tornillo +Tornit +tornote +tornus +toro +toroid +toroidal +torolillo +Toromona +Torontonian +tororokombu +Torosaurus +torose +torosity +torotoro +torous +torpedineer +Torpedinidae +torpedinous +torpedo +torpedoer +torpedoist +torpedolike +torpedoplane +torpedoproof +torpent +torpescence +torpescent +torpid +torpidity +torpidly +torpidness +torpify +torpitude +torpor +torporific +torporize +torquate +torquated +torque +torqued +torques +torrefaction +torrefication +torrefy +torrent +torrentful +torrentfulness +torrential +torrentiality +torrentially +torrentine +torrentless +torrentlike +torrentuous +torrentwise +Torreya +Torricellian +torrid +torridity +torridly +torridness +Torridonian +Torrubia +torsade +torse +torsel +torsibility +torsigraph +torsile +torsimeter +torsiogram +torsiograph +torsiometer +torsion +torsional +torsionally +torsioning +torsionless +torsive +torsk +torso +torsoclusion +torsometer +torsoocclusion +tort +torta +torteau +torticollar +torticollis +torticone +tortile +tortility +tortilla +tortille +tortious +tortiously +tortive +tortoise +tortoiselike +Tortonian +tortrices +tortricid +Tortricidae +Tortricina +tortricine +tortricoid +Tortricoidea +Tortrix +tortula +Tortulaceae +tortulaceous +tortulous +tortuose +tortuosity +tortuous +tortuously +tortuousness +torturable +torturableness +torture +tortured +torturedly +tortureproof +torturer +torturesome +torturing +torturingly +torturous +torturously +toru +torula +torulaceous +torulaform +toruliform +torulin +toruloid +torulose +torulosis +torulous +torulus +torus +torve +torvid +torvity +torvous +Tory +tory +Torydom +Toryess +Toryfication +Toryfy +toryhillite +Toryish +Toryism +Toryistic +Toryize +Toryship +toryweed +tosaphist +tosaphoth +toscanite +Tosephta +Tosephtas +tosh +toshakhana +tosher +toshery +toshly +toshnail +toshy +tosily +Tosk +Toskish +toss +tosser +tossicated +tossily +tossing +tossingly +tossment +tosspot +tossup +tossy +tost +tosticate +tostication +toston +tosy +tot +total +totalitarian +totalitarianism +totality +totalization +totalizator +totalize +totalizer +totally +totalness +totanine +Totanus +totaquin +totaquina +totaquine +totara +totchka +tote +toteload +totem +totemic +totemically +totemism +totemist +totemistic +totemite +totemization +totemy +toter +tother +totient +Totipalmatae +totipalmate +totipalmation +totipotence +totipotency +totipotent +totipotential +totipotentiality +totitive +toto +Totonac +Totonacan +Totonaco +totora +Totoro +totquot +totter +totterer +tottergrass +tottering +totteringly +totterish +tottery +Tottie +totting +tottle +tottlish +totty +tottyhead +totuava +totum +toty +totyman +tou +toucan +toucanet +Toucanid +touch +touchable +touchableness +touchback +touchbell +touchbox +touchdown +touched +touchedness +toucher +touchhole +touchily +touchiness +touching +touchingly +touchingness +touchless +touchline +touchous +touchpan +touchpiece +touchstone +touchwood +touchy +toug +tough +toughen +toughener +toughhead +toughhearted +toughish +toughly +toughness +tought +tould +toumnah +Tounatea +toup +toupee +toupeed +toupet +tour +touraco +tourbillion +tourer +tourette +touring +tourism +tourist +touristdom +touristic +touristproof +touristry +touristship +touristy +tourize +tourmaline +tourmalinic +tourmaliniferous +tourmalinization +tourmalinize +tourmalite +tourn +tournament +tournamental +tournant +tournasin +tournay +tournee +Tournefortia +Tournefortian +tourney +tourneyer +tourniquet +tourte +tousche +touse +touser +tousle +tously +tousy +tout +touter +tovar +Tovaria +Tovariaceae +tovariaceous +tovarish +tow +towable +towage +towai +towan +toward +towardliness +towardly +towardness +towards +towboat +towcock +towd +towel +towelette +toweling +towelry +tower +towered +towering +toweringly +towerless +towerlet +towerlike +towerman +towerproof +towerwise +towerwork +towerwort +towery +towght +towhead +towheaded +towhee +towing +towkay +towlike +towline +towmast +town +towned +townee +towner +townet +townfaring +townfolk +townful +towngate +townhood +townify +towniness +townish +townishly +townishness +townist +townland +townless +townlet +townlike +townling +townly +townman +townsboy +townscape +Townsendia +Townsendite +townsfellow +townsfolk +township +townside +townsite +townsman +townspeople +townswoman +townward +townwards +townwear +towny +towpath +towrope +towser +towy +tox +toxa +toxalbumic +toxalbumin +toxalbumose +toxamin +toxanemia +toxaphene +toxcatl +toxemia +toxemic +toxic +toxicaemia +toxical +toxically +toxicant +toxicarol +toxication +toxicemia +toxicity +toxicodendrol +Toxicodendron +toxicoderma +toxicodermatitis +toxicodermatosis +toxicodermia +toxicodermitis +toxicogenic +toxicognath +toxicohaemia +toxicohemia +toxicoid +toxicologic +toxicological +toxicologically +toxicologist +toxicology +toxicomania +toxicopathic +toxicopathy +toxicophagous +toxicophagy +toxicophidia +toxicophobia +toxicosis +toxicotraumatic +toxicum +toxidermic +toxidermitis +toxifer +Toxifera +toxiferous +toxigenic +toxihaemia +toxihemia +toxiinfection +toxiinfectious +toxin +toxinemia +toxinfection +toxinfectious +toxinosis +toxiphobia +toxiphobiac +toxiphoric +toxitabellae +toxity +Toxodon +toxodont +Toxodontia +toxogenesis +Toxoglossa +toxoglossate +toxoid +toxology +toxolysis +toxon +toxone +toxonosis +toxophil +toxophile +toxophilism +toxophilite +toxophilitic +toxophilitism +toxophilous +toxophily +toxophoric +toxophorous +toxoplasmosis +toxosis +toxosozin +Toxostoma +toxotae +Toxotes +Toxotidae +Toxylon +toy +toydom +toyer +toyful +toyfulness +toyhouse +toying +toyingly +toyish +toyishly +toyishness +toyland +toyless +toylike +toymaker +toymaking +toyman +toyon +toyshop +toysome +toytown +toywoman +toywort +toze +tozee +tozer +tra +trabacolo +trabal +trabant +trabascolo +trabea +trabeae +trabeatae +trabeated +trabeation +trabecula +trabecular +trabecularism +trabeculate +trabeculated +trabeculation +trabecule +trabuch +trabucho +Tracaulon +trace +traceability +traceable +traceableness +traceably +traceless +tracelessly +tracer +traceried +tracery +trachea +tracheaectasy +tracheal +trachealgia +trachealis +trachean +Trachearia +trachearian +tracheary +Tracheata +tracheate +tracheation +tracheid +tracheidal +tracheitis +trachelagra +trachelate +trachelectomopexia +trachelectomy +trachelismus +trachelitis +trachelium +tracheloacromialis +trachelobregmatic +tracheloclavicular +trachelocyllosis +trachelodynia +trachelology +trachelomastoid +trachelopexia +tracheloplasty +trachelorrhaphy +tracheloscapular +Trachelospermum +trachelotomy +trachenchyma +tracheobronchial +tracheobronchitis +tracheocele +tracheochromatic +tracheoesophageal +tracheofissure +tracheolar +tracheolaryngeal +tracheolaryngotomy +tracheole +tracheolingual +tracheopathia +tracheopathy +tracheopharyngeal +Tracheophonae +tracheophone +tracheophonesis +tracheophonine +tracheophony +tracheoplasty +tracheopyosis +tracheorrhagia +tracheoschisis +tracheoscopic +tracheoscopist +tracheoscopy +tracheostenosis +tracheostomy +tracheotome +tracheotomist +tracheotomize +tracheotomy +Trachinidae +trachinoid +Trachinus +trachitis +trachle +Trachodon +trachodont +trachodontid +Trachodontidae +Trachoma +trachomatous +Trachomedusae +trachomedusan +trachyandesite +trachybasalt +trachycarpous +Trachycarpus +trachychromatic +trachydolerite +trachyglossate +Trachylinae +trachyline +Trachymedusae +trachymedusan +trachyphonia +trachyphonous +Trachypteridae +trachypteroid +Trachypterus +trachyspermous +trachyte +trachytic +trachytoid +tracing +tracingly +track +trackable +trackage +trackbarrow +tracked +tracker +trackhound +trackingscout +tracklayer +tracklaying +trackless +tracklessly +tracklessness +trackman +trackmanship +trackmaster +trackscout +trackshifter +tracksick +trackside +trackwalker +trackway +trackwork +tract +tractability +tractable +tractableness +tractably +tractarian +Tractarianism +tractarianize +tractate +tractator +tractatule +tractellate +tractellum +tractiferous +tractile +tractility +traction +tractional +tractioneering +Tractite +tractlet +tractor +tractoration +tractorism +tractorist +tractorization +tractorize +tractory +tractrix +tradable +tradal +trade +tradecraft +tradeful +tradeless +trademaster +trader +tradership +Tradescantia +tradesfolk +tradesman +tradesmanlike +tradesmanship +tradesmanwise +tradespeople +tradesperson +tradeswoman +tradiment +trading +tradite +tradition +traditional +traditionalism +traditionalist +traditionalistic +traditionality +traditionalize +traditionally +traditionarily +traditionary +traditionate +traditionately +traditioner +traditionism +traditionist +traditionitis +traditionize +traditionless +traditionmonger +traditious +traditive +traditor +traditores +traditorship +traduce +traducement +traducent +traducer +traducian +traducianism +traducianist +traducianistic +traducible +traducing +traducingly +traduction +traductionist +trady +traffic +trafficability +trafficable +trafficableness +trafficless +trafficway +trafflicker +trafflike +trag +tragacanth +tragacantha +tragacanthin +tragal +Tragasol +tragedial +tragedian +tragedianess +tragedical +tragedienne +tragedietta +tragedist +tragedization +tragedize +tragedy +tragelaph +tragelaphine +Tragelaphus +tragi +tragic +tragical +tragicality +tragically +tragicalness +tragicaster +tragicize +tragicly +tragicness +tragicofarcical +tragicoheroicomic +tragicolored +tragicomedian +tragicomedy +tragicomic +tragicomical +tragicomicality +tragicomically +tragicomipastoral +tragicoromantic +tragicose +tragopan +Tragopogon +Tragulidae +Tragulina +traguline +traguloid +Traguloidea +Tragulus +tragus +trah +traheen +traik +trail +trailer +trailery +trailiness +trailing +trailingly +trailless +trailmaker +trailmaking +trailman +trailside +trailsman +traily +train +trainable +trainage +trainagraph +trainband +trainbearer +trainbolt +trainboy +trained +trainee +trainer +trainful +training +trainless +trainload +trainman +trainmaster +trainsick +trainster +traintime +trainway +trainy +traipse +trait +traitless +traitor +traitorhood +traitorism +traitorize +traitorlike +traitorling +traitorous +traitorously +traitorousness +traitorship +traitorwise +traitress +traject +trajectile +trajection +trajectitious +trajectory +trajet +tralatician +tralaticiary +tralatition +tralatitious +tralatitiously +tralira +Trallian +tram +trama +tramal +tramcar +trame +Trametes +tramful +tramless +tramline +tramman +trammel +trammeled +trammeler +trammelhead +trammeling +trammelingly +trammelled +trammellingly +trammer +tramming +trammon +tramontane +tramp +trampage +trampdom +tramper +trampess +tramphood +trampish +trampishly +trampism +trample +trampler +tramplike +trampolin +trampoline +trampoose +trampot +tramroad +tramsmith +tramway +tramwayman +tramyard +trance +tranced +trancedly +tranceful +trancelike +tranchefer +tranchet +trancoidal +traneen +trank +tranka +tranker +trankum +tranky +tranquil +tranquility +tranquilization +tranquilize +tranquilizer +tranquilizing +tranquilizingly +tranquillity +tranquillization +tranquillize +tranquilly +tranquilness +transaccidentation +transact +transaction +transactional +transactionally +transactioneer +transactor +transalpine +transalpinely +transalpiner +transamination +transanimate +transanimation +transannular +transapical +transappalachian +transaquatic +transarctic +transatlantic +transatlantically +transatlantican +transatlanticism +transaudient +transbaikal +transbaikalian +transbay +transboard +transborder +transcalency +transcalent +transcalescency +transcalescent +Transcaucasian +transceiver +transcend +transcendence +transcendency +transcendent +transcendental +transcendentalism +transcendentalist +transcendentalistic +transcendentality +transcendentalize +transcendentally +transcendently +transcendentness +transcendible +transcending +transcendingly +transcendingness +transcension +transchannel +transcolor +transcoloration +transconductance +transcondylar +transcondyloid +transconscious +transcontinental +transcorporate +transcorporeal +transcortical +transcreate +transcribable +transcribble +transcribbler +transcribe +transcriber +transcript +transcription +transcriptional +transcriptionally +transcriptitious +transcriptive +transcriptively +transcriptural +transcrystalline +transcurrent +transcurrently +transcurvation +transdermic +transdesert +transdialect +transdiaphragmatic +transdiurnal +transducer +transduction +transect +transection +transelement +transelementate +transelementation +transempirical +transenna +transept +transeptal +transeptally +transequatorial +transessentiate +transeunt +transexperiential +transfashion +transfeature +transfer +transferability +transferable +transferableness +transferably +transferal +transferee +transference +transferent +transferential +transferography +transferor +transferotype +transferred +transferrer +transferribility +transferring +transferror +transferrotype +transfigurate +transfiguration +transfigurative +transfigure +transfigurement +transfiltration +transfinite +transfix +transfixation +transfixion +transfixture +transfluent +transfluvial +transflux +transforation +transform +transformability +transformable +transformance +transformation +transformationist +transformative +transformator +transformer +transforming +transformingly +transformism +transformist +transformistic +transfrontal +transfrontier +transfuge +transfugitive +transfuse +transfuser +transfusible +transfusion +transfusionist +transfusive +transfusively +transgredient +transgress +transgressible +transgressing +transgressingly +transgression +transgressional +transgressive +transgressively +transgressor +transhape +transhuman +transhumanate +transhumanation +transhumance +transhumanize +transhumant +transience +transiency +transient +transiently +transientness +transigence +transigent +transiliac +transilience +transiliency +transilient +transilluminate +transillumination +transilluminator +transimpression +transincorporation +transindividual +transinsular +transire +transischiac +transisthmian +transistor +transit +transitable +transiter +transition +transitional +transitionally +transitionalness +transitionary +transitionist +transitival +transitive +transitively +transitiveness +transitivism +transitivity +transitman +transitorily +transitoriness +transitory +transitus +Transjordanian +translade +translatable +translatableness +translate +translater +translation +translational +translationally +translative +translator +translatorese +translatorial +translatorship +translatory +translatress +translatrix +translay +transleithan +transletter +translinguate +transliterate +transliteration +transliterator +translocalization +translocate +translocation +translocatory +translucence +translucency +translucent +translucently +translucid +transmarginal +transmarine +transmaterial +transmateriation +transmedial +transmedian +transmental +transmentation +transmeridional +transmethylation +transmigrant +transmigrate +transmigration +transmigrationism +transmigrationist +transmigrative +transmigratively +transmigrator +transmigratory +transmissibility +transmissible +transmission +transmissional +transmissionist +transmissive +transmissively +transmissiveness +transmissivity +transmissometer +transmissory +transmit +transmittable +transmittal +transmittance +transmittancy +transmittant +transmitter +transmittible +transmogrification +transmogrifier +transmogrify +transmold +transmontane +transmorphism +transmundane +transmural +transmuscle +transmutability +transmutable +transmutableness +transmutably +transmutation +transmutational +transmutationist +transmutative +transmutatory +transmute +transmuter +transmuting +transmutive +transmutual +transnatation +transnational +transnatural +transnaturation +transnature +transnihilation +transnormal +transocean +transoceanic +transocular +transom +transomed +transonic +transorbital +transpacific +transpadane +transpalatine +transpalmar +transpanamic +transparence +transparency +transparent +transparentize +transparently +transparentness +transparietal +transparish +transpeciate +transpeciation +transpeer +transpenetrable +transpeninsular +transperitoneal +transperitoneally +transpersonal +transphenomenal +transphysical +transpicuity +transpicuous +transpicuously +transpierce +transpirability +transpirable +transpiration +transpirative +transpiratory +transpire +transpirometer +transplace +transplant +transplantability +transplantable +transplantar +transplantation +transplantee +transplanter +transplendency +transplendent +transplendently +transpleural +transpleurally +transpolar +transponibility +transponible +transpontine +transport +transportability +transportable +transportableness +transportal +transportance +transportation +transportational +transportationist +transportative +transported +transportedly +transportedness +transportee +transporter +transporting +transportingly +transportive +transportment +transposability +transposable +transposableness +transposal +transpose +transposer +transposition +transpositional +transpositive +transpositively +transpositor +transpository +transpour +transprint +transprocess +transprose +transproser +transpulmonary +transpyloric +transradiable +transrational +transreal +transrectification +transrhenane +transrhodanian +transriverine +transsegmental +transsensual +transseptal +transsepulchral +transshape +transshift +transship +transshipment +transsolid +transstellar +transsubjective +transtemporal +Transteverine +transthalamic +transthoracic +transubstantial +transubstantially +transubstantiate +transubstantiation +transubstantiationalist +transubstantiationite +transubstantiative +transubstantiatively +transubstantiatory +transudate +transudation +transudative +transudatory +transude +transumpt +transumption +transumptive +transuranian +transuranic +transuranium +transuterine +transvaal +Transvaaler +Transvaalian +transvaluate +transvaluation +transvalue +transvasate +transvasation +transvase +transvectant +transvection +transvenom +transverbate +transverbation +transverberate +transverberation +transversal +transversale +transversalis +transversality +transversally +transversan +transversary +transverse +transversely +transverseness +transverser +transversion +transversive +transversocubital +transversomedial +transversospinal +transversovertical +transversum +transversus +transvert +transverter +transvest +transvestism +transvestite +transvestitism +transvolation +transwritten +Transylvanian +trant +tranter +trantlum +Tranzschelia +trap +Trapa +Trapaceae +trapaceous +trapball +trapes +trapezate +trapeze +trapezia +trapezial +trapezian +trapeziform +trapezing +trapeziometacarpal +trapezist +trapezium +trapezius +trapezohedral +trapezohedron +trapezoid +trapezoidal +trapezoidiform +trapfall +traphole +trapiferous +traplight +traplike +trapmaker +trapmaking +trappean +trapped +trapper +trapperlike +trappiness +trapping +trappingly +Trappist +trappist +Trappistine +trappoid +trappose +trappous +trappy +traprock +traps +trapshoot +trapshooter +trapshooting +trapstick +trapunto +trasformism +trash +trashery +trashify +trashily +trashiness +traship +trashless +trashrack +trashy +trass +Trastevere +Trasteverine +trasy +traulism +trauma +traumasthenia +traumatic +traumatically +traumaticin +traumaticine +traumatism +traumatize +traumatology +traumatonesis +traumatopnea +traumatopyra +traumatosis +traumatotactic +traumatotaxis +traumatropic +traumatropism +Trautvetteria +travail +travale +travally +travated +trave +travel +travelability +travelable +traveldom +traveled +traveler +traveleress +travelerlike +traveling +travellability +travellable +travelled +traveller +travelogue +traveloguer +traveltime +traversable +traversal +traversary +traverse +traversed +traversely +traverser +traversewise +traversework +traversing +traversion +travertin +travertine +travestier +travestiment +travesty +travis +travois +travoy +trawl +trawlboat +trawler +trawlerman +trawlnet +tray +trayful +traylike +treacher +treacherous +treacherously +treacherousness +treachery +treacle +treaclelike +treaclewort +treacliness +treacly +tread +treadboard +treader +treading +treadle +treadler +treadmill +treadwheel +treason +treasonable +treasonableness +treasonably +treasonful +treasonish +treasonist +treasonless +treasonmonger +treasonous +treasonously +treasonproof +treasurable +treasure +treasureless +treasurer +treasurership +treasuress +treasurous +treasury +treasuryship +treat +treatable +treatableness +treatably +treatee +treater +treating +treatise +treatiser +treatment +treator +treaty +treatyist +treatyite +treatyless +Trebellian +treble +trebleness +trebletree +trebly +trebuchet +trecentist +trechmannite +treckschuyt +Treculia +treddle +tredecile +tredille +tree +treebeard +treebine +treed +treefish +treeful +treehair +treehood +treeify +treeiness +treeless +treelessness +treelet +treelike +treeling +treemaker +treemaking +treeman +treen +treenail +treescape +treeship +treespeeler +treetop +treeward +treewards +treey +tref +trefgordd +trefle +trefoil +trefoiled +trefoillike +trefoilwise +tregadyne +tregerg +tregohm +trehala +trehalase +trehalose +treillage +trek +trekker +trekometer +trekpath +trellis +trellised +trellislike +trelliswork +Trema +Tremandra +Tremandraceae +tremandraceous +Trematoda +trematode +Trematodea +Trematodes +trematoid +Trematosaurus +tremble +tremblement +trembler +trembling +tremblingly +tremblingness +tremblor +trembly +Tremella +Tremellaceae +tremellaceous +Tremellales +tremelliform +tremelline +tremellineous +tremelloid +tremellose +tremendous +tremendously +tremendousness +tremetol +tremie +tremolando +tremolant +tremolist +tremolite +tremolitic +tremolo +tremor +tremorless +tremorlessly +tremulant +tremulate +tremulation +tremulous +tremulously +tremulousness +trenail +trench +trenchancy +trenchant +trenchantly +trenchantness +trenchboard +trenched +trencher +trencherless +trencherlike +trenchermaker +trenchermaking +trencherman +trencherside +trencherwise +trencherwoman +trenchful +trenchlet +trenchlike +trenchmaster +trenchmore +trenchward +trenchwise +trenchwork +trend +trendle +Trent +trental +Trentepohlia +Trentepohliaceae +trentepohliaceous +Trentine +Trenton +trepan +trepanation +trepang +trepanize +trepanner +trepanning +trepanningly +trephination +trephine +trephiner +trephocyte +trephone +trepid +trepidancy +trepidant +trepidate +trepidation +trepidatory +trepidity +trepidly +trepidness +Treponema +treponematous +treponemiasis +treponemiatic +treponemicidal +treponemicide +Trepostomata +trepostomatous +Treron +Treronidae +Treroninae +tresaiel +trespass +trespassage +trespasser +trespassory +tress +tressed +tressful +tressilate +tressilation +tressless +tresslet +tresslike +tresson +tressour +tressure +tressured +tressy +trest +trestle +trestletree +trestlewise +trestlework +trestling +tret +trevally +trevet +trews +trewsman +trey +tri +triable +triableness +triace +triacetamide +triacetate +triacetonamine +triachenium +triacid +triacontaeterid +triacontane +triaconter +triact +triactinal +triactine +triad +triadelphous +Triadenum +triadic +triadical +triadically +triadism +triadist +triaene +triaenose +triage +triagonal +triakisicosahedral +triakisicosahedron +triakisoctahedral +triakisoctahedrid +triakisoctahedron +triakistetrahedral +triakistetrahedron +trial +trialate +trialism +trialist +triality +trialogue +triamid +triamide +triamine +triamino +triammonium +triamylose +triander +Triandria +triandrian +triandrous +triangle +triangled +triangler +triangleways +trianglewise +trianglework +Triangula +triangular +triangularity +triangularly +triangulate +triangulately +triangulation +triangulator +Triangulid +trianguloid +triangulopyramidal +triangulotriangular +Triangulum +triannual +triannulate +Trianon +triantelope +trianthous +triapsal +triapsidal +triarch +triarchate +triarchy +triarctic +triarcuated +triareal +triarii +Triarthrus +triarticulate +Trias +Triassic +triaster +triatic +Triatoma +triatomic +triatomicity +triaxial +triaxon +triaxonian +triazane +triazin +triazine +triazo +triazoic +triazole +triazolic +tribade +tribadism +tribady +tribal +tribalism +tribalist +tribally +tribarred +tribase +tribasic +tribasicity +tribasilar +tribble +tribe +tribeless +tribelet +tribelike +tribesfolk +tribeship +tribesman +tribesmanship +tribespeople +tribeswoman +triblastic +triblet +triboelectric +triboelectricity +tribofluorescence +tribofluorescent +Tribolium +triboluminescence +triboluminescent +tribometer +Tribonema +Tribonemaceae +tribophosphorescence +tribophosphorescent +tribophosphoroscope +triborough +tribrac +tribrach +tribrachial +tribrachic +tribracteate +tribracteolate +tribromacetic +tribromide +tribromoethanol +tribromophenol +tribromphenate +tribromphenol +tribual +tribually +tribular +tribulate +tribulation +tribuloid +Tribulus +tribuna +tribunal +tribunate +tribune +tribuneship +tribunitial +tribunitian +tribunitiary +tribunitive +tributable +tributarily +tributariness +tributary +tribute +tributer +tributist +tributorian +tributyrin +trica +tricae +tricalcic +tricalcium +tricapsular +tricar +tricarballylic +tricarbimide +tricarbon +tricarboxylic +tricarinate +tricarinated +tricarpellary +tricarpellate +tricarpous +tricaudal +tricaudate +trice +tricellular +tricenarious +tricenarium +tricenary +tricennial +tricentenarian +tricentenary +tricentennial +tricentral +tricephal +tricephalic +tricephalous +tricephalus +triceps +Triceratops +triceria +tricerion +tricerium +trichatrophia +trichauxis +Trichechidae +trichechine +trichechodont +Trichechus +trichevron +trichi +trichia +trichiasis +Trichilia +Trichina +trichina +trichinae +trichinal +Trichinella +trichiniasis +trichiniferous +trichinization +trichinize +trichinoid +trichinopoly +trichinoscope +trichinoscopy +trichinosed +trichinosis +trichinotic +trichinous +trichite +trichitic +trichitis +trichiurid +Trichiuridae +trichiuroid +Trichiurus +trichloride +trichlormethane +trichloro +trichloroacetic +trichloroethylene +trichloromethane +trichloromethyl +trichobacteria +trichobezoar +trichoblast +trichobranchia +trichobranchiate +trichocarpous +trichocephaliasis +Trichocephalus +trichoclasia +trichoclasis +trichocyst +trichocystic +trichode +Trichoderma +Trichodesmium +Trichodontidae +trichoepithelioma +trichogen +trichogenous +trichoglossia +Trichoglossidae +Trichoglossinae +trichoglossine +Trichogramma +Trichogrammatidae +trichogyne +trichogynial +trichogynic +trichoid +Tricholaena +trichological +trichologist +trichology +Tricholoma +trichoma +Trichomanes +trichomaphyte +trichomatose +trichomatosis +trichomatous +trichome +trichomic +trichomonad +Trichomonadidae +Trichomonas +trichomoniasis +trichomycosis +trichonosus +trichopathic +trichopathy +trichophore +trichophoric +trichophyllous +trichophyte +trichophytia +trichophytic +Trichophyton +trichophytosis +Trichoplax +trichopore +trichopter +Trichoptera +trichoptera +trichopteran +trichopteron +trichopterous +trichopterygid +Trichopterygidae +trichord +trichorrhea +trichorrhexic +trichorrhexis +Trichosanthes +trichoschisis +trichosis +trichosporange +trichosporangial +trichosporangium +Trichosporum +trichostasis +Trichostema +trichostrongyle +trichostrongylid +Trichostrongylus +trichothallic +trichotillomania +trichotomic +trichotomism +trichotomist +trichotomize +trichotomous +trichotomously +trichotomy +trichroic +trichroism +trichromat +trichromate +trichromatic +trichromatism +trichromatist +trichrome +trichromic +trichronous +trichuriasis +Trichuris +trichy +tricinium +tricipital +tricircular +trick +tricker +trickery +trickful +trickily +trickiness +tricking +trickingly +trickish +trickishly +trickishness +trickle +trickless +tricklet +tricklike +trickling +tricklingly +trickly +trickment +trickproof +tricksical +tricksily +tricksiness +tricksome +trickster +trickstering +trickstress +tricksy +tricktrack +tricky +triclad +Tricladida +triclinate +triclinia +triclinial +tricliniarch +tricliniary +triclinic +triclinium +triclinohedric +tricoccose +tricoccous +tricolette +tricolic +tricolon +tricolor +tricolored +tricolumnar +tricompound +triconch +Triconodon +triconodont +Triconodonta +triconodontid +triconodontoid +triconodonty +triconsonantal +triconsonantalism +tricophorous +tricorn +tricornered +tricornute +tricorporal +tricorporate +tricoryphean +tricosane +tricosanone +tricostate +tricosyl +tricosylic +tricot +tricotine +tricotyledonous +tricresol +tricrotic +tricrotism +tricrotous +tricrural +tricurvate +tricuspal +tricuspid +tricuspidal +tricuspidate +tricuspidated +tricussate +tricyanide +tricycle +tricyclene +tricycler +tricyclic +tricyclist +Tricyrtis +Tridacna +Tridacnidae +tridactyl +tridactylous +tridaily +triddler +tridecane +tridecene +tridecilateral +tridecoic +tridecyl +tridecylene +tridecylic +trident +tridental +tridentate +tridentated +tridentiferous +Tridentine +Tridentinian +tridepside +tridermic +tridiametral +tridiapason +tridigitate +tridimensional +tridimensionality +tridimensioned +tridiurnal +tridominium +tridrachm +triduan +triduum +tridymite +tridynamous +tried +triedly +trielaidin +triene +triennial +trienniality +triennially +triennium +triens +triental +Trientalis +triequal +trier +trierarch +trierarchal +trierarchic +trierarchy +trierucin +trieteric +trieterics +triethanolamine +triethyl +triethylamine +triethylstibine +trifa +trifacial +trifarious +trifasciated +triferous +trifid +trifilar +trifistulary +triflagellate +trifle +trifledom +trifler +triflet +trifling +triflingly +triflingness +trifloral +triflorate +triflorous +trifluoride +trifocal +trifoil +trifold +trifoliate +trifoliated +trifoliolate +trifoliosis +Trifolium +trifolium +trifoly +triforial +triforium +triform +triformed +triformin +triformity +triformous +trifoveolate +trifuran +trifurcal +trifurcate +trifurcation +trig +trigamist +trigamous +trigamy +trigeminal +trigeminous +trigeneric +trigesimal +trigger +triggered +triggerfish +triggerless +trigintal +trigintennial +Trigla +triglandular +triglid +Triglidae +triglochid +Triglochin +triglochin +triglot +trigly +triglyceride +triglyceryl +triglyph +triglyphal +triglyphed +triglyphic +triglyphical +trigness +trigon +Trigona +trigonal +trigonally +trigone +Trigonella +trigonelline +trigoneutic +trigoneutism +Trigonia +Trigoniaceae +trigoniacean +trigoniaceous +trigonic +trigonid +Trigoniidae +trigonite +trigonitis +trigonocephalic +trigonocephalous +Trigonocephalus +trigonocephaly +trigonocerous +trigonododecahedron +trigonodont +trigonoid +trigonometer +trigonometric +trigonometrical +trigonometrician +trigonometry +trigonon +trigonotype +trigonous +trigonum +trigram +trigrammatic +trigrammatism +trigrammic +trigraph +trigraphic +triguttulate +trigyn +Trigynia +trigynian +trigynous +trihalide +trihedral +trihedron +trihemeral +trihemimer +trihemimeral +trihemimeris +trihemiobol +trihemiobolion +trihemitetartemorion +trihoral +trihourly +trihybrid +trihydrate +trihydrated +trihydric +trihydride +trihydrol +trihydroxy +trihypostatic +trijugate +trijugous +trijunction +trikaya +trike +triker +trikeria +trikerion +triketo +triketone +trikir +trilabe +trilabiate +trilamellar +trilamellated +trilaminar +trilaminate +trilarcenous +trilateral +trilaterality +trilaterally +trilateralness +trilaurin +trilby +trilemma +trilinear +trilineate +trilineated +trilingual +trilinguar +trilinolate +trilinoleate +trilinolenate +trilinolenin +Trilisa +trilit +trilite +triliteral +triliteralism +triliterality +triliterally +triliteralness +trilith +trilithic +trilithon +trill +trillachan +trillet +trilli +Trilliaceae +trilliaceous +trillibub +trilliin +trilling +trillion +trillionaire +trillionize +trillionth +Trillium +trillium +trillo +trilobate +trilobated +trilobation +trilobe +trilobed +Trilobita +trilobite +trilobitic +trilocular +triloculate +trilogic +trilogical +trilogist +trilogy +Trilophodon +trilophodont +triluminar +triluminous +trim +trimacer +trimacular +trimargarate +trimargarin +trimastigate +trimellitic +trimembral +trimensual +trimer +Trimera +trimercuric +Trimeresurus +trimeric +trimeride +trimerite +trimerization +trimerous +trimesic +trimesinic +trimesitic +trimesitinic +trimester +trimestral +trimestrial +trimesyl +trimetalism +trimetallic +trimeter +trimethoxy +trimethyl +trimethylacetic +trimethylamine +trimethylbenzene +trimethylene +trimethylmethane +trimethylstibine +trimetric +trimetrical +trimetrogon +trimly +trimmer +trimming +trimmingly +trimness +trimodal +trimodality +trimolecular +trimonthly +trimoric +trimorph +trimorphic +trimorphism +trimorphous +trimotor +trimotored +trimstone +trimtram +trimuscular +trimyristate +trimyristin +trin +Trinacrian +trinal +trinality +trinalize +trinary +trinational +trindle +trine +trinely +trinervate +trinerve +trinerved +trineural +Tringa +tringine +tringle +tringoid +Trinidadian +trinidado +Trinil +Trinitarian +trinitarian +Trinitarianism +trinitrate +trinitration +trinitride +trinitrin +trinitro +trinitrocarbolic +trinitrocellulose +trinitrocresol +trinitroglycerin +trinitromethane +trinitrophenol +trinitroresorcin +trinitrotoluene +trinitroxylene +trinitroxylol +Trinity +trinity +trinityhood +trink +trinkerman +trinket +trinketer +trinketry +trinkety +trinkle +trinklement +trinklet +trinkums +Trinobantes +trinoctial +trinodal +trinode +trinodine +trinol +trinomial +trinomialism +trinomialist +trinomiality +trinomially +trinopticon +Trinorantum +Trinovant +Trinovantes +trintle +trinucleate +Trinucleus +Trio +trio +triobol +triobolon +trioctile +triocular +triode +triodia +triodion +Triodon +Triodontes +Triodontidae +triodontoid +Triodontoidea +Triodontoidei +Triodontophorus +Trioecia +trioecious +trioeciously +trioecism +triolcous +triole +trioleate +triolefin +trioleic +triolein +triolet +triology +Trionychidae +trionychoid +Trionychoideachid +trionychoidean +trionym +trionymal +Trionyx +trioperculate +Triopidae +Triops +trior +triorchis +triorchism +triorthogonal +triose +Triosteum +triovulate +trioxazine +trioxide +trioxymethylene +triozonide +trip +tripal +tripaleolate +tripalmitate +tripalmitin +tripara +tripart +triparted +tripartedly +tripartible +tripartient +tripartite +tripartitely +tripartition +tripaschal +tripe +tripedal +tripel +tripelike +tripeman +tripemonger +tripennate +tripenny +tripeptide +tripersonal +tripersonalism +tripersonalist +tripersonality +tripersonally +tripery +tripeshop +tripestone +tripetaloid +tripetalous +tripewife +tripewoman +triphammer +triphane +triphase +triphaser +Triphasia +triphasic +triphenyl +triphenylamine +triphenylated +triphenylcarbinol +triphenylmethane +triphenylmethyl +triphenylphosphine +triphibian +triphibious +triphony +Triphora +triphthong +triphyletic +triphyline +triphylite +triphyllous +Triphysite +tripinnate +tripinnated +tripinnately +tripinnatifid +tripinnatisect +Tripitaka +triplane +Triplaris +triplasian +triplasic +triple +tripleback +triplefold +triplegia +tripleness +triplet +tripletail +tripletree +triplewise +triplex +triplexity +triplicate +triplication +triplicative +triplicature +Triplice +Triplicist +triplicity +triplicostate +tripliform +triplinerved +tripling +triplite +triploblastic +triplocaulescent +triplocaulous +Triplochitonaceae +triploid +triploidic +triploidite +triploidy +triplopia +triplopy +triplum +triplumbic +triply +tripmadam +tripod +tripodal +tripodial +tripodian +tripodic +tripodical +tripody +tripointed +tripolar +tripoli +Tripoline +tripoline +Tripolitan +tripolite +tripos +tripotassium +trippant +tripper +trippet +tripping +trippingly +trippingness +trippist +tripple +trippler +Tripsacum +tripsill +tripsis +tripsome +tripsomely +triptane +tripterous +triptote +triptych +triptyque +tripudial +tripudiant +tripudiary +tripudiate +tripudiation +tripudist +tripudium +tripunctal +tripunctate +tripy +Tripylaea +tripylaean +Tripylarian +tripylarian +tripyrenous +triquadrantal +triquetra +triquetral +triquetric +triquetrous +triquetrously +triquetrum +triquinate +triquinoyl +triradial +triradially +triradiate +triradiated +triradiately +triradiation +Triratna +trirectangular +triregnum +trireme +trirhombohedral +trirhomboidal +triricinolein +trisaccharide +trisaccharose +trisacramentarian +Trisagion +trisalt +trisazo +trisceptral +trisect +trisected +trisection +trisector +trisectrix +triseme +trisemic +trisensory +trisepalous +triseptate +triserial +triserially +triseriate +triseriatim +trisetose +Trisetum +trishna +trisilane +trisilicane +trisilicate +trisilicic +trisinuate +trisinuated +triskele +triskelion +trismegist +trismegistic +trismic +trismus +trisoctahedral +trisoctahedron +trisodium +trisome +trisomic +trisomy +trisonant +Trisotropis +trispast +trispaston +trispermous +trispinose +trisplanchnic +trisporic +trisporous +trisquare +trist +tristachyous +Tristam +Tristan +Tristania +tristate +tristearate +tristearin +tristeness +tristetrahedron +tristeza +tristful +tristfully +tristfulness +tristich +Tristichaceae +tristichic +tristichous +tristigmatic +tristigmatose +tristiloquy +tristisonous +Tristram +tristylous +trisubstituted +trisubstitution +trisul +trisula +trisulcate +trisulcated +trisulphate +trisulphide +trisulphone +trisulphonic +trisulphoxide +trisylabic +trisyllabical +trisyllabically +trisyllabism +trisyllabity +trisyllable +tritactic +tritagonist +tritangent +tritangential +tritanope +tritanopia +tritanopic +tritaph +trite +Triteleia +tritely +tritemorion +tritencephalon +triteness +triternate +triternately +triterpene +tritetartemorion +tritheism +tritheist +tritheistic +tritheistical +tritheite +tritheocracy +trithing +trithioaldehyde +trithiocarbonate +trithiocarbonic +trithionate +trithionic +Trithrinax +tritical +triticality +tritically +triticalness +triticeous +triticeum +triticin +triticism +triticoid +Triticum +triticum +tritish +tritium +tritocerebral +tritocerebrum +tritocone +tritoconid +Tritogeneia +tritolo +Tritoma +tritomite +Triton +triton +tritonal +tritonality +tritone +Tritoness +Tritonia +Tritonic +Tritonidae +tritonoid +tritonous +tritonymph +tritonymphal +tritopatores +tritopine +tritor +tritoral +tritorium +tritoxide +tritozooid +tritriacontane +trittichan +tritubercular +Trituberculata +trituberculism +trituberculy +triturable +tritural +triturate +trituration +triturator +triturature +triturium +Triturus +trityl +Tritylodon +Triumfetta +Triumph +triumph +triumphal +triumphance +triumphancy +triumphant +triumphantly +triumphator +triumpher +triumphing +triumphwise +triumvir +triumviral +triumvirate +triumviri +triumvirship +triunal +triune +triungulin +triunification +triunion +triunitarian +triunity +triunsaturated +triurid +Triuridaceae +Triuridales +Triuris +trivalence +trivalency +trivalent +trivalerin +trivalve +trivalvular +trivant +trivantly +trivariant +triverbal +triverbial +trivet +trivetwise +trivia +trivial +trivialism +trivialist +triviality +trivialize +trivially +trivialness +trivirga +trivirgate +trivium +trivoltine +trivvet +triweekly +Trix +Trixie +Trixy +trizoic +trizomal +trizonal +trizone +Trizonia +Troad +troat +troca +trocaical +trocar +Trochaic +trochaic +trochaicality +trochal +trochalopod +Trochalopoda +trochalopodous +trochanter +trochanteric +trochanterion +trochantin +trochantinian +trochart +trochate +troche +trocheameter +trochee +trocheeize +trochelminth +Trochelminthes +trochi +trochid +Trochidae +trochiferous +trochiform +Trochila +Trochili +trochili +trochilic +trochilics +trochilidae +trochilidine +trochilidist +trochiline +trochilopodous +Trochilus +trochilus +troching +trochiscation +trochiscus +trochite +trochitic +Trochius +trochlea +trochlear +trochleariform +trochlearis +trochleary +trochleate +trochleiform +trochocephalia +trochocephalic +trochocephalus +trochocephaly +Trochodendraceae +trochodendraceous +Trochodendron +trochoid +trochoidal +trochoidally +trochoides +trochometer +trochophore +Trochosphaera +Trochosphaerida +trochosphere +trochospherical +Trochozoa +trochozoic +trochozoon +Trochus +trochus +trock +troco +troctolite +trod +trodden +trode +troegerite +Troezenian +troft +trog +trogger +troggin +troglodytal +troglodyte +Troglodytes +troglodytic +troglodytical +Troglodytidae +Troglodytinae +troglodytish +troglodytism +trogon +Trogones +Trogonidae +Trogoniformes +trogonoid +trogs +trogue +Troiades +Troic +troika +troilite +Trojan +troke +troker +troll +trolldom +trolleite +troller +trolley +trolleyer +trolleyful +trolleyman +trollflower +trollimog +trolling +Trollius +trollman +trollol +trollop +Trollopean +Trollopeanism +trollopish +trollops +trollopy +trolly +tromba +trombe +trombiculid +trombidiasis +Trombidiidae +Trombidium +trombone +trombonist +trombony +trommel +tromometer +tromometric +tromometrical +tromometry +tromp +trompe +trompil +trompillo +tromple +tron +trona +tronador +tronage +tronc +trondhjemite +trone +troner +troolie +troop +trooper +trooperess +troopfowl +troopship +troopwise +troostite +troostitic +troot +tropacocaine +tropaeolaceae +tropaeolaceous +tropaeolin +Tropaeolum +tropaion +tropal +troparia +troparion +tropary +tropate +trope +tropeic +tropeine +troper +tropesis +trophaea +trophaeum +trophal +trophallactic +trophallaxis +trophectoderm +trophedema +trophema +trophesial +trophesy +trophi +trophic +trophical +trophically +trophicity +trophied +Trophis +trophism +trophobiont +trophobiosis +trophobiotic +trophoblast +trophoblastic +trophochromatin +trophocyte +trophoderm +trophodisc +trophodynamic +trophodynamics +trophogenesis +trophogenic +trophogeny +trophology +trophonema +trophoneurosis +trophoneurotic +Trophonian +trophonucleus +trophopathy +trophophore +trophophorous +trophophyte +trophoplasm +trophoplasmatic +trophoplasmic +trophoplast +trophosomal +trophosome +trophosperm +trophosphere +trophospongia +trophospongial +trophospongium +trophospore +trophotaxis +trophotherapy +trophothylax +trophotropic +trophotropism +trophozoite +trophozooid +trophy +trophyless +trophywort +tropic +tropical +Tropicalia +Tropicalian +tropicality +tropicalization +tropicalize +tropically +tropicopolitan +tropidine +Tropidoleptus +tropine +tropism +tropismatic +tropist +tropistic +tropocaine +tropologic +tropological +tropologically +tropologize +tropology +tropometer +tropopause +tropophil +tropophilous +tropophyte +tropophytic +troposphere +tropostereoscope +tropoyl +troptometer +tropyl +trostera +trot +trotcozy +troth +trothful +trothless +trothlike +trothplight +trotlet +trotline +trotol +trotter +trottie +trottles +trottoir +trottoired +trotty +trotyl +troubadour +troubadourish +troubadourism +troubadourist +trouble +troubledly +troubledness +troublemaker +troublemaking +troublement +troubleproof +troubler +troublesome +troublesomely +troublesomeness +troubling +troublingly +troublous +troublously +troublousness +troubly +trough +troughful +troughing +troughlike +troughster +troughway +troughwise +troughy +trounce +trouncer +troupand +troupe +trouper +troupial +trouse +trouser +trouserdom +trousered +trouserettes +trouserian +trousering +trouserless +trousers +trousseau +trousseaux +trout +troutbird +trouter +troutflower +troutful +troutiness +troutless +troutlet +troutlike +trouty +trouvere +trouveur +trove +troveless +trover +trow +trowel +trowelbeak +troweler +trowelful +trowelman +trowing +trowlesworthite +trowman +trowth +troy +Troynovant +Troytown +truancy +truandise +truant +truantcy +truantism +truantlike +truantly +truantness +truantry +truantship +trub +trubu +truce +trucebreaker +trucebreaking +truceless +trucemaker +trucemaking +trucial +trucidation +truck +truckage +trucker +truckful +trucking +truckle +truckler +trucklike +truckling +trucklingly +truckload +truckman +truckmaster +trucks +truckster +truckway +truculence +truculency +truculent +truculental +truculently +truculentness +truddo +trudellite +trudge +trudgen +trudger +Trudy +true +trueborn +truebred +truehearted +trueheartedly +trueheartedness +truelike +truelove +trueness +truepenny +truer +truff +truffle +truffled +trufflelike +truffler +trufflesque +trug +truish +truism +truismatic +truistic +truistical +trull +Trullan +truller +trullization +trullo +truly +trumbash +trummel +trump +trumper +trumperiness +trumpery +trumpet +trumpetbush +trumpeter +trumpeting +trumpetless +trumpetlike +trumpetry +trumpetweed +trumpetwood +trumpety +trumph +trumpie +trumpless +trumplike +trun +truncage +truncal +truncate +truncated +Truncatella +Truncatellidae +truncately +truncation +truncator +truncatorotund +truncatosinuate +truncature +trunch +trunched +truncheon +truncheoned +truncher +trunchman +trundle +trundlehead +trundler +trundleshot +trundletail +trundling +trunk +trunkback +trunked +trunkfish +trunkful +trunking +trunkless +trunkmaker +trunknose +trunkway +trunkwork +trunnel +trunnion +trunnioned +trunnionless +trush +trusion +truss +trussed +trussell +trusser +trussing +trussmaker +trussmaking +trusswork +trust +trustability +trustable +trustableness +trustably +trustee +trusteeism +trusteeship +trusten +truster +trustful +trustfully +trustfulness +trustification +trustify +trustihood +trustily +trustiness +trusting +trustingly +trustingness +trustle +trustless +trustlessly +trustlessness +trustman +trustmonger +trustwoman +trustworthily +trustworthiness +trustworthy +trusty +truth +truthable +truthful +truthfully +truthfulness +truthify +truthiness +truthless +truthlessly +truthlessness +truthlike +truthlikeness +truthsman +truthteller +truthtelling +truthy +Trutta +truttaceous +truvat +truxillic +truxilline +try +trygon +Trygonidae +tryhouse +trying +tryingly +tryingness +tryma +tryout +tryp +trypa +trypan +trypaneid +Trypaneidae +trypanocidal +trypanocide +trypanolysin +trypanolysis +trypanolytic +Trypanosoma +trypanosoma +trypanosomacidal +trypanosomacide +trypanosomal +trypanosomatic +Trypanosomatidae +trypanosomatosis +trypanosomatous +trypanosome +trypanosomiasis +trypanosomic +Tryparsamide +Trypeta +trypetid +Trypetidae +Tryphena +Tryphosa +trypiate +trypograph +trypographic +trypsin +trypsinize +trypsinogen +tryptase +tryptic +tryptogen +tryptone +tryptonize +tryptophan +trysail +tryst +tryster +trysting +tryt +tryworks +tsadik +tsamba +tsantsa +tsar +tsardom +tsarevitch +tsarina +tsaritza +tsarship +tsatlee +Tsattine +tscharik +tscheffkinite +Tscherkess +tsere +tsessebe +tsetse +Tshi +tsia +Tsiltaden +Tsimshian +tsine +tsingtauite +tsiology +Tsoneca +Tsonecan +tst +tsuba +tsubo +Tsuga +Tsuma +tsumebite +tsun +tsunami +tsungtu +Tsutsutsi +tu +tua +Tualati +Tuamotu +Tuamotuan +tuan +Tuareg +tuarn +tuart +tuatara +tuatera +tuath +tub +Tuba +tuba +tubae +tubage +tubal +tubaphone +tubar +tubate +tubatoxin +Tubatulabal +tubba +tubbable +tubbal +tubbeck +tubber +tubbie +tubbiness +tubbing +tubbish +tubboe +tubby +tube +tubeflower +tubeform +tubeful +tubehead +tubehearted +tubeless +tubelet +tubelike +tubemaker +tubemaking +tubeman +tuber +Tuberaceae +tuberaceous +Tuberales +tuberation +tubercle +tubercled +tuberclelike +tubercula +tubercular +Tubercularia +Tuberculariaceae +tuberculariaceous +tubercularization +tubercularize +tubercularly +tubercularness +tuberculate +tuberculated +tuberculatedly +tuberculately +tuberculation +tuberculatogibbous +tuberculatonodose +tuberculatoradiate +tuberculatospinous +tubercule +tuberculed +tuberculid +tuberculide +tuberculiferous +tuberculiform +tuberculin +tuberculinic +tuberculinization +tuberculinize +tuberculization +tuberculize +tuberculocele +tuberculocidin +tuberculoderma +tuberculoid +tuberculoma +tuberculomania +tuberculomata +tuberculophobia +tuberculoprotein +tuberculose +tuberculosectorial +tuberculosed +tuberculosis +tuberculotherapist +tuberculotherapy +tuberculotoxin +tuberculotrophic +tuberculous +tuberculously +tuberculousness +tuberculum +tuberiferous +tuberiform +tuberin +tuberization +tuberize +tuberless +tuberoid +tuberose +tuberosity +tuberous +tuberously +tuberousness +tubesmith +tubework +tubeworks +tubfish +tubful +tubicen +tubicinate +tubicination +Tubicola +Tubicolae +tubicolar +tubicolous +tubicorn +tubicornous +tubifacient +tubifer +tubiferous +Tubifex +Tubificidae +Tubiflorales +tubiflorous +tubiform +tubig +tubik +tubilingual +Tubinares +tubinarial +tubinarine +tubing +Tubingen +tubiparous +Tubipora +tubipore +tubiporid +Tubiporidae +tubiporoid +tubiporous +tublet +tublike +tubmaker +tubmaking +tubman +tuboabdominal +tubocurarine +tubolabellate +tuboligamentous +tuboovarial +tuboovarian +tuboperitoneal +tuborrhea +tubotympanal +tubovaginal +tubular +Tubularia +tubularia +Tubulariae +tubularian +Tubularida +tubularidan +Tubulariidae +tubularity +tubularly +tubulate +tubulated +tubulation +tubulator +tubulature +tubule +tubulet +tubuli +tubulibranch +tubulibranchian +Tubulibranchiata +tubulibranchiate +Tubulidentata +tubulidentate +Tubulifera +tubuliferan +tubuliferous +tubulifloral +tubuliflorous +tubuliform +Tubulipora +tubulipore +tubuliporid +Tubuliporidae +tubuliporoid +tubulization +tubulodermoid +tubuloracemose +tubulosaccular +tubulose +tubulostriato +tubulous +tubulously +tubulousness +tubulure +tubulus +tubwoman +Tucana +Tucanae +tucandera +Tucano +tuchit +tuchun +tuchunate +tuchunism +tuchunize +tuck +Tuckahoe +tuckahoe +tucker +tuckermanity +tucket +tucking +tuckner +tuckshop +tucktoo +tucky +tucum +tucuma +tucuman +Tucuna +tudel +Tudesque +Tudor +Tudoresque +tue +tueiron +Tuesday +tufa +tufaceous +tufalike +tufan +tuff +tuffaceous +tuffet +tuffing +tuft +tuftaffeta +tufted +tufter +tufthunter +tufthunting +tuftily +tufting +tuftlet +tufty +tug +tugboat +tugboatman +tugger +tuggery +tugging +tuggingly +tughra +tugless +tuglike +tugman +tugrik +tugui +tugurium +tui +tuik +tuille +tuillette +tuilyie +tuism +tuition +tuitional +tuitionary +tuitive +tuke +tukra +Tukuler +Tukulor +tula +Tulalip +tulare +tularemia +tulasi +Tulbaghia +tulchan +tulchin +tule +tuliac +tulip +Tulipa +tulipflower +tulipiferous +tulipist +tuliplike +tulipomania +tulipomaniac +tulipwood +tulipy +tulisan +Tulkepaia +tulle +Tullian +tullibee +Tulostoma +tulsi +Tulu +tulwar +tum +tumasha +tumatakuru +tumatukuru +tumbak +tumbester +tumble +tumblebug +tumbled +tumbledung +tumbler +tumblerful +tumblerlike +tumblerwise +tumbleweed +tumblification +tumbling +tumblingly +tumbly +Tumboa +tumbrel +tume +tumefacient +tumefaction +tumefy +tumescence +tumescent +tumid +tumidity +tumidly +tumidness +Tumion +tummals +tummel +tummer +tummock +tummy +tumor +tumored +tumorlike +tumorous +tump +tumpline +tumtum +tumular +tumulary +tumulate +tumulation +tumuli +tumulose +tumulosity +tumulous +tumult +tumultuarily +tumultuariness +tumultuary +tumultuate +tumultuation +tumultuous +tumultuously +tumultuousness +tumulus +Tumupasa +tun +tuna +tunable +tunableness +tunably +tunbellied +tunbelly +tunca +tund +tundagslatta +tunder +tundish +tundra +tundun +tune +Tunebo +tuned +tuneful +tunefully +tunefulness +tuneless +tunelessly +tunelessness +tunemaker +tunemaking +tuner +tunesome +tunester +tunful +tung +Tunga +Tungan +tungate +tungo +tungstate +tungsten +tungstenic +tungsteniferous +tungstenite +tungstic +tungstite +tungstosilicate +tungstosilicic +Tungus +Tungusian +Tungusic +tunhoof +tunic +Tunica +Tunican +tunicary +Tunicata +tunicate +tunicated +tunicin +tunicked +tunicle +tunicless +tuniness +tuning +tunish +Tunisian +tunist +tunk +Tunker +tunket +tunlike +tunmoot +tunna +tunnel +tunneled +tunneler +tunneling +tunnelist +tunnelite +tunnellike +tunnelly +tunnelmaker +tunnelmaking +tunnelman +tunnelway +tunner +tunnery +Tunnit +tunnland +tunnor +tunny +tuno +tunu +tuny +tup +Tupaia +Tupaiidae +tupakihi +tupanship +tupara +tupek +tupelo +Tupi +Tupian +tupik +Tupinamba +Tupinaqui +tupman +tuppence +tuppenny +Tupperian +Tupperish +Tupperism +Tupperize +tupuna +tuque +tur +turacin +Turacus +Turanian +Turanianism +Turanism +turanose +turb +turban +turbaned +turbanesque +turbanette +turbanless +turbanlike +turbantop +turbanwise +turbary +turbeh +Turbellaria +turbellarian +turbellariform +turbescency +turbid +turbidimeter +turbidimetric +turbidimetry +turbidity +turbidly +turbidness +turbinaceous +turbinage +turbinal +turbinate +turbinated +turbination +turbinatoconcave +turbinatocylindrical +turbinatoglobose +turbinatostipitate +turbine +turbinectomy +turbined +turbinelike +Turbinella +Turbinellidae +turbinelloid +turbiner +turbines +Turbinidae +turbiniform +turbinoid +turbinotome +turbinotomy +turbit +turbith +turbitteen +Turbo +turbo +turboalternator +turboblower +turbocompressor +turbodynamo +turboexciter +turbofan +turbogenerator +turbomachine +turbomotor +turbopump +turbosupercharge +turbosupercharger +turbot +turbotlike +turboventilator +turbulence +turbulency +turbulent +turbulently +turbulentness +Turcian +Turcic +Turcification +Turcism +Turcize +Turco +turco +Turcoman +Turcophilism +turcopole +turcopolier +turd +Turdetan +Turdidae +turdiform +Turdinae +turdine +turdoid +Turdus +tureen +tureenful +turf +turfage +turfdom +turfed +turfen +turfiness +turfing +turfite +turfless +turflike +turfman +turfwise +turfy +turgency +turgent +turgently +turgesce +turgescence +turgescency +turgescent +turgescible +turgid +turgidity +turgidly +turgidness +turgite +turgoid +turgor +turgy +Turi +turicata +turio +turion +turioniferous +turjaite +turjite +Turk +turk +Turkana +Turkdom +turken +Turkery +Turkess +Turkey +turkey +turkeyback +turkeyberry +turkeybush +Turkeydom +turkeyfoot +Turkeyism +turkeylike +Turki +Turkic +Turkicize +Turkification +Turkify +turkis +Turkish +Turkishly +Turkishness +Turkism +Turkize +turkle +Turklike +Turkman +Turkmen +Turkmenian +Turkologist +Turkology +Turkoman +Turkomania +Turkomanic +Turkomanize +Turkophil +Turkophile +Turkophilia +Turkophilism +Turkophobe +Turkophobist +turlough +Turlupin +turm +turma +turment +turmeric +turmit +turmoil +turmoiler +turn +turnable +turnabout +turnagain +turnaround +turnaway +turnback +turnbout +turnbuckle +turncap +turncoat +turncoatism +turncock +turndown +turndun +turned +turnel +turner +Turnera +Turneraceae +turneraceous +Turneresque +Turnerian +Turnerism +turnerite +turnery +turney +turngate +turnhall +Turnhalle +Turnices +Turnicidae +turnicine +Turnicomorphae +turnicomorphic +turning +turningness +turnip +turniplike +turnipweed +turnipwise +turnipwood +turnipy +Turnix +turnix +turnkey +turnoff +turnout +turnover +turnpike +turnpiker +turnpin +turnplate +turnplow +turnrow +turns +turnscrew +turnsheet +turnskin +turnsole +turnspit +turnstile +turnstone +turntable +turntail +turnup +turnwrest +turnwrist +Turonian +turp +turpantineweed +turpentine +turpentineweed +turpentinic +turpeth +turpethin +turpid +turpidly +turpitude +turps +turquoise +turquoiseberry +turquoiselike +turr +turret +turreted +turrethead +turretlike +turrical +turricle +turricula +turriculae +turricular +turriculate +turriferous +turriform +turrigerous +Turrilepas +turrilite +Turrilites +turriliticone +Turrilitidae +Turritella +turritella +turritellid +Turritellidae +turritelloid +turse +Tursenoi +Tursha +tursio +Tursiops +Turtan +turtle +turtleback +turtlebloom +turtledom +turtledove +turtlehead +turtleize +turtlelike +turtler +turtlet +turtling +turtosa +tururi +turus +Turveydrop +Turveydropdom +Turveydropian +turwar +Tusayan +Tuscan +Tuscanism +Tuscanize +Tuscanlike +Tuscany +Tuscarora +tusche +Tusculan +Tush +tush +tushed +Tushepaw +tusher +tushery +tusk +tuskar +tusked +Tuskegee +tusker +tuskish +tuskless +tusklike +tuskwise +tusky +tussah +tussal +tusser +tussicular +Tussilago +tussis +tussive +tussle +tussock +tussocked +tussocker +tussocky +tussore +tussur +tut +tutania +tutball +tute +tutee +tutela +tutelage +tutelar +tutelary +Tutelo +tutenag +tuth +tutin +tutiorism +tutiorist +tutly +tutman +tutor +tutorage +tutorer +tutoress +tutorhood +tutorial +tutorially +tutoriate +tutorism +tutorization +tutorize +tutorless +tutorly +tutorship +tutory +tutoyer +tutress +tutrice +tutrix +tuts +tutsan +tutster +tutti +tuttiman +tutty +tutu +tutulus +Tututni +tutwork +tutworker +tutworkman +tuwi +tux +tuxedo +tuyere +Tuyuneiri +tuza +Tuzla +tuzzle +twa +Twaddell +twaddle +twaddledom +twaddleize +twaddlement +twaddlemonger +twaddler +twaddlesome +twaddling +twaddlingly +twaddly +twaddy +twae +twaesome +twafauld +twagger +twain +twaite +twal +twale +twalpenny +twalpennyworth +twalt +Twana +twang +twanger +twanginess +twangle +twangler +twangy +twank +twanker +twanking +twankingly +twankle +twanky +twant +twarly +twas +twasome +twat +twatchel +twatterlight +twattle +twattler +twattling +tway +twayblade +twazzy +tweag +tweak +tweaker +tweaky +twee +tweed +tweeded +tweedle +tweedledee +tweedledum +tweedy +tweeg +tweel +tween +tweenlight +tweeny +tweesh +tweesht +tweest +tweet +tweeter +tweeze +tweezer +tweezers +tweil +twelfhynde +twelfhyndeman +twelfth +twelfthly +Twelfthtide +twelve +twelvefold +twelvehynde +twelvehyndeman +twelvemo +twelvemonth +twelvepence +twelvepenny +twelvescore +twentieth +twentiethly +twenty +twentyfold +twentymo +twere +twerp +Twi +twibil +twibilled +twice +twicer +twicet +twichild +twick +twiddle +twiddler +twiddling +twiddly +twifoil +twifold +twifoldly +twig +twigful +twigged +twiggen +twigger +twiggy +twigless +twiglet +twiglike +twigsome +twigwithy +twilight +twilightless +twilightlike +twilighty +twilit +twill +twilled +twiller +twilling +twilly +twilt +twin +twinable +twinberry +twinborn +twindle +twine +twineable +twinebush +twineless +twinelike +twinemaker +twinemaking +twiner +twinflower +twinfold +twinge +twingle +twinhood +twiningly +twinism +twink +twinkle +twinkledum +twinkleproof +twinkler +twinkles +twinkless +twinkling +twinklingly +twinkly +twinleaf +twinlike +twinling +twinly +twinned +twinner +twinness +twinning +twinship +twinsomeness +twinter +twiny +twire +twirk +twirl +twirler +twirligig +twirly +twiscar +twisel +twist +twistable +twisted +twistedly +twistened +twister +twisterer +twistical +twistification +twistily +twistiness +twisting +twistingly +twistiways +twistiwise +twistle +twistless +twisty +twit +twitch +twitchel +twitcheling +twitcher +twitchet +twitchety +twitchfire +twitchily +twitchiness +twitchingly +twitchy +twite +twitlark +twitten +twitter +twitteration +twitterboned +twitterer +twittering +twitteringly +twitterly +twittery +twittingly +twitty +twixt +twixtbrain +twizzened +twizzle +two +twodecker +twofold +twofoldly +twofoldness +twoling +twoness +twopence +twopenny +twosome +twyblade +twyhynde +Tybalt +Tyburn +Tyburnian +Tyche +tychism +tychite +Tychonian +Tychonic +tychoparthenogenesis +tychopotamic +tycoon +tycoonate +tyddyn +tydie +tye +tyee +tyg +Tyigh +tying +tyke +tyken +tykhana +tyking +tylarus +tyleberry +Tylenchus +Tylerism +Tylerite +Tylerize +tylion +tyloma +tylopod +Tylopoda +tylopodous +Tylosaurus +tylose +tylosis +tylosteresis +Tylostoma +Tylostomaceae +tylostylar +tylostyle +tylostylote +tylostylus +Tylosurus +tylotate +tylote +tylotic +tylotoxea +tylotoxeate +tylotus +tylus +tymbalon +tymp +tympan +tympana +tympanal +tympanectomy +tympani +tympanic +tympanichord +tympanichordal +tympanicity +tympaniform +tympaning +tympanism +tympanist +tympanites +tympanitic +tympanitis +tympanocervical +tympanohyal +tympanomalleal +tympanomandibular +tympanomastoid +tympanomaxillary +tympanon +tympanoperiotic +tympanosis +tympanosquamosal +tympanostapedial +tympanotemporal +tympanotomy +Tympanuchus +tympanum +tympany +tynd +Tyndallization +Tyndallize +tyndallmeter +Tynwald +typal +typarchical +type +typecast +Typees +typeholder +typer +typescript +typeset +typesetter +typesetting +typewrite +typewriter +typewriting +Typha +Typhaceae +typhaceous +typhemia +typhia +typhic +typhinia +typhization +typhlatonia +typhlatony +typhlectasis +typhlectomy +typhlenteritis +typhlitic +typhlitis +typhloalbuminuria +typhlocele +typhloempyema +typhloenteritis +typhlohepatitis +typhlolexia +typhlolithiasis +typhlology +typhlomegaly +Typhlomolge +typhlon +typhlopexia +typhlopexy +typhlophile +typhlopid +Typhlopidae +Typhlops +typhloptosis +typhlosis +typhlosolar +typhlosole +typhlostenosis +typhlostomy +typhlotomy +typhobacillosis +Typhoean +typhoemia +typhogenic +typhoid +typhoidal +typhoidin +typhoidlike +typholysin +typhomalaria +typhomalarial +typhomania +typhonia +Typhonian +Typhonic +typhonic +typhoon +typhoonish +typhopneumonia +typhose +typhosepsis +typhosis +typhotoxine +typhous +Typhula +typhus +typic +typica +typical +typicality +typically +typicalness +typicon +typicum +typification +typifier +typify +typist +typo +typobar +typocosmy +typographer +typographia +typographic +typographical +typographically +typographist +typography +typolithographic +typolithography +typologic +typological +typologically +typologist +typology +typomania +typometry +typonym +typonymal +typonymic +typonymous +typophile +typorama +typoscript +typotelegraph +typotelegraphy +typothere +Typotheria +Typotheriidae +typothetae +typp +typtological +typtologist +typtology +typy +tyramine +tyranness +Tyranni +tyrannial +tyrannic +tyrannical +tyrannically +tyrannicalness +tyrannicidal +tyrannicide +tyrannicly +Tyrannidae +Tyrannides +Tyranninae +tyrannine +tyrannism +tyrannize +tyrannizer +tyrannizing +tyrannizingly +tyrannoid +tyrannophobia +tyrannosaur +Tyrannosaurus +tyrannous +tyrannously +tyrannousness +Tyrannus +tyranny +tyrant +tyrantcraft +tyrantlike +tyrantship +tyre +tyremesis +Tyrian +tyriasis +tyro +tyrocidin +tyrocidine +tyroglyphid +Tyroglyphidae +Tyroglyphus +Tyrolean +Tyrolese +Tyrolienne +tyrolite +tyrology +tyroma +tyromancy +tyromatous +tyrone +tyronic +tyronism +tyrosinase +tyrosine +tyrosinuria +tyrosyl +tyrotoxicon +tyrotoxine +Tyrr +Tyrrhene +Tyrrheni +Tyrrhenian +Tyrsenoi +Tyrtaean +tysonite +tyste +tyt +Tyto +Tytonidae +Tzaam +Tzapotec +tzaritza +Tzendal +Tzental +tzolkin +tzontle +Tzotzil +Tzutuhil +U +u +uang +Uaraycu +Uarekena +Uaupe +uayeb +Ubbenite +Ubbonite +uberant +uberous +uberously +uberousness +uberty +ubi +ubication +ubiety +Ubii +Ubiquarian +ubiquarian +ubiquious +Ubiquist +ubiquit +Ubiquitarian +ubiquitarian +Ubiquitarianism +ubiquitariness +ubiquitary +Ubiquitism +Ubiquitist +ubiquitous +ubiquitously +ubiquitousness +ubiquity +ubussu +Uca +Ucal +Ucayale +Uchean +Uchee +uckia +Ud +udal +udaler +udaller +udalman +udasi +udder +uddered +udderful +udderless +udderlike +udell +Udi +Udic +Udish +udo +Udolphoish +udometer +udometric +udometry +udomograph +Uds +Ueueteotl +ug +Ugandan +Ugarono +ugh +uglification +uglifier +uglify +uglily +ugliness +uglisome +ugly +Ugrian +Ugric +Ugroid +ugsome +ugsomely +ugsomeness +uhlan +uhllo +uhtensang +uhtsong +Uigur +Uigurian +Uiguric +uily +uinal +Uinta +uintaite +uintathere +Uintatheriidae +Uintatherium +uintjie +Uirina +Uitotan +uitspan +uji +ukase +uke +ukiyoye +Ukrainer +Ukrainian +ukulele +ula +ulatrophia +ulcer +ulcerable +ulcerate +ulceration +ulcerative +ulcered +ulceromembranous +ulcerous +ulcerously +ulcerousness +ulcery +ulcuscle +ulcuscule +ule +ulema +ulemorrhagia +ulerythema +uletic +Ulex +ulex +ulexine +ulexite +Ulidia +Ulidian +uliginose +uliginous +ulitis +ull +ulla +ullage +ullaged +ullagone +uller +ulling +ullmannite +ulluco +Ulmaceae +ulmaceous +Ulmaria +ulmic +ulmin +ulminic +ulmo +ulmous +Ulmus +ulna +ulnad +ulnae +ulnar +ulnare +ulnaria +ulnocarpal +ulnocondylar +ulnometacarpal +ulnoradial +uloborid +Uloboridae +Uloborus +ulocarcinoma +uloid +Ulonata +uloncus +Ulophocinae +ulorrhagia +ulorrhagy +ulorrhea +Ulothrix +Ulotrichaceae +ulotrichaceous +Ulotrichales +ulotrichan +Ulotriches +Ulotrichi +ulotrichous +ulotrichy +ulrichite +ulster +ulstered +ulsterette +Ulsterian +ulstering +Ulsterite +Ulsterman +ulterior +ulteriorly +ultima +ultimacy +ultimata +ultimate +ultimately +ultimateness +ultimation +ultimatum +ultimity +ultimo +ultimobranchial +ultimogenitary +ultimogeniture +ultimum +Ultonian +ultra +ultrabasic +ultrabasite +ultrabelieving +ultrabenevolent +ultrabrachycephalic +ultrabrachycephaly +ultrabrilliant +ultracentenarian +ultracentenarianism +ultracentralizer +ultracentrifuge +ultraceremonious +ultrachurchism +ultracivil +ultracomplex +ultraconcomitant +ultracondenser +ultraconfident +ultraconscientious +ultraconservatism +ultraconservative +ultracordial +ultracosmopolitan +ultracredulous +ultracrepidarian +ultracrepidarianism +ultracrepidate +ultracritical +ultradandyism +ultradeclamatory +ultrademocratic +ultradespotic +ultradignified +ultradiscipline +ultradolichocephalic +ultradolichocephaly +ultradolichocranial +ultraeducationist +ultraeligible +ultraelliptic +ultraemphasis +ultraenergetic +ultraenforcement +ultraenthusiasm +ultraenthusiastic +ultraepiscopal +ultraevangelical +ultraexcessive +ultraexclusive +ultraexpeditious +ultrafantastic +ultrafashionable +ultrafastidious +ultrafederalist +ultrafeudal +ultrafidian +ultrafidianism +ultrafilter +ultrafilterability +ultrafilterable +ultrafiltrate +ultrafiltration +ultraformal +ultrafrivolous +ultragallant +ultragaseous +ultragenteel +ultragood +ultragrave +ultraheroic +ultrahonorable +ultrahuman +ultraimperialism +ultraimperialist +ultraimpersonal +ultrainclusive +ultraindifferent +ultraindulgent +ultraingenious +ultrainsistent +ultraintimate +ultrainvolved +ultraism +ultraist +ultraistic +ultralaborious +ultralegality +ultralenient +ultraliberal +ultraliberalism +ultralogical +ultraloyal +ultraluxurious +ultramarine +ultramaternal +ultramaximal +ultramelancholy +ultramicrochemical +ultramicrochemist +ultramicrochemistry +ultramicrometer +ultramicron +ultramicroscope +ultramicroscopic +ultramicroscopical +ultramicroscopy +ultraminute +ultramoderate +ultramodern +ultramodernism +ultramodernist +ultramodernistic +ultramodest +ultramontane +ultramontanism +ultramontanist +ultramorose +ultramulish +ultramundane +ultranational +ultranationalism +ultranationalist +ultranatural +ultranegligent +ultranice +ultranonsensical +ultraobscure +ultraobstinate +ultraofficious +ultraoptimistic +ultraornate +ultraorthodox +ultraorthodoxy +ultraoutrageous +ultrapapist +ultraparallel +ultraperfect +ultrapersuasive +ultraphotomicrograph +ultrapious +ultraplanetary +ultraplausible +ultrapopish +ultraproud +ultraprudent +ultraradical +ultraradicalism +ultrarapid +ultrareactionary +ultrared +ultrarefined +ultrarefinement +ultrareligious +ultraremuneration +ultrarepublican +ultrarevolutionary +ultrarevolutionist +ultraritualism +ultraromantic +ultraroyalism +ultraroyalist +ultrasanguine +ultrascholastic +ultraselect +ultraservile +ultrasevere +ultrashrewd +ultrasimian +ultrasolemn +ultrasonic +ultrasonics +ultraspartan +ultraspecialization +ultraspiritualism +ultrasplendid +ultrastandardization +ultrastellar +ultrasterile +ultrastrenuous +ultrastrict +ultrasubtle +ultrasystematic +ultratechnical +ultratense +ultraterrene +ultraterrestrial +ultratotal +ultratrivial +ultratropical +ultraugly +ultrauncommon +ultraurgent +ultravicious +ultraviolent +ultraviolet +ultravirtuous +ultravirus +ultravisible +ultrawealthy +ultrawise +ultrayoung +ultrazealous +ultrazodiacal +ultroneous +ultroneously +ultroneousness +ulu +Ulua +ulua +uluhi +ululant +ululate +ululation +ululative +ululatory +ululu +Ulva +Ulvaceae +ulvaceous +Ulvales +Ulvan +Ulyssean +Ulysses +um +umangite +Umatilla +Umaua +umbeclad +umbel +umbeled +umbella +Umbellales +umbellar +umbellate +umbellated +umbellately +umbellet +umbellic +umbellifer +Umbelliferae +umbelliferone +umbelliferous +umbelliflorous +umbelliform +umbelloid +Umbellula +Umbellularia +umbellulate +umbellule +Umbellulidae +umbelluliferous +umbelwort +umber +umbethink +umbilectomy +umbilic +umbilical +umbilically +umbilicar +Umbilicaria +umbilicate +umbilicated +umbilication +umbilici +umbiliciform +umbilicus +umbiliform +umbilroot +umble +umbo +umbolateral +umbonal +umbonate +umbonated +umbonation +umbone +umbones +umbonial +umbonic +umbonulate +umbonule +Umbra +umbra +umbracious +umbraciousness +umbraculate +umbraculiferous +umbraculiform +umbraculum +umbrae +umbrage +umbrageous +umbrageously +umbrageousness +umbral +umbrally +umbratile +umbrel +umbrella +umbrellaed +umbrellaless +umbrellalike +umbrellawise +umbrellawort +umbrette +Umbrian +Umbriel +umbriferous +umbriferously +umbriferousness +umbril +umbrine +umbrose +umbrosity +umbrous +Umbundu +ume +umiak +umiri +umlaut +ump +umph +umpirage +umpire +umpirer +umpireship +umpiress +umpirism +Umpqua +umpteen +umpteenth +umptekite +umptieth +umpty +umquhile +umu +un +Una +unabandoned +unabased +unabasedly +unabashable +unabashed +unabashedly +unabatable +unabated +unabatedly +unabating +unabatingly +unabbreviated +unabetted +unabettedness +unabhorred +unabiding +unabidingly +unabidingness +unability +unabject +unabjured +unable +unableness +unably +unabolishable +unabolished +unabraded +unabrased +unabridgable +unabridged +unabrogated +unabrupt +unabsent +unabsolute +unabsolvable +unabsolved +unabsolvedness +unabsorb +unabsorbable +unabsorbed +unabsorbent +unabstract +unabsurd +unabundance +unabundant +unabundantly +unabused +unacademic +unacademical +unaccelerated +unaccent +unaccented +unaccentuated +unaccept +unacceptability +unacceptable +unacceptableness +unacceptably +unacceptance +unacceptant +unaccepted +unaccessibility +unaccessible +unaccessibleness +unaccessibly +unaccessional +unaccessory +unaccidental +unaccidentally +unaccidented +unacclimated +unacclimation +unacclimatization +unacclimatized +unaccommodable +unaccommodated +unaccommodatedness +unaccommodating +unaccommodatingly +unaccommodatingness +unaccompanable +unaccompanied +unaccompanying +unaccomplishable +unaccomplished +unaccomplishedness +unaccord +unaccordable +unaccordance +unaccordant +unaccorded +unaccording +unaccordingly +unaccostable +unaccosted +unaccountability +unaccountable +unaccountableness +unaccountably +unaccounted +unaccoutered +unaccoutred +unaccreditated +unaccredited +unaccrued +unaccumulable +unaccumulate +unaccumulated +unaccumulation +unaccuracy +unaccurate +unaccurately +unaccurateness +unaccursed +unaccusable +unaccusably +unaccuse +unaccusing +unaccustom +unaccustomed +unaccustomedly +unaccustomedness +unachievable +unachieved +unaching +unacidulated +unacknowledged +unacknowledgedness +unacknowledging +unacknowledgment +unacoustic +unacquaint +unacquaintable +unacquaintance +unacquainted +unacquaintedly +unacquaintedness +unacquiescent +unacquirable +unacquirableness +unacquirably +unacquired +unacquit +unacquittable +unacquitted +unacquittedness +unact +unactability +unactable +unacted +unacting +unactinic +unaction +unactivated +unactive +unactively +unactiveness +unactivity +unactorlike +unactual +unactuality +unactually +unactuated +unacute +unacutely +unadapt +unadaptability +unadaptable +unadaptableness +unadaptably +unadapted +unadaptedly +unadaptedness +unadaptive +unadd +unaddable +unadded +unaddicted +unaddictedness +unadditional +unaddress +unaddressed +unadequate +unadequately +unadequateness +unadherence +unadherent +unadherently +unadhesive +unadjacent +unadjacently +unadjectived +unadjourned +unadjournment +unadjudged +unadjust +unadjustably +unadjusted +unadjustment +unadministered +unadmirable +unadmire +unadmired +unadmiring +unadmissible +unadmissibly +unadmission +unadmittable +unadmittableness +unadmittably +unadmitted +unadmittedly +unadmitting +unadmonished +unadopt +unadoptable +unadoptably +unadopted +unadoption +unadorable +unadoration +unadored +unadoring +unadorn +unadornable +unadorned +unadornedly +unadornedness +unadornment +unadult +unadulterate +unadulterated +unadulteratedly +unadulteratedness +unadulterately +unadulterous +unadulterously +unadvanced +unadvancedly +unadvancedness +unadvancement +unadvancing +unadvantaged +unadvantageous +unadventured +unadventuring +unadventurous +unadventurously +unadverse +unadversely +unadverseness +unadvertency +unadvertised +unadvertisement +unadvertising +unadvisability +unadvisable +unadvisableness +unadvisably +unadvised +unadvisedly +unadvisedness +unadvocated +unaerated +unaesthetic +unaesthetical +unafeard +unafeared +unaffable +unaffably +unaffected +unaffectedly +unaffectedness +unaffecting +unaffectionate +unaffectionately +unaffectioned +unaffianced +unaffied +unaffiliated +unaffiliation +unaffirmation +unaffirmed +unaffixed +unafflicted +unafflictedly +unafflicting +unaffliction +unaffordable +unafforded +unaffranchised +unaffrighted +unaffrightedly +unaffronted +unafire +unafloat +unaflow +unafraid +unaged +unaggravated +unaggravating +unaggregated +unaggression +unaggressive +unaggressively +unaggressiveness +unaghast +unagile +unagility +unaging +unagitated +unagitatedly +unagitatedness +unagitation +unagonize +unagrarian +unagreeable +unagreeableness +unagreeably +unagreed +unagreeing +unagreement +unagricultural +unaidable +unaided +unaidedly +unaiding +unailing +unaimed +unaiming +unaired +unaisled +Unakhotana +unakin +unakite +unal +Unalachtigo +unalarm +unalarmed +unalarming +Unalaska +unalcoholized +unaldermanly +unalert +unalertly +unalertness +unalgebraical +unalienable +unalienableness +unalienably +unalienated +unalignable +unaligned +unalike +unalimentary +unalist +unalive +unallayable +unallayably +unallayed +unalleged +unallegorical +unalleviably +unalleviated +unalleviation +unalliable +unallied +unalliedly +unalliedness +unallotment +unallotted +unallow +unallowable +unallowed +unallowedly +unallowing +unalloyed +unallurable +unallured +unalluring +unalluringly +unalmsed +unalone +unaloud +unalphabeted +unalphabetic +unalphabetical +unalterability +unalterable +unalterableness +unalterably +unalteration +unaltered +unaltering +unalternated +unamalgamable +unamalgamated +unamalgamating +unamassed +unamazed +unamazedly +unambiguity +unambiguous +unambiguously +unambiguousness +unambition +unambitious +unambitiously +unambitiousness +unambrosial +unambush +unamenability +unamenable +unamenableness +unamenably +unamend +unamendable +unamended +unamendedly +unamending +unamendment +unamerced +Unami +unamiability +unamiable +unamiableness +unamiably +unamicable +unamicably +unamiss +unamo +unamortization +unamortized +unample +unamplifiable +unamplified +unamply +unamputated +unamusable +unamusably +unamused +unamusement +unamusing +unamusingly +unamusive +unanalogical +unanalogous +unanalogously +unanalogousness +unanalytic +unanalytical +unanalyzable +unanalyzed +unanalyzing +unanatomizable +unanatomized +unancestored +unancestried +unanchor +unanchored +unanchylosed +unancient +unaneled +unangelic +unangelical +unangrily +unangry +unangular +unanimalized +unanimate +unanimated +unanimatedly +unanimatedness +unanimately +unanimism +unanimist +unanimistic +unanimistically +unanimity +unanimous +unanimously +unanimousness +unannealed +unannex +unannexed +unannexedly +unannexedness +unannihilable +unannihilated +unannotated +unannounced +unannoyed +unannoying +unannullable +unannulled +unanointed +unanswerability +unanswerable +unanswerableness +unanswerably +unanswered +unanswering +unantagonistic +unantagonizable +unantagonized +unantagonizing +unanticipated +unanticipating +unanticipatingly +unanticipation +unanticipative +unantiquated +unantiquatedness +unantique +unantiquity +unanxiety +unanxious +unanxiously +unanxiousness +unapart +unapocryphal +unapologetic +unapologizing +unapostatized +unapostolic +unapostolical +unapostolically +unapostrophized +unappalled +unappareled +unapparent +unapparently +unapparentness +unappealable +unappealableness +unappealably +unappealed +unappealing +unappeasable +unappeasableness +unappeasably +unappeased +unappeasedly +unappeasedness +unappendaged +unapperceived +unappertaining +unappetizing +unapplauded +unapplauding +unapplausive +unappliable +unappliableness +unappliably +unapplianced +unapplicable +unapplicableness +unapplicably +unapplied +unapplying +unappoint +unappointable +unappointableness +unappointed +unapportioned +unapposite +unappositely +unappraised +unappreciable +unappreciableness +unappreciably +unappreciated +unappreciating +unappreciation +unappreciative +unappreciatively +unappreciativeness +unapprehendable +unapprehendableness +unapprehendably +unapprehended +unapprehending +unapprehensible +unapprehensibleness +unapprehension +unapprehensive +unapprehensively +unapprehensiveness +unapprenticed +unapprised +unapprisedly +unapprisedness +unapproachability +unapproachable +unapproachableness +unapproached +unapproaching +unapprobation +unappropriable +unappropriate +unappropriated +unappropriately +unappropriateness +unappropriation +unapprovable +unapprovableness +unapprovably +unapproved +unapproving +unapprovingly +unapproximate +unapproximately +unaproned +unapropos +unapt +unaptitude +unaptly +unaptness +unarbitrarily +unarbitrariness +unarbitrary +unarbitrated +unarch +unarchdeacon +unarched +unarchitectural +unarduous +unarguable +unarguableness +unarguably +unargued +unarguing +unargumentative +unargumentatively +unarisen +unarising +unaristocratic +unaristocratically +unarithmetical +unarithmetically +unark +unarm +unarmed +unarmedly +unarmedness +unarmored +unarmorial +unaromatized +unarousable +unaroused +unarousing +unarraignable +unarraigned +unarranged +unarray +unarrayed +unarrestable +unarrested +unarresting +unarrival +unarrived +unarriving +unarrogance +unarrogant +unarrogating +unarted +unartful +unartfully +unartfulness +unarticled +unarticulate +unarticulated +unartificial +unartificiality +unartificially +unartistic +unartistical +unartistically +unartistlike +unary +unascendable +unascendableness +unascended +unascertainable +unascertainableness +unascertainably +unascertained +unashamed +unashamedly +unashamedness +unasinous +unaskable +unasked +unasking +unasleep +unaspersed +unasphalted +unaspirated +unaspiring +unaspiringly +unaspiringness +unassailable +unassailableness +unassailably +unassailed +unassailing +unassassinated +unassaultable +unassaulted +unassayed +unassaying +unassembled +unassented +unassenting +unasserted +unassertive +unassertiveness +unassessable +unassessableness +unassessed +unassibilated +unassiduous +unassignable +unassignably +unassigned +unassimilable +unassimilated +unassimilating +unassimilative +unassisted +unassisting +unassociable +unassociably +unassociated +unassociative +unassociativeness +unassoiled +unassorted +unassuageable +unassuaged +unassuaging +unassuetude +unassumable +unassumed +unassuming +unassumingly +unassumingness +unassured +unassuredly +unassuredness +unassuring +unasterisk +unastonish +unastonished +unastonishment +unastray +unathirst +unathletically +unatmospheric +unatonable +unatoned +unatoning +unattach +unattachable +unattached +unattackable +unattackableness +unattackably +unattacked +unattainability +unattainable +unattainableness +unattainably +unattained +unattaining +unattainment +unattaint +unattainted +unattaintedly +unattempered +unattemptable +unattempted +unattempting +unattendance +unattendant +unattended +unattentive +unattenuated +unattested +unattestedness +unattire +unattired +unattractable +unattractableness +unattracted +unattracting +unattractive +unattractively +unattractiveness +unattributable +unattributed +unattuned +unau +unauctioned +unaudible +unaudibleness +unaudibly +unaudienced +unaudited +unaugmentable +unaugmented +unauspicious +unauspiciously +unauspiciousness +unaustere +unauthentic +unauthentical +unauthentically +unauthenticated +unauthenticity +unauthorish +unauthoritative +unauthoritatively +unauthoritativeness +unauthoritied +unauthoritiveness +unauthorizable +unauthorize +unauthorized +unauthorizedly +unauthorizedness +unautomatic +unautumnal +unavailability +unavailable +unavailableness +unavailably +unavailed +unavailful +unavailing +unavailingly +unavengeable +unavenged +unavenging +unavenued +unaveraged +unaverred +unaverted +unavertible +unavertibleness +unavertibly +unavian +unavoidable +unavoidableness +unavoidably +unavoidal +unavoided +unavoiding +unavouchable +unavouchableness +unavouchably +unavouched +unavowable +unavowableness +unavowably +unavowed +unavowedly +unawakable +unawakableness +unawake +unawaked +unawakened +unawakenedness +unawakening +unawaking +unawardable +unawardableness +unawardably +unawarded +unaware +unawared +unawaredly +unawareness +unawares +unaway +unawed +unawful +unawfully +unawkward +unawned +unaxled +unazotized +unbackboarded +unbacked +unbackward +unbadged +unbaffled +unbaffling +unbag +unbagged +unbailable +unbailableness +unbailed +unbain +unbait +unbaited +unbaized +unbaked +unbalance +unbalanceable +unbalanceably +unbalanced +unbalancement +unbalancing +unbalconied +unbale +unbalked +unballast +unballasted +unballoted +unbandage +unbandaged +unbanded +unbanished +unbank +unbankable +unbankableness +unbankably +unbanked +unbankrupt +unbannered +unbaptize +unbaptized +unbar +unbarb +unbarbarize +unbarbarous +unbarbed +unbarbered +unbare +unbargained +unbark +unbarking +unbaronet +unbarrable +unbarred +unbarrel +unbarreled +unbarren +unbarrenness +unbarricade +unbarricaded +unbarricadoed +unbase +unbased +unbasedness +unbashful +unbashfully +unbashfulness +unbasket +unbastardized +unbaste +unbasted +unbastilled +unbastinadoed +unbated +unbathed +unbating +unbatted +unbatten +unbatterable +unbattered +unbattling +unbay +unbe +unbeached +unbeaconed +unbeaded +unbear +unbearable +unbearableness +unbearably +unbeard +unbearded +unbearing +unbeast +unbeatable +unbeatableness +unbeatably +unbeaten +unbeaued +unbeauteous +unbeauteously +unbeauteousness +unbeautified +unbeautiful +unbeautifully +unbeautifulness +unbeautify +unbeavered +unbeclogged +unbeclouded +unbecome +unbecoming +unbecomingly +unbecomingness +unbed +unbedabbled +unbedaggled +unbedashed +unbedaubed +unbedded +unbedecked +unbedewed +unbedimmed +unbedinned +unbedizened +unbedraggled +unbefit +unbefitting +unbefittingly +unbefittingness +unbefool +unbefriend +unbefriended +unbefringed +unbeget +unbeggar +unbegged +unbegilt +unbeginning +unbeginningly +unbeginningness +unbegirded +unbegirt +unbegot +unbegotten +unbegottenly +unbegottenness +unbegreased +unbegrimed +unbegrudged +unbeguile +unbeguiled +unbeguileful +unbegun +unbehaving +unbeheaded +unbeheld +unbeholdable +unbeholden +unbeholdenness +unbeholding +unbehoveful +unbehoving +unbeing +unbejuggled +unbeknown +unbeknownst +unbelied +unbelief +unbeliefful +unbelieffulness +unbelievability +unbelievable +unbelievableness +unbelievably +unbelieve +unbelieved +unbeliever +unbelieving +unbelievingly +unbelievingness +unbell +unbellicose +unbelligerent +unbelonging +unbeloved +unbelt +unbemoaned +unbemourned +unbench +unbend +unbendable +unbendableness +unbendably +unbended +unbending +unbendingly +unbendingness +unbendsome +unbeneficed +unbeneficent +unbeneficial +unbenefitable +unbenefited +unbenefiting +unbenetted +unbenevolence +unbenevolent +unbenevolently +unbenight +unbenighted +unbenign +unbenignant +unbenignantly +unbenignity +unbenignly +unbent +unbenumb +unbenumbed +unbequeathable +unbequeathed +unbereaved +unbereft +unberouged +unberth +unberufen +unbeseem +unbeseeming +unbeseemingly +unbeseemingness +unbeseemly +unbeset +unbesieged +unbesmeared +unbesmirched +unbesmutted +unbesot +unbesought +unbespeak +unbespoke +unbespoken +unbesprinkled +unbestarred +unbestowed +unbet +unbeteared +unbethink +unbethought +unbetide +unbetoken +unbetray +unbetrayed +unbetraying +unbetrothed +unbetterable +unbettered +unbeveled +unbewailed +unbewailing +unbewilder +unbewildered +unbewilled +unbewitch +unbewitched +unbewitching +unbewrayed +unbewritten +unbias +unbiasable +unbiased +unbiasedly +unbiasedness +unbibulous +unbickered +unbickering +unbid +unbidable +unbiddable +unbidden +unbigged +unbigoted +unbilled +unbillet +unbilleted +unbind +unbindable +unbinding +unbiographical +unbiological +unbirdlike +unbirdlimed +unbirdly +unbirthday +unbishop +unbishoply +unbit +unbiting +unbitt +unbitted +unbitten +unbitter +unblacked +unblackened +unblade +unblamable +unblamableness +unblamably +unblamed +unblaming +unblanched +unblanketed +unblasphemed +unblasted +unblazoned +unbleached +unbleaching +unbled +unbleeding +unblemishable +unblemished +unblemishedness +unblemishing +unblenched +unblenching +unblenchingly +unblendable +unblended +unblent +unbless +unblessed +unblessedness +unblest +unblighted +unblightedly +unblightedness +unblind +unblindfold +unblinking +unblinkingly +unbliss +unblissful +unblistered +unblithe +unblithely +unblock +unblockaded +unblocked +unblooded +unbloodied +unbloodily +unbloodiness +unbloody +unbloom +unbloomed +unblooming +unblossomed +unblossoming +unblotted +unbloused +unblown +unblued +unbluestockingish +unbluffed +unbluffing +unblunder +unblundered +unblundering +unblunted +unblurred +unblush +unblushing +unblushingly +unblushingness +unboarded +unboasted +unboastful +unboastfully +unboasting +unboat +unbodied +unbodiliness +unbodily +unboding +unbodkined +unbody +unbodylike +unbog +unboggy +unbohemianize +unboiled +unboisterous +unbokel +unbold +unbolden +unboldly +unboldness +unbolled +unbolster +unbolstered +unbolt +unbolted +unbombast +unbondable +unbondableness +unbonded +unbone +unboned +unbonnet +unbonneted +unbonny +unbooked +unbookish +unbooklearned +unboot +unbooted +unboraxed +unborder +unbordered +unbored +unboring +unborn +unborne +unborough +unborrowed +unborrowing +unbosom +unbosomer +unbossed +unbotanical +unbothered +unbothering +unbottle +unbottom +unbottomed +unbought +unbound +unboundable +unboundableness +unboundably +unbounded +unboundedly +unboundedness +unboundless +unbounteous +unbountiful +unbountifully +unbountifulness +unbow +unbowable +unbowdlerized +unbowed +unbowel +unboweled +unbowered +unbowing +unbowingness +unbowled +unbowsome +unbox +unboxed +unboy +unboyish +unboylike +unbrace +unbraced +unbracedness +unbracelet +unbraceleted +unbracing +unbragged +unbragging +unbraid +unbraided +unbrailed +unbrained +unbran +unbranched +unbranching +unbrand +unbranded +unbrandied +unbrave +unbraved +unbravely +unbraze +unbreachable +unbreached +unbreaded +unbreakable +unbreakableness +unbreakably +unbreakfasted +unbreaking +unbreast +unbreath +unbreathable +unbreathableness +unbreathed +unbreathing +unbred +unbreech +unbreeched +unbreezy +unbrent +unbrewed +unbribable +unbribableness +unbribably +unbribed +unbribing +unbrick +unbridegroomlike +unbridgeable +unbridged +unbridle +unbridled +unbridledly +unbridledness +unbridling +unbrief +unbriefed +unbriefly +unbright +unbrightened +unbrilliant +unbrimming +unbrined +unbrittle +unbroached +unbroad +unbroadcasted +unbroidered +unbroiled +unbroke +unbroken +unbrokenly +unbrokenness +unbronzed +unbrooch +unbrooded +unbrookable +unbrookably +unbrothered +unbrotherlike +unbrotherliness +unbrotherly +unbrought +unbrown +unbrowned +unbruised +unbrushed +unbrutalize +unbrutalized +unbrute +unbrutelike +unbrutify +unbrutize +unbuckle +unbuckramed +unbud +unbudded +unbudgeability +unbudgeable +unbudgeableness +unbudgeably +unbudged +unbudgeted +unbudging +unbuffed +unbuffered +unbuffeted +unbuild +unbuilded +unbuilt +unbulky +unbulled +unbulletined +unbumped +unbumptious +unbunched +unbundle +unbundled +unbung +unbungling +unbuoyant +unbuoyed +unburden +unburdened +unburdenment +unburdensome +unburdensomeness +unburgessed +unburiable +unburial +unburied +unburlesqued +unburly +unburn +unburnable +unburned +unburning +unburnished +unburnt +unburrow +unburrowed +unburst +unburstable +unburstableness +unburthen +unbury +unbush +unbusied +unbusily +unbusiness +unbusinesslike +unbusk +unbuskin +unbuskined +unbustling +unbusy +unbutchered +unbutcherlike +unbuttered +unbutton +unbuttoned +unbuttonment +unbuttressed +unbuxom +unbuxomly +unbuxomness +unbuyable +unbuyableness +unbuying +unca +uncabined +uncabled +uncadenced +uncage +uncaged +uncake +uncalcareous +uncalcified +uncalcined +uncalculable +uncalculableness +uncalculably +uncalculated +uncalculating +uncalculatingly +uncalendered +uncalk +uncalked +uncall +uncalled +uncallow +uncallower +uncalm +uncalmed +uncalmly +uncalumniated +uncambered +uncamerated +uncamouflaged +uncanceled +uncancellable +uncancelled +uncandid +uncandidly +uncandidness +uncandied +uncandor +uncaned +uncankered +uncanned +uncannily +uncanniness +uncanny +uncanonic +uncanonical +uncanonically +uncanonicalness +uncanonize +uncanonized +uncanopied +uncantoned +uncantonized +uncanvassably +uncanvassed +uncap +uncapable +uncapableness +uncapably +uncapacious +uncapacitate +uncaparisoned +uncapitalized +uncapped +uncapper +uncapsizable +uncapsized +uncaptained +uncaptioned +uncaptious +uncaptiously +uncaptivate +uncaptivated +uncaptivating +uncaptived +uncapturable +uncaptured +uncarbonated +uncarboned +uncarbureted +uncarded +uncardinal +uncardinally +uncareful +uncarefully +uncarefulness +uncaressed +uncargoed +Uncaria +uncaricatured +uncaring +uncarnate +uncarnivorous +uncaroled +uncarpentered +uncarpeted +uncarriageable +uncarried +uncart +uncarted +uncartooned +uncarved +uncase +uncased +uncasemated +uncask +uncasked +uncasketed +uncasque +uncassock +uncast +uncaste +uncastigated +uncastle +uncastled +uncastrated +uncasual +uncatalogued +uncatchable +uncate +uncatechised +uncatechisedness +uncatechized +uncatechizedness +uncategorized +uncathedraled +uncatholcity +uncatholic +uncatholical +uncatholicalness +uncatholicize +uncatholicly +uncaucusable +uncaught +uncausatively +uncaused +uncauterized +uncautious +uncautiously +uncautiousness +uncavalier +uncavalierly +uncave +unceasable +unceased +unceasing +unceasingly +unceasingness +unceded +unceiled +unceilinged +uncelebrated +uncelebrating +uncelestial +uncelestialized +uncellar +uncement +uncemented +uncementing +uncensorable +uncensored +uncensorious +uncensoriously +uncensoriousness +uncensurable +uncensured +uncensuring +uncenter +uncentered +uncentral +uncentrality +uncentrally +uncentred +uncentury +uncereclothed +unceremented +unceremonial +unceremonious +unceremoniously +unceremoniousness +uncertain +uncertainly +uncertainness +uncertainty +uncertifiable +uncertifiableness +uncertificated +uncertified +uncertifying +uncertitude +uncessant +uncessantly +uncessantness +unchafed +unchain +unchainable +unchained +unchair +unchaired +unchalked +unchallengeable +unchallengeableness +unchallengeably +unchallenged +unchallenging +unchambered +unchamfered +unchampioned +unchance +unchancellor +unchancy +unchange +unchangeability +unchangeable +unchangeableness +unchangeably +unchanged +unchangedness +unchangeful +unchangefulness +unchanging +unchangingly +unchangingness +unchanneled +unchannelled +unchanted +unchaperoned +unchaplain +unchapleted +unchapter +unchaptered +uncharacter +uncharactered +uncharacteristic +uncharacteristically +uncharacterized +uncharge +unchargeable +uncharged +uncharging +uncharily +unchariness +unchariot +uncharitable +uncharitableness +uncharitably +uncharity +uncharm +uncharmable +uncharmed +uncharming +uncharnel +uncharred +uncharted +unchartered +unchary +unchased +unchaste +unchastely +unchastened +unchasteness +unchastisable +unchastised +unchastising +unchastity +unchatteled +unchauffeured +unchawed +uncheat +uncheated +uncheating +uncheck +uncheckable +unchecked +uncheckered +uncheerable +uncheered +uncheerful +uncheerfully +uncheerfulness +uncheerily +uncheeriness +uncheering +uncheery +unchemical +unchemically +uncherished +uncherishing +unchested +unchevroned +unchewable +unchewableness +unchewed +unchid +unchidden +unchided +unchiding +unchidingly +unchild +unchildish +unchildishly +unchildishness +unchildlike +unchilled +unchiming +unchinked +unchipped +unchiseled +unchiselled +unchivalric +unchivalrous +unchivalrously +unchivalrousness +unchivalry +unchloridized +unchoicely +unchokable +unchoked +uncholeric +unchoosable +unchopped +unchoral +unchorded +unchosen +unchrisom +unchristen +unchristened +unchristian +unchristianity +unchristianize +unchristianized +unchristianlike +unchristianly +unchristianness +unchronicled +unchronological +unchronologically +unchurch +unchurched +unchurchlike +unchurchly +unchurn +unci +uncia +uncial +uncialize +uncially +uncicatrized +unciferous +unciform +unciliated +uncinal +Uncinaria +uncinariasis +uncinariatic +Uncinata +uncinate +uncinated +uncinatum +uncinch +uncinct +uncinctured +uncini +Uncinula +uncinus +uncipher +uncircular +uncircularized +uncirculated +uncircumcised +uncircumcisedness +uncircumcision +uncircumlocutory +uncircumscribable +uncircumscribed +uncircumscribedness +uncircumscript +uncircumscriptible +uncircumscription +uncircumspect +uncircumspection +uncircumspectly +uncircumspectness +uncircumstanced +uncircumstantial +uncirostrate +uncite +uncited +uncitied +uncitizen +uncitizenlike +uncitizenly +uncity +uncivic +uncivil +uncivilish +uncivility +uncivilizable +uncivilization +uncivilize +uncivilized +uncivilizedly +uncivilizedness +uncivilly +uncivilness +unclad +unclaimed +unclaiming +unclamorous +unclamp +unclamped +unclarified +unclarifying +unclarity +unclashing +unclasp +unclasped +unclassable +unclassableness +unclassably +unclassed +unclassible +unclassical +unclassically +unclassifiable +unclassifiableness +unclassification +unclassified +unclassify +unclassifying +unclawed +unclay +unclayed +uncle +unclead +unclean +uncleanable +uncleaned +uncleanlily +uncleanliness +uncleanly +uncleanness +uncleansable +uncleanse +uncleansed +uncleansedness +unclear +uncleared +unclearing +uncleavable +uncleave +uncledom +uncleft +unclehood +unclement +unclemently +unclementness +unclench +unclergy +unclergyable +unclerical +unclericalize +unclerically +unclericalness +unclerklike +unclerkly +uncleship +unclever +uncleverly +uncleverness +unclew +unclick +uncliented +unclify +unclimaxed +unclimb +unclimbable +unclimbableness +unclimbably +unclimbed +unclimbing +unclinch +uncling +unclinical +unclip +unclipped +unclipper +uncloak +uncloakable +uncloaked +unclog +unclogged +uncloister +uncloistered +uncloistral +unclosable +unclose +unclosed +uncloseted +unclothe +unclothed +unclothedly +unclothedness +unclotted +uncloud +unclouded +uncloudedly +uncloudedness +uncloudy +unclout +uncloven +uncloyable +uncloyed +uncloying +unclub +unclubbable +unclubby +unclustered +unclustering +unclutch +unclutchable +unclutched +unclutter +uncluttered +unco +uncoach +uncoachable +uncoachableness +uncoached +uncoacted +uncoagulable +uncoagulated +uncoagulating +uncoat +uncoated +uncoatedness +uncoaxable +uncoaxed +uncoaxing +uncock +uncocked +uncockneyfy +uncocted +uncodded +uncoddled +uncoded +uncodified +uncoerced +uncoffer +uncoffin +uncoffined +uncoffle +uncogent +uncogged +uncogitable +uncognizable +uncognizant +uncognized +uncognoscibility +uncognoscible +uncoguidism +uncoherent +uncoherently +uncoherentness +uncohesive +uncoif +uncoifed +uncoil +uncoiled +uncoin +uncoined +uncoked +uncoking +uncollapsed +uncollapsible +uncollar +uncollared +uncollated +uncollatedness +uncollected +uncollectedly +uncollectedness +uncollectible +uncollectibleness +uncollectibly +uncolleged +uncollegian +uncollegiate +uncolloquial +uncolloquially +uncolonellike +uncolonial +uncolonize +uncolonized +uncolorable +uncolorably +uncolored +uncoloredly +uncoloredness +uncoloured +uncolouredly +uncolouredness +uncolt +uncoly +uncombable +uncombatable +uncombated +uncombed +uncombinable +uncombinableness +uncombinably +uncombine +uncombined +uncombining +uncombiningness +uncombustible +uncome +uncomelily +uncomeliness +uncomely +uncomfort +uncomfortable +uncomfortableness +uncomfortably +uncomforted +uncomforting +uncomfy +uncomic +uncommanded +uncommandedness +uncommanderlike +uncommemorated +uncommenced +uncommendable +uncommendableness +uncommendably +uncommended +uncommensurability +uncommensurable +uncommensurableness +uncommensurate +uncommented +uncommenting +uncommerciable +uncommercial +uncommercially +uncommercialness +uncommingled +uncomminuted +uncommiserated +uncommiserating +uncommissioned +uncommitted +uncommitting +uncommixed +uncommodious +uncommodiously +uncommodiousness +uncommon +uncommonable +uncommonly +uncommonness +uncommonplace +uncommunicable +uncommunicableness +uncommunicably +uncommunicated +uncommunicating +uncommunicative +uncommunicatively +uncommunicativeness +uncommutable +uncommutative +uncommuted +uncompact +uncompacted +Uncompahgre +uncompahgrite +uncompaniable +uncompanied +uncompanioned +uncomparable +uncomparably +uncompared +uncompass +uncompassable +uncompassed +uncompassion +uncompassionate +uncompassionated +uncompassionately +uncompassionateness +uncompassionating +uncompassioned +uncompatible +uncompatibly +uncompellable +uncompelled +uncompelling +uncompensable +uncompensated +uncompetent +uncompetitive +uncompiled +uncomplacent +uncomplained +uncomplaining +uncomplainingly +uncomplainingness +uncomplaint +uncomplaisance +uncomplaisant +uncomplaisantly +uncomplemental +uncompletable +uncomplete +uncompleted +uncompletely +uncompleteness +uncomplex +uncompliability +uncompliable +uncompliableness +uncompliance +uncompliant +uncomplicated +uncomplimentary +uncomplimented +uncomplimenting +uncomplying +uncomposable +uncomposeable +uncomposed +uncompoundable +uncompounded +uncompoundedly +uncompoundedness +uncompounding +uncomprehended +uncomprehending +uncomprehendingly +uncomprehendingness +uncomprehensible +uncomprehension +uncomprehensive +uncomprehensively +uncomprehensiveness +uncompressed +uncompressible +uncomprised +uncomprising +uncomprisingly +uncompromised +uncompromising +uncompromisingly +uncompromisingness +uncompulsive +uncompulsory +uncomputable +uncomputableness +uncomputably +uncomputed +uncomraded +unconcatenated +unconcatenating +unconcealable +unconcealableness +unconcealably +unconcealed +unconcealing +unconcealingly +unconcealment +unconceded +unconceited +unconceivable +unconceivableness +unconceivably +unconceived +unconceiving +unconcern +unconcerned +unconcernedly +unconcernedness +unconcerning +unconcernment +unconcertable +unconcerted +unconcertedly +unconcertedness +unconcessible +unconciliable +unconciliated +unconciliatedness +unconciliating +unconciliatory +unconcludable +unconcluded +unconcluding +unconcludingness +unconclusive +unconclusively +unconclusiveness +unconcocted +unconcordant +unconcrete +unconcreted +unconcurrent +unconcurring +uncondemnable +uncondemned +uncondensable +uncondensableness +uncondensed +uncondensing +uncondescending +uncondescension +uncondition +unconditional +unconditionality +unconditionally +unconditionalness +unconditionate +unconditionated +unconditionately +unconditioned +unconditionedly +unconditionedness +uncondoled +uncondoling +unconducing +unconducive +unconduciveness +unconducted +unconductive +unconductiveness +unconfected +unconfederated +unconferred +unconfess +unconfessed +unconfessing +unconfided +unconfidence +unconfident +unconfidential +unconfidentialness +unconfidently +unconfiding +unconfinable +unconfine +unconfined +unconfinedly +unconfinedness +unconfinement +unconfining +unconfirm +unconfirmative +unconfirmed +unconfirming +unconfiscable +unconfiscated +unconflicting +unconflictingly +unconflictingness +unconformability +unconformable +unconformableness +unconformably +unconformed +unconformedly +unconforming +unconformist +unconformity +unconfound +unconfounded +unconfoundedly +unconfrontable +unconfronted +unconfusable +unconfusably +unconfused +unconfusedly +unconfutable +unconfuted +unconfuting +uncongeal +uncongealable +uncongealed +uncongenial +uncongeniality +uncongenially +uncongested +unconglobated +unconglomerated +unconglutinated +uncongratulate +uncongratulated +uncongratulating +uncongregated +uncongregational +uncongressional +uncongruous +unconjecturable +unconjectured +unconjoined +unconjugal +unconjugated +unconjunctive +unconjured +unconnected +unconnectedly +unconnectedness +unconned +unconnived +unconniving +unconquerable +unconquerableness +unconquerably +unconquered +unconscienced +unconscient +unconscientious +unconscientiously +unconscientiousness +unconscionable +unconscionableness +unconscionably +unconscious +unconsciously +unconsciousness +unconsecrate +unconsecrated +unconsecratedly +unconsecratedness +unconsecration +unconsecutive +unconsent +unconsentaneous +unconsented +unconsenting +unconsequential +unconsequentially +unconsequentialness +unconservable +unconservative +unconserved +unconserving +unconsiderable +unconsiderate +unconsiderately +unconsiderateness +unconsidered +unconsideredly +unconsideredness +unconsidering +unconsideringly +unconsignable +unconsigned +unconsistent +unconsociable +unconsociated +unconsolable +unconsolably +unconsolatory +unconsoled +unconsolidated +unconsolidating +unconsolidation +unconsoling +unconsonancy +unconsonant +unconsonantly +unconsonous +unconspicuous +unconspicuously +unconspicuousness +unconspired +unconspiring +unconspiringly +unconspiringness +unconstancy +unconstant +unconstantly +unconstantness +unconstellated +unconstipated +unconstituted +unconstitutional +unconstitutionalism +unconstitutionality +unconstitutionally +unconstrainable +unconstrained +unconstrainedly +unconstrainedness +unconstraining +unconstraint +unconstricted +unconstruable +unconstructed +unconstructive +unconstructural +unconstrued +unconsular +unconsult +unconsultable +unconsulted +unconsulting +unconsumable +unconsumed +unconsuming +unconsummate +unconsummated +unconsumptive +uncontagious +uncontainable +uncontainableness +uncontainably +uncontained +uncontaminable +uncontaminate +uncontaminated +uncontemned +uncontemnedly +uncontemplated +uncontemporaneous +uncontemporary +uncontemptuous +uncontended +uncontending +uncontent +uncontentable +uncontented +uncontentedly +uncontentedness +uncontenting +uncontentingness +uncontentious +uncontentiously +uncontentiousness +uncontestable +uncontestableness +uncontestably +uncontested +uncontestedly +uncontestedness +uncontinence +uncontinent +uncontinental +uncontinented +uncontinently +uncontinual +uncontinued +uncontinuous +uncontorted +uncontract +uncontracted +uncontractedness +uncontractile +uncontradictable +uncontradictableness +uncontradictably +uncontradicted +uncontradictedly +uncontradictious +uncontradictory +uncontrastable +uncontrasted +uncontrasting +uncontributed +uncontributing +uncontributory +uncontrite +uncontrived +uncontriving +uncontrol +uncontrollability +uncontrollable +uncontrollableness +uncontrollably +uncontrolled +uncontrolledly +uncontrolledness +uncontrolling +uncontroversial +uncontroversially +uncontrovertable +uncontrovertableness +uncontrovertably +uncontroverted +uncontrovertedly +uncontrovertible +uncontrovertibleness +uncontrovertibly +unconvenable +unconvened +unconvenience +unconvenient +unconveniently +unconventional +unconventionalism +unconventionality +unconventionalize +unconventionally +unconventioned +unconversable +unconversableness +unconversably +unconversant +unconversational +unconversion +unconvert +unconverted +unconvertedly +unconvertedness +unconvertibility +unconvertible +unconveyable +unconveyed +unconvicted +unconvicting +unconvince +unconvinced +unconvincedly +unconvincedness +unconvincibility +unconvincible +unconvincing +unconvincingly +unconvincingness +unconvoluted +unconvoyed +unconvulsed +uncookable +uncooked +uncooled +uncoop +uncooped +uncoopered +uncooping +uncope +uncopiable +uncopied +uncopious +uncopyrighted +uncoquettish +uncoquettishly +uncord +uncorded +uncordial +uncordiality +uncordially +uncording +uncore +uncored +uncork +uncorked +uncorker +uncorking +uncorned +uncorner +uncoronated +uncoroneted +uncorporal +uncorpulent +uncorrect +uncorrectable +uncorrected +uncorrectible +uncorrectly +uncorrectness +uncorrelated +uncorrespondency +uncorrespondent +uncorresponding +uncorrigible +uncorrigibleness +uncorrigibly +uncorroborated +uncorroded +uncorrugated +uncorrupt +uncorrupted +uncorruptedly +uncorruptedness +uncorruptibility +uncorruptible +uncorruptibleness +uncorruptibly +uncorrupting +uncorruption +uncorruptive +uncorruptly +uncorruptness +uncorseted +uncosseted +uncost +uncostliness +uncostly +uncostumed +uncottoned +uncouch +uncouched +uncouching +uncounselable +uncounseled +uncounsellable +uncounselled +uncountable +uncountableness +uncountably +uncounted +uncountenanced +uncounteracted +uncounterbalanced +uncounterfeit +uncounterfeited +uncountermandable +uncountermanded +uncountervailed +uncountess +uncountrified +uncouple +uncoupled +uncoupler +uncourageous +uncoursed +uncourted +uncourteous +uncourteously +uncourteousness +uncourtierlike +uncourting +uncourtlike +uncourtliness +uncourtly +uncous +uncousinly +uncouth +uncouthie +uncouthly +uncouthness +uncouthsome +uncovenant +uncovenanted +uncover +uncoverable +uncovered +uncoveredly +uncoveted +uncoveting +uncovetingly +uncovetous +uncowed +uncowl +uncoy +uncracked +uncradled +uncraftily +uncraftiness +uncrafty +uncram +uncramp +uncramped +uncrampedness +uncranked +uncrannied +uncrated +uncravatted +uncraven +uncraving +uncravingly +uncrazed +uncream +uncreased +uncreatability +uncreatable +uncreatableness +uncreate +uncreated +uncreatedness +uncreating +uncreation +uncreative +uncreativeness +uncreaturely +uncredentialed +uncredentialled +uncredibility +uncredible +uncredibly +uncreditable +uncreditableness +uncreditably +uncredited +uncrediting +uncredulous +uncreeping +uncreosoted +uncrest +uncrested +uncrevassed +uncrib +uncried +uncrime +uncriminal +uncriminally +uncrinkle +uncrinkled +uncrinkling +uncrippled +uncrisp +uncritical +uncritically +uncriticisable +uncriticised +uncriticising +uncriticisingly +uncriticism +uncriticizable +uncriticized +uncriticizing +uncriticizingly +uncrochety +uncrook +uncrooked +uncrooking +uncropped +uncropt +uncross +uncrossable +uncrossableness +uncrossed +uncrossexaminable +uncrossexamined +uncrossly +uncrowded +uncrown +uncrowned +uncrowning +uncrucified +uncrudded +uncrude +uncruel +uncrumbled +uncrumple +uncrumpling +uncrushable +uncrushed +uncrusted +uncrying +uncrystaled +uncrystalled +uncrystalline +uncrystallizability +uncrystallizable +uncrystallized +unction +unctional +unctioneer +unctionless +unctious +unctiousness +unctorium +unctuose +unctuosity +unctuous +unctuously +unctuousness +uncubbed +uncubic +uncuckold +uncuckolded +uncudgelled +uncuffed +uncular +unculled +uncultivability +uncultivable +uncultivate +uncultivated +uncultivation +unculturable +unculture +uncultured +uncumber +uncumbered +uncumbrous +uncunning +uncunningly +uncunningness +uncupped +uncurable +uncurableness +uncurably +uncurb +uncurbable +uncurbed +uncurbedly +uncurbing +uncurd +uncurdled +uncurdling +uncured +uncurious +uncuriously +uncurl +uncurled +uncurling +uncurrent +uncurrently +uncurrentness +uncurricularized +uncurried +uncurse +uncursed +uncursing +uncurst +uncurtailed +uncurtain +uncurtained +uncus +uncushioned +uncusped +uncustomable +uncustomarily +uncustomariness +uncustomary +uncustomed +uncut +uncuth +uncuticulate +uncuttable +uncynical +uncynically +uncypress +undabbled +undaggled +undaily +undaintiness +undainty +undallying +undam +undamageable +undamaged +undamaging +undamasked +undammed +undamming +undamn +undamped +undancing +undandiacal +undandled +undangered +undangerous +undangerousness +undared +undaring +undark +undarken +undarkened +undarned +undashed +undatable +undate +undateable +undated +undatedness +undaub +undaubed +undaughter +undaughterliness +undaughterly +undauntable +undaunted +undauntedly +undauntedness +undaunting +undawned +undawning +undazed +undazing +undazzle +undazzled +undazzling +unde +undead +undeadened +undeaf +undealable +undealt +undean +undear +undebarred +undebased +undebatable +undebated +undebating +undebauched +undebilitated +undebilitating +undecagon +undecanaphthene +undecane +undecatoic +undecayable +undecayableness +undecayed +undecayedness +undecaying +undeceased +undeceitful +undeceivable +undeceivableness +undeceivably +undeceive +undeceived +undeceiver +undeceiving +undecency +undecennary +undecennial +undecent +undecently +undeception +undeceptious +undeceptitious +undeceptive +undecidable +undecide +undecided +undecidedly +undecidedness +undeciding +undecimal +undeciman +undecimole +undecipher +undecipherability +undecipherable +undecipherably +undeciphered +undecision +undecisive +undecisively +undecisiveness +undeck +undecked +undeclaimed +undeclaiming +undeclamatory +undeclarable +undeclare +undeclared +undeclinable +undeclinableness +undeclinably +undeclined +undeclining +undecocted +undecoic +undecolic +undecomposable +undecomposed +undecompounded +undecorated +undecorative +undecorous +undecorously +undecorousness +undecorticated +undecoyed +undecreased +undecreasing +undecree +undecreed +undecried +undecyl +undecylenic +undecylic +undedicate +undedicated +undeducible +undeducted +undeeded +undeemed +undeemous +undeemously +undeep +undefaceable +undefaced +undefalcated +undefamed +undefaming +undefatigable +undefaulted +undefaulting +undefeasible +undefeat +undefeatable +undefeated +undefeatedly +undefeatedness +undefecated +undefectible +undefective +undefectiveness +undefendable +undefendableness +undefendably +undefended +undefending +undefense +undefensed +undefensible +undeferential +undeferentially +undeferred +undefiant +undeficient +undefied +undefilable +undefiled +undefiledly +undefiledness +undefinable +undefinableness +undefinably +undefine +undefined +undefinedly +undefinedness +undeflected +undeflowered +undeformed +undeformedness +undefrauded +undefrayed +undeft +undegeneracy +undegenerate +undegenerated +undegenerating +undegraded +undegrading +undeification +undeified +undeify +undeistical +undejected +undelated +undelayable +undelayed +undelayedly +undelaying +undelayingly +undelectable +undelectably +undelegated +undeleted +undeliberate +undeliberated +undeliberately +undeliberateness +undeliberating +undeliberatingly +undeliberative +undeliberativeness +undelible +undelicious +undelight +undelighted +undelightful +undelightfully +undelightfulness +undelighting +undelightsome +undelimited +undelineated +undeliverable +undeliverableness +undelivered +undelivery +undeludable +undelude +undeluded +undeluding +undeluged +undelusive +undelusively +undelve +undelved +undelylene +undemagnetizable +undemanded +undemised +undemocratic +undemocratically +undemocratize +undemolishable +undemolished +undemonstrable +undemonstrably +undemonstratable +undemonstrated +undemonstrative +undemonstratively +undemonstrativeness +undemure +undemurring +unden +undeniable +undeniableness +undeniably +undenied +undeniedly +undenizened +undenominated +undenominational +undenominationalism +undenominationalist +undenominationalize +undenominationally +undenoted +undenounced +undenuded +undepartableness +undepartably +undeparted +undeparting +undependable +undependableness +undependably +undependent +undepending +undephlegmated +undepicted +undepleted +undeplored +undeported +undeposable +undeposed +undeposited +undepraved +undepravedness +undeprecated +undepreciated +undepressed +undepressible +undepressing +undeprivable +undeprived +undepurated +undeputed +under +underabyss +underaccident +underaccommodated +underact +underacted +underacting +underaction +underactor +underadjustment +underadmiral +underadventurer +underage +underagency +underagent +underagitation +underaid +underaim +underair +underalderman +underanged +underarch +underargue +underarm +underaverage +underback +underbailiff +underbake +underbalance +underballast +underbank +underbarber +underbarring +underbasal +underbeadle +underbeak +underbeam +underbear +underbearer +underbearing +underbeat +underbeaten +underbed +underbelly +underbeveling +underbid +underbidder +underbill +underbillow +underbishop +underbishopric +underbit +underbite +underbitted +underbitten +underboard +underboated +underbodice +underbody +underboil +underboom +underborn +underborne +underbottom +underbough +underbought +underbound +underbowed +underbowser +underbox +underboy +underbrace +underbraced +underbranch +underbreath +underbreathing +underbred +underbreeding +underbrew +underbridge +underbrigadier +underbright +underbrim +underbrush +underbubble +underbud +underbuild +underbuilder +underbuilding +underbuoy +underburn +underburned +underburnt +underbursar +underbury +underbush +underbutler +underbuy +undercanopy +undercanvass +undercap +undercapitaled +undercapitalization +undercapitalize +undercaptain +undercarder +undercarriage +undercarry +undercarter +undercarve +undercarved +undercase +undercasing +undercast +undercause +underceiling +undercellar +undercellarer +underchamber +underchamberlain +underchancellor +underchanter +underchap +undercharge +undercharged +underchief +underchime +underchin +underchord +underchurched +undercircle +undercitizen +underclad +underclass +underclassman +underclay +underclearer +underclerk +underclerkship +undercliff +underclift +undercloak +undercloth +underclothe +underclothed +underclothes +underclothing +underclub +underclutch +undercoachman +undercoat +undercoated +undercoater +undercoating +undercollector +undercolor +undercolored +undercoloring +undercommander +undercomment +undercompounded +underconcerned +undercondition +underconsciousness +underconstable +underconsume +underconsumption +undercook +undercool +undercooper +undercorrect +undercountenance +undercourse +undercourtier +undercover +undercovering +undercovert +undercrawl +undercreep +undercrest +undercrier +undercroft +undercrop +undercrust +undercry +undercrypt +undercup +undercurl +undercurrent +undercurve +undercut +undercutter +undercutting +underdauber +underdeacon +underdead +underdebauchee +underdeck +underdepth +underdevelop +underdevelopment +underdevil +underdialogue +underdig +underdip +underdish +underdistinction +underdistributor +underditch +underdive +underdo +underdoctor +underdoer +underdog +underdoing +underdone +underdose +underdot +underdown +underdraft +underdrag +underdrain +underdrainage +underdrainer +underdraught +underdraw +underdrawers +underdrawn +underdress +underdressed +underdrift +underdrive +underdriven +underdrudgery +underdrumming +underdry +underdunged +underearth +undereat +undereaten +underedge +undereducated +underemployment +underengraver +underenter +underer +underescheator +underestimate +underestimation +underexcited +underexercise +underexpose +underexposure +undereye +underface +underfaction +underfactor +underfaculty +underfalconer +underfall +underfarmer +underfeathering +underfeature +underfed +underfeed +underfeeder +underfeeling +underfeet +underfellow +underfiend +underfill +underfilling +underfinance +underfind +underfire +underfitting +underflame +underflannel +underfleece +underflood +underfloor +underflooring +underflow +underfold +underfolded +underfong +underfoot +underfootage +underfootman +underforebody +underform +underfortify +underframe +underframework +underframing +underfreight +underfrequency +underfringe +underfrock +underfur +underfurnish +underfurnisher +underfurrow +undergabble +undergamekeeper +undergaoler +undergarb +undergardener +undergarment +undergarnish +undergauge +undergear +undergeneral +undergentleman +undergird +undergirder +undergirding +undergirdle +undergirth +underglaze +undergloom +underglow +undergnaw +undergo +undergod +undergoer +undergoing +undergore +undergoverness +undergovernment +undergovernor +undergown +undergrad +undergrade +undergraduate +undergraduatedom +undergraduateness +undergraduateship +undergraduatish +undergraduette +undergraining +undergrass +undergreen +undergrieve +undergroan +underground +undergrounder +undergroundling +undergrove +undergrow +undergrowl +undergrown +undergrowth +undergrub +underguard +underguardian +undergunner +underhabit +underhammer +underhand +underhanded +underhandedly +underhandedness +underhang +underhanging +underhangman +underhatch +underhead +underheat +underheaven +underhelp +underhew +underhid +underhill +underhint +underhistory +underhive +underhold +underhole +underhonest +underhorse +underhorsed +underhousemaid +underhum +underhung +underided +underinstrument +underisive +underissue +underivable +underivative +underived +underivedly +underivedness +underjacket +underjailer +underjanitor +underjaw +underjawed +underjobbing +underjudge +underjungle +underkeel +underkeeper +underkind +underking +underkingdom +underlaborer +underlaid +underlain +underland +underlanguaged +underlap +underlapper +underlash +underlaundress +underlawyer +underlay +underlayer +underlaying +underleaf +underlease +underleather +underlegate +underlessee +underlet +underletter +underlevel +underlever +underlid +underlie +underlier +underlieutenant +underlife +underlift +underlight +underliking +underlimbed +underlimit +underline +underlineation +underlineman +underlinement +underlinen +underliner +underling +underlining +underlip +underlive +underload +underlock +underlodging +underloft +underlook +underlooker +underlout +underlunged +underly +underlye +underlying +undermade +undermaid +undermaker +underman +undermanager +undermanned +undermanning +undermark +undermarshal +undermarshalman +undermasted +undermaster +undermatch +undermatched +undermate +undermath +undermeal +undermeaning +undermeasure +undermediator +undermelody +undermentioned +undermiller +undermimic +underminable +undermine +underminer +undermining +underminingly +underminister +underministry +undermist +undermoated +undermoney +undermoral +undermost +undermotion +undermount +undermountain +undermusic +undermuslin +undern +undername +undernatural +underneath +underness +underniceness +undernote +undernoted +undernourish +undernourished +undernourishment +undernsong +underntide +underntime +undernurse +undernutrition +underoccupied +underofficer +underofficered +underofficial +underogating +underogatory +underopinion +underorb +underorganization +underorseman +underoverlooker +underoxidize +underpacking +underpaid +underpain +underpainting +underpan +underpants +underparticipation +underpartner +underpass +underpassion +underpay +underpayment +underpeep +underpeer +underpen +underpeopled +underpetticoat +underpetticoated +underpick +underpier +underpilaster +underpile +underpin +underpinner +underpinning +underpitch +underpitched +underplain +underplan +underplant +underplate +underplay +underplot +underplotter +underply +underpoint +underpole +underpopulate +underpopulation +underporch +underporter +underpose +underpossessor +underpot +underpower +underpraise +underprefect +underprentice +underpresence +underpresser +underpressure +underprice +underpriest +underprincipal +underprint +underprior +underprivileged +underprize +underproduce +underproduction +underproductive +underproficient +underprompt +underprompter +underproof +underprop +underproportion +underproportioned +underproposition +underpropped +underpropper +underpropping +underprospect +underpry +underpuke +underqualified +underqueen +underquote +underranger +underrate +underratement +underrating +underreach +underread +underreader +underrealize +underrealm +underream +underreamer +underreceiver +underreckon +underrecompense +underregion +underregistration +underrent +underrented +underrenting +underrepresent +underrepresentation +underrespected +underriddle +underriding +underrigged +underring +underripe +underripened +underriver +underroarer +underroast +underrobe +underrogue +underroll +underroller +underroof +underroom +underroot +underrooted +underrower +underrule +underruler +underrun +underrunning +undersacristan +undersailed +undersally +undersap +undersatisfaction +undersaturate +undersaturation +undersavior +undersaw +undersawyer +underscale +underscheme +underschool +underscoop +underscore +underscribe +underscript +underscrub +underscrupulous +undersea +underseam +underseaman +undersearch +underseas +underseated +undersecretary +undersecretaryship +undersect +undersee +underseeded +underseedman +undersell +underseller +underselling +undersense +undersequence +underservant +underserve +underservice +underset +undersetter +undersetting +undersettle +undersettler +undersettling +undersexton +undershapen +undersharp +undersheathing +undershepherd +undersheriff +undersheriffry +undersheriffship +undersheriffwick +undershield +undershine +undershining +undershire +undershirt +undershoe +undershoot +undershore +undershorten +undershot +undershrievalty +undershrieve +undershrievery +undershrub +undershrubbiness +undershrubby +undershunter +undershut +underside +undersight +undersighted +undersign +undersignalman +undersigner +undersill +undersinging +undersitter +undersize +undersized +underskin +underskirt +undersky +undersleep +undersleeve +underslip +underslope +undersluice +underslung +undersneer +undersociety +undersoil +undersole +undersomething +undersong +undersorcerer +undersort +undersoul +undersound +undersovereign +undersow +underspar +undersparred +underspecies +underspecified +underspend +undersphere +underspin +underspinner +undersplice +underspore +underspread +underspring +undersprout +underspurleather +undersquare +understaff +understage +understain +understairs +understamp +understand +understandability +understandable +understandableness +understandably +understander +understanding +understandingly +understandingness +understate +understatement +understay +understeer +understem +understep +understeward +understewardship +understimulus +understock +understocking +understood +understory +understrain +understrap +understrapper +understrapping +understratum +understream +understress +understrew +understride +understriding +understrife +understrike +understring +understroke +understrung +understudy +understuff +understuffing +undersuck +undersuggestion +undersuit +undersupply +undersupport +undersurface +underswain +underswamp +undersward +underswearer +undersweat +undersweep +underswell +undertakable +undertake +undertakement +undertaker +undertakerish +undertakerlike +undertakerly +undertakery +undertaking +undertakingly +undertalk +undertapster +undertaxed +underteacher +underteamed +underteller +undertenancy +undertenant +undertenter +undertenure +underterrestrial +undertest +underthane +underthaw +underthief +underthing +underthink +underthirst +underthought +underthroating +underthrob +underthrust +undertide +undertided +undertie +undertime +undertimed +undertint +undertitle +undertone +undertoned +undertook +undertow +undertrader +undertrained +undertread +undertreasurer +undertreat +undertribe +undertrick +undertrodden +undertruck +undertrump +undertruss +undertub +undertune +undertunic +underturf +underturn +underturnkey +undertutor +undertwig +undertype +undertyrant +underusher +undervaluation +undervalue +undervaluement +undervaluer +undervaluing +undervaluinglike +undervaluingly +undervalve +undervassal +undervaulted +undervaulting +undervegetation +underventilation +underverse +undervest +undervicar +underviewer +undervillain +undervinedresser +undervitalized +undervocabularied +undervoice +undervoltage +underwage +underwaist +underwaistcoat +underwalk +underward +underwarden +underwarmth +underwarp +underwash +underwatch +underwatcher +underwater +underwave +underway +underweapon +underwear +underweft +underweigh +underweight +underweighted +underwent +underwheel +underwhistle +underwind +underwing +underwit +underwitch +underwitted +underwood +underwooded +underwork +underworker +underworking +underworkman +underworld +underwrap +underwrite +underwriter +underwriting +underwrought +underyield +underyoke +underzeal +underzealot +undescendable +undescended +undescendible +undescribable +undescribably +undescribed +undescried +undescript +undescriptive +undescrying +undesert +undeserted +undeserting +undeserve +undeserved +undeservedly +undeservedness +undeserver +undeserving +undeservingly +undeservingness +undesign +undesignated +undesigned +undesignedly +undesignedness +undesigning +undesigningly +undesigningness +undesirability +undesirable +undesirableness +undesirably +undesire +undesired +undesiredly +undesiring +undesirous +undesirously +undesirousness +undesisting +undespaired +undespairing +undespairingly +undespatched +undespised +undespising +undespoiled +undespondent +undespondently +undesponding +undespotic +undestined +undestroyable +undestroyed +undestructible +undestructive +undetachable +undetached +undetailed +undetainable +undetained +undetectable +undetected +undetectible +undeteriorated +undeteriorating +undeterminable +undeterminate +undetermination +undetermined +undetermining +undeterred +undeterring +undetested +undetesting +undethronable +undethroned +undetracting +undetractingly +undetrimental +undevelopable +undeveloped +undeveloping +undeviated +undeviating +undeviatingly +undevil +undevious +undeviously +undevisable +undevised +undevoted +undevotion +undevotional +undevoured +undevout +undevoutly +undevoutness +undewed +undewy +undexterous +undexterously +undextrous +undextrously +undiademed +undiagnosable +undiagnosed +undialed +undialyzed +undiametric +undiamonded +undiapered +undiaphanous +undiatonic +undichotomous +undictated +undid +undidactic +undies +undieted +undifferenced +undifferent +undifferential +undifferentiated +undifficult +undiffident +undiffracted +undiffused +undiffusible +undiffusive +undig +undigenous +undigest +undigestable +undigested +undigestible +undigesting +undigestion +undigged +undight +undighted +undigitated +undignified +undignifiedly +undignifiedness +undignify +undiked +undilapidated +undilatable +undilated +undilatory +undiligent +undiligently +undilute +undiluted +undilution +undiluvial +undim +undimensioned +undimerous +undimidiate +undiminishable +undiminishableness +undiminishably +undiminished +undiminishing +undiminutive +undimmed +undimpled +Undine +undine +undined +undinted +undiocesed +undiphthongize +undiplomaed +undiplomatic +undipped +undirect +undirected +undirectional +undirectly +undirectness +undirk +undisabled +undisadvantageous +undisagreeable +undisappearing +undisappointable +undisappointed +undisappointing +undisarmed +undisastrous +undisbanded +undisbarred +undisburdened +undisbursed +undiscardable +undiscarded +undiscerned +undiscernedly +undiscernible +undiscernibleness +undiscernibly +undiscerning +undiscerningly +undischargeable +undischarged +undiscipled +undisciplinable +undiscipline +undisciplined +undisciplinedness +undisclaimed +undisclosed +undiscolored +undiscomfitable +undiscomfited +undiscomposed +undisconcerted +undisconnected +undiscontinued +undiscordant +undiscording +undiscounted +undiscourageable +undiscouraged +undiscouraging +undiscoursed +undiscoverable +undiscoverableness +undiscoverably +undiscovered +undiscreditable +undiscredited +undiscreet +undiscreetly +undiscreetness +undiscretion +undiscriminated +undiscriminating +undiscriminatingly +undiscriminatingness +undiscriminative +undiscursive +undiscussable +undiscussed +undisdained +undisdaining +undiseased +undisestablished +undisfigured +undisfranchised +undisfulfilled +undisgorged +undisgraced +undisguisable +undisguise +undisguised +undisguisedly +undisguisedness +undisgusted +undisheartened +undished +undisheveled +undishonored +undisillusioned +undisinfected +undisinheritable +undisinherited +undisintegrated +undisinterested +undisjoined +undisjointed +undisliked +undislocated +undislodgeable +undislodged +undismantled +undismay +undismayable +undismayed +undismayedly +undismembered +undismissed +undismounted +undisobedient +undisobeyed +undisobliging +undisordered +undisorderly +undisorganized +undisowned +undisowning +undisparaged +undisparity +undispassionate +undispatchable +undispatched +undispatching +undispellable +undispelled +undispensable +undispensed +undispensing +undispersed +undispersing +undisplaced +undisplanted +undisplay +undisplayable +undisplayed +undisplaying +undispleased +undispose +undisposed +undisposedness +undisprivacied +undisprovable +undisproved +undisproving +undisputable +undisputableness +undisputably +undisputatious +undisputatiously +undisputed +undisputedly +undisputedness +undisputing +undisqualifiable +undisqualified +undisquieted +undisreputable +undisrobed +undisrupted +undissected +undissembled +undissembledness +undissembling +undissemblingly +undisseminated +undissenting +undissevered +undissimulated +undissipated +undissociated +undissoluble +undissolute +undissolvable +undissolved +undissolving +undissonant +undissuadable +undissuadably +undissuade +undistanced +undistant +undistantly +undistasted +undistasteful +undistempered +undistend +undistended +undistilled +undistinct +undistinctive +undistinctly +undistinctness +undistinguish +undistinguishable +undistinguishableness +undistinguishably +undistinguished +undistinguishing +undistinguishingly +undistorted +undistorting +undistracted +undistractedly +undistractedness +undistracting +undistractingly +undistrained +undistraught +undistress +undistressed +undistributed +undistrusted +undistrustful +undisturbable +undisturbance +undisturbed +undisturbedly +undisturbedness +undisturbing +undisturbingly +unditched +undithyrambic +undittoed +undiuretic +undiurnal +undivable +undivergent +undiverging +undiverse +undiversified +undiverted +undivertible +undivertibly +undiverting +undivested +undivestedly +undividable +undividableness +undividably +undivided +undividedly +undividedness +undividing +undivinable +undivined +undivinelike +undivinely +undivining +undivisible +undivisive +undivorceable +undivorced +undivorcedness +undivorcing +undivulged +undivulging +undizened +undizzied +undo +undoable +undock +undocked +undoctor +undoctored +undoctrinal +undoctrined +undocumentary +undocumented +undocumentedness +undodged +undoer +undoffed +undog +undogmatic +undogmatical +undoing +undoingness +undolled +undolorous +undomed +undomestic +undomesticate +undomesticated +undomestication +undomicilable +undomiciled +undominated +undomineering +undominical +undominoed +undon +undonated +undonating +undone +undoneness +undonkey +undonnish +undoomed +undoped +undormant +undose +undosed +undoting +undotted +undouble +undoubled +undoubtable +undoubtableness +undoubtably +undoubted +undoubtedly +undoubtedness +undoubtful +undoubtfully +undoubtfulness +undoubting +undoubtingly +undoubtingness +undouched +undoughty +undovelike +undoweled +undowered +undowned +undowny +undrab +undraftable +undrafted +undrag +undragoned +undragooned +undrainable +undrained +undramatic +undramatical +undramatically +undramatizable +undramatized +undrape +undraped +undraperied +undraw +undrawable +undrawn +undreaded +undreadful +undreadfully +undreading +undreamed +undreaming +undreamlike +undreamt +undreamy +undredged +undreggy +undrenched +undress +undressed +undried +undrillable +undrilled +undrinkable +undrinkableness +undrinkably +undrinking +undripping +undrivable +undrivableness +undriven +undronelike +undrooping +undropped +undropsical +undrossy +undrowned +undrubbed +undrugged +undrunk +undrunken +undry +undryable +undrying +undualize +undub +undubbed +undubitable +undubitably +unducal +unduchess +undue +unduelling +undueness +undug +unduke +undulant +undular +undularly +undulatance +undulate +undulated +undulately +undulating +undulatingly +undulation +undulationist +undulative +undulatory +undull +undulled +undullness +unduloid +undulose +undulous +unduly +undumped +unduncelike +undunged +undupable +unduped +unduplicability +unduplicable +unduplicity +undurable +undurableness +undurably +undust +undusted +unduteous +undutiable +undutiful +undutifully +undutifulness +unduty +undwarfed +undwelt +undwindling +undy +undye +undyeable +undyed +undying +undyingly +undyingness +uneager +uneagerly +uneagerness +uneagled +unearly +unearned +unearnest +unearth +unearthed +unearthliness +unearthly +unease +uneaseful +uneasefulness +uneasily +uneasiness +uneastern +uneasy +uneatable +uneatableness +uneaten +uneath +uneating +unebbed +unebbing +unebriate +uneccentric +unecclesiastical +unechoed +unechoing +uneclectic +uneclipsed +uneconomic +uneconomical +uneconomically +uneconomicalness +uneconomizing +unecstatic +unedge +unedged +unedible +unedibleness +unedibly +unedified +unedifying +uneditable +unedited +uneducable +uneducableness +uneducably +uneducate +uneducated +uneducatedly +uneducatedness +uneducative +uneduced +uneffaceable +uneffaceably +uneffaced +uneffected +uneffectible +uneffective +uneffectless +uneffectual +uneffectually +uneffectualness +uneffectuated +uneffeminate +uneffeminated +uneffervescent +uneffete +unefficacious +unefficient +uneffigiated +uneffused +uneffusing +uneffusive +unegoist +unegoistical +unegoistically +unegregious +unejaculated +unejected +unelaborate +unelaborated +unelaborately +unelaborateness +unelapsed +unelastic +unelasticity +unelated +unelating +unelbowed +unelderly +unelect +unelectable +unelected +unelective +unelectric +unelectrical +unelectrified +unelectrify +unelectrifying +unelectrized +unelectronic +uneleemosynary +unelegant +unelegantly +unelegantness +unelemental +unelementary +unelevated +unelicited +unelided +unelidible +uneligibility +uneligible +uneligibly +uneliminated +unelongated +uneloped +uneloping +uneloquent +uneloquently +unelucidated +unelucidating +uneluded +unelusive +unemaciated +unemancipable +unemancipated +unemasculated +unembalmed +unembanked +unembarrassed +unembarrassedly +unembarrassedness +unembarrassing +unembarrassment +unembased +unembattled +unembayed +unembellished +unembezzled +unembittered +unemblazoned +unembodied +unembodiment +unembossed +unembowelled +unembowered +unembraceable +unembraced +unembroidered +unembroiled +unembryonic +unemendable +unemended +unemerged +unemerging +unemigrating +uneminent +uneminently +unemitted +unemolumentary +unemolumented +unemotional +unemotionalism +unemotionally +unemotionalness +unemotioned +unempaneled +unemphatic +unemphatical +unemphatically +unempirical +unempirically +unemploy +unemployability +unemployable +unemployableness +unemployably +unemployed +unemployment +unempoisoned +unempowered +unempt +unemptiable +unemptied +unempty +unemulative +unemulous +unemulsified +unenabled +unenacted +unenameled +unenamored +unencamped +unenchafed +unenchant +unenchanted +unencircled +unenclosed +unencompassed +unencored +unencounterable +unencountered +unencouraged +unencouraging +unencroached +unencroaching +unencumber +unencumbered +unencumberedly +unencumberedness +unencumbering +unencysted +unendable +unendamaged +unendangered +unendeared +unendeavored +unended +unending +unendingly +unendingness +unendorsable +unendorsed +unendowed +unendowing +unendued +unendurability +unendurable +unendurably +unendured +unenduring +unenduringly +unenergetic +unenergized +unenervated +unenfeebled +unenfiladed +unenforceable +unenforced +unenforcedly +unenforcedness +unenforcibility +unenfranchised +unengaged +unengaging +unengendered +unengineered +unenglish +unengraved +unengraven +unengrossed +unenhanced +unenjoined +unenjoyable +unenjoyed +unenjoying +unenjoyingly +unenkindled +unenlarged +unenlightened +unenlightening +unenlisted +unenlivened +unenlivening +unennobled +unennobling +unenounced +unenquired +unenquiring +unenraged +unenraptured +unenrichable +unenrichableness +unenriched +unenriching +unenrobed +unenrolled +unenshrined +unenslave +unenslaved +unensnared +unensouled +unensured +unentailed +unentangle +unentangleable +unentangled +unentanglement +unentangler +unenterable +unentered +unentering +unenterprise +unenterprised +unenterprising +unenterprisingly +unenterprisingness +unentertainable +unentertained +unentertaining +unentertainingly +unentertainingness +unenthralled +unenthralling +unenthroned +unenthusiasm +unenthusiastic +unenthusiastically +unenticed +unenticing +unentire +unentitled +unentombed +unentomological +unentrance +unentranced +unentrapped +unentreated +unentreating +unentrenched +unentwined +unenumerable +unenumerated +unenveloped +unenvenomed +unenviable +unenviably +unenvied +unenviedly +unenvious +unenviously +unenvironed +unenvying +unenwoven +unepauleted +unephemeral +unepic +unepicurean +unepigrammatic +unepilogued +unepiscopal +unepiscopally +unepistolary +unepitaphed +unepithelial +unepitomized +unequable +unequableness +unequably +unequal +unequalable +unequaled +unequality +unequalize +unequalized +unequally +unequalness +unequated +unequatorial +unequestrian +unequiangular +unequiaxed +unequilateral +unequilibrated +unequine +unequipped +unequitable +unequitableness +unequitably +unequivalent +unequivalve +unequivalved +unequivocal +unequivocally +unequivocalness +uneradicable +uneradicated +unerasable +unerased +unerasing +unerect +unerected +unermined +uneroded +unerrable +unerrableness +unerrably +unerrancy +unerrant +unerratic +unerring +unerringly +unerringness +unerroneous +unerroneously +unerudite +unerupted +uneruptive +unescaladed +unescalloped +unescapable +unescapableness +unescapably +unescaped +unescheated +uneschewable +uneschewably +uneschewed +Unesco +unescorted +unescutcheoned +unesoteric +unespied +unespousable +unespoused +unessayed +unessence +unessential +unessentially +unessentialness +unestablish +unestablishable +unestablished +unestablishment +unesteemed +unestimable +unestimableness +unestimably +unestimated +unestopped +unestranged +unetched +uneternal +uneternized +unethereal +unethic +unethical +unethically +unethicalness +unethnological +unethylated +unetymological +unetymologizable +uneucharistical +uneugenic +uneulogized +uneuphemistical +uneuphonic +uneuphonious +uneuphoniously +uneuphoniousness +unevacuated +unevadable +unevaded +unevaluated +unevanescent +unevangelic +unevangelical +unevangelized +unevaporate +unevaporated +unevasive +uneven +unevenly +unevenness +uneventful +uneventfully +uneventfulness +uneverted +unevicted +unevidenced +unevident +unevidential +unevil +unevinced +unevirated +uneviscerated +unevitable +unevitably +unevokable +unevoked +unevolutionary +unevolved +unexacerbated +unexact +unexacted +unexactedly +unexacting +unexactingly +unexactly +unexactness +unexaggerable +unexaggerated +unexaggerating +unexalted +unexaminable +unexamined +unexamining +unexampled +unexampledness +unexasperated +unexasperating +unexcavated +unexceedable +unexceeded +unexcelled +unexcellent +unexcelling +unexceptable +unexcepted +unexcepting +unexceptionability +unexceptionable +unexceptionableness +unexceptionably +unexceptional +unexceptionally +unexceptionalness +unexceptive +unexcerpted +unexcessive +unexchangeable +unexchangeableness +unexchanged +unexcised +unexcitability +unexcitable +unexcited +unexciting +unexclaiming +unexcludable +unexcluded +unexcluding +unexclusive +unexclusively +unexclusiveness +unexcogitable +unexcogitated +unexcommunicated +unexcoriated +unexcorticated +unexcrescent +unexcreted +unexcruciating +unexculpable +unexculpably +unexculpated +unexcursive +unexcusable +unexcusableness +unexcusably +unexcused +unexcusedly +unexcusedness +unexcusing +unexecrated +unexecutable +unexecuted +unexecuting +unexecutorial +unexemplary +unexemplifiable +unexemplified +unexempt +unexempted +unexemptible +unexempting +unexercisable +unexercise +unexercised +unexerted +unexhalable +unexhaled +unexhausted +unexhaustedly +unexhaustedness +unexhaustible +unexhaustibleness +unexhaustibly +unexhaustion +unexhaustive +unexhaustiveness +unexhibitable +unexhibitableness +unexhibited +unexhilarated +unexhilarating +unexhorted +unexhumed +unexigent +unexilable +unexiled +unexistence +unexistent +unexisting +unexonerable +unexonerated +unexorable +unexorableness +unexorbitant +unexorcisable +unexorcisably +unexorcised +unexotic +unexpandable +unexpanded +unexpanding +unexpansive +unexpectable +unexpectant +unexpected +unexpectedly +unexpectedness +unexpecting +unexpectingly +unexpectorated +unexpedient +unexpeditated +unexpedited +unexpeditious +unexpelled +unexpendable +unexpended +unexpensive +unexpensively +unexpensiveness +unexperience +unexperienced +unexperiencedness +unexperient +unexperiential +unexperimental +unexperimented +unexpert +unexpertly +unexpertness +unexpiable +unexpiated +unexpired +unexpiring +unexplainable +unexplainableness +unexplainably +unexplained +unexplainedly +unexplainedness +unexplaining +unexplanatory +unexplicable +unexplicableness +unexplicably +unexplicated +unexplicit +unexplicitly +unexplicitness +unexploded +unexploitation +unexploited +unexplorable +unexplorative +unexplored +unexplosive +unexportable +unexported +unexporting +unexposable +unexposed +unexpostulating +unexpoundable +unexpounded +unexpress +unexpressable +unexpressableness +unexpressably +unexpressed +unexpressedly +unexpressible +unexpressibleness +unexpressibly +unexpressive +unexpressively +unexpressiveness +unexpressly +unexpropriable +unexpropriated +unexpugnable +unexpunged +unexpurgated +unexpurgatedly +unexpurgatedness +unextended +unextendedly +unextendedness +unextendible +unextensible +unextenuable +unextenuated +unextenuating +unexterminable +unexterminated +unexternal +unexternality +unexterritoriality +unextinct +unextinctness +unextinguishable +unextinguishableness +unextinguishably +unextinguished +unextirpated +unextolled +unextortable +unextorted +unextractable +unextracted +unextradited +unextraneous +unextraordinary +unextravagance +unextravagant +unextravagating +unextravasated +unextreme +unextricable +unextricated +unextrinsic +unextruded +unexuberant +unexuded +unexultant +uneye +uneyeable +uneyed +unfabled +unfabling +unfabricated +unfabulous +unfacaded +unface +unfaceable +unfaced +unfaceted +unfacetious +unfacile +unfacilitated +unfact +unfactional +unfactious +unfactitious +unfactorable +unfactored +unfactual +unfadable +unfaded +unfading +unfadingly +unfadingness +unfagged +unfagoted +unfailable +unfailableness +unfailably +unfailed +unfailing +unfailingly +unfailingness +unfain +unfaint +unfainting +unfaintly +unfair +unfairly +unfairminded +unfairness +unfairylike +unfaith +unfaithful +unfaithfully +unfaithfulness +unfaked +unfallacious +unfallaciously +unfallen +unfallenness +unfallible +unfallibleness +unfallibly +unfalling +unfallowed +unfalse +unfalsifiable +unfalsified +unfalsifiedness +unfalsity +unfaltering +unfalteringly +unfamed +unfamiliar +unfamiliarity +unfamiliarized +unfamiliarly +unfanatical +unfanciable +unfancied +unfanciful +unfancy +unfanged +unfanned +unfantastic +unfantastical +unfantastically +unfar +unfarced +unfarcical +unfarewelled +unfarmed +unfarming +unfarrowed +unfarsighted +unfasciated +unfascinate +unfascinated +unfascinating +unfashion +unfashionable +unfashionableness +unfashionably +unfashioned +unfast +unfasten +unfastenable +unfastened +unfastener +unfastidious +unfastidiously +unfastidiousness +unfasting +unfather +unfathered +unfatherlike +unfatherliness +unfatherly +unfathomability +unfathomable +unfathomableness +unfathomably +unfathomed +unfatigue +unfatigueable +unfatigued +unfatiguing +unfattable +unfatted +unfatten +unfauceted +unfaultfinding +unfaulty +unfavorable +unfavorableness +unfavorably +unfavored +unfavoring +unfavorite +unfawning +unfealty +unfeared +unfearful +unfearfully +unfearing +unfearingly +unfeary +unfeasable +unfeasableness +unfeasably +unfeasibility +unfeasible +unfeasibleness +unfeasibly +unfeasted +unfeather +unfeathered +unfeatured +unfecund +unfecundated +unfed +unfederal +unfederated +unfeeble +unfeed +unfeedable +unfeeding +unfeeing +unfeelable +unfeeling +unfeelingly +unfeelingness +unfeignable +unfeignableness +unfeignably +unfeigned +unfeignedly +unfeignedness +unfeigning +unfeigningly +unfeigningness +unfele +unfelicitated +unfelicitating +unfelicitous +unfelicitously +unfelicitousness +unfeline +unfellable +unfelled +unfellied +unfellow +unfellowed +unfellowlike +unfellowly +unfellowshiped +unfelon +unfelonious +unfeloniously +unfelony +unfelt +unfelted +unfemale +unfeminine +unfemininely +unfeminineness +unfemininity +unfeminist +unfeminize +unfence +unfenced +unfendered +unfenestrated +unfeoffed +unfermentable +unfermentableness +unfermentably +unfermented +unfermenting +unfernlike +unferocious +unferreted +unferried +unfertile +unfertileness +unfertility +unfertilizable +unfertilized +unfervent +unfervid +unfester +unfestered +unfestival +unfestive +unfestively +unfestooned +unfetchable +unfetched +unfeted +unfetter +unfettered +unfettled +unfeudal +unfeudalize +unfeudalized +unfeued +unfevered +unfeverish +unfew +unfibbed +unfibbing +unfiber +unfibered +unfibrous +unfickle +unfictitious +unfidelity +unfidgeting +unfielded +unfiend +unfiendlike +unfierce +unfiery +unfight +unfightable +unfighting +unfigurable +unfigurative +unfigured +unfilamentous +unfilched +unfile +unfiled +unfilial +unfilially +unfilialness +unfill +unfillable +unfilled +unfilleted +unfilling +unfilm +unfilmed +unfiltered +unfiltrated +unfinable +unfinancial +unfine +unfined +unfinessed +unfingered +unfinical +unfinish +unfinishable +unfinished +unfinishedly +unfinishedness +unfinite +unfired +unfireproof +unfiring +unfirm +unfirmamented +unfirmly +unfirmness +unfiscal +unfishable +unfished +unfishing +unfishlike +unfissile +unfistulous +unfit +unfitly +unfitness +unfittable +unfitted +unfittedness +unfitten +unfitting +unfittingly +unfittingness +unfitty +unfix +unfixable +unfixated +unfixed +unfixedness +unfixing +unfixity +unflag +unflagged +unflagging +unflaggingly +unflaggingness +unflagitious +unflagrant +unflaky +unflamboyant +unflaming +unflanged +unflank +unflanked +unflapping +unflashing +unflat +unflated +unflattened +unflatterable +unflattered +unflattering +unflatteringly +unflaunted +unflavored +unflawed +unflayed +unflead +unflecked +unfledge +unfledged +unfledgedness +unfleece +unfleeced +unfleeing +unfleeting +unflesh +unfleshed +unfleshliness +unfleshly +unfleshy +unfletched +unflexed +unflexible +unflexibleness +unflexibly +unflickering +unflickeringly +unflighty +unflinching +unflinchingly +unflinchingness +unflintify +unflippant +unflirtatious +unflitched +unfloatable +unfloating +unflock +unfloggable +unflogged +unflooded +unfloor +unfloored +unflorid +unflossy +unflounced +unfloured +unflourished +unflourishing +unflouted +unflower +unflowered +unflowing +unflown +unfluctuating +unfluent +unfluid +unfluked +unflunked +unfluorescent +unflurried +unflush +unflushed +unflustered +unfluted +unflutterable +unfluttered +unfluttering +unfluvial +unfluxile +unflying +unfoaled +unfoaming +unfocused +unfoggy +unfoilable +unfoiled +unfoisted +unfold +unfoldable +unfolded +unfolder +unfolding +unfoldment +unfoldure +unfoliaged +unfoliated +unfollowable +unfollowed +unfollowing +unfomented +unfond +unfondled +unfondness +unfoodful +unfool +unfoolable +unfooled +unfooling +unfoolish +unfooted +unfootsore +unfoppish +unforaged +unforbade +unforbearance +unforbearing +unforbid +unforbidden +unforbiddenly +unforbiddenness +unforbidding +unforceable +unforced +unforcedly +unforcedness +unforceful +unforcible +unforcibleness +unforcibly +unfordable +unfordableness +unforded +unforeboded +unforeboding +unforecasted +unforegone +unforeign +unforeknowable +unforeknown +unforensic +unforeordained +unforesee +unforeseeable +unforeseeableness +unforeseeably +unforeseeing +unforeseeingly +unforeseen +unforeseenly +unforeseenness +unforeshortened +unforest +unforestallable +unforestalled +unforested +unforetellable +unforethought +unforethoughtful +unforetold +unforewarned +unforewarnedness +unforfeit +unforfeitable +unforfeited +unforgeability +unforgeable +unforged +unforget +unforgetful +unforgettable +unforgettableness +unforgettably +unforgetting +unforgettingly +unforgivable +unforgivableness +unforgivably +unforgiven +unforgiveness +unforgiver +unforgiving +unforgivingly +unforgivingness +unforgone +unforgot +unforgotten +unfork +unforked +unforkedness +unforlorn +unform +unformal +unformality +unformalized +unformally +unformalness +unformative +unformed +unformidable +unformulable +unformularizable +unformularize +unformulated +unformulistic +unforsaken +unforsaking +unforsook +unforsworn +unforthright +unfortifiable +unfortified +unfortify +unfortuitous +unfortunate +unfortunately +unfortunateness +unfortune +unforward +unforwarded +unfossiliferous +unfossilized +unfostered +unfought +unfoughten +unfoul +unfoulable +unfouled +unfound +unfounded +unfoundedly +unfoundedness +unfoundered +unfountained +unfowllike +unfoxy +unfractured +unfragrance +unfragrant +unfragrantly +unfrail +unframable +unframableness +unframably +unframe +unframed +unfranchised +unfrank +unfrankable +unfranked +unfrankly +unfrankness +unfraternal +unfraternizing +unfraudulent +unfraught +unfrayed +unfreckled +unfree +unfreed +unfreedom +unfreehold +unfreely +unfreeman +unfreeness +unfreezable +unfreeze +unfreezing +unfreighted +unfrenchified +unfrenzied +unfrequency +unfrequent +unfrequented +unfrequentedness +unfrequently +unfrequentness +unfret +unfretful +unfretting +unfriable +unfriarlike +unfricative +unfrictioned +unfried +unfriend +unfriended +unfriendedness +unfriending +unfriendlike +unfriendlily +unfriendliness +unfriendly +unfriendship +unfrighted +unfrightenable +unfrightened +unfrightenedness +unfrightful +unfrigid +unfrill +unfrilled +unfringe +unfringed +unfrisky +unfrivolous +unfrizz +unfrizzled +unfrizzy +unfrock +unfrocked +unfroglike +unfrolicsome +unfronted +unfrost +unfrosted +unfrosty +unfrounced +unfroward +unfrowardly +unfrowning +unfroze +unfrozen +unfructed +unfructified +unfructify +unfructuous +unfructuously +unfrugal +unfrugally +unfrugalness +unfruitful +unfruitfully +unfruitfulness +unfruity +unfrustrable +unfrustrably +unfrustratable +unfrustrated +unfrutuosity +unfuddled +unfueled +unfulfill +unfulfillable +unfulfilled +unfulfilling +unfulfillment +unfull +unfulled +unfully +unfulminated +unfulsome +unfumbled +unfumbling +unfumed +unfumigated +unfunctional +unfundamental +unfunded +unfunnily +unfunniness +unfunny +unfur +unfurbelowed +unfurbished +unfurcate +unfurious +unfurl +unfurlable +unfurnish +unfurnished +unfurnishedness +unfurnitured +unfurred +unfurrow +unfurrowable +unfurrowed +unfurthersome +unfused +unfusible +unfusibleness +unfusibly +unfussed +unfussing +unfussy +unfutile +unfuturistic +ungabled +ungag +ungaged +ungagged +ungain +ungainable +ungained +ungainful +ungainfully +ungainfulness +ungaining +ungainlike +ungainliness +ungainly +ungainness +ungainsaid +ungainsayable +ungainsayably +ungainsaying +ungainsome +ungainsomely +ungaite +ungallant +ungallantly +ungallantness +ungalling +ungalvanized +ungamboling +ungamelike +unganged +ungangrened +ungarbed +ungarbled +ungardened +ungargled +ungarland +ungarlanded +ungarment +ungarmented +ungarnered +ungarnish +ungarnished +ungaro +ungarrisoned +ungarter +ungartered +ungashed +ungassed +ungastric +ungathered +ungaudy +ungauged +ungauntlet +ungauntleted +ungazetted +ungazing +ungear +ungeared +ungelatinizable +ungelatinized +ungelded +ungelt +ungeminated +ungenerable +ungeneral +ungeneraled +ungeneralized +ungenerate +ungenerated +ungenerative +ungeneric +ungenerical +ungenerosity +ungenerous +ungenerously +ungenerousness +ungenial +ungeniality +ungenially +ungenialness +ungenitured +ungenius +ungenteel +ungenteelly +ungenteelness +ungentile +ungentility +ungentilize +ungentle +ungentled +ungentleman +ungentlemanize +ungentlemanlike +ungentlemanlikeness +ungentlemanliness +ungentlemanly +ungentleness +ungentlewomanlike +ungently +ungenuine +ungenuinely +ungenuineness +ungeodetical +ungeographic +ungeographical +ungeographically +ungeological +ungeometric +ungeometrical +ungeometrically +ungeometricalness +ungerminated +ungerminating +ungermlike +ungerontic +ungesting +ungesturing +unget +ungettable +unghostlike +unghostly +ungiant +ungibbet +ungiddy +ungifted +ungiftedness +ungild +ungilded +ungill +ungilt +ungingled +unginned +ungird +ungirded +ungirdle +ungirdled +ungirlish +ungirt +ungirth +ungirthed +ungive +ungiveable +ungiven +ungiving +ungka +unglaciated +unglad +ungladden +ungladdened +ungladly +ungladness +ungladsome +unglamorous +unglandular +unglassed +unglaze +unglazed +ungleaned +unglee +ungleeful +unglimpsed +unglistening +unglittering +ungloating +unglobe +unglobular +ungloom +ungloomed +ungloomy +unglorified +unglorify +unglorifying +unglorious +ungloriously +ungloriousness +unglory +unglosed +ungloss +unglossaried +unglossed +unglossily +unglossiness +unglossy +unglove +ungloved +unglowing +unglozed +unglue +unglued +unglutinate +unglutted +ungluttonous +ungnarred +ungnaw +ungnawn +ungnostic +ungoaded +ungoatlike +ungod +ungoddess +ungodlike +ungodlily +ungodliness +ungodly +ungodmothered +ungold +ungolden +ungone +ungood +ungoodliness +ungoodly +ungored +ungorge +ungorged +ungorgeous +ungospel +ungospelized +ungospelled +ungospellike +ungossiping +ungot +ungothic +ungotten +ungouged +ungouty +ungovernable +ungovernableness +ungovernably +ungoverned +ungovernedness +ungoverning +ungown +ungowned +ungrace +ungraced +ungraceful +ungracefully +ungracefulness +ungracious +ungraciously +ungraciousness +ungradated +ungraded +ungradual +ungradually +ungraduated +ungraduating +ungraft +ungrafted +ungrain +ungrainable +ungrained +ungrammar +ungrammared +ungrammatic +ungrammatical +ungrammatically +ungrammaticalness +ungrammaticism +ungrand +ungrantable +ungranted +ungranulated +ungraphic +ungraphitized +ungrapple +ungrappled +ungrappler +ungrasp +ungraspable +ungrasped +ungrasping +ungrassed +ungrassy +ungrated +ungrateful +ungratefully +ungratefulness +ungratifiable +ungratified +ungratifying +ungrating +ungrave +ungraved +ungraveled +ungravelly +ungravely +ungraven +ungrayed +ungrazed +ungreased +ungreat +ungreatly +ungreatness +ungreeable +ungreedy +ungreen +ungreenable +ungreened +ungreeted +ungregarious +ungrieve +ungrieved +ungrieving +ungrilled +ungrimed +ungrindable +ungrip +ungripe +ungrizzled +ungroaning +ungroined +ungroomed +ungrooved +ungropeable +ungross +ungrotesque +unground +ungroundable +ungroundably +ungrounded +ungroundedly +ungroundedness +ungroupable +ungrouped +ungrow +ungrowing +ungrown +ungrubbed +ungrudged +ungrudging +ungrudgingly +ungrudgingness +ungruesome +ungruff +ungrumbling +ungual +unguaranteed +unguard +unguardable +unguarded +unguardedly +unguardedness +ungueal +unguent +unguentaria +unguentarium +unguentary +unguentiferous +unguentous +unguentum +unguerdoned +ungues +unguessable +unguessableness +unguessed +unguical +unguicorn +unguicular +Unguiculata +unguiculate +unguiculated +unguidable +unguidableness +unguidably +unguided +unguidedly +unguiferous +unguiform +unguiled +unguileful +unguilefully +unguilefulness +unguillotined +unguiltily +unguiltiness +unguilty +unguinal +unguinous +unguirostral +unguis +ungula +ungulae +ungular +Ungulata +ungulate +ungulated +unguled +unguligrade +ungull +ungulous +ungulp +ungum +ungummed +ungushing +ungutted +unguttural +unguyed +unguzzled +ungymnastic +ungypsylike +ungyve +ungyved +unhabit +unhabitable +unhabitableness +unhabited +unhabitual +unhabitually +unhabituate +unhabituated +unhacked +unhackled +unhackneyed +unhackneyedness +unhad +unhaft +unhafted +unhaggled +unhaggling +unhailable +unhailed +unhair +unhaired +unhairer +unhairily +unhairiness +unhairing +unhairy +unhallooed +unhallow +unhallowed +unhallowedness +unhaloed +unhalsed +unhalted +unhalter +unhaltered +unhalting +unhalved +unhammered +unhamper +unhampered +unhand +unhandcuff +unhandcuffed +unhandicapped +unhandily +unhandiness +unhandled +unhandseled +unhandsome +unhandsomely +unhandsomeness +unhandy +unhang +unhanged +unhap +unhappen +unhappily +unhappiness +unhappy +unharangued +unharassed +unharbor +unharbored +unhard +unharden +unhardenable +unhardened +unhardihood +unhardily +unhardiness +unhardness +unhardy +unharked +unharmable +unharmed +unharmful +unharmfully +unharming +unharmonic +unharmonical +unharmonious +unharmoniously +unharmoniousness +unharmonize +unharmonized +unharmony +unharness +unharnessed +unharped +unharried +unharrowed +unharsh +unharvested +unhashed +unhasp +unhasped +unhaste +unhasted +unhastened +unhastily +unhastiness +unhasting +unhasty +unhat +unhatchability +unhatchable +unhatched +unhatcheled +unhate +unhated +unhateful +unhating +unhatingly +unhatted +unhauled +unhaunt +unhaunted +unhave +unhawked +unhayed +unhazarded +unhazarding +unhazardous +unhazardousness +unhazed +unhead +unheaded +unheader +unheady +unheal +unhealable +unhealableness +unhealably +unhealed +unhealing +unhealth +unhealthful +unhealthfully +unhealthfulness +unhealthily +unhealthiness +unhealthsome +unhealthsomeness +unhealthy +unheaped +unhearable +unheard +unhearing +unhearsed +unheart +unhearten +unheartsome +unhearty +unheatable +unheated +unheathen +unheaved +unheaven +unheavenly +unheavily +unheaviness +unheavy +unhectored +unhedge +unhedged +unheed +unheeded +unheededly +unheedful +unheedfully +unheedfulness +unheeding +unheedingly +unheedy +unheeled +unheelpieced +unhefted +unheightened +unheired +unheld +unhele +unheler +unhelm +unhelmed +unhelmet +unhelmeted +unhelpable +unhelpableness +unhelped +unhelpful +unhelpfully +unhelpfulness +unhelping +unhelved +unhemmed +unheppen +unheralded +unheraldic +unherd +unherded +unhereditary +unheretical +unheritable +unhermetic +unhero +unheroic +unheroical +unheroically +unheroism +unheroize +unherolike +unhesitant +unhesitating +unhesitatingly +unhesitatingness +unheuristic +unhewable +unhewed +unhewn +unhex +unhid +unhidable +unhidableness +unhidably +unhidated +unhidden +unhide +unhidebound +unhideous +unhieratic +unhigh +unhilarious +unhinderable +unhinderably +unhindered +unhindering +unhinge +unhingement +unhinted +unhipped +unhired +unhissed +unhistoric +unhistorical +unhistorically +unhistory +unhistrionic +unhit +unhitch +unhitched +unhittable +unhive +unhoard +unhoarded +unhoarding +unhoary +unhoaxed +unhobble +unhocked +unhoed +unhogged +unhoist +unhoisted +unhold +unholiday +unholily +unholiness +unhollow +unhollowed +unholy +unhome +unhomelike +unhomelikeness +unhomeliness +unhomely +unhomish +unhomogeneity +unhomogeneous +unhomogeneously +unhomologous +unhoned +unhonest +unhonestly +unhoneyed +unhonied +unhonorable +unhonorably +unhonored +unhonoured +unhood +unhooded +unhoodwink +unhoodwinked +unhoofed +unhook +unhooked +unhoop +unhooped +unhooper +unhooted +unhoped +unhopedly +unhopedness +unhopeful +unhopefully +unhopefulness +unhoping +unhopingly +unhopped +unhoppled +unhorizoned +unhorizontal +unhorned +unhorny +unhoroscopic +unhorse +unhose +unhosed +unhospitable +unhospitableness +unhospitably +unhostile +unhostilely +unhostileness +unhostility +unhot +unhoundlike +unhouse +unhoused +unhouseled +unhouselike +unhousewifely +unhuddle +unhugged +unhull +unhulled +unhuman +unhumanize +unhumanized +unhumanly +unhumanness +unhumble +unhumbled +unhumbledness +unhumbleness +unhumbly +unhumbugged +unhumid +unhumiliated +unhumored +unhumorous +unhumorously +unhumorousness +unhumoured +unhung +unhuntable +unhunted +unhurdled +unhurled +unhurried +unhurriedly +unhurriedness +unhurrying +unhurryingly +unhurt +unhurted +unhurtful +unhurtfully +unhurtfulness +unhurting +unhusbanded +unhusbandly +unhushable +unhushed +unhushing +unhusk +unhusked +unhustled +unhustling +unhutched +unhuzzaed +unhydraulic +unhydrolyzed +unhygienic +unhygienically +unhygrometric +unhymeneal +unhymned +unhyphenated +unhyphened +unhypnotic +unhypnotizable +unhypnotize +unhypocritical +unhypocritically +unhypothecated +unhypothetical +unhysterical +uniambic +uniambically +uniangulate +uniarticular +uniarticulate +Uniat +uniat +Uniate +uniate +uniauriculate +uniauriculated +uniaxal +uniaxally +uniaxial +uniaxially +unibasal +unibivalent +unible +unibracteate +unibracteolate +unibranchiate +unicalcarate +unicameral +unicameralism +unicameralist +unicamerate +unicapsular +unicarinate +unicarinated +unice +uniced +unicell +unicellate +unicelled +unicellular +unicellularity +unicentral +unichord +uniciliate +unicism +unicist +unicity +uniclinal +unicolor +unicolorate +unicolored +unicolorous +uniconstant +unicorn +unicorneal +unicornic +unicornlike +unicornous +unicornuted +unicostate +unicotyledonous +unicum +unicursal +unicursality +unicursally +unicuspid +unicuspidate +unicycle +unicyclist +unidactyl +unidactyle +unidactylous +unideaed +unideal +unidealism +unidealist +unidealistic +unidealized +unidentate +unidentated +unidenticulate +unidentifiable +unidentifiableness +unidentifiably +unidentified +unidentifiedly +unidentifying +unideographic +unidextral +unidextrality +unidigitate +unidimensional +unidiomatic +unidiomatically +unidirect +unidirected +unidirection +unidirectional +unidle +unidleness +unidly +unidolatrous +unidolized +unidyllic +unie +uniembryonate +uniequivalent +uniface +unifaced +unifacial +unifactorial +unifarious +unifiable +unific +unification +unificationist +unificator +unified +unifiedly +unifiedness +unifier +unifilar +uniflagellate +unifloral +uniflorate +uniflorous +uniflow +uniflowered +unifocal +unifoliar +unifoliate +unifoliolate +Unifolium +uniform +uniformal +uniformalization +uniformalize +uniformally +uniformation +uniformed +uniformist +uniformitarian +uniformitarianism +uniformity +uniformization +uniformize +uniformless +uniformly +uniformness +unify +unigenesis +unigenetic +unigenist +unigenistic +unigenital +unigeniture +unigenous +uniglandular +uniglobular +unignitable +unignited +unignitible +unignominious +unignorant +unignored +unigravida +uniguttulate +unijugate +unijugous +unilabiate +unilabiated +unilamellar +unilamellate +unilaminar +unilaminate +unilateral +unilateralism +unilateralist +unilaterality +unilateralization +unilateralize +unilaterally +unilinear +unilingual +unilingualism +uniliteral +unilludedly +unillumed +unilluminated +unilluminating +unillumination +unillumined +unillusioned +unillusory +unillustrated +unillustrative +unillustrious +unilobal +unilobar +unilobate +unilobe +unilobed +unilobular +unilocular +unilocularity +uniloculate +unimacular +unimaged +unimaginable +unimaginableness +unimaginably +unimaginary +unimaginative +unimaginatively +unimaginativeness +unimagine +unimagined +unimanual +unimbanked +unimbellished +unimbezzled +unimbibed +unimbibing +unimbittered +unimbodied +unimboldened +unimbordered +unimbosomed +unimbowed +unimbowered +unimbroiled +unimbrowned +unimbrued +unimbued +unimedial +unimitable +unimitableness +unimitably +unimitated +unimitating +unimitative +unimmaculate +unimmanent +unimmediate +unimmerged +unimmergible +unimmersed +unimmigrating +unimmolated +unimmortal +unimmortalize +unimmortalized +unimmovable +unimmured +unimodal +unimodality +unimodular +unimolecular +unimolecularity +unimpair +unimpairable +unimpaired +unimpartable +unimparted +unimpartial +unimpassionate +unimpassioned +unimpassionedly +unimpassionedness +unimpatient +unimpawned +unimpeachability +unimpeachable +unimpeachableness +unimpeachably +unimpeached +unimpearled +unimped +unimpeded +unimpededly +unimpedible +unimpedness +unimpelled +unimpenetrable +unimperative +unimperial +unimperialistic +unimperious +unimpertinent +unimpinging +unimplanted +unimplicable +unimplicate +unimplicated +unimplicit +unimplicitly +unimplied +unimplorable +unimplored +unimpoisoned +unimportance +unimportant +unimportantly +unimported +unimporting +unimportunate +unimportunately +unimportuned +unimposed +unimposedly +unimposing +unimpostrous +unimpounded +unimpoverished +unimpowered +unimprecated +unimpregnable +unimpregnate +unimpregnated +unimpressed +unimpressibility +unimpressible +unimpressibleness +unimpressibly +unimpressionability +unimpressionable +unimpressive +unimpressively +unimpressiveness +unimprinted +unimprison +unimprisonable +unimprisoned +unimpropriated +unimprovable +unimprovableness +unimprovably +unimproved +unimprovedly +unimprovedness +unimprovement +unimproving +unimprovised +unimpugnable +unimpugned +unimpulsive +unimpurpled +unimputable +unimputed +unimucronate +unimultiplex +unimuscular +uninaugurated +unincantoned +unincarcerated +unincarnate +unincarnated +unincensed +uninchoative +unincidental +unincised +unincisive +unincited +uninclinable +uninclined +uninclining +uninclosed +uninclosedness +unincludable +unincluded +uninclusive +uninclusiveness +uninconvenienced +unincorporate +unincorporated +unincorporatedly +unincorporatedness +unincreasable +unincreased +unincreasing +unincubated +uninculcated +unincumbered +unindebted +unindebtedly +unindebtedness +unindemnified +unindentable +unindented +unindentured +unindexed +unindicable +unindicated +unindicative +unindictable +unindicted +unindifference +unindifferency +unindifferent +unindifferently +unindigent +unindignant +unindividual +unindividualize +unindividualized +unindividuated +unindorsed +uninduced +uninductive +unindulged +unindulgent +unindulgently +unindurated +unindustrial +unindustrialized +unindustrious +unindustriously +unindwellable +uninebriated +uninebriating +uninervate +uninerved +uninfallibility +uninfallible +uninfatuated +uninfectable +uninfected +uninfectious +uninfectiousness +uninfeft +uninferred +uninfested +uninfiltrated +uninfinite +uninfiniteness +uninfixed +uninflamed +uninflammability +uninflammable +uninflated +uninflected +uninflectedness +uninflicted +uninfluenceable +uninfluenced +uninfluencing +uninfluencive +uninfluential +uninfluentiality +uninfolded +uninformed +uninforming +uninfracted +uninfringeable +uninfringed +uninfringible +uninfuriated +uninfused +uningenious +uningeniously +uningeniousness +uningenuity +uningenuous +uningenuously +uningenuousness +uningested +uningrafted +uningrained +uninhabitability +uninhabitable +uninhabitableness +uninhabitably +uninhabited +uninhabitedness +uninhaled +uninheritability +uninheritable +uninherited +uninhibited +uninhibitive +uninhumed +uninimical +uniniquitous +uninitialed +uninitialled +uninitiate +uninitiated +uninitiatedness +uninitiation +uninjectable +uninjected +uninjurable +uninjured +uninjuredness +uninjuring +uninjurious +uninjuriously +uninjuriousness +uninked +uninlaid +uninn +uninnate +uninnocence +uninnocent +uninnocently +uninnocuous +uninnovating +uninoculable +uninoculated +uninodal +uninominal +uninquired +uninquiring +uninquisitive +uninquisitively +uninquisitiveness +uninquisitorial +uninsane +uninsatiable +uninscribed +uninserted +uninshrined +uninsinuated +uninsistent +uninsolvent +uninspected +uninspirable +uninspired +uninspiring +uninspiringly +uninspirited +uninspissated +uninstalled +uninstanced +uninstated +uninstigated +uninstilled +uninstituted +uninstructed +uninstructedly +uninstructedness +uninstructible +uninstructing +uninstructive +uninstructively +uninstructiveness +uninstrumental +uninsular +uninsulate +uninsulated +uninsultable +uninsulted +uninsulting +uninsurability +uninsurable +uninsured +unintegrated +unintellective +unintellectual +unintellectualism +unintellectuality +unintellectually +unintelligence +unintelligent +unintelligently +unintelligentsia +unintelligibility +unintelligible +unintelligibleness +unintelligibly +unintended +unintendedly +unintensive +unintent +unintentional +unintentionality +unintentionally +unintentionalness +unintently +unintentness +unintercalated +unintercepted +uninterchangeable +uninterdicted +uninterested +uninterestedly +uninterestedness +uninteresting +uninterestingly +uninterestingness +uninterferedwith +uninterjected +uninterlaced +uninterlarded +uninterleave +uninterleaved +uninterlined +uninterlinked +uninterlocked +unintermarrying +unintermediate +unintermingled +unintermission +unintermissive +unintermitted +unintermittedly +unintermittedness +unintermittent +unintermitting +unintermittingly +unintermittingness +unintermixed +uninternational +uninterpleaded +uninterpolated +uninterposed +uninterposing +uninterpretable +uninterpreted +uninterred +uninterrogable +uninterrogated +uninterrupted +uninterruptedly +uninterruptedness +uninterruptible +uninterruptibleness +uninterrupting +uninterruption +unintersected +uninterspersed +unintervening +uninterviewed +unintervolved +uninterwoven +uninthroned +unintimate +unintimated +unintimidated +unintitled +unintombed +unintoned +unintoxicated +unintoxicatedness +unintoxicating +unintrenchable +unintrenched +unintricate +unintrigued +unintriguing +unintroduced +unintroducible +unintroitive +unintromitted +unintrospective +unintruded +unintruding +unintrusive +unintrusively +unintrusted +unintuitive +unintwined +uninuclear +uninucleate +uninucleated +uninundated +uninured +uninurned +uninvadable +uninvaded +uninvaginated +uninvalidated +uninveighing +uninveigled +uninvented +uninventful +uninventibleness +uninventive +uninventively +uninventiveness +uninverted +uninvested +uninvestigable +uninvestigated +uninvestigating +uninvestigative +uninvidious +uninvidiously +uninvigorated +uninvincible +uninvite +uninvited +uninvitedly +uninviting +uninvoiced +uninvoked +uninvolved +uninweaved +uninwoven +uninwrapped +uninwreathed +Unio +unio +uniocular +unioid +Uniola +union +unioned +unionic +unionid +Unionidae +unioniform +unionism +unionist +unionistic +unionization +unionize +unionoid +unioval +uniovular +uniovulate +unipara +uniparental +uniparient +uniparous +unipartite +uniped +unipeltate +uniperiodic +unipersonal +unipersonalist +unipersonality +unipetalous +uniphase +uniphaser +uniphonous +uniplanar +uniplicate +unipod +unipolar +unipolarity +uniporous +unipotence +unipotent +unipotential +unipulse +uniquantic +unique +uniquely +uniqueness +uniquity +uniradial +uniradiate +uniradiated +uniradical +uniramose +uniramous +unirascible +unireme +unirenic +unirhyme +uniridescent +unironed +unironical +unirradiated +unirrigated +unirritable +unirritant +unirritated +unirritatedly +unirritating +unisepalous +uniseptate +uniserial +uniserially +uniseriate +uniseriately +uniserrate +uniserrulate +unisexed +unisexual +unisexuality +unisexually +unisilicate +unisoil +unisolable +unisolate +unisolated +unisomeric +unisometrical +unisomorphic +unison +unisonal +unisonally +unisonance +unisonant +unisonous +unisotropic +unisparker +unispiculate +unispinose +unispiral +unissuable +unissued +unistylist +unisulcate +unit +unitage +unital +unitalicized +Unitarian +unitarian +Unitarianism +Unitarianize +unitarily +unitariness +unitarism +unitarist +unitary +unite +uniteability +uniteable +uniteably +united +unitedly +unitedness +unitemized +unitentacular +uniter +uniting +unitingly +unition +unitism +unitistic +unitive +unitively +unitiveness +unitize +unitooth +unitrivalent +unitrope +unituberculate +unitude +unity +uniunguiculate +uniungulate +univalence +univalency +univalent +univalvate +univalve +univalvular +univariant +univerbal +universal +universalia +Universalian +Universalism +universalism +Universalist +universalist +Universalistic +universalistic +universality +universalization +universalize +universalizer +universally +universalness +universanimous +universe +universeful +universitarian +universitarianism +universitary +universitize +university +universityless +universitylike +universityship +universological +universologist +universology +univied +univocability +univocacy +univocal +univocalized +univocally +univocity +univoltine +univorous +unjacketed +unjaded +unjagged +unjailed +unjam +unjapanned +unjarred +unjarring +unjaundiced +unjaunty +unjealous +unjealoused +unjellied +unjesting +unjesuited +unjesuitical +unjesuitically +unjewel +unjeweled +unjewelled +Unjewish +unjilted +unjocose +unjocund +unjogged +unjogging +unjoin +unjoinable +unjoint +unjointed +unjointedness +unjointured +unjoking +unjokingly +unjolly +unjolted +unjostled +unjournalized +unjovial +unjovially +unjoyed +unjoyful +unjoyfully +unjoyfulness +unjoyous +unjoyously +unjoyousness +unjudgable +unjudge +unjudged +unjudgelike +unjudging +unjudicable +unjudicial +unjudicially +unjudicious +unjudiciously +unjudiciousness +unjuggled +unjuiced +unjuicy +unjumbled +unjumpable +unjust +unjustice +unjusticiable +unjustifiable +unjustifiableness +unjustifiably +unjustified +unjustifiedly +unjustifiedness +unjustify +unjustled +unjustly +unjustness +unjuvenile +unkaiserlike +unkamed +unked +unkeeled +unkembed +unkempt +unkemptly +unkemptness +unken +unkenned +unkennedness +unkennel +unkenneled +unkenning +unkensome +unkept +unkerchiefed +unket +unkey +unkeyed +unkicked +unkid +unkill +unkillability +unkillable +unkilled +unkilling +unkilned +unkin +unkind +unkindhearted +unkindled +unkindledness +unkindlily +unkindliness +unkindling +unkindly +unkindness +unkindred +unkindredly +unking +unkingdom +unkinged +unkinger +unkinglike +unkingly +unkink +unkinlike +unkirk +unkiss +unkissed +unkist +unknave +unkneaded +unkneeling +unknelled +unknew +unknight +unknighted +unknightlike +unknit +unknittable +unknitted +unknitting +unknocked +unknocking +unknot +unknotted +unknotty +unknow +unknowability +unknowable +unknowableness +unknowably +unknowen +unknowing +unknowingly +unknowingness +unknowledgeable +unknown +unknownly +unknownness +unknownst +unkodaked +unkoshered +unlabeled +unlabialize +unlabiate +unlaborable +unlabored +unlaboring +unlaborious +unlaboriously +unlaboriousness +unlace +unlaced +unlacerated +unlackeyed +unlacquered +unlade +unladen +unladled +unladyfied +unladylike +unlagging +unlaid +unlame +unlamed +unlamented +unlampooned +unlanced +unland +unlanded +unlandmarked +unlanguaged +unlanguid +unlanguishing +unlanterned +unlap +unlapped +unlapsed +unlapsing +unlarded +unlarge +unlash +unlashed +unlasher +unlassoed +unlasting +unlatch +unlath +unlathed +unlathered +unlatinized +unlatticed +unlaudable +unlaudableness +unlaudably +unlauded +unlaugh +unlaughing +unlaunched +unlaundered +unlaureled +unlaved +unlaving +unlavish +unlavished +unlaw +unlawed +unlawful +unlawfully +unlawfulness +unlawlearned +unlawlike +unlawly +unlawyered +unlawyerlike +unlay +unlayable +unleached +unlead +unleaded +unleaderly +unleaf +unleafed +unleagued +unleaguer +unleakable +unleaky +unleal +unlean +unleared +unlearn +unlearnability +unlearnable +unlearnableness +unlearned +unlearnedly +unlearnedness +unlearning +unlearnt +unleasable +unleased +unleash +unleashed +unleathered +unleave +unleaved +unleavenable +unleavened +unlectured +unled +unleft +unlegacied +unlegal +unlegalized +unlegally +unlegalness +unlegate +unlegislative +unleisured +unleisuredness +unleisurely +unlenient +unlensed +unlent +unless +unlessened +unlessoned +unlet +unlettable +unletted +unlettered +unletteredly +unletteredness +unlettering +unletterlike +unlevel +unleveled +unlevelly +unlevelness +unlevied +unlevigated +unlexicographical +unliability +unliable +unlibeled +unliberal +unliberalized +unliberated +unlibidinous +unlicensed +unlicentiated +unlicentious +unlichened +unlickable +unlicked +unlid +unlidded +unlie +unlifelike +unliftable +unlifted +unlifting +unligable +unligatured +unlight +unlighted +unlightedly +unlightedness +unlightened +unlignified +unlikable +unlikableness +unlikably +unlike +unlikeable +unlikeableness +unlikeably +unliked +unlikelihood +unlikeliness +unlikely +unliken +unlikeness +unliking +unlimb +unlimber +unlime +unlimed +unlimitable +unlimitableness +unlimitably +unlimited +unlimitedly +unlimitedness +unlimitless +unlimned +unlimp +unline +unlineal +unlined +unlingering +unlink +unlinked +unlionlike +unliquefiable +unliquefied +unliquid +unliquidatable +unliquidated +unliquidating +unliquidation +unliquored +unlisping +unlist +unlisted +unlistened +unlistening +unlisty +unlit +unliteral +unliterally +unliteralness +unliterary +unliterate +unlitigated +unlitten +unlittered +unliturgical +unliturgize +unlivable +unlivableness +unlivably +unlive +unliveable +unliveableness +unliveably +unliveliness +unlively +unliveried +unlivery +unliving +unlizardlike +unload +unloaded +unloaden +unloader +unloafing +unloanably +unloaned +unloaning +unloath +unloathed +unloathful +unloathly +unloathsome +unlobed +unlocal +unlocalizable +unlocalize +unlocalized +unlocally +unlocated +unlock +unlockable +unlocked +unlocker +unlocking +unlocomotive +unlodge +unlodged +unlofty +unlogged +unlogic +unlogical +unlogically +unlogicalness +unlonely +unlook +unlooked +unloop +unlooped +unloosable +unloosably +unloose +unloosen +unloosening +unloosing +unlooted +unlopped +unloquacious +unlord +unlorded +unlordly +unlosable +unlosableness +unlost +unlotted +unlousy +unlovable +unlovableness +unlovably +unlove +unloveable +unloveableness +unloveably +unloved +unlovelily +unloveliness +unlovely +unloverlike +unloverly +unloving +unlovingly +unlovingness +unlowered +unlowly +unloyal +unloyally +unloyalty +unlubricated +unlucent +unlucid +unluck +unluckful +unluckily +unluckiness +unlucky +unlucrative +unludicrous +unluffed +unlugged +unlugubrious +unluminous +unlumped +unlunar +unlured +unlust +unlustily +unlustiness +unlustrous +unlusty +unlute +unluted +unluxated +unluxuriant +unluxurious +unlycanthropize +unlying +unlyrical +unlyrically +unmacadamized +unmacerated +unmachinable +unmackly +unmad +unmadded +unmaddened +unmade +unmagic +unmagical +unmagisterial +unmagistratelike +unmagnanimous +unmagnetic +unmagnetical +unmagnetized +unmagnified +unmagnify +unmaid +unmaidenlike +unmaidenliness +unmaidenly +unmail +unmailable +unmailableness +unmailed +unmaimable +unmaimed +unmaintainable +unmaintained +unmajestic +unmakable +unmake +unmaker +unmalevolent +unmalicious +unmalignant +unmaligned +unmalleability +unmalleable +unmalleableness +unmalled +unmaltable +unmalted +unmammalian +unmammonized +unman +unmanacle +unmanacled +unmanageable +unmanageableness +unmanageably +unmanaged +unmancipated +unmandated +unmanducated +unmaned +unmaneged +unmanful +unmanfully +unmangled +unmaniable +unmaniac +unmaniacal +unmanicured +unmanifest +unmanifested +unmanipulatable +unmanipulated +unmanlike +unmanlily +unmanliness +unmanly +unmanned +unmanner +unmannered +unmanneredly +unmannerliness +unmannerly +unmannish +unmanored +unmantle +unmantled +unmanufacturable +unmanufactured +unmanumissible +unmanumitted +unmanurable +unmanured +unmappable +unmapped +unmarbled +unmarch +unmarching +unmarginal +unmarginated +unmarine +unmaritime +unmarkable +unmarked +unmarketable +unmarketed +unmarled +unmarred +unmarriable +unmarriageability +unmarriageable +unmarried +unmarring +unmarry +unmarrying +unmarshaled +unmartial +unmartyr +unmartyred +unmarvelous +unmasculine +unmashed +unmask +unmasked +unmasker +unmasking +unmasquerade +unmassacred +unmassed +unmast +unmaster +unmasterable +unmastered +unmasterful +unmasticable +unmasticated +unmatchable +unmatchableness +unmatchably +unmatched +unmatchedness +unmate +unmated +unmaterial +unmaterialistic +unmateriate +unmaternal +unmathematical +unmathematically +unmating +unmatriculated +unmatrimonial +unmatronlike +unmatted +unmature +unmatured +unmaturely +unmatureness +unmaturing +unmaturity +unmauled +unmaze +unmeaning +unmeaningly +unmeaningness +unmeant +unmeasurable +unmeasurableness +unmeasurably +unmeasured +unmeasuredly +unmeasuredness +unmeated +unmechanic +unmechanical +unmechanically +unmechanistic +unmechanize +unmechanized +unmedaled +unmedalled +unmeddle +unmeddled +unmeddlesome +unmeddling +unmeddlingly +unmeddlingness +unmediaeval +unmediated +unmediatized +unmedicable +unmedical +unmedicated +unmedicative +unmedicinable +unmedicinal +unmeditated +unmeditative +unmediumistic +unmedullated +unmeek +unmeekly +unmeekness +unmeet +unmeetable +unmeetly +unmeetness +unmelancholy +unmeliorated +unmellow +unmellowed +unmelodic +unmelodious +unmelodiously +unmelodiousness +unmelodized +unmelodramatic +unmeltable +unmeltableness +unmeltably +unmelted +unmeltedness +unmelting +unmember +unmemoired +unmemorable +unmemorialized +unmemoried +unmemorized +unmenaced +unmenacing +unmendable +unmendableness +unmendably +unmendacious +unmended +unmenial +unmenseful +unmenstruating +unmensurable +unmental +unmentionability +unmentionable +unmentionableness +unmentionables +unmentionably +unmentioned +unmercantile +unmercenariness +unmercenary +unmercerized +unmerchantable +unmerchantlike +unmerchantly +unmerciful +unmercifully +unmercifulness +unmercurial +unmeretricious +unmerge +unmerged +unmeridional +unmerited +unmeritedly +unmeritedness +unmeriting +unmeritorious +unmeritoriously +unmeritoriousness +unmerry +unmesh +unmesmeric +unmesmerize +unmesmerized +unmet +unmetaled +unmetalized +unmetalled +unmetallic +unmetallurgical +unmetamorphosed +unmetaphorical +unmetaphysic +unmetaphysical +unmeted +unmeteorological +unmetered +unmethodical +unmethodically +unmethodicalness +unmethodized +unmethodizing +unmethylated +unmeticulous +unmetric +unmetrical +unmetrically +unmetricalness +unmetropolitan +unmettle +unmew +unmewed +unmicaceous +unmicrobic +unmicroscopic +unmidwifed +unmighty +unmigrating +unmildewed +unmilitant +unmilitarily +unmilitariness +unmilitaristic +unmilitarized +unmilitary +unmilked +unmilled +unmillinered +unmilted +unmimicked +unminable +unminced +unmincing +unmind +unminded +unmindful +unmindfully +unmindfulness +unminding +unmined +unmineralized +unmingle +unmingleable +unmingled +unmingling +unminimized +unminished +unminister +unministered +unministerial +unministerially +unminted +unminuted +unmiracled +unmiraculous +unmiraculously +unmired +unmirrored +unmirthful +unmirthfully +unmirthfulness +unmiry +unmisanthropic +unmiscarrying +unmischievous +unmiscible +unmisconceivable +unmiserly +unmisgiving +unmisgivingly +unmisguided +unmisinterpretable +unmisled +unmissable +unmissed +unmissionary +unmissionized +unmist +unmistakable +unmistakableness +unmistakably +unmistakedly +unmistaken +unmistakingly +unmistressed +unmistrusted +unmistrustful +unmistrusting +unmisunderstandable +unmisunderstanding +unmisunderstood +unmiter +unmitigable +unmitigated +unmitigatedly +unmitigatedness +unmitigative +unmittened +unmix +unmixable +unmixableness +unmixed +unmixedly +unmixedness +unmoaned +unmoated +unmobbed +unmobilized +unmocked +unmocking +unmockingly +unmodel +unmodeled +unmodelled +unmoderate +unmoderately +unmoderateness +unmoderating +unmodern +unmodernity +unmodernize +unmodernized +unmodest +unmodifiable +unmodifiableness +unmodifiably +unmodified +unmodifiedness +unmodish +unmodulated +unmoiled +unmoist +unmoisten +unmold +unmoldable +unmolded +unmoldered +unmoldering +unmoldy +unmolested +unmolestedly +unmolesting +unmollifiable +unmollifiably +unmollified +unmollifying +unmolten +unmomentary +unmomentous +unmomentously +unmonarch +unmonarchical +unmonastic +unmonetary +unmoneyed +unmonistic +unmonitored +unmonkish +unmonkly +unmonopolize +unmonopolized +unmonopolizing +unmonotonous +unmonumented +unmoor +unmoored +unmooted +unmopped +unmoral +unmoralist +unmorality +unmoralize +unmoralized +unmoralizing +unmorally +unmoralness +unmorbid +unmordanted +unmoribund +unmorose +unmorphological +unmortal +unmortared +unmortgage +unmortgageable +unmortgaged +unmortified +unmortifiedly +unmortifiedness +unmortise +unmortised +unmossed +unmothered +unmotherly +unmotionable +unmotivated +unmotivatedly +unmotivatedness +unmotived +unmotorized +unmottled +unmounded +unmount +unmountable +unmountainous +unmounted +unmounting +unmourned +unmournful +unmourning +unmouthable +unmouthed +unmouthpieced +unmovability +unmovable +unmovableness +unmovably +unmoved +unmovedly +unmoving +unmovingly +unmovingness +unmowed +unmown +unmucilaged +unmudded +unmuddied +unmuddle +unmuddled +unmuddy +unmuffle +unmuffled +unmulcted +unmulish +unmulled +unmullioned +unmultipliable +unmultiplied +unmultipliedly +unmultiply +unmummied +unmummify +unmunched +unmundane +unmundified +unmunicipalized +unmunificent +unmunitioned +unmurmured +unmurmuring +unmurmuringly +unmurmurous +unmuscled +unmuscular +unmusical +unmusicality +unmusically +unmusicalness +unmusicianly +unmusked +unmussed +unmusted +unmusterable +unmustered +unmutated +unmutation +unmuted +unmutilated +unmutinous +unmuttered +unmutual +unmutualized +unmuzzle +unmuzzled +unmuzzling +unmyelinated +unmysterious +unmysteriously +unmystery +unmystical +unmysticize +unmystified +unmythical +unnabbed +unnagged +unnagging +unnail +unnailed +unnaked +unnamability +unnamable +unnamableness +unnamably +unname +unnameability +unnameable +unnameableness +unnameably +unnamed +unnapkined +unnapped +unnarcotic +unnarrated +unnarrow +unnation +unnational +unnationalized +unnative +unnatural +unnaturalism +unnaturalist +unnaturalistic +unnaturality +unnaturalizable +unnaturalize +unnaturalized +unnaturally +unnaturalness +unnature +unnautical +unnavigability +unnavigable +unnavigableness +unnavigably +unnavigated +unneaped +unnearable +unneared +unnearly +unnearness +unneat +unneatly +unneatness +unnebulous +unnecessarily +unnecessariness +unnecessary +unnecessitated +unnecessitating +unnecessity +unneeded +unneedful +unneedfully +unneedfulness +unneedy +unnefarious +unnegated +unneglected +unnegligent +unnegotiable +unnegotiableness +unnegotiably +unnegotiated +unnegro +unneighbored +unneighborlike +unneighborliness +unneighborly +unnephritic +unnerve +unnerved +unnervous +unnest +unnestle +unnestled +unneth +unnethe +unnethes +unnethis +unnetted +unnettled +unneurotic +unneutral +unneutralized +unneutrally +unnew +unnewly +unnewness +unnibbed +unnibbied +unnice +unnicely +unniceness +unniched +unnicked +unnickeled +unnickelled +unnicknamed +unniggard +unniggardly +unnigh +unnimbed +unnimble +unnimbleness +unnimbly +unnipped +unnitrogenized +unnobilitated +unnobility +unnoble +unnobleness +unnobly +unnoised +unnomadic +unnominated +unnonsensical +unnoosed +unnormal +unnorthern +unnose +unnosed +unnotable +unnotched +unnoted +unnoteworthy +unnoticeable +unnoticeableness +unnoticeably +unnoticed +unnoticing +unnotified +unnotify +unnoting +unnourishable +unnourished +unnourishing +unnovel +unnovercal +unnucleated +unnullified +unnumberable +unnumberableness +unnumberably +unnumbered +unnumberedness +unnumerical +unnumerous +unnurtured +unnutritious +unnutritive +unnuzzled +unnymphlike +unoared +unobdurate +unobedience +unobedient +unobediently +unobese +unobeyed +unobeying +unobjected +unobjectionable +unobjectionableness +unobjectionably +unobjectional +unobjective +unobligated +unobligatory +unobliged +unobliging +unobligingly +unobligingness +unobliterable +unobliterated +unoblivious +unobnoxious +unobscene +unobscure +unobscured +unobsequious +unobsequiously +unobsequiousness +unobservable +unobservance +unobservant +unobservantly +unobservantness +unobserved +unobservedly +unobserving +unobservingly +unobsessed +unobsolete +unobstinate +unobstruct +unobstructed +unobstructedly +unobstructedness +unobstructive +unobstruent +unobtainable +unobtainableness +unobtainably +unobtained +unobtruded +unobtruding +unobtrusive +unobtrusively +unobtrusiveness +unobtunded +unobumbrated +unobverted +unobviated +unobvious +unoccasional +unoccasioned +unoccidental +unoccluded +unoccupancy +unoccupation +unoccupied +unoccupiedly +unoccupiedness +unoccurring +unoceanic +unocular +unode +unodious +unodoriferous +unoecumenic +unoecumenical +unoffendable +unoffended +unoffendedly +unoffender +unoffending +unoffendingly +unoffensive +unoffensively +unoffensiveness +unoffered +unofficed +unofficered +unofficerlike +unofficial +unofficialdom +unofficially +unofficialness +unofficiating +unofficinal +unofficious +unofficiously +unofficiousness +unoffset +unoften +unogled +unoil +unoiled +unoiling +unoily +unold +unomened +unominous +unomitted +unomnipotent +unomniscient +Unona +unonerous +unontological +unopaque +unoped +unopen +unopenable +unopened +unopening +unopenly +unopenness +unoperably +unoperated +unoperatic +unoperating +unoperative +unoperculate +unoperculated +unopined +unopinionated +unoppignorated +unopportune +unopportunely +unopportuneness +unopposable +unopposed +unopposedly +unopposedness +unopposite +unoppressed +unoppressive +unoppressively +unoppressiveness +unopprobrious +unoppugned +unopulence +unopulent +unoratorial +unoratorical +unorbed +unorbital +unorchestrated +unordain +unordainable +unordained +unorder +unorderable +unordered +unorderly +unordinarily +unordinariness +unordinary +unordinate +unordinately +unordinateness +unordnanced +unorganic +unorganical +unorganically +unorganicalness +unorganizable +unorganized +unorganizedly +unorganizedness +unoriental +unorientalness +unoriented +unoriginal +unoriginality +unoriginally +unoriginalness +unoriginate +unoriginated +unoriginatedness +unoriginately +unoriginateness +unorigination +unoriginative +unoriginatively +unoriginativeness +unorn +unornamental +unornamentally +unornamentalness +unornamented +unornate +unornithological +unornly +unorphaned +unorthodox +unorthodoxically +unorthodoxly +unorthodoxness +unorthodoxy +unorthographical +unorthographically +unoscillating +unosculated +unossified +unostensible +unostentation +unostentatious +unostentatiously +unostentatiousness +unoutgrown +unoutlawed +unoutraged +unoutspeakable +unoutspoken +unoutworn +unoverclouded +unovercome +unoverdone +unoverdrawn +unoverflowing +unoverhauled +unoverleaped +unoverlooked +unoverpaid +unoverpowered +unoverruled +unovert +unovertaken +unoverthrown +unovervalued +unoverwhelmed +unowed +unowing +unown +unowned +unoxidable +unoxidated +unoxidizable +unoxidized +unoxygenated +unoxygenized +unpacable +unpaced +unpacifiable +unpacific +unpacified +unpacifiedly +unpacifiedness +unpacifist +unpack +unpacked +unpacker +unpadded +unpadlocked +unpagan +unpaganize +unpaged +unpaginal +unpaid +unpained +unpainful +unpaining +unpainstaking +unpaint +unpaintability +unpaintable +unpaintableness +unpaintably +unpainted +unpaintedly +unpaintedness +unpaired +unpalatability +unpalatable +unpalatableness +unpalatably +unpalatal +unpalatial +unpale +unpaled +unpalisaded +unpalisadoed +unpalled +unpalliable +unpalliated +unpalpable +unpalped +unpalpitating +unpalsied +unpampered +unpanegyrized +unpanel +unpaneled +unpanelled +unpanged +unpanniered +unpanoplied +unpantheistic +unpanting +unpapal +unpapaverous +unpaper +unpapered +unparaded +unparadise +unparadox +unparagoned +unparagonized +unparagraphed +unparallel +unparallelable +unparalleled +unparalleledly +unparalleledness +unparallelness +unparalyzed +unparaphrased +unparasitical +unparcel +unparceled +unparceling +unparcelled +unparcelling +unparch +unparched +unparching +unpardon +unpardonable +unpardonableness +unpardonably +unpardoned +unpardonedness +unpardoning +unpared +unparented +unparfit +unpargeted +unpark +unparked +unparking +unparliamentary +unparliamented +unparodied +unparrel +unparriable +unparried +unparroted +unparrying +unparsed +unparsimonious +unparsonic +unparsonical +unpartable +unpartableness +unpartably +unpartaken +unpartaking +unparted +unpartial +unpartiality +unpartially +unpartialness +unparticipant +unparticipated +unparticipating +unparticipative +unparticular +unparticularized +unparticularizing +unpartisan +unpartitioned +unpartizan +unpartnered +unpartook +unparty +unpass +unpassable +unpassableness +unpassably +unpassed +unpassing +unpassionate +unpassionately +unpassionateness +unpassioned +unpassive +unpaste +unpasted +unpasteurized +unpasting +unpastor +unpastoral +unpastured +unpatched +unpatent +unpatentable +unpatented +unpaternal +unpathed +unpathetic +unpathwayed +unpatient +unpatiently +unpatientness +unpatriarchal +unpatrician +unpatriotic +unpatriotically +unpatriotism +unpatristic +unpatrolled +unpatronizable +unpatronized +unpatronizing +unpatted +unpatterned +unpaunch +unpaunched +unpauperized +unpausing +unpausingly +unpave +unpaved +unpavilioned +unpaving +unpawed +unpawn +unpawned +unpayable +unpayableness +unpayably +unpaying +unpayment +unpeace +unpeaceable +unpeaceableness +unpeaceably +unpeaceful +unpeacefully +unpeacefulness +unpealed +unpearled +unpebbled +unpeccable +unpecked +unpecuniarily +unpedagogical +unpedantic +unpeddled +unpedestal +unpedigreed +unpeel +unpeelable +unpeelableness +unpeeled +unpeerable +unpeered +unpeg +unpejorative +unpelagic +unpelted +unpen +unpenal +unpenalized +unpenanced +unpenciled +unpencilled +unpenetrable +unpenetrated +unpenetrating +unpenitent +unpenitently +unpenitentness +unpenned +unpennied +unpennoned +unpensionable +unpensionableness +unpensioned +unpensioning +unpent +unpenurious +unpeople +unpeopled +unpeopling +unperceived +unperceivedly +unperceptible +unperceptibly +unperceptive +unperch +unperched +unpercipient +unpercolated +unpercussed +unperfect +unperfected +unperfectedly +unperfectedness +unperfectly +unperfectness +unperfidious +unperflated +unperforate +unperforated +unperformable +unperformance +unperformed +unperforming +unperfumed +unperilous +unperiodic +unperiodical +unperiphrased +unperishable +unperishableness +unperishably +unperished +unperishing +unperjured +unpermanency +unpermanent +unpermanently +unpermeable +unpermeated +unpermissible +unpermissive +unpermitted +unpermitting +unpermixed +unpernicious +unperpendicular +unperpetrated +unperpetuated +unperplex +unperplexed +unperplexing +unpersecuted +unpersecutive +unperseverance +unpersevering +unperseveringly +unperseveringness +unpersonable +unpersonableness +unpersonal +unpersonality +unpersonified +unpersonify +unperspicuous +unperspirable +unperspiring +unpersuadable +unpersuadableness +unpersuadably +unpersuaded +unpersuadedness +unpersuasibleness +unpersuasion +unpersuasive +unpersuasively +unpersuasiveness +unpertaining +unpertinent +unpertinently +unperturbed +unperturbedly +unperturbedness +unperuked +unperused +unpervaded +unperverse +unpervert +unperverted +unpervious +unpessimistic +unpestered +unpestilential +unpetal +unpetitioned +unpetrified +unpetrify +unpetticoated +unpetulant +unpharasaic +unpharasaical +unphased +unphenomenal +unphilanthropic +unphilanthropically +unphilological +unphilosophic +unphilosophically +unphilosophicalness +unphilosophize +unphilosophized +unphilosophy +unphlegmatic +unphonetic +unphoneticness +unphonographed +unphosphatized +unphotographed +unphrasable +unphrasableness +unphrased +unphrenological +unphysical +unphysically +unphysicianlike +unphysicked +unphysiological +unpicaresque +unpick +unpickable +unpicked +unpicketed +unpickled +unpictorial +unpictorially +unpicturability +unpicturable +unpictured +unpicturesque +unpicturesquely +unpicturesqueness +unpiece +unpieced +unpierceable +unpierced +unpiercing +unpiety +unpigmented +unpile +unpiled +unpilfered +unpilgrimlike +unpillaged +unpillared +unpilled +unpilloried +unpillowed +unpiloted +unpimpled +unpin +unpinched +unpining +unpinion +unpinioned +unpinked +unpinned +unpious +unpiped +unpiqued +unpirated +unpitched +unpiteous +unpiteously +unpiteousness +unpitiable +unpitiably +unpitied +unpitiedly +unpitiedness +unpitiful +unpitifully +unpitifulness +unpitted +unpitying +unpityingly +unpityingness +unplacable +unplacably +unplacated +unplace +unplaced +unplacid +unplagiarized +unplagued +unplaid +unplain +unplained +unplainly +unplainness +unplait +unplaited +unplan +unplaned +unplanished +unplank +unplanked +unplanned +unplannedly +unplannedness +unplant +unplantable +unplanted +unplantlike +unplashed +unplaster +unplastered +unplastic +unplat +unplated +unplatted +unplausible +unplausibleness +unplausibly +unplayable +unplayed +unplayful +unplaying +unpleached +unpleadable +unpleaded +unpleading +unpleasable +unpleasant +unpleasantish +unpleasantly +unpleasantness +unpleasantry +unpleased +unpleasing +unpleasingly +unpleasingness +unpleasurable +unpleasurably +unpleasure +unpleat +unpleated +unplebeian +unpledged +unplenished +unplenteous +unplentiful +unplentifulness +unpliable +unpliableness +unpliably +unpliancy +unpliant +unpliantly +unplied +unplighted +unplodding +unplotted +unplotting +unplough +unploughed +unplow +unplowed +unplucked +unplug +unplugged +unplugging +unplumb +unplumbed +unplume +unplumed +unplummeted +unplump +unplundered +unplunge +unplunged +unplutocratic +unplutocratically +unpoached +unpocket +unpocketed +unpodded +unpoetic +unpoetically +unpoeticalness +unpoeticized +unpoetize +unpoetized +unpoignard +unpointed +unpointing +unpoise +unpoised +unpoison +unpoisonable +unpoisoned +unpoisonous +unpolarizable +unpolarized +unpoled +unpolemical +unpolemically +unpoliced +unpolicied +unpolish +unpolishable +unpolished +unpolishedness +unpolite +unpolitely +unpoliteness +unpolitic +unpolitical +unpolitically +unpoliticly +unpollarded +unpolled +unpollutable +unpolluted +unpollutedly +unpolluting +unpolymerized +unpompous +unpondered +unpontifical +unpooled +unpope +unpopular +unpopularity +unpopularize +unpopularly +unpopularness +unpopulate +unpopulated +unpopulous +unpopulousness +unporous +unportable +unportended +unportentous +unportioned +unportly +unportmanteaued +unportraited +unportrayable +unportrayed +unportuous +unposed +unposing +unpositive +unpossessable +unpossessed +unpossessedness +unpossessing +unpossibility +unpossible +unpossibleness +unpossibly +unposted +unpostered +unposthumous +unpostmarked +unpostponable +unpostponed +unpostulated +unpot +unpotted +unpouched +unpoulticed +unpounced +unpounded +unpoured +unpowdered +unpower +unpowerful +unpowerfulness +unpracticability +unpracticable +unpracticableness +unpracticably +unpractical +unpracticality +unpractically +unpracticalness +unpractice +unpracticed +unpragmatical +unpraisable +unpraise +unpraised +unpraiseful +unpraiseworthy +unpranked +unpray +unprayable +unprayed +unprayerful +unpraying +unpreach +unpreached +unpreaching +unprecarious +unprecautioned +unpreceded +unprecedented +unprecedentedly +unprecedentedness +unprecedential +unprecedently +unprecious +unprecipitate +unprecipitated +unprecise +unprecisely +unpreciseness +unprecluded +unprecludible +unprecocious +unpredacious +unpredestinated +unpredestined +unpredicable +unpredicated +unpredict +unpredictable +unpredictableness +unpredictably +unpredicted +unpredictedness +unpredicting +unpredisposed +unpredisposing +unpreened +unprefaced +unpreferable +unpreferred +unprefigured +unprefined +unprefixed +unpregnant +unprejudged +unprejudicated +unprejudice +unprejudiced +unprejudicedly +unprejudicedness +unprejudiciable +unprejudicial +unprejudicially +unprejudicialness +unprelatic +unprelatical +unpreluded +unpremature +unpremeditate +unpremeditated +unpremeditatedly +unpremeditatedness +unpremeditately +unpremeditation +unpremonished +unpremonstrated +unprenominated +unprenticed +unpreoccupied +unpreordained +unpreparation +unprepare +unprepared +unpreparedly +unpreparedness +unpreparing +unpreponderated +unpreponderating +unprepossessedly +unprepossessing +unprepossessingly +unprepossessingness +unpreposterous +unpresaged +unpresageful +unpresaging +unpresbyterated +unprescient +unprescinded +unprescribed +unpresentability +unpresentable +unpresentableness +unpresentably +unpresented +unpreservable +unpreserved +unpresidential +unpresiding +unpressed +unpresumable +unpresumed +unpresuming +unpresumingness +unpresumptuous +unpresumptuously +unpresupposed +unpretended +unpretending +unpretendingly +unpretendingness +unpretentious +unpretentiously +unpretentiousness +unpretermitted +unpreternatural +unprettiness +unpretty +unprevailing +unprevalent +unprevaricating +unpreventable +unpreventableness +unpreventably +unprevented +unpreventible +unpreventive +unpriceably +unpriced +unpricked +unprickled +unprickly +unpriest +unpriestlike +unpriestly +unpriggish +unprim +unprime +unprimed +unprimitive +unprimmed +unprince +unprincelike +unprinceliness +unprincely +unprincess +unprincipal +unprinciple +unprincipled +unprincipledly +unprincipledness +unprint +unprintable +unprintableness +unprintably +unprinted +unpriority +unprismatic +unprison +unprisonable +unprisoned +unprivate +unprivileged +unprizable +unprized +unprobated +unprobationary +unprobed +unprobity +unproblematic +unproblematical +unprocessed +unproclaimed +unprocrastinated +unprocreant +unprocreated +unproctored +unprocurable +unprocurableness +unprocure +unprocured +unproded +unproduceable +unproduceableness +unproduceably +unproduced +unproducedness +unproducible +unproducibleness +unproducibly +unproductive +unproductively +unproductiveness +unproductivity +unprofanable +unprofane +unprofaned +unprofessed +unprofessing +unprofessional +unprofessionalism +unprofessionally +unprofessorial +unproffered +unproficiency +unproficient +unproficiently +unprofit +unprofitable +unprofitableness +unprofitably +unprofited +unprofiteering +unprofiting +unprofound +unprofuse +unprofusely +unprofuseness +unprognosticated +unprogressed +unprogressive +unprogressively +unprogressiveness +unprohibited +unprohibitedness +unprohibitive +unprojected +unprojecting +unproliferous +unprolific +unprolix +unprologued +unprolonged +unpromiscuous +unpromise +unpromised +unpromising +unpromisingly +unpromisingness +unpromotable +unpromoted +unprompted +unpromptly +unpromulgated +unpronounce +unpronounceable +unpronounced +unpronouncing +unproofread +unprop +unpropagated +unpropelled +unpropense +unproper +unproperly +unproperness +unpropertied +unprophesiable +unprophesied +unprophetic +unprophetical +unprophetically +unprophetlike +unpropitiable +unpropitiated +unpropitiatedness +unpropitiatory +unpropitious +unpropitiously +unpropitiousness +unproportion +unproportionable +unproportionableness +unproportionably +unproportional +unproportionality +unproportionally +unproportionate +unproportionately +unproportionateness +unproportioned +unproportionedly +unproportionedness +unproposed +unproposing +unpropounded +unpropped +unpropriety +unprorogued +unprosaic +unproscribable +unproscribed +unprosecutable +unprosecuted +unprosecuting +unproselyte +unproselyted +unprosodic +unprospected +unprospective +unprosperably +unprospered +unprosperity +unprosperous +unprosperously +unprosperousness +unprostitute +unprostituted +unprostrated +unprotectable +unprotected +unprotectedly +unprotectedness +unprotective +unprotestant +unprotestantize +unprotested +unprotesting +unprotruded +unprotruding +unprotrusive +unproud +unprovability +unprovable +unprovableness +unprovably +unproved +unprovedness +unproven +unproverbial +unprovidable +unprovide +unprovided +unprovidedly +unprovidedness +unprovidenced +unprovident +unprovidential +unprovidently +unprovincial +unproving +unprovision +unprovisioned +unprovocative +unprovokable +unprovoke +unprovoked +unprovokedly +unprovokedness +unprovoking +unproximity +unprudence +unprudent +unprudently +unpruned +unprying +unpsychic +unpsychological +unpublic +unpublicity +unpublishable +unpublishableness +unpublishably +unpublished +unpucker +unpuckered +unpuddled +unpuffed +unpuffing +unpugilistic +unpugnacious +unpulled +unpulleyed +unpulped +unpulverable +unpulverize +unpulverized +unpulvinate +unpulvinated +unpumicated +unpummeled +unpummelled +unpumpable +unpumped +unpunched +unpunctated +unpunctilious +unpunctual +unpunctuality +unpunctually +unpunctuated +unpunctuating +unpunishable +unpunishably +unpunished +unpunishedly +unpunishedness +unpunishing +unpunishingly +unpurchasable +unpurchased +unpure +unpurely +unpureness +unpurgeable +unpurged +unpurifiable +unpurified +unpurifying +unpuritan +unpurled +unpurloined +unpurpled +unpurported +unpurposed +unpurposelike +unpurposely +unpurposing +unpurse +unpursed +unpursuable +unpursued +unpursuing +unpurveyed +unpushed +unput +unputrefiable +unputrefied +unputrid +unputtied +unpuzzle +unquadded +unquaffed +unquailed +unquailing +unquailingly +unquakerlike +unquakerly +unquaking +unqualifiable +unqualification +unqualified +unqualifiedly +unqualifiedness +unqualify +unqualifying +unqualifyingly +unqualitied +unquality +unquantified +unquantitative +unquarantined +unquarreled +unquarreling +unquarrelled +unquarrelling +unquarrelsome +unquarried +unquartered +unquashed +unquayed +unqueen +unqueened +unqueening +unqueenlike +unqueenly +unquellable +unquelled +unquenchable +unquenchableness +unquenchably +unquenched +unqueried +unquested +unquestionability +unquestionable +unquestionableness +unquestionably +unquestionate +unquestioned +unquestionedly +unquestionedness +unquestioning +unquestioningly +unquestioningness +unquibbled +unquibbling +unquick +unquickened +unquickly +unquicksilvered +unquiescence +unquiescent +unquiescently +unquiet +unquietable +unquieted +unquieting +unquietly +unquietness +unquietude +unquilleted +unquilted +unquit +unquittable +unquitted +unquivered +unquivering +unquizzable +unquizzed +unquotable +unquote +unquoted +unrabbeted +unrabbinical +unraced +unrack +unracked +unracking +unradiated +unradical +unradicalize +unraffled +unraftered +unraided +unrailed +unrailroaded +unrailwayed +unrainy +unraised +unrake +unraked +unraking +unrallied +unram +unrambling +unramified +unrammed +unramped +unranched +unrancid +unrancored +unrandom +unrank +unranked +unransacked +unransomable +unransomed +unrapacious +unraped +unraptured +unrare +unrarefied +unrash +unrasped +unratable +unrated +unratified +unrational +unrattled +unravaged +unravel +unravelable +unraveled +unraveler +unraveling +unravellable +unravelled +unraveller +unravelling +unravelment +unraving +unravished +unravishing +unray +unrayed +unrazed +unrazored +unreachable +unreachably +unreached +unreactive +unread +unreadability +unreadable +unreadableness +unreadably +unreadily +unreadiness +unready +unreal +unrealism +unrealist +unrealistic +unreality +unrealizable +unrealize +unrealized +unrealizing +unreally +unrealmed +unrealness +unreaped +unreared +unreason +unreasonability +unreasonable +unreasonableness +unreasonably +unreasoned +unreasoning +unreasoningly +unreassuring +unreassuringly +unreave +unreaving +unrebated +unrebel +unrebellious +unrebuffable +unrebuffably +unrebuilt +unrebukable +unrebukably +unrebuked +unrebuttable +unrebuttableness +unrebutted +unrecallable +unrecallably +unrecalled +unrecalling +unrecantable +unrecanted +unrecaptured +unreceding +unreceipted +unreceivable +unreceived +unreceiving +unrecent +unreceptant +unreceptive +unreceptivity +unreciprocal +unreciprocated +unrecited +unrecked +unrecking +unreckingness +unreckon +unreckonable +unreckoned +unreclaimable +unreclaimably +unreclaimed +unreclaimedness +unreclaiming +unreclined +unreclining +unrecognition +unrecognizable +unrecognizableness +unrecognizably +unrecognized +unrecognizing +unrecognizingly +unrecoined +unrecollected +unrecommendable +unrecompensable +unrecompensed +unreconcilable +unreconcilableness +unreconcilably +unreconciled +unrecondite +unreconnoitered +unreconsidered +unreconstructed +unrecordable +unrecorded +unrecordedness +unrecording +unrecountable +unrecounted +unrecoverable +unrecoverableness +unrecoverably +unrecovered +unrecreant +unrecreated +unrecreating +unrecriminative +unrecruitable +unrecruited +unrectangular +unrectifiable +unrectifiably +unrectified +unrecumbent +unrecuperated +unrecurrent +unrecurring +unrecusant +unred +unredacted +unredeemable +unredeemableness +unredeemably +unredeemed +unredeemedly +unredeemedness +unredeeming +unredressable +unredressed +unreduceable +unreduced +unreducible +unreducibleness +unreducibly +unreduct +unreefed +unreel +unreelable +unreeled +unreeling +unreeve +unreeving +unreferenced +unreferred +unrefilled +unrefine +unrefined +unrefinedly +unrefinedness +unrefinement +unrefining +unrefitted +unreflected +unreflecting +unreflectingly +unreflectingness +unreflective +unreflectively +unreformable +unreformed +unreformedness +unreforming +unrefracted +unrefracting +unrefrainable +unrefrained +unrefraining +unrefreshed +unrefreshful +unrefreshing +unrefreshingly +unrefrigerated +unrefulgent +unrefunded +unrefunding +unrefusable +unrefusably +unrefused +unrefusing +unrefusingly +unrefutable +unrefuted +unrefuting +unregainable +unregained +unregal +unregaled +unregality +unregally +unregard +unregardable +unregardant +unregarded +unregardedly +unregardful +unregeneracy +unregenerate +unregenerately +unregenerateness +unregenerating +unregeneration +unregimented +unregistered +unregressive +unregretful +unregretfully +unregretfulness +unregrettable +unregretted +unregretting +unregular +unregulated +unregulative +unregurgitated +unrehabilitated +unrehearsable +unrehearsed +unrehearsing +unreigning +unreimbodied +unrein +unreined +unreinstated +unreiterable +unreiterated +unrejectable +unrejoiced +unrejoicing +unrejuvenated +unrelapsing +unrelated +unrelatedness +unrelating +unrelational +unrelative +unrelatively +unrelaxable +unrelaxed +unrelaxing +unrelaxingly +unreleasable +unreleased +unreleasing +unrelegated +unrelentance +unrelented +unrelenting +unrelentingly +unrelentingness +unrelentor +unrelevant +unreliability +unreliable +unreliableness +unreliably +unreliance +unrelievable +unrelievableness +unrelieved +unrelievedly +unreligion +unreligioned +unreligious +unreligiously +unreligiousness +unrelinquishable +unrelinquishably +unrelinquished +unrelinquishing +unrelishable +unrelished +unrelishing +unreluctant +unreluctantly +unremaining +unremanded +unremarkable +unremarked +unremarried +unremediable +unremedied +unremember +unrememberable +unremembered +unremembering +unremembrance +unreminded +unremissible +unremittable +unremitted +unremittedly +unremittent +unremittently +unremitting +unremittingly +unremittingness +unremonstrant +unremonstrated +unremonstrating +unremorseful +unremorsefully +unremote +unremotely +unremounted +unremovable +unremovableness +unremovably +unremoved +unremunerated +unremunerating +unremunerative +unremuneratively +unremunerativeness +unrenderable +unrendered +unrenewable +unrenewed +unrenounceable +unrenounced +unrenouncing +unrenovated +unrenowned +unrenownedly +unrenownedness +unrent +unrentable +unrented +unreorganized +unrepaid +unrepair +unrepairable +unrepaired +unrepartable +unreparted +unrepealability +unrepealable +unrepealableness +unrepealably +unrepealed +unrepeatable +unrepeated +unrepellable +unrepelled +unrepellent +unrepent +unrepentable +unrepentance +unrepentant +unrepentantly +unrepentantness +unrepented +unrepenting +unrepentingly +unrepentingness +unrepetitive +unrepined +unrepining +unrepiningly +unrepiqued +unreplaceable +unreplaced +unreplenished +unrepleviable +unreplevined +unrepliable +unrepliably +unreplied +unreplying +unreportable +unreported +unreportedly +unreportedness +unrepose +unreposed +unreposeful +unreposefulness +unreposing +unrepossessed +unreprehended +unrepresentable +unrepresentation +unrepresentative +unrepresented +unrepresentedness +unrepressed +unrepressible +unreprievable +unreprievably +unreprieved +unreprimanded +unreprinted +unreproachable +unreproachableness +unreproachably +unreproached +unreproachful +unreproachfully +unreproaching +unreproachingly +unreprobated +unreproducible +unreprovable +unreprovableness +unreprovably +unreproved +unreprovedly +unreprovedness +unreproving +unrepublican +unrepudiable +unrepudiated +unrepugnant +unrepulsable +unrepulsed +unrepulsing +unrepulsive +unreputable +unreputed +unrequalified +unrequested +unrequickened +unrequired +unrequisite +unrequitable +unrequital +unrequited +unrequitedly +unrequitedness +unrequitement +unrequiter +unrequiting +unrescinded +unrescued +unresemblant +unresembling +unresented +unresentful +unresenting +unreserve +unreserved +unreservedly +unreservedness +unresifted +unresigned +unresistable +unresistably +unresistance +unresistant +unresistantly +unresisted +unresistedly +unresistedness +unresistible +unresistibleness +unresistibly +unresisting +unresistingly +unresistingness +unresolute +unresolvable +unresolve +unresolved +unresolvedly +unresolvedness +unresolving +unresonant +unresounded +unresounding +unresourceful +unresourcefulness +unrespect +unrespectability +unrespectable +unrespected +unrespectful +unrespectfully +unrespectfulness +unrespective +unrespectively +unrespectiveness +unrespirable +unrespired +unrespited +unresplendent +unresponding +unresponsible +unresponsibleness +unresponsive +unresponsively +unresponsiveness +unrest +unrestable +unrested +unrestful +unrestfully +unrestfulness +unresting +unrestingly +unrestingness +unrestorable +unrestored +unrestrainable +unrestrainably +unrestrained +unrestrainedly +unrestrainedness +unrestraint +unrestrictable +unrestricted +unrestrictedly +unrestrictedness +unrestrictive +unresty +unresultive +unresumed +unresumptive +unretainable +unretained +unretaliated +unretaliating +unretardable +unretarded +unretentive +unreticent +unretinued +unretired +unretiring +unretorted +unretouched +unretractable +unretracted +unretreating +unretrenchable +unretrenched +unretrievable +unretrieved +unretrievingly +unretted +unreturnable +unreturnably +unreturned +unreturning +unreturningly +unrevealable +unrevealed +unrevealedness +unrevealing +unrevealingly +unrevelationize +unrevenged +unrevengeful +unrevengefulness +unrevenging +unrevengingly +unrevenue +unrevenued +unreverberated +unrevered +unreverence +unreverenced +unreverend +unreverendly +unreverent +unreverential +unreverently +unreverentness +unreversable +unreversed +unreversible +unreverted +unrevertible +unreverting +unrevested +unrevetted +unreviewable +unreviewed +unreviled +unrevised +unrevivable +unrevived +unrevocable +unrevocableness +unrevocably +unrevoked +unrevolted +unrevolting +unrevolutionary +unrevolutionized +unrevolved +unrevolving +unrewardable +unrewarded +unrewardedly +unrewarding +unreworded +unrhetorical +unrhetorically +unrhetoricalness +unrhyme +unrhymed +unrhythmic +unrhythmical +unrhythmically +unribbed +unribboned +unrich +unriched +unricht +unricked +unrid +unridable +unridableness +unridably +unridden +unriddle +unriddleable +unriddled +unriddler +unriddling +unride +unridely +unridered +unridged +unridiculed +unridiculous +unrife +unriffled +unrifled +unrifted +unrig +unrigged +unrigging +unright +unrightable +unrighted +unrighteous +unrighteously +unrighteousness +unrightful +unrightfully +unrightfulness +unrightly +unrightwise +unrigid +unrigorous +unrimpled +unrind +unring +unringable +unringed +unringing +unrinsed +unrioted +unrioting +unriotous +unrip +unripe +unriped +unripely +unripened +unripeness +unripening +unrippable +unripped +unripping +unrippled +unrippling +unripplingly +unrisen +unrising +unriskable +unrisked +unrisky +unritual +unritualistic +unrivalable +unrivaled +unrivaledly +unrivaledness +unrived +unriven +unrivet +unriveted +unriveting +unroaded +unroadworthy +unroaming +unroast +unroasted +unrobbed +unrobe +unrobed +unrobust +unrocked +unrococo +unrodded +unroiled +unroll +unrollable +unrolled +unroller +unrolling +unrollment +unromantic +unromantical +unromantically +unromanticalness +unromanticized +unroof +unroofed +unroofing +unroomy +unroost +unroosted +unroosting +unroot +unrooted +unrooting +unrope +unroped +unrosed +unrosined +unrostrated +unrotated +unrotating +unroted +unrotted +unrotten +unrotund +unrouged +unrough +unroughened +unround +unrounded +unrounding +unrousable +unroused +unroutable +unrouted +unrove +unroved +unroving +unrow +unrowed +unroweled +unroyal +unroyalist +unroyalized +unroyally +unroyalness +Unrra +unrubbed +unrubbish +unrubified +unrubrical +unrubricated +unruddered +unruddled +unrueful +unruffable +unruffed +unruffle +unruffled +unruffling +unrugged +unruinable +unruinated +unruined +unrulable +unrulableness +unrule +unruled +unruledly +unruledness +unruleful +unrulily +unruliness +unruly +unruminated +unruminating +unruminatingly +unrummaged +unrumored +unrumple +unrumpled +unrun +unrung +unruptured +unrural +unrushed +Unrussian +unrust +unrusted +unrustic +unrusticated +unrustling +unruth +unsabbatical +unsabered +unsabled +unsabred +unsaccharic +unsacerdotal +unsacerdotally +unsack +unsacked +unsacramental +unsacramentally +unsacramentarian +unsacred +unsacredly +unsacrificeable +unsacrificeably +unsacrificed +unsacrificial +unsacrificing +unsacrilegious +unsad +unsadden +unsaddened +unsaddle +unsaddled +unsaddling +unsafe +unsafeguarded +unsafely +unsafeness +unsafety +unsagacious +unsage +unsagging +unsaid +unsailable +unsailed +unsailorlike +unsaint +unsainted +unsaintlike +unsaintly +unsalability +unsalable +unsalableness +unsalably +unsalaried +unsalesmanlike +unsaline +unsalivated +unsallying +unsalmonlike +unsalt +unsaltable +unsaltatory +unsalted +unsalubrious +unsalutary +unsaluted +unsaluting +unsalvability +unsalvable +unsalvableness +unsalvaged +unsalved +unsampled +unsanctification +unsanctified +unsanctifiedly +unsanctifiedness +unsanctify +unsanctifying +unsanctimonious +unsanctimoniously +unsanctimoniousness +unsanction +unsanctionable +unsanctioned +unsanctioning +unsanctitude +unsanctity +unsanctuaried +unsandaled +unsanded +unsane +unsanguinary +unsanguine +unsanguinely +unsanguineness +unsanguineous +unsanguineously +unsanitariness +unsanitary +unsanitated +unsanitation +unsanity +unsaponifiable +unsaponified +unsapped +unsappy +unsarcastic +unsardonic +unsartorial +unsash +unsashed +unsatable +unsatanic +unsated +unsatedly +unsatedness +unsatiability +unsatiable +unsatiableness +unsatiably +unsatiate +unsatiated +unsatiating +unsatin +unsatire +unsatirical +unsatirically +unsatirize +unsatirized +unsatisfaction +unsatisfactorily +unsatisfactoriness +unsatisfactory +unsatisfiable +unsatisfiableness +unsatisfiably +unsatisfied +unsatisfiedly +unsatisfiedness +unsatisfying +unsatisfyingly +unsatisfyingness +unsaturable +unsaturated +unsaturatedly +unsaturatedness +unsaturation +unsatyrlike +unsauced +unsaurian +unsavable +unsaveable +unsaved +unsaving +unsavored +unsavoredly +unsavoredness +unsavorily +unsavoriness +unsavory +unsawed +unsawn +unsay +unsayability +unsayable +unscabbard +unscabbarded +unscabbed +unscaffolded +unscalable +unscalableness +unscalably +unscale +unscaled +unscaledness +unscalloped +unscaly +unscamped +unscandalize +unscandalized +unscandalous +unscannable +unscanned +unscanted +unscanty +unscarb +unscarce +unscared +unscarfed +unscarified +unscarred +unscathed +unscathedly +unscathedness +unscattered +unscavengered +unscenic +unscent +unscented +unscepter +unsceptered +unsceptical +unsceptre +unsceptred +unscheduled +unschematic +unschematized +unscholar +unscholarlike +unscholarly +unscholastic +unschool +unschooled +unschooledly +unschooledness +unscienced +unscientific +unscientifical +unscientifically +unscintillating +unscioned +unscissored +unscoffed +unscoffing +unscolded +unsconced +unscooped +unscorched +unscored +unscorified +unscoring +unscorned +unscornful +unscornfully +unscornfulness +unscotch +unscotched +unscottify +unscoured +unscourged +unscowling +unscramble +unscrambling +unscraped +unscratchable +unscratched +unscratching +unscratchingly +unscrawled +unscreen +unscreenable +unscreenably +unscreened +unscrew +unscrewable +unscrewed +unscrewing +unscribal +unscribbled +unscribed +unscrimped +unscriptural +unscripturally +unscripturalness +unscrubbed +unscrupled +unscrupulosity +unscrupulous +unscrupulously +unscrupulousness +unscrutable +unscrutinized +unscrutinizing +unscrutinizingly +unsculptural +unsculptured +unscummed +unscutcheoned +unseafaring +unseal +unsealable +unsealed +unsealer +unsealing +unseam +unseamanlike +unseamanship +unseamed +unseaming +unsearchable +unsearchableness +unsearchably +unsearched +unsearcherlike +unsearching +unseared +unseason +unseasonable +unseasonableness +unseasonably +unseasoned +unseat +unseated +unseaworthiness +unseaworthy +unseceding +unsecluded +unseclusive +unseconded +unsecrecy +unsecret +unsecretarylike +unsecreted +unsecreting +unsecretly +unsecretness +unsectarian +unsectarianism +unsectarianize +unsectional +unsecular +unsecularize +unsecularized +unsecure +unsecured +unsecuredly +unsecuredness +unsecurely +unsecureness +unsecurity +unsedate +unsedentary +unseditious +unseduce +unseduced +unseducible +unseductive +unsedulous +unsee +unseeable +unseeded +unseeing +unseeingly +unseeking +unseeming +unseemingly +unseemlily +unseemliness +unseemly +unseen +unseethed +unsegmented +unsegregable +unsegregated +unsegregatedness +unseignorial +unseismic +unseizable +unseized +unseldom +unselect +unselected +unselecting +unselective +unself +unselfish +unselfishly +unselfishness +unselflike +unselfness +unselling +unsenatorial +unsenescent +unsensational +unsense +unsensed +unsensibility +unsensible +unsensibleness +unsensibly +unsensitive +unsensitize +unsensitized +unsensory +unsensual +unsensualize +unsensualized +unsensually +unsensuous +unsensuousness +unsent +unsentenced +unsententious +unsentient +unsentimental +unsentimentalist +unsentimentality +unsentimentalize +unsentimentally +unsentineled +unsentinelled +unseparable +unseparableness +unseparably +unseparate +unseparated +unseptate +unseptated +unsepulcher +unsepulchered +unsepulchral +unsepulchre +unsepulchred +unsepultured +unsequenced +unsequential +unsequestered +unseraphical +unserenaded +unserene +unserflike +unserious +unseriousness +unserrated +unserried +unservable +unserved +unserviceability +unserviceable +unserviceableness +unserviceably +unservicelike +unservile +unsesquipedalian +unset +unsetting +unsettle +unsettleable +unsettled +unsettledness +unsettlement +unsettling +unseverable +unseverableness +unsevere +unsevered +unseveredly +unseveredness +unsew +unsewed +unsewered +unsewing +unsewn +unsex +unsexed +unsexing +unsexlike +unsexual +unshackle +unshackled +unshackling +unshade +unshaded +unshadow +unshadowable +unshadowed +unshady +unshafted +unshakable +unshakably +unshakeable +unshakeably +unshaken +unshakenly +unshakenness +unshaking +unshakingness +unshaled +unshamable +unshamableness +unshamably +unshameable +unshameableness +unshameably +unshamed +unshamefaced +unshamefacedness +unshameful +unshamefully +unshamefulness +unshammed +unshanked +unshapable +unshape +unshapeable +unshaped +unshapedness +unshapeliness +unshapely +unshapen +unshapenly +unshapenness +unsharable +unshared +unsharedness +unsharing +unsharp +unsharped +unsharpen +unsharpened +unsharpening +unsharping +unshattered +unshavable +unshaveable +unshaved +unshavedly +unshavedness +unshaven +unshavenly +unshavenness +unshawl +unsheaf +unsheared +unsheathe +unsheathed +unsheathing +unshed +unsheet +unsheeted +unsheeting +unshell +unshelled +unshelling +unshelterable +unsheltered +unsheltering +unshelve +unshepherded +unshepherding +unsheriff +unshewed +unshieldable +unshielded +unshielding +unshiftable +unshifted +unshiftiness +unshifting +unshifty +unshimmering +unshingled +unshining +unship +unshiplike +unshipment +unshipped +unshipping +unshipshape +unshipwrecked +unshirking +unshirted +unshivered +unshivering +unshockable +unshocked +unshod +unshodden +unshoe +unshoed +unshoeing +unshop +unshore +unshored +unshorn +unshort +unshortened +unshot +unshotted +unshoulder +unshouted +unshouting +unshoved +unshoveled +unshowable +unshowed +unshowmanlike +unshown +unshowy +unshredded +unshrew +unshrewd +unshrewish +unshrill +unshrine +unshrined +unshrinement +unshrink +unshrinkability +unshrinkable +unshrinking +unshrinkingly +unshrived +unshriveled +unshrivelled +unshriven +unshroud +unshrouded +unshrubbed +unshrugging +unshrunk +unshrunken +unshuddering +unshuffle +unshuffled +unshunnable +unshunned +unshunted +unshut +unshutter +unshuttered +unshy +unshyly +unshyness +unsibilant +unsiccated +unsick +unsickened +unsicker +unsickerly +unsickerness +unsickled +unsickly +unsided +unsiding +unsiege +unsifted +unsighing +unsight +unsightable +unsighted +unsighting +unsightliness +unsightly +unsigmatic +unsignable +unsignaled +unsignalized +unsignalled +unsignatured +unsigned +unsigneted +unsignificancy +unsignificant +unsignificantly +unsignificative +unsignified +unsignifying +unsilenceable +unsilenceably +unsilenced +unsilent +unsilentious +unsilently +unsilicified +unsilly +unsilvered +unsimilar +unsimilarity +unsimilarly +unsimple +unsimplicity +unsimplified +unsimplify +unsimulated +unsimultaneous +unsin +unsincere +unsincerely +unsincereness +unsincerity +unsinew +unsinewed +unsinewing +unsinewy +unsinful +unsinfully +unsinfulness +unsing +unsingability +unsingable +unsingableness +unsinged +unsingle +unsingled +unsingleness +unsingular +unsinister +unsinkability +unsinkable +unsinking +unsinnable +unsinning +unsinningness +unsiphon +unsipped +unsister +unsistered +unsisterliness +unsisterly +unsizable +unsizableness +unsizeable +unsizeableness +unsized +unskaithd +unskeptical +unsketchable +unsketched +unskewed +unskewered +unskilful +unskilfully +unskilled +unskilledly +unskilledness +unskillful +unskillfully +unskillfulness +unskimmed +unskin +unskinned +unskirted +unslack +unslacked +unslackened +unslackening +unslacking +unslagged +unslain +unslakable +unslakeable +unslaked +unslammed +unslandered +unslanderous +unslapped +unslashed +unslate +unslated +unslating +unslaughtered +unslave +unslayable +unsleaved +unsleek +unsleepably +unsleeping +unsleepingly +unsleepy +unsleeve +unsleeved +unslender +unslept +unsliced +unsliding +unslighted +unsling +unslip +unslipped +unslippery +unslipping +unslit +unslockened +unsloped +unslopped +unslot +unslothful +unslothfully +unslothfulness +unslotted +unsloughed +unsloughing +unslow +unsluggish +unsluice +unsluiced +unslumbering +unslumberous +unslumbrous +unslung +unslurred +unsly +unsmacked +unsmart +unsmartly +unsmartness +unsmeared +unsmelled +unsmelling +unsmelted +unsmiled +unsmiling +unsmilingly +unsmilingness +unsmirched +unsmirking +unsmitten +unsmokable +unsmokeable +unsmoked +unsmokified +unsmoking +unsmoky +unsmooth +unsmoothed +unsmoothly +unsmoothness +unsmote +unsmotherable +unsmothered +unsmudged +unsmuggled +unsmutched +unsmutted +unsmutty +unsnaffled +unsnagged +unsnaggled +unsnaky +unsnap +unsnapped +unsnare +unsnared +unsnarl +unsnatch +unsnatched +unsneck +unsneering +unsnib +unsnipped +unsnobbish +unsnoring +unsnouted +unsnow +unsnubbable +unsnubbed +unsnuffed +unsoaked +unsoaped +unsoarable +unsober +unsoberly +unsoberness +unsobriety +unsociability +unsociable +unsociableness +unsociably +unsocial +unsocialism +unsocialistic +unsociality +unsocializable +unsocialized +unsocially +unsocialness +unsociological +unsocket +unsodden +unsoft +unsoftened +unsoftening +unsoggy +unsoil +unsoiled +unsoiledness +unsolaced +unsolacing +unsolar +unsold +unsolder +unsoldered +unsoldering +unsoldier +unsoldiered +unsoldierlike +unsoldierly +unsole +unsoled +unsolemn +unsolemness +unsolemnize +unsolemnized +unsolemnly +unsolicitated +unsolicited +unsolicitedly +unsolicitous +unsolicitously +unsolicitousness +unsolid +unsolidarity +unsolidifiable +unsolidified +unsolidity +unsolidly +unsolidness +unsolitary +unsolubility +unsoluble +unsolvable +unsolvableness +unsolvably +unsolved +unsomatic +unsomber +unsombre +unsome +unson +unsonable +unsonant +unsonlike +unsonneted +unsonorous +unsonsy +unsoothable +unsoothed +unsoothfast +unsoothing +unsooty +unsophistical +unsophistically +unsophisticate +unsophisticated +unsophisticatedly +unsophisticatedness +unsophistication +unsophomoric +unsordid +unsore +unsorrowed +unsorrowing +unsorry +unsort +unsortable +unsorted +unsorting +unsotted +unsought +unsoul +unsoulful +unsoulfully +unsoulish +unsound +unsoundable +unsoundableness +unsounded +unsounding +unsoundly +unsoundness +unsour +unsoured +unsoused +unsovereign +unsowed +unsown +unspaced +unspacious +unspaded +unspan +unspangled +unspanked +unspanned +unspar +unsparable +unspared +unsparing +unsparingly +unsparingness +unsparkling +unsparred +unsparse +unspatial +unspatiality +unspattered +unspawned +unspayed +unspeak +unspeakability +unspeakable +unspeakableness +unspeakably +unspeaking +unspeared +unspecialized +unspecializing +unspecific +unspecified +unspecifiedly +unspecious +unspecked +unspeckled +unspectacled +unspectacular +unspectacularly +unspecterlike +unspectrelike +unspeculating +unspeculative +unspeculatively +unsped +unspeed +unspeedy +unspeered +unspell +unspellable +unspelled +unspelt +unspendable +unspending +unspent +unspewed +unsphere +unsphered +unsphering +unspiable +unspiced +unspicy +unspied +unspike +unspillable +unspin +unspinsterlike +unspinsterlikeness +unspiral +unspired +unspirit +unspirited +unspiritedly +unspiriting +unspiritual +unspirituality +unspiritualize +unspiritualized +unspiritually +unspiritualness +unspissated +unspit +unspited +unspiteful +unspitted +unsplashed +unsplattered +unsplayed +unspleened +unspleenish +unspleenishly +unsplendid +unspliced +unsplinted +unsplintered +unsplit +unspoil +unspoilable +unspoilableness +unspoilably +unspoiled +unspoken +unspokenly +unsponged +unspongy +unsponsored +unspontaneous +unspontaneously +unspookish +unsported +unsportful +unsporting +unsportive +unsportsmanlike +unsportsmanly +unspot +unspotlighted +unspottable +unspotted +unspottedly +unspottedness +unspoused +unspouselike +unspouted +unsprained +unsprayed +unspread +unsprightliness +unsprightly +unspring +unspringing +unspringlike +unsprinkled +unsprinklered +unsprouted +unsproutful +unsprouting +unspruced +unsprung +unspun +unspurned +unspurred +unspying +unsquandered +unsquarable +unsquare +unsquared +unsquashed +unsqueamish +unsqueezable +unsqueezed +unsquelched +unsquinting +unsquire +unsquired +unsquirelike +unsquirted +unstabbed +unstability +unstable +unstabled +unstableness +unstablished +unstably +unstack +unstacked +unstacker +unstaffed +unstaged +unstaggered +unstaggering +unstagnating +unstagy +unstaid +unstaidly +unstaidness +unstain +unstainable +unstainableness +unstained +unstainedly +unstainedness +unstaled +unstalked +unstalled +unstammering +unstamped +unstampeded +unstanch +unstanchable +unstandard +unstandardized +unstanzaic +unstar +unstarch +unstarched +unstarlike +unstarred +unstarted +unstarting +unstartled +unstarved +unstatable +unstate +unstateable +unstated +unstately +unstatesmanlike +unstatic +unstating +unstation +unstationary +unstationed +unstatistic +unstatistical +unstatued +unstatuesque +unstatutable +unstatutably +unstaunch +unstaunchable +unstaunched +unstavable +unstaveable +unstaved +unstayable +unstayed +unstayedness +unstaying +unsteadfast +unsteadfastly +unsteadfastness +unsteadied +unsteadily +unsteadiness +unsteady +unsteadying +unstealthy +unsteamed +unsteaming +unsteck +unstecked +unsteel +unsteeled +unsteep +unsteeped +unsteepled +unsteered +unstemmable +unstemmed +unstentorian +unstep +unstercorated +unstereotyped +unsterile +unsterilized +unstern +unstethoscoped +unstewardlike +unstewed +unstick +unsticking +unstickingness +unsticky +unstiffen +unstiffened +unstifled +unstigmatized +unstill +unstilled +unstillness +unstilted +unstimulated +unstimulating +unsting +unstinged +unstinging +unstinted +unstintedly +unstinting +unstintingly +unstippled +unstipulated +unstirrable +unstirred +unstirring +unstitch +unstitched +unstitching +unstock +unstocked +unstocking +unstockinged +unstoic +unstoical +unstoically +unstoicize +unstoked +unstoken +unstolen +unstonable +unstone +unstoned +unstoniness +unstony +unstooping +unstop +unstoppable +unstopped +unstopper +unstoppered +unstopple +unstore +unstored +unstoried +unstormed +unstormy +unstout +unstoved +unstow +unstowed +unstraddled +unstrafed +unstraight +unstraightened +unstraightforward +unstraightness +unstrain +unstrained +unstraitened +unstrand +unstranded +unstrange +unstrangered +unstrangled +unstrangulable +unstrap +unstrapped +unstrategic +unstrategically +unstratified +unstraying +unstreaked +unstrength +unstrengthen +unstrengthened +unstrenuous +unstressed +unstressedly +unstressedness +unstretch +unstretched +unstrewed +unstrewn +unstriated +unstricken +unstrictured +unstridulous +unstrike +unstriking +unstring +unstringed +unstringing +unstrip +unstriped +unstripped +unstriving +unstroked +unstrong +unstructural +unstruggling +unstrung +unstubbed +unstubborn +unstuccoed +unstuck +unstudded +unstudied +unstudious +unstuff +unstuffed +unstuffing +unstultified +unstumbling +unstung +unstunned +unstunted +unstupefied +unstupid +unstuttered +unstuttering +unsty +unstyled +unstylish +unstylishly +unstylishness +unsubdivided +unsubduable +unsubduableness +unsubduably +unsubducted +unsubdued +unsubduedly +unsubduedness +unsubject +unsubjectable +unsubjected +unsubjectedness +unsubjection +unsubjective +unsubjectlike +unsubjugate +unsubjugated +unsublimable +unsublimated +unsublimed +unsubmerged +unsubmergible +unsubmerging +unsubmission +unsubmissive +unsubmissively +unsubmissiveness +unsubmitted +unsubmitting +unsubordinate +unsubordinated +unsuborned +unsubpoenaed +unsubscribed +unsubscribing +unsubservient +unsubsided +unsubsidiary +unsubsiding +unsubsidized +unsubstanced +unsubstantial +unsubstantiality +unsubstantialize +unsubstantially +unsubstantialness +unsubstantiate +unsubstantiated +unsubstantiation +unsubstituted +unsubtle +unsubtleness +unsubtlety +unsubtly +unsubtracted +unsubventioned +unsubventionized +unsubversive +unsubvertable +unsubverted +unsubvertive +unsucceedable +unsucceeded +unsucceeding +unsuccess +unsuccessful +unsuccessfully +unsuccessfulness +unsuccessive +unsuccessively +unsuccessiveness +unsuccinct +unsuccorable +unsuccored +unsucculent +unsuccumbing +unsucked +unsuckled +unsued +unsufferable +unsufferableness +unsufferably +unsuffered +unsuffering +unsufficed +unsufficience +unsufficiency +unsufficient +unsufficiently +unsufficing +unsufficingness +unsufflated +unsuffocate +unsuffocated +unsuffocative +unsuffused +unsugared +unsugary +unsuggested +unsuggestedness +unsuggestive +unsuggestiveness +unsuit +unsuitability +unsuitable +unsuitableness +unsuitably +unsuited +unsuiting +unsulky +unsullen +unsulliable +unsullied +unsulliedly +unsulliedness +unsulphonated +unsulphureous +unsulphurized +unsultry +unsummable +unsummarized +unsummed +unsummered +unsummerlike +unsummerly +unsummonable +unsummoned +unsumptuary +unsumptuous +unsun +unsunburned +unsundered +unsung +unsunk +unsunken +unsunned +unsunny +unsuperable +unsuperannuated +unsupercilious +unsuperficial +unsuperfluous +unsuperior +unsuperlative +unsupernatural +unsupernaturalize +unsupernaturalized +unsuperscribed +unsuperseded +unsuperstitious +unsupervised +unsupervisedly +unsupped +unsupplantable +unsupplanted +unsupple +unsuppled +unsupplemented +unsuppliable +unsupplicated +unsupplied +unsupportable +unsupportableness +unsupportably +unsupported +unsupportedly +unsupportedness +unsupporting +unsupposable +unsupposed +unsuppressed +unsuppressible +unsuppressibly +unsuppurated +unsuppurative +unsupreme +unsurcharge +unsurcharged +unsure +unsurfaced +unsurfeited +unsurfeiting +unsurgical +unsurging +unsurmised +unsurmising +unsurmountable +unsurmountableness +unsurmountably +unsurmounted +unsurnamed +unsurpassable +unsurpassableness +unsurpassably +unsurpassed +unsurplice +unsurpliced +unsurprised +unsurprising +unsurrendered +unsurrendering +unsurrounded +unsurveyable +unsurveyed +unsurvived +unsurviving +unsusceptibility +unsusceptible +unsusceptibleness +unsusceptibly +unsusceptive +unsuspectable +unsuspectably +unsuspected +unsuspectedly +unsuspectedness +unsuspectful +unsuspectfulness +unsuspectible +unsuspecting +unsuspectingly +unsuspectingness +unsuspective +unsuspended +unsuspicion +unsuspicious +unsuspiciously +unsuspiciousness +unsustainable +unsustained +unsustaining +unsutured +unswabbed +unswaddle +unswaddled +unswaddling +unswallowable +unswallowed +unswanlike +unswapped +unswarming +unswathable +unswathe +unswathed +unswathing +unswayable +unswayed +unswayedness +unswaying +unswear +unswearing +unsweat +unsweated +unsweating +unsweepable +unsweet +unsweeten +unsweetened +unsweetenedness +unsweetly +unsweetness +unswell +unswelled +unswelling +unsweltered +unswept +unswervable +unswerved +unswerving +unswervingly +unswilled +unswing +unswingled +unswitched +unswivel +unswollen +unswooning +unsworn +unswung +unsyllabic +unsyllabled +unsyllogistical +unsymbolic +unsymbolical +unsymbolically +unsymbolicalness +unsymbolized +unsymmetrical +unsymmetrically +unsymmetricalness +unsymmetrized +unsymmetry +unsympathetic +unsympathetically +unsympathizability +unsympathizable +unsympathized +unsympathizing +unsympathizingly +unsympathy +unsymphonious +unsymptomatic +unsynchronized +unsynchronous +unsyncopated +unsyndicated +unsynonymous +unsyntactical +unsynthetic +unsyringed +unsystematic +unsystematical +unsystematically +unsystematized +unsystematizedly +unsystematizing +unsystemizable +untabernacled +untabled +untabulated +untack +untacked +untacking +untackle +untackled +untactful +untactfully +untactfulness +untagged +untailed +untailorlike +untailorly +untaint +untaintable +untainted +untaintedly +untaintedness +untainting +untakable +untakableness +untakeable +untakeableness +untaken +untaking +untalented +untalkative +untalked +untalking +untall +untallied +untallowed +untamable +untamableness +untame +untamed +untamedly +untamedness +untamely +untameness +untampered +untangential +untangibility +untangible +untangibleness +untangibly +untangle +untangled +untangling +untanned +untantalized +untantalizing +untap +untaped +untapered +untapering +untapestried +untappable +untapped +untar +untarnishable +untarnished +untarred +untarried +untarrying +untartarized +untasked +untasseled +untastable +untaste +untasteable +untasted +untasteful +untastefully +untastefulness +untasting +untasty +untattered +untattooed +untaught +untaughtness +untaunted +untaut +untautological +untawdry +untawed +untax +untaxable +untaxed +untaxing +unteach +unteachable +unteachableness +unteachably +unteacherlike +unteaching +unteam +unteamed +unteaming +untearable +unteased +unteasled +untechnical +untechnicalize +untechnically +untedded +untedious +unteem +unteeming +unteethed +untelegraphed +untell +untellable +untellably +untelling +untemper +untemperamental +untemperate +untemperately +untemperateness +untempered +untempering +untempested +untempestuous +untempled +untemporal +untemporary +untemporizing +untemptability +untemptable +untemptably +untempted +untemptible +untemptibly +untempting +untemptingly +untemptingness +untenability +untenable +untenableness +untenably +untenacious +untenacity +untenant +untenantable +untenantableness +untenanted +untended +untender +untendered +untenderly +untenderness +untenible +untenibleness +untenibly +untense +untent +untentaculate +untented +untentered +untenty +unterminable +unterminableness +unterminably +unterminated +unterminating +unterraced +unterrestrial +unterrible +unterribly +unterrifiable +unterrific +unterrified +unterrifying +unterrorized +untessellated +untestable +untestamentary +untested +untestifying +untether +untethered +untethering +untewed +untextual +unthank +unthanked +unthankful +unthankfully +unthankfulness +unthanking +unthatch +unthatched +unthaw +unthawed +unthawing +untheatric +untheatrical +untheatrically +untheistic +unthematic +untheological +untheologically +untheologize +untheoretic +untheoretical +untheorizable +untherapeutical +unthick +unthicken +unthickened +unthievish +unthink +unthinkability +unthinkable +unthinkableness +unthinkably +unthinker +unthinking +unthinkingly +unthinkingness +unthinned +unthinning +unthirsting +unthirsty +unthistle +untholeable +untholeably +unthorn +unthorny +unthorough +unthought +unthoughted +unthoughtedly +unthoughtful +unthoughtfully +unthoughtfulness +unthoughtlike +unthrall +unthralled +unthrashed +unthread +unthreadable +unthreaded +unthreading +unthreatened +unthreatening +unthreshed +unthrid +unthridden +unthrift +unthriftihood +unthriftily +unthriftiness +unthriftlike +unthrifty +unthrilled +unthrilling +unthriven +unthriving +unthrivingly +unthrivingness +unthrob +unthrone +unthroned +unthronged +unthroning +unthrottled +unthrowable +unthrown +unthrushlike +unthrust +unthumbed +unthumped +unthundered +unthwacked +unthwarted +untiaraed +unticketed +untickled +untidal +untidily +untidiness +untidy +untie +untied +untight +untighten +untightness +until +untile +untiled +untill +untillable +untilled +untilling +untilt +untilted +untilting +untimbered +untimed +untimedness +untimeliness +untimely +untimeous +untimeously +untimesome +untimorous +untin +untinct +untinctured +untine +untinged +untinkered +untinned +untinseled +untinted +untippable +untipped +untippled +untipt +untirability +untirable +untire +untired +untiredly +untiring +untiringly +untissued +untithability +untithable +untithed +untitled +untittering +untitular +unto +untoadying +untoasted +untogaed +untoggle +untoggler +untoiled +untoileted +untoiling +untold +untolerable +untolerableness +untolerably +untolerated +untomb +untombed +untonality +untone +untoned +untongued +untonsured +untooled +untooth +untoothed +untoothsome +untoothsomeness +untop +untopographical +untopped +untopping +untormented +untorn +untorpedoed +untorpid +untorrid +untortuous +untorture +untortured +untossed +untotaled +untotalled +untottering +untouch +untouchability +untouchable +untouchableness +untouchably +untouched +untouchedness +untouching +untough +untoured +untouristed +untoward +untowardliness +untowardly +untowardness +untowered +untown +untownlike +untrace +untraceable +untraceableness +untraceably +untraced +untraceried +untracked +untractability +untractable +untractableness +untractably +untractarian +untractible +untractibleness +untradeable +untraded +untradesmanlike +untrading +untraditional +untraduced +untraffickable +untrafficked +untragic +untragical +untrailed +untrain +untrainable +untrained +untrainedly +untrainedness +untraitored +untraitorous +untrammed +untrammeled +untrammeledness +untramped +untrampled +untrance +untranquil +untranquilized +untranquillize +untranquillized +untransacted +untranscended +untranscendental +untranscribable +untranscribed +untransferable +untransferred +untransfigured +untransfixed +untransformable +untransformed +untransforming +untransfused +untransfusible +untransgressed +untransient +untransitable +untransitive +untransitory +untranslatability +untranslatable +untranslatableness +untranslatably +untranslated +untransmigrated +untransmissible +untransmitted +untransmutable +untransmuted +untransparent +untranspassable +untranspired +untranspiring +untransplanted +untransportable +untransported +untransposed +untransubstantiated +untrappable +untrapped +untrashed +untravelable +untraveled +untraveling +untravellable +untravelling +untraversable +untraversed +untravestied +untreacherous +untread +untreadable +untreading +untreasonable +untreasure +untreasured +untreatable +untreatableness +untreatably +untreated +untreed +untrekked +untrellised +untrembling +untremblingly +untremendous +untremulous +untrenched +untrepanned +untrespassed +untrespassing +untress +untressed +untriable +untribal +untributary +untriced +untrickable +untricked +untried +untrifling +untrig +untrigonometrical +untrill +untrim +untrimmable +untrimmed +untrimmedness +untrinitarian +untripe +untrippable +untripped +untripping +untrite +untriturated +untriumphable +untriumphant +untriumphed +untrochaic +untrod +untrodden +untroddenness +untrolled +untrophied +untropical +untrotted +untroublable +untrouble +untroubled +untroubledly +untroubledness +untroublesome +untroublesomeness +untrounced +untrowed +untruant +untruck +untruckled +untruckling +untrue +untrueness +untruism +untruly +untrumped +untrumpeted +untrumping +untrundled +untrunked +untruss +untrussed +untrusser +untrussing +untrust +untrustably +untrusted +untrustful +untrustiness +untrusting +untrustworthily +untrustworthiness +untrustworthy +untrusty +untruth +untruther +untruthful +untruthfully +untruthfulness +untrying +untubbed +untuck +untucked +untuckered +untucking +untufted +untugged +untumbled +untumefied +untumid +untumultuous +untunable +untunableness +untunably +untune +untuneable +untuneableness +untuneably +untuned +untuneful +untunefully +untunefulness +untuning +untunneled +untupped +unturbaned +unturbid +unturbulent +unturf +unturfed +unturgid +unturn +unturnable +unturned +unturning +unturpentined +unturreted +untusked +untutelar +untutored +untutoredly +untutoredness +untwilled +untwinable +untwine +untwineable +untwined +untwining +untwinkling +untwinned +untwirl +untwirled +untwirling +untwist +untwisted +untwister +untwisting +untwitched +untying +untypical +untypically +untyrannic +untyrannical +untyrantlike +untz +unubiquitous +unugly +unulcerated +unultra +unumpired +ununanimity +ununanimous +ununanimously +ununderstandable +ununderstandably +ununderstanding +ununderstood +unundertaken +unundulatory +Unungun +ununifiable +ununified +ununiform +ununiformed +ununiformity +ununiformly +ununiformness +ununitable +ununitableness +ununitably +ununited +ununiting +ununiversity +ununiversitylike +unupbraiding +unupbraidingly +unupholstered +unupright +unuprightly +unuprightness +unupset +unupsettable +unurban +unurbane +unurged +unurgent +unurging +unurn +unurned +unusable +unusableness +unusably +unuse +unused +unusedness +unuseful +unusefully +unusefulness +unushered +unusual +unusuality +unusually +unusualness +unusurious +unusurped +unusurping +unutilizable +unutterability +unutterable +unutterableness +unutterably +unuttered +unuxorial +unuxorious +unvacant +unvaccinated +unvacillating +unvailable +unvain +unvaleted +unvaletudinary +unvaliant +unvalid +unvalidated +unvalidating +unvalidity +unvalidly +unvalidness +unvalorous +unvaluable +unvaluableness +unvaluably +unvalue +unvalued +unvamped +unvanishing +unvanquishable +unvanquished +unvantaged +unvaporized +unvariable +unvariableness +unvariably +unvariant +unvaried +unvariedly +unvariegated +unvarnished +unvarnishedly +unvarnishedness +unvarying +unvaryingly +unvaryingness +unvascular +unvassal +unvatted +unvaulted +unvaulting +unvaunted +unvaunting +unvauntingly +unveering +unveil +unveiled +unveiledly +unveiledness +unveiler +unveiling +unveilment +unveined +unvelvety +unvendable +unvendableness +unvended +unvendible +unvendibleness +unveneered +unvenerable +unvenerated +unvenereal +unvenged +unveniable +unvenial +unvenom +unvenomed +unvenomous +unventable +unvented +unventilated +unventured +unventurous +unvenued +unveracious +unveracity +unverbalized +unverdant +unverdured +unveridical +unverifiable +unverifiableness +unverifiably +unverified +unverifiedness +unveritable +unverity +unvermiculated +unverminous +unvernicular +unversatile +unversed +unversedly +unversedness +unversified +unvertical +unvessel +unvesseled +unvest +unvested +unvetoed +unvexed +unviable +unvibrated +unvibrating +unvicar +unvicarious +unvicariously +unvicious +unvictimized +unvictorious +unvictualed +unvictualled +unviewable +unviewed +unvigilant +unvigorous +unvigorously +unvilified +unvillaged +unvindicated +unvindictive +unvindictively +unvindictiveness +unvinous +unvintaged +unviolable +unviolated +unviolenced +unviolent +unviolined +unvirgin +unvirginal +unvirginlike +unvirile +unvirility +unvirtue +unvirtuous +unvirtuously +unvirtuousness +unvirulent +unvisible +unvisibleness +unvisibly +unvision +unvisionary +unvisioned +unvisitable +unvisited +unvisor +unvisored +unvisualized +unvital +unvitalized +unvitalness +unvitiated +unvitiatedly +unvitiatedness +unvitrescibility +unvitrescible +unvitrifiable +unvitrified +unvitriolized +unvituperated +unvivacious +unvivid +unvivified +unvizard +unvizarded +unvocal +unvocalized +unvociferous +unvoice +unvoiced +unvoiceful +unvoicing +unvoidable +unvoided +unvolatile +unvolatilize +unvolatilized +unvolcanic +unvolitioned +unvoluminous +unvoluntarily +unvoluntariness +unvoluntary +unvolunteering +unvoluptuous +unvomited +unvoracious +unvote +unvoted +unvoting +unvouched +unvouchedly +unvouchedness +unvouchsafed +unvowed +unvoweled +unvoyageable +unvoyaging +unvulcanized +unvulgar +unvulgarize +unvulgarized +unvulgarly +unvulnerable +unwadable +unwadded +unwadeable +unwaded +unwading +unwafted +unwaged +unwagered +unwaggable +unwaggably +unwagged +unwailed +unwailing +unwainscoted +unwaited +unwaiting +unwaked +unwakeful +unwakefulness +unwakened +unwakening +unwaking +unwalkable +unwalked +unwalking +unwall +unwalled +unwallet +unwallowed +unwan +unwandered +unwandering +unwaning +unwanted +unwanton +unwarbled +unware +unwarely +unwareness +unwarily +unwariness +unwarlike +unwarlikeness +unwarm +unwarmable +unwarmed +unwarming +unwarn +unwarned +unwarnedly +unwarnedness +unwarnished +unwarp +unwarpable +unwarped +unwarping +unwarrant +unwarrantability +unwarrantable +unwarrantableness +unwarrantably +unwarranted +unwarrantedly +unwarrantedness +unwary +unwashable +unwashed +unwashedness +unwassailing +unwastable +unwasted +unwasteful +unwastefully +unwasting +unwastingly +unwatchable +unwatched +unwatchful +unwatchfully +unwatchfulness +unwatching +unwater +unwatered +unwaterlike +unwatermarked +unwatery +unwattled +unwaved +unwaverable +unwavered +unwavering +unwaveringly +unwaving +unwax +unwaxed +unwayed +unwayward +unweaken +unweakened +unweal +unwealsomeness +unwealthy +unweaned +unweapon +unweaponed +unwearable +unweariability +unweariable +unweariableness +unweariably +unwearied +unweariedly +unweariedness +unwearily +unweariness +unwearing +unwearisome +unwearisomeness +unweary +unwearying +unwearyingly +unweathered +unweatherly +unweatherwise +unweave +unweaving +unweb +unwebbed +unwebbing +unwed +unwedded +unweddedly +unweddedness +unwedge +unwedgeable +unwedged +unweeded +unweel +unweelness +unweened +unweeping +unweeting +unweetingly +unweft +unweighable +unweighed +unweighing +unweight +unweighted +unweighty +unwelcome +unwelcomed +unwelcomely +unwelcomeness +unweld +unweldable +unwelded +unwell +unwellness +unwelted +unwept +unwestern +unwesternized +unwet +unwettable +unwetted +unwheedled +unwheel +unwheeled +unwhelmed +unwhelped +unwhetted +unwhig +unwhiglike +unwhimsical +unwhining +unwhip +unwhipped +unwhirled +unwhisked +unwhiskered +unwhisperable +unwhispered +unwhispering +unwhistled +unwhite +unwhited +unwhitened +unwhitewashed +unwholesome +unwholesomely +unwholesomeness +unwidened +unwidowed +unwield +unwieldable +unwieldily +unwieldiness +unwieldly +unwieldy +unwifed +unwifelike +unwifely +unwig +unwigged +unwild +unwilily +unwiliness +unwill +unwilled +unwillful +unwillfully +unwillfulness +unwilling +unwillingly +unwillingness +unwilted +unwilting +unwily +unwincing +unwincingly +unwind +unwindable +unwinding +unwindingly +unwindowed +unwindy +unwingable +unwinged +unwinking +unwinkingly +unwinnable +unwinning +unwinnowed +unwinsome +unwinter +unwintry +unwiped +unwire +unwired +unwisdom +unwise +unwisely +unwiseness +unwish +unwished +unwishful +unwishing +unwist +unwistful +unwitch +unwitched +unwithdrawable +unwithdrawing +unwithdrawn +unwitherable +unwithered +unwithering +unwithheld +unwithholden +unwithholding +unwithstanding +unwithstood +unwitless +unwitnessed +unwitted +unwittily +unwitting +unwittingly +unwittingness +unwitty +unwive +unwived +unwoeful +unwoful +unwoman +unwomanish +unwomanize +unwomanized +unwomanlike +unwomanliness +unwomanly +unwomb +unwon +unwonder +unwonderful +unwondering +unwonted +unwontedly +unwontedness +unwooded +unwooed +unwoof +unwooly +unwordable +unwordably +unwordily +unwordy +unwork +unworkability +unworkable +unworkableness +unworkably +unworked +unworkedness +unworker +unworking +unworkmanlike +unworkmanly +unworld +unworldliness +unworldly +unwormed +unwormy +unworn +unworried +unworriedly +unworriedness +unworshiped +unworshipful +unworshiping +unworshipped +unworshipping +unworth +unworthily +unworthiness +unworthy +unwotting +unwound +unwoundable +unwoundableness +unwounded +unwoven +unwrangling +unwrap +unwrapped +unwrapper +unwrapping +unwrathful +unwrathfully +unwreaked +unwreathe +unwreathed +unwreathing +unwrecked +unwrench +unwrenched +unwrested +unwrestedly +unwresting +unwrestled +unwretched +unwriggled +unwrinkle +unwrinkleable +unwrinkled +unwrit +unwritable +unwrite +unwriting +unwritten +unwronged +unwrongful +unwrought +unwrung +unyachtsmanlike +unyeaned +unyearned +unyearning +unyielded +unyielding +unyieldingly +unyieldingness +unyoke +unyoked +unyoking +unyoung +unyouthful +unyouthfully +unze +unzealous +unzealously +unzealousness +unzen +unzephyrlike +unzone +unzoned +up +upaisle +upaithric +upalley +upalong +upanishadic +upapurana +uparch +uparching +uparise +uparm +uparna +upas +upattic +upavenue +upbank +upbar +upbay +upbear +upbearer +upbeat +upbelch +upbelt +upbend +upbid +upbind +upblacken +upblast +upblaze +upblow +upboil +upbolster +upbolt +upboost +upborne +upbotch +upboulevard +upbound +upbrace +upbraid +upbraider +upbraiding +upbraidingly +upbray +upbreak +upbred +upbreed +upbreeze +upbrighten +upbrim +upbring +upbristle +upbroken +upbrook +upbrought +upbrow +upbubble +upbuild +upbuilder +upbulging +upbuoy +upbuoyance +upburn +upburst +upbuy +upcall +upcanal +upcanyon +upcarry +upcast +upcatch +upcaught +upchamber +upchannel +upchariot +upchimney +upchoke +upchuck +upcity +upclimb +upclose +upcloser +upcoast +upcock +upcoil +upcolumn +upcome +upcoming +upconjure +upcountry +upcourse +upcover +upcrane +upcrawl +upcreek +upcreep +upcrop +upcrowd +upcry +upcurl +upcurrent +upcurve +upcushion +upcut +updart +update +updeck +updelve +updive +updo +updome +updraft +updrag +updraw +updrink +updry +upeat +upend +upeygan +upfeed +upfield +upfill +upfingered +upflame +upflare +upflash +upflee +upflicker +upfling +upfloat +upflood +upflow +upflower +upflung +upfly +upfold +upfollow +upframe +upfurl +upgale +upgang +upgape +upgather +upgaze +upget +upgird +upgirt +upgive +upglean +upglide +upgo +upgorge +upgrade +upgrave +upgrow +upgrowth +upgully +upgush +uphand +uphang +upharbor +upharrow +uphasp +upheal +upheap +uphearted +upheaval +upheavalist +upheave +upheaven +upheld +uphelm +uphelya +upher +uphill +uphillward +uphoard +uphoist +uphold +upholden +upholder +upholster +upholstered +upholsterer +upholsteress +upholsterous +upholstery +upholsterydom +upholstress +uphung +uphurl +upisland +upjerk +upjet +upkeep +upkindle +upknell +upknit +upla +upladder +uplaid +uplake +upland +uplander +uplandish +uplane +uplay +uplead +upleap +upleg +uplick +uplift +upliftable +uplifted +upliftedly +upliftedness +uplifter +uplifting +upliftingly +upliftingness +upliftitis +upliftment +uplight +uplimb +uplimber +upline +uplock +uplong +uplook +uplooker +uploom +uploop +uplying +upmaking +upmast +upmix +upmost +upmount +upmountain +upmove +upness +upo +upon +uppard +uppent +upper +upperch +uppercut +upperer +upperest +upperhandism +uppermore +uppermost +uppers +uppertendom +uppile +upping +uppish +uppishly +uppishness +uppity +upplough +upplow +uppluck +uppoint +uppoise +uppop +uppour +uppowoc +upprick +upprop +uppuff +uppull +uppush +upquiver +upraisal +upraise +upraiser +upreach +uprear +uprein +uprend +uprender +uprest +uprestore +uprid +upridge +upright +uprighteous +uprighteously +uprighteousness +uprighting +uprightish +uprightly +uprightness +uprights +uprip +uprisal +uprise +uprisement +uprisen +upriser +uprising +uprist +uprive +upriver +uproad +uproar +uproariness +uproarious +uproariously +uproariousness +uproom +uproot +uprootal +uprooter +uprose +uprouse +uproute +uprun +uprush +upsaddle +upscale +upscrew +upscuddle +upseal +upseek +upseize +upsend +upset +upsetment +upsettable +upsettal +upsetted +upsetter +upsetting +upsettingly +upsey +upshaft +upshear +upsheath +upshoot +upshore +upshot +upshoulder +upshove +upshut +upside +upsides +upsighted +upsiloid +upsilon +upsilonism +upsit +upsitten +upsitting +upslant +upslip +upslope +upsmite +upsnatch +upsoak +upsoar +upsolve +upspeak +upspear +upspeed +upspew +upspin +upspire +upsplash +upspout +upspread +upspring +upsprinkle +upsprout +upspurt +upstaff +upstage +upstair +upstairs +upstamp +upstand +upstander +upstanding +upstare +upstart +upstartism +upstartle +upstartness +upstate +upstater +upstaunch +upstay +upsteal +upsteam +upstem +upstep +upstick +upstir +upstraight +upstream +upstreamward +upstreet +upstretch +upstrike +upstrive +upstroke +upstruggle +upsuck +upsun +upsup +upsurge +upsurgence +upswallow +upswarm +upsway +upsweep +upswell +upswing +uptable +uptake +uptaker +uptear +uptemper +uptend +upthrow +upthrust +upthunder +uptide +uptie +uptill +uptilt +uptorn +uptoss +uptower +uptown +uptowner +uptrace +uptrack +uptrail +uptrain +uptree +uptrend +uptrill +uptrunk +uptruss +uptube +uptuck +upturn +uptwined +uptwist +Upupa +Upupidae +upupoid +upvalley +upvomit +upwaft +upwall +upward +upwardly +upwardness +upwards +upwarp +upwax +upway +upways +upwell +upwent +upwheel +upwhelm +upwhir +upwhirl +upwind +upwith +upwork +upwound +upwrap +upwreathe +upwrench +upwring +upwrought +upyard +upyoke +ur +ura +urachal +urachovesical +urachus +uracil +uraemic +uraeus +Uragoga +Ural +ural +urali +Uralian +Uralic +uraline +uralite +uralitic +uralitization +uralitize +uralium +uramido +uramil +uramilic +uramino +Uran +uran +uranalysis +uranate +Urania +Uranian +uranic +Uranicentric +uranidine +uraniferous +uraniid +Uraniidae +uranin +uranine +uraninite +uranion +uraniscochasma +uraniscoplasty +uraniscoraphy +uraniscorrhaphy +uranism +uranist +uranite +uranitic +uranium +uranocircite +uranographer +uranographic +uranographical +uranographist +uranography +uranolatry +uranolite +uranological +uranology +uranometria +uranometrical +uranometry +uranophane +uranophotography +uranoplastic +uranoplasty +uranoplegia +uranorrhaphia +uranorrhaphy +uranoschisis +uranoschism +uranoscope +uranoscopia +uranoscopic +Uranoscopidae +Uranoscopus +uranoscopy +uranospathite +uranosphaerite +uranospinite +uranostaphyloplasty +uranostaphylorrhaphy +uranotantalite +uranothallite +uranothorite +uranotil +uranous +Uranus +uranyl +uranylic +urao +urare +urari +Urartaean +Urartic +urase +urataemia +urate +uratemia +uratic +uratoma +uratosis +uraturia +urazine +urazole +urbacity +urbainite +Urban +urban +urbane +urbanely +urbaneness +urbanism +Urbanist +urbanist +urbanite +urbanity +urbanization +urbanize +urbarial +urbian +urbic +Urbicolae +urbicolous +urbification +urbify +urbinate +urceiform +urceolar +urceolate +urceole +urceoli +Urceolina +urceolus +urceus +urchin +urchiness +urchinlike +urchinly +urd +urde +urdee +Urdu +ure +urea +ureal +ureameter +ureametry +urease +urechitin +urechitoxin +uredema +Uredinales +uredine +Uredineae +uredineal +uredineous +uredinia +uredinial +Urediniopsis +urediniospore +urediniosporic +uredinium +uredinoid +uredinologist +uredinology +uredinous +Uredo +uredo +uredosorus +uredospore +uredosporic +uredosporiferous +uredosporous +uredostage +ureic +ureid +ureide +ureido +uremia +uremic +Urena +urent +ureometer +ureometry +ureosecretory +uresis +uretal +ureter +ureteral +ureteralgia +uretercystoscope +ureterectasia +ureterectasis +ureterectomy +ureteric +ureteritis +ureterocele +ureterocervical +ureterocolostomy +ureterocystanastomosis +ureterocystoscope +ureterocystostomy +ureterodialysis +ureteroenteric +ureteroenterostomy +ureterogenital +ureterogram +ureterograph +ureterography +ureterointestinal +ureterolith +ureterolithiasis +ureterolithic +ureterolithotomy +ureterolysis +ureteronephrectomy +ureterophlegma +ureteroplasty +ureteroproctostomy +ureteropyelitis +ureteropyelogram +ureteropyelography +ureteropyelonephritis +ureteropyelostomy +ureteropyosis +ureteroradiography +ureterorectostomy +ureterorrhagia +ureterorrhaphy +ureterosalpingostomy +ureterosigmoidostomy +ureterostegnosis +ureterostenoma +ureterostenosis +ureterostoma +ureterostomy +ureterotomy +ureterouteral +ureterovaginal +ureterovesical +urethan +urethane +urethra +urethrae +urethragraph +urethral +urethralgia +urethrameter +urethrascope +urethratome +urethratresia +urethrectomy +urethremphraxis +urethreurynter +urethrism +urethritic +urethritis +urethroblennorrhea +urethrobulbar +urethrocele +urethrocystitis +urethrogenital +urethrogram +urethrograph +urethrometer +urethropenile +urethroperineal +urethrophyma +urethroplastic +urethroplasty +urethroprostatic +urethrorectal +urethrorrhagia +urethrorrhaphy +urethrorrhea +urethrorrhoea +urethroscope +urethroscopic +urethroscopical +urethroscopy +urethrosexual +urethrospasm +urethrostaxis +urethrostenosis +urethrostomy +urethrotome +urethrotomic +urethrotomy +urethrovaginal +urethrovesical +urethylan +uretic +ureylene +urf +urfirnis +urge +urgence +urgency +urgent +urgently +urgentness +urger +Urginea +urging +urgingly +Urgonian +urheen +Uria +Uriah +urial +Urian +uric +uricacidemia +uricaciduria +uricaemia +uricaemic +uricemia +uricemic +uricolysis +uricolytic +uridrosis +Uriel +urinaemia +urinal +urinalist +urinalysis +urinant +urinarium +urinary +urinate +urination +urinative +urinator +urine +urinemia +uriniferous +uriniparous +urinocryoscopy +urinogenital +urinogenitary +urinogenous +urinologist +urinology +urinomancy +urinometer +urinometric +urinometry +urinoscopic +urinoscopist +urinoscopy +urinose +urinosexual +urinous +urinousness +urite +urlar +urled +urling +urluch +urman +urn +urna +urnae +urnal +urnflower +urnful +urning +urningism +urnism +urnlike +urnmaker +Uro +uroacidimeter +uroazotometer +urobenzoic +urobilin +urobilinemia +urobilinogen +urobilinogenuria +urobilinuria +urocanic +urocele +Urocerata +urocerid +Uroceridae +urochloralic +urochord +Urochorda +urochordal +urochordate +urochrome +urochromogen +Urocoptidae +Urocoptis +urocyanogen +Urocyon +urocyst +urocystic +Urocystis +urocystitis +urodaeum +Urodela +urodelan +urodele +urodelous +urodialysis +urodynia +uroedema +uroerythrin +urofuscohematin +urogaster +urogastric +urogenic +urogenital +urogenitary +urogenous +uroglaucin +Uroglena +urogram +urography +urogravimeter +urohematin +urohyal +urolagnia +uroleucic +uroleucinic +urolith +urolithiasis +urolithic +urolithology +urologic +urological +urologist +urology +urolutein +urolytic +uromancy +uromantia +uromantist +Uromastix +uromelanin +uromelus +uromere +uromeric +urometer +Uromyces +Uromycladium +uronephrosis +uronic +uronology +uropatagium +Uropeltidae +urophanic +urophanous +urophein +Urophlyctis +urophthisis +uroplania +uropod +uropodal +uropodous +uropoetic +uropoiesis +uropoietic +uroporphyrin +uropsile +Uropsilus +uroptysis +Uropygi +uropygial +uropygium +uropyloric +urorosein +urorrhagia +urorrhea +urorubin +urosaccharometry +urosacral +uroschesis +uroscopic +uroscopist +uroscopy +urosepsis +uroseptic +urosis +urosomatic +urosome +urosomite +urosomitic +urostea +urostealith +urostegal +urostege +urostegite +urosteon +urosternite +urosthene +urosthenic +urostylar +urostyle +urotoxia +urotoxic +urotoxicity +urotoxin +urotoxy +uroxanate +uroxanic +uroxanthin +uroxin +urradhus +urrhodin +urrhodinic +Ursa +ursal +ursicidal +ursicide +Ursid +Ursidae +ursiform +ursigram +ursine +ursoid +ursolic +urson +ursone +ursuk +Ursula +Ursuline +Ursus +Urtica +urtica +Urticaceae +urticaceous +Urticales +urticant +urticaria +urticarial +urticarious +Urticastrum +urticate +urticating +urtication +urticose +urtite +Uru +urubu +urucu +urucuri +Uruguayan +uruisg +Urukuena +urunday +urus +urushi +urushic +urushinic +urushiol +urushiye +urva +us +usability +usable +usableness +usage +usager +usance +usar +usara +usaron +usation +use +used +usedly +usedness +usednt +usee +useful +usefullish +usefully +usefulness +usehold +useless +uselessly +uselessness +usent +user +ush +ushabti +ushabtiu +Ushak +Usheen +usher +usherance +usherdom +usherer +usheress +usherette +Usherian +usherian +usherism +usherless +ushership +usings +Usipetes +usitate +usitative +Uskara +Uskok +Usnea +usnea +Usneaceae +usneaceous +usneoid +usnic +usninic +Uspanteca +usque +usquebaugh +usself +ussels +usselven +ussingite +ust +Ustarana +uster +Ustilaginaceae +ustilaginaceous +Ustilaginales +ustilagineous +Ustilaginoidea +Ustilago +ustion +ustorious +ustulate +ustulation +Ustulina +usual +usualism +usually +usualness +usuary +usucapient +usucapion +usucapionary +usucapt +usucaptable +usucaption +usucaptor +usufruct +usufructuary +Usun +usure +usurer +usurerlike +usuress +usurious +usuriously +usuriousness +usurp +usurpation +usurpative +usurpatively +usurpatory +usurpature +usurpedly +usurper +usurpership +usurping +usurpingly +usurpment +usurpor +usurpress +usury +usward +uswards +ut +Uta +uta +Utah +Utahan +utahite +utai +utas +utch +utchy +Ute +utees +utensil +uteralgia +uterectomy +uteri +uterine +uteritis +uteroabdominal +uterocele +uterocervical +uterocystotomy +uterofixation +uterogestation +uterogram +uterography +uterointestinal +uterolith +uterology +uteromania +uterometer +uteroovarian +uteroparietal +uteropelvic +uteroperitoneal +uteropexia +uteropexy +uteroplacental +uteroplasty +uterosacral +uterosclerosis +uteroscope +uterotomy +uterotonic +uterotubal +uterovaginal +uteroventral +uterovesical +uterus +utfangenethef +utfangethef +utfangthef +utfangthief +utick +utile +utilitarian +utilitarianism +utilitarianist +utilitarianize +utilitarianly +utility +utilizable +utilization +utilize +utilizer +utinam +utmost +utmostness +Utopia +utopia +Utopian +utopian +utopianism +utopianist +Utopianize +Utopianizer +utopianizer +utopiast +utopism +utopist +utopistic +utopographer +Utraquism +utraquist +utraquistic +Utrecht +utricle +utricul +utricular +Utricularia +Utriculariaceae +utriculate +utriculiferous +utriculiform +utriculitis +utriculoid +utriculoplastic +utriculoplasty +utriculosaccular +utriculose +utriculus +utriform +utrubi +utrum +utsuk +utter +utterability +utterable +utterableness +utterance +utterancy +utterer +utterless +utterly +uttermost +utterness +utu +utum +uturuncu +uva +uval +uvalha +uvanite +uvarovite +uvate +uvea +uveal +uveitic +uveitis +Uvella +uveous +uvic +uvid +uviol +uvitic +uvitinic +uvito +uvitonic +uvrou +uvula +uvulae +uvular +Uvularia +uvularly +uvulitis +uvuloptosis +uvulotome +uvulotomy +uvver +uxorial +uxoriality +uxorially +uxoricidal +uxoricide +uxorious +uxoriously +uxoriousness +uzan +uzara +uzarin +uzaron +Uzbak +Uzbeg +Uzbek +V +v +vaagmer +vaalite +Vaalpens +vacabond +vacancy +vacant +vacanthearted +vacantheartedness +vacantly +vacantness +vacantry +vacatable +vacate +vacation +vacational +vacationer +vacationist +vacationless +vacatur +Vaccaria +vaccary +vaccenic +vaccicide +vaccigenous +vaccina +vaccinable +vaccinal +vaccinate +vaccination +vaccinationist +vaccinator +vaccinatory +vaccine +vaccinee +vaccinella +vaccinia +Vacciniaceae +vacciniaceous +vaccinial +vaccinifer +vacciniform +vacciniola +vaccinist +Vaccinium +vaccinium +vaccinization +vaccinogenic +vaccinogenous +vaccinoid +vaccinophobia +vaccinotherapy +vache +Vachellia +vachette +vacillancy +vacillant +vacillate +vacillating +vacillatingly +vacillation +vacillator +vacillatory +vacoa +vacona +vacoua +vacouf +vacual +vacuate +vacuation +vacuefy +vacuist +vacuity +vacuolar +vacuolary +vacuolate +vacuolated +vacuolation +vacuole +vacuolization +vacuome +vacuometer +vacuous +vacuously +vacuousness +vacuum +vacuuma +vacuumize +vade +vadimonium +vadimony +vadium +vadose +vady +vag +vagabond +vagabondage +vagabondager +vagabondia +vagabondish +vagabondism +vagabondismus +vagabondize +vagabondizer +vagabondry +vagal +vagarian +vagarious +vagariously +vagarish +vagarisome +vagarist +vagaristic +vagarity +vagary +vagas +vage +vagiform +vagile +vagina +vaginal +vaginalectomy +vaginaless +vaginalitis +vaginant +vaginate +vaginated +vaginectomy +vaginervose +Vaginicola +vaginicoline +vaginicolous +vaginiferous +vaginipennate +vaginismus +vaginitis +vaginoabdominal +vaginocele +vaginodynia +vaginofixation +vaginolabial +vaginometer +vaginomycosis +vaginoperineal +vaginoperitoneal +vaginopexy +vaginoplasty +vaginoscope +vaginoscopy +vaginotome +vaginotomy +vaginovesical +vaginovulvar +vaginula +vaginulate +vaginule +vagitus +Vagnera +vagoaccessorius +vagodepressor +vagoglossopharyngeal +vagogram +vagolysis +vagosympathetic +vagotomize +vagotomy +vagotonia +vagotonic +vagotropic +vagotropism +vagrance +vagrancy +vagrant +vagrantism +vagrantize +vagrantlike +vagrantly +vagrantness +vagrate +vagrom +vague +vaguely +vagueness +vaguish +vaguity +vagulous +vagus +vahine +Vai +Vaidic +vail +vailable +vain +vainful +vainglorious +vaingloriously +vaingloriousness +vainglory +vainly +vainness +vair +vairagi +vaire +vairy +Vaishnava +Vaishnavism +vaivode +vajra +vajrasana +vakass +vakia +vakil +vakkaliga +valance +valanced +valanche +valbellite +vale +valediction +valedictorian +valedictorily +valedictory +valence +Valencia +Valencian +valencianite +Valenciennes +valency +valent +Valentide +Valentine +valentine +Valentinian +Valentinianism +valentinite +valeral +valeraldehyde +valeramide +valerate +Valeria +valerian +Valeriana +Valerianaceae +valerianaceous +Valerianales +valerianate +Valerianella +Valerianoides +valeric +valerin +valerolactone +valerone +valeryl +valerylene +valet +valeta +valetage +valetdom +valethood +valetism +valetry +valetudinarian +valetudinarianism +valetudinariness +valetudinarist +valetudinarium +valetudinary +valeur +valeward +valgoid +valgus +valhall +Valhalla +Vali +vali +valiance +valiancy +valiant +valiantly +valiantness +valid +validate +validation +validatory +validification +validity +validly +validness +valine +valise +valiseful +valiship +Valkyr +Valkyria +Valkyrian +Valkyrie +vall +vallancy +vallar +vallary +vallate +vallated +vallation +vallecula +vallecular +valleculate +vallevarite +valley +valleyful +valleyite +valleylet +valleylike +valleyward +valleywise +vallicula +vallicular +vallidom +vallis +Valliscaulian +Vallisneria +Vallisneriaceae +vallisneriaceous +Vallombrosan +Vallota +vallum +Valmy +Valois +valonia +Valoniaceae +valoniaceous +valor +valorization +valorize +valorous +valorously +valorousness +Valsa +Valsaceae +Valsalvan +valse +valsoid +valuable +valuableness +valuably +valuate +valuation +valuational +valuator +value +valued +valueless +valuelessness +valuer +valuta +valva +valval +Valvata +valvate +Valvatidae +valve +valved +valveless +valvelet +valvelike +valveman +valviferous +valviform +valvotomy +valvula +valvular +valvulate +valvule +valvulitis +valvulotome +valvulotomy +valyl +valylene +vambrace +vambraced +vamfont +vammazsa +vamoose +vamp +vamped +vamper +vamphorn +vampire +vampireproof +vampiric +vampirish +vampirism +vampirize +vamplate +vampproof +Vampyrella +Vampyrellidae +Vampyrum +Van +van +vanadate +vanadiate +vanadic +vanadiferous +vanadinite +vanadium +vanadosilicate +vanadous +vanadyl +Vanaheim +vanaprastha +vancourier +Vancouveria +Vanda +Vandal +Vandalic +vandalish +vandalism +vandalistic +vandalization +vandalize +vandalroot +Vandemonian +Vandemonianism +Vandiemenian +Vandyke +vane +vaned +vaneless +vanelike +Vanellus +Vanessa +vanessian +vanfoss +vang +vangee +vangeli +vanglo +vanguard +Vanguardist +Vangueria +vanilla +vanillal +vanillaldehyde +vanillate +vanille +vanillery +vanillic +vanillin +vanillinic +vanillism +vanilloes +vanillon +vanilloyl +vanillyl +Vanir +vanish +vanisher +vanishing +vanishingly +vanishment +Vanist +vanitarianism +vanitied +vanity +vanjarrah +vanman +vanmost +Vannai +vanner +vannerman +vannet +Vannic +vanquish +vanquishable +vanquisher +vanquishment +vansire +vantage +vantageless +vantbrace +vantbrass +vanward +vapid +vapidism +vapidity +vapidly +vapidness +vapocauterization +vapographic +vapography +vapor +vaporability +vaporable +vaporarium +vaporary +vaporate +vapored +vaporer +vaporescence +vaporescent +vaporiferous +vaporiferousness +vaporific +vaporiform +vaporimeter +vaporing +vaporingly +vaporish +vaporishness +vaporium +vaporizable +vaporization +vaporize +vaporizer +vaporless +vaporlike +vaporograph +vaporographic +vaporose +vaporoseness +vaporosity +vaporous +vaporously +vaporousness +vaportight +vapory +vapulary +vapulate +vapulation +vapulatory +vara +varahan +varan +Varanger +Varangi +Varangian +varanid +Varanidae +Varanoid +Varanus +vardapet +vardy +vare +varec +vareheaded +vareuse +vargueno +vari +variability +variable +variableness +variably +Variag +variance +variancy +variant +variate +variation +variational +variationist +variatious +variative +variatively +variator +varical +varicated +varication +varicella +varicellar +varicellate +varicellation +varicelliform +varicelloid +varicellous +varices +variciform +varicoblepharon +varicocele +varicoid +varicolored +varicolorous +varicose +varicosed +varicoseness +varicosis +varicosity +varicotomy +varicula +varied +variedly +variegate +variegated +variegation +variegator +varier +varietal +varietally +varietism +varietist +variety +variform +variformed +variformity +variformly +varigradation +variocoupler +variola +variolar +Variolaria +variolate +variolation +variole +variolic +varioliform +variolite +variolitic +variolitization +variolization +varioloid +variolous +variolovaccine +variolovaccinia +variometer +variorum +variotinted +various +variously +variousness +variscite +varisse +varix +varlet +varletaille +varletess +varletry +varletto +varment +varna +varnashrama +varnish +varnished +varnisher +varnishing +varnishlike +varnishment +varnishy +varnpliktige +varnsingite +Varolian +Varronia +Varronian +varsha +varsity +Varsovian +varsoviana +Varuna +varus +varve +varved +vary +varyingly +vas +Vasa +vasa +vasal +Vascons +vascular +vascularity +vascularization +vascularize +vascularly +vasculated +vasculature +vasculiferous +vasculiform +vasculitis +vasculogenesis +vasculolymphatic +vasculomotor +vasculose +vasculum +vase +vasectomize +vasectomy +vaseful +vaselet +vaselike +Vaseline +vasemaker +vasemaking +vasewise +vasework +vashegyite +vasicentric +vasicine +vasifactive +vasiferous +vasiform +vasoconstricting +vasoconstriction +vasoconstrictive +vasoconstrictor +vasocorona +vasodentinal +vasodentine +vasodilatation +vasodilatin +vasodilating +vasodilation +vasodilator +vasoepididymostomy +vasofactive +vasoformative +vasoganglion +vasohypertonic +vasohypotonic +vasoinhibitor +vasoinhibitory +vasoligation +vasoligature +vasomotion +vasomotor +vasomotorial +vasomotoric +vasomotory +vasoneurosis +vasoparesis +vasopressor +vasopuncture +vasoreflex +vasorrhaphy +vasosection +vasospasm +vasospastic +vasostimulant +vasostomy +vasotomy +vasotonic +vasotribe +vasotripsy +vasotrophic +vasovesiculectomy +vasquine +vassal +vassalage +vassaldom +vassaless +vassalic +vassalism +vassality +vassalize +vassalless +vassalry +vassalship +vast +vastate +vastation +vastidity +vastily +vastiness +vastitude +vastity +vastly +vastness +vasty +vasu +Vasudeva +Vasundhara +vat +Vateria +vatful +vatic +vatically +Vatican +vaticanal +vaticanic +vaticanical +Vaticanism +Vaticanist +Vaticanization +Vaticanize +vaticide +vaticinal +vaticinant +vaticinate +vaticination +vaticinator +vaticinatory +vaticinatress +vaticinatrix +vatmaker +vatmaking +vatman +Vatteluttu +vatter +vau +Vaucheria +Vaucheriaceae +vaucheriaceous +vaudeville +vaudevillian +vaudevillist +Vaudism +Vaudois +vaudy +vaugnerite +vault +vaulted +vaultedly +vaulter +vaulting +vaultlike +vaulty +vaunt +vauntage +vaunted +vaunter +vauntery +vauntful +vauntiness +vaunting +vauntingly +vauntmure +vaunty +vauquelinite +Vauxhall +Vauxhallian +vauxite +vavasor +vavasory +vaward +Vayu +Vazimba +Veadar +veal +vealer +vealiness +veallike +vealskin +vealy +vectigal +vection +vectis +vectograph +vectographic +vector +vectorial +vectorially +vecture +Veda +Vedaic +Vedaism +Vedalia +vedana +Vedanga +Vedanta +Vedantic +Vedantism +Vedantist +Vedda +Veddoid +vedette +Vedic +vedika +Vediovis +Vedism +Vedist +vedro +Veduis +veduis +vee +veen +veep +veer +veerable +veeringly +veery +Vega +vegasite +vegeculture +vegetability +vegetable +vegetablelike +vegetablewise +vegetablize +vegetably +vegetal +vegetalcule +vegetality +vegetant +vegetarian +vegetarianism +vegetate +vegetation +vegetational +vegetationless +vegetative +vegetatively +vegetativeness +vegete +vegeteness +vegetism +vegetive +vegetivorous +vegetoalkali +vegetoalkaline +vegetoalkaloid +vegetoanimal +vegetobituminous +vegetocarbonaceous +vegetomineral +vehemence +vehemency +vehement +vehemently +vehicle +vehicular +vehicularly +vehiculary +vehiculate +vehiculation +vehiculatory +Vehmic +vei +veigle +veil +veiled +veiledly +veiledness +veiler +veiling +veilless +veillike +veilmaker +veilmaking +Veiltail +veily +vein +veinage +veinal +veinbanding +veined +veiner +veinery +veininess +veining +veinless +veinlet +veinous +veinstone +veinstuff +veinule +veinulet +veinwise +veinwork +veiny +Vejoces +vejoces +Vejovis +Vejoz +vela +velal +velamen +velamentous +velamentum +velar +velardenite +velaric +velarium +velarize +velary +velate +velated +velation +velatura +Velchanos +veldcraft +veldman +veldschoen +veldt +veldtschoen +Velella +velellidous +velic +veliferous +veliform +veliger +veligerous +Velika +velitation +vell +vellala +velleda +velleity +vellicate +vellication +vellicative +vellinch +vellon +vellosine +Vellozia +Velloziaceae +velloziaceous +vellum +vellumy +velo +velociman +velocimeter +velocious +velociously +velocipedal +velocipede +velocipedean +velocipedic +velocitous +velocity +velodrome +velometer +velours +veloutine +velte +velum +velumen +velure +Velutina +velutinous +velveret +velvet +velvetbreast +velveted +velveteen +velveteened +velvetiness +velveting +velvetleaf +velvetlike +velvetry +velvetseed +velvetweed +velvetwork +velvety +venada +venal +venality +venalization +venalize +venally +venalness +Venantes +venanzite +venatic +venatical +venatically +venation +venational +venator +venatorial +venatorious +venatory +vencola +Vend +vend +vendace +Vendean +vendee +vender +vendetta +vendettist +vendibility +vendible +vendibleness +vendibly +vendicate +Vendidad +vending +venditate +venditation +vendition +venditor +vendor +vendue +Vened +Venedotian +veneer +veneerer +veneering +venefical +veneficious +veneficness +veneficous +venenate +venenation +venene +veneniferous +venenific +venenosalivary +venenous +venenousness +venepuncture +venerability +venerable +venerableness +venerably +Veneracea +veneracean +veneraceous +veneral +Veneralia +venerance +venerant +venerate +veneration +venerational +venerative +veneratively +venerativeness +venerator +venereal +venerealness +venereologist +venereology +venerer +Veneres +venerial +Veneridae +veneriform +venery +venesect +venesection +venesector +venesia +Venetes +Veneti +Venetian +Venetianed +Venetic +venezolano +Venezuelan +vengeable +vengeance +vengeant +vengeful +vengefully +vengefulness +vengeously +venger +venial +veniality +venially +venialness +Venice +venie +venin +veniplex +venipuncture +venireman +venison +venisonivorous +venisonlike +venisuture +Venite +Venizelist +vennel +venner +venoatrial +venoauricular +venom +venomed +venomer +venomization +venomize +venomly +venomness +venomosalivary +venomous +venomously +venomousness +venomproof +venomsome +venomy +venosal +venosclerosis +venose +venosinal +venosity +venostasis +venous +venously +venousness +vent +ventage +ventail +venter +Ventersdorp +venthole +ventiduct +ventifact +ventil +ventilable +ventilagin +ventilate +ventilating +ventilation +ventilative +ventilator +ventilatory +ventless +ventometer +ventose +ventoseness +ventosity +ventpiece +ventrad +ventral +ventrally +ventralmost +ventralward +ventric +ventricle +ventricolumna +ventricolumnar +ventricornu +ventricornual +ventricose +ventricoseness +ventricosity +ventricous +ventricular +ventricularis +ventriculite +Ventriculites +ventriculitic +Ventriculitidae +ventriculogram +ventriculography +ventriculoscopy +ventriculose +ventriculous +ventriculus +ventricumbent +ventriduct +ventrifixation +ventrilateral +ventrilocution +ventriloqual +ventriloqually +ventriloque +ventriloquial +ventriloquially +ventriloquism +ventriloquist +ventriloquistic +ventriloquize +ventriloquous +ventriloquously +ventriloquy +ventrimesal +ventrimeson +ventrine +ventripotency +ventripotent +ventripotential +ventripyramid +ventroaxial +ventroaxillary +ventrocaudal +ventrocystorrhaphy +ventrodorsad +ventrodorsal +ventrodorsally +ventrofixation +ventrohysteropexy +ventroinguinal +ventrolateral +ventrolaterally +ventromedial +ventromedian +ventromesal +ventromesial +ventromyel +ventroposterior +ventroptosia +ventroptosis +ventroscopy +ventrose +ventrosity +ventrosuspension +ventrotomy +venture +venturer +venturesome +venturesomely +venturesomeness +Venturia +venturine +venturous +venturously +venturousness +venue +venula +venular +venule +venulose +Venus +Venusian +venust +Venutian +venville +Veps +Vepse +Vepsish +vera +veracious +veraciously +veraciousness +veracity +veranda +verandaed +verascope +veratral +veratralbine +veratraldehyde +veratrate +veratria +veratric +veratridine +veratrine +veratrinize +veratrize +veratroidine +veratrole +veratroyl +Veratrum +veratryl +veratrylidene +verb +verbal +verbalism +verbalist +verbality +verbalization +verbalize +verbalizer +verbally +verbarian +verbarium +verbasco +verbascose +Verbascum +verbate +verbatim +verbena +Verbenaceae +verbenaceous +verbenalike +verbenalin +Verbenarius +verbenate +verbene +verbenone +verberate +verberation +verberative +Verbesina +verbiage +verbicide +verbiculture +verbid +verbification +verbify +verbigerate +verbigeration +verbigerative +verbile +verbless +verbolatry +verbomania +verbomaniac +verbomotor +verbose +verbosely +verboseness +verbosity +verbous +verby +verchok +verd +verdancy +verdant +verdantly +verdantness +verdea +verdelho +verderer +verderership +verdet +verdict +verdigris +verdigrisy +verdin +verditer +verdoy +verdugoship +verdun +verdure +verdured +verdureless +verdurous +verdurousness +verecund +verecundity +verecundness +verek +veretilliform +Veretillum +veretillum +verge +vergeboard +vergence +vergency +vergent +vergentness +verger +vergeress +vergerism +vergerless +vergership +vergery +vergi +vergiform +Vergilianism +verglas +vergobret +veri +veridic +veridical +veridicality +veridically +veridicalness +veridicous +veridity +verifiability +verifiable +verifiableness +verifiably +verificate +verification +verificative +verificatory +verifier +verify +verily +verine +verisimilar +verisimilarly +verisimilitude +verisimilitudinous +verisimility +verism +verist +veristic +veritability +veritable +veritableness +veritably +verite +veritism +veritist +veritistic +verity +verjuice +vermeil +vermeologist +vermeology +Vermes +vermetid +Vermetidae +vermetidae +Vermetus +vermian +vermicelli +vermicidal +vermicide +vermicious +vermicle +vermicular +Vermicularia +vermicularly +vermiculate +vermiculated +vermiculation +vermicule +vermiculite +vermiculose +vermiculosity +vermiculous +vermiform +Vermiformia +vermiformis +vermiformity +vermiformous +vermifugal +vermifuge +vermifugous +vermigerous +vermigrade +Vermilingues +Vermilinguia +vermilinguial +vermilion +vermilionette +vermilionize +vermin +verminal +verminate +vermination +verminer +verminicidal +verminicide +verminiferous +verminlike +verminly +verminosis +verminous +verminously +verminousness +verminproof +verminy +vermiparous +vermiparousness +vermis +vermivorous +vermivorousness +vermix +Vermont +Vermonter +Vermontese +vermorel +vermouth +vernacle +vernacular +vernacularism +vernacularist +vernacularity +vernacularization +vernacularize +vernacularly +vernacularness +vernaculate +vernal +vernality +vernalization +vernalize +vernally +vernant +vernation +vernicose +vernier +vernile +vernility +vernin +vernine +vernition +Vernonia +vernoniaceous +Vernonieae +vernonin +Verona +Veronal +veronalism +Veronese +Veronica +Veronicella +Veronicellidae +Verpa +verre +verrel +verriculate +verriculated +verricule +verruca +verrucano +Verrucaria +Verrucariaceae +verrucariaceous +verrucarioid +verrucated +verruciferous +verruciform +verrucose +verrucoseness +verrucosis +verrucosity +verrucous +verruculose +verruga +versability +versable +versableness +versal +versant +versate +versatile +versatilely +versatileness +versatility +versation +versative +verse +versecraft +versed +verseless +verselet +versemaker +versemaking +verseman +versemanship +versemonger +versemongering +versemongery +verser +versesmith +verset +versette +verseward +versewright +versicle +versicler +versicolor +versicolorate +versicolored +versicolorous +versicular +versicule +versifiable +versifiaster +versification +versificator +versificatory +versificatrix +versifier +versiform +versify +versiloquy +versine +version +versional +versioner +versionist +versionize +versipel +verso +versor +verst +versta +versual +versus +vert +vertebra +vertebrae +vertebral +vertebraless +vertebrally +Vertebraria +vertebrarium +vertebrarterial +Vertebrata +vertebrate +vertebrated +vertebration +vertebre +vertebrectomy +vertebriform +vertebroarterial +vertebrobasilar +vertebrochondral +vertebrocostal +vertebrodymus +vertebrofemoral +vertebroiliac +vertebromammary +vertebrosacral +vertebrosternal +vertex +vertibility +vertible +vertibleness +vertical +verticalism +verticality +vertically +verticalness +vertices +verticil +verticillary +verticillaster +verticillastrate +verticillate +verticillated +verticillately +verticillation +verticilliaceous +verticilliose +Verticillium +verticillus +verticity +verticomental +verticordious +vertiginate +vertigines +vertiginous +vertigo +vertilinear +vertimeter +Vertumnus +Verulamian +veruled +verumontanum +vervain +vervainlike +verve +vervecine +vervel +verveled +vervelle +vervenia +vervet +very +Vesalian +vesania +vesanic +vesbite +vesicae +vesical +vesicant +vesicate +vesication +vesicatory +vesicle +vesicoabdominal +vesicocavernous +vesicocele +vesicocervical +vesicoclysis +vesicofixation +vesicointestinal +vesicoprostatic +vesicopubic +vesicorectal +vesicosigmoid +vesicospinal +vesicotomy +vesicovaginal +vesicular +Vesicularia +vesicularly +vesiculary +vesiculase +Vesiculata +Vesiculatae +vesiculate +vesiculation +vesicule +vesiculectomy +vesiculiferous +vesiculiform +vesiculigerous +vesiculitis +vesiculobronchial +vesiculocavernous +vesiculopustular +vesiculose +vesiculotomy +vesiculotubular +vesiculotympanic +vesiculotympanitic +vesiculous +vesiculus +vesicupapular +veskit +Vespa +vespacide +vespal +vesper +vesperal +vesperian +vespering +vespers +vespertide +vespertilian +Vespertilio +vespertilio +Vespertiliones +vespertilionid +Vespertilionidae +Vespertilioninae +vespertilionine +vespertinal +vespertine +vespery +vespiary +vespid +Vespidae +vespiform +Vespina +vespine +vespoid +Vespoidea +vessel +vesseled +vesselful +vessignon +vest +Vesta +vestal +Vestalia +vestalia +vestalship +Vestas +vestee +vester +vestiarian +vestiarium +vestiary +vestibula +vestibular +vestibulary +vestibulate +vestibule +vestibuled +vestibulospinal +vestibulum +vestige +vestigial +vestigially +Vestigian +vestigiary +vestigium +vestiment +vestimental +vestimentary +vesting +Vestini +Vestinian +vestiture +vestlet +vestment +vestmental +vestmented +vestral +vestralization +vestrical +vestrification +vestrify +vestry +vestrydom +vestryhood +vestryish +vestryism +vestryize +vestryman +vestrymanly +vestrymanship +vestuary +vestural +vesture +vesturer +Vesuvian +vesuvian +vesuvianite +vesuviate +vesuvite +vesuvius +veszelyite +vet +veta +vetanda +vetch +vetchling +vetchy +veteran +veterancy +veteraness +veteranize +veterinarian +veterinarianism +veterinary +vetitive +vetivene +vetivenol +vetiver +Vetiveria +vetiveria +vetivert +vetkousie +veto +vetoer +vetoism +vetoist +vetoistic +vetoistical +vetust +vetusty +veuglaire +veuve +vex +vexable +vexation +vexatious +vexatiously +vexatiousness +vexatory +vexed +vexedly +vexedness +vexer +vexful +vexil +vexillar +vexillarious +vexillary +vexillate +vexillation +vexillum +vexingly +vexingness +vext +via +viability +viable +viaduct +viaggiatory +viagram +viagraph +viajaca +vial +vialful +vialmaker +vialmaking +vialogue +viameter +viand +viander +viatic +viatica +viatical +viaticum +viatometer +viator +viatorial +viatorially +vibetoite +vibex +vibgyor +vibix +vibracular +vibracularium +vibraculoid +vibraculum +vibrance +vibrancy +vibrant +vibrantly +vibraphone +vibrate +vibratile +vibratility +vibrating +vibratingly +vibration +vibrational +vibrationless +vibratiuncle +vibratiunculation +vibrative +vibrato +vibrator +vibratory +Vibrio +vibrioid +vibrion +vibrionic +vibrissa +vibrissae +vibrissal +vibrograph +vibromassage +vibrometer +vibromotive +vibronic +vibrophone +vibroscope +vibroscopic +vibrotherapeutics +viburnic +viburnin +Viburnum +vicar +vicarage +vicarate +vicaress +vicarial +vicarian +vicarianism +vicariate +vicariateship +vicarious +vicariously +vicariousness +vicarly +vicarship +vice +vicecomes +vicecomital +vicegeral +vicegerency +vicegerent +vicegerentship +viceless +vicelike +vicenary +vicennial +viceregal +viceregally +vicereine +viceroy +viceroyal +viceroyalty +viceroydom +viceroyship +vicety +viceversally +Vichyite +vichyssoise +Vicia +vicianin +vicianose +vicilin +vicinage +vicinal +vicine +vicinity +viciosity +vicious +viciously +viciousness +vicissitous +vicissitude +vicissitudinary +vicissitudinous +vicissitudinousness +vicoite +vicontiel +victim +victimhood +victimizable +victimization +victimize +victimizer +victless +victor +victordom +victorfish +Victoria +Victorian +Victorianism +Victorianize +Victorianly +victoriate +victoriatus +victorine +victorious +victoriously +victoriousness +victorium +victory +victoryless +victress +victrix +Victrola +victrola +victual +victualage +victualer +victualing +victuallership +victualless +victualry +victuals +vicuna +Viddhal +viddui +videndum +video +videogenic +vidette +Vidian +vidonia +vidry +Vidua +viduage +vidual +vidually +viduate +viduated +viduation +Viduinae +viduine +viduity +viduous +vidya +vie +vielle +Vienna +Viennese +vier +vierling +viertel +viertelein +Vietminh +Vietnamese +view +viewable +viewably +viewer +viewiness +viewless +viewlessly +viewly +viewpoint +viewsome +viewster +viewworthy +viewy +vifda +viga +vigentennial +vigesimal +vigesimation +vigia +vigil +vigilance +vigilancy +vigilant +vigilante +vigilantism +vigilantly +vigilantness +vigilate +vigilation +vigintiangular +vigneron +vignette +vignetter +vignettist +vignin +vigonia +vigor +vigorist +vigorless +vigorous +vigorously +vigorousness +vihara +vihuela +vijao +viking +vikingism +vikinglike +vikingship +vila +vilayet +vile +vilehearted +Vilela +vilely +vileness +Vili +vilicate +vilification +vilifier +vilify +vilifyingly +vilipend +vilipender +vilipenditory +vility +vill +villa +villadom +villaette +village +villageful +villagehood +villageless +villagelet +villagelike +villageous +villager +villageress +villagery +villaget +villageward +villagey +villagism +villain +villainage +villaindom +villainess +villainist +villainous +villainously +villainousness +villainproof +villainy +villakin +villaless +villalike +villanage +villanella +villanelle +villanette +villanous +villanously +Villanova +Villanovan +villar +villate +villatic +ville +villein +villeinage +villeiness +villeinhold +villenage +villiaumite +villiferous +villiform +villiplacental +Villiplacentalia +villitis +villoid +villose +villosity +villous +villously +villus +vim +vimana +vimen +vimful +Viminal +viminal +vimineous +vina +vinaceous +vinaconic +vinage +vinagron +vinaigrette +vinaigretted +vinaigrier +vinaigrous +vinal +Vinalia +vinasse +vinata +Vincent +vincent +Vincentian +Vincetoxicum +vincetoxin +vincibility +vincible +vincibleness +vincibly +vincular +vinculate +vinculation +vinculum +Vindelici +vindemial +vindemiate +vindemiation +vindemiatory +Vindemiatrix +vindex +vindhyan +vindicability +vindicable +vindicableness +vindicably +vindicate +vindication +vindicative +vindicatively +vindicativeness +vindicator +vindicatorily +vindicatorship +vindicatory +vindicatress +vindictive +vindictively +vindictiveness +vindictivolence +vindresser +vine +vinea +vineal +vineatic +vined +vinegar +vinegarer +vinegarette +vinegarish +vinegarist +vinegarroon +vinegarweed +vinegary +vinegerone +vinegrower +vineity +vineland +vineless +vinelet +vinelike +viner +vinery +vinestalk +vinewise +vineyard +Vineyarder +vineyarding +vineyardist +vingerhoed +Vingolf +vinhatico +vinic +vinicultural +viniculture +viniculturist +vinifera +viniferous +vinification +vinificator +Vinland +vinny +vino +vinoacetous +vinolence +vinolent +vinologist +vinology +vinometer +vinomethylic +vinose +vinosity +vinosulphureous +vinous +vinously +vinousness +vinquish +vint +vinta +vintage +vintager +vintaging +vintem +vintener +vintlite +vintner +vintneress +vintnership +vintnery +vintress +vintry +viny +vinyl +vinylbenzene +vinylene +vinylic +vinylidene +viol +viola +violability +violable +violableness +violably +Violaceae +violacean +violaceous +violaceously +violal +Violales +violanin +violaquercitrin +violate +violater +violation +violational +violative +violator +violatory +violature +violence +violent +violently +violentness +violer +violescent +violet +violetish +violetlike +violette +violetwise +violety +violin +violina +violine +violinette +violinist +violinistic +violinlike +violinmaker +violinmaking +violist +violmaker +violmaking +violon +violoncellist +violoncello +violone +violotta +violuric +viosterol +Vip +viper +Vipera +viperan +viperess +viperfish +viperian +viperid +Viperidae +viperiform +Viperina +Viperinae +viperine +viperish +viperishly +viperlike +viperling +viperoid +Viperoidea +viperous +viperously +viperousness +vipery +vipolitic +vipresident +viqueen +Vira +viragin +viraginian +viraginity +viraginous +virago +viragoish +viragolike +viragoship +viral +Virales +Virbius +vire +virelay +viremia +viremic +virent +vireo +vireonine +virescence +virescent +virga +virgal +virgate +virgated +virgater +virgation +virgilia +Virgilism +virgin +virginal +Virginale +virginalist +virginality +virginally +virgineous +virginhead +Virginia +Virginian +Virginid +virginitis +virginity +virginityship +virginium +virginlike +virginly +virginship +Virgo +virgula +virgular +Virgularia +virgularian +Virgulariidae +virgulate +virgule +virgultum +virial +viricide +virid +viridene +viridescence +viridescent +viridian +viridigenous +viridine +viridite +viridity +virific +virify +virile +virilely +virileness +virilescence +virilescent +virilify +viriliously +virilism +virilist +virility +viripotent +viritrate +virl +virole +viroled +virological +virologist +virology +viron +virose +virosis +virous +virtu +virtual +virtualism +virtualist +virtuality +virtualize +virtually +virtue +virtued +virtuefy +virtuelessness +virtueproof +virtuless +virtuosa +virtuose +virtuosi +virtuosic +virtuosity +virtuoso +virtuosoship +virtuous +virtuouslike +virtuously +virtuousness +virucidal +virucide +viruela +virulence +virulency +virulent +virulented +virulently +virulentness +viruliferous +virus +viruscidal +viruscide +virusemic +vis +visa +visage +visaged +visagraph +visarga +Visaya +Visayan +viscacha +viscera +visceral +visceralgia +viscerally +viscerate +visceration +visceripericardial +visceroinhibitory +visceromotor +visceroparietal +visceroperitioneal +visceropleural +visceroptosis +visceroptotic +viscerosensory +visceroskeletal +viscerosomatic +viscerotomy +viscerotonia +viscerotonic +viscerotrophic +viscerotropic +viscerous +viscid +viscidity +viscidize +viscidly +viscidness +viscidulous +viscin +viscoidal +viscolize +viscometer +viscometrical +viscometrically +viscometry +viscontal +viscoscope +viscose +viscosimeter +viscosimetry +viscosity +viscount +viscountcy +viscountess +viscountship +viscounty +viscous +viscously +viscousness +viscus +vise +viseman +Vishnavite +Vishnu +Vishnuism +Vishnuite +Vishnuvite +visibility +visibilize +visible +visibleness +visibly +visie +Visigoth +Visigothic +visile +vision +visional +visionally +visionarily +visionariness +visionary +visioned +visioner +visionic +visionist +visionize +visionless +visionlike +visionmonger +visionproof +visit +visita +visitable +Visitandine +visitant +visitation +visitational +visitative +visitator +visitatorial +visite +visitee +visiter +visiting +visitment +visitor +visitoress +visitorial +visitorship +visitress +visitrix +visive +visne +vison +visor +visorless +visorlike +vista +vistaed +vistal +vistaless +vistamente +visto +Vistulian +visual +visualist +visuality +visualization +visualize +visualizer +visually +visuoauditory +visuokinesthetic +visuometer +visuopsychic +visuosensory +vita +Vitaceae +Vitaglass +vital +vitalic +vitalism +vitalist +vitalistic +vitalistically +vitality +vitalization +vitalize +vitalizer +vitalizing +vitalizingly +Vitallium +vitally +vitalness +vitals +vitamer +vitameric +vitamin +vitaminic +vitaminize +vitaminology +vitapath +vitapathy +vitaphone +vitascope +vitascopic +vitasti +vitativeness +vitellarian +vitellarium +vitellary +vitellicle +vitelliferous +vitelligenous +vitelligerous +vitellin +vitelline +vitellogene +vitellogenous +vitellose +vitellus +viterbite +Viti +vitiable +vitiate +vitiated +vitiation +vitiator +viticetum +viticulose +viticultural +viticulture +viticulturer +viticulturist +vitiferous +vitiliginous +vitiligo +vitiligoidea +vitiosity +Vitis +vitium +vitochemic +vitochemical +vitrage +vitrail +vitrailed +vitrailist +vitrain +vitraux +vitreal +vitrean +vitrella +vitremyte +vitreodentinal +vitreodentine +vitreoelectric +vitreosity +vitreous +vitreouslike +vitreously +vitreousness +vitrescence +vitrescency +vitrescent +vitrescibility +vitrescible +vitreum +vitric +vitrics +vitrifaction +vitrifacture +vitrifiability +vitrifiable +vitrification +vitriform +vitrify +Vitrina +vitrine +vitrinoid +vitriol +vitriolate +vitriolation +vitriolic +vitrioline +vitriolizable +vitriolization +vitriolize +vitriolizer +vitrite +vitrobasalt +vitrophyre +vitrophyric +vitrotype +vitrous +Vitruvian +Vitruvianism +vitta +vittate +vitular +vituline +vituperable +vituperate +vituperation +vituperative +vituperatively +vituperator +vituperatory +vituperious +viuva +viva +vivacious +vivaciously +vivaciousness +vivacity +vivandiere +vivarium +vivary +vivax +vive +vively +vivency +viver +Viverridae +viverriform +Viverrinae +viverrine +vivers +vives +vivianite +vivicremation +vivid +vividialysis +vividiffusion +vividissection +vividity +vividly +vividness +vivific +vivificate +vivification +vivificative +vivificator +vivifier +vivify +viviparism +viviparity +viviparous +viviparously +viviparousness +vivipary +viviperfuse +vivisect +vivisection +vivisectional +vivisectionally +vivisectionist +vivisective +vivisector +vivisectorium +vivisepulture +vixen +vixenish +vixenishly +vixenishness +vixenlike +vixenly +vizard +vizarded +vizardless +vizardlike +vizardmonger +vizier +vizierate +viziercraft +vizierial +viziership +vizircraft +Vlach +vlei +voar +vocability +vocable +vocably +vocabular +vocabularian +vocabularied +vocabulary +vocabulation +vocabulist +vocal +vocalic +vocalion +vocalise +vocalism +vocalist +vocalistic +vocality +vocalization +vocalize +vocalizer +vocaller +vocally +vocalness +vocate +vocation +vocational +vocationalism +vocationalization +vocationalize +vocationally +vocative +vocatively +Vochysiaceae +vochysiaceous +vocicultural +vociferance +vociferant +vociferate +vociferation +vociferative +vociferator +vociferize +vociferosity +vociferous +vociferously +vociferousness +vocification +vocimotor +vocular +vocule +Vod +vodka +voe +voet +voeten +Voetian +vog +vogesite +voglite +vogue +voguey +voguish +Vogul +voice +voiced +voiceful +voicefulness +voiceless +voicelessly +voicelessness +voicelet +voicelike +voicer +voicing +void +voidable +voidableness +voidance +voided +voidee +voider +voiding +voidless +voidly +voidness +voile +voiturette +voivode +voivodeship +vol +volable +volage +Volans +volant +volantly +Volapuk +Volapuker +Volapukism +Volapukist +volar +volata +volatic +volatile +volatilely +volatileness +volatility +volatilizable +volatilization +volatilize +volatilizer +volation +volational +volborthite +Volcae +volcan +Volcanalia +volcanian +volcanic +volcanically +volcanicity +volcanism +volcanist +volcanite +volcanity +volcanization +volcanize +volcano +volcanoism +volcanological +volcanologist +volcanologize +volcanology +Volcanus +vole +volemitol +volency +volent +volently +volery +volet +volhynite +volipresence +volipresent +volitant +volitate +volitation +volitational +volitiency +volitient +volition +volitional +volitionalist +volitionality +volitionally +volitionary +volitionate +volitionless +volitive +volitorial +Volkerwanderung +volley +volleyball +volleyer +volleying +volleyingly +volost +volplane +volplanist +Volsci +Volscian +volsella +volsellum +Volstead +Volsteadism +volt +Volta +voltaelectric +voltaelectricity +voltaelectrometer +voltaelectrometric +voltage +voltagraphy +voltaic +Voltairian +Voltairianize +Voltairish +Voltairism +voltaism +voltaite +voltameter +voltametric +voltammeter +voltaplast +voltatype +voltinism +voltivity +voltize +voltmeter +voltzite +volubilate +volubility +voluble +volubleness +volubly +volucrine +volume +volumed +volumenometer +volumenometry +volumescope +volumeter +volumetric +volumetrical +volumetrically +volumetry +volumette +voluminal +voluminosity +voluminous +voluminously +voluminousness +volumist +volumometer +volumometrical +volumometry +voluntariate +voluntarily +voluntariness +voluntarism +voluntarist +voluntaristic +voluntarity +voluntary +voluntaryism +voluntaryist +voluntative +volunteer +volunteerism +volunteerly +volunteership +volupt +voluptary +voluptas +voluptuarian +voluptuary +voluptuate +voluptuosity +voluptuous +voluptuously +voluptuousness +volupty +Voluspa +voluta +volutate +volutation +volute +voluted +Volutidae +volutiform +volutin +volution +volutoid +volva +volvate +volvelle +volvent +Volvocaceae +volvocaceous +volvulus +vomer +vomerine +vomerobasilar +vomeronasal +vomeropalatine +vomica +vomicine +vomit +vomitable +vomiter +vomiting +vomitingly +vomition +vomitive +vomitiveness +vomito +vomitory +vomiture +vomiturition +vomitus +vomitwort +vondsira +vonsenite +voodoo +voodooism +voodooist +voodooistic +voracious +voraciously +voraciousness +voracity +voraginous +vorago +vorant +vorhand +vorlooper +vorondreo +vorpal +vortex +vortical +vortically +vorticel +Vorticella +vorticellid +Vorticellidae +vortices +vorticial +vorticiform +vorticism +vorticist +vorticity +vorticose +vorticosely +vorticular +vorticularly +vortiginous +Vortumnus +Vosgian +vota +votable +votal +votally +votaress +votarist +votary +votation +Vote +vote +voteen +voteless +voter +voting +Votish +votive +votively +votiveness +votometer +votress +Votyak +vouch +vouchable +vouchee +voucher +voucheress +vouchment +vouchsafe +vouchsafement +vouge +Vougeot +Vouli +voussoir +vow +vowed +vowel +vowelish +vowelism +vowelist +vowelization +vowelize +vowelless +vowellessness +vowellike +vowely +vower +vowess +vowless +vowmaker +vowmaking +voyage +voyageable +voyager +voyance +voyeur +voyeurism +vraic +vraicker +vraicking +vrbaite +vriddhi +vrother +Vu +vug +vuggy +Vulcan +Vulcanalia +Vulcanalial +Vulcanalian +Vulcanian +Vulcanic +vulcanicity +vulcanism +vulcanist +vulcanite +vulcanizable +vulcanizate +vulcanization +vulcanize +vulcanizer +vulcanological +vulcanologist +vulcanology +vulgar +vulgare +vulgarian +vulgarish +vulgarism +vulgarist +vulgarity +vulgarization +vulgarize +vulgarizer +vulgarlike +vulgarly +vulgarness +vulgarwise +Vulgate +vulgate +vulgus +vuln +vulnerability +vulnerable +vulnerableness +vulnerably +vulnerary +vulnerate +vulneration +vulnerative +vulnerose +vulnific +vulnose +Vulpecula +vulpecular +Vulpeculid +Vulpes +vulpic +vulpicidal +vulpicide +vulpicidism +Vulpinae +vulpine +vulpinism +vulpinite +vulsella +vulsellum +vulsinite +Vultur +vulture +vulturelike +vulturewise +Vulturidae +Vulturinae +vulturine +vulturish +vulturism +vulturn +vulturous +vulva +vulval +vulvar +vulvate +vulviform +vulvitis +vulvocrural +vulvouterine +vulvovaginal +vulvovaginitis +vum +vying +vyingly +W +w +Wa +wa +Waac +waag +waapa +waar +Waasi +wab +wabber +wabble +wabbly +wabby +wabe +Wabena +wabeno +Wabi +wabster +Wabuma +Wabunga +Wac +wacago +wace +Wachaga +Wachenheimer +wachna +Wachuset +wack +wacke +wacken +wacker +wackiness +wacky +Waco +wad +waddent +wadder +wadding +waddler +waddlesome +waddling +waddlingly +waddly +waddy +waddywood +wade +wadeable +wader +wadi +wading +wadingly +wadlike +wadmaker +wadmaking +wadmal +wadmeal +wadna +wadset +wadsetter +wae +waeg +waer +waesome +waesuck +Waf +Wafd +Wafdist +wafer +waferer +waferish +wafermaker +wafermaking +waferwoman +waferwork +wafery +waff +waffle +wafflike +waffly +waft +waftage +wafter +wafture +wafty +wag +Waganda +waganging +wagaun +wagbeard +wage +waged +wagedom +wageless +wagelessness +wagenboom +Wagener +wager +wagerer +wagering +wages +wagesman +wagework +wageworker +wageworking +waggable +waggably +waggel +wagger +waggery +waggie +waggish +waggishly +waggishness +waggle +waggling +wagglingly +waggly +Waggumbura +waggy +waglike +wagling +Wagneresque +Wagnerian +Wagneriana +Wagnerianism +Wagnerism +Wagnerist +Wagnerite +wagnerite +Wagnerize +Wagogo +Wagoma +wagon +wagonable +wagonage +wagoner +wagoness +wagonette +wagonful +wagonload +wagonmaker +wagonmaking +wagonman +wagonry +wagonsmith +wagonway +wagonwayman +wagonwork +wagonwright +wagsome +wagtail +Waguha +wagwag +wagwants +Wagweno +wagwit +wah +Wahabi +Wahabiism +Wahabit +Wahabitism +wahahe +Wahehe +Wahima +wahine +Wahlenbergia +wahoo +wahpekute +Wahpeton +waiata +Waibling +Waicuri +Waicurian +waif +Waiguli +Waiilatpuan +waik +waikly +waikness +wail +Wailaki +wailer +wailful +wailfully +wailingly +wailsome +waily +wain +wainage +wainbote +wainer +wainful +wainman +wainrope +wainscot +wainscoting +wainwright +waipiro +wairch +waird +wairepo +wairsh +waise +waist +waistband +waistcloth +waistcoat +waistcoated +waistcoateer +waistcoathole +waistcoating +waistcoatless +waisted +waister +waisting +waistless +waistline +wait +waiter +waiterage +waiterdom +waiterhood +waitering +waiterlike +waitership +waiting +waitingly +waitress +waivatua +waive +waiver +waivery +waivod +Waiwai +waiwode +wajang +waka +Wakamba +wakan +Wakashan +wake +wakeel +wakeful +wakefully +wakefulness +wakeless +waken +wakener +wakening +waker +wakes +waketime +wakf +Wakhi +wakif +wakiki +waking +wakingly +wakiup +wakken +wakon +wakonda +Wakore +Wakwafi +waky +Walach +Walachian +walahee +Walapai +Walchia +Waldenses +Waldensian +waldflute +waldgrave +waldgravine +Waldheimia +waldhorn +waldmeister +Waldsteinia +wale +waled +walepiece +Waler +waler +walewort +wali +waling +walk +walkable +walkaway +walker +walking +walkist +walkmill +walkmiller +walkout +walkover +walkrife +walkside +walksman +walkway +walkyrie +wall +wallaba +wallaby +Wallach +wallah +wallaroo +Wallawalla +wallbird +wallboard +walled +waller +Wallerian +wallet +walletful +walleye +walleyed +wallflower +wallful +wallhick +walling +wallise +wallless +wallman +Wallon +Wallonian +Walloon +walloon +wallop +walloper +walloping +wallow +wallower +wallowish +wallowishly +wallowishness +wallpaper +wallpapering +wallpiece +Wallsend +wallwise +wallwork +wallwort +wally +walnut +Walpapi +Walpolean +Walpurgis +walpurgite +walrus +walsh +walt +walter +walth +Waltonian +waltz +waltzer +waltzlike +walycoat +wamara +wambais +wamble +wambliness +wambling +wamblingly +wambly +Wambuba +Wambugu +Wambutti +wame +wamefou +wamel +wammikin +wamp +Wampanoag +wampee +wample +wampum +wampumpeag +wampus +wamus +wan +Wanapum +wanchancy +wand +wander +wanderable +wanderer +wandering +wanderingly +wanderingness +Wanderjahr +wanderlust +wanderluster +wanderlustful +wanderoo +wandery +wanderyear +wandflower +wandle +wandlike +wandoo +Wandorobo +wandsman +wandy +wane +Waneatta +waned +waneless +wang +wanga +wangala +wangan +Wangara +wangateur +wanghee +wangle +wangler +Wangoni +wangrace +wangtooth +wanhope +wanhorn +wanigan +waning +wankapin +wankle +wankliness +wankly +wanle +wanly +wanner +wanness +wannish +wanny +wanrufe +wansonsy +want +wantage +wanter +wantful +wanthill +wanthrift +wanting +wantingly +wantingness +wantless +wantlessness +wanton +wantoner +wantonlike +wantonly +wantonness +wantwit +wanty +wanwordy +wanworth +wany +Wanyakyusa +Wanyamwezi +Wanyasa +Wanyoro +wap +wapacut +Wapato +wapatoo +wapentake +Wapisiana +wapiti +Wapogoro +Wapokomo +wapp +Wappato +wappenschaw +wappenschawing +wapper +wapping +Wappinger +Wappo +war +warabi +waratah +warble +warbled +warblelike +warbler +warblerlike +warblet +warbling +warblingly +warbly +warch +warcraft +ward +wardable +wardage +wardapet +warday +warded +Warden +warden +wardency +wardenry +wardenship +warder +warderer +wardership +wardholding +warding +wardite +wardless +wardlike +wardmaid +wardman +wardmote +wardress +wardrobe +wardrober +wardroom +wardship +wardsmaid +wardsman +wardswoman +wardwite +wardwoman +ware +Waregga +warehou +warehouse +warehouseage +warehoused +warehouseful +warehouseman +warehouser +wareless +waremaker +waremaking +wareman +wareroom +warf +warfare +warfarer +warfaring +warful +warily +wariness +Waring +waringin +warish +warison +wark +warkamoowee +warl +warless +warlessly +warlike +warlikely +warlikeness +warlock +warluck +warly +warm +warmable +warman +warmed +warmedly +warmer +warmful +warmhearted +warmheartedly +warmheartedness +warmhouse +warming +warmish +warmly +warmness +warmonger +warmongering +warmouth +warmth +warmthless +warmus +warn +warnel +warner +warning +warningly +warningproof +warnish +warnoth +warnt +Warori +warp +warpable +warpage +warped +warper +warping +warplane +warple +warplike +warproof +warpwise +warragal +warrambool +warran +warrand +warrandice +warrant +warrantable +warrantableness +warrantably +warranted +warrantee +warranter +warrantise +warrantless +warrantor +warranty +warratau +Warrau +warree +warren +warrener +warrenlike +warrer +Warri +warrin +warrior +warrioress +warriorhood +warriorism +warriorlike +warriorship +warriorwise +warrok +Warsaw +warsaw +warse +warsel +warship +warsle +warsler +warst +wart +warted +wartern +wartflower +warth +wartime +wartless +wartlet +wartlike +wartproof +wartweed +wartwort +warty +wartyback +Warua +Warundi +warve +warwards +Warwick +warwickite +warwolf +warworn +wary +was +wasabi +Wasagara +Wasandawi +Wasango +Wasat +Wasatch +Wasco +wase +Wasegua +wasel +wash +washability +washable +washableness +Washaki +washaway +washbasin +washbasket +washboard +washbowl +washbrew +washcloth +washday +washdish +washdown +washed +washen +washer +washerless +washerman +washerwife +washerwoman +washery +washeryman +washhand +washhouse +washin +washiness +washing +Washington +Washingtonia +Washingtonian +Washingtoniana +Washita +washland +washmaid +washman +Washo +Washoan +washoff +washout +washpot +washproof +washrag +washroad +washroom +washshed +washstand +washtail +washtray +washtrough +washtub +washway +washwoman +washwork +washy +Wasir +wasnt +Wasoga +Wasp +wasp +waspen +wasphood +waspily +waspish +waspishly +waspishness +wasplike +waspling +waspnesting +waspy +wassail +wassailer +wassailous +wassailry +wassie +wast +wastable +wastage +waste +wastebasket +wasteboard +wasted +wasteful +wastefully +wastefulness +wastel +wasteland +wastelbread +wasteless +wasteman +wastement +wasteness +wastepaper +wasteproof +waster +wasterful +wasterfully +wasterfulness +wastethrift +wasteword +wasteyard +wasting +wastingly +wastingness +wastland +wastrel +wastrife +wasty +Wasukuma +Waswahili +Wat +wat +Watala +watap +watch +watchable +watchboat +watchcase +watchcry +watchdog +watched +watcher +watchfree +watchful +watchfully +watchfulness +watchglassful +watchhouse +watching +watchingly +watchkeeper +watchless +watchlessness +watchmaker +watchmaking +watchman +watchmanly +watchmanship +watchmate +watchment +watchout +watchtower +watchwise +watchwoman +watchword +watchwork +water +waterage +waterbailage +waterbelly +Waterberg +waterboard +waterbok +waterbosh +waterbrain +waterchat +watercup +waterdoe +waterdrop +watered +waterer +waterfall +waterfinder +waterflood +waterfowl +waterfront +waterhead +waterhorse +waterie +waterily +wateriness +watering +wateringly +wateringman +waterish +waterishly +waterishness +Waterlander +Waterlandian +waterleave +waterless +waterlessly +waterlessness +waterlike +waterline +waterlog +waterlogged +waterloggedness +waterlogger +waterlogging +Waterloo +waterman +watermanship +watermark +watermaster +watermelon +watermonger +waterphone +waterpot +waterproof +waterproofer +waterproofing +waterproofness +waterquake +waterscape +watershed +watershoot +waterside +watersider +waterskin +watersmeet +waterspout +waterstead +watertight +watertightal +watertightness +waterward +waterwards +waterway +waterweed +waterwise +waterwoman +waterwood +waterwork +waterworker +waterworm +waterworn +waterwort +watery +wath +wathstead +Watsonia +watt +wattage +wattape +wattle +wattlebird +wattled +wattless +wattlework +wattling +wattman +wattmeter +Watusi +wauble +wauch +wauchle +waucht +wauf +waugh +waughy +wauken +waukit +waukrife +waul +waumle +wauner +wauns +waup +waur +Waura +wauregan +wauve +wavable +wavably +Wave +wave +waved +waveless +wavelessly +wavelessness +wavelet +wavelike +wavellite +wavemark +wavement +wavemeter +waveproof +waver +waverable +waverer +wavering +waveringly +waveringness +waverous +wavery +waveson +waveward +wavewise +wavey +wavicle +wavily +waviness +waving +wavingly +Wavira +wavy +waw +wawa +wawah +wawaskeesh +wax +waxberry +waxbill +waxbird +waxbush +waxchandler +waxchandlery +waxen +waxer +waxflower +Waxhaw +waxhearted +waxily +waxiness +waxing +waxingly +waxlike +waxmaker +waxmaking +waxman +waxweed +waxwing +waxwork +waxworker +waxworking +waxy +way +wayaka +wayang +Wayao +wayback +wayberry +waybill +waybird +waybook +waybread +waybung +wayfare +wayfarer +wayfaring +wayfaringly +wayfellow +waygang +waygate +waygoing +waygone +waygoose +wayhouse +waying +waylaid +waylaidlessness +waylay +waylayer +wayleave +wayless +waymaker +wayman +waymark +waymate +waypost +ways +wayside +waysider +waysliding +waythorn +wayward +waywarden +waywardly +waywardness +waywiser +waywode +waywodeship +wayworn +waywort +wayzgoose +Wazir +we +Wea +weak +weakbrained +weaken +weakener +weakening +weakfish +weakhanded +weakhearted +weakheartedly +weakheartedness +weakish +weakishly +weakishness +weakliness +weakling +weakly +weakmouthed +weakness +weaky +weal +weald +Wealden +wealdsman +wealth +wealthily +wealthiness +wealthless +wealthmaker +wealthmaking +wealthmonger +Wealthy +wealthy +weam +wean +weanable +weanedness +weanel +weaner +weanling +Weanoc +weanyer +Weapemeoc +weapon +weaponed +weaponeer +weaponless +weaponmaker +weaponmaking +weaponproof +weaponry +weaponshaw +weaponshow +weaponshowing +weaponsmith +weaponsmithy +wear +wearability +wearable +wearer +weariable +weariableness +wearied +weariedly +weariedness +wearier +weariful +wearifully +wearifulness +weariless +wearilessly +wearily +weariness +wearing +wearingly +wearish +wearishly +wearishness +wearisome +wearisomely +wearisomeness +wearproof +weary +wearying +wearyingly +weasand +weasel +weaselfish +weasellike +weaselly +weaselship +weaselskin +weaselsnout +weaselwise +weaser +weason +weather +weatherboard +weatherboarding +weatherbreak +weathercock +weathercockish +weathercockism +weathercocky +weathered +weatherer +weatherfish +weatherglass +weathergleam +weatherhead +weatherheaded +weathering +weatherliness +weatherly +weathermaker +weathermaking +weatherman +weathermost +weatherology +weatherproof +weatherproofed +weatherproofing +weatherproofness +weatherward +weatherworn +weathery +weavable +weave +weaveable +weaved +weavement +weaver +weaverbird +weaveress +weaving +weazen +weazened +weazeny +web +webbed +webber +webbing +webby +weber +Weberian +webeye +webfoot +webfooter +webless +weblike +webmaker +webmaking +webster +Websterian +websterite +webwork +webworm +wecht +wed +wedana +wedbed +wedbedrip +wedded +weddedly +weddedness +wedder +wedding +weddinger +wede +wedge +wedgeable +wedgebill +wedged +wedgelike +wedger +wedgewise +Wedgie +wedging +Wedgwood +wedgy +wedlock +Wednesday +wedset +wee +weeble +weed +weeda +weedable +weedage +weeded +weeder +weedery +weedful +weedhook +weediness +weedingtime +weedish +weedless +weedlike +weedling +weedow +weedproof +weedy +week +weekday +weekend +weekender +weekly +weekwam +weel +weelfard +weelfaured +weemen +ween +weendigo +weeness +weening +weenong +weeny +weep +weepable +weeper +weepered +weepful +weeping +weepingly +weeps +weepy +weesh +weeshy +weet +weetbird +weetless +weever +weevil +weeviled +weevillike +weevilproof +weevily +weewow +weeze +weft +weftage +wefted +wefty +Wega +wegenerian +wegotism +wehrlite +Wei +weibyeite +weichselwood +Weierstrassian +Weigela +weigelite +weigh +weighable +weighage +weighbar +weighbauk +weighbridge +weighbridgeman +weighed +weigher +weighership +weighhouse +weighin +weighing +weighman +weighment +weighshaft +weight +weightchaser +weighted +weightedly +weightedness +weightily +weightiness +weighting +weightless +weightlessly +weightlessness +weightometer +weighty +weinbergerite +Weinmannia +weinschenkite +weir +weirangle +weird +weirdful +weirdish +weirdless +weirdlessness +weirdlike +weirdliness +weirdly +weirdness +weirdsome +weirdward +weirdwoman +weiring +weisbachite +weiselbergite +weism +Weismannian +Weismannism +weissite +Weissnichtwo +Weitspekan +wejack +weka +wekau +wekeen +weki +welcome +welcomeless +welcomely +welcomeness +welcomer +welcoming +welcomingly +weld +weldability +weldable +welder +welding +weldless +weldment +weldor +Welf +welfare +welfaring +Welfic +welk +welkin +welkinlike +well +wellat +wellaway +wellborn +wellcurb +wellhead +wellhole +welling +wellington +Wellingtonia +wellish +wellmaker +wellmaking +wellman +wellnear +wellness +wellring +Wellsian +wellside +wellsite +wellspring +wellstead +wellstrand +welly +wellyard +wels +Welsh +welsh +welsher +Welshery +Welshism +Welshland +Welshlike +Welshman +Welshness +Welshry +Welshwoman +Welshy +welsium +welt +welted +welter +welterweight +welting +Welwitschia +wem +wemless +wen +wench +wencher +wenchless +wenchlike +Wenchow +Wenchowese +Wend +wend +wende +Wendic +Wendish +wene +Wenlock +Wenlockian +wennebergite +wennish +wenny +Wenonah +Wenrohronon +went +wentletrap +wenzel +wept +wer +Werchowinci +were +werebear +werecalf +werefolk +werefox +werehyena +werejaguar +wereleopard +werent +weretiger +werewolf +werewolfish +werewolfism +werf +wergil +weri +Wernerian +Wernerism +wernerite +werowance +wert +Werther +Wertherian +Wertherism +wervel +wese +weskit +Wesleyan +Wesleyanism +Wesleyism +wesselton +Wessexman +west +westaway +westbound +weste +wester +westering +westerliness +westerly +westermost +western +westerner +westernism +westernization +westernize +westernly +westernmost +westerwards +westfalite +westing +westland +Westlander +westlandways +westmost +westness +Westphalian +Westralian +Westralianism +westward +westwardly +westwardmost +westwards +westy +wet +weta +wetback +wetbird +wetched +wetchet +wether +wetherhog +wetherteg +wetly +wetness +wettability +wettable +wetted +wetter +wetting +wettish +Wetumpka +weve +wevet +Wewenoc +wey +Wezen +Wezn +wha +whabby +whack +whacker +whacking +whacky +whafabout +whale +whaleback +whalebacker +whalebird +whaleboat +whalebone +whaleboned +whaledom +whalehead +whalelike +whaleman +whaler +whaleroad +whalery +whaleship +whaling +whalish +whally +whalm +whalp +whaly +wham +whamble +whame +whammle +whamp +whampee +whample +whan +whand +whang +whangable +whangam +whangdoodle +whangee +whanghee +whank +whap +whappet +whapuka +whapukee +whapuku +whar +whare +whareer +wharf +wharfage +wharfhead +wharfholder +wharfing +wharfinger +wharfland +wharfless +wharfman +wharfmaster +wharfrae +wharfside +wharl +wharp +wharry +whart +wharve +whase +whasle +what +whata +whatabouts +whatever +whatkin +whatlike +whatna +whatness +whatnot +whatreck +whats +whatso +whatsoeer +whatsoever +whatsomever +whatten +whau +whauk +whaup +whaur +whauve +wheal +whealworm +whealy +wheam +wheat +wheatbird +wheatear +wheateared +wheaten +wheatgrower +wheatland +wheatless +wheatlike +wheatstalk +wheatworm +wheaty +whedder +whee +wheedle +wheedler +wheedlesome +wheedling +wheedlingly +wheel +wheelage +wheelband +wheelbarrow +wheelbarrowful +wheelbird +wheelbox +wheeldom +wheeled +wheeler +wheelery +wheelhouse +wheeling +wheelingly +wheelless +wheellike +wheelmaker +wheelmaking +wheelman +wheelrace +wheelroad +wheelsman +wheelsmith +wheelspin +wheelswarf +wheelway +wheelwise +wheelwork +wheelwright +wheelwrighting +wheely +wheem +wheen +wheencat +wheenge +wheep +wheeple +wheer +wheerikins +wheesht +wheetle +wheeze +wheezer +wheezily +wheeziness +wheezingly +wheezle +wheezy +wheft +whein +whekau +wheki +whelk +whelked +whelker +whelklike +whelky +whelm +whelp +whelphood +whelpish +whelpless +whelpling +whelve +whemmel +when +whenabouts +whenas +whence +whenceeer +whenceforth +whenceforward +whencesoeer +whencesoever +whencever +wheneer +whenever +whenness +whenso +whensoever +whensomever +where +whereabout +whereabouts +whereafter +whereanent +whereas +whereat +whereaway +whereby +whereer +wherefor +wherefore +wherefrom +wherein +whereinsoever +whereinto +whereness +whereof +whereon +whereout +whereover +whereso +wheresoeer +wheresoever +wheresomever +wherethrough +wheretill +whereto +wheretoever +wheretosoever +whereunder +whereuntil +whereunto +whereup +whereupon +wherever +wherewith +wherewithal +wherret +wherrit +wherry +wherryman +whet +whether +whetile +whetrock +whetstone +whetter +whew +whewellite +whewer +whewl +whewt +whey +wheybeard +wheyey +wheyeyness +wheyface +wheyfaced +wheyish +wheyishness +wheylike +wheyness +whiba +which +whichever +whichsoever +whichway +whichways +whick +whicken +whicker +whid +whidah +whidder +whiff +whiffenpoof +whiffer +whiffet +whiffle +whiffler +whifflery +whiffletree +whiffling +whifflingly +whiffy +whift +Whig +whig +Whiggamore +whiggamore +Whiggarchy +Whiggery +Whiggess +Whiggification +Whiggify +Whiggish +Whiggishly +Whiggishness +Whiggism +Whiglet +Whigling +whigmaleerie +whigship +whikerby +while +whileen +whilere +whiles +whilie +whilk +Whilkut +whill +whillaballoo +whillaloo +whillilew +whilly +whillywha +whilock +whilom +whils +whilst +whilter +whim +whimberry +whimble +whimbrel +whimling +whimmy +whimper +whimperer +whimpering +whimperingly +whimsey +whimsic +whimsical +whimsicality +whimsically +whimsicalness +whimsied +whimstone +whimwham +whin +whinberry +whinchacker +whinchat +whincheck +whincow +whindle +whine +whiner +whinestone +whing +whinge +whinger +whininess +whiningly +whinnel +whinner +whinnock +whinny +whinstone +whiny +whinyard +whip +whipbelly +whipbird +whipcat +whipcord +whipcordy +whipcrack +whipcracker +whipcraft +whipgraft +whipjack +whipking +whiplash +whiplike +whipmaker +whipmaking +whipman +whipmanship +whipmaster +whippa +whippable +whipparee +whipped +whipper +whippersnapper +whippertail +whippet +whippeter +whippiness +whipping +whippingly +whippletree +whippoorwill +whippost +whippowill +whippy +whipsaw +whipsawyer +whipship +whipsocket +whipstaff +whipstalk +whipstall +whipster +whipstick +whipstitch +whipstock +whipt +whiptail +whiptree +whipwise +whipworm +whir +whirken +whirl +whirlabout +whirlblast +whirlbone +whirlbrain +whirled +whirler +whirley +whirlgig +whirlicane +whirligig +whirlimagig +whirling +whirlingly +whirlmagee +whirlpool +whirlpuff +whirlwig +whirlwind +whirlwindish +whirlwindy +whirly +whirlygigum +whirret +whirrey +whirroo +whirry +whirtle +whish +whisk +whisker +whiskerage +whiskerando +whiskerandoed +whiskered +whiskerer +whiskerette +whiskerless +whiskerlike +whiskery +whiskey +whiskful +whiskied +whiskified +whisking +whiskingly +whisky +whiskyfied +whiskylike +whisp +whisper +whisperable +whisperation +whispered +whisperer +whisperhood +whispering +whisperingly +whisperingness +whisperless +whisperous +whisperously +whisperproof +whispery +whissle +Whisson +whist +whister +whisterpoop +whistle +whistlebelly +whistlefish +whistlelike +whistler +Whistlerian +whistlerism +whistlewing +whistlewood +whistlike +whistling +whistlingly +whistly +whistness +Whistonian +Whit +whit +white +whiteback +whitebait +whitebark +whitebeard +whitebelly +whitebill +whitebird +whiteblaze +whiteblow +whitebottle +Whiteboy +Whiteboyism +whitecap +whitecapper +Whitechapel +whitecoat +whitecomb +whitecorn +whitecup +whited +whiteface +Whitefieldian +Whitefieldism +Whitefieldite +whitefish +whitefisher +whitefishery +Whitefoot +whitefoot +whitefootism +whitehanded +whitehass +whitehawse +whitehead +whiteheart +whitehearted +whitelike +whitely +whiten +whitener +whiteness +whitening +whitenose +whitepot +whiteroot +whiterump +whites +whitesark +whiteseam +whiteshank +whiteside +whitesmith +whitestone +whitetail +whitethorn +whitethroat +whitetip +whitetop +whitevein +whitewall +whitewards +whiteware +whitewash +whitewasher +whiteweed +whitewing +whitewood +whiteworm +whitewort +whitfinch +whither +whitherso +whithersoever +whitherto +whitherward +whiting +whitish +whitishness +whitleather +Whitleyism +whitling +whitlow +whitlowwort +Whitmanese +Whitmanesque +Whitmanism +Whitmanize +Whitmonday +whitneyite +whitrack +whits +whitster +Whitsun +Whitsunday +Whitsuntide +whittaw +whitten +whittener +whitter +whitterick +whittle +whittler +whittling +whittret +whittrick +whity +whiz +whizgig +whizzer +whizzerman +whizziness +whizzing +whizzingly +whizzle +who +whoa +whodunit +whoever +whole +wholehearted +wholeheartedly +wholeheartedness +wholeness +wholesale +wholesalely +wholesaleness +wholesaler +wholesome +wholesomely +wholesomeness +wholewise +wholly +whom +whomble +whomever +whomso +whomsoever +whone +whoo +whoof +whoop +whoopee +whooper +whooping +whoopingly +whooplike +whoops +whoosh +whop +whopper +whopping +whorage +whore +whoredom +whorelike +whoremaster +whoremasterly +whoremastery +whoremonger +whoremonging +whoreship +whoreson +whorish +whorishly +whorishness +whorl +whorled +whorlflower +whorly +whorlywort +whort +whortle +whortleberry +whose +whosen +whosesoever +whosever +whosomever +whosumdever +whud +whuff +whuffle +whulk +whulter +whummle +whun +whunstane +whup +whush +whuskie +whussle +whute +whuther +whutter +whuttering +whuz +why +whyever +whyfor +whyness +whyo +wi +wice +Wichita +wicht +wichtisite +wichtje +wick +wickawee +wicked +wickedish +wickedlike +wickedly +wickedness +wicken +wicker +wickerby +wickerware +wickerwork +wickerworked +wickerworker +wicket +wicketkeep +wicketkeeper +wicketkeeping +wicketwork +wicking +wickiup +wickless +wickup +wicky +wicopy +wid +widbin +widdendream +widder +widdershins +widdifow +widdle +widdy +wide +widegab +widehearted +widely +widemouthed +widen +widener +wideness +widespread +widespreadedly +widespreadly +widespreadness +widewhere +widework +widgeon +widish +widow +widowed +widower +widowered +widowerhood +widowership +widowery +widowhood +widowish +widowlike +widowly +widowman +widowy +width +widthless +widthway +widthways +widthwise +widu +wield +wieldable +wielder +wieldiness +wieldy +wiener +wienerwurst +wienie +wierangle +wiesenboden +wife +wifecarl +wifedom +wifehood +wifeism +wifekin +wifeless +wifelessness +wifelet +wifelike +wifeling +wifelkin +wifely +wifeship +wifeward +wifie +wifiekie +wifish +wifock +wig +wigan +wigdom +wigful +wigged +wiggen +wigger +wiggery +wigging +wiggish +wiggishness +wiggism +wiggle +wiggler +wiggly +wiggy +wight +wightly +wightness +wigless +wiglet +wiglike +wigmaker +wigmaking +wigtail +wigwag +wigwagger +wigwam +wiikite +Wikeno +Wikstroemia +Wilbur +Wilburite +wild +wildbore +wildcat +wildcatter +wildcatting +wildebeest +wilded +wilder +wilderedly +wildering +wilderment +wilderness +wildfire +wildfowl +wildgrave +wilding +wildish +wildishly +wildishness +wildlife +wildlike +wildling +wildly +wildness +wildsome +wildwind +wile +wileful +wileless +wileproof +Wilfred +wilga +wilgers +Wilhelm +Wilhelmina +Wilhelmine +wilily +wiliness +wilk +wilkeite +wilkin +Wilkinson +Will +will +willable +willawa +willed +willedness +willemite +willer +willet +willey +willeyer +willful +willfully +willfulness +William +williamsite +Williamsonia +Williamsoniaceae +Willie +willie +willier +willies +willing +willinghearted +willinghood +willingly +willingness +williwaw +willmaker +willmaking +willness +willock +willow +willowbiter +willowed +willower +willowish +willowlike +willowware +willowweed +willowworm +willowwort +willowy +Willugbaeya +Willy +willy +willyard +willyart +willyer +wilsome +wilsomely +wilsomeness +Wilsonian +wilt +wilter +Wilton +wiltproof +Wiltshire +wily +wim +wimberry +wimble +wimblelike +wimbrel +wime +wimick +wimple +wimpleless +wimplelike +Win +win +winberry +wince +wincer +wincey +winch +wincher +Winchester +winchman +wincing +wincingly +Wind +wind +windable +windage +windbag +windbagged +windbaggery +windball +windberry +windbibber +windbore +windbracing +windbreak +Windbreaker +windbreaker +windbroach +windclothes +windcuffer +winddog +winded +windedly +windedness +winder +windermost +Windesheimer +windfall +windfallen +windfanner +windfirm +windfish +windflaw +windflower +windgall +windgalled +windhole +windhover +windigo +windily +windiness +winding +windingly +windingness +windjammer +windjamming +windlass +windlasser +windle +windles +windless +windlessly +windlessness +windlestrae +windlestraw +windlike +windlin +windling +windmill +windmilly +windock +windore +window +windowful +windowless +windowlessness +windowlet +windowlight +windowlike +windowmaker +windowmaking +windowman +windowpane +windowpeeper +windowshut +windowward +windowwards +windowwise +windowy +windpipe +windplayer +windproof +windring +windroad +windroot +windrow +windrower +windscreen +windshield +windshock +Windsor +windsorite +windstorm +windsucker +windtight +windup +windward +windwardly +windwardmost +windwardness +windwards +windway +windwayward +windwaywardly +windy +wine +wineball +wineberry +winebibber +winebibbery +winebibbing +Winebrennerian +wineconner +wined +wineglass +wineglassful +winegrower +winegrowing +winehouse +wineless +winelike +winemay +winepot +winer +winery +Winesap +wineshop +wineskin +winesop +winetaster +winetree +winevat +Winfred +winful +wing +wingable +wingbeat +wingcut +winged +wingedly +wingedness +winger +wingfish +winghanded +wingle +wingless +winglessness +winglet +winglike +wingman +wingmanship +wingpiece +wingpost +wingseed +wingspread +wingstem +wingy +Winifred +winish +wink +winkel +winkelman +winker +winkered +winking +winkingly +winkle +winklehawk +winklehole +winklet +winly +winna +winnable +winnard +Winnebago +Winnecowet +winnel +winnelstrae +winner +Winnie +winning +winningly +winningness +winnings +winninish +Winnipesaukee +winnle +winnonish +winnow +winnower +winnowing +winnowingly +Winona +winrace +winrow +winsome +winsomely +winsomeness +wint +winter +Winteraceae +winterage +Winteranaceae +winterberry +winterbloom +winterbourne +winterdykes +wintered +winterer +winterfeed +wintergreen +winterhain +wintering +winterish +winterishly +winterishness +winterization +winterize +winterkill +winterkilling +winterless +winterlike +winterliness +winterling +winterly +winterproof +wintersome +wintertide +wintertime +winterward +winterwards +winterweed +wintle +wintrify +wintrily +wintriness +wintrish +wintrous +wintry +Wintun +winy +winze +winzeman +wipe +wiper +wippen +wips +wir +wirable +wirble +wird +wire +wirebar +wirebird +wired +wiredancer +wiredancing +wiredraw +wiredrawer +wiredrawn +wirehair +wireless +wirelessly +wirelessness +wirelike +wiremaker +wiremaking +wireman +wiremonger +Wirephoto +wirepull +wirepuller +wirepulling +wirer +wiresmith +wirespun +wiretail +wireway +wireweed +wirework +wireworker +wireworking +wireworks +wireworm +wirily +wiriness +wiring +wirl +wirling +Wiros +wirr +wirra +wirrah +wirrasthru +wiry +wis +Wisconsinite +wisdom +wisdomful +wisdomless +wisdomproof +wisdomship +wise +wiseacre +wiseacred +wiseacredness +wiseacredom +wiseacreish +wiseacreishness +wiseacreism +wisecrack +wisecracker +wisecrackery +wisehead +wisehearted +wiseheartedly +wiseheimer +wiselike +wiseling +wisely +wiseman +wisen +wiseness +wisenheimer +wisent +wiser +wiseweed +wisewoman +wish +wisha +wishable +wishbone +wished +wishedly +wisher +wishful +wishfully +wishfulness +wishing +wishingly +wishless +wishly +wishmay +wishness +Wishoskan +Wishram +wisht +wishtonwish +Wisigothic +wisket +wiskinky +wisp +wispish +wisplike +wispy +wiss +wisse +wissel +wist +Wistaria +wistaria +wiste +wistened +Wisteria +wisteria +wistful +wistfully +wistfulness +wistit +wistiti +wistless +wistlessness +wistonwish +wit +witan +Witbooi +witch +witchbells +witchcraft +witched +witchedly +witchen +witchering +witchery +witchet +witchetty +witchhood +witching +witchingly +witchleaf +witchlike +witchman +witchmonger +witchuck +witchweed +witchwife +witchwoman +witchwood +witchwork +witchy +witcraft +wite +witeless +witenagemot +witepenny +witess +witful +with +withal +withamite +Withania +withdraught +withdraw +withdrawable +withdrawal +withdrawer +withdrawing +withdrawingness +withdrawment +withdrawn +withdrawnness +withe +withen +wither +witherband +withered +witheredly +witheredness +witherer +withergloom +withering +witheringly +witherite +witherly +withernam +withers +withershins +withertip +witherwards +witherweight +withery +withewood +withheld +withhold +withholdable +withholdal +withholder +withholdment +within +withindoors +withinside +withinsides +withinward +withinwards +withness +witholden +without +withoutdoors +withouten +withoutforth +withoutside +withoutwards +withsave +withstand +withstander +withstandingness +withstay +withstood +withstrain +withvine +withwind +withy +withypot +withywind +witjar +witless +witlessly +witlessness +witlet +witling +witloof +witmonger +witness +witnessable +witnessdom +witnesser +witney +witneyer +Witoto +witship +wittal +wittawer +witteboom +witted +witter +wittering +witticaster +wittichenite +witticism +witticize +wittified +wittily +wittiness +witting +wittingly +wittol +wittolly +witty +Witumki +witwall +witzchoura +wive +wiver +wivern +Wiyat +Wiyot +wiz +wizard +wizardess +wizardism +wizardlike +wizardly +wizardry +wizardship +wizen +wizened +wizenedness +wizier +wizzen +wloka +wo +woad +woader +woadman +woadwaxen +woady +woak +woald +woan +wob +wobbegong +wobble +wobbler +wobbliness +wobbling +wobblingly +wobbly +wobster +wocheinite +Wochua +wod +woddie +wode +Wodenism +wodge +wodgy +woe +woebegone +woebegoneness +woebegonish +woeful +woefully +woefulness +woehlerite +woesome +woevine +woeworn +woffler +woft +wog +wogiet +Wogulian +woibe +wokas +woke +wokowi +wold +woldlike +woldsman +woldy +wolf +wolfachite +wolfberry +wolfdom +wolfen +wolfer +Wolffia +Wolffian +Wolffianism +wolfhood +wolfhound +Wolfian +wolfish +wolfishly +wolfishness +wolfkin +wolfless +wolflike +wolfling +wolfram +wolframate +wolframic +wolframine +wolframinium +wolframite +wolfsbane +wolfsbergite +wolfskin +wolfward +wolfwards +wollastonite +wollomai +wollop +Wolof +wolter +wolve +wolveboon +wolver +wolverine +woman +womanbody +womandom +womanfolk +womanfully +womanhead +womanhearted +womanhood +womanhouse +womanish +womanishly +womanishness +womanism +womanist +womanity +womanization +womanize +womanizer +womankind +womanless +womanlike +womanliness +womanly +womanmuckle +womanness +womanpost +womanproof +womanship +womanways +womanwise +womb +wombat +wombed +womble +wombstone +womby +womenfolk +womenfolks +womenkind +womera +wommerala +won +wonder +wonderberry +wonderbright +wondercraft +wonderer +wonderful +wonderfully +wonderfulness +wondering +wonderingly +wonderland +wonderlandish +wonderless +wonderment +wondermonger +wondermongering +wondersmith +wondersome +wonderstrong +wonderwell +wonderwork +wonderworthy +wondrous +wondrously +wondrousness +wone +wonegan +wong +wonga +Wongara +wongen +wongshy +wongsky +woning +wonky +wonna +wonned +wonner +wonning +wonnot +wont +wonted +wontedly +wontedness +wonting +woo +wooable +wood +woodagate +woodbark +woodbin +woodbind +woodbine +woodbined +woodbound +woodburytype +woodbush +woodchat +woodchuck +woodcock +woodcockize +woodcracker +woodcraft +woodcrafter +woodcraftiness +woodcraftsman +woodcrafty +woodcut +woodcutter +woodcutting +wooded +wooden +woodendite +woodenhead +woodenheaded +woodenheadedness +woodenly +woodenness +woodenware +woodenweary +woodeny +woodfish +woodgeld +woodgrub +woodhack +woodhacker +woodhole +woodhorse +woodhouse +woodhung +woodine +woodiness +wooding +woodish +woodjobber +woodkern +woodknacker +woodland +woodlander +woodless +woodlessness +woodlet +woodlike +woodlocked +woodly +woodman +woodmancraft +woodmanship +woodmonger +woodmote +woodness +woodpeck +woodpecker +woodpenny +woodpile +woodprint +woodranger +woodreeve +woodrick +woodrock +woodroof +woodrow +woodrowel +Woodruff +woodruff +woodsere +woodshed +woodshop +Woodsia +woodside +woodsilver +woodskin +woodsman +woodspite +woodstone +woodsy +woodwall +woodward +Woodwardia +woodwardship +woodware +woodwax +woodwaxen +woodwise +woodwork +woodworker +woodworking +woodworm +woodwose +woodwright +woody +woodyard +wooer +woof +woofed +woofell +woofer +woofy +woohoo +wooing +wooingly +wool +woold +woolder +woolding +wooled +woolen +woolenet +woolenization +woolenize +wooler +woolert +woolfell +woolgatherer +woolgathering +woolgrower +woolgrowing +woolhead +wooliness +woollike +woolly +woollyhead +woollyish +woolman +woolpack +woolpress +woolsack +woolsey +woolshearer +woolshearing +woolshears +woolshed +woolskin +woolsorter +woolsorting +woolsower +woolstock +woolulose +Woolwa +woolwasher +woolweed +woolwheel +woolwinder +woolwork +woolworker +woolworking +woom +woomer +woomerang +woon +woons +woorali +woorari +woosh +wootz +woozle +woozy +wop +woppish +wops +worble +worcester +word +wordable +wordably +wordage +wordbook +wordbuilding +wordcraft +wordcraftsman +worded +Worden +worder +wordily +wordiness +wording +wordish +wordishly +wordishness +wordle +wordless +wordlessly +wordlessness +wordlike +wordlorist +wordmaker +wordmaking +wordman +wordmanship +wordmonger +wordmongering +wordmongery +wordplay +wordsman +wordsmanship +wordsmith +wordspite +wordster +Wordsworthian +Wordsworthianism +wordy +wore +work +workability +workable +workableness +workaday +workaway +workbag +workbasket +workbench +workbook +workbox +workbrittle +workday +worked +worker +workfellow +workfolk +workfolks +workgirl +workhand +workhouse +workhoused +working +workingly +workingman +workingwoman +workless +worklessness +workloom +workman +workmanlike +workmanlikeness +workmanliness +workmanly +workmanship +workmaster +workmistress +workout +workpan +workpeople +workpiece +workplace +workroom +works +workship +workshop +worksome +workstand +worktable +worktime +workways +workwise +workwoman +workwomanlike +workwomanly +worky +workyard +world +worlded +worldful +worldish +worldless +worldlet +worldlike +worldlily +worldliness +worldling +worldly +worldmaker +worldmaking +worldproof +worldquake +worldward +worldwards +worldway +worldy +worm +wormed +wormer +wormhole +wormholed +wormhood +Wormian +wormil +worming +wormless +wormlike +wormling +wormproof +wormroot +wormseed +wormship +wormweed +wormwood +wormy +worn +wornil +wornness +worral +worriable +worricow +worried +worriedly +worriedness +worrier +worriless +worriment +worrisome +worrisomely +worrisomeness +worrit +worriter +worry +worrying +worryingly +worryproof +worrywart +worse +worsement +worsen +worseness +worsening +worser +worserment +worset +worship +worshipability +worshipable +worshiper +worshipful +worshipfully +worshipfulness +worshipingly +worshipless +worshipworth +worshipworthy +worst +worsted +wort +worth +worthful +worthfulness +worthiest +worthily +worthiness +worthless +worthlessly +worthlessness +worthship +worthward +worthy +wosbird +wot +wote +wots +wottest +wotteth +woubit +wouch +wouf +wough +would +wouldest +wouldnt +wouldst +wound +woundability +woundable +woundableness +wounded +woundedly +wounder +woundily +wounding +woundingly +woundless +wounds +woundwort +woundworth +woundy +wourali +wourari +wournil +wove +woven +Wovoka +wow +wowser +wowserdom +wowserian +wowserish +wowserism +wowsery +wowt +woy +Woyaway +wrack +wracker +wrackful +Wraf +wraggle +wrainbolt +wrainstaff +wrainstave +wraith +wraithe +wraithlike +wraithy +wraitly +wramp +wran +wrang +wrangle +wrangler +wranglership +wranglesome +wranglingly +wrannock +wranny +wrap +wrappage +wrapped +wrapper +wrapperer +wrappering +wrapping +wraprascal +wrasse +wrastle +wrastler +wrath +wrathful +wrathfully +wrathfulness +wrathily +wrathiness +wrathlike +wrathy +wraw +wrawl +wrawler +wraxle +wreak +wreakful +wreakless +wreat +wreath +wreathage +wreathe +wreathed +wreathen +wreather +wreathingly +wreathless +wreathlet +wreathlike +wreathmaker +wreathmaking +wreathwise +wreathwork +wreathwort +wreathy +wreck +wreckage +wrecker +wreckfish +wreckful +wrecking +wrecky +Wren +wren +wrench +wrenched +wrencher +wrenchingly +wrenlet +wrenlike +wrentail +wrest +wrestable +wrester +wresting +wrestingly +wrestle +wrestler +wrestlerlike +wrestling +wretch +wretched +wretchedly +wretchedness +wretchless +wretchlessly +wretchlessness +wretchock +wricht +wrick +wride +wried +wrier +wriest +wrig +wriggle +wriggler +wrigglesome +wrigglingly +wriggly +wright +wrightine +wring +wringbolt +wringer +wringman +wringstaff +wrinkle +wrinkleable +wrinkled +wrinkledness +wrinkledy +wrinkleful +wrinkleless +wrinkleproof +wrinklet +wrinkly +wrist +wristband +wristbone +wristed +wrister +wristfall +wristikin +wristlet +wristlock +wristwork +writ +writability +writable +writation +writative +write +writee +writer +writeress +writerling +writership +writh +writhe +writhed +writhedly +writhedness +writhen +writheneck +writher +writhing +writhingly +writhy +writing +writinger +writmaker +writmaking +writproof +written +writter +wrive +wrizzled +wro +wrocht +wroke +wroken +wrong +wrongdoer +wrongdoing +wronged +wronger +wrongful +wrongfully +wrongfulness +wronghead +wrongheaded +wrongheadedly +wrongheadedness +wronghearted +wrongheartedly +wrongheartedness +wrongish +wrongless +wronglessly +wrongly +wrongness +wrongous +wrongously +wrongousness +wrongwise +Wronskian +wrossle +wrote +wroth +wrothful +wrothfully +wrothily +wrothiness +wrothly +wrothsome +wrothy +wrought +wrox +wrung +wrungness +wry +wrybill +wryly +wrymouth +wryneck +wryness +wrytail +Wu +Wuchereria +wud +wuddie +wudge +wudu +wugg +wulfenite +wulk +wull +wullawins +wullcat +Wullie +wulliwa +wumble +wumman +wummel +wun +Wundtian +wungee +wunna +wunner +wunsome +wup +wur +wurley +wurmal +Wurmian +wurrus +wurset +wurtzilite +wurtzite +Wurzburger +wurzel +wush +wusp +wuss +wusser +wust +wut +wuther +wuzu +wuzzer +wuzzle +wuzzy +wy +Wyandot +Wyandotte +Wycliffian +Wycliffism +Wycliffist +Wycliffite +wyde +wye +Wyethia +wyke +Wykehamical +Wykehamist +wyle +wyliecoat +wymote +wyn +wynd +wyne +wynkernel +wynn +Wyomingite +wyomingite +wype +wyson +wyss +wyve +wyver +X +x +xanthaline +xanthamic +xanthamide +xanthane +xanthate +xanthation +xanthein +xanthelasma +xanthelasmic +xanthelasmoidea +xanthene +Xanthian +xanthic +xanthide +Xanthidium +xanthin +xanthine +xanthinuria +xanthione +Xanthisma +xanthite +Xanthium +xanthiuria +xanthocarpous +Xanthocephalus +Xanthoceras +Xanthochroi +xanthochroia +Xanthochroic +xanthochroid +xanthochroism +xanthochromia +xanthochromic +xanthochroous +xanthocobaltic +xanthocone +xanthoconite +xanthocreatinine +xanthocyanopsia +xanthocyanopsy +xanthocyanopy +xanthoderm +xanthoderma +xanthodont +xanthodontous +xanthogen +xanthogenamic +xanthogenamide +xanthogenate +xanthogenic +xantholeucophore +xanthoma +xanthomata +xanthomatosis +xanthomatous +Xanthomelanoi +xanthomelanous +xanthometer +Xanthomonas +xanthomyeloma +xanthone +xanthophane +xanthophore +xanthophose +Xanthophyceae +xanthophyll +xanthophyllite +xanthophyllous +Xanthopia +xanthopia +xanthopicrin +xanthopicrite +xanthoproteic +xanthoprotein +xanthoproteinic +xanthopsia +xanthopsin +xanthopsydracia +xanthopterin +xanthopurpurin +xanthorhamnin +Xanthorrhiza +Xanthorrhoea +xanthorrhoea +xanthosiderite +xanthosis +Xanthosoma +xanthospermous +xanthotic +Xanthoura +xanthous +Xanthoxalis +xanthoxenite +xanthoxylin +xanthuria +xanthydrol +xanthyl +xarque +Xaverian +xebec +Xema +xenacanthine +Xenacanthini +xenagogue +xenagogy +Xenarchi +Xenarthra +xenarthral +xenarthrous +xenelasia +xenelasy +xenia +xenial +xenian +Xenicidae +Xenicus +xenium +xenobiosis +xenoblast +Xenocratean +Xenocratic +xenocryst +xenodochium +xenogamous +xenogamy +xenogenesis +xenogenetic +xenogenic +xenogenous +xenogeny +xenolite +xenolith +xenolithic +xenomania +xenomaniac +Xenomi +Xenomorpha +xenomorphic +xenomorphosis +xenon +xenoparasite +xenoparasitism +xenopeltid +Xenopeltidae +Xenophanean +xenophile +xenophilism +xenophobe +xenophobia +xenophobian +xenophobism +xenophoby +Xenophonic +Xenophontean +Xenophontian +Xenophontic +Xenophontine +Xenophora +xenophoran +Xenophoridae +xenophthalmia +xenophya +xenopodid +Xenopodidae +xenopodoid +Xenopsylla +xenopteran +Xenopteri +xenopterygian +Xenopterygii +Xenopus +Xenorhynchus +Xenos +xenosaurid +Xenosauridae +xenosauroid +Xenosaurus +xenotime +Xenurus +xenyl +xenylamine +xerafin +xeransis +Xeranthemum +xeranthemum +xerantic +xerarch +xerasia +Xeres +xeric +xerically +xeriff +xerocline +xeroderma +xerodermatic +xerodermatous +xerodermia +xerodermic +xerogel +xerography +xeroma +xeromata +xeromenia +xeromorph +xeromorphic +xeromorphous +xeromorphy +xeromyron +xeromyrum +xeronate +xeronic +xerophagia +xerophagy +xerophil +xerophile +xerophilous +xerophily +xerophobous +xerophthalmia +xerophthalmos +xerophthalmy +Xerophyllum +xerophyte +xerophytic +xerophytically +xerophytism +xeroprinting +xerosis +xerostoma +xerostomia +xerotes +xerotherm +xerotic +xerotocia +xerotripsis +Xerus +xi +Xicak +Xicaque +Ximenia +Xina +Xinca +Xipe +Xiphias +xiphias +xiphihumeralis +xiphiid +Xiphiidae +xiphiiform +xiphioid +xiphiplastra +xiphiplastral +xiphiplastron +xiphisterna +xiphisternal +xiphisternum +Xiphisura +xiphisuran +Xiphiura +Xiphius +xiphocostal +Xiphodon +Xiphodontidae +xiphodynia +xiphoid +xiphoidal +xiphoidian +xiphopagic +xiphopagous +xiphopagus +xiphophyllous +xiphosterna +xiphosternum +Xiphosura +xiphosuran +xiphosure +Xiphosuridae +xiphosurous +Xiphosurus +xiphuous +Xiphura +Xiphydria +xiphydriid +Xiphydriidae +Xiraxara +Xmas +xoana +xoanon +Xosa +xurel +xyla +xylan +Xylaria +Xylariaceae +xylate +Xyleborus +xylem +xylene +xylenol +xylenyl +xyletic +Xylia +xylic +xylidic +xylidine +Xylina +xylindein +xylinid +xylite +xylitol +xylitone +xylobalsamum +xylocarp +xylocarpous +Xylocopa +xylocopid +Xylocopidae +xylogen +xyloglyphy +xylograph +xylographer +xylographic +xylographical +xylographically +xylography +xyloid +xyloidin +xylol +xylology +xyloma +xylomancy +xylometer +xylon +xylonic +Xylonite +xylonitrile +Xylophaga +xylophagan +xylophage +xylophagid +Xylophagidae +xylophagous +Xylophagus +xylophilous +xylophone +xylophonic +xylophonist +Xylopia +xyloplastic +xylopyrography +xyloquinone +xylorcin +xylorcinol +xylose +xyloside +Xylosma +xylostroma +xylostromata +xylostromatoid +xylotile +xylotomist +xylotomous +xylotomy +Xylotrya +xylotypographic +xylotypography +xyloyl +xylyl +xylylene +xylylic +xyphoid +Xyrichthys +xyrid +Xyridaceae +xyridaceous +Xyridales +Xyris +xyst +xyster +xysti +xystos +xystum +xystus +Y +y +ya +yaba +yabber +yabbi +yabble +yabby +yabu +yacal +yacca +yachan +yacht +yachtdom +yachter +yachting +yachtist +yachtman +yachtmanship +yachtsman +yachtsmanlike +yachtsmanship +yachtswoman +yachty +yad +Yadava +yade +yaff +yaffingale +yaffle +yagger +yaghourt +yagi +Yagnob +yagourundi +Yagua +yagua +yaguarundi +yaguaza +yah +yahan +Yahgan +Yahganan +Yahoo +yahoo +Yahoodom +Yahooish +Yahooism +Yahuna +Yahuskin +Yahweh +Yahwism +Yahwist +Yahwistic +yair +yaird +yaje +yajeine +yajenine +Yajna +Yajnavalkya +yajnopavita +yak +Yaka +Yakala +yakalo +yakamik +Yakan +yakattalo +Yakima +yakin +yakka +yakman +Yakona +Yakonan +Yakut +Yakutat +yalb +Yale +yale +Yalensian +yali +yalla +yallaer +yallow +yam +Yamacraw +Yamamadi +yamamai +yamanai +yamaskite +Yamassee +Yamato +Yamel +yamen +Yameo +yamilke +yammadji +yammer +yamp +yampa +yamph +yamshik +yamstchik +yan +Yana +Yanan +yancopin +yander +yang +yangtao +yank +Yankee +Yankeedom +Yankeefy +Yankeeism +Yankeeist +Yankeeize +Yankeeland +Yankeeness +yanking +Yankton +Yanktonai +yanky +Yannigan +Yao +yaoort +yaourti +yap +yapa +yaply +Yapman +yapness +yapok +yapp +yapped +yapper +yappiness +yapping +yappingly +yappish +yappy +yapster +Yaqui +Yaquina +yar +yarak +yaray +yarb +Yarborough +yard +yardage +yardang +yardarm +yarder +yardful +yarding +yardkeep +yardland +yardman +yardmaster +yardsman +yardstick +yardwand +yare +yareta +yark +Yarkand +yarke +yarl +yarly +yarm +yarn +yarnen +yarner +yarnwindle +yarpha +yarr +yarraman +yarran +yarringle +yarrow +yarth +yarthen +Yaru +Yarura +Yaruran +Yaruro +yarwhelp +yarwhip +yas +yashiro +yashmak +Yasht +Yasna +yat +yataghan +yatalite +yate +yati +Yatigan +yatter +Yatvyag +Yauapery +yaud +yauld +yaupon +yautia +yava +Yavapai +yaw +yawl +yawler +yawlsman +yawmeter +yawn +yawner +yawney +yawnful +yawnfully +yawnily +yawniness +yawning +yawningly +yawnproof +yawnups +yawny +yawp +yawper +yawroot +yaws +yawweed +yawy +yaxche +yaya +Yazdegerdian +Yazoo +ycie +yday +ye +yea +yeah +yealing +yean +yeanling +year +yeara +yearbird +yearbook +yeard +yearday +yearful +yearling +yearlong +yearly +yearn +yearnful +yearnfully +yearnfulness +yearning +yearnling +yearock +yearth +yeast +yeastily +yeastiness +yeasting +yeastlike +yeasty +yeat +yeather +yed +yede +yee +yeel +yeelaman +yees +yegg +yeggman +yeguita +yeld +yeldrin +yeldrock +yelk +yell +yeller +yelling +yelloch +yellow +yellowammer +yellowback +yellowbelly +yellowberry +yellowbill +yellowbird +yellowcrown +yellowcup +yellowfin +yellowfish +yellowhammer +yellowhead +yellowing +yellowish +yellowishness +Yellowknife +yellowlegs +yellowly +yellowness +yellowroot +yellowrump +yellows +yellowseed +yellowshank +yellowshanks +yellowshins +yellowtail +yellowthorn +yellowthroat +yellowtop +yellowware +yellowweed +yellowwood +yellowwort +yellowy +yelm +yelmer +yelp +yelper +yelt +Yemen +Yemeni +Yemenic +Yemenite +yen +yender +Yengee +Yengeese +yeni +Yenisei +Yeniseian +yenite +yentnite +yeo +yeoman +yeomaness +yeomanette +yeomanhood +yeomanlike +yeomanly +yeomanry +yeomanwise +yeorling +yeowoman +yep +yer +Yerava +Yeraver +yerb +yerba +yercum +yerd +yere +yerga +yerk +yern +yerth +yes +yese +Yeshibah +Yeshiva +yeso +yesso +yest +yester +yesterday +yestereve +yestereven +yesterevening +yestermorn +yestermorning +yestern +yesternight +yesternoon +yesterweek +yesteryear +yestreen +yesty +yet +yeta +yetapa +yeth +yether +yetlin +yeuk +yeukieness +yeuky +yeven +yew +yex +yez +Yezdi +Yezidi +yezzy +ygapo +Yid +Yiddish +Yiddisher +Yiddishism +Yiddishist +yield +yieldable +yieldableness +yieldance +yielden +yielder +yielding +yieldingly +yieldingness +yieldy +yigh +Yikirgaulit +Yildun +yill +yilt +Yin +yin +yince +yinst +yip +yird +yirk +yirm +yirmilik +yirn +yirr +yirth +yis +yite +ym +yn +ynambu +yo +yobi +yocco +yochel +yock +yockel +yodel +yodeler +yodelist +yodh +yoe +yoga +yogasana +yogh +yoghurt +yogi +yogin +yogism +yogist +yogoite +yohimbe +yohimbi +yohimbine +yohimbinization +yohimbinize +yoi +yoick +yoicks +yojan +yojana +Yojuane +yok +yoke +yokeable +yokeableness +yokeage +yokefellow +yokel +yokeldom +yokeless +yokelish +yokelism +yokelry +yokemate +yokemating +yoker +yokewise +yokewood +yoking +Yokuts +yoky +yolden +Yoldia +yoldring +yolk +yolked +yolkiness +yolkless +yolky +yom +yomer +Yomud +yon +yoncopin +yond +yonder +Yonkalla +yonner +yonside +yont +yook +yoop +yor +yore +yoretime +york +Yorker +yorker +Yorkish +Yorkist +Yorkshire +Yorkshireism +Yorkshireman +Yoruba +Yoruban +yot +yotacism +yotacize +yote +you +youd +youden +youdendrift +youdith +youff +youl +young +youngberry +younger +younghearted +youngish +younglet +youngling +youngly +youngness +youngster +youngun +younker +youp +your +yourn +yours +yoursel +yourself +yourselves +youse +youth +youthen +youthful +youthfullity +youthfully +youthfulness +youthhead +youthheid +youthhood +youthily +youthless +youthlessness +youthlike +youthlikeness +youthsome +youthtide +youthwort +youthy +youve +youward +youwards +youze +yoven +yow +yowie +yowl +yowler +yowley +yowlring +yowt +yox +yoy +yperite +Yponomeuta +Yponomeutid +Yponomeutidae +ypsiliform +ypsiloid +Ypurinan +Yquem +yr +ytterbia +ytterbic +ytterbium +yttria +yttrialite +yttric +yttriferous +yttrious +yttrium +yttrocerite +yttrocolumbite +yttrocrasite +yttrofluorite +yttrogummite +yttrotantalite +Yuan +yuan +Yuapin +yuca +Yucatec +Yucatecan +Yucateco +Yucca +yucca +Yuchi +yuck +yuckel +yucker +yuckle +yucky +Yuechi +yuft +Yuga +yugada +Yugoslav +Yugoslavian +Yugoslavic +yuh +Yuit +Yukaghir +Yuki +Yukian +yukkel +yulan +yule +yuleblock +yuletide +Yuma +Yuman +yummy +Yun +Yunca +Yuncan +yungan +Yunnanese +Yurak +Yurok +yurt +yurta +Yurucare +Yurucarean +Yurucari +Yurujure +Yuruk +Yuruna +Yurupary +yus +yusdrum +Yustaga +yutu +yuzlik +yuzluk +Yvonne +Z +z +za +Zabaean +zabaglione +Zabaism +Zaberma +zabeta +Zabian +Zabism +zabra +zabti +zabtie +zac +zacate +Zacatec +Zacateco +zacaton +Zach +Zachariah +zachun +zad +Zadokite +zadruga +zaffar +zaffer +zafree +zag +zagged +Zaglossus +zaibatsu +zain +Zaitha +zak +zakkeu +Zaklohpakap +zalambdodont +Zalambdodonta +Zalophus +zaman +zamang +zamarra +zamarro +Zambal +Zambezian +zambo +zamboorak +Zamenis +Zamia +Zamiaceae +Zamicrus +zamindar +zamindari +zamorin +zamouse +Zan +Zanclidae +Zanclodon +Zanclodontidae +Zande +zander +zandmole +zanella +Zaniah +Zannichellia +Zannichelliaceae +Zanonia +zant +zante +Zantedeschia +zantewood +Zanthorrhiza +Zanthoxylaceae +Zanthoxylum +zanthoxylum +Zantiot +zantiote +zany +zanyish +zanyism +zanyship +Zanzalian +zanze +Zanzibari +Zapara +Zaparan +Zaparo +Zaparoan +zapas +zapatero +zaphara +Zaphetic +zaphrentid +Zaphrentidae +Zaphrentis +zaphrentoid +Zapodidae +Zapodinae +Zaporogian +Zaporogue +zapota +Zapotec +Zapotecan +Zapoteco +zaptiah +zaptieh +Zaptoeca +zapupe +Zapus +zaqqum +Zaque +zar +zarabanda +Zaramo +Zarathustrian +Zarathustrianism +Zarathustrism +zaratite +Zardushti +zareba +Zarema +zarf +zarnich +zarp +zarzuela +zat +zati +zattare +Zaurak +Zauschneria +Zavijava +zax +zayat +zayin +Zea +zeal +Zealander +zealful +zealless +zeallessness +zealot +zealotic +zealotical +zealotism +zealotist +zealotry +zealous +zealously +zealousness +zealousy +zealproof +zebra +zebraic +zebralike +zebrass +zebrawood +Zebrina +zebrine +zebrinny +zebroid +zebrula +zebrule +zebu +zebub +Zebulunite +zeburro +zecchini +zecchino +zechin +Zechstein +zed +zedoary +zee +zeed +Zeelander +Zeguha +zehner +Zeidae +zein +zeism +zeist +Zeke +zel +Zelanian +zelator +zelatrice +zelatrix +Zelkova +Zeltinger +zemeism +zemi +zemimdari +zemindar +zemmi +zemni +zemstroist +zemstvo +Zen +Zenaga +Zenaida +Zenaidinae +Zenaidura +zenana +Zend +Zendic +zendician +zendik +zendikite +Zenelophon +zenick +zenith +zenithal +zenithward +zenithwards +Zenobia +zenocentric +zenographic +zenographical +zenography +Zenonian +Zenonic +zenu +Zeoidei +zeolite +zeolitic +zeolitization +zeolitize +zeoscope +Zep +zepharovichite +zephyr +Zephyranthes +zephyrean +zephyrless +zephyrlike +zephyrous +zephyrus +zephyry +Zeppelin +zeppelin +zequin +zer +zerda +Zerma +zermahbub +zero +zeroaxial +zeroize +zerumbet +zest +zestful +zestfully +zestfulness +zesty +zeta +zetacism +zetetic +Zeuctocoelomata +zeuctocoelomatic +zeuctocoelomic +Zeuglodon +zeuglodon +zeuglodont +Zeuglodonta +Zeuglodontia +Zeuglodontidae +zeuglodontoid +zeugma +zeugmatic +zeugmatically +Zeugobranchia +Zeugobranchiata +zeunerite +Zeus +Zeuxian +Zeuzera +zeuzerian +Zeuzeridae +Zhmud +ziamet +ziara +ziarat +zibeline +zibet +zibethone +zibetone +zibetum +ziega +zieger +zietrisikite +ziffs +zig +ziganka +ziggurat +zigzag +zigzagged +zigzaggedly +zigzaggedness +zigzagger +zigzaggery +zigzaggy +zigzagwise +zihar +zikurat +Zilla +zillah +zimarra +zimb +zimbabwe +zimbalon +zimbaloon +zimbi +zimentwater +zimme +Zimmerwaldian +Zimmerwaldist +zimmi +zimmis +zimocca +zinc +Zincalo +zincate +zincic +zincide +zinciferous +zincification +zincify +zincing +zincite +zincize +zincke +zincky +zinco +zincograph +zincographer +zincographic +zincographical +zincography +zincotype +zincous +zincum +zincuret +zinfandel +zing +zingaresca +zingel +zingerone +Zingiber +Zingiberaceae +zingiberaceous +zingiberene +zingiberol +zingiberone +zink +zinkenite +Zinnia +zinnwaldite +zinsang +zinyamunga +Zinzar +Zinziberaceae +zinziberaceous +Zion +Zionism +Zionist +Zionistic +Zionite +Zionless +Zionward +zip +Zipa +ziphian +Ziphiidae +Ziphiinae +ziphioid +Ziphius +Zipper +zipper +zipping +zippingly +zippy +Zips +zira +zirai +Zirak +Zirbanit +zircite +zircofluoride +zircon +zirconate +zirconia +zirconian +zirconic +zirconiferous +zirconifluoride +zirconium +zirconofluoride +zirconoid +zirconyl +Zirian +Zirianian +zirkelite +zither +zitherist +Zizania +Zizia +Zizyphus +zizz +zloty +Zmudz +zo +Zoa +zoa +zoacum +Zoanthacea +zoanthacean +Zoantharia +zoantharian +zoanthid +Zoanthidae +Zoanthidea +zoanthodeme +zoanthodemic +zoanthoid +zoanthropy +Zoanthus +Zoarces +zoarcidae +zoaria +zoarial +Zoarite +zoarium +zobo +zobtenite +zocco +zoccolo +zodiac +zodiacal +zodiophilous +zoea +zoeaform +zoeal +zoeform +zoehemera +zoehemerae +zoetic +zoetrope +zoetropic +zogan +zogo +Zohak +Zoharist +Zoharite +zoiatria +zoiatrics +zoic +zoid +zoidiophilous +zoidogamous +Zoilean +Zoilism +Zoilist +zoisite +zoisitization +zoism +zoist +zoistic +zokor +Zolaesque +Zolaism +Zolaist +Zolaistic +Zolaize +zoll +zolle +Zollernia +zollpfund +zolotink +zolotnik +zombi +zombie +zombiism +zomotherapeutic +zomotherapy +zonal +zonality +zonally +zonar +Zonaria +zonary +zonate +zonated +zonation +zone +zoned +zoneless +zonelet +zonelike +zonesthesia +Zongora +zonic +zoniferous +zoning +zonite +Zonites +zonitid +Zonitidae +Zonitoides +zonochlorite +zonociliate +zonoid +zonolimnetic +zonoplacental +Zonoplacentalia +zonoskeleton +Zonotrichia +Zonta +Zontian +zonular +zonule +zonulet +zonure +zonurid +Zonuridae +zonuroid +Zonurus +zoo +zoobenthos +zooblast +zoocarp +zoocecidium +zoochemical +zoochemistry +zoochemy +Zoochlorella +zoochore +zoocoenocyte +zoocultural +zooculture +zoocurrent +zoocyst +zoocystic +zoocytial +zoocytium +zoodendria +zoodendrium +zoodynamic +zoodynamics +zooecia +zooecial +zooecium +zooerastia +zooerythrin +zoofulvin +zoogamete +zoogamous +zoogamy +zoogene +zoogenesis +zoogenic +zoogenous +zoogeny +zoogeographer +zoogeographic +zoogeographical +zoogeographically +zoogeography +zoogeological +zoogeologist +zoogeology +zoogloea +zoogloeal +zoogloeic +zoogonic +zoogonidium +zoogonous +zoogony +zoograft +zoografting +zoographer +zoographic +zoographical +zoographically +zoographist +zoography +zooid +zooidal +zooidiophilous +zooks +zoolater +zoolatria +zoolatrous +zoolatry +zoolite +zoolith +zoolithic +zoolitic +zoologer +zoologic +zoological +zoologically +zoologicoarchaeologist +zoologicobotanical +zoologist +zoologize +zoology +zoom +zoomagnetic +zoomagnetism +zoomancy +zoomania +zoomantic +zoomantist +Zoomastigina +Zoomastigoda +zoomechanical +zoomechanics +zoomelanin +zoometric +zoometry +zoomimetic +zoomimic +zoomorph +zoomorphic +zoomorphism +zoomorphize +zoomorphy +zoon +zoonal +zoonerythrin +zoonic +zoonist +zoonite +zoonitic +zoonomia +zoonomic +zoonomical +zoonomist +zoonomy +zoonosis +zoonosologist +zoonosology +zoonotic +zoons +zoonule +zoopaleontology +zoopantheon +zooparasite +zooparasitic +zoopathological +zoopathologist +zoopathology +zoopathy +zooperal +zooperist +zoopery +Zoophaga +zoophagan +Zoophagineae +zoophagous +zoopharmacological +zoopharmacy +zoophile +zoophilia +zoophilic +zoophilism +zoophilist +zoophilite +zoophilitic +zoophilous +zoophily +zoophobia +zoophobous +zoophoric +zoophorus +zoophysical +zoophysics +zoophysiology +Zoophyta +zoophytal +zoophyte +zoophytic +zoophytical +zoophytish +zoophytography +zoophytoid +zoophytological +zoophytologist +zoophytology +zooplankton +zooplanktonic +zooplastic +zooplasty +zoopraxiscope +zoopsia +zoopsychological +zoopsychologist +zoopsychology +zooscopic +zooscopy +zoosis +zoosmosis +zoosperm +zoospermatic +zoospermia +zoospermium +zoosphere +zoosporange +zoosporangia +zoosporangial +zoosporangiophore +zoosporangium +zoospore +zoosporic +zoosporiferous +zoosporocyst +zoosporous +zootaxy +zootechnic +zootechnics +zootechny +zooter +zoothecia +zoothecial +zoothecium +zootheism +zootheist +zootheistic +zootherapy +zoothome +zootic +Zootoca +zootomic +zootomical +zootomically +zootomist +zootomy +zoototemism +zootoxin +zootrophic +zootrophy +zootype +zootypic +zooxanthella +zooxanthellae +zooxanthin +zoozoo +zopilote +Zoque +Zoquean +Zoraptera +zorgite +zoril +zorilla +Zorillinae +zorillo +Zoroastrian +Zoroastrianism +Zoroastrism +Zorotypus +zorrillo +zorro +Zosma +zoster +Zostera +Zosteraceae +zosteriform +Zosteropinae +Zosterops +Zouave +zounds +zowie +Zoysia +Zubeneschamali +zuccarino +zucchetto +zucchini +zudda +zugtierlast +zugtierlaster +zuisin +Zuleika +Zulhijjah +Zulinde +Zulkadah +Zulu +Zuludom +Zuluize +zumatic +zumbooruk +Zuni +Zunian +zunyite +zupanate +Zutugil +zuurveldt +zuza +zwanziger +Zwieback +zwieback +Zwinglian +Zwinglianism +Zwinglianist +zwitter +zwitterion +zwitterionic +zyga +zygadenine +Zygadenus +Zygaena +zygaenid +Zygaenidae +zygal +zygantra +zygantrum +zygapophyseal +zygapophysis +zygion +zygite +Zygnema +Zygnemaceae +Zygnemales +Zygnemataceae +zygnemataceous +Zygnematales +zygobranch +Zygobranchia +Zygobranchiata +zygobranchiate +Zygocactus +zygodactyl +Zygodactylae +Zygodactyli +zygodactylic +zygodactylism +zygodactylous +zygodont +zygolabialis +zygoma +zygomata +zygomatic +zygomaticoauricular +zygomaticoauricularis +zygomaticofacial +zygomaticofrontal +zygomaticomaxillary +zygomaticoorbital +zygomaticosphenoid +zygomaticotemporal +zygomaticum +zygomaticus +zygomaxillare +zygomaxillary +zygomorphic +zygomorphism +zygomorphous +zygomycete +Zygomycetes +zygomycetous +zygon +zygoneure +zygophore +zygophoric +Zygophyceae +zygophyceous +Zygophyllaceae +zygophyllaceous +Zygophyllum +zygophyte +zygopleural +Zygoptera +Zygopteraceae +zygopteran +zygopterid +Zygopterides +Zygopteris +zygopteron +zygopterous +Zygosaccharomyces +zygose +zygosis +zygosperm +zygosphenal +zygosphene +zygosphere +zygosporange +zygosporangium +zygospore +zygosporic +zygosporophore +zygostyle +zygotactic +zygotaxis +zygote +zygotene +zygotic +zygotoblast +zygotoid +zygotomere +zygous +zygozoospore +zymase +zyme +zymic +zymin +zymite +zymogen +zymogene +zymogenesis +zymogenic +zymogenous +zymoid +zymologic +zymological +zymologist +zymology +zymolyis +zymolysis +zymolytic +zymome +zymometer +zymomin +zymophore +zymophoric +zymophosphate +zymophyte +zymoplastic +zymoscope +zymosimeter +zymosis +zymosterol +zymosthenic +zymotechnic +zymotechnical +zymotechnics +zymotechny +zymotic +zymotically +zymotize +zymotoxic +zymurgy +Zyrenian +Zyrian +Zyryan +zythem +Zythia +zythum +Zyzomys +Zyzzogeton diff --git a/libs/Monkeys/DuplicateException.php b/libs/Monkeys/DuplicateException.php index 2a9adf4..0790b3d 100644 --- a/libs/Monkeys/DuplicateException.php +++ b/libs/Monkeys/DuplicateException.php @@ -1,4 +1,12 @@ 1) { $this->_items = array_fill(0, $numItems- 1, 0); } else { $this->_items = array(); diff --git a/libs/Monkeys/Ldap.php b/libs/Monkeys/Ldap.php index 2db7fc3..cbdf441 100644 --- a/libs/Monkeys/Ldap.php +++ b/libs/Monkeys/Ldap.php @@ -1,7 +1,18 @@ _ldapConfig = Zend_Registry::get('config')->ldap; @@ -37,16 +50,48 @@ class Monkeys_Ldap public function get($dn) { if (!$resultId = @ldap_search($this->_dp, $dn, "(&(objectClass=*))")) { - throw new Exception('Could not retrieve record to LDAP server (1): ' . ldap_error($this->_dp)); + throw new Exception('Could not retrieve record from LDAP server (' . self::EXCEPTION_SEARCH . '): ' + . ldap_error($this->_dp), self::EXCEPTION_SEARCH); } if (!$result = @ldap_get_entries($this->_dp, $resultId)) { - throw new Exception('Could not retrieve record to LDAP server (2): ' . ldap_error($this->_dp)); + throw new Exception('Could not retrieve record from LDAP server (' . self::EXCEPTION_GET_ENTRIES . '): ' + . ldap_error($this->_dp), self::EXCEPTION_GET_ENTRIES); } return $result[0]; } + public function search($baseDn, $field, $value) + { + if (!$resultId = @ldap_search($this->_dp, $baseDn, "(&(objectClass=*)($field=$value))")) { + throw new Exception('Could not retrieve record from LDAP server (' . self::EXCEPTION_SEARCH . '): ' + . ldap_error($this->_dp), self::EXCEPTION_SEARCH); + } + + if (!$result = @ldap_get_entries($this->_dp, $resultId)) { + throw new Exception('Could not retrieve record from LDAP server (' . self::EXCEPTION_GET_ENTRIES . '): ' + . ldap_error($this->_dp), self::EXCEPTION_GET_ENTRIES); + } + + return $result[0]; + } + + public function getAll($baseDn) + { + if (!$resultId = @ldap_search($this->_dp, $baseDn, "(&(objectClass=*))")) { + throw new Exception('Could not retrieve record from LDAP server (' . self::EXCEPTION_SEARCH . '): ' + . ldap_error($this->_dp), self::EXCEPTION_SEARCH); + } + + if (!$result = @ldap_get_entries($this->_dp, $resultId)) { + throw new Exception('Could not retrieve record from LDAP server (' . self::EXCEPTION_GET_ENTRIES . '): ' + . ldap_error($this->_dp), self::EXCEPTION_GET_ENTRIES); + } + + return $result; + } + /** * lastname (sn) is required for the "inetOrgPerson" schema */ @@ -58,7 +103,7 @@ class Monkeys_Ldap 'givenName' => $user->firstname, 'sn' => $user->lastname, 'mail' => $user->email, - 'userPassword' => $user->password, + 'userPassword' => $this->_hashPassword($user->password), 'objectclass' => 'inetOrgPerson', ); if (!@ldap_add($this->_dp, $dn, $info) && ldap_error($this->_dp) != 'Success') { @@ -66,7 +111,7 @@ class Monkeys_Ldap } } - public function modify(User $user) + public function modify(Users_Model_User $user, $newPassword = false) { $dn = 'cn=' . $user->username . ',' . $this->_ldapConfig->baseDn; $info = array( @@ -74,14 +119,16 @@ class Monkeys_Ldap 'givenName' => $user->firstname, 'sn' => $user->lastname, 'mail' => $user->email, - 'objectclass' => 'inetOrgPerson', ); + if ($newPassword) { + $info['userPassword'] = $this->_hashPassword($newPassword); + } if (!@ldap_modify($this->_dp, $dn, $info) && ldap_error($this->_dp) != 'Success') { throw new Exception('Could not modify record in LDAP server: ' . ldap_error($this->_dp)); } } - public function modifyUsername(User $user, $oldUsername) + public function modifyUsername(Users_Model_User $user, $oldUsername) { $dn = 'cn=' . $oldUsername . ',' . $this->_ldapConfig->baseDn; $newRdn = 'cn=' . $user->username; @@ -90,11 +137,30 @@ class Monkeys_Ldap } } - public function delete($username) + public function delete(Users_Model_User $user) { - $dn = "cn=$username," . $this->_ldapConfig->baseDn; + $dn = "cn={$user->username}," . $this->_ldapConfig->baseDn; if (!@ldap_delete($this->_dp, $dn) && ldap_error($this->_dp) != 'Success') { throw new Exception('Could not delete record from LDAP server: ' . ldap_error($this->_dp)); } } + + private function _hashPassword($password) + { + if ($algorithm = $this->_ldapConfig->passwordHashing) { + if (!@is_executable($this->_slappasswd)) { + throw new Exception($this->_slappasswd . ' doesn\'t exist, or is not executable.'); + } + + $trash = array(); + $password = escapeshellarg($password); + if (!$returnVar = @exec("{$this->_slappasswd} -h " . '{' . $algorithm . '}' . " -s $password")) { + throw new Exception("There was a problem executing {$this->_slappasswd}"); + } + + $password = $returnVar; + } + + return $password; + } } diff --git a/libs/Monkeys/Lib.php b/libs/Monkeys/Lib.php index 68611d9..2335ee9 100644 --- a/libs/Monkeys/Lib.php +++ b/libs/Monkeys/Lib.php @@ -1,5 +1,13 @@ log('Created Lucene index file', Zend_Log::INFO); - } - - return $index; - } - - /** - * @throws Zend_Search_Lucene_exception - * @return void - */ - public static function indexArticle(Model_Blog $blog, Zend_Db_Table_Rowset $tagsSet, $isNew) - { - if ($blog->draft || !$blog->hasBeenPublished()) { - return; - } - - $tags = array(); - foreach ($tagsSet as $tag) { - $tags[] = $tag->tag; - } - $tags = implode(' ', $tags); - - $index = self::getIndex(); - - if (!$isNew) { - $existingDocIds = $index->termDocs(new Zend_Search_Lucene_Index_Term($blog->id, 'blog_id')); - if ($existingDocIds) { - $index->delete($existingDocIds[0]); + if (!@self::$_index) { + try { + self::$_index = Zend_Search_Lucene::open(APP_DIR . self::LUCENE_DIR); + } catch (Zend_Search_Lucene_Exception $e) { + self::$_index = Zend_Search_Lucene::create(APP_DIR . self::LUCENE_DIR); + Zend_Registry::get('logger')->log('Created Lucene index file', Zend_Log::INFO); } } - // I won't be using Zend_Search_Lucene_Document_HTML 'cause articles are not full HTML documents - $doc = new Zend_Search_Lucene_Document(); - - $doc->addField(Zend_Search_Lucene_Field::Keyword('blog_id', $blog->id)); - - $doc->addField(Zend_Search_Lucene_Field::Text('title', $blog->title, 'utf-8')); - $doc->addField(Zend_Search_Lucene_Field::Text('excerpt', $blog->excerpt, 'utf-8')); - $doc->addField(Zend_Search_Lucene_Field::Unstored('tag', $tags, 'utf-8')); - $doc->addField(Zend_Search_Lucene_Field::Unstored('contents', $blog->getContentWithoutTags(), 'utf-8')); - $index->addDocument($doc); - $index->commit(); - } - - public static function unIndexArticle(Blog $blog) - { - try { - $index = self::getIndex(); - } catch (Zend_Search_Lucene_Exception $e) { - return; - } - - $existingDocIds = $index->termDocs(new Zend_Search_Lucene_Index_Term($blog->id, 'blog_id')); - - if ($existingDocIds) { - $index->delete($existingDocIds[0]); - } + return self::$_index; } public static function optimizeIndex() @@ -86,4 +36,59 @@ class Monkeys_Lucene $index = self::getIndex(); $index->optimize(); } + + public static function checkPcreUtf8Support() + { + if (@preg_match('/\pL/u', 'a') == 1) { + return true; + } else { + return false; + } + } + + public static function clearIndex() + { + // need to remove the locks, otherwise error under windows + self::getIndex()->removeReference(); + self::$_index = null; + + self::_rmdirr(APP_DIR . self::LUCENE_DIR); + } + + /** * Delete a file, or a folder and its contents + * + * @author Aidan Lister + * @version 1.0.1 + * @param string $dirname Directory to delete + * @return bool Returns TRUE on success, FALSE on failure + */ + private static function _rmdirr($dirname) + { + // Sanity check + if (!file_exists($dirname)) { + return false; + } + // Simple delete for a file + if (is_file($dirname)) { + return unlink($dirname); + } + // Loop through the folder + $dir = dir($dirname); + while (false !== $entry = $dir->read()) { + // Skip pointers and dot directories + if (substr($entry, 0, 1) == '.') { + continue; + } + // Deep delete directories + if (is_dir("$dirname/$entry")) { + self::_rmdirr("$dirname/$entry"); + } else { + unlink("$dirname/$entry"); + } + } + // Clean up + $dir->close(); + + return true; + } } diff --git a/libs/Monkeys/Model/Identifiable.php b/libs/Monkeys/Model/Identifiable.php new file mode 100644 index 0000000..a5e86bb --- /dev/null +++ b/libs/Monkeys/Model/Identifiable.php @@ -0,0 +1,14 @@ + clears already loaded data when adding new files + * 'scan' => searches for translation files using the LOCALE constants + * 'locale' => the actual set locale to use + * @var array + */ + protected $_options = array( + 'clear' => false, + 'disableNotices' => false, + 'ignore' => '.', + 'locale' => 'auto', + 'log' => null, + 'logMessage' => "Untranslated message within '%locale%': %message%", + 'logUntranslated' => false, + 'scan' => null + ); + + /** + * Translation table + * @var array + */ + protected $_translate = array(); + + /** + * Generates the adapter + * + * @param string|array $data Translation data or filename for this adapter + * @param string|Zend_Locale $locale (optional) Locale/Language to set, identical with Locale + * identifiers see Zend_Locale for more information + * @param array $options (optional) Options for the adaptor + * @throws Zend_Translate_Exception + * @return void + */ + public function __construct($data, $locale = null, array $options = array()) + { + if (isset(self::$_cache)) { + $id = 'Zend_Translate_' . $this->toString() . '_Options'; + $result = self::$_cache->load($id); + if ($result) { + $this->_options = unserialize($result); + } + } + + if (($locale === "auto") or ($locale === null)) { + $this->_automatic = true; + } else { + $this->_automatic = false; + } + + $this->addTranslation($data, $locale, $options); + if ($this->getLocale() !== (string) $locale) { + $this->setLocale($locale); + } + } + + /** + * Sets new adapter options + * + * @param array $options Adapter options + * @throws Zend_Translate_Exception + * @return Zend_Translate_Adapter Provides fluent interface + */ + public function setOptions(array $options = array()) + { + $change = false; + $locale = null; + foreach ($options as $key => $option) { + if ($key == 'locale') { + $locale = $option; + } else if ((isset($this->_options[$key]) and ($this->_options[$key] != $option)) or + !isset($this->_options[$key])) { + if (($key == 'log') && !($option instanceof Zend_Log)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Instance of Zend_Log expected for option log'); + } + + $this->_options[$key] = $option; + $change = true; + } + } + + if ($locale !== null) { + $this->setLocale($locale); + } + + if (isset(self::$_cache) and ($change == true)) { + $id = 'Zend_Translate_' . $this->toString() . '_Options'; + self::$_cache->save( serialize($this->_options), $id, array('Zend_Translate')); + } + + return $this; + } + + /** + * Returns the adapters name and it's options + * + * @param string|null $optionKey String returns this option + * null returns all options + * @return integer|string|array|null + */ + public function getOptions($optionKey = null) + { + if ($optionKey === null) { + return $this->_options; + } + + if (isset($this->_options[$optionKey]) === true) { + return $this->_options[$optionKey]; + } + + return null; + } + + /** + * Gets locale + * + * @return Zend_Locale|string|null + */ + public function getLocale() + { + return $this->_options['locale']; + } + + /** + * Sets locale + * + * @param string|Zend_Locale $locale Locale to set + * @throws Zend_Translate_Exception + * @return Zend_Translate_Adapter Provides fluent interface + */ + public function setLocale($locale) + { + if (($locale === "auto") or ($locale === null)) { + $this->_automatic = true; + } else { + $this->_automatic = false; + } + + try { + $locale = Zend_Locale::findLocale($locale); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception("The given Language ({$locale}) does not exist"); + } + + if (!isset($this->_translate[$locale])) { + $temp = explode('_', $locale); + if (!isset($this->_translate[$temp[0]]) and !isset($this->_translate[$locale])) { + if (!$this->_options['disableNotices']) { + if ($this->_options['log']) { + $this->_options['log']->notice("The language '{$locale}' has to be added before it can be used."); + } else { + trigger_error("The language '{$locale}' has to be added before it can be used.", E_USER_NOTICE); + } + } + } + + $locale = $temp[0]; + } + + if (empty($this->_translate[$locale])) { + if (!$this->_options['disableNotices']) { + if ($this->_options['log']) { + $this->_options['log']->notice("No translation for the language '{$locale}' available."); + } else { + trigger_error("No translation for the language '{$locale}' available.", E_USER_NOTICE); + } + } + } + + if ($this->_options['locale'] != $locale) { + $this->_options['locale'] = $locale; + + if (isset(self::$_cache)) { + $id = 'Zend_Translate_' . $this->toString() . '_Options'; + self::$_cache->save( serialize($this->_options), $id, array('Zend_Translate')); + } + } + + return $this; + } + + /** + * Returns the available languages from this adapter + * + * @return array + */ + public function getList() + { + $list = array_keys($this->_translate); + $result = null; + foreach($list as $value) { + if (!empty($this->_translate[$value])) { + $result[$value] = $value; + } + } + return $result; + } + + /** + * Returns all available message ids from this adapter + * If no locale is given, the actual language will be used + * + * @param string|Zend_Locale $locale (optional) Language to return the message ids from + * @return array + */ + public function getMessageIds($locale = null) + { + if (empty($locale) or !$this->isAvailable($locale)) { + $locale = $this->_options['locale']; + } + + return array_keys($this->_translate[(string) $locale]); + } + + /** + * Returns all available translations from this adapter + * If no locale is given, the actual language will be used + * If 'all' is given the complete translation dictionary will be returned + * + * @param string|Zend_Locale $locale (optional) Language to return the messages from + * @return array + */ + public function getMessages($locale = null) + { + if ($locale === 'all') { + return $this->_translate; + } + + if ((empty($locale) === true) or ($this->isAvailable($locale) === false)) { + $locale = $this->_options['locale']; + } + + return $this->_translate[(string) $locale]; + } + + /** + * Is the wished language available ? + * + * @see Zend_Locale + * @param string|Zend_Locale $locale Language to search for, identical with locale identifier, + * @see Zend_Locale for more information + * @return boolean + */ + public function isAvailable($locale) + { + $return = isset($this->_translate[(string) $locale]); + return $return; + } + + /** + * Internal function for adding translation data + * + * It may be a new language or additional data for existing language + * If $clear parameter is true, then translation data for specified + * language is replaced and added otherwise + * + * @see Zend_Locale + * @param array|string $data Translation data + * @param string|Zend_Locale $locale Locale/Language to add data for, identical with locale identifier, + * @see Zend_Locale for more information + * @param array $options (optional) Option for this Adapter + * @throws Zend_Translate_Exception + * @return Zend_Translate_Adapter Provides fluent interface + */ + private function _addTranslationData($data, $locale, array $options = array()) + { + try { + $locale = Zend_Locale::findLocale($locale); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception("The given Language '{$locale}' does not exist"); + } + + if (!isset($this->_translate[$locale])) { + $this->_translate[$locale] = array(); + } + + $read = true; + if (isset(self::$_cache)) { + $id = 'Zend_Translate_' . md5(serialize($data)) . '_' . $this->toString(); + $result = self::$_cache->load($id); + if ($result) { + $temp = unserialize($result); + $read = false; + } + } + + if ($read) { + $temp = $this->_loadTranslationData($data, $locale, $options); + } + + if (empty($temp)) { + $temp = array(); + } + + $keys = array_keys($temp); + foreach($keys as $key) { + if (!isset($this->_translate[$key])) { + $this->_translate[$key] = array(); + } + + $this->_translate[$key] = $temp[$key] + $this->_translate[$key]; + } + + if ($this->_automatic === true) { + $find = new Zend_Locale($locale); + $browser = $find->getEnvironment() + $find->getBrowser(); + arsort($browser); + foreach($browser as $language => $quality) { + if (isset($this->_translate[$language])) { + $this->_options['locale'] = $language; + break; + } + } + } + + if (($read) and (isset(self::$_cache))) { + $id = 'Zend_Translate_' . md5(serialize($data)) . '_' . $this->toString(); + self::$_cache->save( serialize($temp), $id, array('Zend_Translate')); + } + + return $this; + } + + /** + * Translates the given string + * returns the translation + * + * @see Zend_Locale + * @param string|array $messageId Translation string, or Array for plural translations + * @param string|Zend_Locale $locale (optional) Locale/Language to use, identical with + * locale identifier, @see Zend_Locale for more information + * @return string + */ + public function translate($messageId, $locale = null) + { + if ($locale === null) { + $locale = $this->_options['locale']; + } + + $plural = null; + if (is_array($messageId)) { + if (count($messageId) > 2) { + $number = array_pop($messageId); + if (!is_numeric($number)) { + $plocale = $number; + $number = array_pop($messageId); + } else { + $plocale = 'en'; + } + + $plural = $messageId; + $messageId = $messageId[0]; + } else { + $messageId = $messageId[0]; + } + } + + if (!Zend_Locale::isLocale($locale, true, false)) { + if (!Zend_Locale::isLocale($locale, false, false)) { + // language does not exist, return original string + $this->_log($messageId, $locale); + if ($plural === null) { + return $messageId; + } + + $rule = Zend_Translate_Plural::getPlural($number, $plocale); + if (!isset($plural[$rule])) { + $rule = 0; + } + + return $plural[$rule]; + } + + $locale = new Zend_Locale($locale); + } + + $locale = (string) $locale; + if (isset($this->_translate[$locale][$messageId])) { + // return original translation + if ($plural === null) { + return $this->_translate[$locale][$messageId]; + } + + $rule = Zend_Translate_Plural::getPlural($number, $locale); + if (isset($this->_translate[$locale][$plural[0]][$rule])) { + return $this->_translate[$locale][$plural[0]][$rule]; + } + } else if (strlen($locale) != 2) { + // faster than creating a new locale and separate the leading part + $locale = substr($locale, 0, -strlen(strrchr($locale, '_'))); + + if (isset($this->_translate[$locale][$messageId])) { + // return regionless translation (en_US -> en) + if ($plural === null) { + return $this->_translate[$locale][$messageId]; + } + + $rule = Zend_Translate_Plural::getPlural($number, $locale); + if (isset($this->_translate[$locale][$plural[0]][$rule])) { + return $this->_translate[$locale][$plural[0]][$rule]; + } + } + } + + $this->_log($messageId, $locale); + if ($plural === null) { + return $messageId; + } + + $rule = Zend_Translate_Plural::getPlural($number, $plocale); + if (!isset($plural[$rule])) { + $rule = 0; + } + + return $plural[$rule]; + } + + /** + * Translates the given string using plural notations + * Returns the translated string + * + * @see Zend_Locale + * @param string $singular Singular translation string + * @param string $plural Plural translation string + * @param integer $number Number for detecting the correct plural + * @param string|Zend_Locale $locale (Optional) Locale/Language to use, identical with + * locale identifier, @see Zend_Locale for more information + * @return string + */ + public function plural($singular, $plural, $number, $locale = null) + { + return $this->translate(array($singular, $plural, $number), $locale); + } + + /** + * Logs a message when the log option is set + * + * @param string $message Message to log + * @param String $locale Locale to log + */ + protected function _log($message, $locale) { + if ($this->_options['logUntranslated']) { + $message = str_replace('%message%', $message, $this->_options['logMessage']); + $message = str_replace('%locale%', $locale, $message); + if ($this->_options['log']) { + $this->_options['log']->notice($message); + } else { + trigger_error($message, E_USER_NOTICE); + } + } + } + + /** + * Translates the given string + * returns the translation + * + * @param string $messageId Translation string + * @param string|Zend_Locale $locale (optional) Locale/Language to use, identical with locale + * identifier, @see Zend_Locale for more information + * @return string + */ + public function _($messageId, $locale = null) + { + return $this->translate($messageId, $locale); + } + + /** + * Checks if a string is translated within the source or not + * returns boolean + * + * @param string $messageId Translation string + * @param boolean $original (optional) Allow translation only for original language + * when true, a translation for 'en_US' would give false when it can + * be translated with 'en' only + * @param string|Zend_Locale $locale (optional) Locale/Language to use, identical with locale identifier, + * see Zend_Locale for more information + * @return boolean + */ + public function isTranslated($messageId, $original = false, $locale = null) + { + if (($original !== false) and ($original !== true)) { + $locale = $original; + $original = false; + } + + if ($locale === null) { + $locale = $this->_options['locale']; + } + + if (!Zend_Locale::isLocale($locale, true, false)) { + if (!Zend_Locale::isLocale($locale, false, false)) { + // language does not exist, return original string + $this->_log($messageId, $locale); + return false; + } + + $locale = new Zend_Locale($locale); + } + + $locale = (string) $locale; + if (isset($this->_translate[$locale][$messageId]) === true) { + // return original translation + return true; + } else if ((strlen($locale) != 2) and ($original === false)) { + // faster than creating a new locale and separate the leading part + $locale = substr($locale, 0, -strlen(strrchr($locale, '_'))); + + if (isset($this->_translate[$locale][$messageId]) === true) { + // return regionless translation (en_US -> en) + return true; + } + } + + // No translation found, return original + $this->_log($messageId, $locale); + return false; + } + + /** + * Returns the set cache + * + * @return Zend_Cache_Core The set cache + */ + public static function getCache() + { + return self::$_cache; + } + + /** + * Sets a cache for all Zend_Translate_Adapters + * + * @param Zend_Cache_Core $cache Cache to store to + */ + public static function setCache(Zend_Cache_Core $cache) + { + self::$_cache = $cache; + } + + /** + * Returns true when a cache is set + * + * @return boolean + */ + public static function hasCache() + { + if (self::$_cache !== null) { + return true; + } + + return false; + } + + /** + * Removes any set cache + * + * @return void + */ + public static function removeCache() + { + self::$_cache = null; + } + + /** + * Clears all set cache data + * + * @return void + */ + public static function clearCache() + { + require_once 'Zend/Cache.php'; + self::$_cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('Zend_Translate')); + } + + public function addTranslation($data, $locale = null, array $options = array()) + { + $this->setOptions($options); + + $originate = (string) $locale; + if (array_key_exists('locale', $options)) { + if ($locale == null) { + $locale = $options['locale']; + } + unset($options['locale']); + } + + if ((array_key_exists('log', $options)) && !($options['log'] instanceof Zend_Log)) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Instance of Zend_Log expected for option log'); + } + + try { + $locale = Zend_Locale::findLocale($locale); + } catch (Zend_Locale_Exception $e) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception("The given Language '{$locale}' does not exist"); + } + + if (is_string($data) and is_dir($data)) { + $data = realpath($data); + $prev = ''; + foreach (new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($data, RecursiveDirectoryIterator::KEY_AS_PATHNAME), + RecursiveIteratorIterator::SELF_FIRST) as $directory => $info) { + $file = $info->getFilename(); + if (strpos($directory, DIRECTORY_SEPARATOR . $options['ignore']) !== false) { + // ignore files matching first characters from option 'ignore' and all files below + continue; + } + + if ($info->isDir()) { + // pathname as locale + if (($options['scan'] === self::LOCALE_DIRECTORY) and (Zend_Locale::isLocale($file, true, false))) { + $locale = $file; + $prev = (string) $locale; + } + } else if ($info->isFile()) { + // filename as locale + if ($options['scan'] === self::LOCALE_FILENAME) { + $filename = explode('.', $file); + array_pop($filename); + $filename = implode('.', $filename); + if (Zend_Locale::isLocale((string) $filename, true, false)) { + $locale = (string) $filename; + } else { + $parts = explode('.', $file); + $parts2 = array(); + foreach($parts as $token) { + $parts2 += explode('_', $token); + } + $parts = array_merge($parts, $parts2); + $parts2 = array(); + foreach($parts as $token) { + $parts2 += explode('-', $token); + } + $parts = array_merge($parts, $parts2); + $parts = array_unique($parts); + $prev = ''; + foreach($parts as $token) { + if (Zend_Locale::isLocale($token, true, false)) { + if (strlen($prev) <= strlen($token)) { + $locale = $token; + $prev = $token; + } + } + } + } + } + try { + $this->_addTranslationData($info->getPathname(), (string) $locale, $options); + } catch (Zend_Translate_Exception $e) { + // ignore failed sources while scanning + } + } + } + } else { + $this->_addTranslationData($data, (string) $locale, $options); + } + + if ((isset($this->_translate[$originate]) === true) and (count($this->_translate[$originate]) > 0)) { + $this->setLocale($originate); + } + + return $this; + } + + + // THIS IS THE COPY OF THE GETTEXT CLASS + + // Internal variables + private $_bigEndian = false; + private $_file = false; + private $_adapterInfo = array(); + private $_data = array(); + + /** + * Read values from the MO file + * + * @param string $bytes + */ + private function _readMOData($bytes) + { + if ($this->_bigEndian === false) { + return unpack('V' . $bytes, fread($this->_file, 4 * $bytes)); + } else { + return unpack('N' . $bytes, fread($this->_file, 4 * $bytes)); + } + } + + /** + * Load translation data (MO file reader) + * + * @param string $filename MO file to add, full path must be given for access + * @param string $locale New Locale/Language to set, identical with locale identifier, + * see Zend_Locale for more information + * @param array $option OPTIONAL Options to use + * @throws Zend_Translation_Exception + * @return array + */ + protected function _loadTranslationData($filename, $locale, array $options = array()) + { + $this->_data = array(); + $this->_bigEndian = false; + $this->_file = @fopen($filename, 'rb'); + if (!$this->_file) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('Error opening translation file \'' . $filename . '\'.'); + } + if (@filesize($filename) < 10) { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('\'' . $filename . '\' is not a gettext file'); + } + + // get Endian + $input = $this->_readMOData(1); + if (strtolower(substr(dechex($input[1]), -8)) == "950412de") { + $this->_bigEndian = false; + } else if (strtolower(substr(dechex($input[1]), -8)) == "de120495") { + $this->_bigEndian = true; + } else { + require_once 'Zend/Translate/Exception.php'; + throw new Zend_Translate_Exception('\'' . $filename . '\' is not a gettext file'); + } + // read revision - not supported for now + $input = $this->_readMOData(1); + + // number of bytes + $input = $this->_readMOData(1); + $total = $input[1]; + + // number of original strings + $input = $this->_readMOData(1); + $OOffset = $input[1]; + + // number of translation strings + $input = $this->_readMOData(1); + $TOffset = $input[1]; + + // fill the original table + fseek($this->_file, $OOffset); + $origtemp = $this->_readMOData(2 * $total); + fseek($this->_file, $TOffset); + $transtemp = $this->_readMOData(2 * $total); + + for($count = 0; $count < $total; ++$count) { + if ($origtemp[$count * 2 + 1] != 0) { + fseek($this->_file, $origtemp[$count * 2 + 2]); + $original = @fread($this->_file, $origtemp[$count * 2 + 1]); + $original = explode(chr(00), $original); + } else { + $original[0] = ''; + } + + if ($transtemp[$count * 2 + 1] != 0) { + fseek($this->_file, $transtemp[$count * 2 + 2]); + $translate = fread($this->_file, $transtemp[$count * 2 + 1]); + $translate = explode(chr(00), $translate); + if ((count($original) > 1) && (count($translate) > 1)) { + $this->_data[$locale][$original[0]] = $translate; + array_shift($original); + foreach ($original as $orig) { + $this->_data[$locale][$orig] = ''; + } + } else { + $this->_data[$locale][$original[0]] = $translate[0]; + } + } + } + + $this->_data[$locale][''] = trim($this->_data[$locale]['']); + if (empty($this->_data[$locale][''])) { + $this->_adapterInfo[$filename] = 'No adapter information available'; + } else { + $this->_adapterInfo[$filename] = $this->_data[$locale]['']; + } + + unset($this->_data[$locale]['']); + return $this->_data; + } + + /** + * Returns the adapter informations + * + * @return array Each loaded adapter information as array value + */ + public function getAdapterInfo() + { + return $this->_adapterInfo; + } + + /** + * Returns the adapter name + * + * @return string + */ + public function toString() + { + return "Gettext"; + } +} diff --git a/libs/Monkeys/UnsupportedOperationException.php b/libs/Monkeys/UnsupportedOperationException.php new file mode 100644 index 0000000..460d414 --- /dev/null +++ b/libs/Monkeys/UnsupportedOperationException.php @@ -0,0 +1,12 @@ + 'minLength', + ); + + protected $_messageTemplates = array( + self::MSG_DICTIONARY => 'Password can\'t be a dictionary word', + self::MSG_USERNAME => 'Password can\'t contain the username', + self::MSG_LENGTH => 'Password must be longer than %minLength% characters', + self::MSG_NUMBERS => 'Password must contain numbers', + self::MSG_SYMBOLS => 'Password must contain symbols', + self::MSG_CASE => 'Password needs to have lowercase and uppercase characters', + ); + + private $_username; + private $_config; + + public function __construct($username = null) + { + $this->_username = $username; + $this->_config = Zend_Registry::get('config'); + $this->minLength = $this->_config->security->passwords->minimum_length; + } + + public function getPasswordRestrictionsDescription() + { + $restrictions = array(); + + if ($this->_config->security->passwords->dictionary) { + $restrictions[] = $this->_messageTemplates[self::MSG_DICTIONARY]; + } + + if ($this->_config->security->passwords->username_different) { + $restrictions[] = $this->_messageTemplates[self::MSG_USERNAME]; + } + + if ($this->minLength) { + $restrictions[] = str_replace('%minLength%', $this->minLength, $this->_messageTemplates[self::MSG_LENGTH]); + } + + if ($this->_config->security->passwords->include_numbers) { + $restrictions[] = $this->_messageTemplates[self::MSG_NUMBERS]; + } + + if ($this->_config->security->passwords->include_symbols) { + $restrictions[] = $this->_messageTemplates[self::MSG_SYMBOLS]; + } + + if ($this->_config->security->passwords->lowercase_and_uppercase) { + $restrictions[] = $this->_messageTemplates[self::MSG_CASE]; + } + + if (!$restrictions) { + return false; + } + + return '
  • ' . implode('
  • ', $restrictions) . '
'; + } + + public function isValid($value, $context = null) + { + $this->_setValue($value); + $isValid = true; + + if ($this->_config->security->passwords->dictionary + && !$this->_checkDictionary($value, $this->_config->security->passwords->dictionary)) { + $this->_error(self::MSG_DICTIONARY); + $isValid = false; + } + + if ($this->_config->security->passwords->username_different + && !$this->_checkUsername($value, $context)) { + $this->_error(self::MSG_USERNAME); + $isValid = false; + } + + if ($this->minLength + && !$this->_checkLength($value, $this->minLength)) { + $this->_error(self::MSG_LENGTH); + $isValid = false; + } + + if ($this->_config->security->passwords->include_numbers + && !$this->_checkNumbers($value)) { + $this->_error(self::MSG_NUMBERS); + $isValid = false; + } + + if ($this->_config->security->passwords->include_symbols + && !$this->_checkSymbols($value)) { + $this->_error(self::MSG_SYMBOLS); + $isValid = false; + } + + if ($this->_config->security->passwords->lowercase_and_uppercase + && !$this->_checkCase($value)) { + $this->_error(self::MSG_CASE); + $isValid = false; + } + + return $isValid; + } + + private function _checkDictionary($value, $dictionary) + { + $value = strtolower($value); + if (!@$file = fopen(APP_DIR . "/$dictionary", 'r')) { + throw new Exception('Dictionary file could not be read'); + } + + while (!feof($file)) { + $word = strtolower(trim(fgets($file))); + if (strlen($word) >= self::MIN_LENGTH_INCLUDED_WORD + && $value == $word) { + $this->word = $word; + return false; + } + } + fclose($file); + + return true; + } + + private function _checkUsername($value, $context) + { + $username = ''; + if (is_array($context) && isset($context['username'])) { + $username = $context['username']; + } elseif (is_string($context)) { + $username = $context; + } elseif ($this->_username) { + $username = $this->_username; + } else { + throw new Exception('Username context was not passed'); + } + + if ($username == '') { + return true; + } + + return strpos(strtolower($value), strtolower($username)) === false; + } + + private function _checkLength($value, $minimumLength) + { + return strlen($value) >= $minimumLength; + } + + private function _checkNumbers($value) + { + return preg_match('/[0-9]+/', $value); + } + + private function _checkSymbols($value) + { + return preg_match('/[\W]+/', $value); + } + + private function _checkCase($value) + { + return (preg_match('/[A-Z]+/', $value) + && preg_match('/[a-z]+/', $value)); + } +} diff --git a/libs/Monkeys/Validate/PasswordConfirmation.php b/libs/Monkeys/Validate/PasswordConfirmation.php index 47cb185..0f3dbb3 100644 --- a/libs/Monkeys/Validate/PasswordConfirmation.php +++ b/libs/Monkeys/Validate/PasswordConfirmation.php @@ -1,11 +1,10 @@ 'Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*\'(), and "' + self::BAD => 'Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*\'(), and "', + self::BAD2 => 'Username is invalid' ); public function isValid($value, $context = null) { $this->_setValue($value); - if (preg_match('/^[A-Za-z\$-_.\+!\*\'\(\)",]+$/', $value)) { - return true; - } else { + if (!preg_match('/^[A-Za-z\$-_.\+!\*\'\(\)",]+$/', $value)) { $this->_error(self::BAD); return false; } + + $config = Zend_Registry::get('config'); + foreach ($config->security->usernames->exclude as $regex) { + if (!$regex) { + continue; + } + $regex = preg_quote($regex); + if (preg_match("/$regex/", $value)) { + $this->_error(self::BAD2); + return false; + } + } + + return true; } } diff --git a/libs/Monkeys/View/Helper/FormDateSelects.php b/libs/Monkeys/View/Helper/FormDateSelects.php index ca14ca2..c4abcff 100644 --- a/libs/Monkeys/View/Helper/FormDateSelects.php +++ b/libs/Monkeys/View/Helper/FormDateSelects.php @@ -1,11 +1,10 @@ \n"; + $str .= implode('
', $messages); + $str .= "\n"; + } else { + $str = ''; + } + + return $str; + } +} diff --git a/libs/Monkeys/fonts/ipam.ttf b/libs/Monkeys/fonts/ipam.ttf new file mode 100644 index 0000000..0719873 Binary files /dev/null and b/libs/Monkeys/fonts/ipam.ttf differ diff --git a/libs/Monkeys/tests/names.txt b/libs/Monkeys/tests/names.txt old mode 100755 new mode 100644 diff --git a/libs/Monkeys/tests/sampleavatars/bbhhbhb.jpeg b/libs/Monkeys/tests/sampleavatars/bbhhbhb.jpeg new file mode 100644 index 0000000..816d0d3 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bbhhbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bbuyu.jpeg b/libs/Monkeys/tests/sampleavatars/bbuyu.jpeg new file mode 100644 index 0000000..7f7e21e Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bbuyu.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bbyuu.jpeg b/libs/Monkeys/tests/sampleavatars/bbyuu.jpeg new file mode 100644 index 0000000..e127382 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bbyuu.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bbyyb.jpeg b/libs/Monkeys/tests/sampleavatars/bbyyb.jpeg new file mode 100644 index 0000000..83ac708 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bbyyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bhbuuybyb.jpeg b/libs/Monkeys/tests/sampleavatars/bhbuuybyb.jpeg new file mode 100644 index 0000000..ad5e1b0 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bhbuuybyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bhhuh.jpeg b/libs/Monkeys/tests/sampleavatars/bhhuh.jpeg new file mode 100644 index 0000000..48e6d15 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bhhuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bnybyb.jpeg b/libs/Monkeys/tests/sampleavatars/bnybyb.jpeg new file mode 100644 index 0000000..be206a2 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bnybyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bnyubyb.jpeg b/libs/Monkeys/tests/sampleavatars/bnyubyb.jpeg new file mode 100644 index 0000000..0942d57 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bnyubyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bubyby.jpeg b/libs/Monkeys/tests/sampleavatars/bubyby.jpeg new file mode 100644 index 0000000..d239483 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bubyby.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bybj.jpeg b/libs/Monkeys/tests/sampleavatars/bybj.jpeg new file mode 100644 index 0000000..c28a07d Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bybj.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bybyb.jpeg b/libs/Monkeys/tests/sampleavatars/bybyb.jpeg new file mode 100644 index 0000000..b69f41c Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bybyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bybyby.jpeg b/libs/Monkeys/tests/sampleavatars/bybyby.jpeg new file mode 100644 index 0000000..da0beba Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bybyby.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/bybybyb.jpeg b/libs/Monkeys/tests/sampleavatars/bybybyb.jpeg new file mode 100644 index 0000000..0ea1f0b Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/bybybyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/byybyb.jpeg b/libs/Monkeys/tests/sampleavatars/byybyb.jpeg new file mode 100644 index 0000000..d566e4e Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/byybyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/cfvc.jpeg b/libs/Monkeys/tests/sampleavatars/cfvc.jpeg new file mode 100644 index 0000000..0b2bbaa Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/cfvc.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/frfr.jpeg b/libs/Monkeys/tests/sampleavatars/frfr.jpeg new file mode 100644 index 0000000..d6d7a75 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/frfr.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ggbbgg.jpeg b/libs/Monkeys/tests/sampleavatars/ggbbgg.jpeg new file mode 100644 index 0000000..69bca10 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ggbbgg.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/gtubyb.jpeg b/libs/Monkeys/tests/sampleavatars/gtubyb.jpeg new file mode 100644 index 0000000..d7a5364 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/gtubyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/gyubyubuyb.jpeg b/libs/Monkeys/tests/sampleavatars/gyubyubuyb.jpeg new file mode 100644 index 0000000..c8812fa Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/gyubyubuyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hbhbhb.jpeg b/libs/Monkeys/tests/sampleavatars/hbhbhb.jpeg new file mode 100644 index 0000000..17bf238 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hbhbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hbhbhbhnjn.jpeg b/libs/Monkeys/tests/sampleavatars/hbhbhbhnjn.jpeg new file mode 100644 index 0000000..a0998d3 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hbhbhbhnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hbhbjhbjn.jpeg b/libs/Monkeys/tests/sampleavatars/hbhbjhbjn.jpeg new file mode 100644 index 0000000..75ed016 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hbhbjhbjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hbnjhbjhhn.jpeg b/libs/Monkeys/tests/sampleavatars/hbnjhbjhhn.jpeg new file mode 100644 index 0000000..7a5bcca Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hbnjhbjhhn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hhbhbv.jpeg b/libs/Monkeys/tests/sampleavatars/hhbhbv.jpeg new file mode 100644 index 0000000..289fe88 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hhbhbv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hhhuuh.jpeg b/libs/Monkeys/tests/sampleavatars/hhhuuh.jpeg new file mode 100644 index 0000000..b511d45 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hhhuuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hhuinbv.jpeg b/libs/Monkeys/tests/sampleavatars/hhuinbv.jpeg new file mode 100644 index 0000000..4e5b0fc Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hhuinbv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hhunnyuh.jpeg b/libs/Monkeys/tests/sampleavatars/hhunnyuh.jpeg new file mode 100644 index 0000000..f156d44 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hhunnyuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hjnyn.jpeg b/libs/Monkeys/tests/sampleavatars/hjnyn.jpeg new file mode 100644 index 0000000..96bebd8 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hjnyn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hnjnjnhbhb.jpeg b/libs/Monkeys/tests/sampleavatars/hnjnjnhbhb.jpeg new file mode 100644 index 0000000..3141e04 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hnjnjnhbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hnuiuh.jpeg b/libs/Monkeys/tests/sampleavatars/hnuiuh.jpeg new file mode 100644 index 0000000..ec027c1 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hnuiuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/huhh.jpeg b/libs/Monkeys/tests/sampleavatars/huhh.jpeg new file mode 100644 index 0000000..ebcce6d Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/huhh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/huhujuj.jpeg b/libs/Monkeys/tests/sampleavatars/huhujuj.jpeg new file mode 100644 index 0000000..4d5a4d3 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/huhujuj.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/huhuyuyb.jpeg b/libs/Monkeys/tests/sampleavatars/huhuyuyb.jpeg new file mode 100644 index 0000000..bc915b1 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/huhuyuyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hunnun.jpeg b/libs/Monkeys/tests/sampleavatars/hunnun.jpeg new file mode 100644 index 0000000..3157c21 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hunnun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/huuhunun.jpeg b/libs/Monkeys/tests/sampleavatars/huuhunun.jpeg new file mode 100644 index 0000000..d76cb98 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/huuhunun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/huunun.jpeg b/libs/Monkeys/tests/sampleavatars/huunun.jpeg new file mode 100644 index 0000000..e7454ef Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/huunun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/huybnuybnuny.jpeg b/libs/Monkeys/tests/sampleavatars/huybnuybnuny.jpeg new file mode 100644 index 0000000..c2e2a13 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/huybnuybnuny.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hybbb.jpeg b/libs/Monkeys/tests/sampleavatars/hybbb.jpeg new file mode 100644 index 0000000..a8b21ae Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hybbb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hybuyb.jpeg b/libs/Monkeys/tests/sampleavatars/hybuyb.jpeg new file mode 100644 index 0000000..cb516d6 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hybuyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hybuybhh.jpeg b/libs/Monkeys/tests/sampleavatars/hybuybhh.jpeg new file mode 100644 index 0000000..b5925e9 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hybuybhh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hyhgg.jpeg b/libs/Monkeys/tests/sampleavatars/hyhgg.jpeg new file mode 100644 index 0000000..5ba529d Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hyhgg.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hyhjhu.jpeg b/libs/Monkeys/tests/sampleavatars/hyhjhu.jpeg new file mode 100644 index 0000000..fbc74e0 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hyhjhu.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hyhy.jpeg b/libs/Monkeys/tests/sampleavatars/hyhy.jpeg new file mode 100644 index 0000000..33ffa02 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hyhy.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hyhybhyb.jpeg b/libs/Monkeys/tests/sampleavatars/hyhybhyb.jpeg new file mode 100644 index 0000000..928443b Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hyhybhyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hyhybyg.jpeg b/libs/Monkeys/tests/sampleavatars/hyhybyg.jpeg new file mode 100644 index 0000000..712dac6 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hyhybyg.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hynbynn.jpeg b/libs/Monkeys/tests/sampleavatars/hynbynn.jpeg new file mode 100644 index 0000000..0b05b65 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hynbynn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hynnn7n.jpeg b/libs/Monkeys/tests/sampleavatars/hynnn7n.jpeg new file mode 100644 index 0000000..c8fae66 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hynnn7n.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/hyyhjnh.jpeg b/libs/Monkeys/tests/sampleavatars/hyyhjnh.jpeg new file mode 100644 index 0000000..08f2030 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/hyyhjnh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ibbb.jpeg b/libs/Monkeys/tests/sampleavatars/ibbb.jpeg new file mode 100644 index 0000000..74849e0 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ibbb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ijijijijij.jpeg b/libs/Monkeys/tests/sampleavatars/ijijijijij.jpeg new file mode 100644 index 0000000..6500213 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ijijijijij.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/iuii.jpeg b/libs/Monkeys/tests/sampleavatars/iuii.jpeg new file mode 100644 index 0000000..87e7c16 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/iuii.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jhbjhbtv.jpeg b/libs/Monkeys/tests/sampleavatars/jhbjhbtv.jpeg new file mode 100644 index 0000000..84cd889 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jhbjhbtv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jiiu.jpeg b/libs/Monkeys/tests/sampleavatars/jiiu.jpeg new file mode 100644 index 0000000..63b33c4 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jiiu.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jijnb.jpeg b/libs/Monkeys/tests/sampleavatars/jijnb.jpeg new file mode 100644 index 0000000..b16dea3 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jijnb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jjbbb.jpeg b/libs/Monkeys/tests/sampleavatars/jjbbb.jpeg new file mode 100644 index 0000000..c2206ce Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jjbbb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jjiiij.jpeg b/libs/Monkeys/tests/sampleavatars/jjiiij.jpeg new file mode 100644 index 0000000..3475186 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jjiiij.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jjjjj.jpeg b/libs/Monkeys/tests/sampleavatars/jjjjj.jpeg new file mode 100644 index 0000000..24b547c Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jjjjj.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jnhbhbhb.jpeg b/libs/Monkeys/tests/sampleavatars/jnhbhbhb.jpeg new file mode 100644 index 0000000..e4ceb08 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jnhbhbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jnjhbhbjn.jpeg b/libs/Monkeys/tests/sampleavatars/jnjhbhbjn.jpeg new file mode 100644 index 0000000..11cd8a6 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jnjhbhbjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jnjnhbhb.jpeg b/libs/Monkeys/tests/sampleavatars/jnjnhbhb.jpeg new file mode 100644 index 0000000..53ab618 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jnjnhbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jnjnjh.jpeg b/libs/Monkeys/tests/sampleavatars/jnjnjh.jpeg new file mode 100644 index 0000000..a3384f3 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jnjnjh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/jnjnjhuhuh.jpeg b/libs/Monkeys/tests/sampleavatars/jnjnjhuhuh.jpeg new file mode 100644 index 0000000..7d9c837 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/jnjnjhuhuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/juhyybg.jpeg b/libs/Monkeys/tests/sampleavatars/juhyybg.jpeg new file mode 100644 index 0000000..1588dba Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/juhyybg.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/kjkk.jpeg b/libs/Monkeys/tests/sampleavatars/kjkk.jpeg new file mode 100644 index 0000000..505caa6 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/kjkk.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/kjnkjnjn.jpeg b/libs/Monkeys/tests/sampleavatars/kjnkjnjn.jpeg new file mode 100644 index 0000000..465caa0 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/kjnkjnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/kknjuun.jpeg b/libs/Monkeys/tests/sampleavatars/kknjuun.jpeg new file mode 100644 index 0000000..7e920b9 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/kknjuun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/mimmmim.jpeg b/libs/Monkeys/tests/sampleavatars/mimmmim.jpeg new file mode 100644 index 0000000..ea91ec7 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/mimmmim.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nhnjnjnjb.jpeg b/libs/Monkeys/tests/sampleavatars/nhnjnjnjb.jpeg new file mode 100644 index 0000000..a9a7648 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nhnjnjnjb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/njhbhbhb.jpeg b/libs/Monkeys/tests/sampleavatars/njhbhbhb.jpeg new file mode 100644 index 0000000..661c536 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/njhbhbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/njnjn.jpeg b/libs/Monkeys/tests/sampleavatars/njnjn.jpeg new file mode 100644 index 0000000..76bd1a1 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/njnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/njnjnjnhuijgh.jpeg b/libs/Monkeys/tests/sampleavatars/njnjnjnhuijgh.jpeg new file mode 100644 index 0000000..4d94957 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/njnjnjnhuijgh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/njnjnjnj.jpeg b/libs/Monkeys/tests/sampleavatars/njnjnjnj.jpeg new file mode 100644 index 0000000..64e9251 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/njnjnjnj.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nkjnhbhbjnjn.jpeg b/libs/Monkeys/tests/sampleavatars/nkjnhbhbjnjn.jpeg new file mode 100644 index 0000000..500854a Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nkjnhbhbjnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nnjjjnjn.jpeg b/libs/Monkeys/tests/sampleavatars/nnjjjnjn.jpeg new file mode 100644 index 0000000..eff5eef Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nnjjjnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nnjjn.jpeg b/libs/Monkeys/tests/sampleavatars/nnjjn.jpeg new file mode 100644 index 0000000..f18ca83 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nnjjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nnuun.jpeg b/libs/Monkeys/tests/sampleavatars/nnuun.jpeg new file mode 100644 index 0000000..452b641 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nnuun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nnuunn.jpeg b/libs/Monkeys/tests/sampleavatars/nnuunn.jpeg new file mode 100644 index 0000000..4a99ee5 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nnuunn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nunun.jpeg b/libs/Monkeys/tests/sampleavatars/nunun.jpeg new file mode 100644 index 0000000..58a2230 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nunun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nununn.jpeg b/libs/Monkeys/tests/sampleavatars/nununn.jpeg new file mode 100644 index 0000000..dc61b45 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nununn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nuujughg.jpeg b/libs/Monkeys/tests/sampleavatars/nuujughg.jpeg new file mode 100644 index 0000000..47a4e20 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nuujughg.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nuuuhh.jpeg b/libs/Monkeys/tests/sampleavatars/nuuuhh.jpeg new file mode 100644 index 0000000..411b278 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nuuuhh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nuuuj.jpeg b/libs/Monkeys/tests/sampleavatars/nuuuj.jpeg new file mode 100644 index 0000000..e2ae596 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nuuuj.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nuuun.jpeg b/libs/Monkeys/tests/sampleavatars/nuuun.jpeg new file mode 100644 index 0000000..77711f0 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nuuun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nynjb.jpeg b/libs/Monkeys/tests/sampleavatars/nynjb.jpeg new file mode 100644 index 0000000..8a51b94 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nynjb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nynjnjn.jpeg b/libs/Monkeys/tests/sampleavatars/nynjnjn.jpeg new file mode 100644 index 0000000..718d01d Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nynjnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nynyn.jpeg b/libs/Monkeys/tests/sampleavatars/nynyn.jpeg new file mode 100644 index 0000000..7235cdf Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nynyn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/nyvv.jpeg b/libs/Monkeys/tests/sampleavatars/nyvv.jpeg new file mode 100644 index 0000000..b5b8120 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/nyvv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/tbhb.jpeg b/libs/Monkeys/tests/sampleavatars/tbhb.jpeg new file mode 100644 index 0000000..1c2c3fe Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/tbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/tbvt.jpeg b/libs/Monkeys/tests/sampleavatars/tbvt.jpeg new file mode 100644 index 0000000..6db6227 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/tbvt.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/trftvtyb.jpeg b/libs/Monkeys/tests/sampleavatars/trftvtyb.jpeg new file mode 100644 index 0000000..05f81c6 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/trftvtyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ttyuby.jpeg b/libs/Monkeys/tests/sampleavatars/ttyuby.jpeg new file mode 100644 index 0000000..c1ac190 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ttyuby.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/tvgv.jpeg b/libs/Monkeys/tests/sampleavatars/tvgv.jpeg new file mode 100644 index 0000000..a11dc0f Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/tvgv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uhuhuhuj.jpeg b/libs/Monkeys/tests/sampleavatars/uhuhuhuj.jpeg new file mode 100644 index 0000000..bb65758 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uhuhuhuj.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uhujuh.jpeg b/libs/Monkeys/tests/sampleavatars/uhujuh.jpeg new file mode 100644 index 0000000..c349980 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uhujuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uibhb.jpeg b/libs/Monkeys/tests/sampleavatars/uibhb.jpeg new file mode 100644 index 0000000..4ba1863 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uibhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uinun.jpeg b/libs/Monkeys/tests/sampleavatars/uinun.jpeg new file mode 100644 index 0000000..99e0fce Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uinun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uinunuuhj.jpeg b/libs/Monkeys/tests/sampleavatars/uinunuuhj.jpeg new file mode 100644 index 0000000..2400829 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uinunuuhj.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uiuhbb.jpeg b/libs/Monkeys/tests/sampleavatars/uiuhbb.jpeg new file mode 100644 index 0000000..f8bf469 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uiuhbb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ujjnjnjn.jpeg b/libs/Monkeys/tests/sampleavatars/ujjnjnjn.jpeg new file mode 100644 index 0000000..a350ec1 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ujjnjnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uniun.jpeg b/libs/Monkeys/tests/sampleavatars/uniun.jpeg new file mode 100644 index 0000000..760b9e2 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uniun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unjnjbgbb.jpeg b/libs/Monkeys/tests/sampleavatars/unjnjbgbb.jpeg new file mode 100644 index 0000000..d49ae18 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unjnjbgbb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unjnjnju.jpeg b/libs/Monkeys/tests/sampleavatars/unjnjnju.jpeg new file mode 100644 index 0000000..3f31666 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unjnjnju.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unnjnjnjn.jpeg b/libs/Monkeys/tests/sampleavatars/unnjnjnjn.jpeg new file mode 100644 index 0000000..7d11c3c Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unnjnjnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unnn.jpeg b/libs/Monkeys/tests/sampleavatars/unnn.jpeg new file mode 100644 index 0000000..0e4897d Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unnn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unnnun.jpeg b/libs/Monkeys/tests/sampleavatars/unnnun.jpeg new file mode 100644 index 0000000..30d2cb0 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unnnun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unnu.jpeg b/libs/Monkeys/tests/sampleavatars/unnu.jpeg new file mode 100644 index 0000000..2b4ba6a Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unnu.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unnunn.jpeg b/libs/Monkeys/tests/sampleavatars/unnunn.jpeg new file mode 100644 index 0000000..2407685 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unnunn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unubbgbg.jpeg b/libs/Monkeys/tests/sampleavatars/unubbgbg.jpeg new file mode 100644 index 0000000..5f8de79 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unubbgbg.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unuhuh.jpeg b/libs/Monkeys/tests/sampleavatars/unuhuh.jpeg new file mode 100644 index 0000000..c15fff0 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unuhuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ununbv.jpeg b/libs/Monkeys/tests/sampleavatars/ununbv.jpeg new file mode 100644 index 0000000..fc23f2e Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ununbv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/unuuh.jpeg b/libs/Monkeys/tests/sampleavatars/unuuh.jpeg new file mode 100644 index 0000000..4c88f40 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/unuuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uuhbun.jpeg b/libs/Monkeys/tests/sampleavatars/uuhbun.jpeg new file mode 100644 index 0000000..8cdb9da Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uuhbun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uuhun.jpeg b/libs/Monkeys/tests/sampleavatars/uuhun.jpeg new file mode 100644 index 0000000..9ef06f1 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uuhun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uujnjnn.jpeg b/libs/Monkeys/tests/sampleavatars/uujnjnn.jpeg new file mode 100644 index 0000000..995a358 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uujnjnn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uuuybbn.jpeg b/libs/Monkeys/tests/sampleavatars/uuuybbn.jpeg new file mode 100644 index 0000000..60ae697 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uuuybbn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uuybb.jpeg b/libs/Monkeys/tests/sampleavatars/uuybb.jpeg new file mode 100644 index 0000000..339532e Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uuybb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uybbb.jpeg b/libs/Monkeys/tests/sampleavatars/uybbb.jpeg new file mode 100644 index 0000000..beb7ed1 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uybbb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uybby.jpeg b/libs/Monkeys/tests/sampleavatars/uybby.jpeg new file mode 100644 index 0000000..7b207cb Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uybby.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uybuybyub.jpeg b/libs/Monkeys/tests/sampleavatars/uybuybyub.jpeg new file mode 100644 index 0000000..a8ed461 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uybuybyub.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uybyb.jpeg b/libs/Monkeys/tests/sampleavatars/uybyb.jpeg new file mode 100644 index 0000000..10c77a3 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uybyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uybybbh.jpeg b/libs/Monkeys/tests/sampleavatars/uybybbh.jpeg new file mode 100644 index 0000000..5a70b4a Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uybybbh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uygtgyb.jpeg b/libs/Monkeys/tests/sampleavatars/uygtgyb.jpeg new file mode 100644 index 0000000..d9ca0df Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uygtgyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/uynnjn.jpeg b/libs/Monkeys/tests/sampleavatars/uynnjn.jpeg new file mode 100644 index 0000000..1e57e89 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/uynnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/vbgv.jpeg b/libs/Monkeys/tests/sampleavatars/vbgv.jpeg new file mode 100644 index 0000000..fe41f70 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/vbgv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybbbh.jpeg b/libs/Monkeys/tests/sampleavatars/ybbbh.jpeg new file mode 100644 index 0000000..090e9e1 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybbbh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybbhbb.jpeg b/libs/Monkeys/tests/sampleavatars/ybbhbb.jpeg new file mode 100644 index 0000000..34f6e2b Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybbhbb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybhbhb.jpeg b/libs/Monkeys/tests/sampleavatars/ybhbhb.jpeg new file mode 100644 index 0000000..de74579 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybhbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybjnjn.jpeg b/libs/Monkeys/tests/sampleavatars/ybjnjn.jpeg new file mode 100644 index 0000000..deee4cb Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybjnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybnbnb.jpeg b/libs/Monkeys/tests/sampleavatars/ybnbnb.jpeg new file mode 100644 index 0000000..2281bd9 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybnbnb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybtvtv.jpeg b/libs/Monkeys/tests/sampleavatars/ybtvtv.jpeg new file mode 100644 index 0000000..0cc5c2f Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybtvtv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybybb.jpeg b/libs/Monkeys/tests/sampleavatars/ybybb.jpeg new file mode 100644 index 0000000..5df094b Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybybb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybybhb.jpeg b/libs/Monkeys/tests/sampleavatars/ybybhb.jpeg new file mode 100644 index 0000000..47d3aea Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybybhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybybyb.jpeg b/libs/Monkeys/tests/sampleavatars/ybybyb.jpeg new file mode 100644 index 0000000..8ee9356 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybybyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/ybyvv.jpeg b/libs/Monkeys/tests/sampleavatars/ybyvv.jpeg new file mode 100644 index 0000000..1dbe622 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/ybyvv.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yhbbhb.jpeg b/libs/Monkeys/tests/sampleavatars/yhbbhb.jpeg new file mode 100644 index 0000000..6046e8d Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yhbbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yhbbhbnnn.jpeg b/libs/Monkeys/tests/sampleavatars/yhbbhbnnn.jpeg new file mode 100644 index 0000000..e4d92d5 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yhbbhbnnn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yhbhybnjhn.jpeg b/libs/Monkeys/tests/sampleavatars/yhbhybnjhn.jpeg new file mode 100644 index 0000000..fa4b085 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yhbhybnjhn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yhubnhujbjhn.jpeg b/libs/Monkeys/tests/sampleavatars/yhubnhujbjhn.jpeg new file mode 100644 index 0000000..27bd108 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yhubnhujbjhn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yhybnjn.jpeg b/libs/Monkeys/tests/sampleavatars/yhybnjn.jpeg new file mode 100644 index 0000000..9a21a31 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yhybnjn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yhyhnhyuhuh.jpeg b/libs/Monkeys/tests/sampleavatars/yhyhnhyuhuh.jpeg new file mode 100644 index 0000000..3d20d68 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yhyhnhyuhuh.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yubbhb.jpeg b/libs/Monkeys/tests/sampleavatars/yubbhb.jpeg new file mode 100644 index 0000000..1941e62 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yubbhb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yubhybgyun.jpeg b/libs/Monkeys/tests/sampleavatars/yubhybgyun.jpeg new file mode 100644 index 0000000..da5ba97 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yubhybgyun.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yubybyb.jpeg b/libs/Monkeys/tests/sampleavatars/yubybyb.jpeg new file mode 100644 index 0000000..2b90007 Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yubybyb.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yuhynbyn.jpeg b/libs/Monkeys/tests/sampleavatars/yuhynbyn.jpeg new file mode 100644 index 0000000..f6482ed Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yuhynbyn.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yuuuhuuhj.jpeg b/libs/Monkeys/tests/sampleavatars/yuuuhuuhj.jpeg new file mode 100644 index 0000000..f98ef6b Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yuuuhuuhj.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yuygg.jpeg b/libs/Monkeys/tests/sampleavatars/yuygg.jpeg new file mode 100644 index 0000000..b2907dc Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yuygg.jpeg differ diff --git a/libs/Monkeys/tests/sampleavatars/yybybb.jpeg b/libs/Monkeys/tests/sampleavatars/yybybb.jpeg new file mode 100644 index 0000000..085df6f Binary files /dev/null and b/libs/Monkeys/tests/sampleavatars/yybybb.jpeg differ diff --git a/libs/Monkeys/tests/words.txt b/libs/Monkeys/tests/words.txt old mode 100755 new mode 100644 index 32e1486..de9e696 --- a/libs/Monkeys/tests/words.txt +++ b/libs/Monkeys/tests/words.txt @@ -175626,7 +175626,6 @@ scytopetalaceous Scytopetalum sdeath sdrucciola -se sea seabeach seabeard diff --git a/libs/Yubico/Auth.php b/libs/Yubico/Auth.php new file mode 100644 index 0000000..7450050 --- /dev/null +++ b/libs/Yubico/Auth.php @@ -0,0 +1,304 @@ + + * @copyright 2009 Simon Josefsson + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version 1.6 + * @link http://www.yubico.com/ + */ + +/** + * Class for verifying Yubico One-Time-Passcodes + * + * Simple example: + * + * require_once 'Auth/Yubico.php'; + * $otp = "ccbbddeertkrctjkkcglfndnlihhnvekchkcctif"; + * + * # Generate a new id+key from https://api.yubico.com/get-api-key/ + * $yubi = &new Auth_Yubico('42', 'FOOBAR='); + * $auth = $yubi->verify($otp); + * if (PEAR::isError($auth)) { + * print "

Authentication failed: " . $auth->getMessage(); + * print "

Debug output from server: " . $yubi->getLastResponse(); + * } else { + * print "

You are authenticated!"; + * } + * + */ +class Yubico_Auth +{ + /**#@+ + * @access private + */ + + /** + * Yubico client ID + * @var string + */ + var $_id; + + /** + * Yubico client key + * @var string + */ + var $_key; + + /** + * URL part of validation server + * @var string + */ + var $_url; + + /** + * Query to server + * @var string + */ + var $_query; + + /** + * Response from server + * @var string + */ + var $_response; + + /** + * Flag whether to use https or not. + * @var string + */ + var $_https; + + /** + * Constructor + * + * Sets up the object + * @param string The client identity + * @param string The client MAC key (optional) + * @param boolean Flag whether to use https (optional) + * @access public + */ + function __construct($id, $key = '', $https = 0) + { + $this->_id = $id; + $this->_key = base64_decode($key); + $this->_https = $https; + } + + /** + * Specify to use a different URL part for verification. + * The default is "api.yubico.com/wsapi/verify". + * + * @param string New server URL part to use + * @access public + */ + function setURLpart($url) + { + $this->_url = $url; + } + + /** + * Get URL part to use for validation. + * + * @return string Server URL part + * @access public + */ + function getURLpart() + { + if ($this->_url) { + return $this->_url; + } else { + return "api.yubico.com/wsapi/verify"; + } + } + + /** + * Return the last query sent to the server, if any. + * + * @return string Output from server + * @access public + */ + function getLastQuery() + { + return $this->_query; + } + + /** + * Return the last data received from the server, if any. + * + * @return string Output from server + * @access public + */ + function getLastResponse() + { + return $this->_response; + } + + /** + * Parse input string into password, yubikey prefix, + * ciphertext, and OTP. + * + * @param string Input string to parse + * @param string Optional delimiter re-class, default is '[:]' + * @return array Keyed array with fields + * @access public + */ + function parsePasswordOTP($str, $delim = '[:]') + { + if (!preg_match("/^((.*)" . $delim . ")?" . + "(([cbdefghijklnrtuv]{0,16})" . + "([cbdefghijklnrtuv]{32}))$/", + $str, $matches)) { + return false; + } + $ret['password'] = $matches[2]; + $ret['otp'] = $matches[3]; + $ret['prefix'] = $matches[4]; + $ret['ciphertext'] = $matches[5]; + return $ret; + } + + /* TODO? Add functions to get parsed parts of server response? */ + + /** + * Parse parameters from last response + * + * example: getParameters("timestamp", "sessioncounter", "sessionuse"); + * + * @param array Array with strings representing parameters to parse + * @return array parameter array from last response + * @access public + */ + function getParameters($parameters) + { + if ($parameters == null) { + $parameters = array("timestamp", "sessioncounter", "sessionuse"); + } + $param_array = array(); + foreach ($parameters as $param) { + if(!preg_match("/" . $param . "=([0-9]+)/", $this->_response, $out)) { + throw new Zend_Exception('Could not parse parameter ' . $param . ' from response'); + } + $param_array[$param]=$out[1]; + } + return $param_array; + } + + /** + * Verify Yubico OTP + * + * @param string $token Yubico OTP + * @param int $use_timestamp 1=>send request with ×tamp=1 to get timestamp + * and session information in the response + * @return mixed PEAR error on error, true otherwise + * @access public + */ + function verify($token, $use_timestamp=null) + { + $ret = $this->parsePasswordOTP($token); + if (!$ret) { + throw new Zend_Exception('Could not parse Yubikey OTP'); + } + + $parameters = "id=" . $this->_id . "&otp=" . $ret['otp']; + if ($use_timestamp) $parameters = $parameters . "×tamp=1"; + /* Generate signature. */ + if($this->_key <> "") { + $signature = base64_encode(hash_hmac('sha1', $parameters, $this->_key, true)); + $signature = preg_replace('/\+/', '%2B', $signature); + $parameters .= '&h=' . $signature; + } + + /* Support https. */ + if ($this->_https) { + $this->_query = "https://"; + } else { + $this->_query = "http://"; + } + $this->_query .= $this->getURLpart(); + $this->_query .= "?"; + $this->_query .= $parameters; + + $ch = curl_init($this->_query); + curl_setopt($ch, CURLOPT_USERAGENT, "PEAR Auth_Yubico"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + $this->_response = curl_exec($ch); + curl_close($ch); + + if(!preg_match("/status=([a-zA-Z0-9_]+)/", $this->_response, $out)) { + throw new Zend_Exception('Could not parse response'); + } + + $status = $out[1]; + + /* Verify signature. */ + if($this->_key <> "") { + $rows = split("\r\n", $this->_response); + while (list($key, $val) = each($rows)) { + // = is also used in BASE64 encoding so we only replace the first = by # which is not used in BASE64 + $val = preg_replace('/=/', '#', $val, 1); + $row = split("#", $val); + // MONKEYS fix + $response[$row[0]] = @$row[1]; + } + + $parameters=array("sessioncounter", "sessionuse", "status", "t", "timestamp"); + // MONKEYS FIX + $check = ''; + + foreach ($parameters as $param) { + if (@$response[$param]!=null) { + if (@$check) $check = $check . '&'; + $check = $check . $param . '=' . $response[$param]; + } + } + + $checksignature = base64_encode(hash_hmac('sha1', $check, $this->_key, true)); + // MONKEYS FIX + if($response['h'] != $checksignature) { + throw new Zend_Exception('Checked Signature failed'); + } + } + + if ($status != 'OK') { + throw new Zend_Exception($status); + } + + + return true; + } +} +?> diff --git a/libs/Zend/Acl.php b/libs/Zend/Acl.php index a0c593f..fccbdde 100644 --- a/libs/Zend/Acl.php +++ b/libs/Zend/Acl.php @@ -16,7 +16,7 @@ * @package Zend_Acl * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Acl.php 17515 2009-08-10 13:48:44Z ralph $ + * @version $Id: Acl.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -84,12 +84,12 @@ class Zend_Acl * @var Zend_Acl_Role_Interface */ protected $_isAllowedRole = null; - + /** * @var Zend_Acl_Resource_Interface */ protected $_isAllowedResource = null; - + /** * ACL rules; whitelist (deny everything to all) by default * @@ -133,13 +133,13 @@ class Zend_Acl if (is_string($role)) { $role = new Zend_Acl_Role($role); } - + if (!$role instanceof Zend_Acl_Role_Interface) { require_once 'Zend/Acl/Exception.php'; throw new Zend_Acl_Exception('addRole() expects $role to be of type Zend_Acl_Role_Interface'); } - - + + $this->_getRoleRegistry()->add($role, $parents); return $this; @@ -218,9 +218,11 @@ class Zend_Acl } } foreach ($this->_rules['byResourceId'] as $resourceIdCurrent => $visitor) { - foreach ($visitor['byRoleId'] as $roleIdCurrent => $rules) { - if ($roleId === $roleIdCurrent) { - unset($this->_rules['byResourceId'][$resourceIdCurrent]['byRoleId'][$roleIdCurrent]); + if (array_key_exists('byRoleId', $visitor)) { + foreach ($visitor['byRoleId'] as $roleIdCurrent => $rules) { + if ($roleId === $roleIdCurrent) { + unset($this->_rules['byResourceId'][$resourceIdCurrent]['byRoleId'][$roleIdCurrent]); + } } } } @@ -263,15 +265,15 @@ class Zend_Acl */ public function addResource($resource, $parent = null) { - if (is_string($resource)) { - $resource = new Zend_Acl_Resource($resource); - } - - if (!$resource instanceof Zend_Acl_Resource_Interface) { + if (is_string($resource)) { + $resource = new Zend_Acl_Resource($resource); + } + + if (!$resource instanceof Zend_Acl_Resource_Interface) { require_once 'Zend/Acl/Exception.php'; throw new Zend_Acl_Exception('addResource() expects $resource to be of type Zend_Acl_Resource_Interface'); - } - + } + $resourceId = $resource->getResourceId(); if ($this->has($resourceId)) { @@ -303,7 +305,7 @@ class Zend_Acl return $this; } - + /** * Adds a Resource having an identifier unique to the ACL * @@ -312,7 +314,7 @@ class Zend_Acl * * @deprecated in version 1.9.1 and will be available till 2.0. New code * should use addResource() instead. - * + * * @param Zend_Acl_Resource_Interface $resource * @param Zend_Acl_Resource_Interface|string $parent * @throws Zend_Acl_Exception @@ -731,24 +733,24 @@ class Zend_Acl */ public function isAllowed($role = null, $resource = null, $privilege = null) { - // reset role & resource to null - $this->_isAllowedRole = $this->_isAllowedResource = null; - + // reset role & resource to null + $this->_isAllowedRole = $this->_isAllowedResource = null; + if (null !== $role) { - // keep track of originally called role - $this->_isAllowedRole = $role; + // keep track of originally called role + $this->_isAllowedRole = $role; $role = $this->_getRoleRegistry()->get($role); if (!$this->_isAllowedRole instanceof Zend_Acl_Role_Interface) { - $this->_isAllowedRole = $role; + $this->_isAllowedRole = $role; } } if (null !== $resource) { - // keep track of originally called resource - $this->_isAllowedResource = $resource; + // keep track of originally called resource + $this->_isAllowedResource = $resource; $resource = $this->get($resource); if (!$this->_isAllowedResource instanceof Zend_Acl_Resource_Interface) { - $this->_isAllowedResource = $resource; + $this->_isAllowedResource = $resource; } } @@ -1034,8 +1036,8 @@ class Zend_Acl ($this->_isAllowedResource instanceof Zend_Acl_Resource_Interface) ? $this->_isAllowedResource : $resource, $privilege ); - } - + } + if (null === $rule['assert'] || $assertionValue) { return $rule['type']; } else if (null !== $resource || null !== $role || null !== $privilege) { @@ -1104,4 +1106,14 @@ class Zend_Acl return $visitor['byRoleId'][$roleId]; } + + /** + * @return array of registered roles + * + */ + public function getRegisteredRoles() + { + return $this->_getRoleRegistry()->getRoles(); + } + } diff --git a/libs/Zend/Acl/Role/Registry.php b/libs/Zend/Acl/Role/Registry.php index 4e852a0..1953737 100644 --- a/libs/Zend/Acl/Role/Registry.php +++ b/libs/Zend/Acl/Role/Registry.php @@ -16,7 +16,7 @@ * @package Zend_Acl * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Registry.php 16199 2009-06-21 18:42:43Z thomas $ + * @version $Id: Registry.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -263,4 +263,9 @@ class Zend_Acl_Role_Registry return $this; } + public function getRoles() + { + return $this->_roles; + } + } diff --git a/libs/Zend/Amf/Adobe/Auth.php b/libs/Zend/Amf/Adobe/Auth.php old mode 100755 new mode 100644 index 3db44b6..35a5a3b --- a/libs/Zend/Amf/Adobe/Auth.php +++ b/libs/Zend/Amf/Adobe/Auth.php @@ -1,133 +1,133 @@ -_acl = new Zend_Acl(); - $xml = simplexml_load_file($rolefile); -/* -Roles file format: - - - - - - - - -*/ - foreach($xml->role as $role) { - $this->_acl->addRole(new Zend_Acl_Role((string)$role["id"])); - foreach($role->user as $user) { - $this->_users[(string)$user["name"]] = array("password" => (string)$user["password"], - "role" => (string)$role["id"]); - } - } - } - - /** - * Get ACL with roles from XML file - * - * @return Zend_Acl - */ - public function getAcl() - { - return $this->_acl; - } - - /** - * Perform authentication - * - * @throws Zend_Auth_Adapter_Exception - * @return Zend_Auth_Result - * @see Zend_Auth_Adapter_Interface#authenticate() - */ - public function authenticate() - { - if (empty($this->_username) || - empty($this->_password)) { - /** - * @see Zend_Auth_Adapter_Exception - */ - require_once 'Zend/Auth/Adapter/Exception.php'; - throw new Zend_Auth_Adapter_Exception('Username/password should be set'); - } - - if(!isset($this->_users[$this->_username])) { - return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, - null, - array('Username not found') - ); - } - - $user = $this->_users[$this->_username]; - if($user["password"] != $this->_password) { - return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, - null, - array('Authentication failed') - ); - } - - $id = new stdClass(); - $id->role = $user["role"]; - $id->name = $this->_username; - return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $id); - } -} +_acl = new Zend_Acl(); + $xml = simplexml_load_file($rolefile); +/* +Roles file format: + + + + + + + + +*/ + foreach($xml->role as $role) { + $this->_acl->addRole(new Zend_Acl_Role((string)$role["id"])); + foreach($role->user as $user) { + $this->_users[(string)$user["name"]] = array("password" => (string)$user["password"], + "role" => (string)$role["id"]); + } + } + } + + /** + * Get ACL with roles from XML file + * + * @return Zend_Acl + */ + public function getAcl() + { + return $this->_acl; + } + + /** + * Perform authentication + * + * @throws Zend_Auth_Adapter_Exception + * @return Zend_Auth_Result + * @see Zend_Auth_Adapter_Interface#authenticate() + */ + public function authenticate() + { + if (empty($this->_username) || + empty($this->_password)) { + /** + * @see Zend_Auth_Adapter_Exception + */ + require_once 'Zend/Auth/Adapter/Exception.php'; + throw new Zend_Auth_Adapter_Exception('Username/password should be set'); + } + + if(!isset($this->_users[$this->_username])) { + return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, + null, + array('Username not found') + ); + } + + $user = $this->_users[$this->_username]; + if($user["password"] != $this->_password) { + return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, + null, + array('Authentication failed') + ); + } + + $id = new stdClass(); + $id->role = $user["role"]; + $id->name = $this->_username; + return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $id); + } +} diff --git a/libs/Zend/Amf/Adobe/DbInspector.php b/libs/Zend/Amf/Adobe/DbInspector.php old mode 100755 new mode 100644 index bfe1e3f..de2297b --- a/libs/Zend/Amf/Adobe/DbInspector.php +++ b/libs/Zend/Amf/Adobe/DbInspector.php @@ -1,103 +1,103 @@ -describeTable('Pdo_Mysql', - * array( - * 'host' => '127.0.0.1', - * 'username' => 'webuser', - * 'password' => 'xxxxxxxx', - * 'dbname' => 'test' - * ), - * 'mytable' - * ); - * - * @param string $dbType Database adapter type for Zend_Db - * @param array|object $dbDescription Adapter-specific connection settings - * @param string $tableName Table name - * @return array Table description - * @see Zend_Db::describeTable() - * @see Zend_Db::factory() - */ - public function describeTable($dbType, $dbDescription, $tableName) - { - $db = $this->_connect($dbType, $dbDescription); - return $db->describeTable($tableName); - } - - /** - * Test database connection - * - * @param string $dbType Database adapter type for Zend_Db - * @param array|object $dbDescription Adapter-specific connection settings - * @return bool - * @see Zend_Db::factory() - */ - public function connect($dbType, $dbDescription) - { - $db = $this->_connect($dbType, $dbDescription); - $db->listTables(); - return true; - } - - /** - * Get the list of database tables - * - * @param string $dbType Database adapter type for Zend_Db - * @param array|object $dbDescription Adapter-specific connection settings - * @return array List of the tables - */ - public function getTables($dbType, $dbDescription) - { - $db = $this->_connect($dbType, $dbDescription); - return $db->listTables(); - } -} +describeTable('Pdo_Mysql', + * array( + * 'host' => '127.0.0.1', + * 'username' => 'webuser', + * 'password' => 'xxxxxxxx', + * 'dbname' => 'test' + * ), + * 'mytable' + * ); + * + * @param string $dbType Database adapter type for Zend_Db + * @param array|object $dbDescription Adapter-specific connection settings + * @param string $tableName Table name + * @return array Table description + * @see Zend_Db::describeTable() + * @see Zend_Db::factory() + */ + public function describeTable($dbType, $dbDescription, $tableName) + { + $db = $this->_connect($dbType, $dbDescription); + return $db->describeTable($tableName); + } + + /** + * Test database connection + * + * @param string $dbType Database adapter type for Zend_Db + * @param array|object $dbDescription Adapter-specific connection settings + * @return bool + * @see Zend_Db::factory() + */ + public function connect($dbType, $dbDescription) + { + $db = $this->_connect($dbType, $dbDescription); + $db->listTables(); + return true; + } + + /** + * Get the list of database tables + * + * @param string $dbType Database adapter type for Zend_Db + * @param array|object $dbDescription Adapter-specific connection settings + * @return array List of the tables + */ + public function getTables($dbType, $dbDescription) + { + $db = $this->_connect($dbType, $dbDescription); + return $db->listTables(); + } +} diff --git a/libs/Zend/Amf/Adobe/Introspector.php b/libs/Zend/Amf/Adobe/Introspector.php old mode 100755 new mode 100644 index 072f384..df2307e --- a/libs/Zend/Amf/Adobe/Introspector.php +++ b/libs/Zend/Amf/Adobe/Introspector.php @@ -1,309 +1,309 @@ -_xml = new DOMDocument('1.0', 'utf-8'); - } - - /** - * Create XML definition on an AMF service class - * - * @param string $serviceClass Service class name - * @param array $options invocation options - * @return string XML with service class introspection - */ - public function introspect($serviceClass, $options = array()) - { - $this->_options = $options; - - if (strpbrk($serviceClass, '\\/<>')) { - return $this->_returnError('Invalid service name'); - } - - // Transform com.foo.Bar into com_foo_Bar - $serviceClass = str_replace('.' , '_', $serviceClass); - - // Introspect! - if (!class_exists($serviceClass)) { - require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($serviceClass, $this->_getServicePath()); - } - - $serv = $this->_xml->createElement('service-description'); - $serv->setAttribute('xmlns', 'http://ns.adobe.com/flex/service-description/2008'); - - $this->_types = $this->_xml->createElement('types'); - $this->_ops = $this->_xml->createElement('operations'); - - $r = Zend_Server_Reflection::reflectClass($serviceClass); - $this->_addService($r, $this->_ops); - - $serv->appendChild($this->_types); - $serv->appendChild($this->_ops); - $this->_xml->appendChild($serv); - - return $this->_xml->saveXML(); - } - - /** - * Authentication handler - * - * @param Zend_Acl $acl - * @return unknown_type - */ - public function initAcl(Zend_Acl $acl) - { - return false; // we do not need auth for this class - } - - /** - * Generate map of public class attributes - * - * @param string $typename type name - * @param DOMElement $typexml target XML element - * @return void - */ - protected function _addClassAttributes($typename, DOMElement $typexml) - { - // Do not try to autoload here because _phpTypeToAS should - // have already attempted to load this class - if (!class_exists($typename, false)) { - return; - } - - $rc = new Zend_Reflection_Class($typename); - foreach ($rc->getProperties() as $prop) { - if (!$prop->isPublic()) { - continue; - } - - $propxml = $this->_xml->createElement('property'); - $propxml->setAttribute('name', $prop->getName()); - - $type = $this->_registerType($this->_getPropertyType($prop)); - $propxml->setAttribute('type', $type); - - $typexml->appendChild($propxml); - } - } - - /** - * Build XML service description from reflection class - * - * @param Zend_Server_Reflection_Class $refclass - * @param DOMElement $target target XML element - * @return void - */ - protected function _addService(Zend_Server_Reflection_Class $refclass, DOMElement $target) - { - foreach ($refclass->getMethods() as $method) { - if (!$method->isPublic() - || $method->isConstructor() - || ('__' == substr($method->name, 0, 2)) - ) { - continue; - } - - foreach ($method->getPrototypes() as $proto) { - $op = $this->_xml->createElement('operation'); - $op->setAttribute('name', $method->getName()); - - $rettype = $this->_registerType($proto->getReturnType()); - $op->setAttribute('returnType', $rettype); - - foreach ($proto->getParameters() as $param) { - $arg = $this->_xml->createElement('argument'); - $arg->setAttribute('name', $param->getName()); - - $type = $param->getType(); - if ($type == 'mixed' && ($pclass = $param->getClass())) { - $type = $pclass->getName(); - } - - $ptype = $this->_registerType($type); - $arg->setAttribute('type', $ptype); - - $op->appendChild($arg); - } - - $target->appendChild($op); - } - } - } - - /** - * Extract type of the property from DocBlock - * - * @param Zend_Reflection_Property $prop reflection property object - * @return string Property type - */ - protected function _getPropertyType(Zend_Reflection_Property $prop) - { - $docBlock = $prop->getDocComment(); - - if (!$docBlock) { - return 'Unknown'; - } - - if (!$docBlock->hasTag('var')) { - return 'Unknown'; - } - - $tag = $docBlock->getTag('var'); - return trim($tag->getDescription()); - } - - /** - * Get the array of service directories - * - * @return array Service class directories - */ - protected function _getServicePath() - { - if (isset($this->_options['server'])) { - return $this->_options['server']->getDirectory(); - } - - if (isset($this->_options['directories'])) { - return $this->_options['directories']; - } - - return array(); - } - - /** - * Map from PHP type name to AS type name - * - * @param string $typename PHP type name - * @return string AS type name - */ - protected function _phpTypeToAS($typename) - { - if (class_exists($typename)) { - $vars = get_class_vars($typename); - - if (isset($vars['_explicitType'])) { - return $vars['_explicitType']; - } - } - - if (false !== ($asname = Zend_Amf_Parse_TypeLoader::getMappedClassName($typename))) { - return $asname; - } - - return $typename; - } - - /** - * Register new type on the system - * - * @param string $typename type name - * @return string New type name - */ - protected function _registerType($typename) - { - // Known type - return its AS name - if (isset($this->_typesMap[$typename])) { - return $this->_typesMap[$typename]; - } - - // Standard types - if (in_array($typename, array('void', 'null', 'mixed', 'unknown_type'))) { - return 'Unknown'; - } - - if (in_array($typename, array('int', 'integer', 'bool', 'boolean', 'float', 'string', 'object', 'Unknown', 'stdClass', 'array'))) { - return $typename; - } - - // Resolve and store AS name - $asTypeName = $this->_phpTypeToAS($typename); - $this->_typesMap[$typename] = $asTypeName; - - // Create element for the name - $typeEl = $this->_xml->createElement('type'); - $typeEl->setAttribute('name', $asTypeName); - $this->_addClassAttributes($typename, $typeEl); - $this->_types->appendChild($typeEl); - - return $asTypeName; - } - - /** - * Return error with error message - * - * @param string $msg Error message - * @return string - */ - protected function _returnError($msg) - { - return 'ERROR: $msg'; - } -} +_xml = new DOMDocument('1.0', 'utf-8'); + } + + /** + * Create XML definition on an AMF service class + * + * @param string $serviceClass Service class name + * @param array $options invocation options + * @return string XML with service class introspection + */ + public function introspect($serviceClass, $options = array()) + { + $this->_options = $options; + + if (strpbrk($serviceClass, '\\/<>')) { + return $this->_returnError('Invalid service name'); + } + + // Transform com.foo.Bar into com_foo_Bar + $serviceClass = str_replace('.' , '_', $serviceClass); + + // Introspect! + if (!class_exists($serviceClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($serviceClass, $this->_getServicePath()); + } + + $serv = $this->_xml->createElement('service-description'); + $serv->setAttribute('xmlns', 'http://ns.adobe.com/flex/service-description/2008'); + + $this->_types = $this->_xml->createElement('types'); + $this->_ops = $this->_xml->createElement('operations'); + + $r = Zend_Server_Reflection::reflectClass($serviceClass); + $this->_addService($r, $this->_ops); + + $serv->appendChild($this->_types); + $serv->appendChild($this->_ops); + $this->_xml->appendChild($serv); + + return $this->_xml->saveXML(); + } + + /** + * Authentication handler + * + * @param Zend_Acl $acl + * @return unknown_type + */ + public function initAcl(Zend_Acl $acl) + { + return false; // we do not need auth for this class + } + + /** + * Generate map of public class attributes + * + * @param string $typename type name + * @param DOMElement $typexml target XML element + * @return void + */ + protected function _addClassAttributes($typename, DOMElement $typexml) + { + // Do not try to autoload here because _phpTypeToAS should + // have already attempted to load this class + if (!class_exists($typename, false)) { + return; + } + + $rc = new Zend_Reflection_Class($typename); + foreach ($rc->getProperties() as $prop) { + if (!$prop->isPublic()) { + continue; + } + + $propxml = $this->_xml->createElement('property'); + $propxml->setAttribute('name', $prop->getName()); + + $type = $this->_registerType($this->_getPropertyType($prop)); + $propxml->setAttribute('type', $type); + + $typexml->appendChild($propxml); + } + } + + /** + * Build XML service description from reflection class + * + * @param Zend_Server_Reflection_Class $refclass + * @param DOMElement $target target XML element + * @return void + */ + protected function _addService(Zend_Server_Reflection_Class $refclass, DOMElement $target) + { + foreach ($refclass->getMethods() as $method) { + if (!$method->isPublic() + || $method->isConstructor() + || ('__' == substr($method->name, 0, 2)) + ) { + continue; + } + + foreach ($method->getPrototypes() as $proto) { + $op = $this->_xml->createElement('operation'); + $op->setAttribute('name', $method->getName()); + + $rettype = $this->_registerType($proto->getReturnType()); + $op->setAttribute('returnType', $rettype); + + foreach ($proto->getParameters() as $param) { + $arg = $this->_xml->createElement('argument'); + $arg->setAttribute('name', $param->getName()); + + $type = $param->getType(); + if ($type == 'mixed' && ($pclass = $param->getClass())) { + $type = $pclass->getName(); + } + + $ptype = $this->_registerType($type); + $arg->setAttribute('type', $ptype); + + $op->appendChild($arg); + } + + $target->appendChild($op); + } + } + } + + /** + * Extract type of the property from DocBlock + * + * @param Zend_Reflection_Property $prop reflection property object + * @return string Property type + */ + protected function _getPropertyType(Zend_Reflection_Property $prop) + { + $docBlock = $prop->getDocComment(); + + if (!$docBlock) { + return 'Unknown'; + } + + if (!$docBlock->hasTag('var')) { + return 'Unknown'; + } + + $tag = $docBlock->getTag('var'); + return trim($tag->getDescription()); + } + + /** + * Get the array of service directories + * + * @return array Service class directories + */ + protected function _getServicePath() + { + if (isset($this->_options['server'])) { + return $this->_options['server']->getDirectory(); + } + + if (isset($this->_options['directories'])) { + return $this->_options['directories']; + } + + return array(); + } + + /** + * Map from PHP type name to AS type name + * + * @param string $typename PHP type name + * @return string AS type name + */ + protected function _phpTypeToAS($typename) + { + if (class_exists($typename)) { + $vars = get_class_vars($typename); + + if (isset($vars['_explicitType'])) { + return $vars['_explicitType']; + } + } + + if (false !== ($asname = Zend_Amf_Parse_TypeLoader::getMappedClassName($typename))) { + return $asname; + } + + return $typename; + } + + /** + * Register new type on the system + * + * @param string $typename type name + * @return string New type name + */ + protected function _registerType($typename) + { + // Known type - return its AS name + if (isset($this->_typesMap[$typename])) { + return $this->_typesMap[$typename]; + } + + // Standard types + if (in_array($typename, array('void', 'null', 'mixed', 'unknown_type'))) { + return 'Unknown'; + } + + if (in_array($typename, array('int', 'integer', 'bool', 'boolean', 'float', 'string', 'object', 'Unknown', 'stdClass', 'array'))) { + return $typename; + } + + // Resolve and store AS name + $asTypeName = $this->_phpTypeToAS($typename); + $this->_typesMap[$typename] = $asTypeName; + + // Create element for the name + $typeEl = $this->_xml->createElement('type'); + $typeEl->setAttribute('name', $asTypeName); + $this->_addClassAttributes($typename, $typeEl); + $this->_types->appendChild($typeEl); + + return $asTypeName; + } + + /** + * Return error with error message + * + * @param string $msg Error message + * @return string + */ + protected function _returnError($msg) + { + return 'ERROR: $msg'; + } +} diff --git a/libs/Zend/Amf/Auth/Abstract.php b/libs/Zend/Amf/Auth/Abstract.php old mode 100755 new mode 100644 index 910592e..135e1c6 --- a/libs/Zend/Amf/Auth/Abstract.php +++ b/libs/Zend/Amf/Auth/Abstract.php @@ -1,42 +1,42 @@ -_username = $username; - $this->_password = $password; - } -} +_username = $username; + $this->_password = $password; + } +} diff --git a/libs/Zend/Amf/Constants.php b/libs/Zend/Amf/Constants.php index c05e21f..7b5d5a7 100644 --- a/libs/Zend/Amf/Constants.php +++ b/libs/Zend/Amf/Constants.php @@ -16,18 +16,18 @@ * @package Zend_Amf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Constants.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Constants.php 18951 2009-11-12 16:26:19Z alexander $ */ /** - * The following constants are used throughout serialization and + * The following constants are used throughout serialization and * deserialization to detect the AMF marker and encoding types. * * @package Zend_Amf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -final class Zend_Amf_Constants +final class Zend_Amf_Constants { const AMF0_NUMBER = 0x00; const AMF0_BOOLEAN = 0x01; @@ -68,11 +68,11 @@ final class Zend_Amf_Constants const ET_EXTERNAL = 0x01; const ET_DYNAMIC = 0x02; const ET_PROXY = 0x03; - + const FMS_OBJECT_ENCODING = 0x01; /** - * Special content length value that indicates "unknown" content length + * Special content length value that indicates "unknown" content length * per AMF Specification */ const UNKNOWN_CONTENT_LENGTH = -1; @@ -82,6 +82,6 @@ final class Zend_Amf_Constants const CREDENTIALS_HEADER = 'Credentials'; const PERSISTENT_HEADER = 'RequestPersistentHeader'; const DESCRIBE_HEADER = 'DescribeService'; - + const GUEST_ROLE = 'anonymous'; } diff --git a/libs/Zend/Amf/Parse/Amf0/Deserializer.php b/libs/Zend/Amf/Parse/Amf0/Deserializer.php index f0db3d3..96feae5 100644 --- a/libs/Zend/Amf/Parse/Amf0/Deserializer.php +++ b/libs/Zend/Amf/Parse/Amf0/Deserializer.php @@ -17,7 +17,7 @@ * @subpackage Parse_Amf0 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Deserializer.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Deserializer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Amf_Parse_Deserializer */ @@ -270,9 +270,9 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer $returnObject->$key = $value; } } - if($returnObject instanceof Zend_Amf_Value_Messaging_ArrayCollection) { - $returnObject = get_object_vars($returnObject); - } + if($returnObject instanceof Zend_Amf_Value_Messaging_ArrayCollection) { + $returnObject = get_object_vars($returnObject); + } return $returnObject; } @@ -284,7 +284,7 @@ class Zend_Amf_Parse_Amf0_Deserializer extends Zend_Amf_Parse_Deserializer */ public function readAmf3TypeMarker() { - require_once 'Zend/Amf/Parse/Amf3/Deserializer.php'; + require_once 'Zend/Amf/Parse/Amf3/Deserializer.php'; $deserializer = new Zend_Amf_Parse_Amf3_Deserializer($this->_stream); $this->_objectEncoding = Zend_Amf_Constants::AMF3_OBJECT_ENCODING; return $deserializer->readTypeMarker(); diff --git a/libs/Zend/Amf/Parse/Amf0/Serializer.php b/libs/Zend/Amf/Parse/Amf0/Serializer.php index cc1b09b..505635a 100644 --- a/libs/Zend/Amf/Parse/Amf0/Serializer.php +++ b/libs/Zend/Amf/Parse/Amf0/Serializer.php @@ -17,7 +17,7 @@ * @subpackage Parse_Amf0 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Serializer.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Serializer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Amf_Parse_Serializer */ @@ -38,7 +38,7 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer * @var string Name of the class to be returned */ protected $_className = ''; - + /** * An array of reference objects * @var array @@ -62,7 +62,7 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer if (null !== $markerType) { //try to refrence the given object if( !$this->writeObjectReference($data, $markerType) ) { - + // Write the Type Marker to denote the following action script data type $this->_stream->writeByte($markerType); switch($markerType) { @@ -113,7 +113,7 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer $data = Zend_Amf_Parse_TypeLoader::handleResource($data); } switch (true) { - case (is_int($data) || is_float($data)): + case (is_int($data) || is_float($data)): $markerType = Zend_Amf_Constants::AMF0_NUMBER; break; case (is_bool($data)): @@ -149,13 +149,13 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer $i = 0; foreach (array_keys($data) as $key) { // check if it contains non-integer keys - if (!is_numeric($key) || intval($key) != $key) { - $markerType = Zend_Amf_Constants::AMF0_OBJECT; - break; + if (!is_numeric($key) || intval($key) != $key) { + $markerType = Zend_Amf_Constants::AMF0_OBJECT; + break; // check if it is a sparse indexed array - } else if ($key != $i) { - $markerType = Zend_Amf_Constants::AMF0_MIXEDARRAY; - break; + } else if ($key != $i) { + $markerType = Zend_Amf_Constants::AMF0_MIXEDARRAY; + break; } $i++; } @@ -174,11 +174,11 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer } return $this; } - - /** + + /** * Check if the given object is in the reference table, write the reference if it exists, * otherwise add the object to the reference table - * + * * @param mixed $object object to check for reference * @param $markerType AMF type of the object to write * @return Boolean true, if the reference was written, false otherwise @@ -188,7 +188,7 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer $markerType == Zend_Amf_Constants::AMF0_MIXEDARRAY || $markerType == Zend_Amf_Constants::AMF0_ARRAY || $markerType == Zend_Amf_Constants::AMF0_TYPEDOBJECT ) { - + $ref = array_search($object, $this->_referenceObjects,true); //handle object reference if($ref !== false){ @@ -198,7 +198,7 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer $this->_referenceObjects[] = $object; } - + return false; } @@ -213,7 +213,7 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer // Loop each element and write the name of the property. foreach ($object as $key => $value) { // skip variables starting with an _ provate transient - if( $key[0] == "_") continue; + if( $key[0] == "_") continue; $this->_stream->writeUTF($key); $this->writeTypeMarker($value); } @@ -332,9 +332,9 @@ class Zend_Amf_Parse_Amf0_Serializer extends Zend_Amf_Parse_Serializer case ($object instanceof stdClass): $className = ''; break; - // By default, use object's class name + // By default, use object's class name default: - $className = get_class($object); + $className = get_class($object); break; } if(!$className == '') { diff --git a/libs/Zend/Amf/Parse/Amf3/Deserializer.php b/libs/Zend/Amf/Parse/Amf3/Deserializer.php index b8f88da..9938cad 100644 --- a/libs/Zend/Amf/Parse/Amf3/Deserializer.php +++ b/libs/Zend/Amf/Parse/Amf3/Deserializer.php @@ -17,7 +17,7 @@ * @subpackage Parse_Amf3 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Deserializer.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Deserializer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Amf_Parse_Deserializer */ @@ -390,18 +390,18 @@ class Zend_Amf_Parse_Amf3_Deserializer extends Zend_Amf_Parse_Deserializer $returnObject->$key = $value; } } - - + + } - - if($returnObject instanceof Zend_Amf_Value_Messaging_ArrayCollection) { - if(isset($returnObject->externalizedData)) { - $returnObject = $returnObject->externalizedData; - } else { - $returnObject = get_object_vars($returnObject); - } - } - + + if($returnObject instanceof Zend_Amf_Value_Messaging_ArrayCollection) { + if(isset($returnObject->externalizedData)) { + $returnObject = $returnObject->externalizedData; + } else { + $returnObject = get_object_vars($returnObject); + } + } + return $returnObject; } diff --git a/libs/Zend/Amf/Parse/Amf3/Serializer.php b/libs/Zend/Amf/Parse/Amf3/Serializer.php index 79ef9af..8fb528c 100644 --- a/libs/Zend/Amf/Parse/Amf3/Serializer.php +++ b/libs/Zend/Amf/Parse/Amf3/Serializer.php @@ -17,7 +17,7 @@ * @subpackage Parse_Amf3 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Serializer.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Serializer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Amf_Parse_Serializer */ @@ -47,13 +47,13 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer * @var array */ protected $_referenceStrings = array(); - + /** * An array of reference class definitions, indexed by classname * @var array */ protected $_referenceDefinitions = array(); - + /** * Serialize PHP types to AMF3 and write to stream * @@ -112,7 +112,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $data = Zend_Amf_Parse_TypeLoader::handleResource($data); } switch (true) { - case (null === $data): + case (null === $data): $markerType = Zend_Amf_Constants::AMF3_NULL; break; case (is_bool($data)): @@ -150,7 +150,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $markerType = Zend_Amf_Constants::AMF3_OBJECT; } break; - default: + default: require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('Unsupported data type: ' . gettype($data)); } @@ -190,7 +190,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $this->_stream->writeByte($int & 0xff); return $this; } - + /** * Send string to output stream, without trying to reference it. * The string is prepended with strlen($string) << 1 | 0x01 @@ -202,7 +202,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $ref = strlen($string) << 1 | 0x01; $this->writeInteger($ref); $this->_stream->writeBytes($string); - + return $this; } @@ -219,7 +219,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $this->writeInteger(0x01); return $this; } - + $ref = array_search($string, $this->_referenceStrings, true); if($ref === false){ $this->_referenceStrings[] = $string; @@ -228,10 +228,10 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $ref <<= 1; $this->writeInteger($ref); } - + return $this; } - + /** * Send ByteArray to output stream * @@ -242,7 +242,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer if($this->writeObjectReference($data)){ return $this; } - + if(is_string($data)) { //nothing to do } else if ($data instanceof Zend_Amf_Value_ByteArray) { @@ -251,13 +251,13 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('Invalid ByteArray specified; must be a string or Zend_Amf_Value_ByteArray'); } - + $this->writeBinaryString($data); - + return $this; } - - /** + + /** * Send xml to output stream * * @param DOMDocument|SimpleXMLElement $xml @@ -267,7 +267,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer { if($this->writeObjectReference($xml)){ return $this; - } + } if(is_string($xml)) { //nothing to do @@ -279,9 +279,9 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('Invalid xml specified; must be a DOMDocument or SimpleXMLElement'); } - + $this->writeBinaryString($xml); - + return $this; } @@ -296,7 +296,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer if($this->writeObjectReference($date)){ return $this; } - + if ($date instanceof DateTime) { $dateString = $date->format('U') * 1000; } elseif ($date instanceof Zend_Date) { @@ -323,7 +323,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer if($this->writeObjectReference($array)){ return $this; } - + // have to seperate mixed from numberic keys. $numeric = array(); $string = array(); @@ -353,11 +353,11 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer } return $this; } - + /** * Check if the given object is in the reference table, write the reference if it exists, * otherwise add the object to the reference table - * + * * @param mixed $object object to check for reference * @return Boolean true, if the reference was written, false otherwise */ @@ -384,7 +384,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer if($this->writeObjectReference($object)){ return $this; } - + $className = ''; //Check to see if the object is a typed object and we need to change @@ -408,59 +408,59 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $className = ''; break; - // By default, use object's class name + // By default, use object's class name default: - $className = get_class($object); + $className = get_class($object); break; } - + $writeTraits = true; - + //check to see, if we have a corresponding definition if(array_key_exists($className, $this->_referenceDefinitions)){ $traitsInfo = $this->_referenceDefinitions[$className]['id']; $encoding = $this->_referenceDefinitions[$className]['encoding']; $propertyNames = $this->_referenceDefinitions[$className]['propertyNames']; - + $traitsInfo = ($traitsInfo << 2) | 0x01; - + $writeTraits = false; } else { $propertyNames = array(); - + if($className == ''){ //if there is no className, we interpret the class as dynamic without any sealed members $encoding = Zend_Amf_Constants::ET_DYNAMIC; } else { $encoding = Zend_Amf_Constants::ET_PROPLIST; - + foreach($object as $key => $value) { if( $key[0] != "_") { $propertyNames[] = $key; } } } - + $this->_referenceDefinitions[$className] = array( 'id' => count($this->_referenceDefinitions), 'encoding' => $encoding, 'propertyNames' => $propertyNames, ); - + $traitsInfo = Zend_Amf_Constants::AMF3_OBJECT_ENCODING; $traitsInfo |= $encoding << 2; $traitsInfo |= (count($propertyNames) << 4); } - + $this->writeInteger($traitsInfo); - + if($writeTraits){ $this->writeString($className); foreach ($propertyNames as $value) { $this->writeString($value); } } - + try { switch($encoding) { case Zend_Amf_Constants::ET_PROPLIST: @@ -474,7 +474,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer foreach ($propertyNames as $key) { $this->writeTypeMarker($object->$key); } - + //Write remaining properties foreach($object as $key => $value){ if(!in_array($key,$propertyNames) && $key[0] != "_"){ @@ -482,7 +482,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer $this->writeTypeMarker($value); } } - + //Write an empty string to end the dynamic part $this->writeString(''); break; @@ -490,7 +490,7 @@ class Zend_Amf_Parse_Amf3_Serializer extends Zend_Amf_Parse_Serializer require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('External Object Encoding not implemented'); break; - default: + default: require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('Unknown Object Encoding type: ' . $encoding); } diff --git a/libs/Zend/Amf/Parse/Deserializer.php b/libs/Zend/Amf/Parse/Deserializer.php index 8aa85d0..5208c61 100644 --- a/libs/Zend/Amf/Parse/Deserializer.php +++ b/libs/Zend/Amf/Parse/Deserializer.php @@ -17,14 +17,14 @@ * @subpackage Parse * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Deserializer.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Deserializer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * Abstract cass that all deserializer must implement. * - * Logic for deserialization of the AMF envelop is based on resources supplied - * by Adobe Blaze DS. For and example of deserialization please review the BlazeDS + * Logic for deserialization of the AMF envelop is based on resources supplied + * by Adobe Blaze DS. For and example of deserialization please review the BlazeDS * source tree. * * @see http://opensource.adobe.com/svn/opensource/blazeds/trunk/modules/core/src/java/flex/messaging/io/amf/ diff --git a/libs/Zend/Amf/Parse/InputStream.php b/libs/Zend/Amf/Parse/InputStream.php index 3f842e6..12dff0a 100644 --- a/libs/Zend/Amf/Parse/InputStream.php +++ b/libs/Zend/Amf/Parse/InputStream.php @@ -17,7 +17,7 @@ * @subpackage Parse * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: InputStream.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: InputStream.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Amf_Util_BinaryStream */ @@ -26,7 +26,7 @@ require_once 'Zend/Amf/Util/BinaryStream.php'; /** * InputStream is used to iterate at a binary level through the AMF request. * - * InputStream extends BinaryStream as eventually BinaryStream could be placed + * InputStream extends BinaryStream as eventually BinaryStream could be placed * outside of Zend_Amf in order to allow other packages to use the class. * * @package Zend_Amf diff --git a/libs/Zend/Amf/Parse/OutputStream.php b/libs/Zend/Amf/Parse/OutputStream.php index d35a0d2..043e108 100644 --- a/libs/Zend/Amf/Parse/OutputStream.php +++ b/libs/Zend/Amf/Parse/OutputStream.php @@ -17,7 +17,7 @@ * @subpackage Parse * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: OutputStream.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: OutputStream.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Amf_Util_BinaryStream */ @@ -26,7 +26,7 @@ require_once 'Zend/Amf/Util/BinaryStream.php'; /** * Iterate at a binary level through the AMF response * - * OutputStream extends BinaryStream as eventually BinaryStream could be placed + * OutputStream extends BinaryStream as eventually BinaryStream could be placed * outside of Zend_Amf in order to allow other packages to use the class. * * @uses Zend_Amf_Util_BinaryStream @@ -39,7 +39,7 @@ class Zend_Amf_Parse_OutputStream extends Zend_Amf_Util_BinaryStream { /** * Constructor - * + * * @return void */ public function __construct() diff --git a/libs/Zend/Amf/Parse/Resource/MysqlResult.php b/libs/Zend/Amf/Parse/Resource/MysqlResult.php old mode 100755 new mode 100644 index 131655c..6990b0c --- a/libs/Zend/Amf/Parse/Resource/MysqlResult.php +++ b/libs/Zend/Amf/Parse/Resource/MysqlResult.php @@ -1,70 +1,70 @@ - Value is Mysql type (exact string) => PHP type - */ - static public $fieldTypes = array( - "int" => "int", - "timestamp" => "int", - "year" => "int", - "real" => "float", - ); - /** - * Parse resource into array - * - * @param resource $resource - * @return array - */ - public function parse($resource) { - $result = array(); - $fieldcnt = mysql_num_fields($resource); - $fields_transform = array(); - for($i=0;$i<$fieldcnt;$i++) { - $type = mysql_field_type($resource, $i); - if(isset(self::$fieldTypes[$type])) { - $fields_transform[mysql_field_name($resource, $i)] = self::$fieldTypes[$type]; - } - } - - while($row = mysql_fetch_object($resource)) { - foreach($fields_transform as $fieldname => $fieldtype) { - settype($row->$fieldname, $fieldtype); - } - $result[] = $row; - } - return $result; - } -} + Value is Mysql type (exact string) => PHP type + */ + static public $fieldTypes = array( + "int" => "int", + "timestamp" => "int", + "year" => "int", + "real" => "float", + ); + /** + * Parse resource into array + * + * @param resource $resource + * @return array + */ + public function parse($resource) { + $result = array(); + $fieldcnt = mysql_num_fields($resource); + $fields_transform = array(); + for($i=0;$i<$fieldcnt;$i++) { + $type = mysql_field_type($resource, $i); + if(isset(self::$fieldTypes[$type])) { + $fields_transform[mysql_field_name($resource, $i)] = self::$fieldTypes[$type]; + } + } + + while($row = mysql_fetch_object($resource)) { + foreach($fields_transform as $fieldname => $fieldtype) { + settype($row->$fieldname, $fieldtype); + } + $result[] = $row; + } + return $result; + } +} diff --git a/libs/Zend/Amf/Parse/Resource/MysqliResult.php b/libs/Zend/Amf/Parse/Resource/MysqliResult.php index 6aff9cb..52c413b 100644 --- a/libs/Zend/Amf/Parse/Resource/MysqliResult.php +++ b/libs/Zend/Amf/Parse/Resource/MysqliResult.php @@ -17,11 +17,11 @@ * @subpackage Parse * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MysqliResult.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: MysqliResult.php 18951 2009-11-12 16:26:19Z alexander $ */ /** - * This class will convert mysql result resource to array suitable for passing + * This class will convert mysql result resource to array suitable for passing * to the external entities. * * @package Zend_Amf @@ -29,89 +29,89 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Amf_Parse_Resource_MysqliResult +class Zend_Amf_Parse_Resource_MysqliResult { - /** - * mapping taken from http://forums.mysql.com/read.php?52,255868,255895#msg-255895 - */ + /** + * mapping taken from http://forums.mysql.com/read.php?52,255868,255895#msg-255895 + */ static public $mysqli_type = array( - 0 => "MYSQLI_TYPE_DECIMAL", - 1 => "MYSQLI_TYPE_TINYINT", - 2 => "MYSQLI_TYPE_SMALLINT", - 3 => "MYSQLI_TYPE_INTEGER", - 4 => "MYSQLI_TYPE_FLOAT", - 5 => "MYSQLI_TYPE_DOUBLE", - 7 => "MYSQLI_TYPE_TIMESTAMP", - 8 => "MYSQLI_TYPE_BIGINT", - 9 => "MYSQLI_TYPE_MEDIUMINT", - 10 => "MYSQLI_TYPE_DATE", - 11 => "MYSQLI_TYPE_TIME", - 12 => "MYSQLI_TYPE_DATETIME", - 13 => "MYSQLI_TYPE_YEAR", - 14 => "MYSQLI_TYPE_DATE", - 16 => "MYSQLI_TYPE_BIT", - 246 => "MYSQLI_TYPE_DECIMAL", - 247 => "MYSQLI_TYPE_ENUM", - 248 => "MYSQLI_TYPE_SET", - 249 => "MYSQLI_TYPE_TINYBLOB", - 250 => "MYSQLI_TYPE_MEDIUMBLOB", - 251 => "MYSQLI_TYPE_LONGBLOB", - 252 => "MYSQLI_TYPE_BLOB", - 253 => "MYSQLI_TYPE_VARCHAR", - 254 => "MYSQLI_TYPE_CHAR", - 255 => "MYSQLI_TYPE_GEOMETRY", + 0 => "MYSQLI_TYPE_DECIMAL", + 1 => "MYSQLI_TYPE_TINYINT", + 2 => "MYSQLI_TYPE_SMALLINT", + 3 => "MYSQLI_TYPE_INTEGER", + 4 => "MYSQLI_TYPE_FLOAT", + 5 => "MYSQLI_TYPE_DOUBLE", + 7 => "MYSQLI_TYPE_TIMESTAMP", + 8 => "MYSQLI_TYPE_BIGINT", + 9 => "MYSQLI_TYPE_MEDIUMINT", + 10 => "MYSQLI_TYPE_DATE", + 11 => "MYSQLI_TYPE_TIME", + 12 => "MYSQLI_TYPE_DATETIME", + 13 => "MYSQLI_TYPE_YEAR", + 14 => "MYSQLI_TYPE_DATE", + 16 => "MYSQLI_TYPE_BIT", + 246 => "MYSQLI_TYPE_DECIMAL", + 247 => "MYSQLI_TYPE_ENUM", + 248 => "MYSQLI_TYPE_SET", + 249 => "MYSQLI_TYPE_TINYBLOB", + 250 => "MYSQLI_TYPE_MEDIUMBLOB", + 251 => "MYSQLI_TYPE_LONGBLOB", + 252 => "MYSQLI_TYPE_BLOB", + 253 => "MYSQLI_TYPE_VARCHAR", + 254 => "MYSQLI_TYPE_CHAR", + 255 => "MYSQLI_TYPE_GEOMETRY", ); - + // Build an associative array for a type look up static $mysqli_to_php = array( - "MYSQLI_TYPE_DECIMAL" => 'float', - "MYSQLI_TYPE_NEWDECIMAL" => 'float', - "MYSQLI_TYPE_BIT" => 'integer', - "MYSQLI_TYPE_TINYINT" => 'integer', - "MYSQLI_TYPE_SMALLINT" => 'integer', - "MYSQLI_TYPE_MEDIUMINT" => 'integer', - "MYSQLI_TYPE_BIGINT" => 'integer', - "MYSQLI_TYPE_INTEGER" => 'integer', - "MYSQLI_TYPE_FLOAT" => 'float', - "MYSQLI_TYPE_DOUBLE" => 'float', - "MYSQLI_TYPE_NULL" => 'null', - "MYSQLI_TYPE_TIMESTAMP" => 'string', - "MYSQLI_TYPE_INT24" => 'integer', - "MYSQLI_TYPE_DATE" => 'string', - "MYSQLI_TYPE_TIME" => 'string', - "MYSQLI_TYPE_DATETIME" => 'string', - "MYSQLI_TYPE_YEAR" => 'string', - "MYSQLI_TYPE_NEWDATE" => 'string', - "MYSQLI_TYPE_ENUM" => 'string', - "MYSQLI_TYPE_SET" => 'string', - "MYSQLI_TYPE_TINYBLOB" => 'object', - "MYSQLI_TYPE_MEDIUMBLOB" => 'object', - "MYSQLI_TYPE_LONGBLOB" => 'object', - "MYSQLI_TYPE_BLOB" => 'object', - "MYSQLI_TYPE_CHAR" => 'string', - "MYSQLI_TYPE_VARCHAR" => 'string', - "MYSQLI_TYPE_GEOMETRY" => 'object', - "MYSQLI_TYPE_BIT" => 'integer', - ); + "MYSQLI_TYPE_DECIMAL" => 'float', + "MYSQLI_TYPE_NEWDECIMAL" => 'float', + "MYSQLI_TYPE_BIT" => 'integer', + "MYSQLI_TYPE_TINYINT" => 'integer', + "MYSQLI_TYPE_SMALLINT" => 'integer', + "MYSQLI_TYPE_MEDIUMINT" => 'integer', + "MYSQLI_TYPE_BIGINT" => 'integer', + "MYSQLI_TYPE_INTEGER" => 'integer', + "MYSQLI_TYPE_FLOAT" => 'float', + "MYSQLI_TYPE_DOUBLE" => 'float', + "MYSQLI_TYPE_NULL" => 'null', + "MYSQLI_TYPE_TIMESTAMP" => 'string', + "MYSQLI_TYPE_INT24" => 'integer', + "MYSQLI_TYPE_DATE" => 'string', + "MYSQLI_TYPE_TIME" => 'string', + "MYSQLI_TYPE_DATETIME" => 'string', + "MYSQLI_TYPE_YEAR" => 'string', + "MYSQLI_TYPE_NEWDATE" => 'string', + "MYSQLI_TYPE_ENUM" => 'string', + "MYSQLI_TYPE_SET" => 'string', + "MYSQLI_TYPE_TINYBLOB" => 'object', + "MYSQLI_TYPE_MEDIUMBLOB" => 'object', + "MYSQLI_TYPE_LONGBLOB" => 'object', + "MYSQLI_TYPE_BLOB" => 'object', + "MYSQLI_TYPE_CHAR" => 'string', + "MYSQLI_TYPE_VARCHAR" => 'string', + "MYSQLI_TYPE_GEOMETRY" => 'object', + "MYSQLI_TYPE_BIT" => 'integer', + ); /** * Parse resource into array - * + * * @param resource $resource * @return array */ public function parse($resource) { - + $result = array(); $fieldcnt = mysqli_num_fields($resource); - - + + $fields_transform = array(); for($i=0;$i<$fieldcnt;$i++) { $finfo = mysqli_fetch_field_direct($resource, $i); - + if(isset(self::$mysqli_type[$finfo->type])) { $fields_transform[$finfo->name] = self::$mysqli_to_php[self::$mysqli_type[$finfo->type]]; } diff --git a/libs/Zend/Amf/Parse/Resource/Stream.php b/libs/Zend/Amf/Parse/Resource/Stream.php old mode 100755 new mode 100644 index 2acedc0..f83f308 --- a/libs/Zend/Amf/Parse/Resource/Stream.php +++ b/libs/Zend/Amf/Parse/Resource/Stream.php @@ -1,42 +1,42 @@ - 'Zend_Amf_Value_Messaging_RemotingMessage', 'flex.messaging.io.ArrayCollection' => 'Zend_Amf_Value_Messaging_ArrayCollection', ); - + /** * @var Zend_Loader_PluginLoader_Interface */ @@ -153,79 +153,79 @@ final class Zend_Amf_Parse_TypeLoader { self::$classMap = self::$_defaultClassMap; } - + /** * Set loader for resource type handlers - * - * @param Zend_Loader_PluginLoader_Interface $loader + * + * @param Zend_Loader_PluginLoader_Interface $loader */ public static function setResourceLoader(Zend_Loader_PluginLoader_Interface $loader) { - self::$_resourceLoader = $loader; + self::$_resourceLoader = $loader; } - + /** - * Add directory to the list of places where to look for resource handlers - * + * Add directory to the list of places where to look for resource handlers + * * @param string $prefix * @param string $dir */ public static function addResourceDirectory($prefix, $dir) { - if(self::$_resourceLoader) { - self::$_resourceLoader->addPrefixPath($prefix, $dir); - } + if(self::$_resourceLoader) { + self::$_resourceLoader->addPrefixPath($prefix, $dir); + } } - + /** * Get plugin class that handles this resource - * + * * @param resource $resource Resource type * @return string Class name */ public static function getResourceParser($resource) { - if(self::$_resourceLoader) { - $type = preg_replace("/[^A-Za-z0-9_]/", " ", get_resource_type($resource)); - $type = str_replace(" ","", ucwords($type)); - return self::$_resourceLoader->load($type); - } - return false; + if(self::$_resourceLoader) { + $type = preg_replace("/[^A-Za-z0-9_]/", " ", get_resource_type($resource)); + $type = str_replace(" ","", ucwords($type)); + return self::$_resourceLoader->load($type); + } + return false; } - + /** * Convert resource to a serializable object - * + * * @param resource $resource * @return mixed */ public static function handleResource($resource) { - if(!self::$_resourceLoader) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Unable to handle resources - resource plugin loader not set'); - } - try { - while(is_resource($resource)) { - $resclass = self::getResourceParser($resource); - if(!$resclass) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Can not serialize resource type: '. get_resource_type($resource)); - } - $parser = new $resclass(); - if(is_callable(array($parser, 'parse'))) { - $resource = $parser->parse($resource); - } else { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception("Could not call parse() method on class $resclass"); - } - } - return $resource; - } catch(Zend_Amf_Exception $e) { - throw $e; - } catch(Exception $e) { - require_once 'Zend/Amf/Exception.php'; - throw new Zend_Amf_Exception('Can not serialize resource type: '. get_resource_type($resource)); - } + if(!self::$_resourceLoader) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Unable to handle resources - resource plugin loader not set'); + } + try { + while(is_resource($resource)) { + $resclass = self::getResourceParser($resource); + if(!$resclass) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Can not serialize resource type: '. get_resource_type($resource)); + } + $parser = new $resclass(); + if(is_callable(array($parser, 'parse'))) { + $resource = $parser->parse($resource); + } else { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception("Could not call parse() method on class $resclass"); + } + } + return $resource; + } catch(Zend_Amf_Exception $e) { + throw $e; + } catch(Exception $e) { + require_once 'Zend/Amf/Exception.php'; + throw new Zend_Amf_Exception('Can not serialize resource type: '. get_resource_type($resource)); + } } } diff --git a/libs/Zend/Amf/Request/Http.php b/libs/Zend/Amf/Request/Http.php index 0a4f4a7..7eac5f7 100644 --- a/libs/Zend/Amf/Request/Http.php +++ b/libs/Zend/Amf/Request/Http.php @@ -17,7 +17,7 @@ * @subpackage Request * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Http.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Http.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Amf_Request */ @@ -54,8 +54,8 @@ class Zend_Amf_Request_Http extends Zend_Amf_Request */ public function __construct() { - // php://input allows you to read raw POST data. It is a less memory - // intensive alternative to $HTTP_RAW_POST_DATA and does not need any + // php://input allows you to read raw POST data. It is a less memory + // intensive alternative to $HTTP_RAW_POST_DATA and does not need any // special php.ini directives $amfRequest = file_get_contents('php://input'); @@ -70,7 +70,7 @@ class Zend_Amf_Request_Http extends Zend_Amf_Request /** * Retrieve raw AMF Request - * + * * @return string */ public function getRawRequest() diff --git a/libs/Zend/Amf/Response.php b/libs/Zend/Amf/Response.php index f2af19e..d3af1e3 100644 --- a/libs/Zend/Amf/Response.php +++ b/libs/Zend/Amf/Response.php @@ -16,7 +16,7 @@ * @package Zend_Amf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Response.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Response.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Amf_Constants */ @@ -172,7 +172,7 @@ class Zend_Amf_Response /** * Retrieve attached AMF message headers - * + * * @return array Array of Zend_Amf_Value_MessageHeader objects */ public function getAmfHeaders() diff --git a/libs/Zend/Amf/Server.php b/libs/Zend/Amf/Server.php index a280945..2b1143c 100644 --- a/libs/Zend/Amf/Server.php +++ b/libs/Zend/Amf/Server.php @@ -16,7 +16,7 @@ * @package Zend_Amf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Server.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Server.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Server_Interface */ @@ -62,10 +62,10 @@ class Zend_Amf_Server implements Zend_Server_Interface * @var array */ protected $_methods = array(); - + /** * Array of classes that can be called without being explicitly loaded - * + * * Keys are class names. * * @var array @@ -121,13 +121,13 @@ class Zend_Amf_Server implements Zend_Server_Interface /** * Authentication handler object - * + * * @var Zend_Amf_Auth_Abstract */ protected $_auth; /** * ACL handler object - * + * * @var Zend_Acl */ protected $_acl; @@ -136,9 +136,9 @@ class Zend_Amf_Server implements Zend_Server_Interface */ public function __construct() { - Zend_Amf_Parse_TypeLoader::setResourceLoader(new Zend_Loader_PluginLoader(array("Zend_Amf_Parse_Resource" => "Zend/Amf/Parse/Resource"))); + Zend_Amf_Parse_TypeLoader::setResourceLoader(new Zend_Loader_PluginLoader(array("Zend_Amf_Parse_Resource" => "Zend/Amf/Parse/Resource"))); } - + /** * Set authentication adapter * @@ -159,7 +159,7 @@ class Zend_Amf_Server implements Zend_Server_Interface { return $this->_auth; } - + /** * Set ACL adapter * @@ -180,7 +180,7 @@ class Zend_Amf_Server implements Zend_Server_Interface { return $this->_acl; } - + /** * Set production flag * @@ -225,8 +225,8 @@ class Zend_Amf_Server implements Zend_Server_Interface } /** - * Check if the ACL allows accessing the function or method - * + * Check if the ACL allows accessing the function or method + * * @param string|object $object Object or class being accessed * @param string $function Function or method being acessed * @return unknown_type @@ -239,7 +239,7 @@ class Zend_Amf_Server implements Zend_Server_Interface if($object) { $class = is_object($object)?get_class($object):$object; if(!$this->_acl->has($class)) { - require_once 'Zend/Acl/Resource.php'; + require_once 'Zend/Acl/Resource.php'; $this->_acl->add(new Zend_Acl_Resource($class)); } $call = array($object, "initAcl"); @@ -250,15 +250,15 @@ class Zend_Amf_Server implements Zend_Server_Interface } else { $class = null; } - + $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $role = $auth->getIdentity()->role; } else { - if($this->_acl->hasRole(Zend_Amf_Constants::GUEST_ROLE)) { + if($this->_acl->hasRole(Zend_Amf_Constants::GUEST_ROLE)) { $role = Zend_Amf_Constants::GUEST_ROLE; } else { - require_once 'Zend/Amf/Server/Exception.php'; + require_once 'Zend/Amf/Server/Exception.php'; throw new Zend_Amf_Server_Exception("Unauthenticated access not allowed"); } } @@ -269,7 +269,7 @@ class Zend_Amf_Server implements Zend_Server_Interface throw new Zend_Amf_Server_Exception("Access not allowed"); } } - + /** * Get PluginLoader for the Server * @@ -277,13 +277,13 @@ class Zend_Amf_Server implements Zend_Server_Interface */ protected function getLoader() { - if(empty($this->_loader)) { - require_once 'Zend/Loader/PluginLoader.php'; - $this->_loader = new Zend_Loader_PluginLoader(); - } - return $this->_loader; + if(empty($this->_loader)) { + require_once 'Zend/Loader/PluginLoader.php'; + $this->_loader = new Zend_Loader_PluginLoader(); + } + return $this->_loader; } - + /** * Loads a remote class or method and executes the function and returns * the result @@ -295,23 +295,23 @@ class Zend_Amf_Server implements Zend_Server_Interface */ protected function _dispatch($method, $params = null, $source = null) { - if($source) { - if(($mapped = Zend_Amf_Parse_TypeLoader::getMappedClassName($source)) !== false) { - $source = $mapped; - } - } + if($source) { + if(($mapped = Zend_Amf_Parse_TypeLoader::getMappedClassName($source)) !== false) { + $source = $mapped; + } + } $qualifiedName = empty($source) ? $method : $source.".".$method; - + if (!isset($this->_table[$qualifiedName])) { // if source is null a method that was not defined was called. if ($source) { - $className = str_replace(".", "_", $source); - if(class_exists($className, false) && !isset($this->_classAllowed[$className])) { - require_once 'Zend/Amf/Server/Exception.php'; + $className = str_replace(".", "_", $source); + if(class_exists($className, false) && !isset($this->_classAllowed[$className])) { + require_once 'Zend/Amf/Server/Exception.php'; throw new Zend_Amf_Server_Exception('Can not call "' . $className . '" - use setClass()'); - } + } try { - $this->getLoader()->load($className); + $this->getLoader()->load($className); } catch (Exception $e) { require_once 'Zend/Amf/Server/Exception.php'; throw new Zend_Amf_Server_Exception('Class "' . $className . '" does not exist: '.$e->getMessage()); @@ -326,7 +326,7 @@ class Zend_Amf_Server implements Zend_Server_Interface $info = $this->_table[$qualifiedName]; $argv = $info->getInvokeArguments(); - + if (0 < count($argv)) { $params = array_merge($params, $argv); } @@ -377,13 +377,13 @@ class Zend_Amf_Server implements Zend_Server_Interface require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php'; switch($message->operation) { case Zend_Amf_Value_Messaging_CommandMessage::DISCONNECT_OPERATION : - case Zend_Amf_Value_Messaging_CommandMessage::CLIENT_PING_OPERATION : + case Zend_Amf_Value_Messaging_CommandMessage::CLIENT_PING_OPERATION : $return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message); break; case Zend_Amf_Value_Messaging_CommandMessage::LOGIN_OPERATION : $data = explode(':', base64_decode($message->body)); - $userid = $data[0]; - $password = isset($data[1])?$data[1]:""; + $userid = $data[0]; + $password = isset($data[1])?$data[1]:""; if(empty($userid)) { require_once 'Zend/Amf/Server/Exception.php'; throw new Zend_Amf_Server_Exception('Login failed: username not supplied'); @@ -410,7 +410,7 @@ class Zend_Amf_Server implements Zend_Server_Interface /** * Create appropriate error message - * + * * @param int $objectEncoding Current AMF encoding * @param string $message Message that was being processed when error happened * @param string $description Error description @@ -422,55 +422,55 @@ class Zend_Amf_Server implements Zend_Server_Interface protected function _errorMessage($objectEncoding, $message, $description, $detail, $code, $line) { $return = null; - switch ($objectEncoding) { - case Zend_Amf_Constants::AMF0_OBJECT_ENCODING : - return array ( - 'description' => ($this->isProduction ()) ? '' : $description, - 'detail' => ($this->isProduction ()) ? '' : $detail, - 'line' => ($this->isProduction ()) ? 0 : $line, - 'code' => $code - ); - case Zend_Amf_Constants::AMF3_OBJECT_ENCODING : - require_once 'Zend/Amf/Value/Messaging/ErrorMessage.php'; - $return = new Zend_Amf_Value_Messaging_ErrorMessage ( $message ); - $return->faultString = $this->isProduction () ? '' : $description; - $return->faultCode = $code; - $return->faultDetail = $this->isProduction () ? '' : $detail; - break; - } + switch ($objectEncoding) { + case Zend_Amf_Constants::AMF0_OBJECT_ENCODING : + return array ( + 'description' => ($this->isProduction ()) ? '' : $description, + 'detail' => ($this->isProduction ()) ? '' : $detail, + 'line' => ($this->isProduction ()) ? 0 : $line, + 'code' => $code + ); + case Zend_Amf_Constants::AMF3_OBJECT_ENCODING : + require_once 'Zend/Amf/Value/Messaging/ErrorMessage.php'; + $return = new Zend_Amf_Value_Messaging_ErrorMessage ( $message ); + $return->faultString = $this->isProduction () ? '' : $description; + $return->faultCode = $code; + $return->faultDetail = $this->isProduction () ? '' : $detail; + break; + } return $return; } - /** - * Handle AMF authenticaton - * - * @param string $userid - * @param string $password - * @return boolean - */ - protected function _handleAuth( $userid, $password) - { - if (!$this->_auth) { - return true; - } - $this->_auth->setCredentials($userid, $password); - $auth = Zend_Auth::getInstance(); - $result = $auth->authenticate($this->_auth); - if ($result->isValid()) { - if (!$this->isSession()) { - $this->setSession(); - } - return true; - } else { - // authentication failed, good bye - require_once 'Zend/Amf/Server/Exception.php'; - throw new Zend_Amf_Server_Exception( - "Authentication failed: " . join("\n", - $result->getMessages()), $result->getCode()); - } - + /** + * Handle AMF authenticaton + * + * @param string $userid + * @param string $password + * @return boolean + */ + protected function _handleAuth( $userid, $password) + { + if (!$this->_auth) { + return true; + } + $this->_auth->setCredentials($userid, $password); + $auth = Zend_Auth::getInstance(); + $result = $auth->authenticate($this->_auth); + if ($result->isValid()) { + if (!$this->isSession()) { + $this->setSession(); + } + return true; + } else { + // authentication failed, good bye + require_once 'Zend/Amf/Server/Exception.php'; + throw new Zend_Amf_Server_Exception( + "Authentication failed: " . join("\n", + $result->getMessages()), $result->getCode()); + } + } - + /** * Takes the deserialized AMF request and performs any operations. * @@ -490,38 +490,38 @@ class Zend_Amf_Server implements Zend_Server_Interface // set reponse encoding $response->setObjectEncoding($objectEncoding); - + $responseBody = $request->getAmfBodies(); $handleAuth = false; - if ($this->_auth) { - $headers = $request->getAmfHeaders(); - if (isset($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]) && - isset($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->userid)) { - $handleAuth = true; - } - } - + if ($this->_auth) { + $headers = $request->getAmfHeaders(); + if (isset($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]) && + isset($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->userid)) { + $handleAuth = true; + } + } + // Iterate through each of the service calls in the AMF request foreach($responseBody as $body) { try { - if ($handleAuth) { - if ($this->_handleAuth( - $headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->userid, - $headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->password)) { - // use RequestPersistentHeader to clear credentials - $response->addAmfHeader( - new Zend_Amf_Value_MessageHeader( - Zend_Amf_Constants::PERSISTENT_HEADER, - false, - new Zend_Amf_Value_MessageHeader( - Zend_Amf_Constants::CREDENTIALS_HEADER, - false, null))); - $handleAuth = false; - } - } - + if ($handleAuth) { + if ($this->_handleAuth( + $headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->userid, + $headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->password)) { + // use RequestPersistentHeader to clear credentials + $response->addAmfHeader( + new Zend_Amf_Value_MessageHeader( + Zend_Amf_Constants::PERSISTENT_HEADER, + false, + new Zend_Amf_Value_MessageHeader( + Zend_Amf_Constants::CREDENTIALS_HEADER, + false, null))); + $handleAuth = false; + } + } + if ($objectEncoding == Zend_Amf_Constants::AMF0_OBJECT_ENCODING) { // AMF0 Object Encoding $targetURI = $body->getTargetURI(); @@ -567,7 +567,7 @@ class Zend_Amf_Server implements Zend_Server_Interface } $responseType = Zend_AMF_Constants::RESULT_METHOD; } catch (Exception $e) { - $return = $this->_errorMessage($objectEncoding, $message, + $return = $this->_errorMessage($objectEncoding, $message, $e->getMessage(), $e->getTraceAsString(),$e->getCode(), $e->getLine()); $responseType = Zend_AMF_Constants::STATUS_METHOD; } @@ -584,10 +584,10 @@ class Zend_Amf_Server implements Zend_Server_Interface if(!strpos($_SERVER['QUERY_STRING'], $currentID) !== FALSE) { if(strrpos($_SERVER['QUERY_STRING'], "?") !== FALSE) { $joint = "&"; - } - } + } + } } - + // create a new AMF message header with the session id as a variable. $sessionValue = $joint . $this->_sessionName . "=" . $currentID; $sessionHeader = new Zend_Amf_Value_MessageHeader(Zend_Amf_Constants::URL_APPEND_HEADER, false, $sessionValue); @@ -739,11 +739,11 @@ class Zend_Amf_Server implements Zend_Server_Interface } // Use the class name as the name space by default. - + if ($namespace == '') { $namespace = is_object($class) ? get_class($class) : $class; } - + $this->_classAllowed[is_object($class) ? get_class($class) : $class] = true; $this->_methods[] = Zend_Server_Reflection::reflectClass($class, $argv, $namespace); @@ -793,12 +793,12 @@ class Zend_Amf_Server implements Zend_Server_Interface /** * Creates an array of directories in which services can reside. * TODO: add support for prefixes? - * + * * @param string $dir */ public function addDirectory($dir) { - $this->getLoader()->addPrefixPath("", $dir); + $this->getLoader()->addPrefixPath("", $dir); } /** diff --git a/libs/Zend/Amf/Util/BinaryStream.php b/libs/Zend/Amf/Util/BinaryStream.php index c14a61f..b63f2ec 100644 --- a/libs/Zend/Amf/Util/BinaryStream.php +++ b/libs/Zend/Amf/Util/BinaryStream.php @@ -17,7 +17,7 @@ * @subpackage Util * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: BinaryStream.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: BinaryStream.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -53,8 +53,8 @@ class Zend_Amf_Util_BinaryStream /** * Constructor * - * Create a refrence to a byte stream that is going to be parsed or created - * by the methods in the class. Detect if the class should use big or + * Create a refrence to a byte stream that is going to be parsed or created + * by the methods in the class. Detect if the class should use big or * little Endian encoding. * * @param string $stream use '' if creating a new stream or pass a string if reading. diff --git a/libs/Zend/Amf/Value/ByteArray.php b/libs/Zend/Amf/Value/ByteArray.php index 69159a8..85ccf64 100644 --- a/libs/Zend/Amf/Value/ByteArray.php +++ b/libs/Zend/Amf/Value/ByteArray.php @@ -17,7 +17,7 @@ * @subpackage Value * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ByteArray.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ByteArray.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,7 +28,7 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Amf_Value_ByteArray +class Zend_Amf_Value_ByteArray { /** * @var string ByteString Data diff --git a/libs/Zend/Amf/Value/MessageBody.php b/libs/Zend/Amf/Value/MessageBody.php index 1a5eab4..1f2eb9b 100644 --- a/libs/Zend/Amf/Value/MessageBody.php +++ b/libs/Zend/Amf/Value/MessageBody.php @@ -1,182 +1,182 @@ - - * This Message structure defines how a local client would - * invoke a method/operation on a remote server. Additionally, - * the response from the Server is structured identically. - * - * @package Zend_Amf - * @subpackage Value - * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ -class Zend_Amf_Value_MessageBody -{ - /** - * A string describing which operation, function, or method - * is to be remotley invoked. - * @var string - */ - protected $_targetUri = ""; - - /** - * Universal Resource Identifier that uniquely targets the originator's - * Object that should receive the server's response. The server will - * use this path specification to target the "OnResult()" or "onStatus()" - * handlers within the client. For Flash, it specifies an ActionScript - * Object path only. The NetResponse object pointed to by the Response Uri - * contains the connection state information. Passing/specifying this - * provides a convenient mechanism for the client/server to share access - * to an object that is managing the state of the shared connection. - * - * Since the server will use this field in the event of an error, - * this field is required even if a successful server request would - * not be expected to return a value to the client. - * - * @var string - */ - protected $_responseUri = ""; - - /** - * Contains the actual data associated with the operation. It contains - * the client's parameter data that is passed to the server's operation/method. - * When serializing a root level data type or a parameter list array, no - * name field is included. That is, the data is anonomously represented - * as "Type Marker"/"Value" pairs. When serializing member data, the data is - * represented as a series of "Name"/"Type"/"Value" combinations. - * - * For server generated responses, it may contain any ActionScript - * data/objects that the server was expected to provide. - * - * @var string - */ - protected $_data; - - /** - * Constructor - * - * @param string $targetUri - * @param string $responseUri - * @param string $data - * @return void - */ - public function __construct($targetUri, $responseUri, $data) - { - $this->setTargetUri($targetUri); - $this->setResponseUri($responseUri); - $this->setData($data); - } - - /** - * Retrieve target Uri - * - * @return string - */ - public function getTargetUri() - { - return $this->_targetUri; - } - - /** - * Set target Uri - * - * @param string $targetUri - * @return Zend_Amf_Value_MessageBody - */ - public function setTargetUri($targetUri) - { - if (null === $targetUri) { - $targetUri = ''; - } - $this->_targetUri = (string) $targetUri; - return $this; - } - - /** - * Get target Uri - * - * @return string - */ - public function getResponseUri() - { - return $this->_responseUri; - } - - /** - * Set response Uri - * - * @param string $responseUri - * @return Zend_Amf_Value_MessageBody - */ - public function setResponseUri($responseUri) - { - if (null === $responseUri) { - $responseUri = ''; - } - $this->_responseUri = $responseUri; - return $this; - } - - /** - * Retrieve response data - * - * @return string - */ - public function getData() - { - return $this->_data; - } - - /** - * Set response data - * - * @param mixed $data - * @return Zend_Amf_Value_MessageBody - */ - public function setData($data) - { - $this->_data = $data; - return $this; - } - - /** - * Set reply method - * - * @param string $methodName - * @return Zend_Amf_Value_MessageBody - */ - public function setReplyMethod($methodName) - { - if (!preg_match('#^[/?]#', $methodName)) { - $this->_targetUri = rtrim($this->_targetUri, '/') . '/'; - } - $this->_targetUri = $this->_targetUri . $methodName; - return $this; - } -} + + * This Message structure defines how a local client would + * invoke a method/operation on a remote server. Additionally, + * the response from the Server is structured identically. + * + * @package Zend_Amf + * @subpackage Value + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Amf_Value_MessageBody +{ + /** + * A string describing which operation, function, or method + * is to be remotley invoked. + * @var string + */ + protected $_targetUri = ""; + + /** + * Universal Resource Identifier that uniquely targets the originator's + * Object that should receive the server's response. The server will + * use this path specification to target the "OnResult()" or "onStatus()" + * handlers within the client. For Flash, it specifies an ActionScript + * Object path only. The NetResponse object pointed to by the Response Uri + * contains the connection state information. Passing/specifying this + * provides a convenient mechanism for the client/server to share access + * to an object that is managing the state of the shared connection. + * + * Since the server will use this field in the event of an error, + * this field is required even if a successful server request would + * not be expected to return a value to the client. + * + * @var string + */ + protected $_responseUri = ""; + + /** + * Contains the actual data associated with the operation. It contains + * the client's parameter data that is passed to the server's operation/method. + * When serializing a root level data type or a parameter list array, no + * name field is included. That is, the data is anonomously represented + * as "Type Marker"/"Value" pairs. When serializing member data, the data is + * represented as a series of "Name"/"Type"/"Value" combinations. + * + * For server generated responses, it may contain any ActionScript + * data/objects that the server was expected to provide. + * + * @var string + */ + protected $_data; + + /** + * Constructor + * + * @param string $targetUri + * @param string $responseUri + * @param string $data + * @return void + */ + public function __construct($targetUri, $responseUri, $data) + { + $this->setTargetUri($targetUri); + $this->setResponseUri($responseUri); + $this->setData($data); + } + + /** + * Retrieve target Uri + * + * @return string + */ + public function getTargetUri() + { + return $this->_targetUri; + } + + /** + * Set target Uri + * + * @param string $targetUri + * @return Zend_Amf_Value_MessageBody + */ + public function setTargetUri($targetUri) + { + if (null === $targetUri) { + $targetUri = ''; + } + $this->_targetUri = (string) $targetUri; + return $this; + } + + /** + * Get target Uri + * + * @return string + */ + public function getResponseUri() + { + return $this->_responseUri; + } + + /** + * Set response Uri + * + * @param string $responseUri + * @return Zend_Amf_Value_MessageBody + */ + public function setResponseUri($responseUri) + { + if (null === $responseUri) { + $responseUri = ''; + } + $this->_responseUri = $responseUri; + return $this; + } + + /** + * Retrieve response data + * + * @return string + */ + public function getData() + { + return $this->_data; + } + + /** + * Set response data + * + * @param mixed $data + * @return Zend_Amf_Value_MessageBody + */ + public function setData($data) + { + $this->_data = $data; + return $this; + } + + /** + * Set reply method + * + * @param string $methodName + * @return Zend_Amf_Value_MessageBody + */ + public function setReplyMethod($methodName) + { + if (!preg_match('#^[/?]#', $methodName)) { + $this->_targetUri = rtrim($this->_targetUri, '/') . '/'; + } + $this->_targetUri = $this->_targetUri . $methodName; + return $this; + } +} diff --git a/libs/Zend/Amf/Value/MessageHeader.php b/libs/Zend/Amf/Value/MessageHeader.php index 0b9dced..6495083 100644 --- a/libs/Zend/Amf/Value/MessageHeader.php +++ b/libs/Zend/Amf/Value/MessageHeader.php @@ -17,13 +17,13 @@ * @subpackage Value * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MessageHeader.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: MessageHeader.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * Message Headers provide context for the processing of the * the AMF Packet and all subsequent Messages. - * + * * Multiple Message Headers may be included within an AMF Packet. * * @package Zend_Amf @@ -31,7 +31,7 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Amf_Value_MessageHeader +class Zend_Amf_Value_MessageHeader { /** * Name of the header diff --git a/libs/Zend/Amf/Value/Messaging/ArrayCollection.php b/libs/Zend/Amf/Value/Messaging/ArrayCollection.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Amf/Value/Messaging/CommandMessage.php b/libs/Zend/Amf/Value/Messaging/CommandMessage.php index c03e259..121c928 100644 --- a/libs/Zend/Amf/Value/Messaging/CommandMessage.php +++ b/libs/Zend/Amf/Value/Messaging/CommandMessage.php @@ -1,131 +1,131 @@ -body - * of the message. - * @const int - */ - const LOGIN_OPERATION = 8; - - /** - * This operation is used to log the user out of the current channel, and - * will invalidate the server session if the channel is HTTP based. - * @const int - */ - const LOGOUT_OPERATION = 9; - - /** - * This operation is used to indicate that the client's subscription to a - * remote destination has been invalidated. - * @const int - */ - const SESSION_INVALIDATE_OPERATION = 10; - - /** - * This operation is used by the MultiTopicConsumer to subscribe/unsubscribe - * from multiple subtopics/selectors in the same message. - * @const int - */ - const MULTI_SUBSCRIBE_OPERATION = 11; - - /** - * This operation is used to indicate that a channel has disconnected - * @const int - */ - const DISCONNECT_OPERATION = 12; - - /** - * This is the default operation for new CommandMessage instances. - * @const int - */ - const UNKNOWN_OPERATION = 10000; - - /** - * The operation to execute for messages of this type - * @var int - */ - public $operation = self::UNKNOWN_OPERATION; -} + */ +require_once 'Zend/Amf/Value/Messaging/AsyncMessage.php'; + +/** + * A message that represents an infrastructure command passed between + * client and server. Subscribe/unsubscribe operations result in + * CommandMessage transmissions, as do polling operations. + * + * Corresponds to flex.messaging.messages.CommandMessage + * + * Note: THESE VALUES MUST BE THE SAME ON CLIENT AND SERVER + * + * @package Zend_Amf + * @subpackage Value + * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Amf_Value_Messaging_CommandMessage extends Zend_Amf_Value_Messaging_AsyncMessage +{ + /** + * This operation is used to subscribe to a remote destination. + * @const int + */ + const SUBSCRIBE_OPERATION = 0; + + /** + * This operation is used to unsubscribe from a remote destination. + * @const int + */ + const UNSUSBSCRIBE_OPERATION = 1; + + /** + * This operation is used to poll a remote destination for pending, + * undelivered messages. + * @const int + */ + const POLL_OPERATION = 2; + + /** + * This operation is used by a remote destination to sync missed or cached messages + * back to a client as a result of a client issued poll command. + * @const int + */ + const CLIENT_SYNC_OPERATION = 4; + + /** + * This operation is used to test connectivity over the current channel to + * the remote endpoint. + * @const int + */ + const CLIENT_PING_OPERATION = 5; + + /** + * This operation is used to request a list of failover endpoint URIs + * for the remote destination based on cluster membership. + * @const int + */ + const CLUSTER_REQUEST_OPERATION = 7; + + /** + * This operation is used to send credentials to the endpoint so that + * the user can be logged in over the current channel. + * The credentials need to be Base64 encoded and stored in the body + * of the message. + * @const int + */ + const LOGIN_OPERATION = 8; + + /** + * This operation is used to log the user out of the current channel, and + * will invalidate the server session if the channel is HTTP based. + * @const int + */ + const LOGOUT_OPERATION = 9; + + /** + * This operation is used to indicate that the client's subscription to a + * remote destination has been invalidated. + * @const int + */ + const SESSION_INVALIDATE_OPERATION = 10; + + /** + * This operation is used by the MultiTopicConsumer to subscribe/unsubscribe + * from multiple subtopics/selectors in the same message. + * @const int + */ + const MULTI_SUBSCRIBE_OPERATION = 11; + + /** + * This operation is used to indicate that a channel has disconnected + * @const int + */ + const DISCONNECT_OPERATION = 12; + + /** + * This is the default operation for new CommandMessage instances. + * @const int + */ + const UNKNOWN_OPERATION = 10000; + + /** + * The operation to execute for messages of this type + * @var int + */ + public $operation = self::UNKNOWN_OPERATION; +} diff --git a/libs/Zend/Amf/Value/Messaging/ErrorMessage.php b/libs/Zend/Amf/Value/Messaging/ErrorMessage.php index 363d837..7240ea0 100644 --- a/libs/Zend/Amf/Value/Messaging/ErrorMessage.php +++ b/libs/Zend/Amf/Value/Messaging/ErrorMessage.php @@ -1,67 +1,67 @@ -mergeOptions($options, $this->_loadConfig($options['config'])); } - + $this->_options = $options; $options = array_change_key_case($options, CASE_LOWER); @@ -136,32 +136,43 @@ class Zend_Application if (!empty($options['phpsettings'])) { $this->setPhpSettings($options['phpsettings']); } - + if (!empty($options['includepaths'])) { $this->setIncludePaths($options['includepaths']); } - + if (!empty($options['autoloadernamespaces'])) { $this->setAutoloaderNamespaces($options['autoloadernamespaces']); } - + + if (!empty($options['autoloaderzfpath'])) { + $autoloader = $this->getAutoloader(); + if (method_exists($autoloader, 'setZfPath')) { + $zfPath = $options['autoloaderzfpath']; + $zfVersion = !empty($options['autoloaderzfversion']) + ? $options['autoloaderzfversion'] + : 'latest'; + $autoloader->setZfPath($zfPath, $zfVersion); + } + } + if (!empty($options['bootstrap'])) { $bootstrap = $options['bootstrap']; - + if (is_string($bootstrap)) { $this->setBootstrap($bootstrap); } elseif (is_array($bootstrap)) { if (empty($bootstrap['path'])) { throw new Zend_Application_Exception('No bootstrap path provided'); } - + $path = $bootstrap['path']; $class = null; - + if (!empty($bootstrap['class'])) { $class = $bootstrap['class']; } - + $this->setBootstrap($path, $class); } else { throw new Zend_Application_Exception('Invalid bootstrap information provided'); @@ -173,7 +184,7 @@ class Zend_Application /** * Retrieve application options (for caching) - * + * * @return array */ public function getOptions() @@ -183,19 +194,19 @@ class Zend_Application /** * Is an option present? - * - * @param string $key + * + * @param string $key * @return bool */ public function hasOption($key) { - return in_array($key, $this->_optionKeys); + return in_array(strtolower($key), $this->_optionKeys); } /** * Retrieve a single option - * - * @param string $key + * + * @param string $key * @return mixed */ public function getOption($key) @@ -210,9 +221,9 @@ class Zend_Application /** * Merge options recursively - * - * @param array $array1 - * @param mixed $array2 + * + * @param array $array1 + * @param mixed $array2 * @return array */ public function mergeOptions(array $array1, $array2 = null) @@ -221,7 +232,7 @@ class Zend_Application foreach ($array2 as $key => $val) { if (is_array($array2[$key])) { $array1[$key] = (array_key_exists($key, $array1) && is_array($array1[$key])) - ? $this->mergeOptions($array1[$key], $array2[$key]) + ? $this->mergeOptions($array1[$key], $array2[$key]) : $array2[$key]; } else { $array1[$key] = $val; @@ -233,8 +244,8 @@ class Zend_Application /** * Set PHP configuration settings - * - * @param array $settings + * + * @param array $settings * @param string $prefix Key prefix to prepend to array values (used to map . separated INI values) * @return Zend_Application */ @@ -248,14 +259,14 @@ class Zend_Application $this->setPhpSettings($value, $key . '.'); } } - + return $this; } /** * Set include path - * - * @param array $paths + * + * @param array $paths * @return Zend_Application */ public function setIncludePaths(array $paths) @@ -267,31 +278,31 @@ class Zend_Application /** * Set autoloader namespaces - * - * @param array $namespaces + * + * @param array $namespaces * @return Zend_Application */ public function setAutoloaderNamespaces(array $namespaces) { $autoloader = $this->getAutoloader(); - + foreach ($namespaces as $namespace) { $autoloader->registerNamespace($namespace); } - + return $this; } /** * Set bootstrap path/class - * - * @param string $path - * @param string $class + * + * @param string $path + * @param string $class * @return Zend_Application */ public function setBootstrap($path, $class = null) { - // setOptions() can potentially send a null value; specify default + // setOptions() can potentially send a null value; specify default // here if (null === $class) { $class = 'Bootstrap'; @@ -308,13 +319,13 @@ class Zend_Application if (!$this->_bootstrap instanceof Zend_Application_Bootstrap_Bootstrapper) { throw new Zend_Application_Exception('Bootstrap class does not implement Zend_Application_Bootstrap_Bootstrapper'); } - + return $this; } /** * Get bootstrap object - * + * * @return Zend_Application_Bootstrap_BootstrapAbstract */ public function getBootstrap() @@ -327,18 +338,19 @@ class Zend_Application /** * Bootstrap application - * + * + * @param null|string|array $resource * @return Zend_Application */ - public function bootstrap() + public function bootstrap($resource = null) { - $this->getBootstrap()->bootstrap(); + $this->getBootstrap()->bootstrap($resource); return $this; } /** * Run the application - * + * * @return void */ public function run() @@ -348,25 +360,25 @@ class Zend_Application /** * Load configuration file of options - * + * * @param string $file - * @throws Zend_Application_Exception When invalid configuration file is provided + * @throws Zend_Application_Exception When invalid configuration file is provided * @return array */ protected function _loadConfig($file) { $environment = $this->getEnvironment(); $suffix = strtolower(pathinfo($file, PATHINFO_EXTENSION)); - + switch ($suffix) { case 'ini': $config = new Zend_Config_Ini($file, $environment); break; - + case 'xml': $config = new Zend_Config_Xml($file, $environment); break; - + case 'php': case 'inc': $config = include $file; @@ -375,11 +387,11 @@ class Zend_Application } return $config; break; - + default: throw new Zend_Application_Exception('Invalid configuration file provided; unknown config type'); } - + return $config->toArray(); } } diff --git a/libs/Zend/Application/Bootstrap/Bootstrap.php b/libs/Zend/Application/Bootstrap/Bootstrap.php index 9acdf5b..e6acefb 100644 --- a/libs/Zend/Application/Bootstrap/Bootstrap.php +++ b/libs/Zend/Application/Bootstrap/Bootstrap.php @@ -17,7 +17,7 @@ * @subpackage Bootstrap * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Bootstrap.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Bootstrap.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,15 +32,15 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Application_Bootstrap_Bootstrap +class Zend_Application_Bootstrap_Bootstrap extends Zend_Application_Bootstrap_BootstrapAbstract { /** * Constructor * * Ensure FrontController resource is registered - * - * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application + * + * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application * @return void */ public function __construct($application) @@ -54,12 +54,12 @@ class Zend_Application_Bootstrap_Bootstrap /** * Run the application * - * Checks to see that we have a default controller directory. If not, an + * Checks to see that we have a default controller directory. If not, an * exception is thrown. * - * If so, it registers the bootstrap with the 'bootstrap' parameter of + * If so, it registers the bootstrap with the 'bootstrap' parameter of * the front controller, and dispatches the front controller. - * + * * @return void * @throws Zend_Application_Bootstrap_Exception */ diff --git a/libs/Zend/Application/Bootstrap/BootstrapAbstract.php b/libs/Zend/Application/Bootstrap/BootstrapAbstract.php index 4cadaef..94399a8 100644 --- a/libs/Zend/Application/Bootstrap/BootstrapAbstract.php +++ b/libs/Zend/Application/Bootstrap/BootstrapAbstract.php @@ -17,7 +17,7 @@ * @subpackage Bootstrap * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: BootstrapAbstract.php 17802 2009-08-24 21:15:12Z matthew $ + * @version $Id: BootstrapAbstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,7 +32,7 @@ * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_Application_Bootstrap_BootstrapAbstract - implements Zend_Application_Bootstrap_Bootstrapper, + implements Zend_Application_Bootstrap_Bootstrapper, Zend_Application_Bootstrap_ResourceBootstrapper { /** @@ -57,7 +57,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Flattened (lowercase) option keys used for lookups - * + * * @var array */ protected $_optionKeys = array(); @@ -90,12 +90,12 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Constructor * - * Sets application object, initializes options, and prepares list of + * Sets application object, initializes options, and prepares list of * initializer methods. - * + * * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application * @return void - * @throws Zend_Application_Bootstrap_Exception When invalid applicaiton is provided + * @throws Zend_Application_Bootstrap_Exception When invalid applicaiton is provided */ public function __construct($application) { @@ -106,8 +106,8 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Set class state - * - * @param array $options + * + * @param array $options * @return Zend_Application_Bootstrap_BootstrapAbstract */ public function setOptions(array $options) @@ -115,7 +115,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract $this->_options = $this->mergeOptions($this->_options, $options); $options = array_change_key_case($options, CASE_LOWER); - $this->_optionKeys = array_keys($options); + $this->_optionKeys = array_merge($this->_optionKeys, array_keys($options)); $methods = get_class_methods($this); foreach ($methods as $key => $method) { @@ -124,7 +124,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract if (array_key_exists('pluginpaths', $options)) { $pluginLoader = $this->getPluginLoader(); - + foreach ($options['pluginpaths'] as $prefix => $path) { $pluginLoader->addPrefixPath($prefix, $path); } @@ -147,7 +147,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Get current options from bootstrap - * + * * @return array */ public function getOptions() @@ -157,8 +157,8 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Is an option present? - * - * @param string $key + * + * @param string $key * @return bool */ public function hasOption($key) @@ -168,8 +168,8 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Retrieve a single option - * - * @param string $key + * + * @param string $key * @return mixed */ public function getOption($key) @@ -184,9 +184,9 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Merge options recursively - * - * @param array $array1 - * @param mixed $array2 + * + * @param array $array1 + * @param mixed $array2 * @return array */ public function mergeOptions(array $array1, $array2 = null) @@ -195,7 +195,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract foreach ($array2 as $key => $val) { if (is_array($array2[$key])) { $array1[$key] = (array_key_exists($key, $array1) && is_array($array1[$key])) - ? $this->mergeOptions($array1[$key], $array2[$key]) + ? $this->mergeOptions($array1[$key], $array2[$key]) : $array2[$key]; } else { $array1[$key] = $val; @@ -207,10 +207,10 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Get class resources (as resource/method pairs) - * + * * Uses get_class_methods() by default, reflection on prior to 5.2.6, - * as a bug prevents the usage of get_class_methods() there. - * + * as a bug prevents the usage of get_class_methods() there. + * * @return array */ public function getClassResources() @@ -220,14 +220,14 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract $class = new ReflectionObject($this); $classMethods = $class->getMethods(); $methodNames = array(); - + foreach ($classMethods as $method) { $methodNames[] = $method->getName(); } } else { $methodNames = get_class_methods($this); } - + $this->_classResources = array(); foreach ($methodNames as $method) { if (5 < strlen($method) && '_init' === substr($method, 0, 5)) { @@ -235,13 +235,13 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract } } } - + return $this->_classResources; } /** * Get class resource names - * + * * @return array */ public function getClassResourceNames() @@ -252,7 +252,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Register a new resource plugin - * + * * @param string|Zend_Application_Resource_Resource $resource * @param mixed $options * @return Zend_Application_Bootstrap_BootstrapAbstract @@ -277,8 +277,8 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Unregister a resource from the bootstrap - * - * @param string|Zend_Application_Resource_Resource $resource + * + * @param string|Zend_Application_Resource_Resource $resource * @return Zend_Application_Bootstrap_BootstrapAbstract * @throws Zend_Application_Bootstrap_Exception When unknown resource type is provided */ @@ -304,16 +304,16 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract } /** - * Is the requested plugin resource registered? - * - * @param string $resource + * Is the requested plugin resource registered? + * + * @param string $resource * @return bool */ public function hasPluginResource($resource) { return (null !== $this->getPluginResource($resource)); } - + /** * Get a registered plugin resource * @@ -365,12 +365,12 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract } } - return null; + return null; } /** * Retrieve all plugin resources - * + * * @return array */ public function getPluginResources() @@ -383,7 +383,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Retrieve plugin resource names - * + * * @return array */ public function getPluginResourceNames() @@ -394,8 +394,8 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Set plugin loader for loading resources - * - * @param Zend_Loader_PluginLoader_Interface $loader + * + * @param Zend_Loader_PluginLoader_Interface $loader * @return Zend_Application_Bootstrap_BootstrapAbstract */ public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader) @@ -403,7 +403,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract $this->_pluginLoader = $loader; return $this; } - + /** * Get the plugin loader for resources * @@ -424,13 +424,13 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Set application/parent bootstrap - * - * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application + * + * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application * @return Zend_Application_Bootstrap_BootstrapAbstract */ public function setApplication($application) { - if (($application instanceof Zend_Application) + if (($application instanceof Zend_Application) || ($application instanceof Zend_Application_Bootstrap_Bootstrapper) ) { $this->_application = $application; @@ -439,10 +439,10 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract } return $this; } - + /** * Retrieve parent application instance - * + * * @return Zend_Application|Zend_Application_Bootstrap_Bootstrapper */ public function getApplication() @@ -452,7 +452,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Retrieve application environment - * + * * @return string */ public function getEnvironment() @@ -466,13 +466,13 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Set resource container * - * By default, if a resource callback has a non-null return value, this - * value will be stored in a container using the resource name as the + * By default, if a resource callback has a non-null return value, this + * value will be stored in a container using the resource name as the * key. * * Containers must be objects, and must allow setting public properties. - * - * @param object $container + * + * @param object $container * @return Zend_Application_Bootstrap_BootstrapAbstract */ public function setContainer($container) @@ -486,7 +486,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Retrieve resource container - * + * * @return object */ public function getContainer() @@ -500,11 +500,11 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Determine if a resource has been stored in the container * - * During bootstrap resource initialization, you may return a value. If + * During bootstrap resource initialization, you may return a value. If * you do, it will be stored in the {@link setContainer() container}. * You can use this method to determine if a value was stored. - * - * @param string $name + * + * @param string $name * @return bool */ public function hasResource($name) @@ -517,13 +517,13 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Retrieve a resource from the container * - * During bootstrap resource initialization, you may return a value. If + * During bootstrap resource initialization, you may return a value. If * you do, it will be stored in the {@link setContainer() container}. * You can use this method to retrieve that value. * * If no value was returned, this will return a null value. - * - * @param string $name + * + * @param string $name * @return null|mixed */ public function getResource($name) @@ -551,7 +551,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Implement PHP's magic to ask for the * existence of a ressource in the bootstrap - * + * * @param string $prop * @return bool */ @@ -567,12 +567,12 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract * child class 'Bootstrap' (in which case, overriding this method * would result in it being treated as a constructor). * - * If you need to override this functionality, override the + * If you need to override this functionality, override the * {@link _bootstrap()} method. - * + * * @param null|string|array $resource * @return Zend_Application_Bootstrap_BootstrapAbstract - * @throws Zend_Application_Bootstrap_Exception When invalid argument was passed + * @throws Zend_Application_Bootstrap_Exception When invalid argument was passed */ final public function bootstrap($resource = null) { @@ -582,11 +582,11 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Overloading: intercept calls to bootstrap() methods - * - * @param string $method + * + * @param string $method * @param array $args * @return void - * @throws Zend_Application_Bootstrap_Exception On invalid method name + * @throws Zend_Application_Bootstrap_Exception On invalid method name */ public function __call($method, $args) { @@ -601,12 +601,12 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Bootstrap implementation * - * This method may be overridden to provide custom bootstrapping logic. + * This method may be overridden to provide custom bootstrapping logic. * It is the sole method called by {@link bootstrap()}. - * - * @param null|string|array $resource + * + * @param null|string|array $resource * @return void - * @throws Zend_Application_Bootstrap_Exception When invalid argument was passed + * @throws Zend_Application_Bootstrap_Exception When invalid argument was passed */ protected function _bootstrap($resource = null) { @@ -614,7 +614,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract foreach ($this->getClassResourceNames() as $resource) { $this->_executeResource($resource); } - + foreach ($this->getPluginResourceNames() as $resource) { $this->_executeResource($resource); } @@ -632,14 +632,14 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Execute a resource * - * Checks to see if the resource has already been run. If not, it searches - * first to see if a local method matches the resource, and executes that. - * If not, it checks to see if a plugin resource matches, and executes that + * Checks to see if the resource has already been run. If not, it searches + * first to see if a local method matches the resource, and executes that. + * If not, it checks to see if a plugin resource matches, and executes that * if found. * * Finally, if not found, it throws an exception. * - * @param string $resource + * @param string $resource * @return void * @throws Zend_Application_Bootstrap_Exception When resource not found */ @@ -661,7 +661,7 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract $method = $classResources[$resourceName]; $return = $this->$method(); unset($this->_started[$resourceName]); - $this->_markRun($resource); + $this->_markRun($resourceName); if (null !== $return) { $this->getContainer()->{$resourceName} = $return; @@ -689,9 +689,9 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Load a plugin resource - * - * @param string $resource - * @param array|object|null $options + * + * @param string $resource + * @param array|object|null $options * @return string|false */ protected function _loadPluginResource($resource, $options) @@ -719,8 +719,8 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract /** * Mark a resource as having run - * - * @param string $resource + * + * @param string $resource * @return void */ protected function _markRun($resource) @@ -739,8 +739,8 @@ abstract class Zend_Application_Bootstrap_BootstrapAbstract * - class name (if none of the above are true) * * The name is then cast to lowercase. - * - * @param Zend_Application_Resource_Resource $resource + * + * @param Zend_Application_Resource_Resource $resource * @return string */ protected function _resolvePluginResourceName($resource) diff --git a/libs/Zend/Application/Bootstrap/Bootstrapper.php b/libs/Zend/Application/Bootstrap/Bootstrapper.php index 22cc8a9..f0aff8e 100644 --- a/libs/Zend/Application/Bootstrap/Bootstrapper.php +++ b/libs/Zend/Application/Bootstrap/Bootstrapper.php @@ -17,7 +17,7 @@ * @subpackage Bootstrap * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Bootstrapper.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: Bootstrapper.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,61 +33,61 @@ interface Zend_Application_Bootstrap_Bootstrapper { /** * Constructor - * - * @param Zend_Application $application + * + * @param Zend_Application $application * @return void */ public function __construct($application); /** * Set bootstrap options - * - * @param array $options + * + * @param array $options * @return Zend_Application_Bootstrap_Bootstrapper */ public function setOptions(array $options); /** * Retrieve application object - * + * * @return Zend_Application|Zend_Application_Bootstrap_Bootstrapper */ public function getApplication(); /** * Retrieve application environment - * + * * @return string */ public function getEnvironment(); /** - * Retrieve list of class resource initializers (_init* methods). Returns + * Retrieve list of class resource initializers (_init* methods). Returns * as resource/method pairs. - * + * * @return array */ public function getClassResources(); /** - * Retrieve list of class resource initializer names (resource names only, + * Retrieve list of class resource initializer names (resource names only, * no method names) - * + * * @return array */ public function getClassResourceNames(); /** * Bootstrap application or individual resource - * - * @param null|string $resource + * + * @param null|string $resource * @return mixed */ public function bootstrap($resource = null); /** * Run the application - * + * * @return void */ public function run(); diff --git a/libs/Zend/Application/Bootstrap/ResourceBootstrapper.php b/libs/Zend/Application/Bootstrap/ResourceBootstrapper.php index c504301..0366bc4 100644 --- a/libs/Zend/Application/Bootstrap/ResourceBootstrapper.php +++ b/libs/Zend/Application/Bootstrap/ResourceBootstrapper.php @@ -17,7 +17,7 @@ * @subpackage Bootstrap * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ResourceBootstrapper.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: ResourceBootstrapper.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,62 +33,62 @@ interface Zend_Application_Bootstrap_ResourceBootstrapper { /** * Register a resource with the bootstrap - * - * @param string|Zend_Application_Resource_Resource $resource - * @param null|array|Zend_Config $options + * + * @param string|Zend_Application_Resource_Resource $resource + * @param null|array|Zend_Config $options * @return Zend_Application_Bootstrap_ResourceBootstrapper */ public function registerPluginResource($resource, $options = null); /** * Unregister a resource from the bootstrap - * - * @param string|Zend_Application_Resource_Resource $resource + * + * @param string|Zend_Application_Resource_Resource $resource * @return Zend_Application_Bootstrap_ResourceBootstrapper */ public function unregisterPluginResource($resource); /** * Is the requested resource registered? - * - * @param string $resource + * + * @param string $resource * @return bool */ public function hasPluginResource($resource); /** * Retrieve resource - * - * @param string $resource + * + * @param string $resource * @return Zend_Application_Resource_Resource */ public function getPluginResource($resource); /** * Get all resources - * + * * @return array */ public function getPluginResources(); /** * Get just resource names - * + * * @return array */ public function getPluginResourceNames(); /** * Set plugin loader to use to fetch resources - * - * @param Zend_Loader_PluginLoader_Interface Zend_Loader_PluginLoader + * + * @param Zend_Loader_PluginLoader_Interface Zend_Loader_PluginLoader * @return Zend_Application_Bootstrap_ResourceBootstrapper */ public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader); /** * Retrieve plugin loader for resources - * + * * @return Zend_Loader_PluginLoader */ public function getPluginLoader(); diff --git a/libs/Zend/Application/Module/Autoloader.php b/libs/Zend/Application/Module/Autoloader.php index 651bdd5..f9a7690 100644 --- a/libs/Zend/Application/Module/Autoloader.php +++ b/libs/Zend/Application/Module/Autoloader.php @@ -16,7 +16,7 @@ * @package Zend_Application * @subpackage Module * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Autoloader.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Autoloader.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -25,7 +25,7 @@ require_once 'Zend/Loader/Autoloader/Resource.php'; /** * Resource loader for application module classes - * + * * @uses Zend_Loader_Autoloader_Resource * @package Zend_Application * @subpackage Module @@ -36,8 +36,8 @@ class Zend_Application_Module_Autoloader extends Zend_Loader_Autoloader_Resource { /** * Constructor - * - * @param array|Zend_Config $options + * + * @param array|Zend_Config $options * @return void */ public function __construct($options) @@ -48,7 +48,7 @@ class Zend_Application_Module_Autoloader extends Zend_Loader_Autoloader_Resource /** * Initialize default resource types for module resource classes - * + * * @return void */ public function initDefaultResourceTypes() diff --git a/libs/Zend/Application/Module/Bootstrap.php b/libs/Zend/Application/Module/Bootstrap.php index 6da96b7..e04f751 100644 --- a/libs/Zend/Application/Module/Bootstrap.php +++ b/libs/Zend/Application/Module/Bootstrap.php @@ -16,7 +16,7 @@ * @package Zend_Application * @subpackage Module * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Bootstrap.php 17802 2009-08-24 21:15:12Z matthew $ + * @version $Id: Bootstrap.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -27,7 +27,7 @@ require_once 'Zend/Application/Bootstrap/Bootstrap.php'; /** * Base bootstrap class for modules - * + * * @uses Zend_Loader_Autoloader_Resource * @uses Zend_Application_Bootstrap_Bootstrap * @package Zend_Application @@ -35,7 +35,7 @@ require_once 'Zend/Application/Bootstrap/Bootstrap.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -abstract class Zend_Application_Module_Bootstrap +abstract class Zend_Application_Module_Bootstrap extends Zend_Application_Bootstrap_Bootstrap { /** @@ -45,8 +45,8 @@ abstract class Zend_Application_Module_Bootstrap /** * Constructor - * - * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application + * + * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application * @return void */ public function __construct($application) @@ -84,8 +84,8 @@ abstract class Zend_Application_Module_Bootstrap /** * Set module resource loader - * - * @param Zend_Loader_Autoloader_Resource $loader + * + * @param Zend_Loader_Autoloader_Resource $loader * @return Zend_Application_Module_Bootstrap */ public function setResourceLoader(Zend_Loader_Autoloader_Resource $loader) @@ -96,7 +96,7 @@ abstract class Zend_Application_Module_Bootstrap /** * Retrieve module resource loader - * + * * @return Zend_Loader_Autoloader_Resource */ public function getResourceLoader() @@ -114,7 +114,7 @@ abstract class Zend_Application_Module_Bootstrap /** * Ensure resource loader is loaded - * + * * @return void */ public function initResourceLoader() @@ -124,7 +124,7 @@ abstract class Zend_Application_Module_Bootstrap /** * Retrieve module name - * + * * @return string */ public function getModuleName() diff --git a/libs/Zend/Application/Resource/Db.php b/libs/Zend/Application/Resource/Db.php index 57a7e5e..ec1516c 100644 --- a/libs/Zend/Application/Resource/Db.php +++ b/libs/Zend/Application/Resource/Db.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Db.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: Db.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -43,24 +43,24 @@ class Zend_Application_Resource_Db extends Zend_Application_Resource_ResourceAbs * @var Zend_Db_Adapter_Interface */ protected $_db; - + /** * Parameters to use * * @var array */ protected $_params = array(); - + /** * Wether to register the created adapter as default table adapter * * @var boolean */ - protected $_isDefaultTableAdapter = true; - + protected $_isDefaultTableAdapter = true; + /** * Set the adapter - * + * * @param $adapter string * @return Zend_Application_Resource_Db */ @@ -72,7 +72,7 @@ class Zend_Application_Resource_Db extends Zend_Application_Resource_ResourceAbs /** * Adapter type to use - * + * * @return string */ public function getAdapter() @@ -82,7 +82,7 @@ class Zend_Application_Resource_Db extends Zend_Application_Resource_ResourceAbs /** * Set the adapter params - * + * * @param $adapter string * @return Zend_Application_Resource_Db */ @@ -94,14 +94,14 @@ class Zend_Application_Resource_Db extends Zend_Application_Resource_ResourceAbs /** * Adapter parameters - * + * * @return array */ public function getParams() { return $this->_params; } - + /** * Set whether to use this as default table adapter * @@ -116,7 +116,7 @@ class Zend_Application_Resource_Db extends Zend_Application_Resource_ResourceAbs /** * Is this adapter the default table adapter? - * + * * @return void */ public function isDefaultTableAdapter() @@ -126,19 +126,19 @@ class Zend_Application_Resource_Db extends Zend_Application_Resource_ResourceAbs /** * Retrieve initialized DB connection - * + * * @return null|Zend_Db_Adapter_Interface */ public function getDbAdapter() { - if ((null === $this->_db) + if ((null === $this->_db) && (null !== ($adapter = $this->getAdapter())) ) { $this->_db = Zend_Db::factory($adapter, $this->getParams()); } return $this->_db; } - + /** * Defined by Zend_Application_Resource_Resource * diff --git a/libs/Zend/Application/Resource/Frontcontroller.php b/libs/Zend/Application/Resource/Frontcontroller.php index de9bb7a..3402f2e 100644 --- a/libs/Zend/Application/Resource/Frontcontroller.php +++ b/libs/Zend/Application/Resource/Frontcontroller.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Frontcontroller.php 17737 2009-08-21 20:57:50Z matthew $ + * @version $Id: Frontcontroller.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,13 +38,13 @@ class Zend_Application_Resource_Frontcontroller extends Zend_Application_Resourc /** * Initialize Front Controller - * + * * @return Zend_Controller_Front */ public function init() { $front = $this->getFrontController(); - + foreach ($this->getOptions() as $key => $value) { switch (strtolower($key)) { case 'controllerdirectory': @@ -56,37 +56,37 @@ class Zend_Application_Resource_Frontcontroller extends Zend_Application_Resourc } } break; - + case 'modulecontrollerdirectoryname': $front->setModuleControllerDirectoryName($value); break; - + case 'moduledirectory': $front->addModuleDirectory($value); break; - + case 'defaultcontrollername': $front->setDefaultControllerName($value); break; - + case 'defaultaction': $front->setDefaultAction($value); break; - + case 'defaultmodule': $front->setDefaultModule($value); break; - + case 'baseurl': if (!empty($value)) { $front->setBaseUrl($value); } break; - + case 'params': $front->setParams($value); break; - + case 'plugins': foreach ((array) $value as $pluginClass) { $plugin = new $pluginClass(); @@ -121,7 +121,7 @@ class Zend_Application_Resource_Frontcontroller extends Zend_Application_Resourc /** * Retrieve front controller instance - * + * * @return Zend_Controller_Front */ public function getFrontController() diff --git a/libs/Zend/Application/Resource/Layout.php b/libs/Zend/Application/Resource/Layout.php index ca05cde..817433c 100644 --- a/libs/Zend/Application/Resource/Layout.php +++ b/libs/Zend/Application/Resource/Layout.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Layout.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Layout.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Application_Resource_Layout +class Zend_Application_Resource_Layout extends Zend_Application_Resource_ResourceAbstract { /** diff --git a/libs/Zend/Application/Resource/Locale.php b/libs/Zend/Application/Resource/Locale.php index abe071a..d26a993 100644 --- a/libs/Zend/Application/Resource/Locale.php +++ b/libs/Zend/Application/Resource/Locale.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Locale.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Locale.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Application_Resource_Locale +class Zend_Application_Resource_Locale extends Zend_Application_Resource_ResourceAbstract { const DEFAULT_REGISTRY_KEY = 'Zend_Locale'; @@ -62,7 +62,7 @@ class Zend_Application_Resource_Locale $options = $this->getOptions(); if (!isset($options['default'])) { $this->_locale = new Zend_Locale(); - } else { + } else { Zend_Locale::setDefault($options['default']); $this->_locale = new Zend_Locale($options['default']); } diff --git a/libs/Zend/Application/Resource/Modules.php b/libs/Zend/Application/Resource/Modules.php index 5f53ab3..289d064 100644 --- a/libs/Zend/Application/Resource/Modules.php +++ b/libs/Zend/Application/Resource/Modules.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Modules.php 17730 2009-08-21 19:50:07Z matthew $ + * @version $Id: Modules.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -92,7 +92,7 @@ class Zend_Application_Resource_Modules extends Zend_Application_Resource_Resour } if ($bootstrapClass == $curBootstrapClass) { - // If the found bootstrap class matches the one calling this + // If the found bootstrap class matches the one calling this // resource, don't re-execute. continue; } diff --git a/libs/Zend/Application/Resource/Navigation.php b/libs/Zend/Application/Resource/Navigation.php index 889b1d4..90f6070 100644 --- a/libs/Zend/Application/Resource/Navigation.php +++ b/libs/Zend/Application/Resource/Navigation.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Navigation.php 17017 2009-07-24 02:45:52Z freak $ + * @version $Id: Navigation.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,7 +31,7 @@ * @author Dolf Schimmel * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Application_Resource_Navigation +class Zend_Application_Resource_Navigation extends Zend_Application_Resource_ResourceAbstract { const DEFAULT_REGISTRY_KEY = 'Zend_Navigation'; @@ -88,10 +88,10 @@ class Zend_Application_Resource_Navigation { $key = $options['storage']['registry']['key']; } else { - $key = self::DEFAULT_REGISTRY_KEY; + $key = self::DEFAULT_REGISTRY_KEY; } - - Zend_Registry::set($key,$this->getContainer()); + + Zend_Registry::set($key,$this->getContainer()); } /** diff --git a/libs/Zend/Application/Resource/Resource.php b/libs/Zend/Application/Resource/Resource.php index b4450a8..6d51228 100644 --- a/libs/Zend/Application/Resource/Resource.php +++ b/libs/Zend/Application/Resource/Resource.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Resource.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: Resource.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,38 +35,38 @@ interface Zend_Application_Resource_Resource * Constructor * * Must take an optional single argument, $options. - * - * @param mixed $options + * + * @param mixed $options * @return void */ public function __construct($options = null); /** * Set the bootstrap to which the resource is attached - * - * @param Zend_Application_Bootstrap_Bootstrapper $bootstrap + * + * @param Zend_Application_Bootstrap_Bootstrapper $bootstrap * @return Zend_Application_Resource_Resource */ public function setBootstrap(Zend_Application_Bootstrap_Bootstrapper $bootstrap); /** * Retrieve the bootstrap to which the resource is attached - * + * * @return Zend_Application_Bootstrap_Bootstrapper */ public function getBootstrap(); /** * Set resource options - * - * @param array $options + * + * @param array $options * @return Zend_Application_Resource_Resource */ public function setOptions(array $options); /** * Retrieve resource options - * + * * @return array */ public function getOptions(); diff --git a/libs/Zend/Application/Resource/ResourceAbstract.php b/libs/Zend/Application/Resource/ResourceAbstract.php index 71a230a..da20ddd 100644 --- a/libs/Zend/Application/Resource/ResourceAbstract.php +++ b/libs/Zend/Application/Resource/ResourceAbstract.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ResourceAbstract.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: ResourceAbstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,14 +39,14 @@ abstract class Zend_Application_Resource_ResourceAbstract implements Zend_Applic { /** * Parent bootstrap - * + * * @var Zend_Application_Bootstrap_Bootstrapper */ protected $_bootstrap; /** * Options for the resource - * + * * @var array */ protected $_options = array(); @@ -96,7 +96,7 @@ abstract class Zend_Application_Resource_ResourceAbstract implements Zend_Applic unset($options[$key]); } } - + $this->_options = $this->mergeOptions($this->_options, $options); return $this; @@ -104,7 +104,7 @@ abstract class Zend_Application_Resource_ResourceAbstract implements Zend_Applic /** * Retrieve resource options - * + * * @return array */ public function getOptions() @@ -114,9 +114,9 @@ abstract class Zend_Application_Resource_ResourceAbstract implements Zend_Applic /** * Merge options recursively - * - * @param array $array1 - * @param mixed $array2 + * + * @param array $array1 + * @param mixed $array2 * @return array */ public function mergeOptions(array $array1, $array2 = null) @@ -125,7 +125,7 @@ abstract class Zend_Application_Resource_ResourceAbstract implements Zend_Applic foreach ($array2 as $key => $val) { if (is_array($array2[$key])) { $array1[$key] = (array_key_exists($key, $array1) && is_array($array1[$key])) - ? $this->mergeOptions($array1[$key], $array2[$key]) + ? $this->mergeOptions($array1[$key], $array2[$key]) : $array2[$key]; } else { $array1[$key] = $val; @@ -137,8 +137,8 @@ abstract class Zend_Application_Resource_ResourceAbstract implements Zend_Applic /** * Set the bootstrap to which the resource is attached - * - * @param Zend_Application_Bootstrap_Bootstrapper $bootstrap + * + * @param Zend_Application_Bootstrap_Bootstrapper $bootstrap * @return Zend_Application_Resource_Resource */ public function setBootstrap(Zend_Application_Bootstrap_Bootstrapper $bootstrap) @@ -149,7 +149,7 @@ abstract class Zend_Application_Resource_ResourceAbstract implements Zend_Applic /** * Retrieve the bootstrap to which the resource is attached - * + * * @return null|Zend_Application_Bootstrap_Bootstrapper */ public function getBootstrap() diff --git a/libs/Zend/Application/Resource/Router.php b/libs/Zend/Application/Resource/Router.php index e344521..b65fa05 100644 --- a/libs/Zend/Application/Resource/Router.php +++ b/libs/Zend/Application/Resource/Router.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Router.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Router.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Application_Resource_Router +class Zend_Application_Resource_Router extends Zend_Application_Resource_ResourceAbstract { /** @@ -64,12 +64,12 @@ class Zend_Application_Resource_Router if (!isset($options['routes'])) { $options['routes'] = array(); } - + if (isset($options['chainNameSeparator'])) { $this->_router->setChainNameSeparator($options['chainNameSeparator']); } - + $this->_router->addConfig(new Zend_Config($options['routes'])); } diff --git a/libs/Zend/Application/Resource/Session.php b/libs/Zend/Application/Resource/Session.php index fe25278..c302a0a 100644 --- a/libs/Zend/Application/Resource/Session.php +++ b/libs/Zend/Application/Resource/Session.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Session.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: Session.php 18204 2009-09-17 22:13:16Z beberlei $ */ /** @@ -48,28 +48,47 @@ class Zend_Application_Resource_Session extends Zend_Application_Resource_Resour */ public function setSaveHandler($saveHandler) { - if (is_array($saveHandler)) { - if (!array_key_exists('class', $saveHandler)) { - throw new Zend_Application_Resource_Exception('Session save handler class not provided in options'); - } - if (array_key_exists('options', $saveHandler)) { - $options = $saveHandler['options']; - } - $saveHandler = $saveHandler['class']; - $saveHandler = new $saveHandler($options); - } elseif (is_string($saveHandler)) { - $saveHandler = new $saveHandler(); - } - - if (!$saveHandler instanceof Zend_Session_SaveHandler_Interface) { - throw new Zend_Application_Resource_Exception('Invalid session save handler'); - } - $this->_saveHandler = $saveHandler; - return $this; } + /** + * Get session save handler + * + * @return Zend_Session_SaveHandler_Interface + */ + public function getSaveHandler() + { + if (!$this->_saveHandler instanceof Zend_Session_SaveHandler_Interface) { + if (is_array($this->_saveHandler)) { + if (!array_key_exists('class', $this->_saveHandler)) { + throw new Zend_Application_Resource_Exception('Session save handler class not provided in options'); + } + $options = array(); + if (array_key_exists('options', $this->_saveHandler)) { + $options = $this->_saveHandler['options']; + } + $this->_saveHandler = $this->_saveHandler['class']; + $this->_saveHandler = new $this->_saveHandler($options); + } elseif (is_string($this->_saveHandler)) { + $this->_saveHandler = new $this->_saveHandler(); + } + + if (!$this->_saveHandler instanceof Zend_Session_SaveHandler_Interface) { + throw new Zend_Application_Resource_Exception('Invalid session save handler'); + } + } + return $this->_saveHandler; + } + + /** + * @return bool + */ + protected function _hasSaveHandler() + { + return ($this->_saveHandler !== null); + } + /** * Defined by Zend_Application_Resource_Resource * @@ -86,8 +105,8 @@ class Zend_Application_Resource_Session extends Zend_Application_Resource_Resour Zend_Session::setOptions($options); } - if ($this->_saveHandler !== null) { - Zend_Session::setSaveHandler($this->_saveHandler); + if ($this->_hasSaveHandler()) { + Zend_Session::setSaveHandler($this->getSaveHandler()); } } } diff --git a/libs/Zend/Application/Resource/View.php b/libs/Zend/Application/Resource/View.php index ee3d8d0..d8e95c3 100644 --- a/libs/Zend/Application/Resource/View.php +++ b/libs/Zend/Application/Resource/View.php @@ -17,7 +17,7 @@ * @subpackage Resource * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: View.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: View.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -54,7 +54,7 @@ class Zend_Application_Resource_View extends Zend_Application_Resource_ResourceA /** * Retrieve view object - * + * * @return Zend_View */ public function getView() diff --git a/libs/Zend/Auth.php b/libs/Zend/Auth.php index 1424433..106a663 100644 --- a/libs/Zend/Auth.php +++ b/libs/Zend/Auth.php @@ -16,7 +16,7 @@ * @package Zend_Auth * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Auth.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: Auth.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -116,6 +116,14 @@ class Zend_Auth { $result = $adapter->authenticate(); + /** + * ZF-7546 - prevent multiple succesive calls from storing inconsistent results + * Ensure storage has clean state + */ + if ($this->hasIdentity()) { + $this->clearIdentity(); + } + if ($result->isValid()) { $this->getStorage()->write($result->getIdentity()); } diff --git a/libs/Zend/Auth/Adapter/DbTable.php b/libs/Zend/Auth/Adapter/DbTable.php index 56dfcd9..90206f5 100644 --- a/libs/Zend/Auth/Adapter/DbTable.php +++ b/libs/Zend/Auth/Adapter/DbTable.php @@ -17,7 +17,7 @@ * @subpackage Zend_Auth_Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbTable.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: DbTable.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -58,7 +58,7 @@ class Zend_Auth_Adapter_DbTable implements Zend_Auth_Adapter_Interface * @var Zend_Db_Select */ protected $_dbSelect = null; - + /** * $_tableName - the table name to check * @@ -241,10 +241,10 @@ class Zend_Auth_Adapter_DbTable implements Zend_Auth_Adapter_Interface if ($this->_dbSelect == null) { $this->_dbSelect = $this->_zendDb->select(); } - + return $this->_dbSelect; } - + /** * getResultRowObject() - Returns the result row as a stdClass object * @@ -373,7 +373,9 @@ class Zend_Auth_Adapter_DbTable implements Zend_Auth_Adapter_Interface . ' = ' . $this->_credentialTreatment, $this->_credential ) . ' THEN 1 ELSE 0 END) AS ' - . $this->_zendDb->quoteIdentifier('zend_auth_credential_match') + . $this->_zendDb->quoteIdentifier( + $this->_zendDb->foldCase('zend_auth_credential_match') + ) ); // get select @@ -426,7 +428,6 @@ class Zend_Auth_Adapter_DbTable implements Zend_Auth_Adapter_Interface protected function _authenticateValidateResultSet(array $resultIdentities) { - if (count($resultIdentities) < 1) { $this->_authenticateResultInfo['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; $this->_authenticateResultInfo['messages'][] = 'A record with the supplied identity could not be found.'; @@ -449,13 +450,15 @@ class Zend_Auth_Adapter_DbTable implements Zend_Auth_Adapter_Interface */ protected function _authenticateValidateResult($resultIdentity) { - if ($resultIdentity['zend_auth_credential_match'] != '1') { + $zendAuthCredentialMatchColumn = $this->_zendDb->foldCase('zend_auth_credential_match'); + + if ($resultIdentity[$zendAuthCredentialMatchColumn] != '1') { $this->_authenticateResultInfo['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID; $this->_authenticateResultInfo['messages'][] = 'Supplied credential is invalid.'; return $this->_authenticateCreateAuthResult(); } - unset($resultIdentity['zend_auth_credential_match']); + unset($resultIdentity[$zendAuthCredentialMatchColumn]); $this->_resultRow = $resultIdentity; $this->_authenticateResultInfo['code'] = Zend_Auth_Result::SUCCESS; diff --git a/libs/Zend/Auth/Adapter/Http.php b/libs/Zend/Auth/Adapter/Http.php index 466ce42..ef4997a 100644 --- a/libs/Zend/Auth/Adapter/Http.php +++ b/libs/Zend/Auth/Adapter/Http.php @@ -17,7 +17,7 @@ * @subpackage Zend_Auth_Adapter_Http * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Http.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: Http.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -403,7 +403,7 @@ class Zend_Auth_Adapter_Http implements Zend_Auth_Adapter_Interface // challenge again the client return $this->_challengeClient(); } - + switch ($clientScheme) { case 'basic': $result = $this->_basicAuth($authHeader); diff --git a/libs/Zend/Auth/Adapter/Ldap.php b/libs/Zend/Auth/Adapter/Ldap.php index d844455..0a560ad 100644 --- a/libs/Zend/Auth/Adapter/Ldap.php +++ b/libs/Zend/Auth/Adapter/Ldap.php @@ -17,7 +17,7 @@ * @subpackage Zend_Auth_Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Ldap.php 17788 2009-08-24 14:43:23Z sgehrig $ + * @version $Id: Ldap.php 18882 2009-11-06 10:57:58Z sgehrig $ */ /** @@ -161,7 +161,7 @@ class Zend_Auth_Adapter_Ldap implements Zend_Auth_Adapter_Interface /** * setIdentity() - set the identity (username) to be used * - * Proxies to {@see setPassword()} + * Proxies to {@see setUsername()} * * Closes ZF-6813 * @@ -312,10 +312,16 @@ class Zend_Auth_Adapter_Ldap implements Zend_Auth_Adapter_Interface continue; } - $ldap->bind($username, $password); - $canonicalName = $ldap->getCanonicalAccountName($username); - $dn = $ldap->getCanonicalAccountName($username, Zend_Ldap::ACCTNAME_FORM_DN); + $ldap->bind($canonicalName, $password); + /* + * Fixes problem when authenticated user is not allowed to retrieve + * group-membership information or own account. + * This requires that the user specified with "username" and "password" + * in the Zend_Ldap options is able to retrieve the required information. + */ + $ldap->bind(); + $dn = $ldap->getCanonicalAccountName($canonicalName, Zend_Ldap::ACCTNAME_FORM_DN); $groupResult = $this->_checkGroupMembership($ldap, $canonicalName, $dn, $adapterOptions); if ($groupResult === true) { @@ -323,6 +329,8 @@ class Zend_Auth_Adapter_Ldap implements Zend_Auth_Adapter_Interface $messages[0] = ''; $messages[1] = ''; $messages[] = "$canonicalName authentication successful"; + // rebinding with authenticated user + $ldap->bind($dn, $password); return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $canonicalName, $messages); } else { $messages[0] = 'Account is not a member of the specified group'; @@ -409,7 +417,6 @@ class Zend_Auth_Adapter_Ldap implements Zend_Auth_Adapter_Interface } } } - $ldap->setOptions($options); return $adapterOptions; } @@ -463,9 +470,10 @@ class Zend_Auth_Adapter_Ldap implements Zend_Auth_Adapter_Interface * Closes ZF-6813 * * @param array $returnAttribs + * @param array $omitAttribs * @return stdClass|boolean */ - public function getAccountObject(array $returnAttribs = array()) + public function getAccountObject(array $returnAttribs = array(), array $omitAttribs = array()) { if (!$this->_authenticatedDn) { return false; @@ -473,8 +481,14 @@ class Zend_Auth_Adapter_Ldap implements Zend_Auth_Adapter_Interface $returnObject = new stdClass(); + $omitAttribs = array_map('strtolower', $omitAttribs); + $entry = $this->getLdap()->getEntry($this->_authenticatedDn, $returnAttribs, true); foreach ($entry as $attr => $value) { + if (in_array($attr, $omitAttribs)) { + // skip attributes marked to be omitted + continue; + } if (is_array($value)) { $returnObject->$attr = (count($value) > 1) ? $value : $value[0]; } else { diff --git a/libs/Zend/Cache.php b/libs/Zend/Cache.php index 1ea8141..a358bd2 100644 --- a/libs/Zend/Cache.php +++ b/libs/Zend/Cache.php @@ -16,7 +16,7 @@ * @package Zend_Cache * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Cache.php 16200 2009-06-21 18:50:06Z thomas $ + * @version $Id: Cache.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -44,11 +44,11 @@ abstract class Zend_Cache /** * Standard backends which implement the ExtendedInterface - * + * * @var array */ public static $standardExtendedBackends = array('File', 'Apc', 'TwoLevels', 'Memcached', 'Sqlite'); - + /** * Only for backward compatibily (may be removed in next major release) * @@ -73,7 +73,7 @@ abstract class Zend_Cache const CLEANING_MODE_MATCHING_TAG = 'matchingTag'; const CLEANING_MODE_NOT_MATCHING_TAG = 'notMatchingTag'; const CLEANING_MODE_MATCHING_ANY_TAG = 'matchingAnyTag'; - + /** * Factory * @@ -110,7 +110,7 @@ abstract class Zend_Cache $frontendObject->setBackend($backendObject); return $frontendObject; } - + /** * Frontend Constructor * @@ -151,7 +151,7 @@ abstract class Zend_Cache } return new $backendClass($backendOptions); } - + /** * Backend Constructor * diff --git a/libs/Zend/Cache/Backend.php b/libs/Zend/Cache/Backend.php index 0521819..c157f54 100644 --- a/libs/Zend/Cache/Backend.php +++ b/libs/Zend/Cache/Backend.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Backend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Backend.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Backend.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -140,77 +140,77 @@ class Zend_Cache_Backend { return true; } - + /** * Determine system TMP directory and detect if we have read access * - * inspired from Zend_File_Transfer_Adapter_Abstract + * inspired from Zend_File_Transfer_Adapter_Abstract * * @return string * @throws Zend_Cache_Exception if unable to determine directory */ public function getTmpDir() { - $tmpdir = array(); + $tmpdir = array(); foreach (array($_ENV, $_SERVER) as $tab) { - foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $key) { - if (isset($tab[$key])) { - if (($key == 'windir') or ($key == 'SystemRoot')) { + foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $key) { + if (isset($tab[$key])) { + if (($key == 'windir') or ($key == 'SystemRoot')) { $dir = realpath($tab[$key] . '\\temp'); } else { - $dir = realpath($tab[$key]); + $dir = realpath($tab[$key]); } - if ($this->_isGoodTmpDir($dir)) { - return $dir; - } - } - } + if ($this->_isGoodTmpDir($dir)) { + return $dir; + } + } + } } $upload = ini_get('upload_tmp_dir'); if ($upload) { $dir = realpath($upload); - if ($this->_isGoodTmpDir($dir)) { - return $dir; - } + if ($this->_isGoodTmpDir($dir)) { + return $dir; + } } if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); - if ($this->_isGoodTmpDir($dir)) { - return $dir; - } + if ($this->_isGoodTmpDir($dir)) { + return $dir; + } } // Attemp to detect by creating a temporary file $tempFile = tempnam(md5(uniqid(rand(), TRUE)), ''); if ($tempFile) { - $dir = realpath(dirname($tempFile)); + $dir = realpath(dirname($tempFile)); unlink($tempFile); if ($this->_isGoodTmpDir($dir)) { return $dir; } } if ($this->_isGoodTmpDir('/tmp')) { - return '/tmp'; + return '/tmp'; } if ($this->_isGoodTmpDir('\\temp')) { - return '\\temp'; + return '\\temp'; } Zend_Cache::throwException('Could not determine temp directory, please specify a cache_dir manually'); } - + /** * Verify if the given temporary directory is readable and writable - * + * * @param $dir temporary directory * @return boolean true if the directory is ok */ protected function _isGoodTmpDir($dir) { - if (is_readable($dir)) { - if (is_writable($dir)) { - return true; - } - } - return false; + if (is_readable($dir)) { + if (is_writable($dir)) { + return true; + } + } + return false; } /** @@ -261,7 +261,7 @@ class Zend_Cache_Backend } if (!isset($this->_directives['logger'])) { - Zend_Cache::throwException('Logging is enabled but logger is not set.'); + Zend_Cache::throwException('Logging is enabled but logger is not set.'); } $logger = $this->_directives['logger']; if (!$logger instanceof Zend_Log) { diff --git a/libs/Zend/Cache/Backend/Apc.php b/libs/Zend/Cache/Backend/Apc.php index fd99ae4..07c6b93 100644 --- a/libs/Zend/Cache/Backend/Apc.php +++ b/libs/Zend/Cache/Backend/Apc.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Backend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Apc.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Apc.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -166,18 +166,18 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba * Return true if the automatic cleaning is available for the backend * * DEPRECATED : use getCapabilities() instead - * - * @deprecated + * + * @deprecated * @return boolean */ public function isAutomaticCleaningAvailable() { return false; } - + /** * Return the filling percentage of the backend storage - * + * * @throws Zend_Cache_Exception * @return int integer between 0 and 100 */ @@ -195,21 +195,21 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba } return ((int) (100. * ($memUsed / $memSize))); } - + /** * Return an array of stored tags * * @return array array of stored tags (string) */ public function getTags() - { + { $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); return array(); } - + /** * Return an array of stored cache ids which match given tags - * + * * In case of multiple tags, a logical AND is made between tags * * @param array $tags array of tags @@ -218,26 +218,26 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba public function getIdsMatchingTags($tags = array()) { $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); - return array(); + return array(); } /** * Return an array of stored cache ids which don't match given tags - * + * * In case of multiple tags, a logical OR is made between tags * * @param array $tags array of tags * @return array array of not matching cache ids (string) - */ + */ public function getIdsNotMatchingTags($tags = array()) { $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); - return array(); + return array(); } - + /** * Return an array of stored cache ids which match any given tags - * + * * In case of multiple tags, a logical AND is made between tags * * @param array $tags array of tags @@ -246,12 +246,12 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba public function getIdsMatchingAnyTags($tags = array()) { $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_APC_BACKEND); - return array(); + return array(); } - + /** * Return an array of stored cache ids - * + * * @return array array of stored cache ids (string) */ public function getIds() @@ -264,7 +264,7 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba } return $res; } - + /** * Return an array of metadatas for the given cache id * @@ -272,7 +272,7 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba * - expire : the expire timestamp * - tags : a string array of tags * - mtime : timestamp of last modification time - * + * * @param string $id cache id * @return array array of metadatas (false if the cache id is not found) */ @@ -294,9 +294,9 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba 'mtime' => $mtime ); } - return false; + return false; } - + /** * Give (if possible) an extra lifetime to the given cache id * @@ -318,17 +318,17 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba $lifetime = $tmp[2]; $newLifetime = $lifetime - (time() - $mtime) + $extraLifetime; if ($newLifetime <=0) { - return false; + return false; } apc_store($id, array($data, time(), $newLifetime), $newLifetime); return true; } return false; } - + /** * Return an associative array of capabilities (booleans) of the backend - * + * * The array must include these keys : * - automatic_cleaning (is automating cleaning necessary) * - tags (are tags supported) @@ -337,7 +337,7 @@ class Zend_Cache_Backend_Apc extends Zend_Cache_Backend implements Zend_Cache_Ba * - priority does the backend deal with priority when saving * - infinite_lifetime (is infinite lifetime can work with this backend) * - get_list (is it possible to get the list of cache ids and the complete list of tags) - * + * * @return array associative of with capabilities */ public function getCapabilities() diff --git a/libs/Zend/Cache/Backend/ExtendedInterface.php b/libs/Zend/Cache/Backend/ExtendedInterface.php index 22e559b..aa0d730 100644 --- a/libs/Zend/Cache/Backend/ExtendedInterface.php +++ b/libs/Zend/Cache/Backend/ExtendedInterface.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Backend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ExtendedInterface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ExtendedInterface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,21 +36,21 @@ interface Zend_Cache_Backend_ExtendedInterface extends Zend_Cache_Backend_Interf /** * Return an array of stored cache ids - * + * * @return array array of stored cache ids (string) */ public function getIds(); - + /** * Return an array of stored tags * * @return array array of stored tags (string) */ public function getTags(); - + /** * Return an array of stored cache ids which match given tags - * + * * In case of multiple tags, a logical AND is made between tags * * @param array $tags array of tags @@ -60,24 +60,24 @@ interface Zend_Cache_Backend_ExtendedInterface extends Zend_Cache_Backend_Interf /** * Return an array of stored cache ids which don't match given tags - * + * * In case of multiple tags, a logical OR is made between tags * * @param array $tags array of tags * @return array array of not matching cache ids (string) - */ + */ public function getIdsNotMatchingTags($tags = array()); /** * Return an array of stored cache ids which match any given tags - * + * * In case of multiple tags, a logical AND is made between tags * * @param array $tags array of tags * @return array array of any matching cache ids (string) */ public function getIdsMatchingAnyTags($tags = array()); - + /** * Return the filling percentage of the backend storage * @@ -92,12 +92,12 @@ interface Zend_Cache_Backend_ExtendedInterface extends Zend_Cache_Backend_Interf * - expire : the expire timestamp * - tags : a string array of tags * - mtime : timestamp of last modification time - * + * * @param string $id cache id * @return array array of metadatas (false if the cache id is not found) */ public function getMetadatas($id); - + /** * Give (if possible) an extra lifetime to the given cache id * @@ -106,10 +106,10 @@ interface Zend_Cache_Backend_ExtendedInterface extends Zend_Cache_Backend_Interf * @return boolean true if ok */ public function touch($id, $extraLifetime); - + /** * Return an associative array of capabilities (booleans) of the backend - * + * * The array must include these keys : * - automatic_cleaning (is automating cleaning necessary) * - tags (are tags supported) @@ -118,9 +118,9 @@ interface Zend_Cache_Backend_ExtendedInterface extends Zend_Cache_Backend_Interf * - priority does the backend deal with priority when saving * - infinite_lifetime (is infinite lifetime can work with this backend) * - get_list (is it possible to get the list of cache ids and the complete list of tags) - * + * * @return array associative of with capabilities */ public function getCapabilities(); - + } diff --git a/libs/Zend/Cache/Backend/File.php b/libs/Zend/Cache/Backend/File.php index 1884018..51e2697 100644 --- a/libs/Zend/Cache/Backend/File.php +++ b/libs/Zend/Cache/Backend/File.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Backend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: File.php 17029 2009-07-24 11:57:49Z matthew $ + * @version $Id: File.php 17868 2009-08-28 09:46:30Z yoshida@zend.co.jp $ */ /** @@ -259,7 +259,9 @@ class Zend_Cache_Backend_File extends Zend_Cache_Backend implements Zend_Cache_B public function remove($id) { $file = $this->_file($id); - return ($this->_delMetadatas($id) && $this->_remove($file)); + $boolRemove = $this->_remove($file); + $boolMetadata = $this->_delMetadatas($id); + return $boolMetadata && $boolRemove; } /** @@ -672,7 +674,7 @@ class Zend_Cache_Backend_File extends Zend_Cache_Backend implements Zend_Cache_B break; case Zend_Cache::CLEANING_MODE_OLD: if (time() > $metadatas['expire']) { - $result = ($result) && ($this->remove($id)); + $result = $this->remove($id) && $result; } break; case Zend_Cache::CLEANING_MODE_MATCHING_TAG: @@ -684,7 +686,7 @@ class Zend_Cache_Backend_File extends Zend_Cache_Backend implements Zend_Cache_B } } if ($matching) { - $result = ($result) && ($this->remove($id)); + $result = $this->remove($id) && $result; } break; case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: @@ -696,7 +698,7 @@ class Zend_Cache_Backend_File extends Zend_Cache_Backend implements Zend_Cache_B } } if (!$matching) { - $result = ($result) && $this->remove($id); + $result = $this->remove($id) && $result; } break; case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: @@ -708,7 +710,7 @@ class Zend_Cache_Backend_File extends Zend_Cache_Backend implements Zend_Cache_B } } if ($matching) { - $result = ($result) && ($this->remove($id)); + $result = $this->remove($id) && $result; } break; default: @@ -718,7 +720,7 @@ class Zend_Cache_Backend_File extends Zend_Cache_Backend implements Zend_Cache_B } if ((is_dir($file)) and ($this->_options['hashed_directory_level']>0)) { // Recursive call - $result = ($result) && ($this->_clean($file . DIRECTORY_SEPARATOR, $mode, $tags)); + $result = $this->_clean($file . DIRECTORY_SEPARATOR, $mode, $tags) && $result; if ($mode=='all') { // if mode=='all', we try to drop the structure too @rmdir($file); diff --git a/libs/Zend/Cache/Backend/Memcached.php b/libs/Zend/Cache/Backend/Memcached.php index 86bbca3..446ae16 100644 --- a/libs/Zend/Cache/Backend/Memcached.php +++ b/libs/Zend/Cache/Backend/Memcached.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Backend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Memcached.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Memcached.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -155,16 +155,16 @@ class Zend_Cache_Backend_Memcached extends Zend_Cache_Backend implements Zend_Ca $server['failure_callback'] = self::DEFAULT_FAILURE_CALLBACK; } if ($this->_options['compatibility']) { - // No status for compatibility mode (#ZF-5887) - $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'], + // No status for compatibility mode (#ZF-5887) + $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'], $server['weight'], $server['timeout'], $server['retry_interval']); - } else { - $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'], + } else { + $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'], $server['weight'], $server['timeout'], $server['retry_interval'], $server['status'], $server['failure_callback']); - } + } } } @@ -383,22 +383,22 @@ class Zend_Cache_Backend_Memcached extends Zend_Cache_Backend implements Zend_Ca $memSize = 0; $memUsed = 0; foreach ($mems as $key => $mem) { - if ($mem === false) { + if ($mem === false) { Zend_Cache::throwException('can\'t get stat from ' . $key); - } else { - $eachSize = $mem['limit_maxbytes']; - if ($eachSize == 0) { + } else { + $eachSize = $mem['limit_maxbytes']; + if ($eachSize == 0) { Zend_Cache::throwException('can\'t get memory size from ' . $key); - } + } - $eachUsed = $mem['bytes']; - if ($eachUsed > $eachSize) { - $eachUsed = $eachSize; - } + $eachUsed = $mem['bytes']; + if ($eachUsed > $eachSize) { + $eachUsed = $eachSize; + } - $memSize += $eachSize; - $memUsed += $eachUsed; - } + $memSize += $eachSize; + $memUsed += $eachUsed; + } } return ((int) (100. * ($memUsed / $memSize))); @@ -466,7 +466,7 @@ class Zend_Cache_Backend_Memcached extends Zend_Cache_Backend implements Zend_Ca } // #ZF-5702 : we try replace() first becase set() seems to be slower if (!($result = $this->_memcache->replace($id, array($data, time(), $newLifetime), $flag, $newLifetime))) { - $result = $this->_memcache->set($id, array($data, time(), $newLifetime), $flag, $newLifetime); + $result = $this->_memcache->set($id, array($data, time(), $newLifetime), $flag, $newLifetime); } return $result; } diff --git a/libs/Zend/Cache/Backend/Sqlite.php b/libs/Zend/Cache/Backend/Sqlite.php index f53780a..7430d73 100644 --- a/libs/Zend/Cache/Backend/Sqlite.php +++ b/libs/Zend/Cache/Backend/Sqlite.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Backend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Sqlite.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Sqlite.php 17868 2009-08-28 09:46:30Z yoshida@zend.co.jp $ */ @@ -176,7 +176,7 @@ class Zend_Cache_Backend_Sqlite extends Zend_Cache_Backend implements Zend_Cache } $res = true; foreach ($tags as $tag) { - $res = $res && $this->_registerTag($id, $tag); + $res = $this->_registerTag($id, $tag) && $res; } return $res; } @@ -630,7 +630,7 @@ class Zend_Cache_Backend_Sqlite extends Zend_Cache_Backend implements Zend_Cache $ids = $this->getIdsMatchingTags($tags); $result = true; foreach ($ids as $id) { - $result = $result && ($this->remove($id)); + $result = $this->remove($id) && $result; } return $result; break; @@ -638,7 +638,7 @@ class Zend_Cache_Backend_Sqlite extends Zend_Cache_Backend implements Zend_Cache $ids = $this->getIdsNotMatchingTags($tags); $result = true; foreach ($ids as $id) { - $result = $result && ($this->remove($id)); + $result = $this->remove($id) && $result; } return $result; break; @@ -646,7 +646,7 @@ class Zend_Cache_Backend_Sqlite extends Zend_Cache_Backend implements Zend_Cache $ids = $this->getIdsMatchingAnyTags($tags); $result = true; foreach ($ids as $id) { - $result = $result && ($this->remove($id)); + $result = $this->remove($id) && $result; } return $result; break; diff --git a/libs/Zend/Cache/Backend/Xcache.php b/libs/Zend/Cache/Backend/Xcache.php index 8f7af59..4614b73 100644 --- a/libs/Zend/Cache/Backend/Xcache.php +++ b/libs/Zend/Cache/Backend/Xcache.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Backend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Xcache.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Xcache.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -46,7 +46,7 @@ class Zend_Cache_Backend_Xcache extends Zend_Cache_Backend implements Zend_Cache */ const TAGS_UNSUPPORTED_BY_CLEAN_OF_XCACHE_BACKEND = 'Zend_Cache_Backend_Xcache::clean() : tags are unsupported by the Xcache backend'; const TAGS_UNSUPPORTED_BY_SAVE_OF_XCACHE_BACKEND = 'Zend_Cache_Backend_Xcache::save() : tags are unsupported by the Xcache backend'; - + /** * Available options * diff --git a/libs/Zend/Cache/Backend/ZendServer.php b/libs/Zend/Cache/Backend/ZendServer.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Cache/Backend/ZendServer/Disk.php b/libs/Zend/Cache/Backend/ZendServer/Disk.php old mode 100755 new mode 100644 index 994ca07..42dcb92 --- a/libs/Zend/Cache/Backend/ZendServer/Disk.php +++ b/libs/Zend/Cache/Backend/ZendServer/Disk.php @@ -1,100 +1,100 @@ -_options['namespace'] . '::' . $id, - $data, - $timeToLive) === false) { - $this->_log('Store operation failed.'); - return false; - } - return true; - } - - /** - * Fetch data - * - * @param string $id Cache id - */ - protected function _fetch($id) - { - return zend_disk_cache_fetch($this->_options['namespace'] . '::' . $id); - } - - /** - * Unset data - * - * @param string $id Cache id - * @return boolean true if no problem - */ - protected function _unset($id) - { - return zend_disk_cache_delete($this->_options['namespace'] . '::' . $id); - } - - /** - * Clear cache - */ - protected function _clear() - { - zend_disk_cache_clear($this->_options['namespace']); - } -} +_options['namespace'] . '::' . $id, + $data, + $timeToLive) === false) { + $this->_log('Store operation failed.'); + return false; + } + return true; + } + + /** + * Fetch data + * + * @param string $id Cache id + */ + protected function _fetch($id) + { + return zend_disk_cache_fetch($this->_options['namespace'] . '::' . $id); + } + + /** + * Unset data + * + * @param string $id Cache id + * @return boolean true if no problem + */ + protected function _unset($id) + { + return zend_disk_cache_delete($this->_options['namespace'] . '::' . $id); + } + + /** + * Clear cache + */ + protected function _clear() + { + zend_disk_cache_clear($this->_options['namespace']); + } +} diff --git a/libs/Zend/Cache/Backend/ZendServer/ShMem.php b/libs/Zend/Cache/Backend/ZendServer/ShMem.php old mode 100755 new mode 100644 index 7299c2c..1e551a5 --- a/libs/Zend/Cache/Backend/ZendServer/ShMem.php +++ b/libs/Zend/Cache/Backend/ZendServer/ShMem.php @@ -1,100 +1,100 @@ -_options['namespace'] . '::' . $id, - $data, - $timeToLive) === false) { - $this->_log('Store operation failed.'); - return false; - } - return true; - } - - /** - * Fetch data - * - * @param string $id Cache id - */ - protected function _fetch($id) - { - return zend_shm_cache_fetch($this->_options['namespace'] . '::' . $id); - } - - /** - * Unset data - * - * @param string $id Cache id - * @return boolean true if no problem - */ - protected function _unset($id) - { - return zend_shm_cache_delete($this->_options['namespace'] . '::' . $id); - } - - /** - * Clear cache - */ - protected function _clear() - { - zend_shm_cache_clear($this->_options['namespace']); - } -} +_options['namespace'] . '::' . $id, + $data, + $timeToLive) === false) { + $this->_log('Store operation failed.'); + return false; + } + return true; + } + + /** + * Fetch data + * + * @param string $id Cache id + */ + protected function _fetch($id) + { + return zend_shm_cache_fetch($this->_options['namespace'] . '::' . $id); + } + + /** + * Unset data + * + * @param string $id Cache id + * @return boolean true if no problem + */ + protected function _unset($id) + { + return zend_shm_cache_delete($this->_options['namespace'] . '::' . $id); + } + + /** + * Clear cache + */ + protected function _clear() + { + zend_shm_cache_clear($this->_options['namespace']); + } +} diff --git a/libs/Zend/Cache/Core.php b/libs/Zend/Cache/Core.php index 4aced44..cdbe7c9 100644 --- a/libs/Zend/Cache/Core.php +++ b/libs/Zend/Cache/Core.php @@ -16,7 +16,7 @@ * @package Zend_Cache * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Core.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Core.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -124,18 +124,40 @@ class Zend_Cache_Core /** * Constructor * - * @param array $options Associative array of options + * @param array|Zend_Config $options Associative array of options or Zend_Config instance * @throws Zend_Cache_Exception * @return void */ - public function __construct(array $options = array()) + public function __construct($options = array()) { + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } + if (!is_array($options)) { + Zend_Cache::throwException("Options passed were not an array" + . " or Zend_Config instance."); + } while (list($name, $value) = each($options)) { $this->setOption($name, $value); } $this->_loggerSanity(); } + /** + * Set options using an instance of type Zend_Config + * + * @param Zend_Config $config + * @return Zend_Cache_Core + */ + public function setConfig(Zend_Config $config) + { + $options = $config->toArray(); + while (list($name, $value) = each($options)) { + $this->setOption($name, $value); + } + return $this; + } + /** * Set the backend * @@ -483,11 +505,11 @@ class Zend_Cache_Core // we need to remove cache_id_prefix from ids (see #ZF-6178) $res = array(); while (list(,$id) = each($array)) { - if (strpos($id, $this->_options['cache_id_prefix']) === 0) { - $res[] = preg_replace("~^{$this->_options['cache_id_prefix']}~", '', $id); - } else { - $res[] = $id; - } + if (strpos($id, $this->_options['cache_id_prefix']) === 0) { + $res[] = preg_replace("~^{$this->_options['cache_id_prefix']}~", '', $id); + } else { + $res[] = $id; + } } return $res; } @@ -520,7 +542,7 @@ class Zend_Cache_Core } return $this->_backend->getFillingPercentage(); } - + /** * Return an array of metadatas for the given cache id * @@ -534,7 +556,7 @@ class Zend_Cache_Core */ public function getMetadatas($id) { - if (!$this->_extendedBackend) { + if (!$this->_extendedBackend) { Zend_Cache::throwException('Current backend doesn\'t implement the Zend_Cache_Backend_ExtendedInterface, so this method is not available'); } $id = $this->_id($id); // cache id may need prefix diff --git a/libs/Zend/Cache/Frontend/File.php b/libs/Zend/Cache/Frontend/File.php index 5e28e01..1376060 100644 --- a/libs/Zend/Cache/Frontend/File.php +++ b/libs/Zend/Cache/Frontend/File.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Frontend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: File.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: File.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -35,46 +35,46 @@ require_once 'Zend/Cache/Core.php'; */ class Zend_Cache_Frontend_File extends Zend_Cache_Core { - - /** - * Consts for master_files_mode - */ - const MODE_AND = 'AND'; - const MODE_OR = 'OR'; - + + /** + * Consts for master_files_mode + */ + const MODE_AND = 'AND'; + const MODE_OR = 'OR'; + /** * Available options * * ====> (string) master_file : * - a complete path of the master file * - deprecated (see master_files) - * + * * ====> (array) master_files : * - an array of complete path of master files * - this option has to be set ! - * + * * ====> (string) master_files_mode : * - Zend_Cache_Frontend_File::MODE_AND or Zend_Cache_Frontend_File::MODE_OR * - if MODE_AND, then all master files have to be touched to get a cache invalidation * - if MODE_OR (default), then a single touched master file is enough to get a cache invalidation * * ====> (boolean) ignore_missing_master_files - * - if set to true, missing master files are ignored silently + * - if set to true, missing master files are ignored silently * - if set to false (default), an exception is thrown if there is a missing master file * @var array available options */ protected $_specificOptions = array( - 'master_file' => null, + 'master_file' => null, 'master_files' => null, - 'master_files_mode' => 'OR', - 'ignore_missing_master_files' => false + 'master_files_mode' => 'OR', + 'ignore_missing_master_files' => false ); /** * Master file mtimes * * Array of int - * + * * @var array */ private $_masterFile_mtimes = null; @@ -95,10 +95,10 @@ class Zend_Cache_Frontend_File extends Zend_Cache_Core Zend_Cache::throwException('master_files option must be set'); } } - + /** * Change the master_file option - * + * * @param string $masterFile the complete path and name of the master file */ public function setMasterFiles($masterFiles) @@ -109,27 +109,27 @@ class Zend_Cache_Frontend_File extends Zend_Cache_Core $this->_masterFile_mtimes = array(); $i = 0; foreach ($masterFiles as $masterFile) { - $this->_masterFile_mtimes[$i] = @filemtime($masterFile); - if ((!($this->_specificOptions['ignore_missing_master_files'])) && (!($this->_masterFile_mtimes[$i]))) { - Zend_Cache::throwException('Unable to read master_file : '.$masterFile); - } - $i++; + $this->_masterFile_mtimes[$i] = @filemtime($masterFile); + if ((!($this->_specificOptions['ignore_missing_master_files'])) && (!($this->_masterFile_mtimes[$i]))) { + Zend_Cache::throwException('Unable to read master_file : '.$masterFile); + } + $i++; } } - + /** * Change the master_file option - * - * To keep the compatibility - * + * + * To keep the compatibility + * * @deprecated * @param string $masterFile the complete path and name of the master file - */ + */ public function setMasterFile($masterFile) { - $this->setMasterFiles(array(0 => $masterFile)); + $this->setMasterFiles(array(0 => $masterFile)); } - + /** * Public frontend to set an option * @@ -145,7 +145,7 @@ class Zend_Cache_Frontend_File extends Zend_Cache_Core if ($name == 'master_file') { $this->setMasterFile($value); } else if ($name == 'master_files') { - $this->setMasterFiles($value); + $this->setMasterFiles($value); } else { parent::setOption($name, $value); } @@ -180,27 +180,27 @@ class Zend_Cache_Frontend_File extends Zend_Cache_Core { $lastModified = parent::test($id); if ($lastModified) { - if ($this->_specificOptions['master_files_mode'] == self::MODE_AND) { - // MODE_AND - foreach($this->_masterFile_mtimes as $masterFileMTime) { - if ($masterFileMTime) { - if ($lastModified > $masterFileMTime) { - return $lastModified; - } - } - } - } else { - // MODE_OR - $res = true; - foreach($this->_masterFile_mtimes as $masterFileMTime) { - if ($masterFileMTime) { - if ($lastModified <= $masterFileMTime) { - return false; - } - } - } - return $lastModified; - } + if ($this->_specificOptions['master_files_mode'] == self::MODE_AND) { + // MODE_AND + foreach($this->_masterFile_mtimes as $masterFileMTime) { + if ($masterFileMTime) { + if ($lastModified > $masterFileMTime) { + return $lastModified; + } + } + } + } else { + // MODE_OR + $res = true; + foreach($this->_masterFile_mtimes as $masterFileMTime) { + if ($masterFileMTime) { + if ($lastModified <= $masterFileMTime) { + return false; + } + } + } + return $lastModified; + } } return false; } diff --git a/libs/Zend/Cache/Frontend/Function.php b/libs/Zend/Cache/Frontend/Function.php index 03e2893..b06dc24 100644 --- a/libs/Zend/Cache/Frontend/Function.php +++ b/libs/Zend/Cache/Frontend/Function.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Frontend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Function.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Function.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -76,7 +76,7 @@ class Zend_Cache_Frontend_Function extends Zend_Cache_Core * @param array $parameters Function parameters * @param array $tags Cache tags * @param int $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime) - * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) used by some particular backends + * @param int $priority integer between 0 (very low priority) and 10 (maximum priority) used by some particular backends * @return mixed Result */ public function call($name, $parameters = array(), $tags = array(), $specificLifetime = false, $priority = 8) diff --git a/libs/Zend/Cache/Frontend/Page.php b/libs/Zend/Cache/Frontend/Page.php index 8a6a6f6..64dacc7 100644 --- a/libs/Zend/Cache/Frontend/Page.php +++ b/libs/Zend/Cache/Frontend/Page.php @@ -17,7 +17,7 @@ * @subpackage Zend_Cache_Frontend * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Page.php 16974 2009-07-22 19:23:08Z matthew $ + * @version $Id: Page.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -275,7 +275,7 @@ class Zend_Cache_Frontend_Page extends Zend_Cache_Core header("$name: $value"); } } - if ($this->_specificOptions['debug_header']) { + if ($this->_specificOptions['debug_header']) { echo 'DEBUG HEADER : This is a cached page !'; } echo $data; @@ -339,9 +339,9 @@ class Zend_Cache_Frontend_Page extends Zend_Cache_Core { $tmp = $_SERVER['REQUEST_URI']; $array = explode('?', $tmp, 2); - $tmp = $array[0]; + $tmp = $array[0]; foreach (array('Get', 'Post', 'Session', 'Files', 'Cookie') as $arrayName) { - $tmp2 = $this->_makePartialId($arrayName, $this->_activeOptions['cache_with_' . strtolower($arrayName) . '_variables'], $this->_activeOptions['make_id_with_' . strtolower($arrayName) . '_variables']); + $tmp2 = $this->_makePartialId($arrayName, $this->_activeOptions['cache_with_' . strtolower($arrayName) . '_variables'], $this->_activeOptions['make_id_with_' . strtolower($arrayName) . '_variables']); if ($tmp2===false) { return false; } @@ -360,7 +360,7 @@ class Zend_Cache_Frontend_Page extends Zend_Cache_Core */ protected function _makePartialId($arrayName, $bool1, $bool2) { - switch ($arrayName) { + switch ($arrayName) { case 'Get': $var = $_GET; break; diff --git a/libs/Zend/Captcha/Adapter.php b/libs/Zend/Captcha/Adapter.php index 9e5136e..9e62fd8 100644 --- a/libs/Zend/Captcha/Adapter.php +++ b/libs/Zend/Captcha/Adapter.php @@ -24,7 +24,7 @@ require_once 'Zend/Validate/Interface.php'; /** * Generic Captcha adapter interface - * + * * Each specific captcha implementation should implement this interface * * @category Zend @@ -32,9 +32,9 @@ require_once 'Zend/Validate/Interface.php'; * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Adapter.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Adapter.php 18951 2009-11-12 16:26:19Z alexander $ */ -interface Zend_Captcha_Adapter extends Zend_Validate_Interface +interface Zend_Captcha_Adapter extends Zend_Validate_Interface { /** * Generate a new captcha @@ -62,7 +62,7 @@ interface Zend_Captcha_Adapter extends Zend_Validate_Interface /** * Get captcha name - * + * * @return string */ public function getName(); diff --git a/libs/Zend/Captcha/Base.php b/libs/Zend/Captcha/Base.php index 70fee74..d13941b 100644 --- a/libs/Zend/Captcha/Base.php +++ b/libs/Zend/Captcha/Base.php @@ -27,7 +27,7 @@ require_once 'Zend/Validate/Abstract.php'; /** * Base class for Captcha adapters - * + * * Provides some utility functionality to build on * * @category Zend @@ -35,13 +35,13 @@ require_once 'Zend/Validate/Abstract.php'; * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Base.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Base.php 18951 2009-11-12 16:26:19Z alexander $ */ -abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_Captcha_Adapter +abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_Captcha_Adapter { /** * Element name - * + * * Useful to generate/check form fields * * @var string @@ -49,8 +49,8 @@ abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_ protected $_name; /** - * Captcha options - * + * Captcha options + * * @var array */ protected $_options = array(); @@ -63,23 +63,23 @@ abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_ 'options', 'config', ); - + /** * Get name - * + * * @return string */ - public function getName() + public function getName() { return $this->_name; } - + /** - * Set name - * + * Set name + * * @param string $name */ - public function setName($name) + public function setName($name) { $this->_name = $name; return $this; @@ -88,7 +88,7 @@ abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_ /** * Constructor * - * @param array|Zend_Config $options + * @param array|Zend_Config $options * @return void */ public function __construct($options = null) @@ -98,9 +98,9 @@ abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_ $this->setOptions($options); } else if ($options instanceof Zend_Config) { $this->setConfig($options); - } - } - + } + } + /** * Set single option for the object * @@ -126,11 +126,11 @@ abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_ } return $this; } - + /** * Set object state from options array - * - * @param array $options + * + * @param array $options * @return Zend_Form_Element */ public function setOptions($options = null) @@ -140,10 +140,10 @@ abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_ } return $this; } - + /** * Retrieve options representing object state - * + * * @return array */ public function getOptions() @@ -153,8 +153,8 @@ abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_ /** * Set object state from config object - * - * @param Zend_Config $config + * + * @param Zend_Config $config * @return Zend_Captcha_Base */ public function setConfig(Zend_Config $config) @@ -164,12 +164,12 @@ abstract class Zend_Captcha_Base extends Zend_Validate_Abstract implements Zend_ /** * Get optional decorator - * + * * By default, return null, indicating no extra decorator needed. * * @return null */ - public function getDecorator() + public function getDecorator() { return null; } diff --git a/libs/Zend/Captcha/Dumb.php b/libs/Zend/Captcha/Dumb.php index b78ed07..1d01b70 100644 --- a/libs/Zend/Captcha/Dumb.php +++ b/libs/Zend/Captcha/Dumb.php @@ -24,15 +24,15 @@ require_once 'Zend/Captcha/Word.php'; /** * Example dumb word-based captcha - * + * * Note that only rendering is necessary for word-based captcha - * + * * @category Zend * @package Zend_Captcha * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Dumb.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Dumb.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Captcha_Dumb extends Zend_Captcha_Word { diff --git a/libs/Zend/Captcha/Exception.php b/libs/Zend/Captcha/Exception.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Captcha/Figlet.php b/libs/Zend/Captcha/Figlet.php index dfc4173..2368b46 100644 --- a/libs/Zend/Captcha/Figlet.php +++ b/libs/Zend/Captcha/Figlet.php @@ -27,7 +27,7 @@ require_once 'Zend/Text/Figlet.php'; /** * Captcha based on figlet text rendering service - * + * * Note that this engine seems not to like numbers * * @category Zend @@ -35,7 +35,7 @@ require_once 'Zend/Text/Figlet.php'; * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Figlet.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Figlet.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Captcha_Figlet extends Zend_Captcha_Word { @@ -45,11 +45,11 @@ class Zend_Captcha_Figlet extends Zend_Captcha_Word * @var Zend_Text_Figlet */ protected $_figlet; - + /** * Constructor - * - * @param null|string|array|Zend_Config $options + * + * @param null|string|array|Zend_Config $options * @return void */ public function __construct($options = null) @@ -57,7 +57,7 @@ class Zend_Captcha_Figlet extends Zend_Captcha_Word parent::__construct($options); $this->_figlet = new Zend_Text_Figlet($options); } - + /** * Generate new captcha * @@ -66,7 +66,7 @@ class Zend_Captcha_Figlet extends Zend_Captcha_Word public function generate() { $this->_useNumbers = false; - return parent::generate(); + return parent::generate(); } /** diff --git a/libs/Zend/Captcha/Image.php b/libs/Zend/Captcha/Image.php index 741cf45..32c5323 100644 --- a/libs/Zend/Captcha/Image.php +++ b/libs/Zend/Captcha/Image.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Image.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Image.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Captcha_Word */ @@ -423,8 +423,8 @@ class Zend_Captcha_Image extends Zend_Captcha_Word $tries = 5; // If there's already such file, try creating a new ID while($tries-- && file_exists($this->getImgDir() . $id . $this->getSuffix())) { - $id = $this->_generateRandomId(); - $this->_setId($id); + $id = $this->_generateRandomId(); + $this->_setId($id); } $this->_generateImage($id, $this->getWord()); diff --git a/libs/Zend/Captcha/ReCaptcha.php b/libs/Zend/Captcha/ReCaptcha.php index 0c3da13..e6cbf02 100644 --- a/libs/Zend/Captcha/ReCaptcha.php +++ b/libs/Zend/Captcha/ReCaptcha.php @@ -37,7 +37,7 @@ require_once 'Zend/Service/ReCaptcha.php'; * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ReCaptcha.php 16201 2009-06-21 18:51:15Z thomas $ + * @version $Id: ReCaptcha.php 18166 2009-09-17 13:28:35Z padraic $ */ class Zend_Captcha_ReCaptcha extends Zend_Captcha_Base { @@ -63,6 +63,13 @@ class Zend_Captcha_ReCaptcha extends Zend_Captcha_Base */ protected $_serviceParams = array(); + /** + * Options defined by the service + * + * @var array + */ + protected $_serviceOptions = array(); + /**#@+ * Error codes * @const string @@ -136,6 +143,7 @@ class Zend_Captcha_ReCaptcha extends Zend_Captcha_Base { $this->setService(new Zend_Service_ReCaptcha()); $this->_serviceParams = $this->getService()->getParams(); + $this->_serviceOptions = $this->getService()->getOptions(); parent::__construct($options); @@ -172,7 +180,8 @@ class Zend_Captcha_ReCaptcha extends Zend_Captcha_Base /** * Set option * - * If option is a service parameter, proxies to the service. + * If option is a service parameter, proxies to the service. The same + * goes for any service options (distinct from service params) * * @param string $key * @param mixed $value @@ -185,6 +194,10 @@ class Zend_Captcha_ReCaptcha extends Zend_Captcha_Base $service->setParam($key, $value); return $this; } + if (isset($this->_serviceOptions[$key])) { + $service->setOption($key, $value); + return $this; + } return parent::setOption($key, $value); } diff --git a/libs/Zend/CodeGenerator/Abstract.php b/libs/Zend/CodeGenerator/Abstract.php index 1018048..7cddf7a 100644 --- a/libs/Zend/CodeGenerator/Abstract.php +++ b/libs/Zend/CodeGenerator/Abstract.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,12 +33,12 @@ abstract class Zend_CodeGenerator_Abstract * @var string */ protected $_sourceContent = null; - + /** * @var bool */ protected $_isSourceDirty = true; - + /** * __construct() * @@ -59,7 +59,7 @@ abstract class Zend_CodeGenerator_Abstract } $this->_prepare(); } - + /** * setConfig() * @@ -71,7 +71,7 @@ abstract class Zend_CodeGenerator_Abstract $this->setOptions($config->toArray()); return $this; } - + /** * setOptions() * @@ -88,7 +88,7 @@ abstract class Zend_CodeGenerator_Abstract } return $this; } - + /** * setSourceContent() * @@ -99,7 +99,7 @@ abstract class Zend_CodeGenerator_Abstract $this->_sourceContent = $sourceContent; return; } - + /** * getSourceContent() * @@ -109,31 +109,31 @@ abstract class Zend_CodeGenerator_Abstract { return $this->_sourceContent; } - + /** * _init() - this is called before the constuctor * */ protected function _init() { - + } - + /** * _prepare() - this is called at construction completion * */ protected function _prepare() { - + } - + /** * generate() - must be implemented by the child * */ abstract public function generate(); - + /** * __toString() - casting to a string will in turn call generate() * diff --git a/libs/Zend/CodeGenerator/Php/Abstract.php b/libs/Zend/CodeGenerator/Php/Abstract.php index d7ad2e6..85dcb80 100644 --- a/libs/Zend/CodeGenerator/Php/Abstract.php +++ b/libs/Zend/CodeGenerator/Php/Abstract.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,17 +39,17 @@ abstract class Zend_CodeGenerator_Php_Abstract extends Zend_CodeGenerator_Abstra * */ const LINE_FEED = "\n"; - + /** * @var bool */ protected $_isSourceDirty = true; - + /** * @var int|string */ protected $_indentation = ' '; - + /** * setSourceDirty() * @@ -61,7 +61,7 @@ abstract class Zend_CodeGenerator_Php_Abstract extends Zend_CodeGenerator_Abstra $this->_isSourceDirty = ($isSourceDirty) ? true : false; return $this; } - + /** * isSourceDirty() * @@ -71,7 +71,7 @@ abstract class Zend_CodeGenerator_Php_Abstract extends Zend_CodeGenerator_Abstra { return $this->_isSourceDirty; } - + /** * setIndentation() * @@ -83,7 +83,7 @@ abstract class Zend_CodeGenerator_Php_Abstract extends Zend_CodeGenerator_Abstra $this->_indentation = $indentation; return $this; } - + /** * getIndentation() * @@ -93,5 +93,5 @@ abstract class Zend_CodeGenerator_Php_Abstract extends Zend_CodeGenerator_Abstra { return $this->_indentation; } - + } diff --git a/libs/Zend/CodeGenerator/Php/Body.php b/libs/Zend/CodeGenerator/Php/Body.php index 0bf9802..a57bed8 100644 --- a/libs/Zend/CodeGenerator/Php/Body.php +++ b/libs/Zend/CodeGenerator/Php/Body.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Body.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Body.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,12 +33,12 @@ require_once 'Zend/CodeGenerator/Abstract.php'; */ class Zend_CodeGenerator_Php_Body extends Zend_CodeGenerator_Abstract { - + /** * @var string */ protected $_content = null; - + /** * setContent() * @@ -50,7 +50,7 @@ class Zend_CodeGenerator_Php_Body extends Zend_CodeGenerator_Abstract $this->_content = $content; return $this; } - + /** * getContent() * @@ -60,7 +60,7 @@ class Zend_CodeGenerator_Php_Body extends Zend_CodeGenerator_Abstract { return (string) $this->_content; } - + /** * generate() * diff --git a/libs/Zend/CodeGenerator/Php/Class.php b/libs/Zend/CodeGenerator/Php/Class.php index 93bee26..7aafda0 100644 --- a/libs/Zend/CodeGenerator/Php/Class.php +++ b/libs/Zend/CodeGenerator/Php/Class.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Class.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Class.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -53,37 +53,37 @@ require_once 'Zend/CodeGenerator/Php/Docblock.php'; */ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { - + /** * @var Zend_CodeGenerator_Php_Docblock */ protected $_docblock = null; - + /** * @var string */ protected $_name = null; - + /** * @var bool */ protected $_isAbstract = false; - + /** * @var string */ protected $_extendedClass = null; - + /** * @var array Array of string names */ protected $_implementedInterfaces = array(); - + /** * @var array Array of properties */ protected $_properties = null; - + /** * @var array Array of methods */ @@ -98,26 +98,31 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract public static function fromReflection(Zend_Reflection_Class $reflectionClass) { $class = new self(); - + $class->setSourceContent($class->getSourceContent()); $class->setSourceDirty(false); - + if ($reflectionClass->getDocComment() != '') { $class->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($reflectionClass->getDocblock())); } - + $class->setAbstract($reflectionClass->isAbstract()); $class->setName($reflectionClass->getName()); - + if ($parentClass = $reflectionClass->getParentClass()) { $class->setExtendedClass($parentClass->getName()); - $interfaces = array_diff($parentClass->getInterfaces(), $reflectionClass->getInterfaces()); + $interfaces = array_diff($reflectionClass->getInterfaces(), $parentClass->getInterfaces()); } else { $interfaces = $reflectionClass->getInterfaces(); } - - $class->setImplementedInterfaces($interfaces); - + + $interfaceNames = array(); + foreach($interfaces AS $interface) { + $interfaceNames[] = $interface->getName(); + } + + $class->setImplementedInterfaces($interfaceNames); + $properties = array(); foreach ($reflectionClass->getProperties() as $reflectionProperty) { if ($reflectionProperty->getDeclaringClass()->getName() == $class->getName()) { @@ -125,7 +130,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract } } $class->setProperties($properties); - + $methods = array(); foreach ($reflectionClass->getMethods() as $reflectionMethod) { if ($reflectionMethod->getDeclaringClass()->getName() == $class->getName()) { @@ -133,33 +138,33 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract } } $class->setMethods($methods); - + return $class; } - + /** * setDocblock() Set the docblock * * @param Zend_CodeGenerator_Php_Docblock|array|string $docblock * @return Zend_CodeGenerator_Php_File */ - public function setDocblock($docblock) + public function setDocblock($docblock) { if (is_string($docblock)) { $docblock = array('shortDescription' => $docblock); } - + if (is_array($docblock)) { $docblock = new Zend_CodeGenerator_Php_Docblock($docblock); } elseif (!$docblock instanceof Zend_CodeGenerator_Php_Docblock) { require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('setDocblock() is expecting either a string, array or an instance of Zend_CodeGenerator_Php_Docblock'); } - + $this->_docblock = $docblock; return $this; } - + /** * getDocblock() * @@ -169,7 +174,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { return $this->_docblock; } - + /** * setName() * @@ -181,7 +186,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract $this->_name = $name; return $this; } - + /** * getName() * @@ -203,7 +208,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract $this->_isAbstract = ($isAbstract) ? true : false; return $this; } - + /** * isAbstract() * @@ -213,7 +218,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { return $this->_isAbstract; } - + /** * setExtendedClass() * @@ -225,7 +230,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract $this->_extendedClass = $extendedClass; return $this; } - + /** * getExtendedClass() * @@ -235,7 +240,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { return $this->_extendedClass; } - + /** * setImplementedInterfaces() * @@ -247,7 +252,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract $this->_implementedInterfaces = $implementedInterfaces; return $this; } - + /** * getImplementedInterfaces * @@ -257,7 +262,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { return $this->_implementedInterfaces; } - + /** * setProperties() * @@ -269,10 +274,10 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract foreach ($properties as $property) { $this->setProperty($property); } - + return $this; } - + /** * setProperty() * @@ -290,16 +295,16 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('setProperty() expects either an array of property options or an instance of Zend_CodeGenerator_Php_Property'); } - + if (isset($this->_properties[$propertyName])) { require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('A property by name ' . $propertyName . ' already exists in this class.'); } - - $this->_properties->append($property); + + $this->_properties[$propertyName] = $property; return $this; } - + /** * getProperties() * @@ -309,7 +314,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { return $this->_properties; } - + /** * getProperty() * @@ -325,7 +330,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract } return false; } - + /** * hasProperty() * @@ -336,7 +341,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { return isset($this->_properties[$propertyName]); } - + /** * setMethods() * @@ -350,7 +355,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract } return $this; } - + /** * setMethod() * @@ -368,16 +373,16 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('setMethod() expects either an array of method options or an instance of Zend_CodeGenerator_Php_Method'); } - + if (isset($this->_methods[$methodName])) { require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('A method by name ' . $methodName . ' already exists in this class.'); } - - $this->_methods->append($method); + + $this->_methods[$methodName] = $method; return $this; } - + /** * getMethods() * @@ -387,7 +392,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { return $this->_methods; } - + /** * getMethod() * @@ -403,7 +408,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract } return false; } - + /** * hasMethod() * @@ -414,7 +419,7 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract { return isset($this->_methods[$methodName]); } - + /** * isSourceDirty() * @@ -425,22 +430,22 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract if (($docblock = $this->getDocblock()) && $docblock->isSourceDirty()) { return true; } - + foreach ($this->_properties as $property) { if ($property->isSourceDirty()) { return true; } } - + foreach ($this->_methods as $method) { if ($method->isSourceDirty()) { return true; } } - + return parent::isSourceDirty(); } - + /** * generate() * @@ -451,50 +456,50 @@ class Zend_CodeGenerator_Php_Class extends Zend_CodeGenerator_Php_Abstract if (!$this->isSourceDirty()) { return $this->getSourceContent(); } - - $output = ''; - + + $output = ''; + if (null !== ($docblock = $this->getDocblock())) { $docblock->setIndentation(''); $output .= $docblock->generate(); } - + if ($this->isAbstract()) { $output .= 'abstract '; } - + $output .= 'class ' . $this->getName(); - + if (null !== ($ec = $this->_extendedClass)) { $output .= ' extends ' . $ec; } - + $implemented = $this->getImplementedInterfaces(); if (!empty($implemented)) { $output .= ' implements ' . implode(', ', $implemented); } - + $output .= self::LINE_FEED . '{' . self::LINE_FEED . self::LINE_FEED; - + $properties = $this->getProperties(); if (!empty($properties)) { foreach ($properties as $property) { $output .= $property->generate() . self::LINE_FEED . self::LINE_FEED; } } - + $methods = $this->getMethods(); if (!empty($methods)) { foreach ($methods as $method) { $output .= $method->generate() . self::LINE_FEED; } } - + $output .= self::LINE_FEED . '}' . self::LINE_FEED; - + return $output; } - + /** * _init() - is called at construction time * diff --git a/libs/Zend/CodeGenerator/Php/Docblock.php b/libs/Zend/CodeGenerator/Php/Docblock.php index 3aad8c9..fc94c11 100644 --- a/libs/Zend/CodeGenerator/Php/Docblock.php +++ b/libs/Zend/CodeGenerator/Php/Docblock.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Docblock.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Docblock.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -42,12 +42,12 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract * @var string */ protected $_shortDescription = null; - + /** * @var string */ protected $_longDescription = null; - + /** * @var array */ @@ -57,7 +57,7 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract * @var string */ protected $_indentation = ''; - + /** * fromReflection() - Build a docblock generator object from a reflection object * @@ -67,20 +67,20 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract public static function fromReflection(Zend_Reflection_Docblock $reflectionDocblock) { $docblock = new self(); - + $docblock->setSourceContent($reflectionDocblock->getContents()); $docblock->setSourceDirty(false); - + $docblock->setShortDescription($reflectionDocblock->getShortDescription()); $docblock->setLongDescription($reflectionDocblock->getLongDescription()); - + foreach ($reflectionDocblock->getTags() as $tag) { $docblock->setTag(Zend_CodeGenerator_Php_Docblock_Tag::fromReflection($tag)); } - + return $docblock; } - + /** * setShortDescription() * @@ -92,7 +92,7 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract $this->_shortDescription = $shortDescription; return $this; } - + /** * getShortDescription() * @@ -102,7 +102,7 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract { return $this->_shortDescription; } - + /** * setLongDescription() * @@ -114,7 +114,7 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract $this->_longDescription = $longDescription; return $this; } - + /** * getLongDescription() * @@ -124,7 +124,7 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract { return $this->_longDescription; } - + /** * setTags() * @@ -136,10 +136,10 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract foreach ($tags as $tag) { $this->setTag($tag); } - + return $this; } - + /** * setTag() * @@ -157,11 +157,11 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract . 'instance of Zend_CodeGenerator_Php_Docblock_Tag' ); } - + $this->_tags[] = $tag; return $this; } - + /** * getTags * @@ -171,7 +171,7 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract { return $this->_tags; } - + /** * generate() * @@ -182,7 +182,7 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract if (!$this->isSourceDirty()) { return $this->_docCommentize($this->getSourceContent()); } - + $output = ''; if (null !== ($sd = $this->getShortDescription())) { $output .= $sd . self::LINE_FEED . self::LINE_FEED; @@ -194,10 +194,10 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract foreach ($this->getTags() as $tag) { $output .= $tag->generate() . self::LINE_FEED; } - + return $this->_docCommentize(trim($output)); } - + /** * _docCommentize() * @@ -216,5 +216,5 @@ class Zend_CodeGenerator_Php_Docblock extends Zend_CodeGenerator_Php_Abstract $output .= $indent . ' */' . self::LINE_FEED; return $output; } - + } diff --git a/libs/Zend/CodeGenerator/Php/Docblock/Tag.php b/libs/Zend/CodeGenerator/Php/Docblock/Tag.php index 2f390b1..56f753d 100644 --- a/libs/Zend/CodeGenerator/Php/Docblock/Tag.php +++ b/libs/Zend/CodeGenerator/Php/Docblock/Tag.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Tag.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Tag.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -53,7 +53,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac * @var string */ protected $_name = null; - + /** * @var string */ @@ -68,9 +68,9 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac public static function fromReflection(Zend_Reflection_Docblock_Tag $reflectionTag) { $tagName = $reflectionTag->getName(); - + $codeGenDocblockTag = self::factory($tagName); - + // transport any properties via accessors and mutators from reflection to codegen object $reflectionClass = new ReflectionClass($reflectionTag); foreach ($reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { @@ -81,10 +81,10 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac } } } - + return $codeGenDocblockTag; } - + /** * setPluginLoader() * @@ -95,7 +95,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac self::$_pluginLoader = $pluginLoader; return; } - + /** * getPluginLoader() * @@ -109,24 +109,24 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac 'Zend_CodeGenerator_Php_Docblock_Tag' => dirname(__FILE__) . '/Tag/')) ); } - + return self::$_pluginLoader; } - + public static function factory($tagName) { $pluginLoader = self::getPluginLoader(); - + try { $tagClass = $pluginLoader->load($tagName); } catch (Zend_Loader_Exception $exception) { $tagClass = 'Zend_CodeGenerator_Php_Docblock_Tag'; } - + $tag = new $tagClass(array('name' => $tagName)); return $tag; } - + /** * setName() * @@ -138,7 +138,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac $this->_name = ltrim($name, '@'); return $this; } - + /** * getName() * @@ -148,7 +148,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac { return $this->_name; } - + /** * setDescription() * @@ -160,7 +160,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac $this->_description = $description; return $this; } - + /** * getDescription() * @@ -180,5 +180,5 @@ class Zend_CodeGenerator_Php_Docblock_Tag extends Zend_CodeGenerator_Php_Abstrac { return '@' . $this->_name . ' ' . $this->_description; } - + } \ No newline at end of file diff --git a/libs/Zend/CodeGenerator/Php/Docblock/Tag/License.php b/libs/Zend/CodeGenerator/Php/Docblock/Tag/License.php index 7c71f63..382e8a3 100644 --- a/libs/Zend/CodeGenerator/Php/Docblock/Tag/License.php +++ b/libs/Zend/CodeGenerator/Php/Docblock/Tag/License.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: License.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: License.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,19 +31,19 @@ require_once 'Zend/CodeGenerator/Php/Docblock/Tag.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_CodeGenerator_Php_Docblock_Tag_License extends Zend_CodeGenerator_Php_Docblock_Tag +class Zend_CodeGenerator_Php_Docblock_Tag_License extends Zend_CodeGenerator_Php_Docblock_Tag { - + /** * @var string */ protected $_url = null; - + /** * @var string */ protected $_description = null; - + /** * fromReflection() * @@ -53,14 +53,14 @@ class Zend_CodeGenerator_Php_Docblock_Tag_License extends Zend_CodeGenerator_Php public static function fromReflection(Zend_Reflection_Docblock_Tag $reflectionTagLicense) { $returnTag = new self(); - + $returnTag->setName('license'); $returnTag->setUrl($reflectionTagLicense->getUrl()); $returnTag->setDescription($reflectionTagLicense->getDescription()); - + return $returnTag; } - + /** * setUrl() * @@ -72,7 +72,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag_License extends Zend_CodeGenerator_Php $this->_url = $url; return $this; } - + /** * getUrl() * @@ -94,5 +94,5 @@ class Zend_CodeGenerator_Php_Docblock_Tag_License extends Zend_CodeGenerator_Php $output = '@license ' . $this->_url . ' ' . $this->_description . self::LINE_FEED; return $output; } - + } \ No newline at end of file diff --git a/libs/Zend/CodeGenerator/Php/Docblock/Tag/Param.php b/libs/Zend/CodeGenerator/Php/Docblock/Tag/Param.php index 9d8434c..c1d40a9 100644 --- a/libs/Zend/CodeGenerator/Php/Docblock/Tag/Param.php +++ b/libs/Zend/CodeGenerator/Php/Docblock/Tag/Param.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Param.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Param.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,22 +33,22 @@ require_once 'Zend/CodeGenerator/Php/Docblock/Tag.php'; */ class Zend_CodeGenerator_Php_Docblock_Tag_Param extends Zend_CodeGenerator_Php_Docblock_Tag { - + /** * @var string */ protected $_datatype = null; - + /** * @var string */ protected $_paramName = null; - + /** * @var string */ protected $_description = null; - + /** * fromReflection() * @@ -63,7 +63,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Param extends Zend_CodeGenerator_Php_D $paramTag->setDatatype($reflectionTagParam->getType()); // @todo rename $paramTag->setParamName($reflectionTagParam->getVariableName()); $paramTag->setDescription($reflectionTagParam->getDescription()); - + return $paramTag; } @@ -78,7 +78,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Param extends Zend_CodeGenerator_Php_D $this->_datatype = $datatype; return $this; } - + /** * getDatatype * @@ -88,7 +88,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Param extends Zend_CodeGenerator_Php_D { return $this->_datatype; } - + /** * setParamName() * @@ -100,7 +100,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Param extends Zend_CodeGenerator_Php_D $this->_paramName = $paramName; return $this; } - + /** * getParamName() * @@ -110,7 +110,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Param extends Zend_CodeGenerator_Php_D { return $this->_paramName; } - + /** * generate() * @@ -118,11 +118,11 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Param extends Zend_CodeGenerator_Php_D */ public function generate() { - $output = '@param ' + $output = '@param ' . (($this->_datatype != null) ? $this->_datatype : 'unknown') - . (($this->_paramName != null) ? ' $' . $this->_paramName : '') + . (($this->_paramName != null) ? ' $' . $this->_paramName : '') . (($this->_description != null) ? ' ' . $this->_description : ''); return $output; } - + } diff --git a/libs/Zend/CodeGenerator/Php/Docblock/Tag/Return.php b/libs/Zend/CodeGenerator/Php/Docblock/Tag/Return.php index 4abf938..405f8cc 100644 --- a/libs/Zend/CodeGenerator/Php/Docblock/Tag/Return.php +++ b/libs/Zend/CodeGenerator/Php/Docblock/Tag/Return.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Return.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Return.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,19 +31,19 @@ require_once 'Zend/CodeGenerator/Php/Docblock/Tag.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_CodeGenerator_Php_Docblock_Tag_Return extends Zend_CodeGenerator_Php_Docblock_Tag +class Zend_CodeGenerator_Php_Docblock_Tag_Return extends Zend_CodeGenerator_Php_Docblock_Tag { - + /** * @var string */ protected $_datatype = null; - + /** * @var string */ protected $_description = null; - + /** * fromReflection() * @@ -53,14 +53,14 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Return extends Zend_CodeGenerator_Php_ public static function fromReflection(Zend_Reflection_Docblock_Tag $reflectionTagReturn) { $returnTag = new self(); - + $returnTag->setName('return'); $returnTag->setDatatype($reflectionTagReturn->getType()); // @todo rename $returnTag->setDescription($reflectionTagReturn->getDescription()); - + return $returnTag; } - + /** * setDatatype() * @@ -72,7 +72,7 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Return extends Zend_CodeGenerator_Php_ $this->_datatype = $datatype; return $this; } - + /** * getDatatype() * @@ -94,5 +94,5 @@ class Zend_CodeGenerator_Php_Docblock_Tag_Return extends Zend_CodeGenerator_Php_ $output = '@return ' . $this->_datatype . ' ' . $this->_description; return $output; } - + } \ No newline at end of file diff --git a/libs/Zend/CodeGenerator/Php/Exception.php b/libs/Zend/CodeGenerator/Php/Exception.php index 4e754ae..fc2dd20 100644 --- a/libs/Zend/CodeGenerator/Php/Exception.php +++ b/libs/Zend/CodeGenerator/Php/Exception.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,5 +33,5 @@ require_once 'Zend/CodeGenerator/Exception.php'; */ class Zend_CodeGenerator_Php_Exception extends Zend_CodeGenerator_Exception { - + } diff --git a/libs/Zend/CodeGenerator/Php/File.php b/libs/Zend/CodeGenerator/Php/File.php index dff0761..dbbc64b 100644 --- a/libs/Zend/CodeGenerator/Php/File.php +++ b/libs/Zend/CodeGenerator/Php/File.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: File.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: File.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,12 +38,12 @@ require_once 'Zend/CodeGenerator/Php/Class.php'; */ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract { - + /** * @var array Array of Zend_CodeGenerator_Php_File */ protected static $_fileCodeGenerators = array(); - + /**#@+ * @var string */ @@ -51,27 +51,27 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract protected static $_markerRequire = '/* Zend_CodeGenerator_Php_File-RequireMarker: {?} */'; protected static $_markerClass = '/* Zend_CodeGenerator_Php_File-ClassMarker: {?} */'; /**#@-*/ - + /** * @var string */ protected $_filename = null; - + /** * @var Zend_CodeGenerator_Php_Docblock */ protected $_docblock = null; - + /** * @var array */ protected $_requiredFiles = array(); - + /** * @var array */ protected $_classes = array(); - + /** * @var string */ @@ -82,20 +82,20 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract if ($fileName == null) { $fileName = $fileCodeGenerator->getFilename(); } - + if ($fileName == '') { require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('FileName does not exist.'); } - + // cannot use realpath since the file might not exist, but we do need to have the index // in the same DIRECTORY_SEPARATOR that realpath would use: $fileName = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $fileName); - + self::$_fileCodeGenerators[$fileName] = $fileCodeGenerator; - + } - + /** * fromReflectedFilePath() - use this if you intend on generating code generation objects based on the same file. * This will keep previous changes to the file in tact during the same PHP process @@ -108,31 +108,31 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract public static function fromReflectedFileName($filePath, $usePreviousCodeGeneratorIfItExists = true, $includeIfNotAlreadyIncluded = true) { $realpath = realpath($filePath); - + if ($realpath === false) { if ( ($realpath = Zend_Reflection_file::findRealpathInIncludePath($filePath)) === false) { require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('No file for ' . $realpath . ' was found.'); } } - + if ($usePreviousCodeGeneratorIfItExists && isset(self::$_fileCodeGenerators[$realpath])) { return self::$_fileCodeGenerators[$realpath]; } - + if ($includeIfNotAlreadyIncluded && !in_array($realpath, get_included_files())) { include $realpath; } - + $codeGenerator = self::fromReflection(($fileReflector = new Zend_Reflection_File($realpath))); - + if (!isset(self::$_fileCodeGenerators[$fileReflector->getFileName()])) { self::$_fileCodeGenerators[$fileReflector->getFileName()] = $codeGenerator; } - + return $codeGenerator; } - + /** * fromReflection() * @@ -142,22 +142,22 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract public static function fromReflection(Zend_Reflection_File $reflectionFile) { $file = new self(); - + $file->setSourceContent($reflectionFile->getContents()); $file->setSourceDirty(false); - + $body = $reflectionFile->getContents(); - + // @todo this whole area needs to be reworked with respect to how body lines are processed foreach ($reflectionFile->getClasses() as $class) { $file->setClass(Zend_CodeGenerator_Php_Class::fromReflection($class)); $classStartLine = $class->getStartLine(true); $classEndLine = $class->getEndLine(); - + $bodyLines = explode("\n", $body); $bodyReturn = array(); for ($lineNum = 1; $lineNum <= count($bodyLines); $lineNum++) { - if ($lineNum == $classStartLine) { + if ($lineNum == $classStartLine) { $bodyReturn[] = str_replace('?', $class->getName(), self::$_markerClass); //'/* Zend_CodeGenerator_Php_File-ClassMarker: {' . $class->getName() . '} */'; $lineNum = $classEndLine; } else { @@ -167,15 +167,15 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract $body = implode("\n", $bodyReturn); unset($bodyLines, $bodyReturn, $classStartLine, $classEndLine); } - + if (($reflectionFile->getDocComment() != '')) { $docblock = $reflectionFile->getDocblock(); $file->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($docblock)); - + $bodyLines = explode("\n", $body); $bodyReturn = array(); for ($lineNum = 1; $lineNum <= count($bodyLines); $lineNum++) { - if ($lineNum == $docblock->getStartLine()) { + if ($lineNum == $docblock->getStartLine()) { $bodyReturn[] = str_replace('?', $class->getName(), self::$_markerDocblock); //'/* Zend_CodeGenerator_Php_File-ClassMarker: {' . $class->getName() . '} */'; $lineNum = $docblock->getEndLine(); } else { @@ -185,41 +185,41 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract $body = implode("\n", $bodyReturn); unset($bodyLines, $bodyReturn, $classStartLine, $classEndLine); } - + $file->setBody($body); - + return $file; } - + /** * setDocblock() Set the docblock * * @param Zend_CodeGenerator_Php_Docblock|array|string $docblock * @return Zend_CodeGenerator_Php_File */ - public function setDocblock($docblock) + public function setDocblock($docblock) { if (is_string($docblock)) { $docblock = array('shortDescription' => $docblock); } - + if (is_array($docblock)) { $docblock = new Zend_CodeGenerator_Php_Docblock($docblock); } elseif (!$docblock instanceof Zend_CodeGenerator_Php_Docblock) { require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('setDocblock() is expecting either a string, array or an instance of Zend_CodeGenerator_Php_Docblock'); } - + $this->_docblock = $docblock; return $this; } - + /** * Get docblock * * @return Zend_CodeGenerator_Php_Docblock */ - public function getDocblock() + public function getDocblock() { return $this->_docblock; } @@ -235,13 +235,13 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract $this->_requiredFiles = $requiredFiles; return $this; } - + /** * getRequiredFiles() * * @return array */ - public function getRequiredFiles() + public function getRequiredFiles() { return $this->_requiredFiles; } @@ -252,14 +252,14 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract * @param array $classes * @return Zend_CodeGenerator_Php_File */ - public function setClasses(Array $classes) + public function setClasses(Array $classes) { foreach ($classes as $class) { $this->setClass($class); } return $this; } - + /** * getClass() * @@ -272,10 +272,10 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract reset($this->_classes); return current($this->_classes); } - + return $this->_classes[$name]; } - + /** * setClass() * @@ -293,13 +293,13 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('Expecting either an array or an instance of Zend_CodeGenerator_Php_Class'); } - - // @todo check for dup here - + + // @todo check for dup here + $this->_classes[$className] = $class; return $this; } - + /** * setFilename() * @@ -311,7 +311,7 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract $this->_filename = $filename; return $this; } - + /** * getFilename() * @@ -321,13 +321,13 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract { return $this->_filename; } - + /** * getClasses() * * @return array Array of Zend_CodeGenerator_Php_Class */ - public function getClasses() + public function getClasses() { return $this->_classes; } @@ -343,7 +343,7 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract $this->_body = $body; return $this; } - + /** * getBody() * @@ -353,7 +353,7 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract { return $this->_body; } - + /** * isSourceDirty() * @@ -364,16 +364,16 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract if (($docblock = $this->getDocblock()) && $docblock->isSourceDirty()) { return true; } - + foreach ($this->_classes as $class) { if ($class->isSourceDirty()) { return true; } } - + return parent::isSourceDirty(); } - + /** * generate() * @@ -384,21 +384,21 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract if ($this->isSourceDirty() === false) { return $this->_sourceContent; } - + $output = ''; - + // start with the body (if there), or open tag if (preg_match('#(?:\s*)<\?php#', $this->getBody()) == false) { $output = 'getBody(); if (preg_match('#/\* Zend_CodeGenerator_Php_File-(.*?)Marker:#', $body)) { $output .= $body; $body = ''; } - + // Add file docblock, if any if (null !== ($docblock = $this->getDocblock())) { $docblock->setIndentation(''); @@ -409,10 +409,10 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract $output .= $docblock->generate() . self::LINE_FEED; } } - + // newline $output .= self::LINE_FEED; - + // process required files // @todo marker replacement for required files $requiredFiles = $this->getRequiredFiles(); @@ -420,10 +420,10 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract foreach ($requiredFiles as $requiredFile) { $output .= 'require_once \'' . $requiredFile . '\';' . self::LINE_FEED; } - + $output .= self::LINE_FEED; } - + // process classes $classes = $this->getClasses(); if (!empty($classes)) { @@ -436,22 +436,22 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract $output .= $class->generate() . self::LINE_FEED; } } - + } if (!empty($body)) { - // add an extra space betwee clsses and + // add an extra space betwee clsses and if (!empty($classes)) { $output .= self::LINE_FEED; } - + $output .= $body; } return $output; } - + public function write() { if ($this->_filename == '' || !is_writable(dirname($this->_filename))) { @@ -461,5 +461,5 @@ class Zend_CodeGenerator_Php_File extends Zend_CodeGenerator_Php_Abstract file_put_contents($this->_filename, $this->generate()); return $this; } - + } diff --git a/libs/Zend/CodeGenerator/Php/Member/Abstract.php b/libs/Zend/CodeGenerator/Php/Member/Abstract.php index 9f8fd13..d98bb6f 100644 --- a/libs/Zend/CodeGenerator/Php/Member/Abstract.php +++ b/libs/Zend/CodeGenerator/Php/Member/Abstract.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,7 +38,7 @@ require_once 'Zend/CodeGenerator/Php/Docblock.php'; */ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator_Php_Abstract { - + /**#@+ * @param const string */ @@ -46,32 +46,32 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator const VISIBILITY_PROTECTED = 'protected'; const VISIBILITY_PRIVATE = 'private'; /**#@-*/ - + /** * @var Zend_CodeGenerator_Php_Docblock */ protected $_docblock = null; - + /** * @var bool */ protected $_isAbstract = false; - + /** * @var bool */ protected $_isFinal = false; - + /** * @var bool */ protected $_isStatic = false; - + /** * @var const */ protected $_visibility = self::VISIBILITY_PUBLIC; - + /** * @var string */ @@ -83,23 +83,23 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator * @param Zend_CodeGenerator_Php_Docblock|array|string $docblock * @return Zend_CodeGenerator_Php_File */ - public function setDocblock($docblock) + public function setDocblock($docblock) { if (is_string($docblock)) { $docblock = array('shortDescription' => $docblock); } - + if (is_array($docblock)) { $docblock = new Zend_CodeGenerator_Php_Docblock($docblock); } elseif (!$docblock instanceof Zend_CodeGenerator_Php_Docblock) { require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('setDocblock() is expecting either a string, array or an instance of Zend_CodeGenerator_Php_Docblock'); } - + $this->_docblock = $docblock; return $this; } - + /** * getDocblock() * @@ -109,7 +109,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator { return $this->_docblock; } - + /** * setAbstract() * @@ -121,7 +121,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator $this->_isAbstract = ($isAbstract) ? true : false; return $this; } - + /** * isAbstract() * @@ -131,7 +131,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator { return $this->_isAbstract; } - + /** * setFinal() * @@ -143,7 +143,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator $this->_isFinal = ($isFinal) ? true : false; return $this; } - + /** * isFinal() * @@ -153,7 +153,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator { return $this->_isFinal; } - + /** * setStatic() * @@ -165,7 +165,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator $this->_isStatic = ($isStatic) ? true : false; return $this; } - + /** * isStatic() * @@ -175,7 +175,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator { return $this->_isStatic; } - + /** * setVisitibility() * @@ -187,7 +187,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator $this->_visibility = $visibility; return $this; } - + /** * getVisibility() * @@ -197,7 +197,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator { return $this->_visibility; } - + /** * setName() * @@ -209,7 +209,7 @@ abstract class Zend_CodeGenerator_Php_Member_Abstract extends Zend_CodeGenerator $this->_name = $name; return $this; } - + /** * getName() * diff --git a/libs/Zend/CodeGenerator/Php/Member/Container.php b/libs/Zend/CodeGenerator/Php/Member/Container.php index da88d02..3827ee3 100644 --- a/libs/Zend/CodeGenerator/Php/Member/Container.php +++ b/libs/Zend/CodeGenerator/Php/Member/Container.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Container.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Container.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,19 +28,19 @@ */ class Zend_CodeGenerator_Php_Member_Container extends ArrayObject { - + /**#@+ * @param const string */ const TYPE_PROPERTY = 'property'; const TYPE_METHOD = 'method'; /**#@-*/ - + /** * @var const|string */ protected $_type = self::TYPE_PROPERTY; - + /** * __construct() * @@ -51,5 +51,5 @@ class Zend_CodeGenerator_Php_Member_Container extends ArrayObject $this->_type = $type; parent::__construct(array(), self::ARRAY_AS_PROPS); } - + } \ No newline at end of file diff --git a/libs/Zend/CodeGenerator/Php/Method.php b/libs/Zend/CodeGenerator/Php/Method.php index d975c53..a4a869d 100644 --- a/libs/Zend/CodeGenerator/Php/Method.php +++ b/libs/Zend/CodeGenerator/Php/Method.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Method.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Method.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -41,28 +41,28 @@ require_once 'Zend/CodeGenerator/Php/Parameter.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstract +class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstract { /** * @var Zend_CodeGenerator_Php_Docblock */ protected $_docblock = null; - + /** * @var bool */ protected $_isFinal = false; - + /** * @var array */ protected $_parameters = array(); - + /** * @var string */ protected $_body = null; - + /** * fromReflection() * @@ -72,16 +72,16 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra public static function fromReflection(Zend_Reflection_Method $reflectionMethod) { $method = new self(); - + $method->setSourceContent($reflectionMethod->getContents(false)); $method->setSourceDirty(false); - + if ($reflectionMethod->getDocComment() != '') { $method->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($reflectionMethod->getDocblock())); } - + $method->setFinal($reflectionMethod->isFinal()); - + if ($reflectionMethod->isPrivate()) { $method->setVisibility(self::VISIBILITY_PRIVATE); } elseif ($reflectionMethod->isProtected()) { @@ -89,20 +89,20 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra } else { $method->setVisibility(self::VISIBILITY_PUBLIC); } - + $method->setStatic($reflectionMethod->isStatic()); $method->setName($reflectionMethod->getName()); - + foreach ($reflectionMethod->getParameters() as $reflectionParameter) { $method->setParameter(Zend_CodeGenerator_Php_Parameter::fromReflection($reflectionParameter)); } - + $method->setBody($reflectionMethod->getBody()); return $method; } - + /** * setFinal() * @@ -112,7 +112,7 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra { $this->_isFinal = ($isFinal) ? true : false; } - + /** * setParameters() * @@ -126,7 +126,7 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra } return $this; } - + /** * setParameter() * @@ -144,11 +144,11 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('setParameter() expects either an array of method options or an instance of Zend_CodeGenerator_Php_Parameter'); } - + $this->_parameters[$parameterName] = $parameter; return $this; } - + /** * getParameters() * @@ -170,7 +170,7 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra $this->_body = $body; return $this; } - + /** * getBody() * @@ -180,7 +180,7 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra { return $this->_body; } - + /** * generate() * @@ -189,22 +189,22 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra public function generate() { $output = ''; - + $indent = $this->getIndentation(); - + if (($docblock = $this->getDocblock()) !== null) { $docblock->setIndentation($indent); $output .= $docblock->generate(); } - + $output .= $indent; - + if ($this->isAbstract()) { $output .= 'abstract '; } else { $output .= (($this->isFinal()) ? 'final ' : ''); } - + $output .= $this->getVisibility() . (($this->isStatic()) ? ' static' : '') . ' function ' . $this->getName() . '('; @@ -214,21 +214,21 @@ class Zend_CodeGenerator_Php_Method extends Zend_CodeGenerator_Php_Member_Abstra foreach ($parameters as $parameter) { $parameterOuput[] = $parameter->generate(); } - + $output .= implode(', ', $parameterOuput); } - + $output .= ')' . self::LINE_FEED . $indent . '{' . self::LINE_FEED; if ($this->_body) { - $output .= ' ' - . str_replace(self::LINE_FEED, self::LINE_FEED . $indent . $indent, trim($this->_body)) + $output .= ' ' + . str_replace(self::LINE_FEED, self::LINE_FEED . $indent . $indent, trim($this->_body)) . self::LINE_FEED; } - + $output .= $indent . '}' . self::LINE_FEED; - + return $output; } - + } diff --git a/libs/Zend/CodeGenerator/Php/Parameter.php b/libs/Zend/CodeGenerator/Php/Parameter.php index 8c21fb2..371c558 100644 --- a/libs/Zend/CodeGenerator/Php/Parameter.php +++ b/libs/Zend/CodeGenerator/Php/Parameter.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Parameter.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Parameter.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -25,6 +25,11 @@ */ require_once 'Zend/CodeGenerator/Php/Abstract.php'; +/** + * @see Zend_CodeGenerator_Php_ParameterDefaultValue + */ +require_once 'Zend/CodeGenerator/Php/Parameter/DefaultValue.php'; + /** * @category Zend * @package Zend_CodeGenerator @@ -37,22 +42,27 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract * @var string */ protected $_type = null; - + /** * @var string */ protected $_name = null; - + /** * @var string */ protected $_defaultValue = null; - + /** * @var int */ protected $_position = null; - + + /** + * @var bool + */ + protected $_passedByReference = false; + /** * fromReflection() * @@ -61,10 +71,28 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract */ public static function fromReflection(Zend_Reflection_Parameter $reflectionParameter) { - // @todo Research this - return new self(); + $param = new Zend_CodeGenerator_Php_Parameter(); + $param->setName($reflectionParameter->getName()); + + if($reflectionParameter->isArray()) { + $param->setType('array'); + } else { + $typeClass = $reflectionParameter->getClass(); + if($typeClass !== null) { + $param->setType($typeClass->getName()); + } + } + + $param->setPosition($reflectionParameter->getPosition()); + + if($reflectionParameter->isOptional()) { + $param->setDefaultValue($reflectionParameter->getDefaultValue()); + } + $param->setPassedByReference($reflectionParameter->isPassedByReference()); + + return $param; } - + /** * setType() * @@ -76,7 +104,7 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract $this->_type = $type; return $this; } - + /** * getType() * @@ -86,7 +114,7 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract { return $this->_type; } - + /** * setName() * @@ -98,7 +126,7 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract $this->_name = $name; return $this; } - + /** * getName() * @@ -108,19 +136,34 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract { return $this->_name; } - + /** - * setDefaultValue() + * Set the default value of the parameter. * - * @param string $defaultValue + * Certain variables are difficult to expres + * + * @param null|bool|string|int|float|Zend_CodeGenerator_Php_Parameter_DefaultValue $defaultValue * @return Zend_CodeGenerator_Php_Parameter */ public function setDefaultValue($defaultValue) { - $this->_defaultValue = $defaultValue; + if($defaultValue === null) { + $this->_defaultValue = new Zend_CodeGenerator_Php_Parameter_DefaultValue("null"); + } else if(is_array($defaultValue)) { + $defaultValue = str_replace(array("\r", "\n"), "", var_export($defaultValue, true)); + $this->_defaultValue = new Zend_CodeGenerator_Php_Parameter_DefaultValue($defaultValue); + } else if(is_bool($defaultValue)) { + if($defaultValue == true) { + $this->_defaultValue = new Zend_CodeGenerator_Php_Parameter_DefaultValue("true"); + } else { + $this->_defaultValue = new Zend_CodeGenerator_Php_Parameter_DefaultValue("false"); + } + } else { + $this->_defaultValue = $defaultValue; + } return $this; } - + /** * getDefaultValue() * @@ -130,7 +173,7 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract { return $this->_defaultValue; } - + /** * setPosition() * @@ -142,7 +185,7 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract $this->_position = $position; return $this; } - + /** * getPosition() * @@ -152,7 +195,25 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract { return $this->_position; } - + + /** + * @return bool + */ + public function getPassedByReference() + { + return $this->_passedByReference; + } + + /** + * @param bool $passedByReference + * @return Zend_CodeGenerator_Php_Parameter + */ + public function setPassedByReference($passedByReference) + { + $this->_passedByReference = $passedByReference; + return $this; + } + /** * generate() * @@ -161,17 +222,23 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract public function generate() { $output = ''; - + if ($this->_type) { - $output .= $this->_type . ' '; + $output .= $this->_type . ' '; } - + + if($this->_passedByReference === true) { + $output .= '&'; + } + $output .= '$' . $this->_name; - - if ($this->_defaultValue) { + + if ($this->_defaultValue !== null) { $output .= ' = '; if (is_string($this->_defaultValue)) { $output .= '\'' . $this->_defaultValue . '\''; + } else if($this->_defaultValue instanceof Zend_CodeGenerator_Php_ParameterDefaultValue) { + $output .= (string)$this->_defaultValue; } else { $output .= $this->_defaultValue; } @@ -179,5 +246,5 @@ class Zend_CodeGenerator_Php_Parameter extends Zend_CodeGenerator_Php_Abstract return $output; } - + } \ No newline at end of file diff --git a/libs/Zend/CodeGenerator/Php/Parameter/DefaultValue.php b/libs/Zend/CodeGenerator/Php/Parameter/DefaultValue.php new file mode 100644 index 0000000..7df4f92 --- /dev/null +++ b/libs/Zend/CodeGenerator/Php/Parameter/DefaultValue.php @@ -0,0 +1,60 @@ +_defaultValue = $defaultValue; + } + + public function __toString() + { + return $this->_defaultValue; + } +} \ No newline at end of file diff --git a/libs/Zend/CodeGenerator/Php/Property.php b/libs/Zend/CodeGenerator/Php/Property.php index 80f5e55..fd5b764 100644 --- a/libs/Zend/CodeGenerator/Php/Property.php +++ b/libs/Zend/CodeGenerator/Php/Property.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Property.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Property.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,14 +36,14 @@ require_once 'Zend/CodeGenerator/Php/Property/DefaultValue.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_CodeGenerator_Php_Property extends Zend_CodeGenerator_Php_Member_Abstract +class Zend_CodeGenerator_Php_Property extends Zend_CodeGenerator_Php_Member_Abstract { - + /** * @var bool */ protected $_isConst = null; - + /** * @var string */ @@ -58,21 +58,21 @@ class Zend_CodeGenerator_Php_Property extends Zend_CodeGenerator_Php_Member_Abst public static function fromReflection(Zend_Reflection_Property $reflectionProperty) { $property = new self(); - + $property->setName($reflectionProperty->getName()); - + $allDefaultProperties = $reflectionProperty->getDeclaringClass()->getDefaultProperties(); - + $property->setDefaultValue($allDefaultProperties[$reflectionProperty->getName()]); - + if ($reflectionProperty->getDocComment() != '') { $property->setDocblock(Zend_CodeGenerator_Php_Docblock::fromReflection($reflectionProperty->getDocComment())); } - + if ($reflectionProperty->isStatic()) { $property->setStatic(true); } - + if ($reflectionProperty->isPrivate()) { $property->setVisibility(self::VISIBILITY_PRIVATE); } elseif ($reflectionProperty->isProtected()) { @@ -80,12 +80,12 @@ class Zend_CodeGenerator_Php_Property extends Zend_CodeGenerator_Php_Member_Abst } else { $property->setVisibility(self::VISIBILITY_PUBLIC); } - + $property->setSourceDirty(false); - + return $property; } - + /** * setConst() * @@ -97,7 +97,7 @@ class Zend_CodeGenerator_Php_Property extends Zend_CodeGenerator_Php_Member_Abst $this->_isConst = $const; return $this; } - + /** * isConst() * @@ -117,16 +117,16 @@ class Zend_CodeGenerator_Php_Property extends Zend_CodeGenerator_Php_Member_Abst public function setDefaultValue($defaultValue) { // if it looks like - if (is_array($defaultValue) + if (is_array($defaultValue) && array_key_exists('value', $defaultValue) && array_key_exists('type', $defaultValue)) { $defaultValue = new Zend_CodeGenerator_Php_Property_DefaultValue($defaultValue); } - + if (!($defaultValue instanceof Zend_CodeGenerator_Php_Property_DefaultValue)) { $defaultValue = new Zend_CodeGenerator_Php_Property_DefaultValue(array('value' => $defaultValue)); } - + $this->_defaultValue = $defaultValue; return $this; } @@ -140,7 +140,7 @@ class Zend_CodeGenerator_Php_Property extends Zend_CodeGenerator_Php_Member_Abst { return $this->_defaultValue; } - + /** * generate() * @@ -150,30 +150,30 @@ class Zend_CodeGenerator_Php_Property extends Zend_CodeGenerator_Php_Member_Abst { $name = $this->getName(); $defaultValue = $this->getDefaultValue(); - + $output = ''; - + if (($docblock = $this->getDocblock()) !== null) { $docblock->setIndentation(' '); $output .= $docblock->generate(); } - + if ($this->isConst()) { if ($defaultValue != null && !$defaultValue->isValidConstantType()) { require_once 'Zend/CodeGenerator/Php/Exception.php'; throw new Zend_CodeGenerator_Php_Exception('The property ' . $this->_name . ' is said to be ' . 'constant but does not have a valid constant value.'); } - $output .= $this->_indentation . 'const ' . $name . ' = ' + $output .= $this->_indentation . 'const ' . $name . ' = ' . (($defaultValue !== null) ? $defaultValue->generate() : 'null;'); } else { $output .= $this->_indentation - . $this->getVisibility() - . (($this->isStatic()) ? ' static' : '') + . $this->getVisibility() + . (($this->isStatic()) ? ' static' : '') . ' $' . $name . ' = ' . (($defaultValue !== null) ? $defaultValue->generate() : 'null;'); } - return $output; + return $output; } - + } diff --git a/libs/Zend/CodeGenerator/Php/Property/DefaultValue.php b/libs/Zend/CodeGenerator/Php/Property/DefaultValue.php index ac4752a..3e768ac 100644 --- a/libs/Zend/CodeGenerator/Php/Property/DefaultValue.php +++ b/libs/Zend/CodeGenerator/Php/Property/DefaultValue.php @@ -17,7 +17,7 @@ * @subpackage PHP * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DefaultValue.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: DefaultValue.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -50,22 +50,22 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph const TYPE_NULL = 'null'; const TYPE_OTHER = 'other'; /**#@-*/ - + /** * @var array of reflected constants */ protected static $_constants = array(); - + /** * @var mixed */ protected $_value = null; - + /** * @var string */ protected $_type = self::TYPE_AUTO; - + /** * @var int */ @@ -78,11 +78,13 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph */ protected function _init() { - $reflect = new ReflectionClass(get_class($this)); - self::$_constants = $reflect->getConstants(); - unset($reflect); + if(count(self::$_constants) == 0) { + $reflect = new ReflectionClass(get_class($this)); + self::$_constants = $reflect->getConstants(); + unset($reflect); + } } - + /** * isValidConstantType() * @@ -93,7 +95,7 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph if ($this->_type == self::TYPE_AUTO) { $type = $this->_getAutoDeterminedType($this->_value); } - + // valid types for constants $scalarTypes = array( self::TYPE_BOOLEAN, @@ -107,10 +109,10 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph self::TYPE_CONSTANT, self::TYPE_NULL ); - + return in_array($type, $scalarTypes); } - + /** * setValue() * @@ -122,7 +124,7 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph $this->_value = $value; return $this; } - + /** * getValue() * @@ -132,7 +134,7 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph { return $this->_value; } - + /** * setType() * @@ -144,7 +146,7 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph $this->_type = $type; return $this; } - + /** * getType() * @@ -154,7 +156,7 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph { return $this->_type; } - + /** * setArrayDepth() * @@ -166,7 +168,7 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph $this->_arrayDepth = $arrayDepth; return $this; } - + /** * getArrayDepth() * @@ -176,7 +178,7 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph { return $this->_arrayDepth; } - + /** * _getValidatedType() * @@ -188,10 +190,10 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph if (($constName = array_search($type, self::$_constants)) !== false) { return $type; } - + return self::TYPE_AUTO; } - + /** * _getAutoDeterminedType() * @@ -221,10 +223,8 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph default: return self::TYPE_OTHER; } - - return self::TYPE_OTHER; } - + /** * generate() * @@ -233,16 +233,16 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph public function generate() { $type = $this->_type; - + if ($type != self::TYPE_AUTO) { $type = $this->_getValidatedType($type); } - + $value = $this->_value; - + if ($type == self::TYPE_AUTO) { $type = $this->_getAutoDeterminedType($value); - + if ($type == self::TYPE_ARRAY) { $rii = new RecursiveIteratorIterator( $it = new RecursiveArrayIterator($value), @@ -257,21 +257,27 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph } $value = $rii->getSubIterator()->getArrayCopy(); } - + } - + $output = ''; - + switch ($type) { + case self::TYPE_BOOLEAN: + case self::TYPE_BOOL: + $output .= ( $value ? 'true' : 'false' ); + break; case self::TYPE_STRING: - $output .= "'" . $value . "'"; + $output .= "'" . addcslashes($value, "'") . "'"; + break; + case self::TYPE_NULL: + $output .= 'null'; break; case self::TYPE_NUMBER: case self::TYPE_INTEGER: case self::TYPE_INT: case self::TYPE_FLOAT: case self::TYPE_DOUBLE: - case self::TYPE_NULL: case self::TYPE_CONSTANT: $output .= $value; break; @@ -292,9 +298,9 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph $outputParts[] = $partV; $noKeyIndex++; } else { - $outputParts[] = (is_int($n) ? $n : "'" . $n . "'") . ' => ' . $partV; + $outputParts[] = (is_int($n) ? $n : "'" . addcslashes($n, "'") . "'") . ' => ' . $partV; } - + } $output .= implode(',' . PHP_EOL . str_repeat($this->_indentation, $this->_arrayDepth+1), $outputParts); if ($curArrayMultiblock == true) { @@ -304,11 +310,14 @@ class Zend_CodeGenerator_Php_Property_DefaultValue extends Zend_CodeGenerator_Ph break; case self::TYPE_OTHER: default: - throw new Exception('I dont know this type'); + require_once "Zend/CodeGenerator/Php/Exception.php"; + throw new Zend_CodeGenerator_Php_Exception( + "Type '".get_class($value)."' is unknown or cannot be used as property default value." + ); } - + $output .= ';'; - + return $output; } } diff --git a/libs/Zend/Config.php b/libs/Zend/Config.php index 0652e99..e94ebce 100644 --- a/libs/Zend/Config.php +++ b/libs/Zend/Config.php @@ -16,7 +16,7 @@ * @package Zend_Config * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Config.php 16201 2009-06-21 18:51:15Z thomas $ + * @version $Id: Config.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -83,7 +83,7 @@ class Zend_Config implements Countable, Iterator /** * Load file error string. - * + * * Is null if there was no error while file loading * * @var string @@ -169,11 +169,11 @@ class Zend_Config implements Countable, Iterator throw new Zend_Config_Exception('Zend_Config is read only'); } } - + /** * Deep clone of this instance to ensure that nested Zend_Configs * are also cloned. - * + * * @return void */ public function __clone() @@ -374,7 +374,7 @@ class Zend_Config implements Countable, Iterator } } } - + /** * Returns if this Zend_Config object is read only or not. * @@ -384,7 +384,7 @@ class Zend_Config implements Countable, Iterator { return !$this->_allowModifications; } - + /** * Get the current extends * @@ -394,7 +394,7 @@ class Zend_Config implements Countable, Iterator { return $this->_extends; } - + /** * Set an extend for Zend_Config_Writer * @@ -410,7 +410,7 @@ class Zend_Config implements Countable, Iterator $this->_extends[$extendingSection] = $extendedSection; } } - + /** * Throws an exception if $extendingSection may not extend $extendedSection, * and tracks the section extension if it is valid. @@ -445,7 +445,7 @@ class Zend_Config implements Countable, Iterator * @param integer $errline */ protected function _loadFileErrorHandler($errno, $errstr, $errfile, $errline) - { + { if ($this->_loadFileErrorStr === null) { $this->_loadFileErrorStr = $errstr; } else { diff --git a/libs/Zend/Config/Ini.php b/libs/Zend/Config/Ini.php index efb6862..17ae3b6 100644 --- a/libs/Zend/Config/Ini.php +++ b/libs/Zend/Config/Ini.php @@ -16,7 +16,7 @@ * @package Zend_Config * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Ini.php 16201 2009-06-21 18:51:15Z thomas $ + * @version $Id: Ini.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -54,7 +54,7 @@ class Zend_Config_Ini extends Zend_Config * @var boolean */ protected $_skipExtends = false; - + /** * Loads the section $section from the config file $filename for * access facilitated by nested object properties. @@ -153,7 +153,7 @@ class Zend_Config_Ini extends Zend_Config } parent::__construct($dataArray, $allowModifications); - } + } $this->_loadedSection = $section; } @@ -210,7 +210,7 @@ class Zend_Config_Ini extends Zend_Config return $iniArray; } - + /** * Process each element in the section and handle the ";extends" inheritance * key. Passes control to _processKey() to handle the nest separator @@ -230,7 +230,7 @@ class Zend_Config_Ini extends Zend_Config if (strtolower($key) == ';extends') { if (isset($iniArray[$value])) { $this->_assertValidExtend($section, $value); - + if (!$this->_skipExtends) { $config = $this->_processSection($iniArray, $value, $config); } diff --git a/libs/Zend/Config/Writer.php b/libs/Zend/Config/Writer.php index 56bb66b..17d1078 100644 --- a/libs/Zend/Config/Writer.php +++ b/libs/Zend/Config/Writer.php @@ -16,7 +16,7 @@ * @package Zend_Config * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Writer.php 16201 2009-06-21 18:51:15Z thomas $ + * @version $Id: Writer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -29,13 +29,13 @@ abstract class Zend_Config_Writer { /** * Option keys to skip when calling setOptions() - * + * * @var array */ protected $_skipOptions = array( 'options' ); - + /** * Config object to write * @@ -45,8 +45,8 @@ abstract class Zend_Config_Writer /** * Create a new adapter - * - * $options can only be passed as array or be omitted + * + * $options can only be passed as array or be omitted * * @param null|array $options */ @@ -56,7 +56,7 @@ abstract class Zend_Config_Writer $this->setOptions($options); } } - + /** * Set options via a Zend_Config instance * @@ -66,10 +66,10 @@ abstract class Zend_Config_Writer public function setConfig(Zend_Config $config) { $this->_config = $config; - + return $this; } - + /** * Set options via an array * @@ -88,10 +88,10 @@ abstract class Zend_Config_Writer $this->$method($value); } } - + return $this; } - + /** * Write a Zend_Config object to it's target * diff --git a/libs/Zend/Config/Writer/Array.php b/libs/Zend/Config/Writer/Array.php index dd880b0..dc19500 100644 --- a/libs/Zend/Config/Writer/Array.php +++ b/libs/Zend/Config/Writer/Array.php @@ -16,7 +16,7 @@ * @package Zend_Config * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Array.php 16201 2009-06-21 18:51:15Z thomas $ + * @version $Id: Array.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,14 +38,14 @@ class Zend_Config_Writer_Array extends Zend_Config_Writer * @var string */ protected $_filename = null; - + /** * Wether to exclusively lock the file or not * * @var boolean */ protected $_exclusiveLock = false; - + /** * Set the target filename * @@ -55,10 +55,10 @@ class Zend_Config_Writer_Array extends Zend_Config_Writer public function setFilename($filename) { $this->_filename = $filename; - + return $this; } - + /** * Set wether to exclusively lock the file or not * @@ -68,10 +68,10 @@ class Zend_Config_Writer_Array extends Zend_Config_Writer public function setExclusiveLock($exclusiveLock) { $this->_exclusiveLock = $exclusiveLock; - + return $this; } - + /** * Defined by Zend_Config_Writer * @@ -87,43 +87,43 @@ class Zend_Config_Writer_Array extends Zend_Config_Writer if ($filename !== null) { $this->setFilename($filename); } - + if ($config !== null) { $this->setConfig($config); } - + if ($exclusiveLock !== null) { $this->setExclusiveLock($exclusiveLock); } - + if ($this->_filename === null) { require_once 'Zend/Config/Exception.php'; throw new Zend_Config_Exception('No filename was set'); } - + if ($this->_config === null) { require_once 'Zend/Config/Exception.php'; throw new Zend_Config_Exception('No config was set'); } - + $data = $this->_config->toArray(); $sectionName = $this->_config->getSectionName(); - + if (is_string($sectionName)) { $data = array($sectionName => $data); } - + $arrayString = "_exclusiveLock) { $flags |= LOCK_EX; } - + $result = @file_put_contents($this->_filename, $arrayString, $flags); - + if ($result === false) { require_once 'Zend/Config/Exception.php'; throw new Zend_Config_Exception('Could not write to file "' . $this->_filename . '"'); diff --git a/libs/Zend/Config/Writer/Ini.php b/libs/Zend/Config/Writer/Ini.php index ea65ca8..888f99f 100644 --- a/libs/Zend/Config/Writer/Ini.php +++ b/libs/Zend/Config/Writer/Ini.php @@ -16,7 +16,7 @@ * @package Zend_Config * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Ini.php 16201 2009-06-21 18:51:15Z thomas $ + * @version $Id: Ini.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,21 +38,21 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer * @var string */ protected $_filename = null; - + /** * Wether to exclusively lock the file or not * * @var boolean */ protected $_exclusiveLock = false; - + /** * String that separates nesting levels of configuration data identifiers * * @var string */ protected $_nestSeparator = '.'; - + /** * Set the target filename * @@ -62,10 +62,10 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer public function setFilename($filename) { $this->_filename = $filename; - + return $this; } - + /** * Set wether to exclusively lock the file or not * @@ -75,10 +75,10 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer public function setExclusiveLock($exclusiveLock) { $this->_exclusiveLock = $exclusiveLock; - + return $this; } - + /** * Set the nest separator * @@ -88,10 +88,10 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer public function setNestSeparator($separator) { $this->_nestSeparator = $separator; - + return $this; } - + /** * Defined by Zend_Config_Writer * @@ -107,29 +107,29 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer if ($filename !== null) { $this->setFilename($filename); } - + if ($config !== null) { $this->setConfig($config); } - + if ($exclusiveLock !== null) { $this->setExclusiveLock($exclusiveLock); } - + if ($this->_filename === null) { require_once 'Zend/Config/Exception.php'; throw new Zend_Config_Exception('No filename was set'); } - + if ($this->_config === null) { require_once 'Zend/Config/Exception.php'; throw new Zend_Config_Exception('No config was set'); } - + $iniString = ''; $extends = $this->_config->getExtends(); $sectionName = $this->_config->getSectionName(); - + if (is_string($sectionName)) { $iniString .= '[' . $sectionName . ']' . "\n" . $this->_addBranch($this->_config) @@ -145,20 +145,20 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer if (isset($extends[$sectionName])) { $sectionName .= ' : ' . $extends[$sectionName]; } - + $iniString .= '[' . $sectionName . ']' . "\n" . $this->_addBranch($data) . "\n"; } } } - + $flags = 0; - + if ($this->_exclusiveLock) { $flags |= LOCK_EX; } - + $result = @file_put_contents($this->_filename, $iniString, $flags); if ($result === false) { @@ -166,7 +166,7 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer throw new Zend_Config_Exception('Could not write to file "' . $this->_filename . '"'); } } - + /** * Add a branch to an INI string recursively * @@ -179,7 +179,7 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer foreach ($config as $key => $value) { $group = array_merge($parents, array($key)); - + if ($value instanceof Zend_Config) { $iniString .= $this->_addBranch($value, $group); } else { @@ -189,10 +189,10 @@ class Zend_Config_Writer_Ini extends Zend_Config_Writer . "\n"; } } - + return $iniString; } - + /** * Prepare a value for INI * diff --git a/libs/Zend/Config/Writer/Xml.php b/libs/Zend/Config/Writer/Xml.php index 764b461..6ef5263 100644 --- a/libs/Zend/Config/Writer/Xml.php +++ b/libs/Zend/Config/Writer/Xml.php @@ -16,7 +16,7 @@ * @package Zend_Config * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Xml.php 16924 2009-07-21 16:34:04Z dasprid $ + * @version $Id: Xml.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -43,14 +43,14 @@ class Zend_Config_Writer_Xml extends Zend_Config_Writer * @var string */ protected $_filename = null; - + /** * Wether to exclusively lock the file or not * * @var boolean */ protected $_exclusiveLock = false; - + /** * Set the target filename * @@ -60,10 +60,10 @@ class Zend_Config_Writer_Xml extends Zend_Config_Writer public function setFilename($filename) { $this->_filename = $filename; - + return $this; } - + /** * Set wether to exclusively lock the file or not * @@ -73,10 +73,10 @@ class Zend_Config_Writer_Xml extends Zend_Config_Writer public function setExclusiveLock($exclusiveLock) { $this->_exclusiveLock = $exclusiveLock; - + return $this; } - + /** * Defined by Zend_Config_Writer * @@ -92,29 +92,29 @@ class Zend_Config_Writer_Xml extends Zend_Config_Writer if ($filename !== null) { $this->setFilename($filename); } - + if ($config !== null) { $this->setConfig($config); } - + if ($exclusiveLock !== null) { $this->setExclusiveLock($exclusiveLock); } - + if ($this->_filename === null) { require_once 'Zend/Config/Exception.php'; throw new Zend_Config_Exception('No filename was set'); } - + if ($this->_config === null) { require_once 'Zend/Config/Exception.php'; throw new Zend_Config_Exception('No config was set'); } - + $xml = new SimpleXMLElement(''); $extends = $this->_config->getExtends(); $sectionName = $this->_config->getSectionName(); - + if (is_string($sectionName)) { $child = $xml->addChild($sectionName); @@ -125,35 +125,35 @@ class Zend_Config_Writer_Xml extends Zend_Config_Writer $xml->addChild($sectionName, (string) $data); } else { $child = $xml->addChild($sectionName); - + if (isset($extends[$sectionName])) { $child->addAttribute('zf:extends', $extends[$sectionName], Zend_Config_Xml::XML_NAMESPACE); } - + $this->_addBranch($data, $child, $xml); } } } - + $dom = dom_import_simplexml($xml)->ownerDocument; $dom->formatOutput = true; - + $xmlString = $dom->saveXML(); - + $flags = 0; - + if ($this->_exclusiveLock) { $flags |= LOCK_EX; } - + $result = @file_put_contents($this->_filename, $xmlString, $flags); - + if ($result === false) { require_once 'Zend/Config/Exception.php'; throw new Zend_Config_Exception('Could not write to file "' . $this->_filename . '"'); } } - + /** * Add a branch to an XML object recursively * @@ -165,35 +165,35 @@ class Zend_Config_Writer_Xml extends Zend_Config_Writer protected function _addBranch(Zend_Config $config, SimpleXMLElement $xml, SimpleXMLElement $parent) { $branchType = null; - + foreach ($config as $key => $value) { if ($branchType === null) { if (is_numeric($key)) { $branchType = 'numeric'; $branchName = $xml->getName(); $xml = $parent; - + unset($parent->{$branchName}); } else { $branchType = 'string'; } } else if ($branchType !== (is_numeric($key) ? 'numeric' : 'string')) { require_once 'Zend/Config/Exception.php'; - throw new Zend_Config_Exception('Mixing of string and numeric keys is not allowed'); + throw new Zend_Config_Exception('Mixing of string and numeric keys is not allowed'); } - + if ($branchType === 'numeric') { if ($value instanceof Zend_Config) { $child = $parent->addChild($branchName, (string) $value); - + $this->_addBranch($value, $child, $parent); } else { $parent->addChild($branchName, (string) $value); } - } else { + } else { if ($value instanceof Zend_Config) { $child = $xml->addChild($key); - + $this->_addBranch($value, $child, $xml); } else { $xml->addChild($key, (string) $value); diff --git a/libs/Zend/Controller/Action/Helper/ActionStack.php b/libs/Zend/Controller/Action/Helper/ActionStack.php index 1838c9c..5c768d7 100644 --- a/libs/Zend/Controller/Action/Helper/ActionStack.php +++ b/libs/Zend/Controller/Action/Helper/ActionStack.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action_Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ActionStack.php 16202 2009-06-21 18:53:49Z thomas $ + * @version $Id: ActionStack.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -46,7 +46,7 @@ class Zend_Controller_Action_Helper_ActionStack extends Zend_Controller_Action_H * Constructor * * Register action stack plugin - * + * * @return void */ public function __construct() @@ -65,9 +65,9 @@ class Zend_Controller_Action_Helper_ActionStack extends Zend_Controller_Action_H } /** - * Push onto the stack - * - * @param Zend_Controller_Request_Abstract $next + * Push onto the stack + * + * @param Zend_Controller_Request_Abstract $next * @return Zend_Controller_Action_Helper_ActionStack Provides a fluent interface */ public function pushStack(Zend_Controller_Request_Abstract $next) @@ -78,12 +78,12 @@ class Zend_Controller_Action_Helper_ActionStack extends Zend_Controller_Action_H /** * Push a new action onto the stack - * - * @param string $action - * @param string $controller - * @param string $module + * + * @param string $action + * @param string $controller + * @param string $module * @param array $params - * @throws Zend_Controller_Action_Exception + * @throws Zend_Controller_Action_Exception * @return Zend_Controller_Action_Helper_ActionStack */ public function actionToStack($action, $controller = null, $module = null, array $params = array()) @@ -107,7 +107,7 @@ class Zend_Controller_Action_Helper_ActionStack extends Zend_Controller_Action_H require_once 'Zend/Controller/Action/Exception.php'; throw new Zend_Controller_Action_Exception('Request object not set yet'); } - + $controller = (null === $controller) ? $request->getControllerName() : $controller; $module = (null === $module) ? $request->getModuleName() : $module; diff --git a/libs/Zend/Controller/Action/Helper/AjaxContext.php b/libs/Zend/Controller/Action/Helper/AjaxContext.php index 6628b0d..c5ee1fd 100644 --- a/libs/Zend/Controller/Action/Helper/AjaxContext.php +++ b/libs/Zend/Controller/Action/Helper/AjaxContext.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action_Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AjaxContext.php 16202 2009-06-21 18:53:49Z thomas $ + * @version $Id: AjaxContext.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -47,7 +47,7 @@ class Zend_Controller_Action_Helper_AjaxContext extends Zend_Controller_Action_H * Constructor * * Add HTML context - * + * * @return void */ public function __construct() @@ -60,8 +60,8 @@ class Zend_Controller_Action_Helper_AjaxContext extends Zend_Controller_Action_H * Initialize AJAX context switching * * Checks for XHR requests; if detected, attempts to perform context switch. - * - * @param string $format + * + * @param string $format * @return void */ public function initContext($format = null) diff --git a/libs/Zend/Controller/Action/Helper/AutoComplete/Abstract.php b/libs/Zend/Controller/Action/Helper/AutoComplete/Abstract.php index 7cd0d73..ed3be01 100644 --- a/libs/Zend/Controller/Action/Helper/AutoComplete/Abstract.php +++ b/libs/Zend/Controller/Action/Helper/AutoComplete/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action_Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16202 2009-06-21 18:53:49Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -46,7 +46,7 @@ abstract class Zend_Controller_Action_Helper_AutoComplete_Abstract extends Zend_ /** * Validate autocompletion data - * + * * @param mixed $data * @return boolean */ @@ -54,16 +54,16 @@ abstract class Zend_Controller_Action_Helper_AutoComplete_Abstract extends Zend_ /** * Prepare autocompletion data - * - * @param mixed $data - * @param boolean $keepLayouts + * + * @param mixed $data + * @param boolean $keepLayouts * @return mixed */ abstract public function prepareAutoCompletion($data, $keepLayouts = false); /** * Disable layouts and view renderer - * + * * @return Zend_Controller_Action_Helper_AutoComplete_Abstract Provides a fluent interface */ public function disableLayouts() @@ -83,9 +83,9 @@ abstract class Zend_Controller_Action_Helper_AutoComplete_Abstract extends Zend_ /** * Encode data to JSON - * - * @param mixed $data - * @param bool $keepLayouts + * + * @param mixed $data + * @param bool $keepLayouts * @throws Zend_Controller_Action_Exception * @return string */ @@ -105,11 +105,11 @@ abstract class Zend_Controller_Action_Helper_AutoComplete_Abstract extends Zend_ /** * Send autocompletion data * - * Calls prepareAutoCompletion, populates response body with this + * Calls prepareAutoCompletion, populates response body with this * information, and sends response. - * - * @param mixed $data - * @param bool $keepLayouts + * + * @param mixed $data + * @param bool $keepLayouts * @return string|void */ public function sendAutoCompletion($data, $keepLayouts = false) @@ -130,12 +130,12 @@ abstract class Zend_Controller_Action_Helper_AutoComplete_Abstract extends Zend_ /** * Strategy pattern: allow calling helper as broker method * - * Prepares autocompletion data and, if $sendNow is true, immediately sends + * Prepares autocompletion data and, if $sendNow is true, immediately sends * response. - * - * @param mixed $data - * @param bool $sendNow - * @param bool $keepLayouts + * + * @param mixed $data + * @param bool $sendNow + * @param bool $keepLayouts * @return string|void */ public function direct($data, $sendNow = true, $keepLayouts = false) diff --git a/libs/Zend/Controller/Action/Helper/AutoCompleteDojo.php b/libs/Zend/Controller/Action/Helper/AutoCompleteDojo.php index a485edc..3164be5 100644 --- a/libs/Zend/Controller/Action/Helper/AutoCompleteDojo.php +++ b/libs/Zend/Controller/Action/Helper/AutoCompleteDojo.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action_Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AutoCompleteDojo.php 16202 2009-06-21 18:53:49Z thomas $ + * @version $Id: AutoCompleteDojo.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -41,8 +41,8 @@ class Zend_Controller_Action_Helper_AutoCompleteDojo extends Zend_Controller_Act * Validate data for autocompletion * * Stub; unused - * - * @param mixed $data + * + * @param mixed $data * @return boolean */ public function validateData($data) @@ -52,9 +52,9 @@ class Zend_Controller_Action_Helper_AutoCompleteDojo extends Zend_Controller_Act /** * Prepare data for autocompletion - * - * @param mixed $data - * @param boolean $keepLayouts + * + * @param mixed $data + * @param boolean $keepLayouts * @return string */ public function prepareAutoCompletion($data, $keepLayouts = false) diff --git a/libs/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php b/libs/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php index 76f453c..ade2fbc 100644 --- a/libs/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php +++ b/libs/Zend/Controller/Action/Helper/AutoCompleteScriptaculous.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action_Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AutoCompleteScriptaculous.php 16202 2009-06-21 18:53:49Z thomas $ + * @version $Id: AutoCompleteScriptaculous.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,8 +39,8 @@ class Zend_Controller_Action_Helper_AutoCompleteScriptaculous extends Zend_Contr { /** * Validate data for autocompletion - * - * @param mixed $data + * + * @param mixed $data * @return bool */ public function validateData($data) @@ -54,9 +54,9 @@ class Zend_Controller_Action_Helper_AutoCompleteScriptaculous extends Zend_Contr /** * Prepare data for autocompletion - * - * @param mixed $data - * @param boolean $keepLayouts + * + * @param mixed $data + * @param boolean $keepLayouts * @throws Zend_Controller_Action_Exception * @return string */ diff --git a/libs/Zend/Controller/Action/Helper/ContextSwitch.php b/libs/Zend/Controller/Action/Helper/ContextSwitch.php index 407478c..f1873e0 100644 --- a/libs/Zend/Controller/Action/Helper/ContextSwitch.php +++ b/libs/Zend/Controller/Action/Helper/ContextSwitch.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action_Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ContextSwitch.php 16202 2009-06-21 18:53:49Z thomas $ + * @version $Id: ContextSwitch.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -157,9 +157,9 @@ class Zend_Controller_Action_Helper_ContextSwitch extends Zend_Controller_Action /** * Initialize at start of action controller * - * Reset the view script suffix to the original state, or store the + * Reset the view script suffix to the original state, or store the * original state. - * + * * @return void */ public function init() diff --git a/libs/Zend/Controller/Action/Helper/FlashMessenger.php b/libs/Zend/Controller/Action/Helper/FlashMessenger.php index efced8a..e280e68 100644 --- a/libs/Zend/Controller/Action/Helper/FlashMessenger.php +++ b/libs/Zend/Controller/Action/Helper/FlashMessenger.php @@ -38,7 +38,7 @@ require_once 'Zend/Controller/Action/Helper/Abstract.php'; * @subpackage Zend_Controller_Action_Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FlashMessenger.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: FlashMessenger.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Controller_Action_Helper_FlashMessenger extends Zend_Controller_Action_Helper_Abstract implements IteratorAggregate, Countable { @@ -221,10 +221,10 @@ class Zend_Controller_Action_Helper_FlashMessenger extends Zend_Controller_Actio unset(self::$_session->{$this->_namespace}); return true; } - + return false; } - + /** * getIterator() - complete the IteratorAggregate interface, for iterating * @@ -255,8 +255,8 @@ class Zend_Controller_Action_Helper_FlashMessenger extends Zend_Controller_Actio /** * Strategy pattern: proxy to addMessage() - * - * @param string $message + * + * @param string $message * @return void */ public function direct($message) diff --git a/libs/Zend/Controller/Action/Helper/Url.php b/libs/Zend/Controller/Action/Helper/Url.php index be7e7f6..5749abf 100644 --- a/libs/Zend/Controller/Action/Helper/Url.php +++ b/libs/Zend/Controller/Action/Helper/Url.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action_Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Url.php 16202 2009-06-21 18:53:49Z thomas $ + * @version $Id: Url.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -62,9 +62,9 @@ class Zend_Controller_Action_Helper_Url extends Zend_Controller_Action_Helper_Ab if ($module != $this->getFrontController()->getDispatcher()->getDefaultModule()) { $url = $module . '/' . $url; } - + if ('' !== ($baseUrl = $this->getFrontController()->getBaseUrl())) { - $url = $baseUrl . '/' . $url; + $url = $baseUrl . '/' . $url; } if (null !== $params) { @@ -98,7 +98,7 @@ class Zend_Controller_Action_Helper_Url extends Zend_Controller_Action_Helper_Ab $router = $this->getFrontController()->getRouter(); return $router->assemble($urlOptions, $name, $reset, $encode); } - + /** * Perform helper when called as $this->_helper->url() from an action controller * diff --git a/libs/Zend/Controller/Action/HelperBroker.php b/libs/Zend/Controller/Action/HelperBroker.php index b51bebc..c7939a9 100644 --- a/libs/Zend/Controller/Action/HelperBroker.php +++ b/libs/Zend/Controller/Action/HelperBroker.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HelperBroker.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HelperBroker.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -60,8 +60,8 @@ class Zend_Controller_Action_HelperBroker /** * Set PluginLoader for use with broker - * - * @param Zend_Loader_PluginLoader_Interface $loader + * + * @param Zend_Loader_PluginLoader_Interface $loader * @return void */ public static function setPluginLoader($loader) @@ -75,7 +75,7 @@ class Zend_Controller_Action_HelperBroker /** * Retrieve PluginLoader - * + * * @return Zend_Loader_PluginLoader */ public static function getPluginLoader() @@ -150,7 +150,7 @@ class Zend_Controller_Action_HelperBroker { $name = self::_normalizeHelperName($name); $stack = self::getStack(); - + if (!isset($stack->{$name})) { self::_loadHelper($name); } @@ -177,7 +177,7 @@ class Zend_Controller_Action_HelperBroker { $name = self::_normalizeHelperName($name); $stack = self::getStack(); - + if (!isset($stack->{$name})) { require_once 'Zend/Controller/Action/Exception.php'; throw new Zend_Controller_Action_Exception('Action helper "' . $name . '" has not been registered with the helper broker'); @@ -235,10 +235,10 @@ class Zend_Controller_Action_HelperBroker if (self::$_stack == null) { self::$_stack = new Zend_Controller_Action_HelperBroker_PriorityStack(); } - + return self::$_stack; } - + /** * Constructor * diff --git a/libs/Zend/Controller/Action/HelperBroker/PriorityStack.php b/libs/Zend/Controller/Action/HelperBroker/PriorityStack.php index b8f02b9..878d32c 100644 --- a/libs/Zend/Controller/Action/HelperBroker/PriorityStack.php +++ b/libs/Zend/Controller/Action/HelperBroker/PriorityStack.php @@ -17,7 +17,7 @@ * @subpackage Zend_Controller_Action * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PriorityStack.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: PriorityStack.php 17947 2009-09-02 03:58:21Z yoshida@zend.co.jp $ */ /** @@ -30,11 +30,10 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggregate, ArrayAccess, Countable { - /** @protected */ protected $_helpersByPriority = array(); protected $_helpersByNameRef = array(); protected $_nextDefaultPriority = 1; - + /** * Magic property overloading for returning helper by name * @@ -46,10 +45,10 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre if (!array_key_exists($helperName, $this->_helpersByNameRef)) { return false; } - + return $this->_helpersByNameRef[$helperName]; } - + /** * Magic property overloading for returning if helper is set by name * @@ -60,7 +59,7 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre { return array_key_exists($helperName, $this->_helpersByNameRef); } - + /** * Magic property overloading for unsetting if helper is exists by name * @@ -71,7 +70,7 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre { return $this->offsetUnset($helperName); } - + /** * push helper onto the stack * @@ -83,7 +82,7 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre $this->offsetSet($this->getNextFreeHigherPriority(), $helper); return $this; } - + /** * Return something iterable * @@ -93,11 +92,11 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre { return new ArrayObject($this->_helpersByPriority); } - + /** * offsetExists() * - * @param int|string $priorityOrHelperName + * @param int|string $priorityOrHelperName * @return Zend_Controller_Action_HelperBroker_PriorityStack */ public function offsetExists($priorityOrHelperName) @@ -108,7 +107,7 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre return array_key_exists($priorityOrHelperName, $this->_helpersByPriority); } } - + /** * offsetGet() * @@ -119,16 +118,16 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre { if (!$this->offsetExists($priorityOrHelperName)) { require_once 'Zend/Controller/Action/Exception.php'; - throw new Zend_Controller_Action_Exception('A helper with priority ' . $priority . ' does not exist.'); + throw new Zend_Controller_Action_Exception('A helper with priority ' . $priorityOrHelperName . ' does not exist.'); } - + if (is_string($priorityOrHelperName)) { return $this->_helpersByNameRef[$priorityOrHelperName]; } else { return $this->_helpersByPriority[$priorityOrHelperName]; } } - + /** * offsetSet() * @@ -144,29 +143,29 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre require_once 'Zend/Controller/Action/Exception.php'; throw new Zend_Controller_Action_Exception('$helper must extend Zend_Controller_Action_Helper_Abstract.'); } - + if (array_key_exists($helper->getName(), $this->_helpersByNameRef)) { // remove any object with the same name to retain BC compailitbility // @todo At ZF 2.0 time throw an exception here. $this->offsetUnset($helper->getName()); } - + if (array_key_exists($priority, $this->_helpersByPriority)) { $priority = $this->getNextFreeHigherPriority($priority); // ensures LIFO trigger_error("A helper with the same priority already exists, reassigning to $priority", E_USER_WARNING); } - + $this->_helpersByPriority[$priority] = $helper; $this->_helpersByNameRef[$helper->getName()] = $helper; if ($priority == ($nextFreeDefault = $this->getNextFreeHigherPriority($this->_nextDefaultPriority))) { $this->_nextDefaultPriority = $nextFreeDefault; } - + krsort($this->_helpersByPriority); // always make sure priority and LIFO are both enforced return $this; } - + /** * offsetUnset() * @@ -179,7 +178,7 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre require_once 'Zend/Controller/Action/Exception.php'; throw new Zend_Controller_Action_Exception('A helper with priority or name ' . $priorityOrHelperName . ' does not exist.'); } - + if (is_string($priorityOrHelperName)) { $helperName = $priorityOrHelperName; $helper = $this->_helpersByNameRef[$helperName]; @@ -188,12 +187,12 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre $priority = $priorityOrHelperName; $helperName = $this->_helpersByPriority[$priorityOrHelperName]->getName(); } - + unset($this->_helpersByNameRef[$helperName]); unset($this->_helpersByPriority[$priority]); return $this; } - + /** * return the count of helpers * @@ -203,7 +202,7 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre { return count($this->_helpersByPriority); } - + /** * Find the next free higher priority. If an index is given, it will * find the next free highest priority after it. @@ -216,16 +215,16 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre if ($indexPriority == null) { $indexPriority = $this->_nextDefaultPriority; } - + $priorities = array_keys($this->_helpersByPriority); while (in_array($indexPriority, $priorities)) { $indexPriority++; } - + return $indexPriority; } - + /** * Find the next free lower priority. If an index is given, it will * find the next free lower priority before it. @@ -238,16 +237,16 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre if ($indexPriority == null) { $indexPriority = $this->_nextDefaultPriority; } - + $priorities = array_keys($this->_helpersByPriority); while (in_array($indexPriority, $priorities)) { $indexPriority--; } - - return $indexPriority; + + return $indexPriority; } - + /** * return the highest priority * @@ -257,7 +256,7 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre { return max(array_keys($this->_helpersByPriority)); } - + /** * return the lowest priority * @@ -267,7 +266,7 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre { return min(array_keys($this->_helpersByPriority)); } - + /** * return the helpers referenced by name * @@ -277,5 +276,5 @@ class Zend_Controller_Action_HelperBroker_PriorityStack implements IteratorAggre { return $this->_helpersByNameRef; } - + } diff --git a/libs/Zend/Controller/Dispatcher/Interface.php b/libs/Zend/Controller/Dispatcher/Interface.php index 24812f5..c973fe8 100644 --- a/libs/Zend/Controller/Dispatcher/Interface.php +++ b/libs/Zend/Controller/Dispatcher/Interface.php @@ -17,7 +17,7 @@ * @subpackage Dispatcher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -185,21 +185,21 @@ interface Zend_Controller_Dispatcher_Interface /** * Retrieve the default module name - * + * * @return string */ public function getDefaultModule(); /** * Retrieve the default controller name - * + * * @return string */ public function getDefaultControllerName(); /** * Retrieve the default action - * + * * @return string */ public function getDefaultAction(); diff --git a/libs/Zend/Controller/Dispatcher/Standard.php b/libs/Zend/Controller/Dispatcher/Standard.php index a77c7ef..9f756db 100644 --- a/libs/Zend/Controller/Dispatcher/Standard.php +++ b/libs/Zend/Controller/Dispatcher/Standard.php @@ -17,7 +17,7 @@ * @subpackage Dispatcher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Standard.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Standard.php 19093 2009-11-20 14:59:00Z bate $ */ /** Zend_Loader */ @@ -260,7 +260,7 @@ class Zend_Controller_Dispatcher_Standard extends Zend_Controller_Dispatcher_Abs * arguments; throw exception if it's not an action controller */ $controller = new $className($request, $this->getResponse(), $this->getParams()); - if (!($controller instanceof Zend_Controller_Action_Interface) && + if (!($controller instanceof Zend_Controller_Action_Interface) && !($controller instanceof Zend_Controller_Action)) { require_once 'Zend/Controller/Dispatcher/Exception.php'; throw new Zend_Controller_Dispatcher_Exception( @@ -335,7 +335,9 @@ class Zend_Controller_Dispatcher_Standard extends Zend_Controller_Dispatcher_Abs $dispatchDir = $this->getDispatchDirectory(); $loadFile = $dispatchDir . DIRECTORY_SEPARATOR . $this->classToFilename($className); - if (!include_once $loadFile) { + if (file_exists($loadFile)) { + include_once $loadFile; + } else { require_once 'Zend/Controller/Dispatcher/Exception.php'; throw new Zend_Controller_Dispatcher_Exception('Cannot load controller class "' . $className . '" from file "' . $loadFile . "'"); } diff --git a/libs/Zend/Controller/Plugin/ActionStack.php b/libs/Zend/Controller/Plugin/ActionStack.php index 48c940c..9754a65 100644 --- a/libs/Zend/Controller/Plugin/ActionStack.php +++ b/libs/Zend/Controller/Plugin/ActionStack.php @@ -34,7 +34,7 @@ require_once 'Zend/Registry.php'; * @subpackage Plugins * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ActionStack.php 16202 2009-06-21 18:53:49Z thomas $ + * @version $Id: ActionStack.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract { @@ -52,12 +52,20 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract * @var array */ protected $_validKeys = array( - 'module', + 'module', 'controller', 'action', 'params' ); + /** + * Flag to determine whether request parameters are cleared between actions, or whether new parameters + * are added to existing request parameters. + * + * @var Bool + */ + protected $_clearRequestParams = false; + /** * Constructor * @@ -83,8 +91,8 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract /** * Set registry object - * - * @param Zend_Registry $registry + * + * @param Zend_Registry $registry * @return Zend_Controller_Plugin_ActionStack */ public function setRegistry(Zend_Registry $registry) @@ -95,7 +103,7 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract /** * Retrieve registry object - * + * * @return Zend_Registry */ public function getRegistry() @@ -125,9 +133,31 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract return $this; } + /** + * Set clearRequestParams flag + * + * @param bool $clearRequestParams + * @return Zend_Controller_Plugin_ActionStack + */ + public function setClearRequestParams($clearRequestParams) + { + $this->_clearRequestParams = (bool) $clearRequestParams; + return $this; + } + + /** + * Retrieve clearRequestParams flag + * + * @return bool + */ + public function getClearRequestParams() + { + return $this->_clearRequestParams; + } + /** * Retrieve action stack - * + * * @return array */ public function getStack() @@ -139,8 +169,8 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract /** * Save stack to registry - * - * @param array $stack + * + * @param array $stack * @return Zend_Controller_Plugin_ActionStack */ protected function _saveStack(array $stack) @@ -152,8 +182,8 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract /** * Push an item onto the stack - * - * @param Zend_Controller_Request_Abstract $next + * + * @param Zend_Controller_Request_Abstract $next * @return Zend_Controller_Plugin_ActionStack */ public function pushStack(Zend_Controller_Request_Abstract $next) @@ -165,7 +195,7 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract /** * Pop an item off the action stack - * + * * @return false|Zend_Controller_Request_Abstract */ public function popStack() @@ -209,7 +239,7 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract */ public function postDispatch(Zend_Controller_Request_Abstract $request) { - // Don't move on to next request if this is already an attempt to + // Don't move on to next request if this is already an attempt to // forward if (!$request->isDispatched()) { return; @@ -230,16 +260,21 @@ class Zend_Controller_Plugin_ActionStack extends Zend_Controller_Plugin_Abstract /** * Forward request with next action - * - * @param array $next + * + * @param array $next * @return void */ public function forward(Zend_Controller_Request_Abstract $next) { - $this->getRequest()->setModuleName($next->getModuleName()) - ->setControllerName($next->getControllerName()) - ->setActionName($next->getActionName()) - ->setParams($next->getParams()) - ->setDispatched(false); + $request = $this->getRequest(); + if ($this->getClearRequestParams()) { + $request->clearParams(); + } + + $request->setModuleName($next->getModuleName()) + ->setControllerName($next->getControllerName()) + ->setActionName($next->getActionName()) + ->setParams($next->getParams()) + ->setDispatched(false); } } diff --git a/libs/Zend/Controller/Request/Abstract.php b/libs/Zend/Controller/Request/Abstract.php index 8a8dae0..c80a333 100644 --- a/libs/Zend/Controller/Request/Abstract.php +++ b/libs/Zend/Controller/Request/Abstract.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Abstract.php 18175 2009-09-17 17:05:48Z matthew $ */ /** @@ -321,6 +321,17 @@ abstract class Zend_Controller_Request_Abstract return $this; } + /** + * Unset all user parameters + * + * @return Zend_Controller_Request_Abstract + */ + public function clearParams() + { + $this->_params = array(); + return $this; + } + /** * Set flag indicating whether or not request has been dispatched * diff --git a/libs/Zend/Controller/Request/Http.php b/libs/Zend/Controller/Request/Http.php index 73bcb30..ebd7036 100644 --- a/libs/Zend/Controller/Request/Http.php +++ b/libs/Zend/Controller/Request/Http.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Http.php 16933 2009-07-21 20:24:35Z matthew $ + * @version $Id: Http.php 19077 2009-11-20 00:29:56Z matthew $ */ /** Zend_Controller_Request_Abstract */ @@ -84,6 +84,12 @@ class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract */ protected $_params = array(); + /** + * Raw request body + * @var string|false + */ + protected $_rawBody; + /** * Alias keys for request parameters * @var array @@ -386,6 +392,14 @@ class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract if ($requestUri === null) { if (isset($_SERVER['HTTP_X_REWRITE_URL'])) { // check this first so IIS will catch $requestUri = $_SERVER['HTTP_X_REWRITE_URL']; + } elseif ( + // IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem) + isset($_SERVER['IIS_WasUrlRewritten']) + && $_SERVER['IIS_WasUrlRewritten'] == '1' + && isset($_SERVER['UNENCODED_URL']) + && $_SERVER['UNENCODED_URL'] != '' + ) { + $requestUri = $_SERVER['UNENCODED_URL']; } elseif (isset($_SERVER['REQUEST_URI'])) { $requestUri = $_SERVER['REQUEST_URI']; // Http proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path @@ -708,18 +722,25 @@ class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract * Retrieve an array of parameters * * Retrieves a merged array of parameters, with precedence of userland - * params (see {@link setParam()}), $_GET, $POST (i.e., values in the + * params (see {@link setParam()}), $_GET, $_POST (i.e., values in the * userland params will take precedence over all others). * * @return array */ public function getParams() { - $return = $this->_params; - if (isset($_GET) && is_array($_GET)) { + $return = $this->_params; + $paramSources = $this->getParamSources(); + if (in_array('_GET', $paramSources) + && isset($_GET) + && is_array($_GET) + ) { $return += $_GET; } - if (isset($_POST) && is_array($_POST)) { + if (in_array('_POST', $paramSources) + && isset($_POST) + && is_array($_POST) + ) { $return += $_POST; } return $return; @@ -919,13 +940,16 @@ class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract */ public function getRawBody() { - $body = file_get_contents('php://input'); + if (null === $this->_rawBody) { + $body = file_get_contents('php://input'); - if (strlen(trim($body)) > 0) { - return $body; + if (strlen(trim($body)) > 0) { + $this->_rawBody = $body; + } else { + $this->_rawBody = false; + } } - - return false; + return $this->_rawBody; } /** diff --git a/libs/Zend/Controller/Request/HttpTestCase.php b/libs/Zend/Controller/Request/HttpTestCase.php index f1ce387..3576540 100644 --- a/libs/Zend/Controller/Request/HttpTestCase.php +++ b/libs/Zend/Controller/Request/HttpTestCase.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HttpTestCase.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: HttpTestCase.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -45,7 +45,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http * Request method * @var string */ - protected $_method; + protected $_method = 'GET'; /** * Raw POST body @@ -68,7 +68,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Clear GET values - * + * * @return Zend_Controller_Request_HttpTestCase */ public function clearQuery() @@ -79,7 +79,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Clear POST values - * + * * @return Zend_Controller_Request_HttpTestCase */ public function clearPost() @@ -90,8 +90,8 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Set raw POST body - * - * @param string $content + * + * @param string $content * @return Zend_Controller_Request_HttpTestCase */ public function setRawBody($content) @@ -102,7 +102,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Get RAW POST body - * + * * @return string|null */ public function getRawBody() @@ -112,7 +112,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Clear raw POST body - * + * * @return Zend_Controller_Request_HttpTestCase */ public function clearRawBody() @@ -123,9 +123,9 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Set a cookie - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return Zend_Controller_Request_HttpTestCase */ public function setCookie($key, $value) @@ -136,8 +136,8 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Set multiple cookies at once - * - * @param array $cookies + * + * @param array $cookies * @return void */ public function setCookies(array $cookies) @@ -150,7 +150,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Clear all cookies - * + * * @return Zend_Controller_Request_HttpTestCase */ public function clearCookies() @@ -161,8 +161,8 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Set request method - * - * @param string $type + * + * @param string $type * @return Zend_Controller_Request_HttpTestCase */ public function setMethod($type) @@ -178,7 +178,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Get request method - * + * * @return string|null */ public function getMethod() @@ -188,9 +188,9 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Set a request header - * - * @param string $key - * @param string $value + * + * @param string $key + * @param string $value * @return Zend_Controller_Request_HttpTestCase */ public function setHeader($key, $value) @@ -202,8 +202,8 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Set request headers - * - * @param array $headers + * + * @param array $headers * @return Zend_Controller_Request_HttpTestCase */ public function setHeaders(array $headers) @@ -216,9 +216,9 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Get request header - * - * @param string $header - * @param mixed $default + * + * @param string $header + * @param mixed $default * @return string|null */ public function getHeader($header, $default = null) @@ -232,7 +232,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Get all request headers - * + * * @return array */ public function getHeaders() @@ -242,7 +242,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Clear request headers - * + * * @return Zend_Controller_Request_HttpTestCase */ public function clearHeaders() @@ -253,7 +253,7 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Get REQUEST_URI - * + * * @return null|string */ public function getRequestUri() @@ -263,8 +263,8 @@ class Zend_Controller_Request_HttpTestCase extends Zend_Controller_Request_Http /** * Normalize a header name for setting and retrieval - * - * @param string $name + * + * @param string $name * @return string */ protected function _normalizeHeaderName($name) diff --git a/libs/Zend/Controller/Request/Simple.php b/libs/Zend/Controller/Request/Simple.php index 42cfcb1..0115c75 100644 --- a/libs/Zend/Controller/Request/Simple.php +++ b/libs/Zend/Controller/Request/Simple.php @@ -17,7 +17,7 @@ * @subpackage Request * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Simple.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Simple.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Controller_Request_Abstract */ @@ -32,24 +32,24 @@ require_once 'Zend/Controller/Request/Abstract.php'; */ class Zend_Controller_Request_Simple extends Zend_Controller_Request_Abstract { - + public function __construct($action = null, $controller = null, $module = null, array $params = array()) { if ($action) { $this->setActionName($action); } - + if ($controller) { $this->setControllerName($controller); } - + if ($module) { $this->setModuleName($module); } - + if ($params) { $this->setParams($params); } } - + } diff --git a/libs/Zend/Controller/Response/Abstract.php b/libs/Zend/Controller/Response/Abstract.php index d22f73e..2cb264e 100644 --- a/libs/Zend/Controller/Response/Abstract.php +++ b/libs/Zend/Controller/Response/Abstract.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 17708 2009-08-21 13:43:39Z matthew $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -87,8 +87,8 @@ abstract class Zend_Controller_Response_Abstract * Normalize a header name * * Normalizes a header name to X-Capitalized-Names - * - * @param string $name + * + * @param string $name * @return string */ protected function _normalizeHeader($name) diff --git a/libs/Zend/Controller/Response/HttpTestCase.php b/libs/Zend/Controller/Response/HttpTestCase.php index dc67bd2..f66ad95 100644 --- a/libs/Zend/Controller/Response/HttpTestCase.php +++ b/libs/Zend/Controller/Response/HttpTestCase.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HttpTestCase.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: HttpTestCase.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -29,13 +29,13 @@ require_once 'Zend/Controller/Response/Http.php'; * * @uses Zend_Controller_Response_Http * @package Zend_Controller - * @subpackage Request + * @subpackage Response */ class Zend_Controller_Response_HttpTestCase extends Zend_Controller_Response_Http { /** * "send" headers by returning array of all headers that would be sent - * + * * @return array */ public function sendHeaders() @@ -60,8 +60,8 @@ class Zend_Controller_Response_HttpTestCase extends Zend_Controller_Response_Htt /** * Can we send headers? - * - * @param bool $throw + * + * @param bool $throw * @return void */ public function canSendHeaders($throw = false) @@ -71,7 +71,7 @@ class Zend_Controller_Response_HttpTestCase extends Zend_Controller_Response_Htt /** * Return the concatenated body segments - * + * * @return string */ public function outputBody() @@ -85,8 +85,8 @@ class Zend_Controller_Response_HttpTestCase extends Zend_Controller_Response_Htt /** * Get body and/or body segments - * - * @param bool|string $spec + * + * @param bool|string $spec * @return string|array|null */ public function getBody($spec = false) @@ -105,9 +105,9 @@ class Zend_Controller_Response_HttpTestCase extends Zend_Controller_Response_Htt /** * "send" Response * - * Concats all response headers, and then final body (separated by two + * Concats all response headers, and then final body (separated by two * newlines) - * + * * @return string */ public function sendResponse() diff --git a/libs/Zend/Controller/Router/Interface.php b/libs/Zend/Controller/Router/Interface.php index a89a886..6a6cad9 100644 --- a/libs/Zend/Controller/Router/Interface.php +++ b/libs/Zend/Controller/Router/Interface.php @@ -17,7 +17,7 @@ * @subpackage Router * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,19 +39,19 @@ interface Zend_Controller_Router_Interface public function route(Zend_Controller_Request_Abstract $dispatcher); /** - * Generates a URL path that can be used in URL creation, redirection, etc. - * - * May be passed user params to override ones from URI, Request or even defaults. + * Generates a URL path that can be used in URL creation, redirection, etc. + * + * May be passed user params to override ones from URI, Request or even defaults. * If passed parameter has a value of null, it's URL variable will be reset to - * default. - * + * default. + * * If null is passed as a route name assemble will use the current Route or 'default' * if current is not yet set. - * - * Reset is used to signal that all parameters should be reset to it's defaults. + * + * Reset is used to signal that all parameters should be reset to it's defaults. * Ignoring all URL specified values. User specified params still get precedence. - * - * Encode tells to url encode resulting path parts. + * + * Encode tells to url encode resulting path parts. * * @param array $userParams Options passed by a user used to override parameters * @param mixed $name The name of a Route to use @@ -61,7 +61,7 @@ interface Zend_Controller_Router_Interface * @return string Resulting URL path */ public function assemble($userParams, $name = null, $reset = false, $encode = true); - + /** * Retrieve Front Controller * @@ -76,7 +76,7 @@ interface Zend_Controller_Router_Interface * @return Zend_Controller_Router_Interface */ public function setFrontController(Zend_Controller_Front $controller); - + /** * Add or modify a parameter with which to instantiate any helper objects * @@ -120,5 +120,5 @@ interface Zend_Controller_Router_Interface * @return Zend_Controller_Router_Interface */ public function clearParams($name = null); - + } diff --git a/libs/Zend/Controller/Router/Rewrite.php b/libs/Zend/Controller/Router/Rewrite.php index cb26bf4..dd65e20 100644 --- a/libs/Zend/Controller/Router/Rewrite.php +++ b/libs/Zend/Controller/Router/Rewrite.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @subpackage Router * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Rewrite.php 16644 2009-07-11 14:12:17Z dasprid $ + * @version $Id: Rewrite.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -40,42 +40,42 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract /** * Whether or not to use default routes - * + * * @var boolean */ protected $_useDefaultRoutes = true; /** * Array of routes to match against - * + * * @var array */ protected $_routes = array(); /** * Currently matched route - * + * * @var Zend_Controller_Router_Route_Interface */ protected $_currentRoute = null; /** * Global parameters given to all routes - * + * * @var array */ protected $_globalParams = array(); - + /** * Separator to use with chain names - * + * * @var string */ protected $_chainNameSeparator = '-'; - + /** * Add default routes which are used to mimic basic router behaviour - * + * * @return Zend_Controller_Router_Rewrite */ public function addDefaultRoutes() @@ -89,27 +89,27 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract $this->_routes = array_merge(array('default' => $compat), $this->_routes); } - + return $this; } /** * Add route to the route chain - * + * * If route contains method setRequest(), it is initialized with a request object * * @param string $name Name of the route * @param Zend_Controller_Router_Route_Interface $route Instance of the route * @return Zend_Controller_Router_Rewrite */ - public function addRoute($name, Zend_Controller_Router_Route_Interface $route) + public function addRoute($name, Zend_Controller_Router_Route_Interface $route) { if (method_exists($route, 'setRequest')) { $route->setRequest($this->getFrontController()->getRequest()); } - + $this->_routes[$name] = $route; - + return $this; } @@ -123,7 +123,7 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract foreach ($routes as $name => $route) { $this->addRoute($name, $route); } - + return $this; } @@ -158,30 +158,30 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract require_once 'Zend/Controller/Router/Exception.php'; throw new Zend_Controller_Router_Exception("No route configuration in section '{$section}'"); } - + $config = $config->{$section}; } - + foreach ($config as $name => $info) { $route = $this->_getRouteFromConfig($info); - + if ($route instanceof Zend_Controller_Router_Route_Chain) { if (!isset($info->chain)) { require_once 'Zend/Controller/Router/Exception.php'; - throw new Zend_Controller_Router_Exception("No chain defined"); + throw new Zend_Controller_Router_Exception("No chain defined"); } - + if ($info->chain instanceof Zend_Config) { $childRouteNames = $info->chain; } else { $childRouteNames = explode(',', $info->chain); - } - + } + foreach ($childRouteNames as $childRouteName) { $childRoute = $this->getRoute(trim($childRouteName)); $route->chain($childRoute); } - + $this->addRoute($name, $route); } elseif (isset($info->chains) && $info->chains instanceof Zend_Config) { $this->_addChainRoutesFromConfig($name, $route, $info->chains); @@ -192,7 +192,7 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract return $this; } - + /** * Get a route frm a config instance * @@ -206,16 +206,16 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract require_once 'Zend/Loader.php'; Zend_Loader::loadClass($class); } - + $route = call_user_func(array($class, 'getInstance'), $info); - + if (isset($info->abstract) && $info->abstract && method_exists($route, 'isAbstract')) { $route->isAbstract(true); } return $route; } - + /** * Add chain routes from a config route * @@ -235,16 +235,16 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract } else { $childRoute = $this->_getRouteFromConfig($childRouteInfo); } - + if ($route instanceof Zend_Controller_Router_Route_Chain) { $chainRoute = clone $route; $chainRoute->chain($childRoute); } else { $chainRoute = $route->chain($childRoute); } - + $chainName = $name . $this->_chainNameSeparator . $childRouteName; - + if (isset($childRouteInfo->chains)) { $this->_addChainRoutesFromConfig($chainName, $chainRoute, $childRouteInfo->chains); } else { @@ -266,9 +266,9 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract require_once 'Zend/Controller/Router/Exception.php'; throw new Zend_Controller_Router_Exception("Route $name is not defined"); } - + unset($this->_routes[$name]); - + return $this; } @@ -281,7 +281,7 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract public function removeDefaultRoutes() { $this->_useDefaultRoutes = false; - + return $this; } @@ -309,7 +309,7 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract require_once 'Zend/Controller/Router/Exception.php'; throw new Zend_Controller_Router_Exception("Route $name is not defined"); } - + return $this->_routes[$name]; } @@ -377,14 +377,14 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract if (method_exists($route, 'isAbstract') && $route->isAbstract()) { continue; } - - // TODO: Should be an interface method. Hack for 1.0 BC + + // TODO: Should be an interface method. Hack for 1.0 BC if (!method_exists($route, 'getVersion') || $route->getVersion() == 1) { $match = $request->getPathInfo(); } else { $match = $request; } - + if ($params = $route->match($match)) { $this->_setRequestParams($request, $params); $this->_currentRoute = $name; @@ -417,14 +417,14 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract /** * Generates a URL path that can be used in URL creation, redirection, etc. - * + * * @param array $userParams Options passed by a user used to override parameters * @param mixed $name The name of a Route to use * @param bool $reset Whether to reset to the route defaults ignoring URL params * @param bool $encode Tells to encode URL parts on output * @throws Zend_Controller_Router_Exception * @return string Resulting absolute URL path - */ + */ public function assemble($userParams, $name = null, $reset = false, $encode = true) { if ($name == null) { @@ -434,9 +434,9 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract $name = 'default'; } } - + $params = array_merge($this->_globalParams, $userParams); - + $route = $this->getRoute($name); $url = $route->assemble($params, $reset, $encode); @@ -446,10 +446,10 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract return $url; } - + /** * Set a global parameter - * + * * @param string $name * @param mixed $value * @return Zend_Controller_Router_Rewrite @@ -457,25 +457,25 @@ class Zend_Controller_Router_Rewrite extends Zend_Controller_Router_Abstract public function setGlobalParam($name, $value) { $this->_globalParams[$name] = $value; - + return $this; } - + /** * Set the separator to use with chain names - * + * * @param string $separator The separator to use * @return Zend_Controller_Router_Rewrite */ public function setChainNameSeparator($separator) { - $this->_chainNameSeparator = $separator; - - return $this; + $this->_chainNameSeparator = $separator; + + return $this; } - + /** * Get the separator to use for chain names - * + * * @return string */ public function getChainNameSeparator() { diff --git a/libs/Zend/Controller/Router/Route.php b/libs/Zend/Controller/Router/Route.php index 13a8e23..1b8ffd5 100644 --- a/libs/Zend/Controller/Router/Route.php +++ b/libs/Zend/Controller/Router/Route.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @subpackage Router * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Route.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Route.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -47,28 +47,28 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract * @var Zend_Translate */ protected $_translator; - + /** * Default locale * * @var mixed */ protected static $_defaultLocale; - + /** * Locale - * + * * @var mixed */ protected $_locale; - + /** * Wether this is a translated route or not * * @var boolean */ protected $_isTranslated = false; - + /** * Translatable variables * @@ -132,7 +132,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract public function getVersion() { return 1; } - + /** * Instantiates route based on passed Zend_Config structure * @@ -174,20 +174,20 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract $this->_translatable[] = $name; $this->_isTranslated = true; } - + $this->_parts[$pos] = (isset($reqs[$name]) ? $reqs[$name] : $this->_defaultRegex); $this->_variables[$pos] = $name; } else { if (substr($part, 0, 1) == $this->_urlVariable) { $part = substr($part, 1); } - + if (substr($part, 0, 1) === '@' && substr($part, 1, 1) !== '@') { $this->_isTranslated = true; } - + $this->_parts[$pos] = $part; - + if ($part !== '*') { $this->_staticCount++; } @@ -208,15 +208,15 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract if ($this->_isTranslated) { $translateMessages = $this->getTranslator()->getMessages(); } - + $pathStaticCount = 0; $values = array(); $matchedPath = ''; - + if (!$partial) { $path = trim($path, $this->_urlDelimiter); } - + if ($path !== '') { $path = explode($this->_urlDelimiter, $path); @@ -229,9 +229,9 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract return false; } } - + $matchedPath .= $pathPart . $this->_urlDelimiter; - + // If it's a wildcard, get the rest of URL as wildcard data and stop matching if ($this->_parts[$pos] == '*') { $count = count($path); @@ -253,12 +253,12 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract if (substr($part, 0, 1) === '@') { $part = substr($part, 1); } - + if (($originalPathPart = array_search($pathPart, $translateMessages)) !== false) { $pathPart = $originalPathPart; } } - + if (substr($part, 0, 2) === '@@') { $part = substr($part, 1); } @@ -278,7 +278,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract $values[$name] = $pathPart; } else { $pathStaticCount++; - } + } } } @@ -295,11 +295,11 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract return false; } } - + $this->setMatchedPath(rtrim($matchedPath, $this->_urlDelimiter)); $this->_values = $values; - + return $return; } @@ -315,7 +315,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract { if ($this->_isTranslated) { $translator = $this->getTranslator(); - + if (isset($data['@locale'])) { $locale = $data['@locale']; unset($data['@locale']); @@ -323,7 +323,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract $locale = $this->getLocale(); } } - + $url = array(); $flag = false; @@ -349,12 +349,12 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract require_once 'Zend/Controller/Router/Exception.php'; throw new Zend_Controller_Router_Exception($name . ' is not specified'); } - + if ($this->_isTranslated && in_array($name, $this->_translatable)) { $url[$key] = $translator->translate($value, $locale); } else { $url[$key] = $value; - } + } } elseif ($part != '*') { if ($this->_isTranslated && substr($part, 0, 1) === '@') { if (substr($part, 1, 1) !== '@') { @@ -366,7 +366,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract if (substr($part, 0, 2) === '@@') { $part = substr($part, 1); } - + $url[$key] = $part; } } else { @@ -385,15 +385,15 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract foreach (array_reverse($url, true) as $key => $value) { $defaultValue = null; - + if (isset($this->_variables[$key])) { $defaultValue = $this->getDefault($this->_variables[$key]); - + if ($this->_isTranslated && $defaultValue !== null && isset($this->_translatable[$this->_variables[$key]])) { $defaultValue = $translator->translate($defaultValue, $locale); } } - + if ($flag || $value !== $defaultValue || $partial) { if ($encode) $value = urlencode($value); $return = $this->_urlDelimiter . $value . $return; @@ -426,7 +426,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract public function getDefaults() { return $this->_defaults; } - + /** * Get all variables which are used by the route * @@ -439,7 +439,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract /** * Set a default translator - * + * * @param Zend_Translate $translator * @return void */ @@ -447,7 +447,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract { self::$_defaultTranslator = $translator; } - + /** * Get the default translator * @@ -457,10 +457,10 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract { return self::$_defaultTranslator; } - + /** * Set a translator - * + * * @param Zend_Translate $translator * @return void */ @@ -468,10 +468,10 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract { $this->_translator = $translator; } - + /** * Get the translator - * + * * @throws Zend_Controller_Router_Exception When no translator can be found * @return Zend_Translate */ @@ -487,19 +487,19 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract } catch (Zend_Exception $e) { $translator = null; } - - if ($translator instanceof Zend_Translate) { + + if ($translator instanceof Zend_Translate) { return $translator; } } - + require_once 'Zend/Controller/Router/Exception.php'; throw new Zend_Controller_Router_Exception('Could not find a translator'); } - + /** * Set a default locale - * + * * @param mixed $locale * @return void */ @@ -507,7 +507,7 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract { self::$_defaultLocale = $locale; } - + /** * Get the default locale * @@ -517,10 +517,10 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract { return self::$_defaultLocale; } - + /** * Set a locale - * + * * @param mixed $locale * @return void */ @@ -528,10 +528,10 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract { $this->_locale = $locale; } - + /** * Get the locale - * + * * @return mixed */ public function getLocale() @@ -546,12 +546,12 @@ class Zend_Controller_Router_Route extends Zend_Controller_Router_Route_Abstract } catch (Zend_Exception $e) { $locale = null; } - - if ($locale !== null) { + + if ($locale !== null) { return $locale; } } - + return null; } } diff --git a/libs/Zend/Controller/Router/Route/Abstract.php b/libs/Zend/Controller/Router/Route/Abstract.php index 68347f5..adfb7dc 100644 --- a/libs/Zend/Controller/Router/Route/Abstract.php +++ b/libs/Zend/Controller/Router/Route/Abstract.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @subpackage Router * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -50,7 +50,7 @@ abstract class Zend_Controller_Router_Route_Abstract implements Zend_Controller_ * @var string */ protected $_matchedPath = null; - + /** * Get the version of the route * @@ -60,7 +60,7 @@ abstract class Zend_Controller_Router_Route_Abstract implements Zend_Controller_ { return 2; } - + /** * Set partially matched path * @@ -71,7 +71,7 @@ abstract class Zend_Controller_Router_Route_Abstract implements Zend_Controller_ { $this->_matchedPath = $path; } - + /** * Get partially matched path * @@ -81,10 +81,10 @@ abstract class Zend_Controller_Router_Route_Abstract implements Zend_Controller_ { return $this->_matchedPath; } - + /** * Check or set wether this is an abstract route or not - * + * * @param boolean $flag * @return boolean */ @@ -93,17 +93,17 @@ abstract class Zend_Controller_Router_Route_Abstract implements Zend_Controller_ if ($flag !== null) { $this->_isAbstract = $flag; } - + return $this->_isAbstract; } - + /** * Create a new chain - * + * * @param Zend_Controller_Router_Route_Abstract $route * @param string $separator * @return Zend_Controller_Router_Route_Chain - */ + */ public function chain(Zend_Controller_Router_Route_Abstract $route, $separator = '/') { require_once 'Zend/Controller/Router/Route/Chain.php'; diff --git a/libs/Zend/Controller/Router/Route/Chain.php b/libs/Zend/Controller/Router/Route/Chain.php index d024457..9432d96 100644 --- a/libs/Zend/Controller/Router/Route/Chain.php +++ b/libs/Zend/Controller/Router/Route/Chain.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @subpackage Router * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Chain.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Chain.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -46,10 +46,10 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); return new self($config->route, $defs); } - + /** * Add a route to this chain - * + * * @param Zend_Controller_Router_Route_Abstract $route * @param string $separator * @return Zend_Controller_Router_Route_Chain @@ -79,29 +79,29 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab foreach ($this->_routes as $key => $route) { if ($key > 0 && $matchedPath !== null) { $separator = substr($subPath, 0, strlen($this->_separators[$key])); - + if ($separator !== $this->_separators[$key]) { - return false; + return false; } - + $subPath = substr($subPath, strlen($separator)); } - - // TODO: Should be an interface method. Hack for 1.0 BC + + // TODO: Should be an interface method. Hack for 1.0 BC if (!method_exists($route, 'getVersion') || $route->getVersion() == 1) { $match = $subPath; } else { $request->setPathInfo($subPath); - $match = $request; + $match = $request; } - + $res = $route->match($match, true); if ($res === false) { return false; } - + $matchedPath = $route->getMatchedPath(); - + if ($matchedPath !== null) { $subPath = substr($subPath, strlen($matchedPath)); $separator = substr($subPath, 0, strlen($this->_separators[$key])); @@ -109,9 +109,9 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab $values = $res + $values; } - + $request->setPathInfo($path); - + if ($subPath !== '' && $subPath !== false) { return false; } @@ -129,17 +129,17 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab { $value = ''; $numRoutes = count($this->_routes); - + foreach ($this->_routes as $key => $route) { if ($key > 0) { $value .= $this->_separators[$key]; } - + $value .= $route->assemble($data, $reset, $encode, (($numRoutes - 1) > $key)); - + if (method_exists($route, 'getVariables')) { $variables = $route->getVariables(); - + foreach ($variables as $variable) { $data[$variable] = null; } @@ -151,7 +151,7 @@ class Zend_Controller_Router_Route_Chain extends Zend_Controller_Router_Route_Ab /** * Set the request object for this and the child routes - * + * * @param Zend_Controller_Request_Abstract|null $request * @return void */ diff --git a/libs/Zend/Controller/Router/Route/Module.php b/libs/Zend/Controller/Router/Route/Module.php index fa20b1d..27eaf86 100644 --- a/libs/Zend/Controller/Router/Route/Module.php +++ b/libs/Zend/Controller/Router/Route/Module.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @subpackage Router * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Module.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Module.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -80,11 +80,11 @@ class Zend_Controller_Router_Route_Module extends Zend_Controller_Router_Route_A public static function getInstance(Zend_Config $config) { $frontController = Zend_Controller_Front::getInstance(); - + $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array(); $dispatcher = $frontController->getDispatcher(); $request = $frontController->getRequest(); - + return new self($defs, $dispatcher, $request); } @@ -151,7 +151,7 @@ class Zend_Controller_Router_Route_Module extends Zend_Controller_Router_Route_A $values = array(); $params = array(); - + if (!$partial) { $path = trim($path, self::URI_DELIMITER); } else { @@ -182,7 +182,7 @@ class Zend_Controller_Router_Route_Module extends Zend_Controller_Router_Route_A } } } - + if ($partial) { $this->setMatchedPath($matchedPath); } @@ -233,9 +233,10 @@ class Zend_Controller_Router_Route_Module extends Zend_Controller_Router_Route_A unset($params[$this->_actionKey]); foreach ($params as $key => $value) { + $key = ($encode) ? urlencode($key) : $key; if (is_array($value)) { foreach ($value as $arrayValue) { - if ($encode) $arrayValue = urlencode($arrayValue); + $arrayValue = ($encode) ? urlencode($arrayValue) : $arrayValue; $url .= '/' . $key; $url .= '/' . $arrayValue; } diff --git a/libs/Zend/Controller/Router/Route/Regex.php b/libs/Zend/Controller/Router/Route/Regex.php index 774cf60..7788a13 100644 --- a/libs/Zend/Controller/Router/Route/Regex.php +++ b/libs/Zend/Controller/Router/Route/Regex.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @subpackage Router * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Regex.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Regex.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -63,7 +63,7 @@ class Zend_Controller_Router_Route_Regex extends Zend_Controller_Router_Route_Ab public function getVersion() { return 1; } - + /** * Matches a user submitted path with a previously defined route. * Assigns and returns an array of defaults on a successful match. @@ -79,13 +79,13 @@ class Zend_Controller_Router_Route_Regex extends Zend_Controller_Router_Route_Ab } else { $regex = '#^' . $this->_regex . '#i'; } - + $res = preg_match($regex, $path, $values); - + if ($res === 0) { return false; } - + if ($partial) { $this->setMatchedPath($values[0]); } @@ -185,7 +185,7 @@ class Zend_Controller_Router_Route_Regex extends Zend_Controller_Router_Route_Ab foreach ($mergedData as $key => &$value) { $value = urlencode($value); } - } + } ksort($mergedData); @@ -220,7 +220,7 @@ class Zend_Controller_Router_Route_Regex extends Zend_Controller_Router_Route_Ab public function getDefaults() { return $this->_defaults; } - + /** * Get all variables which are used by the route * @@ -229,7 +229,7 @@ class Zend_Controller_Router_Route_Regex extends Zend_Controller_Router_Route_Ab public function getVariables() { $variables = array(); - + foreach ($this->_map as $key => $value) { if (is_numeric($key)) { $variables[] = $value; @@ -237,7 +237,7 @@ class Zend_Controller_Router_Route_Regex extends Zend_Controller_Router_Route_Ab $variables[] = $key; } } - + return $variables; } diff --git a/libs/Zend/Controller/Router/Route/Static.php b/libs/Zend/Controller/Router/Route/Static.php index d7649d2..5351d1a 100644 --- a/libs/Zend/Controller/Router/Route/Static.php +++ b/libs/Zend/Controller/Router/Route/Static.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @subpackage Router * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Static.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Static.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -42,7 +42,7 @@ class Zend_Controller_Router_Route_Static extends Zend_Controller_Router_Route_A public function getVersion() { return 1; } - + /** * Instantiates route based on passed Zend_Config structure * @@ -85,7 +85,7 @@ class Zend_Controller_Router_Route_Static extends Zend_Controller_Router_Route_A return $this->_defaults; } } - + return false; } diff --git a/libs/Zend/Db.php b/libs/Zend/Db.php index 4d52030..b62bcdb 100644 --- a/libs/Zend/Db.php +++ b/libs/Zend/Db.php @@ -17,7 +17,7 @@ * @package Zend_Db * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Db.php 16203 2009-06-21 18:56:17Z thomas $ + * @version $Id: Db.php 18373 2009-09-22 19:16:25Z ralph $ */ @@ -171,7 +171,10 @@ class Zend_Db * * First argument may be a string containing the base of the adapter class * name, e.g. 'Mysqli' corresponds to class Zend_Db_Adapter_Mysqli. This - * is case-insensitive. + * name is currently case-insensitive, but is not ideal to rely on this behavior. + * If your class is named 'My_Company_Pdo_Mysql', where 'My_Company' is the namespace + * and 'Pdo_Mysql' is the adapter name, it is best to use the name exactly as it + * is defined in the class. This will ensure proper use of the factory API. * * First argument may alternatively be an object of type Zend_Config. * The adapter class base name is read from the 'adapter' property. @@ -241,8 +244,10 @@ class Zend_Db } unset($config['adapterNamespace']); } - $adapterName = strtolower($adapterNamespace . '_' . $adapter); - $adapterName = str_replace(' ', '_', ucwords(str_replace('_', ' ', $adapterName))); + + // Adapter no longer normalized- see http://framework.zend.com/issues/browse/ZF-5606 + $adapterName = $adapterNamespace . '_'; + $adapterName .= str_replace(' ', '_', ucwords(str_replace('_', ' ', strtolower($adapter)))); /* * Load the adapter class. This throws an exception diff --git a/libs/Zend/Db/Adapter/Abstract.php b/libs/Zend/Db/Adapter/Abstract.php index a359049..11cb54d 100644 --- a/libs/Zend/Db/Adapter/Abstract.php +++ b/libs/Zend/Db/Adapter/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 17702 2009-08-20 23:54:16Z yoshida@zend.co.jp $ + * @version $Id: Abstract.php 19115 2009-11-20 17:41:25Z matthew $ */ @@ -173,10 +173,10 @@ abstract class Zend_Db_Adapter_Abstract $config = $config->toArray(); } else { /** - * @see Zend_Db_Exception + * @see Zend_Db_Adapter_Exception */ - require_once 'Zend/Db/Exception.php'; - throw new Zend_Db_Exception('Adapter parameters must be in an array or a Zend_Config object'); + require_once 'Zend/Db/Adapter/Exception.php'; + throw new Zend_Db_Adapter_Exception('Adapter parameters must be in an array or a Zend_Config object'); } } @@ -902,7 +902,7 @@ abstract class Zend_Db_Adapter_Abstract return str_replace('?', $this->quote($value, $type), $text); } else { while ($count > 0) { - if (strpos($text, '?') != false) { + if (strpos($text, '?') !== false) { $text = substr_replace($text, $this->quote($value, $type), strpos($text, '?'), 1); } --$count; diff --git a/libs/Zend/Db/Adapter/Db2.php b/libs/Zend/Db/Adapter/Db2.php index 9d9e984..2b91d76 100644 --- a/libs/Zend/Db/Adapter/Db2.php +++ b/libs/Zend/Db/Adapter/Db2.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Db2.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Db2.php 18951 2009-11-12 16:26:19Z alexander $ * */ @@ -373,7 +373,7 @@ class Zend_Db_Adapter_Db2 extends Zend_Db_Adapter_Abstract if ($schemaName === null && $this->_config['schema'] != null) { $schemaName = $this->_config['schema']; } - + if (!$this->_isI5) { $sql = "SELECT DISTINCT c.tabschema, c.tabname, c.colname, c.colno, @@ -402,14 +402,14 @@ class Zend_Db_Adapter_Db2 extends Zend_Db_Adapter_Abstract $sql = "SELECT DISTINCT C.TABLE_SCHEMA, C.TABLE_NAME, C.COLUMN_NAME, C.ORDINAL_POSITION, C.DATA_TYPE, C.COLUMN_DEFAULT, C.NULLS ,C.LENGTH, C.SCALE, LEFT(C.IDENTITY,1), LEFT(tc.TYPE, 1) AS tabconsttype, k.COLSEQ - FROM QSYS2.SYSCOLUMNS C + FROM QSYS2.SYSCOLUMNS C LEFT JOIN (QSYS2.syskeycst k JOIN QSYS2.SYSCST tc ON (k.TABLE_SCHEMA = tc.TABLE_SCHEMA AND k.TABLE_NAME = tc.TABLE_NAME - AND LEFT(tc.type,1) = 'P')) + AND LEFT(tc.type,1) = 'P')) ON (C.TABLE_SCHEMA = k.TABLE_SCHEMA AND C.TABLE_NAME = k.TABLE_NAME - AND C.COLUMN_NAME = k.COLUMN_NAME) + AND C.COLUMN_NAME = k.COLUMN_NAME) WHERE " . $this->quoteInto('UPPER(C.TABLE_NAME) = UPPER(?)', $tableName); diff --git a/libs/Zend/Db/Adapter/Exception.php b/libs/Zend/Db/Adapter/Exception.php index 38bc231..51c0687 100644 --- a/libs/Zend/Db/Adapter/Exception.php +++ b/libs/Zend/Db/Adapter/Exception.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Exception.php 17860 2009-08-27 22:48:48Z beberlei $ */ /** @@ -45,6 +45,11 @@ class Zend_Db_Adapter_Exception extends Zend_Db_Exception parent::__construct($message); } + public function hasChainedException() + { + return ($this->_chainedException!==null); + } + public function getChainedException() { return $this->_chainedException; diff --git a/libs/Zend/Db/Adapter/Oracle.php b/libs/Zend/Db/Adapter/Oracle.php index 09c877d..ec25091 100644 --- a/libs/Zend/Db/Adapter/Oracle.php +++ b/libs/Zend/Db/Adapter/Oracle.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Oracle.php 16920 2009-07-21 13:32:28Z ralph $ + * @version $Id: Oracle.php 19048 2009-11-19 18:15:05Z mikaelkael $ */ /** @@ -81,7 +81,7 @@ class Zend_Db_Adapter_Oracle extends Zend_Db_Adapter_Abstract /** * @var integer */ - protected $_execute_mode = OCI_COMMIT_ON_SUCCESS; + protected $_execute_mode = null; /** * Default class name for a DB statement. @@ -119,8 +119,10 @@ class Zend_Db_Adapter_Oracle extends Zend_Db_Adapter_Abstract throw new Zend_Db_Adapter_Oracle_Exception('The OCI8 extension is required for this adapter but the extension is not loaded'); } + $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS); + $connectionFuncName = ($this->_config['persistent'] == true) ? 'oci_pconnect' : 'oci_connect'; - + $this->_connection = @$connectionFuncName( $this->_config['username'], $this->_config['password'], @@ -358,7 +360,7 @@ class Zend_Db_Adapter_Oracle extends Zend_Db_Adapter_Abstract TC.DATA_SCALE, TC.DATA_PRECISION, C.CONSTRAINT_TYPE, CC.POSITION FROM ALL_TAB_COLUMNS TC LEFT JOIN (ALL_CONS_COLUMNS CC JOIN ALL_CONSTRAINTS C - ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND C.CONSTRAINT_TYPE = 'P')) + ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND CC.OWNER = C.OWNER AND C.CONSTRAINT_TYPE = 'P')) ON TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME)"; $bind[':TBNAME'] = $tableName; diff --git a/libs/Zend/Db/Adapter/Pdo/Abstract.php b/libs/Zend/Db/Adapter/Pdo/Abstract.php index d7f6d8a..d6a6a7d 100644 --- a/libs/Zend/Db/Adapter/Pdo/Abstract.php +++ b/libs/Zend/Db/Adapter/Pdo/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16920 2009-07-21 13:32:28Z ralph $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -119,7 +119,7 @@ abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract if (isset($this->_config['persistent']) && ($this->_config['persistent'] == true)) { $this->_config['driver_options'][PDO::ATTR_PERSISTENT] = true; } - + try { $this->_connection = new PDO( $dsn, @@ -141,7 +141,7 @@ abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; - throw new Zend_Db_Adapter_Exception($e->getMessage()); + throw new Zend_Db_Adapter_Exception($e->getMessage(), $e); } } @@ -241,7 +241,7 @@ abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract * @see Zend_Db_Statement_Exception */ require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -258,10 +258,10 @@ abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract if ($sql instanceof Zend_Db_Select) { $sql = $sql->assemble(); } - + try { $affected = $this->getConnection()->exec($sql); - + if ($affected === false) { $errorInfo = $this->getConnection()->errorInfo(); /** @@ -270,14 +270,14 @@ abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract require_once 'Zend/Db/Adapter/Exception.php'; throw new Zend_Db_Adapter_Exception($errorInfo[2]); } - + return $affected; } catch (PDOException $e) { /** * @see Zend_Db_Adapter_Exception */ require_once 'Zend/Db/Adapter/Exception.php'; - throw new Zend_Db_Adapter_Exception($e->getMessage()); + throw new Zend_Db_Adapter_Exception($e->getMessage(), $e); } } diff --git a/libs/Zend/Db/Adapter/Pdo/Mssql.php b/libs/Zend/Db/Adapter/Pdo/Mssql.php index b61a4d6..78f27c7 100644 --- a/libs/Zend/Db/Adapter/Pdo/Mssql.php +++ b/libs/Zend/Db/Adapter/Pdo/Mssql.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Mssql.php 17792 2009-08-24 16:18:02Z ralph $ + * @version $Id: Mssql.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -254,7 +254,7 @@ class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract if ($schemaName != null) { $sql .= ", @table_owner = " . $this->quoteIdentifier($schemaName, true); } - + $stmt = $this->query($sql); $primaryKeysResult = $stmt->fetchAll(Zend_Db::FETCH_NUM); $primaryKeyColumn = array(); @@ -335,46 +335,46 @@ class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract 'SELECT $1TOP ' . ($count+$offset) . ' ', $sql ); - + if ($offset > 0) { - $orderby = stristr($sql, 'ORDER BY'); - - if ($orderby !== false) { - $orderParts = explode(',', substr($orderby, 8)); - $pregReplaceCount = null; - $orderbyInverseParts = array(); - foreach ($orderParts as $orderPart) { - $orderPart = rtrim($orderPart); - $inv = preg_replace('/\s+desc$/i', ' ASC', $orderPart, 1, $pregReplaceCount); - if ($pregReplaceCount) { - $orderbyInverseParts[] = $inv; - continue; - } - $inv = preg_replace('/\s+asc$/i', ' DESC', $orderPart, 1, $pregReplaceCount); - if ($pregReplaceCount) { - $orderbyInverseParts[] = $inv; - continue; - } else { - $orderbyInverseParts[] = $orderPart . ' DESC'; - } - } - - $orderbyInverse = 'ORDER BY ' . implode(', ', $orderbyInverseParts); - } - - - - - $sql = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $sql . ') AS inner_tbl'; - if ($orderby !== false) { - $sql .= ' ' . $orderbyInverse . ' '; - } - $sql .= ') AS outer_tbl'; - if ($orderby !== false) { - $sql .= ' ' . $orderby; - } + $orderby = stristr($sql, 'ORDER BY'); + + if ($orderby !== false) { + $orderParts = explode(',', substr($orderby, 8)); + $pregReplaceCount = null; + $orderbyInverseParts = array(); + foreach ($orderParts as $orderPart) { + $orderPart = rtrim($orderPart); + $inv = preg_replace('/\s+desc$/i', ' ASC', $orderPart, 1, $pregReplaceCount); + if ($pregReplaceCount) { + $orderbyInverseParts[] = $inv; + continue; + } + $inv = preg_replace('/\s+asc$/i', ' DESC', $orderPart, 1, $pregReplaceCount); + if ($pregReplaceCount) { + $orderbyInverseParts[] = $inv; + continue; + } else { + $orderbyInverseParts[] = $orderPart . ' DESC'; + } + } + + $orderbyInverse = 'ORDER BY ' . implode(', ', $orderbyInverseParts); + } + + + + + $sql = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $sql . ') AS inner_tbl'; + if ($orderby !== false) { + $sql .= ' ' . $orderbyInverse . ' '; + } + $sql .= ') AS outer_tbl'; + if ($orderby !== false) { + $sql .= ' ' . $orderby; + } } - + return $sql; } diff --git a/libs/Zend/Db/Adapter/Pdo/Oci.php b/libs/Zend/Db/Adapter/Pdo/Oci.php index 91ce3ac..35faeb1 100644 --- a/libs/Zend/Db/Adapter/Pdo/Oci.php +++ b/libs/Zend/Db/Adapter/Pdo/Oci.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Oci.php 16203 2009-06-21 18:56:17Z thomas $ + * @version $Id: Oci.php 19048 2009-11-19 18:15:05Z mikaelkael $ */ @@ -186,7 +186,7 @@ class Zend_Db_Adapter_Pdo_Oci extends Zend_Db_Adapter_Pdo_Abstract TC.DATA_SCALE, TC.DATA_PRECISION, C.CONSTRAINT_TYPE, CC.POSITION FROM ALL_TAB_COLUMNS TC LEFT JOIN (ALL_CONS_COLUMNS CC JOIN ALL_CONSTRAINTS C - ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND C.CONSTRAINT_TYPE = 'P')) + ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND CC.OWNER = C.OWNER AND C.CONSTRAINT_TYPE = 'P')) ON TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME)"; $bind[':TBNAME'] = $tableName; diff --git a/libs/Zend/Db/Adapter/Pdo/Pgsql.php b/libs/Zend/Db/Adapter/Pdo/Pgsql.php index 660a4c2..3f50227 100644 --- a/libs/Zend/Db/Adapter/Pdo/Pgsql.php +++ b/libs/Zend/Db/Adapter/Pdo/Pgsql.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Pgsql.php 16732 2009-07-15 12:44:36Z yoshida@zend.co.jp $ + * @version $Id: Pgsql.php 19051 2009-11-19 18:27:53Z mikaelkael $ */ @@ -99,19 +99,14 @@ class Zend_Db_Adapter_Pdo_Pgsql extends Zend_Db_Adapter_Pdo_Abstract */ public function listTables() { - // @todo use a better query with joins instead of subqueries - $sql = "SELECT c.relname AS table_name " - . "FROM pg_class c, pg_user u " - . "WHERE c.relowner = u.usesysid AND c.relkind = 'r' " - . "AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) " - . "AND c.relname !~ '^(pg_|sql_)' " - . "UNION " - . "SELECT c.relname AS table_name " - . "FROM pg_class c " - . "WHERE c.relkind = 'r' " - . "AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) " - . "AND NOT EXISTS (SELECT 1 FROM pg_user WHERE usesysid = c.relowner) " - . "AND c.relname !~ '^pg_'"; + $sql = "SELECT c.relname AS table_name " + . "FROM pg_catalog.pg_class c " + . "JOIN pg_catalog.pg_roles r ON r.oid = c.relowner " + . "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace " + . "WHERE n.nspname <> 'pg_catalog' " + . "AND n.nspname !~ '^pg_toast' " + . "AND pg_catalog.pg_table_is_visible(c.oid) " + . "AND c.relkind = 'r' "; return $this->fetchCol($sql); } @@ -194,6 +189,7 @@ class Zend_Db_Adapter_Pdo_Pgsql extends Zend_Db_Adapter_Pdo_Abstract $desc = array(); foreach ($result as $key => $row) { + $defaultValue = $row[$default_value]; if ($row[$type] == 'varchar') { if (preg_match('/character varying(?:\((\d+)\))?/', $row[$complete_type], $matches)) { if (isset($matches[1])) { @@ -202,6 +198,9 @@ class Zend_Db_Adapter_Pdo_Pgsql extends Zend_Db_Adapter_Pdo_Abstract $row[$length] = null; // unlimited } } + if (preg_match("/^'(.*?)'::character varying$/", $defaultValue, $matches)) { + $defaultValue = $matches[1]; + } } list($primary, $primaryPosition, $identity) = array(false, null, false); if ($row[$contype] == 'p') { @@ -215,7 +214,7 @@ class Zend_Db_Adapter_Pdo_Pgsql extends Zend_Db_Adapter_Pdo_Abstract 'COLUMN_NAME' => $this->foldCase($row[$colname]), 'COLUMN_POSITION' => $row[$attnum], 'DATA_TYPE' => $row[$type], - 'DEFAULT' => $row[$default_value], + 'DEFAULT' => $defaultValue, 'NULLABLE' => (bool) ($row[$notnull] != 't'), 'LENGTH' => $row[$length], 'SCALE' => null, // @todo diff --git a/libs/Zend/Db/Adapter/Pdo/Sqlite.php b/libs/Zend/Db/Adapter/Pdo/Sqlite.php index 4b7c818..30f75b4 100644 --- a/libs/Zend/Db/Adapter/Pdo/Sqlite.php +++ b/libs/Zend/Db/Adapter/Pdo/Sqlite.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Sqlite.php 16203 2009-06-21 18:56:17Z thomas $ + * @version $Id: Sqlite.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -197,12 +197,14 @@ class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract */ public function describeTable($tableName, $schemaName = null) { + $sql = 'PRAGMA '; + if ($schemaName) { - $sql = "PRAGMA $schemaName.table_info($tableName)"; - } else { - $sql = "PRAGMA table_info($tableName)"; + $sql .= $this->quoteIdentifier($schemaName) . '.'; } + $sql .= 'table_info('.$this->quoteIdentifier($tableName).')'; + $stmt = $this->query($sql); /** diff --git a/libs/Zend/Db/Profiler/Firebug.php b/libs/Zend/Db/Profiler/Firebug.php index 35a4ebd..85fcc2f 100644 --- a/libs/Zend/Db/Profiler/Firebug.php +++ b/libs/Zend/Db/Profiler/Firebug.php @@ -17,7 +17,7 @@ * @subpackage Profiler * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Firebug.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Firebug.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Db_Profiler */ @@ -31,7 +31,7 @@ require_once 'Zend/Wildfire/Plugin/FirePhp/TableMessage.php'; /** * Writes DB events as log messages to the Firebug Console via FirePHP. - * + * * @category Zend * @package Zend_Db * @subpackage Profiler @@ -45,25 +45,25 @@ class Zend_Db_Profiler_Firebug extends Zend_Db_Profiler * @var string */ protected $_label = null; - + /** * The label template for this profiler * @var string */ protected $_label_template = '%label% (%totalCount% @ %totalDuration% sec)'; - + /** * The message envelope holding the profiling summary * @var Zend_Wildfire_Plugin_FirePhp_TableMessage */ protected $_message = null; - + /** * The total time taken for all profiled queries. * @var float */ protected $_totalElapsedTime = 0; - + /** * Constructor * @@ -90,7 +90,7 @@ class Zend_Db_Profiler_Firebug extends Zend_Db_Profiler parent::setEnabled($enable); if ($this->getEnabled()) { - + if (!$this->_message) { $this->_message = new Zend_Wildfire_Plugin_FirePhp_TableMessage($this->_label); $this->_message->setBuffered(true); @@ -106,7 +106,7 @@ class Zend_Db_Profiler_Firebug extends Zend_Db_Profiler $this->_message->setDestroy(true); $this->_message = null; } - + } return $this; @@ -122,7 +122,7 @@ class Zend_Db_Profiler_Firebug extends Zend_Db_Profiler public function queryEnd($queryId) { parent::queryEnd($queryId); - + if (!$this->getEnabled()) { return; } @@ -130,19 +130,19 @@ class Zend_Db_Profiler_Firebug extends Zend_Db_Profiler $this->_message->setDestroy(false); $profile = $this->getQueryProfile($queryId); - + $this->_totalElapsedTime += $profile->getElapsedSecs(); - + $this->_message->addRow(array((string)round($profile->getElapsedSecs(),5), $profile->getQuery(), ($params=$profile->getQueryParams())?$params:null)); - + $this->updateMessageLabel(); } - + /** * Update the label of the message holding the profile info. - * + * * @return void */ protected function updateMessageLabel() diff --git a/libs/Zend/Db/Select.php b/libs/Zend/Db/Select.php index 83f0814..4a9e90f 100644 --- a/libs/Zend/Db/Select.php +++ b/libs/Zend/Db/Select.php @@ -17,7 +17,7 @@ * @subpackage Select * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Select.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Select.php 19155 2009-11-21 09:48:02Z mikaelkael $ */ @@ -173,7 +173,7 @@ class Zend_Db_Select */ public function getBind() { - return $this->_bind; + return $this->_bind; } /** @@ -184,9 +184,9 @@ class Zend_Db_Select */ public function bind($bind) { - $this->_bind = $bind; + $this->_bind = $bind; - return $this; + return $this; } /** @@ -227,7 +227,7 @@ class Zend_Db_Select */ public function from($name, $cols = '*', $schema = null) { - return $this->joinInner($name, null, $cols, $schema); + return $this->_join(self::FROM, $name, null, $cols, $schema); } /** @@ -741,7 +741,7 @@ class Zend_Db_Select */ protected function _join($type, $name, $cond, $cols, $schema = null) { - if (!in_array($type, self::$_joinTypes)) { + if (!in_array($type, self::$_joinTypes) && $type != self::FROM) { /** * @see Zend_Db_Select_Exception */ @@ -786,6 +786,7 @@ class Zend_Db_Select list($schema, $tableName) = explode('.', $tableName); } + $lastFromCorrelationName = null; if (!empty($correlationName)) { if (array_key_exists($correlationName, $this->_parts[self::FROM])) { /** @@ -795,16 +796,39 @@ class Zend_Db_Select throw new Zend_Db_Select_Exception("You cannot define a correlation name '$correlationName' more than once"); } + if ($type == self::FROM) { + // append this from after the last from joinType + $tmpFromParts = $this->_parts[self::FROM]; + $this->_parts[self::FROM] = array(); + // move all the froms onto the stack + while ($tmpFromParts) { + $currentCorrelationName = key($tmpFromParts); + if ($tmpFromParts[$currentCorrelationName]['joinType'] != self::FROM) { + break; + } + $lastFromCorrelationName = $currentCorrelationName; + $this->_parts[self::FROM][$currentCorrelationName] = array_shift($tmpFromParts); + } + } else { + $tmpFromParts = array(); + } $this->_parts[self::FROM][$correlationName] = array( 'joinType' => $type, 'schema' => $schema, 'tableName' => $tableName, 'joinCondition' => $cond - ); + ); + while ($tmpFromParts) { + $currentCorrelationName = key($tmpFromParts); + $this->_parts[self::FROM][$currentCorrelationName] = array_shift($tmpFromParts); + } } // add to the columns from this joined table - $this->_tableCols($correlationName, $cols); + if ($type == self::FROM && $lastFromCorrelationName == null) { + $lastFromCorrelationName = true; + } + $this->_tableCols($correlationName, $cols, $lastFromCorrelationName); return $this; } @@ -878,9 +902,10 @@ class Zend_Db_Select * @param string $tbl The table/join the columns come from. * @param array|string $cols The list of columns; preferably as * an array, but possibly as a string containing one column. + * @param bool|string True if it should be prepended, a correlation name if it should be inserted * @return void */ - protected function _tableCols($correlationName, $cols) + protected function _tableCols($correlationName, $cols, $afterCorrelationName = null) { if (!is_array($cols)) { $cols = array($cols); @@ -890,6 +915,8 @@ class Zend_Db_Select $correlationName = ''; } + $columnValues = array(); + foreach (array_filter($cols) as $alias => $col) { $currentCorrelationName = $correlationName; if (is_string($col)) { @@ -906,7 +933,38 @@ class Zend_Db_Select $col = $m[2]; } } - $this->_parts[self::COLUMNS][] = array($currentCorrelationName, $col, is_string($alias) ? $alias : null); + $columnValues[] = array($currentCorrelationName, $col, is_string($alias) ? $alias : null); + } + + if ($columnValues) { + + // should we attempt to prepend or insert these values? + if ($afterCorrelationName === true || is_string($afterCorrelationName)) { + $tmpColumns = $this->_parts[self::COLUMNS]; + $this->_parts[self::COLUMNS] = array(); + } else { + $tmpColumns = array(); + } + + // find the correlation name to insert after + if (is_string($afterCorrelationName)) { + while ($tmpColumns) { + $this->_parts[self::COLUMNS][] = $currentColumn = array_shift($tmpColumns); + if ($currentColumn[0] == $afterCorrelationName) { + break; + } + } + } + + // apply current values to current stack + foreach ($columnValues as $columnValue) { + array_push($this->_parts[self::COLUMNS], $columnValue); + } + + // finish ensuring that all previous values are applied (if they exist) + while ($tmpColumns) { + array_push($this->_parts[self::COLUMNS], array_shift($tmpColumns)); + } } } @@ -1045,9 +1103,11 @@ class Zend_Db_Select foreach ($this->_parts[self::FROM] as $correlationName => $table) { $tmp = ''; + $joinType = ($table['joinType'] == self::FROM) ? self::INNER_JOIN : $table['joinType']; + // Add join clause (if applicable) if (! empty($from)) { - $tmp .= ' ' . strtoupper($table['joinType']) . ' '; + $tmp .= ' ' . strtoupper($joinType) . ' '; } $tmp .= $this->_getQuotedSchema($table['schema']); @@ -1156,7 +1216,13 @@ class Zend_Db_Select $order = array(); foreach ($this->_parts[self::ORDER] as $term) { if (is_array($term)) { - $order[] = $this->_adapter->quoteIdentifier($term[0], true) . ' ' . $term[1]; + if(is_numeric($term[0]) && strval(intval($term[0])) == $term[0]) { + $order[] = (int)trim($term[0]) . ' ' . $term[1]; + } else { + $order[] = $this->_adapter->quoteIdentifier($term[0], true) . ' ' . $term[1]; + } + } else if (is_numeric($term) && strval(intval($term)) == $term) { + $order[] = (int)trim($term); } else { $order[] = $this->_adapter->quoteIdentifier($term, true); } @@ -1180,8 +1246,7 @@ class Zend_Db_Select if (!empty($this->_parts[self::LIMIT_OFFSET])) { $offset = (int) $this->_parts[self::LIMIT_OFFSET]; - // This should reduce to the max integer PHP can support - $count = intval(9223372036854775807); + $count = PHP_INT_MAX; } if (!empty($this->_parts[self::LIMIT_COUNT])) { diff --git a/libs/Zend/Db/Statement.php b/libs/Zend/Db/Statement.php index 09f94be..5504f34 100644 --- a/libs/Zend/Db/Statement.php +++ b/libs/Zend/Db/Statement.php @@ -17,7 +17,7 @@ * @subpackage Statement * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Statement.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Statement.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -42,6 +42,11 @@ require_once 'Zend/Db/Statement/Interface.php'; abstract class Zend_Db_Statement implements Zend_Db_Statement_Interface { + /** + * @var resource|object The driver level statement object/resource + */ + protected $_stmt = null; + /** * @var Zend_Db_Adapter_Abstract */ @@ -112,6 +117,17 @@ abstract class Zend_Db_Statement implements Zend_Db_Statement_Interface $this->_queryId = $this->_adapter->getProfiler()->queryStart($sql); } + /** + * Internal method called by abstract statment constructor to setup + * the driver level statement + * + * @return void + */ + protected function _prepare($sql) + { + return; + } + /** * @param string $sql * @return void @@ -456,4 +472,14 @@ abstract class Zend_Db_Statement implements Zend_Db_Statement_Interface { return $this->_adapter; } + + /** + * Gets the resource or object setup by the + * _parse + * @return unknown_type + */ + public function getDriverStatement() + { + return $this->_stmt; + } } diff --git a/libs/Zend/Db/Statement/Db2.php b/libs/Zend/Db/Statement/Db2.php index 3340d6b..68ec9ee 100644 --- a/libs/Zend/Db/Statement/Db2.php +++ b/libs/Zend/Db/Statement/Db2.php @@ -17,7 +17,7 @@ * @subpackage Statement * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Db2.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Db2.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,10 +35,6 @@ require_once 'Zend/Db/Statement.php'; */ class Zend_Db_Statement_Db2 extends Zend_Db_Statement { - /** - * Statement resource handle. - */ - protected $_stmt = null; /** * Column names. @@ -158,7 +154,7 @@ class Zend_Db_Statement_Db2 extends Zend_Db_Statement $error = db2_stmt_error(); if ($error === '') { - return false; + return false; } return $error; @@ -172,10 +168,10 @@ class Zend_Db_Statement_Db2 extends Zend_Db_Statement */ public function errorInfo() { - $error = $this->errorCode(); - if ($error === false){ - return false; - } + $error = $this->errorCode(); + if ($error === false){ + return false; + } /* * Return three-valued array like PDO. But DB2 does not distinguish diff --git a/libs/Zend/Db/Statement/Exception.php b/libs/Zend/Db/Statement/Exception.php index 6537ffb..61291f4 100644 --- a/libs/Zend/Db/Statement/Exception.php +++ b/libs/Zend/Db/Statement/Exception.php @@ -17,7 +17,7 @@ * @subpackage Statement * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,4 +36,38 @@ require_once 'Zend/Db/Exception.php'; */ class Zend_Db_Statement_Exception extends Zend_Db_Exception { + /** + * @var Exception + */ + protected $_chainedException = null; + + /** + * @param string $message + * @param string|int $code + * @param Exception $chainedException + */ + public function __construct($message = null, $code = null, Exception $chainedException=null) + { + $this->message = $message; + $this->code = $code; + $this->_chainedException = $chainedException; + } + + /** + * Check if this general exception has a specific database driver specific exception nested inside. + * + * @return bool + */ + public function hasChainedException() + { + return ($this->_chainedException!==null); + } + + /** + * @return Exception|null + */ + public function getChainedException() + { + return $this->_chainedException; + } } diff --git a/libs/Zend/Db/Statement/Mysqli.php b/libs/Zend/Db/Statement/Mysqli.php index 2ba7051..32754fb 100644 --- a/libs/Zend/Db/Statement/Mysqli.php +++ b/libs/Zend/Db/Statement/Mysqli.php @@ -17,7 +17,7 @@ * @subpackage Statement * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Mysqli.php 17693 2009-08-20 16:34:59Z jimbojsb $ + * @version $Id: Mysqli.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -26,7 +26,7 @@ */ require_once 'Zend/Db/Statement.php'; - + /** * Extends for Mysqli * @@ -39,13 +39,6 @@ require_once 'Zend/Db/Statement.php'; class Zend_Db_Statement_Mysqli extends Zend_Db_Statement { - /** - * The mysqli_stmt object. - * - * @var mysqli_stmt - */ - protected $_stmt; - /** * Column names. * @@ -282,12 +275,12 @@ class Zend_Db_Statement_Mysqli extends Zend_Db_Statement // fetch the next result $retval = $this->_stmt->fetch(); switch ($retval) { - case null: // end of data - case false: // error occurred - $this->_stmt->reset(); - return $retval; - default: - // fallthrough + case null: // end of data + case false: // error occurred + $this->_stmt->reset(); + return false; + default: + // fallthrough } // make sure we have a fetch mode diff --git a/libs/Zend/Db/Statement/Oracle.php b/libs/Zend/Db/Statement/Oracle.php index feef68b..0c8c18a 100644 --- a/libs/Zend/Db/Statement/Oracle.php +++ b/libs/Zend/Db/Statement/Oracle.php @@ -17,7 +17,7 @@ * @subpackage Statement * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Oracle.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Oracle.php 18636 2009-10-17 05:44:41Z ralph $ */ /** @@ -37,11 +37,6 @@ require_once 'Zend/Db/Statement.php'; class Zend_Db_Statement_Oracle extends Zend_Db_Statement { - /** - * The connection_stmt object. - */ - protected $_stmt; - /** * Column names. */ @@ -234,18 +229,11 @@ class Zend_Db_Statement_Oracle extends Zend_Db_Statement public function _execute(array $params = null) { $connection = $this->_adapter->getConnection(); + if (!$this->_stmt) { return false; } - if (! $this->_stmt) { - /** - * @see Zend_Db_Adapter_Oracle_Exception - */ - require_once 'Zend/Db/Statement/Oracle/Exception.php'; - throw new Zend_Db_Statement_Oracle_Exception(oci_error($connection)); - } - if ($params !== null) { if (!is_array($params)) { $params = array($params); diff --git a/libs/Zend/Db/Statement/Pdo.php b/libs/Zend/Db/Statement/Pdo.php index 8bd9f98..81942bf 100644 --- a/libs/Zend/Db/Statement/Pdo.php +++ b/libs/Zend/Db/Statement/Pdo.php @@ -17,7 +17,7 @@ * @subpackage Statement * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Pdo.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Pdo.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -40,13 +40,6 @@ require_once 'Zend/Db/Statement.php'; class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggregate { - /** - * The statement object. - * - * @var PDOStatement - */ - protected $_stmt; - /** * @var int */ @@ -65,7 +58,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega $this->_stmt = $this->_adapter->getConnection()->prepare($sql); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -89,7 +82,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega } } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -121,7 +114,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->bindParam($parameter, $variable, $type, $length, $options); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -139,6 +132,9 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega if (is_string($parameter) && $parameter[0] != ':') { $parameter = ":$parameter"; } + + $this->_bindParam[$parameter] = $value; + try { if ($type === null) { return $this->_stmt->bindValue($parameter, $value); @@ -147,7 +143,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega } } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -163,7 +159,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->closeCursor(); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -180,7 +176,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->columnCount(); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -197,7 +193,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->errorCode(); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -214,7 +210,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->errorInfo(); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -235,7 +231,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega } } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -257,7 +253,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->fetch($style, $cursor, $offset); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -295,7 +291,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega } } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -312,7 +308,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->fetchColumn($col); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -330,7 +326,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->fetchObject($class, $config); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -347,7 +343,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->getAttribute($key); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -364,7 +360,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->getColumnMeta($column); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -382,7 +378,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->nextRowset(); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -400,7 +396,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->rowCount(); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -418,7 +414,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->setAttribute($key, $val); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } @@ -436,7 +432,7 @@ class Zend_Db_Statement_Pdo extends Zend_Db_Statement implements IteratorAggrega return $this->_stmt->setFetchMode($mode); } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } diff --git a/libs/Zend/Db/Statement/Pdo/Ibm.php b/libs/Zend/Db/Statement/Pdo/Ibm.php index 6bcea4b..29ae3db 100644 --- a/libs/Zend/Db/Statement/Pdo/Ibm.php +++ b/libs/Zend/Db/Statement/Pdo/Ibm.php @@ -17,7 +17,7 @@ * @subpackage Statement * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Ibm.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Ibm.php 17860 2009-08-27 22:48:48Z beberlei $ */ /** @@ -87,7 +87,7 @@ class Zend_Db_Statement_Pdo_Ibm extends Zend_Db_Statement_Pdo } } catch (PDOException $e) { require_once 'Zend/Db/Statement/Exception.php'; - throw new Zend_Db_Statement_Exception($e->getMessage()); + throw new Zend_Db_Statement_Exception($e->getMessage(), $e->getCode(), $e); } } diff --git a/libs/Zend/Db/Statement/Sqlsrv.php b/libs/Zend/Db/Statement/Sqlsrv.php index 48431b0..45c243e 100644 --- a/libs/Zend/Db/Statement/Sqlsrv.php +++ b/libs/Zend/Db/Statement/Sqlsrv.php @@ -35,10 +35,6 @@ require_once 'Zend/Db/Statement.php'; */ class Zend_Db_Statement_Sqlsrv extends Zend_Db_Statement { - /** - * The connection_stmt object. - */ - protected $_stmt; /** * The connection_stmt object original string. diff --git a/libs/Zend/Db/Table.php b/libs/Zend/Db/Table.php index 20319fd..999657c 100644 --- a/libs/Zend/Db/Table.php +++ b/libs/Zend/Db/Table.php @@ -17,7 +17,7 @@ * @subpackage Table * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Table.php 16733 2009-07-15 13:16:50Z ralph $ + * @version $Id: Table.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -41,20 +41,20 @@ require_once 'Zend/Db/Table/Definition.php'; */ class Zend_Db_Table extends Zend_Db_Table_Abstract { - + /** * __construct() - For concrete implementation of Zend_Db_Table * * @param string|array $config string can reference a Zend_Registry key for a db adapter * OR it can refernece the name of a table - * @param unknown_type $definition + * @param unknown_type $definition */ public function __construct($config = array(), $definition = null) { if ($definition !== null && is_array($definition)) { $definition = new Zend_Db_Table_Definition($definition); } - + if (is_string($config)) { if (Zend_Registry::isRegistered($config)) { trigger_error(__CLASS__ . '::' . __METHOD__ . '(\'registryName\') is not valid usage of Zend_Db_Table, ' @@ -73,12 +73,12 @@ class Zend_Db_Table extends Zend_Db_Table_Abstract } } } - + parent::__construct($config); } - - - - + + + + } diff --git a/libs/Zend/Db/Table/Abstract.php b/libs/Zend/Db/Table/Abstract.php index ba4c3b3..2432d98 100644 --- a/libs/Zend/Db/Table/Abstract.php +++ b/libs/Zend/Db/Table/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Table * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -93,14 +93,14 @@ abstract class Zend_Db_Table_Abstract * @var unknown_type */ protected $_definition = null; - + /** * Optional definition config name used in concrete implementation * * @var string */ protected $_definitionConfigName = null; - + /** * Default cache for information provided by the adapter's describeTable() method. * @@ -326,7 +326,7 @@ abstract class Zend_Db_Table_Abstract return $this; } - + /** * setDefinition() * @@ -338,7 +338,7 @@ abstract class Zend_Db_Table_Abstract $this->_definition = $definition; return $this; } - + /** * getDefinition() * @@ -348,7 +348,7 @@ abstract class Zend_Db_Table_Abstract { return $this->_definition; } - + /** * setDefinitionConfigName() * @@ -360,7 +360,7 @@ abstract class Zend_Db_Table_Abstract $this->_definitionConfigName = $definitionConfigName; return $this; } - + /** * getDefinitionConfigName() * @@ -803,7 +803,16 @@ abstract class Zend_Db_Table_Abstract // If $this has a metadata cache if (null !== $this->_metadataCache) { // Define the cache identifier where the metadata are saved - $cacheId = md5("$this->_schema.$this->_name"); + + //get db configuration + $dbConfig = $this->_db->getConfig(); + + // Define the cache identifier where the metadata are saved + $cacheId = md5( // port:host/dbname:schema.table (based on availabilty) + (isset($dbConfig['options']['port']) ? ':'.$dbConfig['options']['port'] : null) + . (isset($dbConfig['options']['host']) ? ':'.$dbConfig['options']['host'] : null) + . '/'.$dbConfig['dbname'].':'.$this->_schema.'.'.$this->_name + ); } // If $this has no metadata cache or metadata cache misses @@ -969,8 +978,8 @@ abstract class Zend_Db_Table_Abstract self::COLS => $this->_getCols(), self::PRIMARY => (array) $this->_primary, self::METADATA => $this->_metadata, - self::ROW_CLASS => $this->_rowClass, - self::ROWSET_CLASS => $this->_rowsetClass, + self::ROW_CLASS => $this->getRowClass(), + self::ROWSET_CLASS => $this->getRowsetClass(), self::REFERENCE_MAP => $this->_referenceMap, self::DEPENDENT_TABLES => $this->_dependentTables, self::SEQUENCE => $this->_sequence @@ -1228,6 +1237,7 @@ abstract class Zend_Db_Table_Abstract $whereList = array(); $numberTerms = 0; foreach ($args as $keyPosition => $keyValues) { + $keyValuesCount = count($keyValues); // Coerce the values to an array. // Don't simply typecast to array, because the values // might be Zend_Db_Expr objects. @@ -1235,12 +1245,13 @@ abstract class Zend_Db_Table_Abstract $keyValues = array($keyValues); } if ($numberTerms == 0) { - $numberTerms = count($keyValues); - } else if (count($keyValues) != $numberTerms) { + $numberTerms = $keyValuesCount; + } else if ($keyValuesCount != $numberTerms) { require_once 'Zend/Db/Table/Exception.php'; throw new Zend_Db_Table_Exception("Missing value(s) for the primary key"); } - for ($i = 0; $i < count($keyValues); ++$i) { + $keyValues = array_values($keyValues); + for ($i = 0; $i < $keyValuesCount; ++$i) { if (!isset($whereList[$i])) { $whereList[$i] = array(); } @@ -1266,6 +1277,16 @@ abstract class Zend_Db_Table_Abstract $whereClause = '(' . implode(' OR ', $whereOrTerms) . ')'; } + // issue ZF-5775 (empty where clause should return empty rowset) + if ($whereClause == null) { + $rowsetClass = $this->getRowsetClass(); + if (!class_exists($rowsetClass)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($rowsetClass); + } + return new $rowsetClass(array('table' => $this, 'rowClass' => $this->getRowClass(), 'stored' => true)); + } + return $this->fetchAll($whereClause); } @@ -1307,15 +1328,16 @@ abstract class Zend_Db_Table_Abstract 'table' => $this, 'data' => $rows, 'readOnly' => $select->isReadOnly(), - 'rowClass' => $this->_rowClass, + 'rowClass' => $this->getRowClass(), 'stored' => true ); - if (!class_exists($this->_rowsetClass)) { + $rowsetClass = $this->getRowsetClass(); + if (!class_exists($rowsetClass)) { require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($this->_rowsetClass); + Zend_Loader::loadClass($rowsetClass); } - return new $this->_rowsetClass($data); + return new $rowsetClass($data); } /** @@ -1359,11 +1381,12 @@ abstract class Zend_Db_Table_Abstract 'stored' => true ); - if (!class_exists($this->_rowClass)) { + $rowClass = $this->getRowClass(); + if (!class_exists($rowClass)) { require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($this->_rowClass); + Zend_Loader::loadClass($rowClass); } - return new $this->_rowClass($data); + return new $rowClass($data); } /** @@ -1421,11 +1444,12 @@ abstract class Zend_Db_Table_Abstract 'stored' => false ); - if (!class_exists($this->_rowClass)) { + $rowClass = $this->getRowClass(); + if (!class_exists($rowClass)) { require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($this->_rowClass); + Zend_Loader::loadClass($rowClass); } - $row = new $this->_rowClass($config); + $row = new $rowClass($config); $row->setFromArray($data); return $row; } diff --git a/libs/Zend/Db/Table/Definition.php b/libs/Zend/Db/Table/Definition.php index edea0ee..14d1c3e 100644 --- a/libs/Zend/Db/Table/Definition.php +++ b/libs/Zend/Db/Table/Definition.php @@ -17,7 +17,7 @@ * @subpackage Table * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Definition.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Definition.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,12 +31,12 @@ */ class Zend_Db_Table_Definition { - + /** * @var array */ protected $_tableConfigs = array(); - + /** * __construct() * @@ -50,7 +50,7 @@ class Zend_Db_Table_Definition $this->setOptions($options); } } - + /** * setConfig() * @@ -62,7 +62,7 @@ class Zend_Db_Table_Definition $this->setOptions($config->toArray()); return $this; } - + /** * setOptions() * @@ -76,7 +76,7 @@ class Zend_Db_Table_Definition } return $this; } - + /** * @param string $tableName * @param array $tableConfig @@ -87,15 +87,15 @@ class Zend_Db_Table_Definition // @todo logic here $tableConfig[Zend_Db_Table::DEFINITION_CONFIG_NAME] = $tableName; $tableConfig[Zend_Db_Table::DEFINITION] = $this; - + if (!isset($tableConfig[Zend_Db_Table::NAME])) { $tableConfig[Zend_Db_Table::NAME] = $tableName; } - + $this->_tableConfigs[$tableName] = $tableConfig; return $this; } - + /** * getTableConfig() * @@ -106,7 +106,7 @@ class Zend_Db_Table_Definition { return $this->_tableConfigs[$tableName]; } - + /** * removeTableConfig() * @@ -116,7 +116,7 @@ class Zend_Db_Table_Definition { unset($this->_tableConfigs[$tableName]); } - + /** * hasTableConfig() * diff --git a/libs/Zend/Db/Table/Row/Abstract.php b/libs/Zend/Db/Table/Row/Abstract.php index 501bae1..9e9c613 100644 --- a/libs/Zend/Db/Table/Row/Abstract.php +++ b/libs/Zend/Db/Table/Row/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Table * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -472,9 +472,9 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess if (is_array($primaryKey)) { $newPrimaryKey = $primaryKey; } else { - //ZF-6167 Use tempPrimaryKey temporary to avoid that zend encoding fails. + //ZF-6167 Use tempPrimaryKey temporary to avoid that zend encoding fails. $tempPrimaryKey = (array) $this->_primary; - $newPrimaryKey = array(current($tempPrimaryKey) => $primaryKey); + $newPrimaryKey = array(current($tempPrimaryKey) => $primaryKey); } /** @@ -865,7 +865,7 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess if (is_string($dependentTable)) { $dependentTable = $this->_getTableFromString($dependentTable); } - + if (!$dependentTable instanceof Zend_Db_Table_Abstract) { $type = gettype($dependentTable); if ($type == 'object') { @@ -921,7 +921,7 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess if (is_string($parentTable)) { $parentTable = $this->_getTableFromString($parentTable); } - + if (!$parentTable instanceof Zend_Db_Table_Abstract) { $type = gettype($parentTable); if ($type == 'object') { @@ -937,7 +937,7 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess && ($parentTable->getDefinition() == null)) { $parentTable->setOptions(array(Zend_Db_Table_Abstract::DEFINITION => $tableDefinition)); } - + if ($select === null) { $select = $parentTable->select(); } else { @@ -955,7 +955,7 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess $parentColumnName = $parentDb->foldCase($map[Zend_Db_Table_Abstract::REF_COLUMNS][$i]); $parentColumn = $parentDb->quoteIdentifier($parentColumnName, true); $parentInfo = $parentTable->info(); - + // determine where part $type = $parentInfo[Zend_Db_Table_Abstract::METADATA][$parentColumnName]['DATA_TYPE']; $nullable = $parentInfo[Zend_Db_Table_Abstract::METADATA][$parentColumnName]['NULLABLE']; @@ -966,7 +966,7 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess } else { $select->where("$parentColumn = ?", $value, $type); } - + } return $parentTable->fetchRow($select); @@ -989,7 +989,7 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess if (is_string($intersectionTable)) { $intersectionTable = $this->_getTableFromString($intersectionTable); } - + if (!$intersectionTable instanceof Zend_Db_Table_Abstract) { $type = gettype($intersectionTable); if ($type == 'object') { @@ -1005,11 +1005,11 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess && ($intersectionTable->getDefinition() == null)) { $intersectionTable->setOptions(array(Zend_Db_Table_Abstract::DEFINITION => $tableDefinition)); } - + if (is_string($matchTable)) { $matchTable = $this->_getTableFromString($matchTable); } - + if (! $matchTable instanceof Zend_Db_Table_Abstract) { $type = gettype($matchTable); if ($type == 'object') { @@ -1025,7 +1025,7 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess && ($matchTable->getDefinition() == null)) { $matchTable->setOptions(array(Zend_Db_Table_Abstract::DEFINITION => $tableDefinition)); } - + if ($select === null) { $select = $matchTable->select(); } else { @@ -1164,12 +1164,12 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess if ($this->_table instanceof Zend_Db_Table_Abstract) { $tableDefinition = $this->_table->getDefinition(); - + if ($tableDefinition !== null && $tableDefinition->hasTableConfig($tableName)) { return new Zend_Db_Table($tableName, $tableDefinition); - } + } } - + // assume the tableName is the class name if (!class_exists($tableName)) { try { @@ -1182,11 +1182,11 @@ abstract class Zend_Db_Table_Row_Abstract implements ArrayAccess } $options = array(); - + if (($table = $this->_getTable())) { $options['db'] = $table->getAdapter(); } - + if (isset($tableDefinition) && $tableDefinition !== null) { $options[Zend_Db_Table_Abstract::DEFINITION] = $tableDefinition; } diff --git a/libs/Zend/Db/Table/Select.php b/libs/Zend/Db/Table/Select.php index c945905..629ac47 100644 --- a/libs/Zend/Db/Table/Select.php +++ b/libs/Zend/Db/Table/Select.php @@ -18,7 +18,7 @@ * @subpackage Select * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Select.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Select.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -193,23 +193,27 @@ class Zend_Db_Table_Select extends Zend_Db_Select $primary = $this->_info[Zend_Db_Table_Abstract::NAME]; $schema = $this->_info[Zend_Db_Table_Abstract::SCHEMA]; - // If no fields are specified we assume all fields from primary table - if (!count($fields)) { - $this->from($primary, self::SQL_WILDCARD, $schema); - $fields = $this->getPart(Zend_Db_Table_Select::COLUMNS); - } - $from = $this->getPart(Zend_Db_Table_Select::FROM); + if (count($this->_parts[self::UNION]) == 0) { - if ($this->_integrityCheck !== false) { - foreach ($fields as $columnEntry) { - list($table, $column) = $columnEntry; + // If no fields are specified we assume all fields from primary table + if (!count($fields)) { + $this->from($primary, self::SQL_WILDCARD, $schema); + $fields = $this->getPart(Zend_Db_Table_Select::COLUMNS); + } - // Check each column to ensure it only references the primary table - if ($column) { - if (!isset($from[$table]) || $from[$table]['tableName'] != $primary) { - require_once 'Zend/Db/Table/Select/Exception.php'; - throw new Zend_Db_Table_Select_Exception('Select query cannot join with another table'); + $from = $this->getPart(Zend_Db_Table_Select::FROM); + + if ($this->_integrityCheck !== false) { + foreach ($fields as $columnEntry) { + list($table, $column) = $columnEntry; + + // Check each column to ensure it only references the primary table + if ($column) { + if (!isset($from[$table]) || $from[$table]['tableName'] != $primary) { + require_once 'Zend/Db/Table/Select/Exception.php'; + throw new Zend_Db_Table_Select_Exception('Select query cannot join with another table'); + } } } } diff --git a/libs/Zend/Dojo.php b/libs/Zend/Dojo.php index fffef2b..76d1817 100644 --- a/libs/Zend/Dojo.php +++ b/libs/Zend/Dojo.php @@ -20,11 +20,11 @@ /** * Enable Dojo components - * + * * @package Zend_Dojo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Dojo.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Dojo.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo { @@ -50,8 +50,8 @@ class Zend_Dojo /** * Dojo-enable a form instance - * - * @param Zend_Form $form + * + * @param Zend_Form $form * @return void */ public static function enableForm(Zend_Form $form) @@ -73,8 +73,8 @@ class Zend_Dojo /** * Dojo-enable a view instance - * - * @param Zend_View_Interface $view + * + * @param Zend_View_Interface $view * @return void */ public static function enableView(Zend_View_Interface $view) diff --git a/libs/Zend/Dojo/BuildLayer.php b/libs/Zend/Dojo/BuildLayer.php index ddd5628..92fb032 100644 --- a/libs/Zend/Dojo/BuildLayer.php +++ b/libs/Zend/Dojo/BuildLayer.php @@ -16,12 +16,12 @@ * @package Zend_Dojo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: BuildLayer.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: BuildLayer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * Dojo module layer and custom build profile generation support - * + * * @package Zend_Dojo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License @@ -29,15 +29,15 @@ class Zend_Dojo_BuildLayer { /** - * Flag: whether or not to consume JS aggregated in the dojo() view + * Flag: whether or not to consume JS aggregated in the dojo() view * helper when generate the module layer contents * @var bool */ protected $_consumeJavascript = false; /** - * Flag: whether or not to consume dojo.addOnLoad events registered - * with the dojo() view helper when generating the module layer file + * Flag: whether or not to consume dojo.addOnLoad events registered + * with the dojo() view helper when generating the module layer file * contents * @var bool */ @@ -56,7 +56,7 @@ class Zend_Dojo_BuildLayer protected $_layerName; /** - * Path to the custom layer script relative to dojo.js (used when + * Path to the custom layer script relative to dojo.js (used when * creating the build profile) * @var string */ @@ -89,8 +89,8 @@ class Zend_Dojo_BuildLayer /** * Constructor - * - * @param array|Zend_Config $options + * + * @param array|Zend_Config $options * @return void * @throws Zend_Dojo_Exception for invalid option argument */ @@ -111,8 +111,8 @@ class Zend_Dojo_BuildLayer * Set options * * Proxies to any setter that matches an option key. - * - * @param array $options + * + * @param array $options * @return Zend_Dojo_BuildLayer */ public function setOptions(array $options) @@ -129,8 +129,8 @@ class Zend_Dojo_BuildLayer /** * Set View object - * - * @param Zend_View_Interface $view + * + * @param Zend_View_Interface $view * @return Zend_Dojo_BuildLayer */ public function setView(Zend_View_Interface $view) @@ -141,7 +141,7 @@ class Zend_Dojo_BuildLayer /** * Retrieve view object - * + * * @return Zend_View_Interface|null */ public function getView() @@ -151,8 +151,8 @@ class Zend_Dojo_BuildLayer /** * Set dojo() view helper instance - * - * @param Zend_Dojo_View_Helper_Dojo_Container $helper + * + * @param Zend_Dojo_View_Helper_Dojo_Container $helper * @return Zend_Dojo_BuildLayer */ public function setDojoHelper(Zend_Dojo_View_Helper_Dojo_Container $helper) @@ -165,7 +165,7 @@ class Zend_Dojo_BuildLayer * Retrieve dojo() view helper instance * * Will retrieve it from the view object if not registered. - * + * * @return Zend_Dojo_View_Helper_Dojo_Container * @throws Zend_Dojo_Exception if not registered and no view object found */ @@ -184,8 +184,8 @@ class Zend_Dojo_BuildLayer /** * Set custom layer name; e.g. "custom.main" - * - * @param string $name + * + * @param string $name * @return Zend_Dojo_BuildLayer */ public function setLayerName($name) @@ -200,7 +200,7 @@ class Zend_Dojo_BuildLayer /** * Retrieve custom layer name - * + * * @return string|null */ public function getLayerName() @@ -212,8 +212,8 @@ class Zend_Dojo_BuildLayer * Set the path to the custom layer script * * Should be a path relative to dojo.js - * - * @param string $path + * + * @param string $path * @return Zend_Dojo_BuildLayer */ public function setLayerScriptPath($path) @@ -224,7 +224,7 @@ class Zend_Dojo_BuildLayer /** * Get custom layer script path - * + * * @return string|null */ public function getLayerScriptPath() @@ -233,10 +233,10 @@ class Zend_Dojo_BuildLayer } /** - * Set flag indicating whether or not to consume JS aggregated in dojo() + * Set flag indicating whether or not to consume JS aggregated in dojo() * view helper - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Dojo_BuildLayer */ public function setConsumeJavascript($flag) @@ -246,9 +246,9 @@ class Zend_Dojo_BuildLayer } /** - * Get flag indicating whether or not to consume JS aggregated in dojo() + * Get flag indicating whether or not to consume JS aggregated in dojo() * view helper - * + * * @return bool */ public function consumeJavascript() @@ -257,10 +257,10 @@ class Zend_Dojo_BuildLayer } /** - * Set flag indicating whether or not to consume dojo.addOnLoad events + * Set flag indicating whether or not to consume dojo.addOnLoad events * aggregated in dojo() view helper - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Dojo_BuildLayer */ public function setConsumeOnLoad($flag) @@ -271,7 +271,7 @@ class Zend_Dojo_BuildLayer /** * Get flag indicating whether or not to consume dojo.addOnLoad events aggregated in dojo() view helper - * + * * @return bool */ public function consumeOnLoad() @@ -281,8 +281,8 @@ class Zend_Dojo_BuildLayer /** * Set many build profile options at once - * - * @param array $options + * + * @param array $options * @return Zend_Dojo_BuildLayer */ public function setProfileOptions(array $options) @@ -293,8 +293,8 @@ class Zend_Dojo_BuildLayer /** * Add many build profile options at once - * - * @param array $options + * + * @param array $options * @return Zend_Dojo_BuildLayer */ public function addProfileOptions(array $options) @@ -305,9 +305,9 @@ class Zend_Dojo_BuildLayer /** * Add a single build profile option - * - * @param string $key - * @param value $value + * + * @param string $key + * @param value $value * @return Zend_Dojo_BuildLayer */ public function addProfileOption($key, $value) @@ -318,8 +318,8 @@ class Zend_Dojo_BuildLayer /** * Is a given build profile option set? - * - * @param string $key + * + * @param string $key * @return bool */ public function hasProfileOption($key) @@ -331,8 +331,8 @@ class Zend_Dojo_BuildLayer * Retrieve a single build profile option * * Returns null if profile option does not exist. - * - * @param string $key + * + * @param string $key * @return mixed */ public function getProfileOption($key) @@ -345,7 +345,7 @@ class Zend_Dojo_BuildLayer /** * Get all build profile options - * + * * @return array */ public function getProfileOptions() @@ -355,8 +355,8 @@ class Zend_Dojo_BuildLayer /** * Remove a build profile option - * - * @param string $name + * + * @param string $name * @return Zend_Dojo_BuildLayer */ public function removeProfileOption($name) @@ -369,7 +369,7 @@ class Zend_Dojo_BuildLayer /** * Remove all build profile options - * + * * @return Zend_Dojo_BuildLayer */ public function clearProfileOptions() @@ -382,9 +382,9 @@ class Zend_Dojo_BuildLayer * Add a build profile dependency prefix * * If just the prefix is passed, sets path to "../$prefix". - * - * @param string $prefix - * @param null|string $path + * + * @param string $prefix + * @param null|string $path * @return Zend_Dojo_BuildLayer */ public function addProfilePrefix($prefix, $path = null) @@ -398,8 +398,8 @@ class Zend_Dojo_BuildLayer /** * Set multiple dependency prefixes for bulid profile - * - * @param array $prefixes + * + * @param array $prefixes * @return Zend_Dojo_BuildLayer */ public function setProfilePrefixes(array $prefixes) @@ -412,7 +412,7 @@ class Zend_Dojo_BuildLayer /** * Get build profile dependency prefixes - * + * * @return array */ public function getProfilePrefixes() @@ -442,7 +442,7 @@ class Zend_Dojo_BuildLayer /** * Generate module layer script - * + * * @return string */ public function generateLayerScript() @@ -482,7 +482,7 @@ class Zend_Dojo_BuildLayer /** * Generate build profile - * + * * @return string */ public function generateBuildProfile() @@ -509,8 +509,8 @@ class Zend_Dojo_BuildLayer /** * Retrieve module prefix - * - * @param string $module + * + * @param string $module * @return void */ protected function _getPrefix($module) @@ -521,8 +521,8 @@ class Zend_Dojo_BuildLayer /** * Filter a JSON build profile to JavaScript - * - * @param string $profile + * + * @param string $profile * @return string */ protected function _filterJsonProfileToJavascript($profile) diff --git a/libs/Zend/Dojo/Data.php b/libs/Zend/Dojo/Data.php index 2ac95f7..211c88e 100644 --- a/libs/Zend/Dojo/Data.php +++ b/libs/Zend/Dojo/Data.php @@ -16,12 +16,12 @@ * @package Zend_Dojo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Data.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Data.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * dojo.data support for Zend Framework - * + * * @uses ArrayAccess * @uses Iterator * @uses Countable @@ -29,7 +29,7 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable +class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable { /** * Identifier field of item @@ -57,25 +57,25 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable /** * Constructor - * - * @param string|null $identifier - * @param array|Traversable|null $items - * @param string|null $label + * + * @param string|null $identifier + * @param array|Traversable|null $items + * @param string|null $label * @return void */ - public function __construct($identifier = null, $items = null, $label = null) - { - if (null !== $identifier) { - $this->setIdentifier($identifier); - } - if (null !== $items) { - $this->setItems($items); - } - if (null !== $label) { - $this->setLabel($label); - } - } - + public function __construct($identifier = null, $items = null, $label = null) + { + if (null !== $identifier) { + $this->setIdentifier($identifier); + } + if (null !== $items) { + $this->setItems($items); + } + if (null !== $label) { + $this->setLabel($label); + } + } + /** * Set the items to collect * @@ -157,8 +157,8 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable /** * Does an item with the given identifier exist? - * - * @param string|int $id + * + * @param string|int $id * @return bool */ public function hasItem($id) @@ -209,7 +209,7 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable return $this; } - + /** * Set identifier for item lookups * @@ -242,7 +242,7 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable return $this->_identifier; } - + /** * Set label to use for displaying item associations * @@ -271,9 +271,9 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable /** * Set metadata by key or en masse - * - * @param string|array $spec - * @param mixed $value + * + * @param string|array $spec + * @param mixed $value * @return Zend_Dojo_Data */ public function setMetadata($spec, $value = null) @@ -290,7 +290,7 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable /** * Get metadata item or all metadata - * + * * @param null|string $key Metadata key when pulling single metadata item * @return mixed */ @@ -309,8 +309,8 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable /** * Clear individual or all metadata item(s) - * - * @param null|string $key + * + * @param null|string $key * @return Zend_Dojo_Data */ public function clearMetadata($key = null) @@ -325,8 +325,8 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable /** * Load object from array - * - * @param array $data + * + * @param array $data * @return Zend_Dojo_Data */ public function fromArray(array $data) @@ -347,8 +347,8 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable /** * Load object from JSON - * - * @param string $json + * + * @param string $json * @return Zend_Dojo_Data */ public function fromJson($json) @@ -364,7 +364,7 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable /** * Seralize entire data structure, including identifier and label, to array - * + * * @return array */ public function toArray() @@ -392,7 +392,7 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable return $array; } - + /** * Serialize to JSON (dojo.data format) * @@ -520,10 +520,10 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable } /** - * Normalize an item to attach to the collection - * - * @param array|object $item - * @param string|int|null $id + * Normalize an item to attach to the collection + * + * @param array|object $item + * @param string|int|null $id * @return array */ protected function _normalizeItem($item, $id) @@ -560,4 +560,4 @@ class Zend_Dojo_Data implements ArrayAccess,Iterator,Countable 'data' => $item, ); } -} +} diff --git a/libs/Zend/Dojo/Exception.php b/libs/Zend/Dojo/Exception.php index d2e1d56..1c3fb67 100644 --- a/libs/Zend/Dojo/Exception.php +++ b/libs/Zend/Dojo/Exception.php @@ -16,7 +16,7 @@ * @package Zend_Dojo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Exception */ @@ -24,7 +24,7 @@ require_once 'Zend/Exception.php'; /** * Exception class for Zend_Dojo - * + * * @uses Zend_Exception * @package Zend_Dojo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) diff --git a/libs/Zend/Dojo/Form.php b/libs/Zend/Dojo/Form.php index d6096de..97b52d0 100644 --- a/libs/Zend/Dojo/Form.php +++ b/libs/Zend/Dojo/Form.php @@ -24,20 +24,20 @@ require_once 'Zend/Form.php'; /** * Dijit-enabled Form - * + * * @uses Zend_Form * @package Zend_Dojo * @subpackage Form * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Form.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Form.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form extends Zend_Form { /** * Constructor - * - * @param array|Zend_Config|null $options + * + * @param array|Zend_Config|null $options * @return void */ public function __construct($options = null) @@ -52,7 +52,7 @@ class Zend_Dojo_Form extends Zend_Form /** * Load the default decorators - * + * * @return void */ public function loadDefaultDecorators() @@ -73,8 +73,8 @@ class Zend_Dojo_Form extends Zend_Form * Set the view object * * Ensures that the view object has the dojo view helper path set. - * - * @param Zend_View_Interface $view + * + * @param Zend_View_Interface $view * @return Zend_Dojo_Form_Element_Dijit */ public function setView(Zend_View_Interface $view = null) diff --git a/libs/Zend/Dojo/Form/Decorator/DijitContainer.php b/libs/Zend/Dojo/Form/Decorator/DijitContainer.php index 92c42ef..b9404ca 100644 --- a/libs/Zend/Dojo/Form/Decorator/DijitContainer.php +++ b/libs/Zend/Dojo/Form/Decorator/DijitContainer.php @@ -29,15 +29,15 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * Accepts the following options: * - helper: the name of the view helper to use * - * Assumes the view helper accepts four parameters, the id, content, dijit + * Assumes the view helper accepts four parameters, the id, content, dijit * parameters, and (X)HTML attributes; these will be provided by the element. - * + * * @uses Zend_Form_Decorator_Abstract * @package Zend_Dojo * @subpackage Form_Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DijitContainer.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: DijitContainer.php 18951 2009-11-12 16:26:19Z alexander $ */ abstract class Zend_Dojo_Form_Decorator_DijitContainer extends Zend_Form_Decorator_Abstract { @@ -48,7 +48,7 @@ abstract class Zend_Dojo_Form_Decorator_DijitContainer extends Zend_Form_Decorat protected $_helper; /** - * Element attributes + * Element attributes * @var array */ protected $_attribs; @@ -67,7 +67,7 @@ abstract class Zend_Dojo_Form_Decorator_DijitContainer extends Zend_Form_Decorat /** * Get view helper for rendering container - * + * * @return string */ public function getHelper() @@ -80,8 +80,8 @@ abstract class Zend_Dojo_Form_Decorator_DijitContainer extends Zend_Form_Decorat } /** - * Get element attributes - * + * Get element attributes + * * @return array */ public function getAttribs() @@ -98,7 +98,7 @@ abstract class Zend_Dojo_Form_Decorator_DijitContainer extends Zend_Form_Decorat /** * Get dijit option parameters - * + * * @return array */ public function getDijitParams() @@ -128,7 +128,7 @@ abstract class Zend_Dojo_Form_Decorator_DijitContainer extends Zend_Form_Decorat /** * Get title - * + * * @return string */ public function getTitle() @@ -162,8 +162,8 @@ abstract class Zend_Dojo_Form_Decorator_DijitContainer extends Zend_Form_Decorat * Render a dijit layout container * * Replaces $content entirely from currently set element. - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) @@ -195,6 +195,6 @@ abstract class Zend_Dojo_Form_Decorator_DijitContainer extends Zend_Form_Decorat } while ($view->dojo()->hasDijit($id)); } - return $view->$helper($id, $content, $dijitParams, $attribs); + return $view->$helper($id, $content, $dijitParams, $attribs); } } diff --git a/libs/Zend/Dojo/Form/Decorator/DijitElement.php b/libs/Zend/Dojo/Form/Decorator/DijitElement.php index cced129..5afa57b 100644 --- a/libs/Zend/Dojo/Form/Decorator/DijitElement.php +++ b/libs/Zend/Dojo/Form/Decorator/DijitElement.php @@ -31,14 +31,14 @@ require_once 'Zend/Form/Decorator/ViewHelper.php'; * - placement: whether to append or prepend the generated content to the passed in content * - helper: the name of the view helper to use * - * Assumes the view helper accepts three parameters, the name, value, and + * Assumes the view helper accepts three parameters, the name, value, and * optional attributes; these will be provided by the element. - * + * * @package Zend_Dojo * @subpackage Form_Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DijitElement.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: DijitElement.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Decorator_DijitElement extends Zend_Form_Decorator_ViewHelper { @@ -67,7 +67,7 @@ class Zend_Dojo_Form_Decorator_DijitElement extends Zend_Form_Decorator_ViewHelp /** * Get element attributes - * + * * @return array */ public function getElementAttribs() @@ -85,9 +85,9 @@ class Zend_Dojo_Form_Decorator_DijitElement extends Zend_Form_Decorator_ViewHelp /** * Set a single dijit option parameter - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return Zend_Dojo_Form_Decorator_DijitContainer */ public function setDijitParam($key, $value) @@ -98,8 +98,8 @@ class Zend_Dojo_Form_Decorator_DijitElement extends Zend_Form_Decorator_ViewHelp /** * Set dijit option parameters - * - * @param array $params + * + * @param array $params * @return Zend_Dojo_Form_Decorator_DijitContainer */ public function setDijitParams(array $params) @@ -110,8 +110,8 @@ class Zend_Dojo_Form_Decorator_DijitElement extends Zend_Form_Decorator_ViewHelp /** * Retrieve a single dijit option parameter - * - * @param string $key + * + * @param string $key * @return mixed|null */ public function getDijitParam($key) @@ -127,7 +127,7 @@ class Zend_Dojo_Form_Decorator_DijitElement extends Zend_Form_Decorator_ViewHelp /** * Get dijit option parameters - * + * * @return array */ public function getDijitParams() @@ -139,10 +139,10 @@ class Zend_Dojo_Form_Decorator_DijitElement extends Zend_Form_Decorator_ViewHelp /** * Render an element using a view helper * - * Determine view helper from 'helper' option, or, if none set, from - * the element type. Then call as + * Determine view helper from 'helper' option, or, if none set, from + * the element type. Then call as * helper($element->getName(), $element->getValue(), $element->getAttribs()) - * + * * @param string $content * @return string * @throws Zend_Form_Decorator_Exception if element or view are not registered @@ -177,11 +177,11 @@ class Zend_Dojo_Form_Decorator_DijitElement extends Zend_Form_Decorator_ViewHelp } while ($view->dojo()->hasDijit($id)); } $attribs['id'] = $id; - + if (array_key_exists('options', $attribs)) { - $options = $attribs['options']; + $options = $attribs['options']; } - + $elementContent = $view->$helper($name, $value, $dijitParams, $attribs, $options); switch ($this->getPlacement()) { case self::APPEND: diff --git a/libs/Zend/Dojo/Form/Decorator/DijitForm.php b/libs/Zend/Dojo/Form/Decorator/DijitForm.php index 51d5134..2324c4a 100644 --- a/libs/Zend/Dojo/Form/Decorator/DijitForm.php +++ b/libs/Zend/Dojo/Form/Decorator/DijitForm.php @@ -33,7 +33,7 @@ require_once 'Zend/Dojo/Form/Decorator/DijitContainer.php'; * @subpackage Form_Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DijitForm.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: DijitForm.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Decorator_DijitForm extends Zend_Dojo_Form_Decorator_DijitContainer { @@ -41,8 +41,8 @@ class Zend_Dojo_Form_Decorator_DijitForm extends Zend_Dojo_Form_Decorator_DijitC * Render a form * * Replaces $content entirely from currently set element. - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) @@ -56,6 +56,6 @@ class Zend_Dojo_Form_Decorator_DijitForm extends Zend_Dojo_Form_Decorator_DijitC $dijitParams = $this->getDijitParams(); $attribs = array_merge($this->getAttribs(), $this->getOptions()); - return $view->form($element->getName(), $attribs, $content); + return $view->form($element->getName(), $attribs, $content); } } diff --git a/libs/Zend/Dojo/Form/DisplayGroup.php b/libs/Zend/Dojo/Form/DisplayGroup.php index 652991c..cc331ec 100644 --- a/libs/Zend/Dojo/Form/DisplayGroup.php +++ b/libs/Zend/Dojo/Form/DisplayGroup.php @@ -24,22 +24,22 @@ require_once 'Zend/Form/DisplayGroup.php'; /** * Dijit-enabled DisplayGroup - * + * * @uses Zend_Form_DisplayGroup * @package Zend_Dojo * @subpackage Form * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DisplayGroup.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: DisplayGroup.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_DisplayGroup extends Zend_Form_DisplayGroup { /** * Constructor - * + * * @param string $name * @param Zend_Loader_PluginLoader $loader - * @param array|Zend_Config|null $options + * @param array|Zend_Config|null $options * @return void */ public function __construct($name, Zend_Loader_PluginLoader $loader, $options = null) @@ -52,8 +52,8 @@ class Zend_Dojo_Form_DisplayGroup extends Zend_Form_DisplayGroup * Set the view object * * Ensures that the view object has the dojo view helper path set. - * - * @param Zend_View_Interface $view + * + * @param Zend_View_Interface $view * @return Zend_Dojo_Form_Element_Dijit */ public function setView(Zend_View_Interface $view = null) diff --git a/libs/Zend/Dojo/Form/Element/Button.php b/libs/Zend/Dojo/Form/Element/Button.php index 7f6b218..f13aaa1 100644 --- a/libs/Zend/Dojo/Form/Element/Button.php +++ b/libs/Zend/Dojo/Form/Element/Button.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/Dijit.php'; /** * Button dijit - * + * * @category Zend * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Button.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Button.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_Button extends Zend_Dojo_Form_Element_Dijit { @@ -42,7 +42,7 @@ class Zend_Dojo_Form_Element_Button extends Zend_Dojo_Form_Element_Dijit /** * Constructor - * + * * @param string|array|Zend_Config $spec Element name or configuration * @param string|array|Zend_Config $options Element value or configuration * @return void @@ -62,7 +62,7 @@ class Zend_Dojo_Form_Element_Button extends Zend_Dojo_Form_Element_Dijit * If no label is present, returns the currently set name. * * If a translator is present, returns the translated label. - * + * * @return string */ public function getLabel() @@ -82,7 +82,7 @@ class Zend_Dojo_Form_Element_Button extends Zend_Dojo_Form_Element_Dijit /** * Has this submit button been selected? - * + * * @return bool */ public function isChecked() @@ -103,7 +103,7 @@ class Zend_Dojo_Form_Element_Button extends Zend_Dojo_Form_Element_Dijit * Default decorators * * Uses only 'DijitElement' and 'DtDdWrapper' decorators by default. - * + * * @return void */ public function loadDefaultDecorators() diff --git a/libs/Zend/Dojo/Form/Element/CheckBox.php b/libs/Zend/Dojo/Form/Element/CheckBox.php index 8b5ee9b..63f7eeb 100644 --- a/libs/Zend/Dojo/Form/Element/CheckBox.php +++ b/libs/Zend/Dojo/Form/Element/CheckBox.php @@ -26,13 +26,13 @@ require_once 'Zend/Dojo/Form/Element/Dijit.php'; * CheckBox dijit * * Note: this would be easier with mixins or traits... - * + * * @uses Zend_Dojo_Form_Element_Dijit * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CheckBox.php 17716 2009-08-21 15:08:31Z matthew $ + * @version $Id: CheckBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit { @@ -78,10 +78,10 @@ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit /** * Set options * - * Intercept checked and unchecked values and set them early; test stored + * Intercept checked and unchecked values and set them early; test stored * value against checked and unchecked values after configuration. - * - * @param array $options + * + * @param array $options * @return Zend_Form_Element_Checkbox */ public function setOptions(array $options) @@ -111,11 +111,11 @@ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit * If value matches checked value, sets to that value, and sets the checked * flag to true. * - * Any other value causes the unchecked value to be set as the current + * Any other value causes the unchecked value to be set as the current * value, and the checked flag to be set as false. * - * - * @param mixed $value + * + * @param mixed $value * @return Zend_Form_Element_Checkbox */ public function setValue($value) @@ -132,8 +132,8 @@ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit /** * Set checked value - * - * @param string $value + * + * @param string $value * @return Zend_Form_Element_Checkbox */ public function setCheckedValue($value) @@ -145,7 +145,7 @@ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit /** * Get value when checked - * + * * @return string */ public function getCheckedValue() @@ -155,8 +155,8 @@ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit /** * Set unchecked value - * - * @param string $value + * + * @param string $value * @return Zend_Form_Element_Checkbox */ public function setUncheckedValue($value) @@ -168,7 +168,7 @@ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit /** * Get value when not checked - * + * * @return string */ public function getUncheckedValue() @@ -178,8 +178,8 @@ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit /** * Set checked flag - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Form_Element_Checkbox */ public function setChecked($flag) @@ -195,7 +195,7 @@ class Zend_Dojo_Form_Element_CheckBox extends Zend_Dojo_Form_Element_Dijit /** * Get checked flag - * + * * @return bool */ public function isChecked() diff --git a/libs/Zend/Dojo/Form/Element/ComboBox.php b/libs/Zend/Dojo/Form/Element/ComboBox.php index 77786c5..5ba803a 100644 --- a/libs/Zend/Dojo/Form/Element/ComboBox.php +++ b/libs/Zend/Dojo/Form/Element/ComboBox.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/DijitMulti.php'; /** * ComboBox dijit - * + * * @uses Zend_Dojo_Form_Element_DijitMulti * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ComboBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: ComboBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti { @@ -47,8 +47,8 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti protected $_registerInArrayValidator = false; /** - * Get datastore information - * + * Get datastore information + * * @return array */ public function getStoreInfo() @@ -61,8 +61,8 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti /** * Set datastore identifier - * - * @param string $identifier + * + * @param string $identifier * @return Zend_Dojo_Form_Element_ComboBox */ public function setStoreId($identifier) @@ -74,8 +74,8 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti } /** - * Get datastore identifier - * + * Get datastore identifier + * * @return string|null */ public function getStoreId() @@ -89,8 +89,8 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti /** * Set datastore dijit type - * - * @param string $dojoType + * + * @param string $dojoType * @return Zend_Dojo_Form_Element_ComboBox */ public function setStoreType($dojoType) @@ -102,8 +102,8 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti } /** - * Get datastore dijit type - * + * Get datastore dijit type + * * @return string|null */ public function getStoreType() @@ -117,8 +117,8 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti /** * Set datastore parameters - * - * @param array $params + * + * @param array $params * @return Zend_Dojo_Form_Element_ComboBox */ public function setStoreParams(array $params) @@ -131,7 +131,7 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti /** * Get datastore params - * + * * @return array */ public function getStoreParams() @@ -145,8 +145,8 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti /** * Set autocomplete flag - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Dojo_Form_Element_ComboBox */ public function setAutocomplete($flag) @@ -157,7 +157,7 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti /** * Get autocomplete flag - * + * * @return bool */ public function getAutocomplete() @@ -170,9 +170,9 @@ class Zend_Dojo_Form_Element_ComboBox extends Zend_Dojo_Form_Element_DijitMulti /** * Is the value valid? - * - * @param string $value - * @param mixed $context + * + * @param string $value + * @param mixed $context * @return bool */ public function isValid($value, $context = null) diff --git a/libs/Zend/Dojo/Form/Element/CurrencyTextBox.php b/libs/Zend/Dojo/Form/Element/CurrencyTextBox.php index 71bcdc7..e4dbf6f 100644 --- a/libs/Zend/Dojo/Form/Element/CurrencyTextBox.php +++ b/libs/Zend/Dojo/Form/Element/CurrencyTextBox.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/NumberTextBox.php'; /** * CurrencyTextBox dijit - * + * * @uses Zend_Dojo_Form_Element_NumberTextBox * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CurrencyTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: CurrencyTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_CurrencyTextBox extends Zend_Dojo_Form_Element_NumberTextBox { @@ -110,7 +110,7 @@ class Zend_Dojo_Form_Element_CurrencyTextBox extends Zend_Dojo_Form_Element_Numb /** * Get whether or not to present fractional values - * + * * @return bool */ public function getFractional() diff --git a/libs/Zend/Dojo/Form/Element/DateTextBox.php b/libs/Zend/Dojo/Form/Element/DateTextBox.php index 6fad257..9688033 100644 --- a/libs/Zend/Dojo/Form/Element/DateTextBox.php +++ b/libs/Zend/Dojo/Form/Element/DateTextBox.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/ValidationTextBox.php'; /** * DateTextBox dijit - * + * * @uses Zend_Dojo_Form_Element_ValidationTextBox * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DateTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: DateTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_DateTextBox extends Zend_Dojo_Form_Element_ValidationTextBox { diff --git a/libs/Zend/Dojo/Form/Element/Dijit.php b/libs/Zend/Dojo/Form/Element/Dijit.php index 421a1e8..f7c9e14 100644 --- a/libs/Zend/Dojo/Form/Element/Dijit.php +++ b/libs/Zend/Dojo/Form/Element/Dijit.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element.php'; /** * Base element for dijit elements - * + * * @category Zend * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Dijit.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Dijit.php 18951 2009-11-12 16:26:19Z alexander $ */ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element { @@ -48,10 +48,10 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Constructor - * + * * @todo Should we set dojo view helper paths here? - * @param mixed $spec - * @param mixed $options + * @param mixed $spec + * @param mixed $options * @return void */ public function __construct($spec, $options = null) @@ -62,9 +62,9 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Set a dijit parameter - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return Zend_Dojo_Form_Element_Dijit */ public function setDijitParam($key, $value) @@ -76,8 +76,8 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Set multiple dijit params at once - * - * @param array $params + * + * @param array $params * @return Zend_Dojo_Form_Element_Dijit */ public function setDijitParams(array $params) @@ -88,8 +88,8 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Does the given dijit parameter exist? - * - * @param string $key + * + * @param string $key * @return bool */ public function hasDijitParam($key) @@ -99,8 +99,8 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Get a single dijit parameter - * - * @param string $key + * + * @param string $key * @return mixed */ public function getDijitParam($key) @@ -114,7 +114,7 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Retrieve all dijit parameters - * + * * @return array */ public function getDijitParams() @@ -124,8 +124,8 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Remove a single dijit parameter - * - * @param string $key + * + * @param string $key * @return Zend_Dojo_Form_Element_Dijit */ public function removeDijitParam($key) @@ -139,7 +139,7 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Clear all dijit parameters - * + * * @return Zend_Dojo_Form_Element_Dijit */ public function clearDijitParams() @@ -150,7 +150,7 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element /** * Load default decorators - * + * * @return void */ public function loadDefaultDecorators() @@ -173,8 +173,8 @@ abstract class Zend_Dojo_Form_Element_Dijit extends Zend_Form_Element * Set the view object * * Ensures that the view object has the dojo view helper path set. - * - * @param Zend_View_Interface $view + * + * @param Zend_View_Interface $view * @return Zend_Dojo_Form_Element_Dijit */ public function setView(Zend_View_Interface $view = null) diff --git a/libs/Zend/Dojo/Form/Element/DijitMulti.php b/libs/Zend/Dojo/Form/Element/DijitMulti.php index 1af26cc..e79af47 100644 --- a/libs/Zend/Dojo/Form/Element/DijitMulti.php +++ b/libs/Zend/Dojo/Form/Element/DijitMulti.php @@ -26,13 +26,13 @@ require_once 'Zend/Dojo/Form/Element/Dijit.php'; * CheckBox dijit * * Note: this would be easier with mixins or traits... - * + * * @uses Zend_Dojo_Form_Element_Dijit * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DijitMulti.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: DijitMulti.php 18951 2009-11-12 16:26:19Z alexander $ */ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_Dijit { @@ -84,7 +84,7 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Retrieve options array - * + * * @return array */ protected function _getMultiOptions() @@ -98,8 +98,8 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Add an option - * - * @param string $option + * + * @param string $option * @param string $value * @return Zend_Form_Element_Multi */ @@ -116,14 +116,14 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Add many options at once - * - * @param array $options + * + * @param array $options * @return Zend_Form_Element_Multi */ public function addMultiOptions(array $options) { foreach ($options as $option => $value) { - if (is_array($value) + if (is_array($value) && array_key_exists('key', $value) && array_key_exists('value', $value) ) { @@ -149,8 +149,8 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Retrieve single multi option - * - * @param string $option + * + * @param string $option * @return mixed */ public function getMultiOption($option) @@ -181,8 +181,8 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Remove a single multi option - * - * @param string $option + * + * @param string $option * @return bool */ public function removeMultiOption($option) @@ -202,7 +202,7 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Clear all options - * + * * @return Zend_Form_Element_Multi */ public function clearMultiOptions() @@ -214,8 +214,8 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Set flag indicating whether or not to auto-register inArray validator - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Form_Element_Multi */ public function setRegisterInArrayValidator($flag) @@ -226,7 +226,7 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Get status of auto-register inArray validator flag - * + * * @return bool */ public function registerInArrayValidator() @@ -238,9 +238,9 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ * Is the value provided valid? * * Autoregisters InArray validator if necessary. - * - * @param string $value - * @param mixed $context + * + * @param string $value + * @param mixed $context * @return bool */ public function isValid($value, $context = null) @@ -260,8 +260,8 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ /** * Translate an option - * - * @param string $option + * + * @param string $option * @param string $value * @return bool */ @@ -274,15 +274,15 @@ abstract class Zend_Dojo_Form_Element_DijitMulti extends Zend_Dojo_Form_Element_ } $this->_translated[$option] = true; return true; - } + } return false; } /** * Translate a value - * - * @param array|string $value + * + * @param array|string $value * @return array|string */ protected function _translateValue($value) diff --git a/libs/Zend/Dojo/Form/Element/Editor.php b/libs/Zend/Dojo/Form/Element/Editor.php index 837a8da..d3e83c9 100644 --- a/libs/Zend/Dojo/Form/Element/Editor.php +++ b/libs/Zend/Dojo/Form/Element/Editor.php @@ -17,7 +17,7 @@ * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Editor.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Editor.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_Form_Element_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/Form/Element/Dijit.php'; /** * Editor dijit - * + * * @uses Zend_Dojo_Form_Element_Dijit * @category Zend * @package Zend_Dojo @@ -42,8 +42,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Add a single event to connect to the editing area - * - * @param string $event + * + * @param string $event * @return Zend_Dojo_Form_Element_Editor */ public function addCaptureEvent($event) @@ -61,8 +61,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Add multiple capture events - * - * @param array $events + * + * @param array $events * @return Zend_Dojo_Form_Element_Editor */ public function addCaptureEvents(array $events) @@ -75,8 +75,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Overwrite many capture events at once - * - * @param array $events + * + * @param array $events * @return Zend_Dojo_Form_Element_Editor */ public function setCaptureEvents(array $events) @@ -88,7 +88,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Get all capture events - * + * * @return array */ public function getCaptureEvents() @@ -101,7 +101,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Is a given capture event registered? - * + * * @param string $event * @return bool */ @@ -113,7 +113,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Remove a given capture event - * + * * @param string $event * @return Zend_Dojo_Form_Element_Editor */ @@ -131,7 +131,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Clear all capture events - * + * * @return Zend_Dojo_Form_Element_Editor */ public function clearCaptureEvents() @@ -141,8 +141,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Add a single event to the dijit - * - * @param string $event + * + * @param string $event * @return Zend_Dojo_Form_Element_Editor */ public function addEvent($event) @@ -160,8 +160,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Add multiple events - * - * @param array $events + * + * @param array $events * @return Zend_Dojo_Form_Element_Editor */ public function addEvents(array $events) @@ -174,8 +174,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Overwrite many events at once - * - * @param array $events + * + * @param array $events * @return Zend_Dojo_Form_Element_Editor */ public function setEvents(array $events) @@ -187,7 +187,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Get all events - * + * * @return array */ public function getEvents() @@ -200,7 +200,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Is a given event registered? - * + * * @param string $event * @return bool */ @@ -212,7 +212,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Remove a given event - * + * * @param string $event * @return Zend_Dojo_Form_Element_Editor */ @@ -229,7 +229,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Clear all events - * + * * @return Zend_Dojo_Form_Element_Editor */ public function clearEvents() @@ -239,8 +239,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Add a single editor plugin - * - * @param string $plugin + * + * @param string $plugin * @return Zend_Dojo_Form_Element_Editor */ public function addPlugin($plugin) @@ -258,8 +258,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Add multiple plugins - * - * @param array $plugins + * + * @param array $plugins * @return Zend_Dojo_Form_Element_Editor */ public function addPlugins(array $plugins) @@ -272,8 +272,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Overwrite many plugins at once - * - * @param array $plugins + * + * @param array $plugins * @return Zend_Dojo_Form_Element_Editor */ public function setPlugins(array $plugins) @@ -285,7 +285,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Get all plugins - * + * * @return array */ public function getPlugins() @@ -298,7 +298,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Is a given plugin registered? - * + * * @param string $plugin * @return bool */ @@ -310,7 +310,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Remove a given plugin - * + * * @param string $plugin * @return Zend_Dojo_Form_Element_Editor */ @@ -327,7 +327,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Clear all plugins - * + * * @return Zend_Dojo_Form_Element_Editor */ public function clearPlugins() @@ -337,8 +337,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Set edit action interval - * - * @param int $interval + * + * @param int $interval * @return Zend_Dojo_Form_Element_Editor */ public function setEditActionInterval($interval) @@ -348,7 +348,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Get edit action interval; defaults to 3 - * + * * @return int */ public function getEditActionInterval() @@ -361,8 +361,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Set focus on load flag - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Dojo_Form_Element_Editor */ public function setFocusOnLoad($flag) @@ -372,7 +372,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Retrieve focus on load flag - * + * * @return bool */ public function getFocusOnLoad() @@ -385,8 +385,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Set editor height - * - * @param string|int $height + * + * @param string|int $height * @return Zend_Dojo_Form_Element_Editor */ public function setHeight($height) @@ -403,7 +403,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Retrieve height - * + * * @return string */ public function getHeight() @@ -416,8 +416,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Set whether or not to inherit parent's width - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Dojo_Form_Element_Editor */ public function setInheritWidth($flag) @@ -427,7 +427,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Whether or not to inherit the parent's width - * + * * @return bool */ public function getInheritWidth() @@ -440,8 +440,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Set minimum height of editor - * - * @param string|int $minHeight + * + * @param string|int $minHeight * @return Zend_Dojo_Form_Element_Editor */ public function setMinHeight($minHeight) @@ -458,7 +458,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Get minimum height of editor - * + * * @return string */ public function getMinHeight() @@ -471,8 +471,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Add a custom stylesheet - * - * @param string $styleSheet + * + * @param string $styleSheet * @return Zend_Dojo_Form_Element_Editor */ public function addStyleSheet($styleSheet) @@ -493,8 +493,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Add multiple custom stylesheets - * - * @param array $styleSheets + * + * @param array $styleSheets * @return Zend_Dojo_Form_Element_Editor */ public function addStyleSheets(array $styleSheets) @@ -507,8 +507,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Overwrite all stylesheets - * - * @param array $styleSheets + * + * @param array $styleSheets * @return Zend_Dojo_Form_Element_Editor */ public function setStyleSheets(array $styleSheets) @@ -519,7 +519,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Get all stylesheets - * + * * @return string */ public function getStyleSheets() @@ -532,8 +532,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Is a given stylesheet registered? - * - * @param string $styleSheet + * + * @param string $styleSheet * @return bool */ public function hasStyleSheet($styleSheet) @@ -545,8 +545,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Remove a single stylesheet - * - * @param string $styleSheet + * + * @param string $styleSheet * @return Zend_Dojo_Form_Element_Editor */ public function removeStyleSheet($styleSheet) @@ -562,7 +562,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Clear all stylesheets - * + * * @return Zend_Dojo_Form_Element_Editor */ public function clearStyleSheets() @@ -575,8 +575,8 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Set update interval - * - * @param int $interval + * + * @param int $interval * @return Zend_Dojo_Form_Element_Editor */ public function setUpdateInterval($interval) @@ -586,7 +586,7 @@ class Zend_Dojo_Form_Element_Editor extends Zend_Dojo_Form_Element_Dijit /** * Get update interval - * + * * @return int */ public function getUpdateInterval() diff --git a/libs/Zend/Dojo/Form/Element/FilteringSelect.php b/libs/Zend/Dojo/Form/Element/FilteringSelect.php index fb4786b..1317f94 100644 --- a/libs/Zend/Dojo/Form/Element/FilteringSelect.php +++ b/libs/Zend/Dojo/Form/Element/FilteringSelect.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/ComboBox.php'; /** * FilteringSelect dijit - * + * * @uses Zend_Dojo_Form_Element_ComboBox * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FilteringSelect.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: FilteringSelect.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_FilteringSelect extends Zend_Dojo_Form_Element_ComboBox { diff --git a/libs/Zend/Dojo/Form/Element/HorizontalSlider.php b/libs/Zend/Dojo/Form/Element/HorizontalSlider.php index be53e79..ca421db 100644 --- a/libs/Zend/Dojo/Form/Element/HorizontalSlider.php +++ b/libs/Zend/Dojo/Form/Element/HorizontalSlider.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/Slider.php'; /** * HorizontalSlider dijit - * + * * @uses Zend_Dojo_Form_Element_Slider * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HorizontalSlider.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: HorizontalSlider.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Slider { @@ -42,7 +42,7 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Get top decoration data - * + * * @return array */ public function getTopDecoration() @@ -55,8 +55,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set dijit to use with top decoration - * - * @param mixed $dijit + * + * @param mixed $dijit * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setTopDecorationDijit($dijit) @@ -69,8 +69,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set container to use with top decoration - * - * @param mixed $container + * + * @param mixed $container * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setTopDecorationContainer($container) @@ -83,8 +83,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set labels to use with top decoration - * - * @param array $labels + * + * @param array $labels * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setTopDecorationLabels(array $labels) @@ -97,8 +97,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set params to use with top decoration - * - * @param array $params + * + * @param array $params * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setTopDecorationParams(array $params) @@ -111,8 +111,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set attribs to use with top decoration - * - * @param array $attribs + * + * @param array $attribs * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setTopDecorationAttribs(array $attribs) @@ -125,7 +125,7 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Get bottom decoration data - * + * * @return array */ public function getBottomDecoration() @@ -138,8 +138,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set dijit to use with bottom decoration - * - * @param mixed $dijit + * + * @param mixed $dijit * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setBottomDecorationDijit($dijit) @@ -152,8 +152,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set container to use with bottom decoration - * - * @param mixed $container + * + * @param mixed $container * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setBottomDecorationContainer($container) @@ -166,8 +166,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set labels to use with bottom decoration - * - * @param array $labels + * + * @param array $labels * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setBottomDecorationLabels(array $labels) @@ -180,8 +180,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set params to use with bottom decoration - * - * @param array $params + * + * @param array $params * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setBottomDecorationParams(array $params) @@ -194,8 +194,8 @@ class Zend_Dojo_Form_Element_HorizontalSlider extends Zend_Dojo_Form_Element_Sli /** * Set attribs to use with bottom decoration - * - * @param array $attribs + * + * @param array $attribs * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setBottomDecorationAttribs(array $attribs) diff --git a/libs/Zend/Dojo/Form/Element/NumberSpinner.php b/libs/Zend/Dojo/Form/Element/NumberSpinner.php index f8431c8..5b5723d 100644 --- a/libs/Zend/Dojo/Form/Element/NumberSpinner.php +++ b/libs/Zend/Dojo/Form/Element/NumberSpinner.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/ValidationTextBox.php'; /** * NumberSpinner dijit - * + * * @uses Zend_Dojo_Form_Element_ValidationTextBox * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: NumberSpinner.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: NumberSpinner.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_NumberSpinner extends Zend_Dojo_Form_Element_ValidationTextBox { @@ -177,8 +177,8 @@ class Zend_Dojo_Form_Element_NumberSpinner extends Zend_Dojo_Form_Element_Valida /** * Set minimum value - * - * @param int $value + * + * @param int $value * @return Zend_Dojo_Form_Element_NumberSpinner */ public function setMin($value) @@ -194,7 +194,7 @@ class Zend_Dojo_Form_Element_NumberSpinner extends Zend_Dojo_Form_Element_Valida /** * Get minimum value - * + * * @return null|int */ public function getMin() @@ -211,8 +211,8 @@ class Zend_Dojo_Form_Element_NumberSpinner extends Zend_Dojo_Form_Element_Valida /** * Set maximum value - * - * @param int $value + * + * @param int $value * @return Zend_Dojo_Form_Element_NumberSpinner */ public function setMax($value) @@ -228,7 +228,7 @@ class Zend_Dojo_Form_Element_NumberSpinner extends Zend_Dojo_Form_Element_Valida /** * Get maximum value - * + * * @return null|int */ public function getMax() diff --git a/libs/Zend/Dojo/Form/Element/NumberTextBox.php b/libs/Zend/Dojo/Form/Element/NumberTextBox.php index 643a286..16ae6d1 100644 --- a/libs/Zend/Dojo/Form/Element/NumberTextBox.php +++ b/libs/Zend/Dojo/Form/Element/NumberTextBox.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/ValidationTextBox.php'; /** * NumberTextBox dijit - * + * * @uses Zend_Dojo_Form_Element_ValidationTextBox * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: NumberTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: NumberTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_NumberTextBox extends Zend_Dojo_Form_Element_ValidationTextBox { diff --git a/libs/Zend/Dojo/Form/Element/PasswordTextBox.php b/libs/Zend/Dojo/Form/Element/PasswordTextBox.php index 2c857ed..c25307f 100644 --- a/libs/Zend/Dojo/Form/Element/PasswordTextBox.php +++ b/libs/Zend/Dojo/Form/Element/PasswordTextBox.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/ValidationTextBox.php'; /** * ValidationTextBox dijit tied to password input - * + * * @uses Zend_Dojo_Form_Element_ValidationTextBox * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PasswordTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: PasswordTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_PasswordTextBox extends Zend_Dojo_Form_Element_ValidationTextBox { diff --git a/libs/Zend/Dojo/Form/Element/RadioButton.php b/libs/Zend/Dojo/Form/Element/RadioButton.php index 4614c1d..7fad0ef 100644 --- a/libs/Zend/Dojo/Form/Element/RadioButton.php +++ b/libs/Zend/Dojo/Form/Element/RadioButton.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/DijitMulti.php'; /** * RadioButton dijit - * + * * @uses Zend_Dojo_Form_Element_DijitMulti * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: RadioButton.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: RadioButton.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_RadioButton extends Zend_Dojo_Form_Element_DijitMulti { diff --git a/libs/Zend/Dojo/Form/Element/SimpleTextarea.php b/libs/Zend/Dojo/Form/Element/SimpleTextarea.php index 76da6d6..ab51e93 100644 --- a/libs/Zend/Dojo/Form/Element/SimpleTextarea.php +++ b/libs/Zend/Dojo/Form/Element/SimpleTextarea.php @@ -24,14 +24,14 @@ require_once 'Zend/Dojo/Form/Element/Dijit.php'; /** * dijit.form.SimpleTextArea - * + * * @uses Zend_Dojo_Form_Element_Dijit * @category Zend * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SimpleTextarea.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SimpleTextarea.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_SimpleTextarea extends Zend_Dojo_Form_Element_Dijit { diff --git a/libs/Zend/Dojo/Form/Element/Slider.php b/libs/Zend/Dojo/Form/Element/Slider.php index d15368b..181a1b1 100644 --- a/libs/Zend/Dojo/Form/Element/Slider.php +++ b/libs/Zend/Dojo/Form/Element/Slider.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/Dijit.php'; /** * Abstract Slider dijit - * + * * @uses Zend_Dojo_Form_Element_Dijit * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Slider.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Slider.php 18951 2009-11-12 16:26:19Z alexander $ */ abstract class Zend_Dojo_Form_Element_Slider extends Zend_Dojo_Form_Element_Dijit { diff --git a/libs/Zend/Dojo/Form/Element/SubmitButton.php b/libs/Zend/Dojo/Form/Element/SubmitButton.php index d94b1b9..2640d07 100644 --- a/libs/Zend/Dojo/Form/Element/SubmitButton.php +++ b/libs/Zend/Dojo/Form/Element/SubmitButton.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/Button.php'; /** * Submit button dijit - * + * * @category Zend * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SubmitButton.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: SubmitButton.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_SubmitButton extends Zend_Dojo_Form_Element_Button { diff --git a/libs/Zend/Dojo/Form/Element/TextBox.php b/libs/Zend/Dojo/Form/Element/TextBox.php index b3a9077..3602043 100644 --- a/libs/Zend/Dojo/Form/Element/TextBox.php +++ b/libs/Zend/Dojo/Form/Element/TextBox.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/Dijit.php'; /** * TextBox dijit - * + * * @category Zend * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: TextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_TextBox extends Zend_Dojo_Form_Element_Dijit { diff --git a/libs/Zend/Dojo/Form/Element/Textarea.php b/libs/Zend/Dojo/Form/Element/Textarea.php index 3ad2194..e2252ec 100644 --- a/libs/Zend/Dojo/Form/Element/Textarea.php +++ b/libs/Zend/Dojo/Form/Element/Textarea.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/Dijit.php'; /** * Textarea dijit - * + * * @category Zend * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Textarea.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Textarea.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_Textarea extends Zend_Dojo_Form_Element_Dijit { diff --git a/libs/Zend/Dojo/Form/Element/TimeTextBox.php b/libs/Zend/Dojo/Form/Element/TimeTextBox.php index 2acc602..32a2784 100644 --- a/libs/Zend/Dojo/Form/Element/TimeTextBox.php +++ b/libs/Zend/Dojo/Form/Element/TimeTextBox.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/DateTextBox.php'; /** * TimeTextBox dijit - * + * * @uses Zend_Dojo_Form_Element_DateTextBox * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TimeTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: TimeTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_TimeTextBox extends Zend_Dojo_Form_Element_DateTextBox { @@ -42,8 +42,8 @@ class Zend_Dojo_Form_Element_TimeTextBox extends Zend_Dojo_Form_Element_DateText /** * Validate ISO 8601 time format - * - * @param string $format + * + * @param string $format * @return true * @throws Zend_Form_Element_Exception */ diff --git a/libs/Zend/Dojo/Form/Element/ValidationTextBox.php b/libs/Zend/Dojo/Form/Element/ValidationTextBox.php index 8e1c24c..f0c1685 100644 --- a/libs/Zend/Dojo/Form/Element/ValidationTextBox.php +++ b/libs/Zend/Dojo/Form/Element/ValidationTextBox.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/TextBox.php'; /** * ValidationTextBox dijit - * + * * @uses Zend_Dojo_Form_Element_TextBox * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ValidationTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: ValidationTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_TextBox { @@ -108,9 +108,9 @@ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_Te /** * Set an individual constraint - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return Zend_Dojo_Form_Element_ValidationTextBox */ public function setConstraint($key, $value) @@ -124,10 +124,10 @@ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_Te /** * Set validation constraints * - * Refer to Dojo dijit.form.ValidationTextBox documentation for valid + * Refer to Dojo dijit.form.ValidationTextBox documentation for valid * structure. - * - * @param array $constraints + * + * @param array $constraints * @return Zend_Dojo_Form_Element_ValidationTextBox */ public function setConstraints(array $constraints) @@ -139,8 +139,8 @@ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_Te /** * Is the given constraint set? - * - * @param string $key + * + * @param string $key * @return bool */ public function hasConstraint($key) @@ -151,8 +151,8 @@ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_Te /** * Get an individual constraint - * - * @param string $key + * + * @param string $key * @return mixed */ public function getConstraint($key) @@ -166,7 +166,7 @@ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_Te /** * Get constraints - * + * * @return array */ public function getConstraints() @@ -179,8 +179,8 @@ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_Te /** * Remove a single constraint - * - * @param string $key + * + * @param string $key * @return Zend_Dojo_Form_Element_ValidationTextBox */ public function removeConstraint($key) @@ -194,7 +194,7 @@ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_Te /** * Clear all constraints - * + * * @return Zend_Dojo_Form_Element_ValidationTextBox */ public function clearConstraints() @@ -204,9 +204,9 @@ class Zend_Dojo_Form_Element_ValidationTextBox extends Zend_Dojo_Form_Element_Te /** * Cast a boolean value to a string - * - * @param mixed $item - * @param string $key + * + * @param mixed $item + * @param string $key * @return void */ protected function _castBoolToString(&$item, $key) diff --git a/libs/Zend/Dojo/Form/Element/VerticalSlider.php b/libs/Zend/Dojo/Form/Element/VerticalSlider.php index bc1462b..fc9d99a 100644 --- a/libs/Zend/Dojo/Form/Element/VerticalSlider.php +++ b/libs/Zend/Dojo/Form/Element/VerticalSlider.php @@ -24,13 +24,13 @@ require_once 'Zend/Dojo/Form/Element/Slider.php'; /** * VerticalSlider dijit - * + * * @uses Zend_Dojo_Form_Element_Slider * @package Zend_Dojo * @subpackage Form_Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: VerticalSlider.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: VerticalSlider.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slider { @@ -42,7 +42,7 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Get left decoration data - * + * * @return array */ public function getLeftDecoration() @@ -55,8 +55,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set dijit to use with left decoration - * - * @param mixed $dijit + * + * @param mixed $dijit * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setLeftDecorationDijit($dijit) @@ -69,8 +69,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set container to use with left decoration - * - * @param mixed $container + * + * @param mixed $container * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setLeftDecorationContainer($container) @@ -83,8 +83,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set labels to use with left decoration - * - * @param array $labels + * + * @param array $labels * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setLeftDecorationLabels(array $labels) @@ -97,8 +97,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set params to use with left decoration - * - * @param array $params + * + * @param array $params * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setLeftDecorationParams(array $params) @@ -111,8 +111,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set attribs to use with left decoration - * - * @param array $attribs + * + * @param array $attribs * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setLeftDecorationAttribs(array $attribs) @@ -125,7 +125,7 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Get right decoration data - * + * * @return array */ public function getRightDecoration() @@ -138,8 +138,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set dijit to use with right decoration - * - * @param mixed $dijit + * + * @param mixed $dijit * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setRightDecorationDijit($dijit) @@ -152,8 +152,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set container to use with right decoration - * - * @param mixed $container + * + * @param mixed $container * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setRightDecorationContainer($container) @@ -166,8 +166,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set labels to use with right decoration - * - * @param array $labels + * + * @param array $labels * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setRightDecorationLabels(array $labels) @@ -180,8 +180,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set params to use with right decoration - * - * @param array $params + * + * @param array $params * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setRightDecorationParams(array $params) @@ -194,8 +194,8 @@ class Zend_Dojo_Form_Element_VerticalSlider extends Zend_Dojo_Form_Element_Slide /** * Set attribs to use with right decoration - * - * @param array $attribs + * + * @param array $attribs * @return Zend_Dojo_Form_Element_HorizontalSlider */ public function setRightDecorationAttribs(array $attribs) diff --git a/libs/Zend/Dojo/Form/SubForm.php b/libs/Zend/Dojo/Form/SubForm.php index 53726f1..03f24ae 100644 --- a/libs/Zend/Dojo/Form/SubForm.php +++ b/libs/Zend/Dojo/Form/SubForm.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/SubForm.php'; /** * Dijit-enabled SubForm - * + * * @uses Zend_Form_SubForm * @package Zend_Dojo * @subpackage Form * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SubForm.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: SubForm.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_Form_SubForm extends Zend_Form_SubForm { @@ -42,8 +42,8 @@ class Zend_Dojo_Form_SubForm extends Zend_Form_SubForm /** * Constructor - * - * @param array|Zend_Config|null $options + * + * @param array|Zend_Config|null $options * @return void */ public function __construct($options = null) @@ -58,7 +58,7 @@ class Zend_Dojo_Form_SubForm extends Zend_Form_SubForm /** * Load the default decorators - * + * * @return void */ public function loadDefaultDecorators() @@ -76,8 +76,8 @@ class Zend_Dojo_Form_SubForm extends Zend_Form_SubForm } /** - * Get view - * + * Get view + * * @return Zend_View_Interface */ public function getView() diff --git a/libs/Zend/Dojo/View/Helper/AccordionContainer.php b/libs/Zend/Dojo/View/Helper/AccordionContainer.php index 219611f..87cb0aa 100644 --- a/libs/Zend/Dojo/View/Helper/AccordionContainer.php +++ b/libs/Zend/Dojo/View/Helper/AccordionContainer.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AccordionContainer.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: AccordionContainer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_DijitContainer */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/DijitContainer.php'; /** * Dojo AccordionContainer dijit - * + * * @uses Zend_Dojo_View_Helper_DijitContainer * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_AccordionContainer extends Zend_Dojo_View_Helper_Dij /** * dijit.layout.AccordionContainer - * - * @param string $id - * @param string $content + * + * @param string $id + * @param string $content * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/AccordionPane.php b/libs/Zend/Dojo/View/Helper/AccordionPane.php index 51ac298..4036fd4 100644 --- a/libs/Zend/Dojo/View/Helper/AccordionPane.php +++ b/libs/Zend/Dojo/View/Helper/AccordionPane.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AccordionPane.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: AccordionPane.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_DijitContainer */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/DijitContainer.php'; /** * Dojo AccordionPane dijit - * + * * @uses Zend_Dojo_View_Helper_DijitContainer * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_AccordionPane extends Zend_Dojo_View_Helper_DijitCon /** * dijit.layout.AccordionPane - * - * @param int $id - * @param string $content + * + * @param int $id + * @param string $content * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/BorderContainer.php b/libs/Zend/Dojo/View/Helper/BorderContainer.php index 0699dfe..528f6c6 100644 --- a/libs/Zend/Dojo/View/Helper/BorderContainer.php +++ b/libs/Zend/Dojo/View/Helper/BorderContainer.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: BorderContainer.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: BorderContainer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_DijitContainer */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/DijitContainer.php'; /** * Dojo BorderContainer dijit - * + * * @uses Zend_Dojo_View_Helper_DijitContainer * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_BorderContainer extends Zend_Dojo_View_Helper_DijitC /** * dijit.layout.BorderContainer - * - * @param string $id - * @param string $content + * + * @param string $id + * @param string $content * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/Button.php b/libs/Zend/Dojo/View/Helper/Button.php index 8b29c76..01084c8 100644 --- a/libs/Zend/Dojo/View/Helper/Button.php +++ b/libs/Zend/Dojo/View/Helper/Button.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Button.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Button.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo Button dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -48,14 +48,14 @@ class Zend_Dojo_View_Helper_Button extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.Button - * - * @param string $id - * @param string $value + * + * @param string $id + * @param string $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string */ - public function button($id, $value = null, array $params = array(), array $attribs = array()) + public function button($id, $value = null, array $params = array(), array $attribs = array()) { $attribs['name'] = $id; if (!array_key_exists('id', $attribs)) { diff --git a/libs/Zend/Dojo/View/Helper/CheckBox.php b/libs/Zend/Dojo/View/Helper/CheckBox.php index 6f42a66..7fb38d2 100644 --- a/libs/Zend/Dojo/View/Helper/CheckBox.php +++ b/libs/Zend/Dojo/View/Helper/CheckBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CheckBox.php 17716 2009-08-21 15:08:31Z matthew $ + * @version $Id: CheckBox.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo CheckBox dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_CheckBox extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.CheckBox - * - * @param int $id - * @param string $content + * + * @param int $id + * @param string $content * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @param array $checkedOptions Should contain either two items, or the keys checkedValue and uncheckedValue diff --git a/libs/Zend/Dojo/View/Helper/ComboBox.php b/libs/Zend/Dojo/View/Helper/ComboBox.php index 0fad206..2a7111d 100644 --- a/libs/Zend/Dojo/View/Helper/ComboBox.php +++ b/libs/Zend/Dojo/View/Helper/ComboBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ComboBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: ComboBox.php 19058 2009-11-19 19:57:17Z matthew $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo ComboBox dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_ComboBox extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.ComboBox - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @param array|null $options Select options @@ -72,9 +72,6 @@ class Zend_Dojo_View_Helper_ComboBox extends Zend_Dojo_View_Helper_Dijit // using dojo.data datastore if (false !== ($store = $this->_renderStore($params['store'], $id))) { $params['store'] = $params['store']['store']; - if ($this->_useProgrammatic()) { - unset($params['store']); - } if (is_string($store)) { $html .= $store; } @@ -99,9 +96,6 @@ class Zend_Dojo_View_Helper_ComboBox extends Zend_Dojo_View_Helper_Dijit } } } - if ($this->_useProgrammatic()) { - unset($params['store']); - } $html .= $this->_createFormElement($id, $value, $params, $attribs); return $html; } @@ -115,8 +109,8 @@ class Zend_Dojo_View_Helper_ComboBox extends Zend_Dojo_View_Helper_Dijit * Render data store element * * Renders to dojo view helper - * - * @param array $params + * + * @param array $params * @return string|false */ protected function _renderStore(array $params, $id) @@ -141,14 +135,13 @@ class Zend_Dojo_View_Helper_ComboBox extends Zend_Dojo_View_Helper_Dijit if ($this->_useProgrammatic()) { if (!$this->_useProgrammaticNoScript()) { require_once 'Zend/Json.php'; - $js = 'var ' . $storeParams['jsId'] . ' = ' + $this->dojo->addJavascript('var ' . $storeParams['jsId'] . ";\n"); + $js = $storeParams['jsId'] . ' = ' . 'new ' . $storeParams['dojoType'] . '(' . Zend_Json::encode($extraParams) - . ");\n" - . 'dijit.byId("' . $id . '").attr("store", ' - . $storeParams['jsId'] . ');'; + . ");\n"; $js = "function() {\n$js\n}"; - $this->dojo->prependOnLoad($js); + $this->dojo->_addZendLoad($js); } return true; } diff --git a/libs/Zend/Dojo/View/Helper/ContentPane.php b/libs/Zend/Dojo/View/Helper/ContentPane.php index e358dd7..99c19fd 100644 --- a/libs/Zend/Dojo/View/Helper/ContentPane.php +++ b/libs/Zend/Dojo/View/Helper/ContentPane.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ContentPane.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: ContentPane.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_DijitContainer */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/DijitContainer.php'; /** * Dojo ContentPane dijit - * + * * @uses Zend_Dojo_View_Helper_DijitContainer * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_ContentPane extends Zend_Dojo_View_Helper_DijitConta /** * dijit.layout.ContentPane - * - * @param string $id - * @param string $content + * + * @param string $id + * @param string $content * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/CurrencyTextBox.php b/libs/Zend/Dojo/View/Helper/CurrencyTextBox.php index 5377bc3..d7c3dc9 100644 --- a/libs/Zend/Dojo/View/Helper/CurrencyTextBox.php +++ b/libs/Zend/Dojo/View/Helper/CurrencyTextBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CurrencyTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: CurrencyTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo CurrencyTextBox dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_CurrencyTextBox extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.CurrencyTextBox - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/CustomDijit.php b/libs/Zend/Dojo/View/Helper/CustomDijit.php index eaabdde..e2a6623 100644 --- a/libs/Zend/Dojo/View/Helper/CustomDijit.php +++ b/libs/Zend/Dojo/View/Helper/CustomDijit.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CustomDijit.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CustomDijit.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_DijitContainer */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/DijitContainer.php'; /** * Arbitrary dijit support - * + * * @uses Zend_Dojo_View_Helper_DijitContainer * @package Zend_Dojo * @subpackage View @@ -43,13 +43,13 @@ class Zend_Dojo_View_Helper_CustomDijit extends Zend_Dojo_View_Helper_DijitConta /** * Render a custom dijit * - * Requires that either the {@link $_defaultDojotype} property is set, or + * Requires that either the {@link $_defaultDojotype} property is set, or * that you pass a value to the "dojoType" key of the $params argument. - * - * @param string $id - * @param string $value - * @param array $params - * @param array $attribs + * + * @param string $id + * @param string $value + * @param array $params + * @param array $attribs * @return string|Zend_Dojo_View_Helper_CustomDijit */ public function customDijit($id = null, $value = null, array $params = array(), array $attribs = array()) @@ -58,7 +58,7 @@ class Zend_Dojo_View_Helper_CustomDijit extends Zend_Dojo_View_Helper_DijitConta return $this; } - if (!array_key_exists('dojoType', $params) + if (!array_key_exists('dojoType', $params) && (null === $this->_defaultDojoType) ) { require_once 'Zend/Dojo/View/Exception.php'; @@ -72,23 +72,28 @@ class Zend_Dojo_View_Helper_CustomDijit extends Zend_Dojo_View_Helper_DijitConta $this->_module = $this->_defaultDojoType; } + if (array_key_exists('rootNode', $params)) { + $this->setRootNode($params['rootNode']); + unset($params['rootNode']); + } + return $this->_createLayoutContainer($id, $value, $params, $attribs); } /** * Begin capturing content. - * - * Requires that either the {@link $_defaultDojotype} property is set, or + * + * Requires that either the {@link $_defaultDojotype} property is set, or * that you pass a value to the "dojoType" key of the $params argument. - * - * @param string $id - * @param array $params - * @param array $attribs + * + * @param string $id + * @param array $params + * @param array $attribs * @return void */ public function captureStart($id, array $params = array(), array $attribs = array()) { - if (!array_key_exists('dojoType', $params) + if (!array_key_exists('dojoType', $params) && (null === $this->_defaultDojoType) ) { require_once 'Zend/Dojo/View/Exception.php'; diff --git a/libs/Zend/Dojo/View/Helper/DateTextBox.php b/libs/Zend/Dojo/View/Helper/DateTextBox.php index 0aff2e3..adaa17e 100644 --- a/libs/Zend/Dojo/View/Helper/DateTextBox.php +++ b/libs/Zend/Dojo/View/Helper/DateTextBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DateTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: DateTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo DateTextBox dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_DateTextBox extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.DateTextBox - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/Dijit.php b/libs/Zend/Dojo/View/Helper/Dijit.php index 66a35ef..2372a41 100644 --- a/libs/Zend/Dojo/View/Helper/Dijit.php +++ b/libs/Zend/Dojo/View/Helper/Dijit.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Dijit.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Dijit.php 19108 2009-11-20 17:19:44Z matthew $ */ /** Zend_View_Helper_HtmlElement */ @@ -25,7 +25,7 @@ require_once 'Zend/View/Helper/HtmlElement.php'; /** * Dojo dijit base class - * + * * @uses Zend_View_Helper_Abstract * @package Zend_Dojo * @subpackage View @@ -63,12 +63,18 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement */ protected $_module; + /** + * Root node element type for layout elements + * @var string + */ + protected $_rootNode = 'div'; + /** * Set view * * Set view and enable dojo - * - * @param Zend_View_Interface $view + * + * @param Zend_View_Interface $view * @return Zend_Dojo_View_Helper_Dijit */ public function setView(Zend_View_Interface $view) @@ -79,9 +85,32 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement return $this; } + + /** + * Get root node type + * + * @return string + */ + public function getRootNode() + { + return $this->_rootNode; + } + + /** + * Set root node type + * + * @param string $value + * @return Zend_Dojo_View_Helper_Dijit + */ + public function setRootNode($value) + { + $this->_rootNode = $value; + return $this; + } + /** * Whether or not to use declarative dijit creation - * + * * @return bool */ protected function _useDeclarative() @@ -91,7 +120,7 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement /** * Whether or not to use programmatic dijit creation - * + * * @return bool */ protected function _useProgrammatic() @@ -101,7 +130,7 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement /** * Whether or not to use programmatic dijit creation w/o script creation - * + * * @return bool */ protected function _useProgrammaticNoScript() @@ -111,34 +140,35 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement /** * Create a layout container - * - * @param int $id - * @param string $content - * @param array $params - * @param array $attribs - * @param string|null $dijit + * + * @param int $id + * @param string $content + * @param array $params + * @param array $attribs + * @param string|null $dijit * @return string */ protected function _createLayoutContainer($id, $content, array $params, array $attribs, $dijit = null) { $attribs['id'] = $id; $attribs = $this->_prepareDijit($attribs, $params, 'layout', $dijit); - - $html = '_htmlAttribs($attribs) . '>' + + $nodeType = $this->getRootNode(); + $html = '<' . $nodeType . $this->_htmlAttribs($attribs) . '>' . $content - . "\n"; + . "\n"; return $html; } /** * Create HTML representation of a dijit form element - * - * @param string $id - * @param string $value - * @param array $params - * @param array $attribs - * @param string|null $dijit + * + * @param string $id + * @param string $value + * @param array $params + * @param array $attribs + * @param string|null $dijit * @return string */ public function _createFormElement($id, $value, array $params, array $attribs, $dijit = null) @@ -152,8 +182,8 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement $attribs = $this->_prepareDijit($attribs, $params, 'element', $dijit); - $html = '_htmlAttribs($attribs) + $html = '_htmlAttribs($attribs) . $this->getClosingBracket(); return $html; } @@ -162,10 +192,10 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement * Merge attributes and parameters * * Also sets up requires - * - * @param array $attribs - * @param array $params - * @param string $type + * + * @param array $attribs + * @param array $params + * @param string $type * @param string $dijit Dijit type to use (otherwise, pull from $_dijit) * @return array */ @@ -230,6 +260,9 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement $dijit = (null === $dijit) ? $this->_dijit : $dijit; if ($this->_useDeclarative()) { $attribs = array_merge($attribs, $params); + if (isset($attribs['required'])) { + $attribs['required'] = ($attribs['required']) ? 'true' : 'false'; + } $attribs['dojoType'] = $dijit; } elseif (!$this->_useProgrammaticNoScript()) { $this->_createDijit($dijit, $attribs['id'], $params); @@ -240,10 +273,10 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement /** * Create a dijit programmatically - * - * @param string $dijit - * @param string $id - * @param array $params + * + * @param string $dijit + * @param string $id + * @param array $params * @return void */ protected function _createDijit($dijit, $id, array $params) @@ -257,9 +290,9 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement /** * Cast a boolean to a string value - * - * @param mixed $item - * @param string $key + * + * @param mixed $item + * @param string $key * @return void */ protected function _castBoolToString(&$item, $key) @@ -272,9 +305,9 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement /** * Render a hidden element to hold a value - * - * @param string $id - * @param string|int|float $value + * + * @param string $id + * @param string|int|float $value * @return string */ protected function _renderHiddenElement($id, $value) @@ -289,7 +322,7 @@ abstract class Zend_Dojo_View_Helper_Dijit extends Zend_View_Helper_HtmlElement /** * Create JS function for retrieving parent form - * + * * @return void */ protected function _createGetParentFormFunction() diff --git a/libs/Zend/Dojo/View/Helper/DijitContainer.php b/libs/Zend/Dojo/View/Helper/DijitContainer.php index bb1c14a..71310f4 100644 --- a/libs/Zend/Dojo/View/Helper/DijitContainer.php +++ b/libs/Zend/Dojo/View/Helper/DijitContainer.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DijitContainer.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: DijitContainer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dijit layout container base class - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -48,10 +48,10 @@ abstract class Zend_Dojo_View_Helper_DijitContainer extends Zend_Dojo_View_Helpe /** * Begin capturing content for layout container - * - * @param string $id - * @param array $params - * @param array $attribs + * + * @param string $id + * @param array $params + * @param array $attribs * @return void */ public function captureStart($id, array $params = array(), array $attribs = array()) @@ -73,8 +73,8 @@ abstract class Zend_Dojo_View_Helper_DijitContainer extends Zend_Dojo_View_Helpe /** * Finish capturing content for layout container - * - * @param string $id + * + * @param string $id * @return string */ public function captureEnd($id) diff --git a/libs/Zend/Dojo/View/Helper/Dojo.php b/libs/Zend/Dojo/View/Helper/Dojo.php index a14825e..b2af6c0 100644 --- a/libs/Zend/Dojo/View/Helper/Dojo.php +++ b/libs/Zend/Dojo/View/Helper/Dojo.php @@ -16,7 +16,7 @@ * @package Zend_Dojo * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Dojo.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Dojo.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -26,16 +26,16 @@ require_once 'Zend/Registry.php'; /** * Zend_Dojo_View_Helper_Dojo: Dojo View Helper * - * Allows specifying stylesheets, path to dojo, module paths, and onLoad - * events. - * + * Allows specifying stylesheets, path to dojo, module paths, and onLoad + * events. + * * @package Zend_Dojo * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Dojo_View_Helper_Dojo -{ +class Zend_Dojo_View_Helper_Dojo +{ /**#@+ * @const Programmatic dijit creation style constants */ @@ -46,7 +46,7 @@ class Zend_Dojo_View_Helper_Dojo /** * @var Zend_View_Interface */ - public $view; + public $view; /** * @var Zend_Dojo_View_Helper_Dojo_Container @@ -61,9 +61,9 @@ class Zend_Dojo_View_Helper_Dojo /** * Initialize helper * - * Retrieve container from registry or create new container and store in + * Retrieve container from registry or create new container and store in * registry. - * + * * @return void */ public function __construct() @@ -79,8 +79,8 @@ class Zend_Dojo_View_Helper_Dojo /** * Set view object - * - * @param Zend_Dojo_View_Interface $view + * + * @param Zend_Dojo_View_Interface $view * @return void */ public function setView(Zend_View_Interface $view) @@ -91,7 +91,7 @@ class Zend_Dojo_View_Helper_Dojo /** * Return dojo container - * + * * @return Zend_Dojo_View_Helper_Dojo_Container */ public function dojo() @@ -101,9 +101,9 @@ class Zend_Dojo_View_Helper_Dojo /** * Proxy to container methods - * - * @param string $method - * @param array $args + * + * @param string $method + * @param array $args * @return mixed * @throws Zend_Dojo_View_Exception For invalid method calls */ @@ -119,7 +119,7 @@ class Zend_Dojo_View_Helper_Dojo /** * Set whether or not dijits should be created declaratively - * + * * @return void */ public static function setUseDeclarative() @@ -130,10 +130,10 @@ class Zend_Dojo_View_Helper_Dojo /** * Set whether or not dijits should be created programmatically * - * Optionally, specifiy whether or not dijit helpers should generate the + * Optionally, specifiy whether or not dijit helpers should generate the * programmatic dojo. - * - * @param int $style + * + * @param int $style * @return void */ public static function setUseProgrammatic($style = self::PROGRAMMATIC_SCRIPT) @@ -146,7 +146,7 @@ class Zend_Dojo_View_Helper_Dojo /** * Should dijits be created declaratively? - * + * * @return bool */ public static function useDeclarative() @@ -156,7 +156,7 @@ class Zend_Dojo_View_Helper_Dojo /** * Should dijits be created programmatically? - * + * * @return bool */ public static function useProgrammatic() @@ -166,7 +166,7 @@ class Zend_Dojo_View_Helper_Dojo /** * Should dijits be created programmatically but without scripts? - * + * * @return bool */ public static function useProgrammaticNoScript() diff --git a/libs/Zend/Dojo/View/Helper/Dojo/Container.php b/libs/Zend/Dojo/View/Helper/Dojo/Container.php index 52f88f8..2cfe3f6 100644 --- a/libs/Zend/Dojo/View/Helper/Dojo/Container.php +++ b/libs/Zend/Dojo/View/Helper/Dojo/Container.php @@ -16,7 +16,7 @@ * @package Zend_Dojo * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Container.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Container.php 19058 2009-11-19 19:57:17Z matthew $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -26,18 +26,18 @@ require_once 'Zend/Dojo.php'; /** * Container for Dojo View Helper * - * + * * @package Zend_Dojo * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Dojo_View_Helper_Dojo_Container -{ +{ /** * @var Zend_View_Interface */ - public $view; + public $view; /** * addOnLoad capture lock @@ -67,7 +67,7 @@ class Zend_Dojo_View_Helper_Dojo_Container * Dojo version to use from CDN * @var string */ - protected $_cdnVersion = '1.2.0'; + protected $_cdnVersion = '1.3.2'; /** * Has the dijit loader been registered? @@ -159,10 +159,16 @@ class Zend_Dojo_View_Helper_Dojo_Container */ protected $_stylesheets = array(); + /** + * Array of onLoad events specific to Zend_Dojo integration operations + * @var array + */ + protected $_zendLoadActions = array(); + /** * Set view object - * - * @param Zend_Dojo_View_Interface $view + * + * @param Zend_Dojo_View_Interface $view * @return void */ public function setView(Zend_View_Interface $view) @@ -172,7 +178,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Enable dojo - * + * * @return Zend_Dojo_View_Helper_Dojo_Container */ public function enable() @@ -183,7 +189,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Disable dojo - * + * * @return Zend_Dojo_View_Helper_Dojo_Container */ public function disable() @@ -194,18 +200,18 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Is dojo enabled? - * + * * @return bool */ public function isEnabled() { return $this->_enabled; } - + /** * Specify a module to require - * - * @param string $module + * + * @param string $module * @return Zend_Dojo_View_Helper_Dojo_Container */ public function requireModule($module) @@ -233,18 +239,18 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Retrieve list of modules to require - * + * * @return array */ public function getModules() { return $this->_modules; } - + /** * Register a module path - * - * @param string $path + * + * @param string $path * @return Zend_Dojo_View_Helper_Dojo_Container */ public function registerModulePath($module, $path) @@ -259,7 +265,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * List registered module paths - * + * * @return array */ public function getModulePaths() @@ -269,8 +275,8 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Add layer (custom build) path - * - * @param string $path + * + * @param string $path * @return Zend_Dojo_View_Helper_Dojo_Container */ public function addLayer($path) @@ -284,7 +290,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Get registered layers - * + * * @return array */ public function getLayers() @@ -294,8 +300,8 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Remove a registered layer - * - * @param string $path + * + * @param string $path * @return Zend_Dojo_View_Helper_Dojo_Container */ public function removeLayer($path) @@ -311,7 +317,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Clear all registered layers - * + * * @return Zend_Dojo_View_Helper_Dojo_Container */ public function clearLayers() @@ -322,8 +328,8 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Set CDN base path - * - * @param string $url + * + * @param string $url * @return Zend_Dojo_View_Helper_Dojo_Container */ public function setCdnBase($url) @@ -334,18 +340,18 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Return CDN base URL - * + * * @return string */ public function getCdnBase() { return $this->_cdnBase; } - + /** * Use CDN, using version specified - * - * @param string $version + * + * @param string $version * @return Zend_Dojo_View_Helper_Dojo_Container */ public function setCdnVersion($version = null) @@ -356,10 +362,10 @@ class Zend_Dojo_View_Helper_Dojo_Container } return $this; } - + /** * Get CDN version - * + * * @return string */ public function getCdnVersion() @@ -369,8 +375,8 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Set CDN path to dojo (relative to CDN base + version) - * - * @param string $path + * + * @param string $path * @return Zend_Dojo_View_Helper_Dojo_Container */ public function setCdnDojoPath($path) @@ -381,7 +387,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Get CDN path to dojo (relative to CDN base + version) - * + * * @return string */ public function getCdnDojoPath() @@ -391,18 +397,18 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Are we using the CDN? - * + * * @return bool */ public function useCdn() { return !$this->useLocalPath(); } - + /** * Set path to local dojo - * - * @param string $path + * + * @param string $path * @return Zend_Dojo_View_Helper_Dojo_Container */ public function setLocalPath($path) @@ -414,7 +420,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Get local path to dojo - * + * * @return string */ public function getLocalPath() @@ -424,19 +430,19 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Are we using a local path? - * + * * @return bool */ public function useLocalPath() { return (null === $this->_localPath) ? false : true; } - + /** * Set Dojo configuration - * - * @param string $option - * @param mixed $value + * + * @param string $option + * @param mixed $value * @return Zend_Dojo_View_Helper_Dojo_Container */ public function setDjConfig(array $config) @@ -447,9 +453,9 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Set Dojo configuration option - * - * @param string $option - * @param mixed $value + * + * @param string $option + * @param mixed $value * @return Zend_Dojo_View_Helper_Dojo_Container */ public function setDjConfigOption($option, $value) @@ -461,7 +467,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Retrieve dojo configuration values - * + * * @return array */ public function getDjConfig() @@ -471,9 +477,9 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Get dojo configuration value - * - * @param string $option - * @param mixed $default + * + * @param string $option + * @param mixed $default * @return mixed */ public function getDjConfigOption($option, $default = null) @@ -484,11 +490,11 @@ class Zend_Dojo_View_Helper_Dojo_Container } return $default; } - + /** * Add a stylesheet by module name - * - * @param string $module + * + * @param string $module * @return Zend_Dojo_View_Helper_Dojo_Container */ public function addStylesheetModule($module) @@ -506,18 +512,18 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Get all stylesheet modules currently registered - * + * * @return array */ public function getStylesheetModules() { return $this->_stylesheetModules; } - + /** * Add a stylesheet - * - * @param string $path + * + * @param string $path * @return Zend_Dojo_View_Helper_Dojo_Container */ public function addStylesheet($path) @@ -532,9 +538,9 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Register the dojo.css stylesheet? * - * With no arguments, returns the status of the flag; with arguments, sets + * With no arguments, returns the status of the flag; with arguments, sets * the flag and returns the object. - * + * * @param null|bool $flag * @return Zend_Dojo_View_Helper_Dojo_Container|bool */ @@ -550,7 +556,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Retrieve registered stylesheets - * + * * @return array */ public function getStylesheets() @@ -564,7 +570,7 @@ class Zend_Dojo_View_Helper_Dojo_Container * dojo.addOnLoad accepts: * - function name * - lambda - * + * * @param string $callback Lambda * @return Zend_Dojo_View_Helper_Dojo_Container */ @@ -578,7 +584,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Prepend an onLoad event to the list of onLoad actions - * + * * @param string $callback Lambda * @return Zend_Dojo_View_Helper_Dojo_Container */ @@ -592,7 +598,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Retrieve all registered onLoad actions - * + * * @return array */ public function getOnLoadActions() @@ -602,7 +608,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Start capturing routines to run onLoad - * + * * @return bool */ public function onLoadCaptureStart() @@ -619,7 +625,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Stop capturing routines to run onLoad - * + * * @return bool */ public function onLoadCaptureEnd() @@ -633,9 +639,9 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Add a programmatic dijit - * - * @param string $id - * @param array $params + * + * @param string $id + * @param array $params * @return Zend_Dojo_View_Helper_Dojo_Container */ public function addDijit($id, array $params) @@ -655,9 +661,9 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Set a programmatic dijit (overwrites) - * - * @param string $id - * @param array $params + * + * @param string $id + * @param array $params * @return Zend_Dojo_View_Helper_Dojo_Container */ public function setDijit($id, array $params) @@ -670,8 +676,8 @@ class Zend_Dojo_View_Helper_Dojo_Container * Add multiple dijits at once * * Expects an array of id => array $params pairs - * - * @param array $dijits + * + * @param array $dijits * @return Zend_Dojo_View_Helper_Dojo_Container */ public function addDijits(array $dijits) @@ -686,8 +692,8 @@ class Zend_Dojo_View_Helper_Dojo_Container * Set multiple dijits at once (overwrites) * * Expects an array of id => array $params pairs - * - * @param array $dijits + * + * @param array $dijits * @return Zend_Dojo_View_Helper_Dojo_Container */ public function setDijits(array $dijits) @@ -698,8 +704,8 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Is the given programmatic dijit already registered? - * - * @param string $id + * + * @param string $id * @return bool */ public function hasDijit($id) @@ -709,8 +715,8 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Retrieve a dijit by id - * - * @param string $id + * + * @param string $id * @return array|null */ public function getDijit($id) @@ -725,7 +731,7 @@ class Zend_Dojo_View_Helper_Dojo_Container * Retrieve all dijits * * Returns dijits as an array of assoc arrays - * + * * @return array */ public function getDijits() @@ -735,8 +741,8 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Remove a programmatic dijit if it exists - * - * @param string $id + * + * @param string $id * @return Zend_Dojo_View_Helper_Dojo_Container */ public function removeDijit($id) @@ -750,7 +756,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Clear all dijits - * + * * @return Zend_Dojo_View_Helper_Dojo_Container */ public function clearDijits() @@ -761,7 +767,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Render dijits as JSON structure - * + * * @return string */ public function dijitsToJson() @@ -772,7 +778,7 @@ class Zend_Dojo_View_Helper_Dojo_Container /** * Create dijit loader functionality - * + * * @return void */ public function registerDijitLoader() @@ -790,7 +796,7 @@ function() { } EOJ; $this->requireModule('dojo.parser'); - $this->prependOnLoad($js); + $this->_addZendLoad($js); $this->addJavascript('var zendDijits = ' . $this->dijitsToJson() . ';'); $this->_dijitLoaderRegistered = true; } @@ -798,8 +804,8 @@ EOJ; /** * Add arbitrary javascript to execute in dojo JS container - * - * @param string $js + * + * @param string $js * @return Zend_Dojo_View_Helper_Dojo_Container */ public function addJavascript($js) @@ -819,7 +825,7 @@ EOJ; /** * Return all registered javascript statements - * + * * @return array */ public function getJavascript() @@ -829,7 +835,7 @@ EOJ; /** * Clear arbitrary javascript stack - * + * * @return Zend_Dojo_View_Helper_Dojo_Container */ public function clearJavascript() @@ -840,7 +846,7 @@ EOJ; /** * Capture arbitrary javascript to include in dojo script - * + * * @return void */ public function javascriptCaptureStart() @@ -857,7 +863,7 @@ EOJ; /** * Finish capturing arbitrary javascript to include in dojo script - * + * * @return true */ public function javascriptCaptureEnd() @@ -871,7 +877,7 @@ EOJ; /** * String representation of dojo environment - * + * * @return string */ public function __toString() @@ -902,7 +908,7 @@ EOJ; /** * Retrieve local path to dojo resources for building relative paths - * + * * @return string */ protected function _getLocalRelativePath() @@ -917,7 +923,7 @@ EOJ; /** * Render dojo stylesheets - * + * * @return string */ protected function _renderStylesheets() @@ -962,7 +968,7 @@ EOJ; /** * Render DjConfig values - * + * * @return string */ protected function _renderDjConfig() @@ -985,10 +991,10 @@ EOJ; /** * Render dojo script tag * - * Renders Dojo script tag by utilizing either local path provided or the - * CDN. If any djConfig values were set, they will be serialized and passed + * Renders Dojo script tag by utilizing either local path provided or the + * CDN. If any djConfig values were set, they will be serialized and passed * with that attribute. - * + * * @return string */ protected function _renderDojoScriptTag() @@ -1007,7 +1013,7 @@ EOJ; /** * Render layers (custom builds) as script tags - * + * * @return string */ protected function _renderLayers() @@ -1030,7 +1036,7 @@ EOJ; /** * Render dojo module paths and requires - * + * * @return string */ protected function _renderExtras() @@ -1051,6 +1057,13 @@ EOJ; } $onLoadActions = array(); + // Get Zend specific onLoad actions; these will always be first to + // ensure that dijits are created in the correct order + foreach ($this->_getZendLoadActions() as $callback) { + $onLoadActions[] = 'dojo.addOnLoad(' . $callback . ');'; + } + + // Get all other onLoad actions foreach ($this->getOnLoadActions() as $callback) { $onLoadActions[] = 'dojo.addOnLoad(' . $callback . ');'; } @@ -1081,4 +1094,33 @@ EOJ; . PHP_EOL . ''; return $html; } + + /** + * Add an onLoad action related to ZF dijit creation + * + * This method is public, but prefixed with an underscore to indicate that + * it should not normally be called by userland code. It is pertinent to + * ensuring that the correct order of operations occurs during dijit + * creation. + * + * @param string $callback + * @return Zend_Dojo_View_Helper_Dojo_Container + */ + public function _addZendLoad($callback) + { + if (!in_array($callback, $this->_zendLoadActions, true)) { + $this->_zendLoadActions[] = $callback; + } + return $this; + } + + /** + * Retrieve all ZF dijit callbacks + * + * @return array + */ + public function _getZendLoadActions() + { + return $this->_zendLoadActions; + } } diff --git a/libs/Zend/Dojo/View/Helper/Editor.php b/libs/Zend/Dojo/View/Helper/Editor.php index 8c3ce77..7bda431 100644 --- a/libs/Zend/Dojo/View/Helper/Editor.php +++ b/libs/Zend/Dojo/View/Helper/Editor.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Editor.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Editor.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Textarea */ @@ -28,7 +28,7 @@ require_once 'Zend/Json.php'; /** * Dojo Editor dijit - * + * * @uses Zend_Dojo_View_Helper_Textarea * @package Zend_Dojo * @subpackage View @@ -47,6 +47,19 @@ class Zend_Dojo_View_Helper_Editor extends Zend_Dojo_View_Helper_Textarea */ protected $_module = 'dijit.Editor'; + /** + * @var array Maps non-core plugin to module basename + */ + protected $_pluginsModules = array( + 'createLink' => 'LinkDialog', + 'insertImage' => 'LinkDialog', + 'fontName' => 'FontChoice', + 'fontSize' => 'FontChoice', + 'formatBlock' => 'FontChoice', + 'foreColor' => 'TextColor', + 'hiliteColor' => 'TextColor' + ); + /** * JSON-encoded parameters * @var array @@ -55,15 +68,21 @@ class Zend_Dojo_View_Helper_Editor extends Zend_Dojo_View_Helper_Textarea /** * dijit.Editor - * - * @param string $id - * @param string $value - * @param array $params - * @param array $attribs + * + * @param string $id + * @param string $value + * @param array $params + * @param array $attribs * @return string */ public function editor($id, $value = null, $params = array(), $attribs = array()) { + if (isset($params['plugins'])) { + foreach ($this->_getRequiredModules($params['plugins']) as $module) { + $this->dojo->requireModule($module); + } + } + $hiddenName = $id; if (array_key_exists('id', $attribs)) { $hiddenId = $attribs['id']; @@ -92,10 +111,29 @@ class Zend_Dojo_View_Helper_Editor extends Zend_Dojo_View_Helper_Textarea return $html; } + /** + * Generates the list of required modules to include, if any is needed. + * + * @param array $plugins plugins to include + * @return array + */ + protected function _getRequiredModules(array $plugins) + { + $modules = array(); + foreach ($plugins as $commandName) { + if (isset($this->_pluginsModules[$commandName])) { + $pluginName = $this->_pluginsModules[$commandName]; + $modules[] = 'dijit._editor.plugins.' . $pluginName; + } + } + + return array_unique($modules); + } + /** * Normalize editor element name - * - * @param string $name + * + * @param string $name * @return string */ protected function _normalizeEditorName($name) @@ -111,9 +149,9 @@ class Zend_Dojo_View_Helper_Editor extends Zend_Dojo_View_Helper_Textarea /** * Create onSubmit binding for element - * - * @param string $hiddenId - * @param string $editorId + * + * @param string $hiddenId + * @param string $editorId * @return void */ protected function _createEditorOnSubmit($hiddenId, $editorId) diff --git a/libs/Zend/Dojo/View/Helper/FilteringSelect.php b/libs/Zend/Dojo/View/Helper/FilteringSelect.php index 5767a3c..6b71e52 100644 --- a/libs/Zend/Dojo/View/Helper/FilteringSelect.php +++ b/libs/Zend/Dojo/View/Helper/FilteringSelect.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FilteringSelect.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: FilteringSelect.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_ComboBox */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/ComboBox.php'; /** * Dojo FilteringSelect dijit - * + * * @uses Zend_Dojo_View_Helper_ComboBox * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_FilteringSelect extends Zend_Dojo_View_Helper_ComboB /** * dijit.form.FilteringSelect - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @param array|null $options Select options diff --git a/libs/Zend/Dojo/View/Helper/Form.php b/libs/Zend/Dojo/View/Helper/Form.php index c95deb2..c5e0365 100644 --- a/libs/Zend/Dojo/View/Helper/Form.php +++ b/libs/Zend/Dojo/View/Helper/Form.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Form.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Form.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo Form dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -53,10 +53,10 @@ class Zend_Dojo_View_Helper_Form extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.Form - * - * @param string $id + * + * @param string $id * @param null|array $attribs HTML attributes - * @param false|string $content + * @param false|string $content * @return string */ public function form($id, $attribs = null, $content = false) @@ -81,7 +81,7 @@ class Zend_Dojo_View_Helper_Form extends Zend_Dojo_View_Helper_Dijit /** * Get standard form helper - * + * * @return Zend_View_Helper_Form */ public function getFormHelper() diff --git a/libs/Zend/Dojo/View/Helper/HorizontalSlider.php b/libs/Zend/Dojo/View/Helper/HorizontalSlider.php index 7db5711..c5ff0b1 100644 --- a/libs/Zend/Dojo/View/Helper/HorizontalSlider.php +++ b/libs/Zend/Dojo/View/Helper/HorizontalSlider.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HorizontalSlider.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: HorizontalSlider.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Slider */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Slider.php'; /** * Dojo HorizontalSlider dijit - * + * * @uses Zend_Dojo_View_Helper_Slider * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_HorizontalSlider extends Zend_Dojo_View_Helper_Slide /** * dijit.form.HorizontalSlider - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/NumberSpinner.php b/libs/Zend/Dojo/View/Helper/NumberSpinner.php index 41dbb58..f6f436b 100644 --- a/libs/Zend/Dojo/View/Helper/NumberSpinner.php +++ b/libs/Zend/Dojo/View/Helper/NumberSpinner.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: NumberSpinner.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: NumberSpinner.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo NumberSpinner dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_NumberSpinner extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.NumberSpinner - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/NumberTextBox.php b/libs/Zend/Dojo/View/Helper/NumberTextBox.php index 2ea39f0..0f1aa59 100644 --- a/libs/Zend/Dojo/View/Helper/NumberTextBox.php +++ b/libs/Zend/Dojo/View/Helper/NumberTextBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: NumberTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: NumberTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo NumberTextBox dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_NumberTextBox extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.NumberTextBox - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/PasswordTextBox.php b/libs/Zend/Dojo/View/Helper/PasswordTextBox.php index 370218e..4751729 100644 --- a/libs/Zend/Dojo/View/Helper/PasswordTextBox.php +++ b/libs/Zend/Dojo/View/Helper/PasswordTextBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PasswordTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: PasswordTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_ValidationTextBox */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/ValidationTextBox.php'; /** * Dojo ValidationTextBox dijit tied to password input - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -42,9 +42,9 @@ class Zend_Dojo_View_Helper_PasswordTextBox extends Zend_Dojo_View_Helper_Valida /** * dijit.form.ValidationTextBox tied to password input - * - * @param string $id - * @param mixed $value + * + * @param string $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/RadioButton.php b/libs/Zend/Dojo/View/Helper/RadioButton.php index 6fac065..c298d70 100644 --- a/libs/Zend/Dojo/View/Helper/RadioButton.php +++ b/libs/Zend/Dojo/View/Helper/RadioButton.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: RadioButton.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: RadioButton.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo RadioButton dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_RadioButton extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.RadioButton - * - * @param string $id - * @param string $value + * + * @param string $id + * @param string $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @param array $options Array of radio options @@ -58,11 +58,11 @@ class Zend_Dojo_View_Helper_RadioButton extends Zend_Dojo_View_Helper_Dijit * @return string */ public function radioButton( - $id, - $value = null, - array $params = array(), - array $attribs = array(), - array $options = null, + $id, + $value = null, + array $params = array(), + array $attribs = array(), + array $options = null, $listsep = "
\n" ) { $attribs['name'] = $id; diff --git a/libs/Zend/Dojo/View/Helper/SimpleTextarea.php b/libs/Zend/Dojo/View/Helper/SimpleTextarea.php index 793f15b..0f32913 100644 --- a/libs/Zend/Dojo/View/Helper/SimpleTextarea.php +++ b/libs/Zend/Dojo/View/Helper/SimpleTextarea.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SimpleTextarea.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SimpleTextarea.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,13 +25,13 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * dijit.form.SimpleTextarea view helper - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SimpleTextarea.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SimpleTextarea.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dojo_View_Helper_SimpleTextarea extends Zend_Dojo_View_Helper_Dijit { @@ -52,9 +52,9 @@ class Zend_Dojo_View_Helper_SimpleTextarea extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.SimpleTextarea - * - * @param string $id - * @param string $value + * + * @param string $id + * @param string $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/Slider.php b/libs/Zend/Dojo/View/Helper/Slider.php index 9394c69..48e1a4c 100644 --- a/libs/Zend/Dojo/View/Helper/Slider.php +++ b/libs/Zend/Dojo/View/Helper/Slider.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Slider.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Slider.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Abstract class for Dojo Slider dijits - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ abstract class Zend_Dojo_View_Helper_Slider extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.Slider - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string @@ -137,10 +137,10 @@ abstract class Zend_Dojo_View_Helper_Slider extends Zend_Dojo_View_Helper_Dijit /** * Prepare slider decoration - * - * @param string $position - * @param string $id - * @param array $decInfo + * + * @param string $position + * @param string $id + * @param array $decInfo * @return string */ protected function _prepareDecoration($position, $id, $decInfo) @@ -149,7 +149,7 @@ abstract class Zend_Dojo_View_Helper_Slider extends Zend_Dojo_View_Helper_Dijit return ''; } - if (!is_array($decInfo) + if (!is_array($decInfo) || !array_key_exists('labels', $decInfo) || !is_array($decInfo['labels']) ) { @@ -233,11 +233,11 @@ abstract class Zend_Dojo_View_Helper_Slider extends Zend_Dojo_View_Helper_Dijit /** * Prepare slider label list - * - * @param string $id - * @param array $params - * @param array $attribs - * @param array $labels + * + * @param string $id + * @param array $params + * @param array $attribs + * @param array $labels * @return string */ protected function _prepareLabelsList($id, array $params, array $attribs, array $labels) diff --git a/libs/Zend/Dojo/View/Helper/SplitContainer.php b/libs/Zend/Dojo/View/Helper/SplitContainer.php index 61f91c1..18456d5 100644 --- a/libs/Zend/Dojo/View/Helper/SplitContainer.php +++ b/libs/Zend/Dojo/View/Helper/SplitContainer.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SplitContainer.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: SplitContainer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_DijitContainer */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/DijitContainer.php'; /** * Dojo SplitContainer dijit - * + * * @uses Zend_Dojo_View_Helper_DijitContainer * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_SplitContainer extends Zend_Dojo_View_Helper_DijitCo /** * dijit.layout.SplitContainer - * - * @param string $id - * @param string $content + * + * @param string $id + * @param string $content * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/StackContainer.php b/libs/Zend/Dojo/View/Helper/StackContainer.php index 44eee83..694c6a7 100644 --- a/libs/Zend/Dojo/View/Helper/StackContainer.php +++ b/libs/Zend/Dojo/View/Helper/StackContainer.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: StackContainer.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: StackContainer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_DijitContainer */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/DijitContainer.php'; /** * Dojo StackContainer dijit - * + * * @uses Zend_Dojo_View_Helper_DijitContainer * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_StackContainer extends Zend_Dojo_View_Helper_DijitCo /** * dijit.layout.StackContainer - * - * @param string $id - * @param string $content + * + * @param string $id + * @param string $content * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/SubmitButton.php b/libs/Zend/Dojo/View/Helper/SubmitButton.php index a66cf7f..4810388 100644 --- a/libs/Zend/Dojo/View/Helper/SubmitButton.php +++ b/libs/Zend/Dojo/View/Helper/SubmitButton.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SubmitButton.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: SubmitButton.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Button */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Button.php'; /** * Dojo Button dijit tied to submit input - * + * * @uses Zend_Dojo_View_Helper_Button * @package Zend_Dojo * @subpackage View @@ -41,14 +41,14 @@ class Zend_Dojo_View_Helper_SubmitButton extends Zend_Dojo_View_Helper_Button /** * dijit.form.Button tied to submit input - * - * @param string $id - * @param string $value + * + * @param string $id + * @param string $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string */ - public function submitButton($id, $value = null, array $params = array(), array $attribs = array()) + public function submitButton($id, $value = null, array $params = array(), array $attribs = array()) { if (!array_key_exists('label', $params)) { $params['label'] = $value; diff --git a/libs/Zend/Dojo/View/Helper/TabContainer.php b/libs/Zend/Dojo/View/Helper/TabContainer.php index 97056b2..e19c21b 100644 --- a/libs/Zend/Dojo/View/Helper/TabContainer.php +++ b/libs/Zend/Dojo/View/Helper/TabContainer.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TabContainer.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: TabContainer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_DijitContainer */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/DijitContainer.php'; /** * Dojo TabContainer dijit - * + * * @uses Zend_Dojo_View_Helper_DijitContainer * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_TabContainer extends Zend_Dojo_View_Helper_DijitCont /** * dijit.layout.TabContainer - * - * @param string $id - * @param string $content + * + * @param string $id + * @param string $content * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/TextBox.php b/libs/Zend/Dojo/View/Helper/TextBox.php index 47a1cfe..ed4a9b8 100644 --- a/libs/Zend/Dojo/View/Helper/TextBox.php +++ b/libs/Zend/Dojo/View/Helper/TextBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: TextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo TextBox dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_TextBox extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.TextBox - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/Textarea.php b/libs/Zend/Dojo/View/Helper/Textarea.php index 73b93c8..70ea42b 100644 --- a/libs/Zend/Dojo/View/Helper/Textarea.php +++ b/libs/Zend/Dojo/View/Helper/Textarea.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Textarea.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: Textarea.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo Textarea dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_Textarea extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.Textarea - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/TimeTextBox.php b/libs/Zend/Dojo/View/Helper/TimeTextBox.php index a2da532..46b60c3 100644 --- a/libs/Zend/Dojo/View/Helper/TimeTextBox.php +++ b/libs/Zend/Dojo/View/Helper/TimeTextBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TimeTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: TimeTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo TimeTextBox dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_TimeTextBox extends Zend_Dojo_View_Helper_Dijit /** * dijit.form.TimeTextBox - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/ValidationTextBox.php b/libs/Zend/Dojo/View/Helper/ValidationTextBox.php index 0e0e7ad..913ed77 100644 --- a/libs/Zend/Dojo/View/Helper/ValidationTextBox.php +++ b/libs/Zend/Dojo/View/Helper/ValidationTextBox.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ValidationTextBox.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: ValidationTextBox.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Dijit */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Dijit.php'; /** * Dojo ValidationTextBox dijit - * + * * @uses Zend_Dojo_View_Helper_Dijit * @package Zend_Dojo * @subpackage View @@ -54,9 +54,9 @@ class Zend_Dojo_View_Helper_ValidationTextBox extends Zend_Dojo_View_Helper_Diji /** * dijit.form.ValidationTextBox - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dojo/View/Helper/VerticalSlider.php b/libs/Zend/Dojo/View/Helper/VerticalSlider.php index d74b107..ff5931f 100644 --- a/libs/Zend/Dojo/View/Helper/VerticalSlider.php +++ b/libs/Zend/Dojo/View/Helper/VerticalSlider.php @@ -17,7 +17,7 @@ * @subpackage View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: VerticalSlider.php 16204 2009-06-21 18:58:29Z thomas $ + * @version $Id: VerticalSlider.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Dojo_View_Helper_Slider */ @@ -25,7 +25,7 @@ require_once 'Zend/Dojo/View/Helper/Slider.php'; /** * Dojo VerticalSlider dijit - * + * * @uses Zend_Dojo_View_Helper_Slider * @package Zend_Dojo * @subpackage View @@ -48,9 +48,9 @@ class Zend_Dojo_View_Helper_VerticalSlider extends Zend_Dojo_View_Helper_Slider /** * dijit.form.VerticalSlider - * - * @param int $id - * @param mixed $value + * + * @param int $id + * @param mixed $value * @param array $params Parameters to use for dijit creation * @param array $attribs HTML attributes * @return string diff --git a/libs/Zend/Dom/Exception.php b/libs/Zend/Dom/Exception.php index ed7beb3..23380a0 100644 --- a/libs/Zend/Dom/Exception.php +++ b/libs/Zend/Dom/Exception.php @@ -16,7 +16,7 @@ * @package Zend_Dom * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Exception */ @@ -24,7 +24,7 @@ require_once 'Zend/Exception.php'; /** * Zend_Dom Exceptions - * + * * @category Zend * @package Zend_Dom * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) diff --git a/libs/Zend/Dom/Query/Result.php b/libs/Zend/Dom/Query/Result.php index ae05d5b..c961f08 100644 --- a/libs/Zend/Dom/Query/Result.php +++ b/libs/Zend/Dom/Query/Result.php @@ -20,13 +20,13 @@ /** * Results for DOM XPath query - * + * * @package Zend_Dom * @subpackage Query * @uses Iterator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Result.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Result.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Dom_Query_Result implements Iterator,Countable { @@ -71,10 +71,10 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Constructor - * - * @param string $cssQuery - * @param string|array $xpathQuery - * @param DOMDocument $document + * + * @param string $cssQuery + * @param string|array $xpathQuery + * @param DOMDocument $document * @param DOMNodeList $nodeList * @return void */ @@ -88,7 +88,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Retrieve CSS Query - * + * * @return string */ public function getCssQuery() @@ -98,7 +98,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Retrieve XPath query - * + * * @return string */ public function getXpathQuery() @@ -108,7 +108,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Retrieve DOMDocument - * + * * @return DOMDocument */ public function getDocument() @@ -118,7 +118,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Iterator: rewind to first element - * + * * @return void */ public function rewind() @@ -129,7 +129,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Iterator: is current position valid? - * + * * @return bool */ public function valid() @@ -142,7 +142,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Iterator: return current element - * + * * @return DOMElement */ public function current() @@ -152,7 +152,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Iterator: return key of current element - * + * * @return int */ public function key() @@ -162,7 +162,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Iterator: move to next element - * + * * @return void */ public function next() @@ -173,7 +173,7 @@ class Zend_Dom_Query_Result implements Iterator,Countable /** * Countable: get count - * + * * @return int */ public function count() diff --git a/libs/Zend/Feed.php b/libs/Zend/Feed.php index eeedca0..b8555c7 100644 --- a/libs/Zend/Feed.php +++ b/libs/Zend/Feed.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Feed.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Feed.php 18291 2009-09-18 21:00:51Z padraic $ */ @@ -191,26 +191,33 @@ class Zend_Feed public static function importString($string) { // Load the feed as an XML DOMDocument object - @ini_set('track_errors', 1); + $libxml_errflag = libxml_use_internal_errors(true); $doc = new DOMDocument; - $status = @$doc->loadXML($string); - @ini_restore('track_errors'); + if (trim($string) == '') { + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('Document/string being imported' + . ' is an Empty string or comes from an empty HTTP response'); + } + $status = $doc->loadXML($string); + libxml_use_internal_errors($libxml_errflag); + if (!$status) { // prevent the class to generate an undefined variable notice (ZF-2590) - if (!isset($php_errormsg)) { - if (function_exists('xdebug_is_enabled')) { - $php_errormsg = '(error message not available, when XDebug is running)'; - } else { - $php_errormsg = '(error message not available)'; - } + // Build error message + $error = libxml_get_last_error(); + if ($error && $error->message) { + $errormsg = "DOMDocument cannot parse XML: {$error->message}"; + } else { + $errormsg = "DOMDocument cannot parse XML"; } + /** * @see Zend_Feed_Exception */ require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + throw new Zend_Feed_Exception($errormsg); } // Try to find the base feed element or a single of an Atom feed @@ -355,7 +362,7 @@ class Zend_Feed } catch (Exception $e) { continue; } - $feeds[] = $feed; + $feeds[$uri->getUri()] = $feed; } } diff --git a/libs/Zend/Feed/Abstract.php b/libs/Zend/Feed/Abstract.php index 19be94a..e5ad96a 100644 --- a/libs/Zend/Feed/Abstract.php +++ b/libs/Zend/Feed/Abstract.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -40,7 +40,7 @@ require_once 'Zend/Feed/Element.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -abstract class Zend_Feed_Abstract extends Zend_Feed_Element implements Iterator +abstract class Zend_Feed_Abstract extends Zend_Feed_Element implements Iterator, Countable { /** * Current index on the collection of feed entries for the @@ -77,7 +77,7 @@ abstract class Zend_Feed_Abstract extends Zend_Feed_Element implements Iterator $client->setUri($uri); $response = $client->request('GET'); if ($response->getStatus() !== 200) { - /** + /** * @see Zend_Feed_Exception */ require_once 'Zend/Feed/Exception.php'; @@ -123,8 +123,8 @@ abstract class Zend_Feed_Abstract extends Zend_Feed_Element implements Iterator $php_errormsg = '(error message not available)'; } } - - /** + + /** * @see Zend_Feed_Exception */ require_once 'Zend/Feed/Exception.php'; diff --git a/libs/Zend/Feed/Atom.php b/libs/Zend/Feed/Atom.php index db0055c..3b0017c 100644 --- a/libs/Zend/Feed/Atom.php +++ b/libs/Zend/Feed/Atom.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Atom.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Atom.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -89,7 +89,7 @@ class Zend_Feed_Atom extends Zend_Feed_Abstract // Try to find a single instead. $element = $this->_element->getElementsByTagName($this->_entryElementName)->item(0); if (!$element) { - /** + /** * @see Zend_Feed_Exception */ require_once 'Zend/Feed/Exception.php'; @@ -376,7 +376,7 @@ class Zend_Feed_Atom extends Zend_Feed_Abstract public function send() { if (headers_sent()) { - /** + /** * @see Zend_Feed_Exception */ require_once 'Zend/Feed/Exception.php'; diff --git a/libs/Zend/Feed/Builder.php b/libs/Zend/Feed/Builder.php index a0adbb1..55192e6 100644 --- a/libs/Zend/Feed/Builder.php +++ b/libs/Zend/Feed/Builder.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Builder.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Builder.php 19055 2009-11-19 19:45:10Z padraic $ */ @@ -212,7 +212,7 @@ class Zend_Feed_Builder implements Zend_Feed_Builder_Interface * @throws Zend_Feed_Builder_Exception * @return void */ - private function _createHeader(array $data) + protected function _createHeader(array $data) { $mandatories = array('title', 'link', 'charset'); foreach ($mandatories as $mandatory) { @@ -340,7 +340,7 @@ class Zend_Feed_Builder implements Zend_Feed_Builder_Interface * @throws Zend_Feed_Builder_Exception * @return void */ - private function _createEntries(array $data) + protected function _createEntries(array $data) { foreach ($data as $row) { $mandatories = array('title', 'link', 'description'); @@ -395,4 +395,4 @@ class Zend_Feed_Builder implements Zend_Feed_Builder_Interface $this->_entries[] = $entry; } } -} \ No newline at end of file +} diff --git a/libs/Zend/Feed/Builder/Header/Itunes.php b/libs/Zend/Feed/Builder/Header/Itunes.php index cbb443b..164e0a2 100644 --- a/libs/Zend/Feed/Builder/Header/Itunes.php +++ b/libs/Zend/Feed/Builder/Header/Itunes.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Itunes.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Itunes.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -112,10 +112,10 @@ class Zend_Feed_Builder_Header_Itunes extends ArrayObject public function setOwner($name = '', $email = '') { if (!empty($email)) { - /** - * @see Zend_Validate_EmailAddress - */ - require_once 'Zend/Validate/EmailAddress.php'; + /** + * @see Zend_Validate_EmailAddress + */ + require_once 'Zend/Validate/EmailAddress.php'; $validate = new Zend_Validate_EmailAddress(); if (!$validate->isValid($email)) { /** diff --git a/libs/Zend/Feed/Element.php b/libs/Zend/Feed/Element.php index 376923b..1c9abcd 100644 --- a/libs/Zend/Feed/Element.php +++ b/libs/Zend/Feed/Element.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Element.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Element.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -204,14 +204,16 @@ class Zend_Feed_Element implements ArrayAccess if (!$nodes) { if (strpos($var, ':') !== false) { list($ns, $elt) = explode(':', $var, 2); - $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), $var, $val); + $node = $this->_element->ownerDocument->createElementNS(Zend_Feed::lookupNamespace($ns), + $var, htmlspecialchars($val, ENT_NOQUOTES, 'UTF-8')); $this->_element->appendChild($node); } else { - $node = $this->_element->ownerDocument->createElement($var, $val); + $node = $this->_element->ownerDocument->createElement($var, + htmlspecialchars($val, ENT_NOQUOTES, 'UTF-8')); $this->_element->appendChild($node); } } elseif (count($nodes) > 1) { - /** + /** * @see Zend_Feed_Exception */ require_once 'Zend/Feed/Exception.php'; @@ -382,7 +384,8 @@ class Zend_Feed_Element implements ArrayAccess if (strpos($offset, ':') !== false) { list($ns, $attr) = explode(':', $offset, 2); - return $this->_element->setAttributeNS(Zend_Feed::lookupNamespace($ns), $attr, $value); + // DOMElement::setAttributeNS() requires $qualifiedName to have a prefix + return $this->_element->setAttributeNS(Zend_Feed::lookupNamespace($ns), $offset, $value); } else { return $this->_element->setAttribute($offset, $value); } diff --git a/libs/Zend/Feed/Entry/Abstract.php b/libs/Zend/Feed/Entry/Abstract.php index ba82f1f..a3a53f1 100644 --- a/libs/Zend/Feed/Entry/Abstract.php +++ b/libs/Zend/Feed/Entry/Abstract.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -93,7 +93,7 @@ abstract class Zend_Feed_Entry_Abstract extends Zend_Feed_Element } } - /** + /** * @see Zend_Feed_Exception */ require_once 'Zend/Feed/Exception.php'; @@ -102,7 +102,7 @@ abstract class Zend_Feed_Entry_Abstract extends Zend_Feed_Element $element = $doc->getElementsByTagName($this->_rootElement)->item(0); if (!$element) { - /** + /** * @see Zend_Feed_Exception */ require_once 'Zend/Feed/Exception.php'; diff --git a/libs/Zend/Feed/Entry/Atom.php b/libs/Zend/Feed/Entry/Atom.php index edd4b1e..34de3ff 100644 --- a/libs/Zend/Feed/Entry/Atom.php +++ b/libs/Zend/Feed/Entry/Atom.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Atom.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Atom.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -37,10 +37,10 @@ require_once 'Zend/Feed/Entry/Abstract.php'; */ class Zend_Feed_Entry_Atom extends Zend_Feed_Entry_Abstract { - /** - * Content-Type - */ - const CONTENT_TYPE = 'application/atom+xml'; + /** + * Content-Type + */ + const CONTENT_TYPE = 'application/atom+xml'; /** * Root XML element for Atom entries. @@ -267,7 +267,7 @@ class Zend_Feed_Entry_Atom extends Zend_Feed_Entry_Abstract foreach ($links as $link) { if (empty($link['rel'])) { - continue; + $link['rel'] = 'alternate'; // see Atom 1.0 spec } if ($rel == $link['rel']) { return $link['href']; diff --git a/libs/Zend/Feed/Entry/Rss.php b/libs/Zend/Feed/Entry/Rss.php index 464601b..73a9488 100644 --- a/libs/Zend/Feed/Entry/Rss.php +++ b/libs/Zend/Feed/Entry/Rss.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Rss.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Rss.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -98,7 +98,7 @@ class Zend_Feed_Entry_Rss extends Zend_Feed_Entry_Abstract return parent::__isset($var); } } - + /** * Overwrites parent::_call method to enable read access * to content:encoded element. diff --git a/libs/Zend/Feed/Reader.php b/libs/Zend/Feed/Reader.php index ced12cf..c415783 100644 --- a/libs/Zend/Feed/Reader.php +++ b/libs/Zend/Feed/Reader.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Reader.php 17391 2009-08-05 11:27:52Z padraic $ + * @version $Id: Reader.php 19120 2009-11-20 17:58:59Z padraic $ */ /** @@ -34,6 +34,11 @@ require_once 'Zend/Feed/Reader/Feed/Rss.php'; */ require_once 'Zend/Feed/Reader/Feed/Atom.php'; +/** + * @see Zend_Feed_Reader_FeedSet + */ +require_once 'Zend/Feed/Reader/FeedSet.php'; + /** * @category Zend * @package Zend_Feed_Reader @@ -42,20 +47,20 @@ require_once 'Zend/Feed/Reader/Feed/Atom.php'; */ class Zend_Feed_Reader { - /** - * Namespace constants - */ - const NAMESPACE_ATOM_03 = 'http://purl.org/atom/ns#'; + /** + * Namespace constants + */ + const NAMESPACE_ATOM_03 = 'http://purl.org/atom/ns#'; const NAMESPACE_ATOM_10 = 'http://www.w3.org/2005/Atom'; const NAMESPACE_RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'; const NAMESPACE_RSS_090 = 'http://my.netscape.com/rdf/simple/0.9/'; const NAMESPACE_RSS_10 = 'http://purl.org/rss/1.0/'; /** - * Feed type constants - */ - const TYPE_ANY = 'any'; - const TYPE_ATOM_03 = 'atom-03'; + * Feed type constants + */ + const TYPE_ANY = 'any'; + const TYPE_ATOM_03 = 'atom-03'; const TYPE_ATOM_10 = 'atom-10'; const TYPE_ATOM_ANY = 'atom'; const TYPE_RSS_090 = 'rss-090'; @@ -208,13 +213,13 @@ class Zend_Feed_Reader } /** - * Import a feed by providing a URL - * - * @param string $url The URL to the feed + * Import a feed by providing a URL + * + * @param string $url The URL to the feed * @param string $etag OPTIONAL Last received ETag for this resource * @param string $lastModified OPTIONAL Last-Modified value for this resource - * @return Zend_Feed_Reader_Feed_Interface - */ + * @return Zend_Feed_Reader_FeedInterface + */ public static function import($uri, $etag = null, $lastModified = null) { $cache = self::getCache(); @@ -288,8 +293,8 @@ class Zend_Feed_Reader * Import a feed by providing a Zend_Feed_Abstract object * * @param Zend_Feed_Abstract $feed A fully instantiated Zend_Feed object - * @return Zend_Feed_Reader_Feed_Interface - */ + * @return Zend_Feed_Reader_FeedInterface + */ public static function importFeed(Zend_Feed_Abstract $feed) { $dom = $feed->getDOM()->ownerDocument; @@ -298,7 +303,7 @@ class Zend_Feed_Reader if (substr($type, 0, 3) == 'rss') { $reader = new Zend_Feed_Reader_Feed_Rss($dom, $type); } else { - $reader = new Zend_Feed_Reader_Feed_Atom($dom, $type); + $reader = new Zend_Feed_Reader_Feed_Atom($dom, $type); } return $reader; @@ -308,7 +313,7 @@ class Zend_Feed_Reader * Import a feed froma string * * @param string $string - * @return Zend_Feed_Reader_Feed_Interface + * @return Zend_Feed_Reader_FeedInterface */ public static function importString($string) { @@ -321,9 +326,9 @@ class Zend_Feed_Reader // Build error message $error = libxml_get_last_error(); if ($error && $error->message) { - $errormsg = "DOMDocument cannot parse XML: {$error->message}"; + $errormsg = "DOMDocument cannot parse XML: {$error->message}"; } else { - $errormsg = "DOMDocument cannot parse XML: Please check the XML document's validity"; + $errormsg = "DOMDocument cannot parse XML: Please check the XML document's validity"; } require_once 'Zend/Feed/Exception.php'; @@ -336,8 +341,12 @@ class Zend_Feed_Reader if (substr($type, 0, 3) == 'rss') { $reader = new Zend_Feed_Reader_Feed_Rss($dom, $type); + } elseif (substr($type, 0, 4) == 'atom') { + $reader = new Zend_Feed_Reader_Feed_Atom($dom, $type); } else { - $reader = new Zend_Feed_Reader_Feed_Atom($dom, $type); + require_once 'Zend/Feed/Exception.php'; + throw new Zend_Feed_Exception('The URI used does not point to a ' + . 'valid Atom, RSS or RDF feed that Zend_Feed_Reader can parse.'); } return $reader; } @@ -378,40 +387,26 @@ class Zend_Feed_Reader throw new Zend_Feed_Exception("Failed to access $uri, got response code " . $response->getStatus()); } $responseHtml = $response->getBody(); - @ini_set('track_errors', 1); + $libxml_errflag = libxml_use_internal_errors(true); $dom = new DOMDocument; - $status = @$dom->loadHTML($responseHtml); - @ini_restore('track_errors'); + $status = $dom->loadHTML($responseHtml); + libxml_use_internal_errors($libxml_errflag); if (!$status) { - if (!isset($php_errormsg)) { - if (function_exists('xdebug_is_enabled')) { - $php_errormsg = '(error message not available, when XDebug is running)'; - } else { - $php_errormsg = '(error message not available)'; - } + // Build error message + $error = libxml_get_last_error(); + if ($error && $error->message) { + $errormsg = "DOMDocument cannot parse HTML: {$error->message}"; + } else { + $errormsg = "DOMDocument cannot parse HTML: Please check the XML document's validity"; } + require_once 'Zend/Feed/Exception.php'; - throw new Zend_Feed_Exception("DOMDocument cannot parse XML: $php_errormsg"); + throw new Zend_Feed_Exception($errormsg); } - $feedLinks = new stdClass; + $feedSet = new Zend_Feed_Reader_FeedSet; $links = $dom->getElementsByTagName('link'); - foreach ($links as $link) { - if (strtolower($link->getAttribute('rel')) !== 'alternate' - || !$link->getAttribute('type') || !$link->getAttribute('href')) { - continue; - } - if (!isset($feedLinks->rss) && $link->getAttribute('type') == 'application/rss+xml') { - $feedLinks->rss = $link->getAttribute('href'); - } elseif(!isset($feedLinks->atom) && $link->getAttribute('type') == 'application/atom+xml') { - $feedLinks->atom = $link->getAttribute('href'); - } elseif(!isset($feedLinks->rdf) && $link->getAttribute('type') == 'application/rdf+xml') { - $feedLinks->rdf = $link->getAttribute('href'); - } - if (isset($feedLinks->rss) && isset($feedLinks->atom) && isset($feedLinks->rdf)) { - break; - } - } - return $feedLinks; + $feedSet->addLinks($links, $uri); + return $feedSet; } /** diff --git a/libs/Zend/Feed/Reader/Entry/Atom.php b/libs/Zend/Feed/Reader/Entry/Atom.php index b788cd2..c4ab3fa 100644 --- a/libs/Zend/Feed/Reader/Entry/Atom.php +++ b/libs/Zend/Feed/Reader/Entry/Atom.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Atom.php 16966 2009-07-22 15:22:18Z padraic $ + * @version $Id: Atom.php 19193 2009-11-23 16:11:15Z padraic $ */ /** @@ -76,7 +76,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme $this->_extensions['Thread_Entry'] = new $threadClass($entry, $entryKey, $type); } - /** + /** * Get the specified author * * @param int $index @@ -295,7 +295,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme return $this->_data['commentcount']; } - $commentcount = $this->getExtension('Thread')>getCommentCount(); + $commentcount = $this->getExtension('Thread')->getCommentCount(); if (!$commentcount) { $commentcount = $this->getExtension('Atom')->getCommentCount(); diff --git a/libs/Zend/Feed/Reader/Entry/Rss.php b/libs/Zend/Feed/Reader/Entry/Rss.php index 37e1e5b..b91990a 100644 --- a/libs/Zend/Feed/Reader/Entry/Rss.php +++ b/libs/Zend/Feed/Reader/Entry/Rss.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Rss.php 16966 2009-07-22 15:22:18Z padraic $ + * @version $Id: Rss.php 18367 2009-09-22 14:55:59Z padraic $ */ /** @@ -255,19 +255,19 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen ) { $dateModified = $this->_xpath->evaluate('string('.$this->_xpathQueryRss.'/pubDate)'); if ($dateModified) { - $date = new Zend_Date(); - try { - $date->set($dateModified, Zend_Date::RFC_822); - } catch (Zend_Date_Exception $e) { + $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822, + Zend_Date::RFC_2822, Zend_Date::DATES); + $date = new Zend_Date; + foreach ($dateStandards as $standard) { try { - $date->set($dateModified, Zend_Date::RFC_2822); + $date->set($dateModified, $standard); + break; } catch (Zend_Date_Exception $e) { - try { - $date->set($dateModified, Zend_Date::DATES); - } catch (Zend_Date_Exception $e) { + if ($standard == Zend_Date::DATES) { require_once 'Zend/Feed/Exception.php'; throw new Zend_Feed_Exception( - 'Could not load date due to unrecognised format (should follow RFC 822 or 2822): ' + 'Could not load date due to unrecognised' + .' format (should follow RFC 822 or 2822):' . $e->getMessage() ); } @@ -335,7 +335,6 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen /** * Get the entry enclosure - * TODO: Is this supported by RSS? Could delegate to Atom Extension if not. * @return string */ public function getEnclosure() @@ -357,6 +356,10 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen } } + if (!$enclosure) { + $enclosure = $this->getExtension('Atom')->getEnclosure(); + } + $this->_data['enclosure'] = $enclosure; return $this->_data['enclosure']; diff --git a/libs/Zend/Feed/Reader/EntryAbstract.php b/libs/Zend/Feed/Reader/EntryAbstract.php index 153149e..f437001 100644 --- a/libs/Zend/Feed/Reader/EntryAbstract.php +++ b/libs/Zend/Feed/Reader/EntryAbstract.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: EntryAbstract.php 16966 2009-07-22 15:22:18Z padraic $ + * @version $Id: EntryAbstract.php 19042 2009-11-19 15:23:34Z padraic $ */ /** @@ -118,6 +118,9 @@ abstract class Zend_Feed_Reader_EntryAbstract public function getEncoding() { $assumed = $this->getDomDocument()->encoding; + if (empty($assumed)) { + $assumed = 'UTF-8'; + } return $assumed; } @@ -134,7 +137,7 @@ abstract class Zend_Feed_Reader_EntryAbstract return $dom->saveXml(); } - /** + /** * Get the entry type * * @return string @@ -154,7 +157,7 @@ abstract class Zend_Feed_Reader_EntryAbstract return $this->_xpath; } - /** + /** * Set the XPath query * * @param DOMXPath $xpath diff --git a/libs/Zend/Feed/Reader/Extension/Atom/Entry.php b/libs/Zend/Feed/Reader/Extension/Atom/Entry.php index 01992f7..7077484 100644 --- a/libs/Zend/Feed/Reader/Extension/Atom/Entry.php +++ b/libs/Zend/Feed/Reader/Extension/Atom/Entry.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Entry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Entry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,6 +34,11 @@ require_once 'Zend/Feed/Reader/Extension/EntryAbstract.php'; */ require_once 'Zend/Date.php'; +/** + * @see Zend_Uri + */ +require_once 'Zend/Uri.php'; + /** * @category Zend * @package Zend_Feed_Reader @@ -43,7 +48,7 @@ require_once 'Zend/Date.php'; class Zend_Feed_Reader_Extension_Atom_Entry extends Zend_Feed_Reader_Extension_EntryAbstract { - /** + /** * Get the specified author * * @param int $index @@ -264,6 +269,34 @@ class Zend_Feed_Reader_Extension_Atom_Entry return $this->_data['id']; } + /** + * Get the base URI of the feed (if set). + * + * @return string|null + */ + public function getBaseUrl() + { + if (array_key_exists('baseUrl', $this->_data)) { + return $this->_data['baseUrl']; + } + + $baseUrl = $this->_xpath->evaluate('string(' + . $this->getXpathPrefix() . '/@xml:base[1]' + . ')'); + + if (!$baseUrl) { + $baseUrl = $this->_xpath->evaluate('string(//@xml:base[1])'); + } + + if (!$baseUrl) { + $baseUrl = null; + } + + $this->_data['baseUrl'] = $baseUrl; + + return $this->_data['baseUrl']; + } + /** * Get a specific link * @@ -303,7 +336,7 @@ class Zend_Feed_Reader_Extension_Atom_Entry if ($list->length) { foreach ($list as $link) { - $links[] = $link->value; + $links[] = $this->_absolutiseUri($link->value); } } @@ -392,6 +425,7 @@ class Zend_Feed_Reader_Extension_Atom_Entry if ($list->length) { $link = $list->item(0)->value; + $link = $this->_absolutiseUri($link); } $this->_data['commentlink'] = $link; @@ -418,6 +452,7 @@ class Zend_Feed_Reader_Extension_Atom_Entry if ($list->length) { $link = $list->item(0)->value; + $link = $this->_absolutiseUri($link); } $this->_data['commentfeedlink'] = $link; @@ -425,6 +460,23 @@ class Zend_Feed_Reader_Extension_Atom_Entry return $this->_data['commentfeedlink']; } + /** + * Attempt to absolutise the URI, i.e. if a relative URI apply the + * xml:base value as a prefix to turn into an absolute URI. + */ + protected function _absolutiseUri($link) + { + if (!Zend_Uri::check($link)) { + if (!is_null($this->getBaseUrl())) { + $link = $this->getBaseUrl() . $link; + if (!Zend_Uri::check($link)) { + $link = null; + } + } + } + return $link; + } + /** * Get an author entry * diff --git a/libs/Zend/Feed/Reader/Extension/Atom/Feed.php b/libs/Zend/Feed/Reader/Extension/Atom/Feed.php index bcc6b41..42d619f 100644 --- a/libs/Zend/Feed/Reader/Extension/Atom/Feed.php +++ b/libs/Zend/Feed/Reader/Extension/Atom/Feed.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Feed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Feed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -29,13 +29,18 @@ require_once 'Zend/Feed/Reader/Extension/FeedAbstract.php'; */ require_once 'Zend/Date.php'; +/** + * @see Zend_Uri + */ +require_once 'Zend/Uri.php'; + /** * @category Zend * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_Atom_Feed +class Zend_Feed_Reader_Extension_Atom_Feed extends Zend_Feed_Reader_Extension_FeedAbstract { /** @@ -240,7 +245,7 @@ class Zend_Feed_Reader_Extension_Atom_Feed return $this->_data['generator']; } - /** + /** * Get the feed ID * * @return string|null @@ -294,6 +299,27 @@ class Zend_Feed_Reader_Extension_Atom_Feed return $this->_data['language']; } + /** + * Get the base URI of the feed (if set). + * + * @return string|null + */ + public function getBaseUrl() + { + if (array_key_exists('baseUrl', $this->_data)) { + return $this->_data['baseUrl']; + } + + $baseUrl = $this->_xpath->evaluate('string(//@xml:base[1])'); + + if (!$baseUrl) { + $baseUrl = null; + } + $this->_data['baseUrl'] = $baseUrl; + + return $this->_data['baseUrl']; + } + /** * Get a link to the source website * @@ -305,10 +331,16 @@ class Zend_Feed_Reader_Extension_Atom_Feed return $this->_data['link']; } - $link = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:link/@href)'); + $link = null; - if (!$link) { - $link = null; + $list = $this->_xpath->query( + $this->getXpathPrefix() . '/atom:link[@rel="alternate"]/@href' . '|' . + $this->getXpathPrefix() . '/atom:link[not(@rel)]/@href' + ); + + if ($list->length) { + $link = $list->item(0)->nodeValue; + $link = $this->_absolutiseUri($link); } $this->_data['link'] = $link; @@ -329,9 +361,7 @@ class Zend_Feed_Reader_Extension_Atom_Feed $link = $this->_xpath->evaluate('string(' . $this->getXpathPrefix() . '/atom:link[@rel="self"]/@href)'); - if (!$link) { - $link = null; - } + $link = $this->_absolutiseUri($link); $this->_data['feedlink'] = $link; @@ -360,7 +390,7 @@ class Zend_Feed_Reader_Extension_Atom_Feed return $this->_data['title']; } - /** + /** * Get an author entry in RSS format * * @param DOMElement $element @@ -399,12 +429,29 @@ class Zend_Feed_Reader_Extension_Atom_Feed return null; } + /** + * Attempt to absolutise the URI, i.e. if a relative URI apply the + * xml:base value as a prefix to turn into an absolute URI. + */ + protected function _absolutiseUri($link) + { + if (!Zend_Uri::check($link)) { + if (!is_null($this->getBaseUrl())) { + $link = $this->getBaseUrl() . $link; + if (!Zend_Uri::check($link)) { + $link = null; + } + } + } + return $link; + } + /** * Register the default namespaces for the current feed format */ protected function _registerNamespaces() { - if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 + if ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 || $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03 ) { return; // pre-registered at Feed level diff --git a/libs/Zend/Feed/Reader/Extension/Content/Entry.php b/libs/Zend/Feed/Reader/Extension/Content/Entry.php index 7145281..fa147af 100644 --- a/libs/Zend/Feed/Reader/Extension/Content/Entry.php +++ b/libs/Zend/Feed/Reader/Extension/Content/Entry.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Entry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Entry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,13 +35,13 @@ require_once 'Zend/Feed/Reader/Extension/EntryAbstract.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_Content_Entry +class Zend_Feed_Reader_Extension_Content_Entry extends Zend_Feed_Reader_Extension_EntryAbstract { public function getContent() { - if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 + if ($this->getType() !== Zend_Feed_Reader::TYPE_RSS_10 && $this->getType() !== Zend_Feed_Reader::TYPE_RSS_090 ) { $content = $this->_xpath->evaluate('string('.$this->getXpathPrefix().'/content:encoded)'); diff --git a/libs/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php b/libs/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php index c3d0cd2..20dfe6e 100644 --- a/libs/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php +++ b/libs/Zend/Feed/Reader/Extension/CreativeCommons/Feed.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Feed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Feed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Feed/Reader/Extension/FeedAbstract.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_CreativeCommons_Feed +class Zend_Feed_Reader_Extension_CreativeCommons_Feed extends Zend_Feed_Reader_Extension_FeedAbstract { /** diff --git a/libs/Zend/Feed/Reader/Extension/DublinCore/Entry.php b/libs/Zend/Feed/Reader/Extension/DublinCore/Entry.php index 522e2c1..b33cac8 100644 --- a/libs/Zend/Feed/Reader/Extension/DublinCore/Entry.php +++ b/libs/Zend/Feed/Reader/Extension/DublinCore/Entry.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Entry.php 16711 2009-07-14 16:10:54Z matthew $ + * @version $Id: Entry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -40,7 +40,7 @@ require_once 'Zend/Date.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_DublinCore_Entry +class Zend_Feed_Reader_Extension_DublinCore_Entry extends Zend_Feed_Reader_Extension_EntryAbstract { /** @@ -87,7 +87,7 @@ class Zend_Feed_Reader_Extension_DublinCore_Entry if ($list->length) { foreach ($list as $author) { - if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_20 + if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_20 && preg_match("/\(([^\)]+)\)/", $author->nodeValue, $matches, PREG_OFFSET_CAPTURE) ) { $authors[] = $matches[1][0]; diff --git a/libs/Zend/Feed/Reader/Extension/DublinCore/Feed.php b/libs/Zend/Feed/Reader/Extension/DublinCore/Feed.php index 6807857..968e81c 100644 --- a/libs/Zend/Feed/Reader/Extension/DublinCore/Feed.php +++ b/libs/Zend/Feed/Reader/Extension/DublinCore/Feed.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Feed.php 16711 2009-07-14 16:10:54Z matthew $ + * @version $Id: Feed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,10 +35,10 @@ require_once 'Zend/Date.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_DublinCore_Feed +class Zend_Feed_Reader_Extension_DublinCore_Feed extends Zend_Feed_Reader_Extension_FeedAbstract { - /** + /** * Get a single author * * @param int $index diff --git a/libs/Zend/Feed/Reader/Extension/EntryAbstract.php b/libs/Zend/Feed/Reader/Extension/EntryAbstract.php index 68ae193..3c212a8 100644 --- a/libs/Zend/Feed/Reader/Extension/EntryAbstract.php +++ b/libs/Zend/Feed/Reader/Extension/EntryAbstract.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: EntryAbstract.php 16711 2009-07-14 16:10:54Z matthew $ + * @version $Id: EntryAbstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -89,11 +89,11 @@ abstract class Zend_Feed_Reader_Extension_EntryAbstract $this->_data['type'] = Zend_Feed_Reader::detectType($feed); } // set the XPath query prefix for the entry being queried - if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_10 + if ($this->getType() == Zend_Feed_Reader::TYPE_RSS_10 || $this->getType() == Zend_Feed_Reader::TYPE_RSS_090 ) { $this->setXpathPrefix('//rss:item[' . ($this->_entryKey+1) . ']'); - } elseif ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 + } elseif ($this->getType() == Zend_Feed_Reader::TYPE_ATOM_10 || $this->getType() == Zend_Feed_Reader::TYPE_ATOM_03 ) { $this->setXpathPrefix('//atom:entry[' . ($this->_entryKey+1) . ']'); @@ -123,7 +123,7 @@ abstract class Zend_Feed_Reader_Extension_EntryAbstract return $assumed; } - /** + /** * Get the entry type * * @return string @@ -178,8 +178,8 @@ abstract class Zend_Feed_Reader_Extension_EntryAbstract /** * Set the XPath prefix - * - * @param string $prefix + * + * @param string $prefix * @return Zend_Feed_Reader_Extension_EntryAbstract */ public function setXpathPrefix($prefix) @@ -190,7 +190,7 @@ abstract class Zend_Feed_Reader_Extension_EntryAbstract /** * Register XML namespaces - * + * * @return void */ protected abstract function _registerNamespaces(); diff --git a/libs/Zend/Feed/Reader/Extension/FeedAbstract.php b/libs/Zend/Feed/Reader/Extension/FeedAbstract.php index 973dd81..5f4c4fc 100644 --- a/libs/Zend/Feed/Reader/Extension/FeedAbstract.php +++ b/libs/Zend/Feed/Reader/Extension/FeedAbstract.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FeedAbstract.php 16711 2009-07-14 16:10:54Z matthew $ + * @version $Id: FeedAbstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -43,7 +43,7 @@ require_once 'Zend/Feed/Reader/Entry/Rss.php'; */ abstract class Zend_Feed_Reader_Extension_FeedAbstract { - /** + /** * Parsed feed data * * @var array @@ -141,8 +141,8 @@ abstract class Zend_Feed_Reader_Extension_FeedAbstract /** * Get the XPath prefix - * - * @return string + * + * @return string */ public function getXpathPrefix() { diff --git a/libs/Zend/Feed/Reader/Extension/Slash/Entry.php b/libs/Zend/Feed/Reader/Extension/Slash/Entry.php index b2aa124..0e016e8 100644 --- a/libs/Zend/Feed/Reader/Extension/Slash/Entry.php +++ b/libs/Zend/Feed/Reader/Extension/Slash/Entry.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Entry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Entry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,7 +35,7 @@ require_once 'Zend/Feed/Reader/Extension/EntryAbstract.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_Slash_Entry +class Zend_Feed_Reader_Extension_Slash_Entry extends Zend_Feed_Reader_Extension_EntryAbstract { /** diff --git a/libs/Zend/Feed/Reader/Extension/Syndication/Feed.php b/libs/Zend/Feed/Reader/Extension/Syndication/Feed.php index bd205bc..b708848 100644 --- a/libs/Zend/Feed/Reader/Extension/Syndication/Feed.php +++ b/libs/Zend/Feed/Reader/Extension/Syndication/Feed.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Feed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Feed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,7 +32,7 @@ require_once 'Zend/Date.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_Syndication_Feed +class Zend_Feed_Reader_Extension_Syndication_Feed extends Zend_Feed_Reader_Extension_FeedAbstract { /** @@ -57,7 +57,7 @@ class Zend_Feed_Reader_Extension_Syndication_Feed case 'yearly': return $period; default: - throw new Zend_Feed_Exception("Feed specified invalid update period: '$period'." + throw new Zend_Feed_Exception("Feed specified invalid update period: '$period'." . " Must be one of hourly, daily, weekly or yearly" ); } @@ -100,13 +100,13 @@ class Zend_Feed_Reader_Extension_Syndication_Feed switch ($period) { //intentional fall through - case 'yearly': + case 'yearly': $ticks *= 52; //TODO: fix generalisation, how? - case 'weekly': + case 'weekly': $ticks *= 7; - case 'daily': + case 'daily': $ticks *= 24; - case 'hourly': + case 'hourly': $ticks *= 3600; break; default: //Never arrive here, exception thrown in getPeriod() diff --git a/libs/Zend/Feed/Reader/Extension/Thread/Entry.php b/libs/Zend/Feed/Reader/Extension/Thread/Entry.php index c8b6327..aff20c2 100644 --- a/libs/Zend/Feed/Reader/Extension/Thread/Entry.php +++ b/libs/Zend/Feed/Reader/Extension/Thread/Entry.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Entry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Entry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,12 +30,12 @@ require_once 'Zend/Feed/Reader/Extension/EntryAbstract.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_Thread_Entry +class Zend_Feed_Reader_Extension_Thread_Entry extends Zend_Feed_Reader_Extension_EntryAbstract { /** * Get the "in-reply-to" value - * + * * @return string */ public function getInReplyTo() diff --git a/libs/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php b/libs/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php index 8c96f6e..6ba15bc 100644 --- a/libs/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php +++ b/libs/Zend/Feed/Reader/Extension/WellFormedWeb/Entry.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Entry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Entry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,7 +35,7 @@ require_once 'Zend/Feed/Reader/Extension/EntryAbstract.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Feed_Reader_Extension_WellFormedWeb_Entry +class Zend_Feed_Reader_Extension_WellFormedWeb_Entry extends Zend_Feed_Reader_Extension_EntryAbstract { /** diff --git a/libs/Zend/Feed/Reader/Feed/Atom.php b/libs/Zend/Feed/Reader/Feed/Atom.php index 6618901..19606d0 100644 --- a/libs/Zend/Feed/Reader/Feed/Atom.php +++ b/libs/Zend/Feed/Reader/Feed/Atom.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Atom.php 16963 2009-07-22 14:39:31Z padraic $ + * @version $Id: Atom.php 19044 2009-11-19 16:44:24Z padraic $ */ /** @@ -41,9 +41,8 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract /** * Constructor * - * @param Zend_Feed_Abstract $feed + * @param DOMDocument $dom * @param string $type - * @param string $xpath */ public function __construct(DomDocument $dom, $type = null) { @@ -196,7 +195,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract return $this->_data['generator']; } - /** + /** * Get the feed ID * * @return string|null @@ -240,6 +239,24 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract return $this->_data['language']; } + /** + * Get a link to the source website + * + * @return string|null + */ + public function getBaseUrl() + { + if (array_key_exists('baseUrl', $this->_data)) { + return $this->_data['baseUrl']; + } + + $baseUrl = $this->getExtension('Atom')->getBaseUrl(); + + $this->_data['baseUrl'] = $baseUrl; + + return $this->_data['baseUrl']; + } + /** * Get a link to the source website * @@ -294,7 +311,7 @@ class Zend_Feed_Reader_Feed_Atom extends Zend_Feed_Reader_FeedAbstract return $this->_data['title']; } - /** + /** * Read all entries to the internal entries array * */ diff --git a/libs/Zend/Feed/Reader/Feed/Rss.php b/libs/Zend/Feed/Reader/Feed/Rss.php index cc09520..00b6276 100644 --- a/libs/Zend/Feed/Reader/Feed/Rss.php +++ b/libs/Zend/Feed/Reader/Feed/Rss.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Rss.php 16963 2009-07-22 14:39:31Z padraic $ + * @version $Id: Rss.php 19044 2009-11-19 16:44:24Z padraic $ */ /** @@ -51,9 +51,8 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract /** * Constructor * - * @param Zend_Feed_Abstract $feed + * @param DOMDocument $dom * @param string $type - * @param string $xpath */ public function __construct(DomDocument $dom, $type = null) { @@ -74,7 +73,7 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract } } - /** + /** * Get a single author * * @param int $index @@ -170,7 +169,7 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract return $this->_data['copyright']; } - /** + /** * Get the feed creation date * * @return string|null @@ -201,19 +200,19 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract $dateModified = $this->_xpath->evaluate('string(/rss/channel/lastBuildDate)'); } if ($dateModified) { - $date = new Zend_Date(); - try { - $date->set($dateModified, Zend_Date::RFC_822); - } catch (Zend_Date_Exception $e) { + $dateStandards = array(Zend_Date::RSS, Zend_Date::RFC_822, + Zend_Date::RFC_2822, Zend_Date::DATES); + $date = new Zend_Date; + foreach ($dateStandards as $standard) { try { - $date->set($dateModified, Zend_Date::RFC_2822); + $date->set($dateModified, $standard); + break; } catch (Zend_Date_Exception $e) { - try { - $date->set($dateModified, Zend_Date::DATES); - } catch (Zend_Date_Exception $e) { + if ($standard == Zend_Date::DATES) { require_once 'Zend/Feed/Exception.php'; throw new Zend_Feed_Exception( - 'Could not load date due to unrecognised format (should follow RFC 822 or 2822): ' + 'Could not load date due to unrecognised' + .' format (should follow RFC 822 or 2822):' . $e->getMessage() ); } @@ -493,7 +492,7 @@ class Zend_Feed_Reader_Feed_Rss extends Zend_Feed_Reader_FeedAbstract return $this->_data['title']; } - /** + /** * Read all entries to the internal entries array * */ diff --git a/libs/Zend/Feed/Reader/FeedAbstract.php b/libs/Zend/Feed/Reader/FeedAbstract.php index 1e8da71..30b67b0 100644 --- a/libs/Zend/Feed/Reader/FeedAbstract.php +++ b/libs/Zend/Feed/Reader/FeedAbstract.php @@ -16,7 +16,7 @@ * @package Zend_Feed_Reader * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FeedAbstract.php 16966 2009-07-22 15:22:18Z padraic $ + * @version $Id: FeedAbstract.php 19044 2009-11-19 16:44:24Z padraic $ */ /** @@ -48,7 +48,7 @@ require_once 'Zend/Feed/Reader/FeedInterface.php'; */ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInterface { - /** + /** * Parsed feed data * * @var array @@ -106,7 +106,7 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt $this->_loadExtensions(); } - /** + /** * Get the number of feed entries. * Required by the Iterator interface. * @@ -117,10 +117,10 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt return count($this->_entries); } - /** + /** * Return the current entry * - * @return Zend_Feed_Reader_Entry_Interface + * @return Zend_Feed_Reader_EntryInterface */ public function current() { @@ -153,6 +153,9 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt public function getEncoding() { $assumed = $this->getDomDocument()->encoding; + if (empty($assumed)) { + $assumed = 'UTF-8'; + } return $assumed; } @@ -196,7 +199,7 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt return $this->_data['type']; } - /** + /** * Return the current feed key * * @return unknown @@ -206,7 +209,7 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt return $this->_entriesKey; } - /** + /** * Move the feed pointer forward * */ diff --git a/libs/Zend/Feed/Reader/FeedSet.php b/libs/Zend/Feed/Reader/FeedSet.php new file mode 100644 index 0000000..e5f4050 --- /dev/null +++ b/libs/Zend/Feed/Reader/FeedSet.php @@ -0,0 +1,148 @@ +getAttribute('rel')) !== 'alternate' + || !$link->getAttribute('type') || !$link->getAttribute('href')) { + continue; + } + if (!isset($this->rss) && $link->getAttribute('type') == 'application/rss+xml') { + $this->rss = $this->_absolutiseUri(trim($link->getAttribute('href')), $uri); + } elseif(!isset($this->atom) && $link->getAttribute('type') == 'application/atom+xml') { + $this->atom = $this->_absolutiseUri(trim($link->getAttribute('href')), $uri); + } elseif(!isset($this->rdf) && $link->getAttribute('type') == 'application/rdf+xml') { + $this->rdf = $this->_absolutiseUri(trim($link->getAttribute('href')), $uri); + } + $this[] = new self(array( + 'rel' => 'alternate', + 'type' => $link->getAttribute('type'), + 'href' => $this->_absolutiseUri(trim($link->getAttribute('href')), $uri), + )); + } + } + + /** + * Attempt to turn a relative URI into an absolute URI + */ + protected function _absolutiseUri($link, $uri = null) + { + if (!Zend_Uri::check($link)) { + if (!is_null($uri)) { + $uri = Zend_Uri::factory($uri); + + if ($link[0] !== '/') { + $link = $uri->getPath() . '/' . $link; + } + + $link = $uri->getScheme() . '://' . $uri->getHost() . '/' . $this->_canonicalizePath($link); + if (!Zend_Uri::check($link)) { + $link = null; + } + } + } + return $link; + } + + /** + * Canonicalize relative path + */ + protected function _canonicalizePath($path) + { + $parts = array_filter(explode('/', $path)); + $absolutes = array(); + foreach ($parts as $part) { + if ('.' == $part) { + continue; + } + if ('..' == $part) { + array_pop($absolutes); + } else { + $absolutes[] = $part; + } + } + return implode('/', $absolutes); + } + + /** + * Supports lazy loading of feeds using Zend_Feed_Reader::import() but + * delegates any other operations to the parent class. + * + * @param string $offset + * @return mixed + * @uses Zend_Feed_Reader + */ + public function offsetGet($offset) + { + if ($offset == 'feed' && !$this->offsetExists('feed')) { + if (!$this->offsetExists('href')) { + return null; + } + $feed = Zend_Feed_Reader::import($this->offsetGet('href')); + $this->offsetSet('feed', $feed); + return $feed; + } + return parent::offsetGet($offset); + } + +} diff --git a/libs/Zend/Feed/Rss.php b/libs/Zend/Feed/Rss.php index fa8f1f1..03c260e 100644 --- a/libs/Zend/Feed/Rss.php +++ b/libs/Zend/Feed/Rss.php @@ -17,7 +17,7 @@ * @package Zend_Feed * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Rss.php 16205 2009-06-21 19:08:45Z thomas $ + * @version $Id: Rss.php 19133 2009-11-20 19:44:09Z padraic $ */ @@ -82,7 +82,7 @@ class Zend_Feed_Rss extends Zend_Feed_Abstract // Find the base channel element and create an alias to it. $rdfTags = $this->_element->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'RDF'); if ($rdfTags->length != 0) { - $this->_element = $rdfTags->item(0); + $this->_element = $rdfTags->item(0); } else { $this->_element = $this->_element->getElementsByTagName('channel')->item(0); } @@ -147,11 +147,11 @@ class Zend_Feed_Rss extends Zend_Feed_Abstract $channel->appendChild($description); $pubdate = isset($array->lastUpdate) ? $array->lastUpdate : time(); - $pubdate = $this->_element->createElement('pubDate', gmdate('r', $pubdate)); + $pubdate = $this->_element->createElement('pubDate', date(DATE_RSS, $pubdate)); $channel->appendChild($pubdate); if (isset($array->published)) { - $lastBuildDate = $this->_element->createElement('lastBuildDate', gmdate('r', $array->published)); + $lastBuildDate = $this->_element->createElement('lastBuildDate', date(DATE_RSS, $array->published)); $channel->appendChild($lastBuildDate); } @@ -411,6 +411,9 @@ class Zend_Feed_Rss extends Zend_Feed_Abstract if (isset($dataentry->guid)) { $guid = $this->_element->createElement('guid', $dataentry->guid); + if (!Zend_Uri::check($dataentry->guid)) { + $guid->setAttribute('isPermaLink', 'false'); + } $item->appendChild($guid); } @@ -425,7 +428,7 @@ class Zend_Feed_Rss extends Zend_Feed_Abstract } $pubdate = isset($dataentry->lastUpdate) ? $dataentry->lastUpdate : time(); - $pubdate = $this->_element->createElement('pubDate', gmdate('r', $pubdate)); + $pubdate = $this->_element->createElement('pubDate', date(DATE_RSS, $pubdate)); $item->appendChild($pubdate); if (isset($dataentry->category)) { diff --git a/libs/Zend/File/Transfer.php b/libs/Zend/File/Transfer.php index e0f4046..5c34632 100644 --- a/libs/Zend/File/Transfer.php +++ b/libs/Zend/File/Transfer.php @@ -16,7 +16,7 @@ * @package Zend_File_Transfer * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Transfer.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Transfer.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -44,7 +44,7 @@ class Zend_File_Transfer $adapter = 'Zend_File_Transfer_Adapter_Http'; break; } - + if (!class_exists($adapter)) { require_once 'Zend/Loader.php'; Zend_Loader::loadClass($adapter); diff --git a/libs/Zend/Filter/Callback.php b/libs/Zend/Filter/Callback.php index dd44a66..c37d81d 100644 --- a/libs/Zend/Filter/Callback.php +++ b/libs/Zend/Filter/Callback.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Callback.php 14975 2009-04-18 05:13:52Z norm2782 $ + * @version $Id: Callback.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -116,7 +116,7 @@ class Zend_Filter_Callback implements Zend_Filter_Interface */ public function filter($value) { - $options = array(); + $options = array(); if ($this->_options !== null) { if (!is_array($this->_options)) { diff --git a/libs/Zend/Filter/HtmlEntities.php b/libs/Zend/Filter/HtmlEntities.php index 1216a88..92b070f 100644 --- a/libs/Zend/Filter/HtmlEntities.php +++ b/libs/Zend/Filter/HtmlEntities.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HtmlEntities.php 16217 2009-06-21 19:39:00Z thomas $ + * @version $Id: HtmlEntities.php 17809 2009-08-24 21:51:22Z thomas $ */ /** @@ -64,9 +64,9 @@ class Zend_Filter_HtmlEntities implements Zend_Filter_Interface { if (!is_array($options)) { trigger_error('Support for multiple arguments is deprecated in favor of a single options array', E_USER_NOTICE); - $argv = func_get_args(); + $options = func_get_args(); $temp['quotestyle'] = array_shift($options); - if (!empty($argv)) { + if (!empty($options)) { $temp['charset'] = array_shift($options); } diff --git a/libs/Zend/Filter/Input.php b/libs/Zend/Filter/Input.php index b9e5350..5408cce 100644 --- a/libs/Zend/Filter/Input.php +++ b/libs/Zend/Filter/Input.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Input.php 17758 2009-08-22 21:07:23Z thomas $ + * @version $Id: Input.php 18186 2009-09-17 18:57:00Z matthew $ */ /** @@ -740,19 +740,21 @@ class Zend_Filter_Input if (!isset($validatorRule[self::ALLOW_EMPTY])) { $validatorRule[self::ALLOW_EMPTY] = $this->_defaults[self::ALLOW_EMPTY]; } + if (!isset($validatorRule[self::MESSAGES])) { $validatorRule[self::MESSAGES] = array(); } else if (!is_array($validatorRule[self::MESSAGES])) { $validatorRule[self::MESSAGES] = array($validatorRule[self::MESSAGES]); - } else if (!array_intersect_key($validatorList, $validatorRule[self::MESSAGES])) { + } else if (array_intersect_key($validatorList, $validatorRule[self::MESSAGES])) { // There are now corresponding numeric keys in the validation rule messages array // Treat it as a named messages list for all rule validators - /** @todo Update documentation to describe this possibility */ $unifiedMessages = $validatorRule[self::MESSAGES]; $validatorRule[self::MESSAGES] = array(); foreach ($validatorList as $key => $validator) { - $validatorRule[self::MESSAGES][$key] = $unifiedMessages; + if (array_key_exists($key, $unifiedMessages)) { + $validatorRule[self::MESSAGES][$key] = $unifiedMessages[$key]; + } } } @@ -766,6 +768,7 @@ class Zend_Filter_Input if (is_string($validator) || is_array($validator)) { $validator = $this->_getValidator($validator); } + if (isset($validatorRule[self::MESSAGES][$key])) { $value = $validatorRule[self::MESSAGES][$key]; if (is_array($value)) { @@ -773,6 +776,10 @@ class Zend_Filter_Input } else { $validator->setMessage($value); } + + if ($validator instanceof Zend_Validate_NotEmpty) { + $this->_defaults[self::NOT_EMPTY_MESSAGE] = $value; + } } $validatorRule[self::VALIDATOR_CHAIN]->addValidator($validator, $validatorRule[self::BREAK_CHAIN]); @@ -882,12 +889,14 @@ class Zend_Filter_Input $emptyFieldsFound = true; } } + if ($emptyFieldsFound) { $this->_invalidMessages[$validatorRule[self::RULE]] = $messages; $this->_invalidErrors[$validatorRule[self::RULE]] = array_unique(call_user_func_array('array_merge', $errorsList)); return; } } + if (!$validatorRule[self::VALIDATOR_CHAIN]->isValid($data)) { $this->_invalidMessages[$validatorRule[self::RULE]] = $validatorRule[self::VALIDATOR_CHAIN]->getMessages(); $this->_invalidErrors[$validatorRule[self::RULE]] = $validatorRule[self::VALIDATOR_CHAIN]->getErrors(); @@ -899,13 +908,11 @@ class Zend_Filter_Input $fieldName = reset($fieldNames); $field = reset($data); - $failed = false; if (!is_array($field)) { $field = array($field); } - $notEmptyValidator = $this->_getValidator('NotEmpty'); $notEmptyValidator->setMessage($this->_getNotEmptyMessage($validatorRule[self::RULE], $fieldName)); if ($validatorRule[self::ALLOW_EMPTY]) { @@ -1018,4 +1025,4 @@ class Zend_Filter_Input return $object; } -} \ No newline at end of file +} diff --git a/libs/Zend/Filter/Word/CamelCaseToDash.php b/libs/Zend/Filter/Word/CamelCaseToDash.php index b327c6c..0c33e5c 100644 --- a/libs/Zend/Filter/Word/CamelCaseToDash.php +++ b/libs/Zend/Filter/Word/CamelCaseToDash.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CamelCaseToDash.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CamelCaseToDash.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,7 +34,7 @@ class Zend_Filter_Word_CamelCaseToDash extends Zend_Filter_Word_CamelCaseToSepar { /** * Constructor - * + * * @return void */ public function __construct() diff --git a/libs/Zend/Filter/Word/CamelCaseToSeparator.php b/libs/Zend/Filter/Word/CamelCaseToSeparator.php index f9ee8ef..e994d00 100644 --- a/libs/Zend/Filter/Word/CamelCaseToSeparator.php +++ b/libs/Zend/Filter/Word/CamelCaseToSeparator.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CamelCaseToSeparator.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CamelCaseToSeparator.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,7 +32,7 @@ require_once 'Zend/Filter/Word/Separator/Abstract.php'; */ class Zend_Filter_Word_CamelCaseToSeparator extends Zend_Filter_Word_Separator_Abstract { - + public function filter($value) { if (self::isUnicodeSupportEnabled()) { @@ -45,5 +45,5 @@ class Zend_Filter_Word_CamelCaseToSeparator extends Zend_Filter_Word_Separator_A return parent::filter($value); } - + } diff --git a/libs/Zend/Filter/Word/CamelCaseToUnderscore.php b/libs/Zend/Filter/Word/CamelCaseToUnderscore.php index 6c9a5e3..65f55f4 100644 --- a/libs/Zend/Filter/Word/CamelCaseToUnderscore.php +++ b/libs/Zend/Filter/Word/CamelCaseToUnderscore.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CamelCaseToUnderscore.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CamelCaseToUnderscore.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,7 +34,7 @@ class Zend_Filter_Word_CamelCaseToUnderscore extends Zend_Filter_Word_CamelCaseT { /** * Constructor - * + * * @return void */ public function __construct() diff --git a/libs/Zend/Filter/Word/DashToCamelCase.php b/libs/Zend/Filter/Word/DashToCamelCase.php index 99978b1..0610a76 100644 --- a/libs/Zend/Filter/Word/DashToCamelCase.php +++ b/libs/Zend/Filter/Word/DashToCamelCase.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DashToCamelCase.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: DashToCamelCase.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,7 +34,7 @@ class Zend_Filter_Word_DashToCamelCase extends Zend_Filter_Word_SeparatorToCamel { /** * Constructor - * + * * @return void */ public function __construct() diff --git a/libs/Zend/Filter/Word/DashToUnderscore.php b/libs/Zend/Filter/Word/DashToUnderscore.php index c0977f6..8b343bd 100644 --- a/libs/Zend/Filter/Word/DashToUnderscore.php +++ b/libs/Zend/Filter/Word/DashToUnderscore.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DashToUnderscore.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: DashToUnderscore.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,11 +30,11 @@ require_once 'Zend/Filter/Word/SeparatorToSeparator.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Filter_Word_DashToUnderscore extends Zend_Filter_Word_SeparatorToSeparator +class Zend_Filter_Word_DashToUnderscore extends Zend_Filter_Word_SeparatorToSeparator { /** * Constructor - * + * * @param string $separator Space by default * @return void */ diff --git a/libs/Zend/Filter/Word/Separator/Abstract.php b/libs/Zend/Filter/Word/Separator/Abstract.php index cfcd794..0583bb6 100644 --- a/libs/Zend/Filter/Word/Separator/Abstract.php +++ b/libs/Zend/Filter/Word/Separator/Abstract.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,7 +38,7 @@ abstract class Zend_Filter_Word_Separator_Abstract extends Zend_Filter_PregRepla /** * Constructor - * + * * @param string $separator Space by default * @return void */ @@ -49,7 +49,7 @@ abstract class Zend_Filter_Word_Separator_Abstract extends Zend_Filter_PregRepla /** * Sets a new seperator - * + * * @param string $separator Seperator * @return $this */ @@ -65,7 +65,7 @@ abstract class Zend_Filter_Word_Separator_Abstract extends Zend_Filter_PregRepla /** * Returns the actual set seperator - * + * * @return string */ public function getSeparator() diff --git a/libs/Zend/Filter/Word/SeparatorToDash.php b/libs/Zend/Filter/Word/SeparatorToDash.php index 49f3d28..a9cfc9c 100644 --- a/libs/Zend/Filter/Word/SeparatorToDash.php +++ b/libs/Zend/Filter/Word/SeparatorToDash.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SeparatorToDash.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SeparatorToDash.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,7 +34,7 @@ class Zend_Filter_Word_SeparatorToDash extends Zend_Filter_Word_SeparatorToSepar { /** * Constructor - * + * * @param string $searchSeparator Seperator to search for change * @return void */ @@ -42,5 +42,5 @@ class Zend_Filter_Word_SeparatorToDash extends Zend_Filter_Word_SeparatorToSepar { parent::__construct($searchSeparator, '-'); } - + } \ No newline at end of file diff --git a/libs/Zend/Filter/Word/SeparatorToSeparator.php b/libs/Zend/Filter/Word/SeparatorToSeparator.php index d5d89c7..2c2b1d7 100644 --- a/libs/Zend/Filter/Word/SeparatorToSeparator.php +++ b/libs/Zend/Filter/Word/SeparatorToSeparator.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SeparatorToSeparator.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SeparatorToSeparator.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,7 +38,7 @@ class Zend_Filter_Word_SeparatorToSeparator extends Zend_Filter_PregReplace /** * Constructor - * + * * @param string $searchSeparator Seperator to search for * @param string $replacementSeperator Seperator to replace with * @return void @@ -51,7 +51,7 @@ class Zend_Filter_Word_SeparatorToSeparator extends Zend_Filter_PregReplace /** * Sets a new seperator to search for - * + * * @param string $separator Seperator to search for * @return $this */ @@ -63,7 +63,7 @@ class Zend_Filter_Word_SeparatorToSeparator extends Zend_Filter_PregReplace /** * Returns the actual set seperator to search for - * + * * @return string */ public function getSearchSeparator() @@ -73,7 +73,7 @@ class Zend_Filter_Word_SeparatorToSeparator extends Zend_Filter_PregReplace /** * Sets a new seperator which replaces the searched one - * + * * @param string $separator Seperator which replaces the searched one * @return $this */ @@ -85,7 +85,7 @@ class Zend_Filter_Word_SeparatorToSeparator extends Zend_Filter_PregReplace /** * Returns the actual set seperator which replaces the searched one - * + * * @return string */ public function getReplacementSeparator() diff --git a/libs/Zend/Filter/Word/UnderscoreToCamelCase.php b/libs/Zend/Filter/Word/UnderscoreToCamelCase.php index 1c7abfe..770e023 100644 --- a/libs/Zend/Filter/Word/UnderscoreToCamelCase.php +++ b/libs/Zend/Filter/Word/UnderscoreToCamelCase.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: UnderscoreToCamelCase.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: UnderscoreToCamelCase.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,7 +34,7 @@ class Zend_Filter_Word_UnderscoreToCamelCase extends Zend_Filter_Word_SeparatorT { /** * Constructor - * + * * @return void */ public function __construct() diff --git a/libs/Zend/Filter/Word/UnderscoreToDash.php b/libs/Zend/Filter/Word/UnderscoreToDash.php index 008e828..1fb6c5c 100644 --- a/libs/Zend/Filter/Word/UnderscoreToDash.php +++ b/libs/Zend/Filter/Word/UnderscoreToDash.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: UnderscoreToDash.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: UnderscoreToDash.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,7 +34,7 @@ class Zend_Filter_Word_UnderscoreToDash extends Zend_Filter_Word_SeparatorToSepa { /** * Constructor - * + * * @param string $separator Space by default * @return void */ diff --git a/libs/Zend/Filter/Word/UnderscoreToSeparator.php b/libs/Zend/Filter/Word/UnderscoreToSeparator.php index c43f106..6e1d619 100644 --- a/libs/Zend/Filter/Word/UnderscoreToSeparator.php +++ b/libs/Zend/Filter/Word/UnderscoreToSeparator.php @@ -16,7 +16,7 @@ * @package Zend_Filter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: UnderscoreToSeparator.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: UnderscoreToSeparator.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,7 +34,7 @@ class Zend_Filter_Word_UnderscoreToSeparator extends Zend_Filter_Word_SeparatorT { /** * Constructor - * + * * @param string $separator Space by default * @return void */ diff --git a/libs/Zend/Form.php b/libs/Zend/Form.php index 737d12d..2ea3201 100644 --- a/libs/Zend/Form.php +++ b/libs/Zend/Form.php @@ -28,7 +28,7 @@ require_once 'Zend/Validate/Interface.php'; * @package Zend_Form * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Form.php 17616 2009-08-15 03:28:29Z yoshida@zend.co.jp $ + * @version $Id: Form.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface { @@ -133,6 +133,12 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface */ protected $_errorsExist = false; + /** + * Has the form been manually flagged as an error? + * @var bool + */ + protected $_errorsForced = false; + /** * Form order * @var int|null @@ -1213,8 +1219,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface /** * Set default values for elements * - * If an element's name is not specified as a key in the array, its value - * is set to null. + * Sets values for all elements specified in the array of $defaults. * * @param array $defaults * @return Zend_Form @@ -2014,6 +2019,12 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface } $this->_errorsExist = !$valid; + + // If manually flagged as an error, return invalid status + if ($this->_errorsForced) { + return false; + } + return $valid; } @@ -2149,7 +2160,8 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface */ public function markAsError() { - $this->_errorsExist = true; + $this->_errorsExist = true; + $this->_errorsForced = true; return $this; } diff --git a/libs/Zend/Form/Decorator/Abstract.php b/libs/Zend/Form/Decorator/Abstract.php index 50d21a2..1c1becd 100644 --- a/libs/Zend/Form/Decorator/Abstract.php +++ b/libs/Zend/Form/Decorator/Abstract.php @@ -23,13 +23,13 @@ require_once 'Zend/Form/Decorator/Interface.php'; /** * Zend_Form_Decorator_Abstract - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Interface { @@ -45,7 +45,7 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter */ protected $_placement = 'APPEND'; - /** + /** * @var Zend_Form_Element|Zend_Form */ protected $_element; @@ -64,8 +64,8 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Constructor - * - * @param array|Zend_Config $options + * + * @param array|Zend_Config $options * @return void */ public function __construct($options = null) @@ -79,8 +79,8 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Set options - * - * @param array $options + * + * @param array $options * @return Zend_Form_Decorator_Abstract */ public function setOptions(array $options) @@ -91,8 +91,8 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Set options from config object - * - * @param Zend_Config $config + * + * @param Zend_Config $config * @return Zend_Form_Decorator_Abstract */ public function setConfig(Zend_Config $config) @@ -102,9 +102,9 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Set option - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return Zend_Form_Decorator_Abstract */ public function setOption($key, $value) @@ -115,8 +115,8 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Get option - * - * @param string $key + * + * @param string $key * @return mixed */ public function getOption($key) @@ -131,7 +131,7 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Retrieve options - * + * * @return array */ public function getOptions() @@ -141,8 +141,8 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Remove single option - * - * @param mixed $key + * + * @param mixed $key * @return void */ public function removeOption($key) @@ -157,7 +157,7 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Clear all options - * + * * @return Zend_Form_Decorator_Abstract */ public function clearOptions() @@ -168,8 +168,8 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Set current form element - * - * @param Zend_Form_Element|Zend_Form $element + * + * @param Zend_Form_Element|Zend_Form $element * @return Zend_Form_Decorator_Abstract * @throws Zend_Form_Decorator_Exception on invalid element type */ @@ -189,7 +189,7 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Retrieve current element - * + * * @return Zend_Form_Element|Zend_Form */ public function getElement() @@ -199,7 +199,7 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Determine if decorator should append or prepend content - * + * * @return string */ public function getPlacement() @@ -226,7 +226,7 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Retrieve separator to use between old and new content - * + * * @return string */ public function getSeparator() @@ -241,7 +241,7 @@ abstract class Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Inter /** * Decorate content and/or element - * + * * @param string $content * @return string * @throws Zend_Dorm_Decorator_Exception when unimplemented diff --git a/libs/Zend/Form/Decorator/Callback.php b/libs/Zend/Form/Decorator/Callback.php index 391a936..9cfbb45 100644 --- a/libs/Zend/Form/Decorator/Callback.php +++ b/libs/Zend/Form/Decorator/Callback.php @@ -25,28 +25,28 @@ require_once 'Zend/Form/Decorator/Abstract.php'; /** * Zend_Form_Decorator_Callback * - * Execute an arbitrary callback to decorate an element. Callbacks should take + * Execute an arbitrary callback to decorate an element. Callbacks should take * three arguments, $content, $element, and $options: * * function mycallback($content, $element, array $options) * { * } * - * and should return a string. ($options are whatever options were provided to + * and should return a string. ($options are whatever options were provided to * the decorator.) * * To specify a callback, pass a valid callback as the 'callback' option. * * Callback results will be either appended, prepended, or replace the provided - * content. To replace the content, specify a placement of boolean false; + * content. To replace the content, specify a placement of boolean false; * defaults to append content. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Callback.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Callback.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_Callback extends Zend_Form_Decorator_Abstract { @@ -58,8 +58,8 @@ class Zend_Form_Decorator_Callback extends Zend_Form_Decorator_Abstract /** * Set callback - * - * @param callback $callback + * + * @param callback $callback * @return Zend_Form_Decorator_Callback * @throws Zend_Form_Exception */ @@ -76,9 +76,9 @@ class Zend_Form_Decorator_Callback extends Zend_Form_Decorator_Abstract /** * Get registered callback * - * If not previously registered, checks to see if it exists in registered + * If not previously registered, checks to see if it exists in registered * options. - * + * * @return null|string|array */ public function getCallback() @@ -94,13 +94,13 @@ class Zend_Form_Decorator_Callback extends Zend_Form_Decorator_Abstract } /** - * Render + * Render * - * If no callback registered, returns callback. Otherwise, gets return + * If no callback registered, returns callback. Otherwise, gets return * value of callback and either appends, prepends, or replaces passed in * content. * - * @param string $content + * @param string $content * @return string */ public function render($content) diff --git a/libs/Zend/Form/Decorator/Captcha.php b/libs/Zend/Form/Decorator/Captcha.php index 2207532..2e931bd 100644 --- a/libs/Zend/Form/Decorator/Captcha.php +++ b/libs/Zend/Form/Decorator/Captcha.php @@ -24,7 +24,7 @@ require_once 'Zend/Form/Decorator/Abstract.php'; /** * Captcha generic decorator - * + * * Adds captcha adapter output * * @category Zend @@ -32,14 +32,14 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Captcha.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Captcha.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_Captcha extends Zend_Form_Decorator_Abstract { /** * Render captcha - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) diff --git a/libs/Zend/Form/Decorator/Captcha/Word.php b/libs/Zend/Form/Decorator/Captcha/Word.php index c2a5f8a..f208057 100644 --- a/libs/Zend/Form/Decorator/Captcha/Word.php +++ b/libs/Zend/Form/Decorator/Captcha/Word.php @@ -24,7 +24,7 @@ require_once 'Zend/Form/Decorator/Abstract.php'; /** * Word-based captcha decorator - * + * * Adds hidden field for ID and text input field for captcha text * * @category Zend @@ -32,14 +32,14 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Word.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Word.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_Captcha_Word extends Zend_Form_Decorator_Abstract { /** * Render captcha - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) @@ -54,10 +54,10 @@ class Zend_Form_Decorator_Captcha_Word extends Zend_Form_Decorator_Abstract $hiddenName = $name . '[id]'; $textName = $name . '[input]'; - + $label = $element->getDecorator("Label"); if($label) { - $label->setOption("id", "$name-input"); + $label->setOption("id", "$name-input"); } $placement = $this->getPlacement(); diff --git a/libs/Zend/Form/Decorator/Description.php b/libs/Zend/Form/Decorator/Description.php index 1dc2b2b..667cd58 100644 --- a/libs/Zend/Form/Decorator/Description.php +++ b/libs/Zend/Form/Decorator/Description.php @@ -33,13 +33,13 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * - escape: whether or not to escape description (true by default) * * Any other options passed will be used as HTML attributes of the HTML tag used. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Description.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Description.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_Description extends Zend_Form_Decorator_Abstract { @@ -63,8 +63,8 @@ class Zend_Form_Decorator_Description extends Zend_Form_Decorator_Abstract /** * Set HTML tag with which to surround description - * - * @param string $tag + * + * @param string $tag * @return Zend_Form_Decorator_Description */ public function setTag($tag) @@ -75,7 +75,7 @@ class Zend_Form_Decorator_Description extends Zend_Form_Decorator_Abstract /** * Get HTML tag, if any, with which to surround description - * + * * @return string */ public function getTag() @@ -99,7 +99,7 @@ class Zend_Form_Decorator_Description extends Zend_Form_Decorator_Abstract * Get class with which to define description * * Defaults to 'hint' - * + * * @return string */ public function getClass() @@ -115,8 +115,8 @@ class Zend_Form_Decorator_Description extends Zend_Form_Decorator_Abstract /** * Set whether or not to escape description - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Form_Decorator_Description */ public function setEscape($flag) @@ -127,7 +127,7 @@ class Zend_Form_Decorator_Description extends Zend_Form_Decorator_Abstract /** * Get escape flag - * + * * @return true */ public function getEscape() @@ -146,8 +146,8 @@ class Zend_Form_Decorator_Description extends Zend_Form_Decorator_Abstract /** * Render a description - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) diff --git a/libs/Zend/Form/Decorator/Errors.php b/libs/Zend/Form/Decorator/Errors.php index 99ef759..3e110b7 100644 --- a/libs/Zend/Form/Decorator/Errors.php +++ b/libs/Zend/Form/Decorator/Errors.php @@ -26,20 +26,20 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * Zend_Form_Decorator_Errors * * Any options passed will be used as HTML attributes of the ul tag for the errors. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Errors.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Errors.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_Errors extends Zend_Form_Decorator_Abstract { /** * Render errors - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) @@ -57,7 +57,7 @@ class Zend_Form_Decorator_Errors extends Zend_Form_Decorator_Abstract $separator = $this->getSeparator(); $placement = $this->getPlacement(); - $errors = $view->formErrors($errors, $this->getOptions()); + $errors = $view->formErrors($errors, $this->getOptions()); switch ($placement) { case self::APPEND: diff --git a/libs/Zend/Form/Decorator/Fieldset.php b/libs/Zend/Form/Decorator/Fieldset.php index 2f12b19..b306300 100644 --- a/libs/Zend/Form/Decorator/Fieldset.php +++ b/libs/Zend/Form/Decorator/Fieldset.php @@ -26,13 +26,13 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * Zend_Form_Decorator_Fieldset * * Any options passed will be used as HTML attributes of the fieldset tag. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Fieldset.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Fieldset.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_Fieldset extends Zend_Form_Decorator_Abstract { @@ -64,7 +64,7 @@ class Zend_Form_Decorator_Fieldset extends Zend_Form_Decorator_Abstract * Get options * * Merges in element attributes as well. - * + * * @return array */ public function getOptions() @@ -80,8 +80,8 @@ class Zend_Form_Decorator_Fieldset extends Zend_Form_Decorator_Abstract /** * Set legend - * - * @param string $value + * + * @param string $value * @return Zend_Form_Decorator_Fieldset */ public function setLegend($value) @@ -92,7 +92,7 @@ class Zend_Form_Decorator_Fieldset extends Zend_Form_Decorator_Abstract /** * Get legend - * + * * @return string */ public function getLegend() @@ -114,8 +114,8 @@ class Zend_Form_Decorator_Fieldset extends Zend_Form_Decorator_Abstract /** * Render a fieldset - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) diff --git a/libs/Zend/Form/Decorator/Form.php b/libs/Zend/Form/Decorator/Form.php index 4667a19..2b06e09 100644 --- a/libs/Zend/Form/Decorator/Form.php +++ b/libs/Zend/Form/Decorator/Form.php @@ -25,7 +25,7 @@ require_once 'Zend/Form/Decorator/Abstract.php'; /** * Zend_Form_Decorator_Form * - * Render a Zend_Form object. + * Render a Zend_Form object. * * Accepts following options: * - separator: Separator to use between elements @@ -33,13 +33,13 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * arguments, string content, a name, and an array of attributes. * * Any other options passed will be used as HTML attributes of the form tag. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Form.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Form.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_Form extends Zend_Form_Decorator_Abstract { @@ -51,8 +51,8 @@ class Zend_Form_Decorator_Form extends Zend_Form_Decorator_Abstract /** * Set view helper for rendering form - * - * @param string $helper + * + * @param string $helper * @return Zend_Form_Decorator_Form */ public function setHelper($helper) @@ -63,7 +63,7 @@ class Zend_Form_Decorator_Form extends Zend_Form_Decorator_Abstract /** * Get view helper for rendering form - * + * * @return string */ public function getHelper() @@ -78,9 +78,9 @@ class Zend_Form_Decorator_Form extends Zend_Form_Decorator_Abstract /** * Retrieve decorator options * - * Assures that form action and method are set, and sets appropriate + * Assures that form action and method are set, and sets appropriate * encoding type if current method is POST. - * + * * @return array */ public function getOptions() @@ -113,8 +113,8 @@ class Zend_Form_Decorator_Form extends Zend_Form_Decorator_Abstract * Render a form * * Replaces $content entirely from currently set element. - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) @@ -129,6 +129,6 @@ class Zend_Form_Decorator_Form extends Zend_Form_Decorator_Abstract $attribs = $this->getOptions(); $name = $form->getFullyQualifiedName(); $attribs['id'] = $form->getId(); - return $view->$helper($name, $attribs, $content); + return $view->$helper($name, $attribs, $content); } } diff --git a/libs/Zend/Form/Decorator/FormElements.php b/libs/Zend/Form/Decorator/FormElements.php index bb5b9a1..28d4546 100644 --- a/libs/Zend/Form/Decorator/FormElements.php +++ b/libs/Zend/Form/Decorator/FormElements.php @@ -37,7 +37,7 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormElements.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: FormElements.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_FormElements extends Zend_Form_Decorator_Abstract { @@ -101,7 +101,7 @@ class Zend_Form_Decorator_FormElements extends Zend_Form_Decorator_Abstract $items[] = $item->render(); if (($item instanceof Zend_Form_Element_File) - || (($item instanceof Zend_Form) + || (($item instanceof Zend_Form) && (Zend_Form::ENCTYPE_MULTIPART == $item->getEnctype())) || (($item instanceof Zend_Form_DisplayGroup) && (Zend_Form::ENCTYPE_MULTIPART == $item->getAttrib('enctype'))) diff --git a/libs/Zend/Form/Decorator/FormErrors.php b/libs/Zend/Form/Decorator/FormErrors.php index 6c224e5..fbb86fc 100644 --- a/libs/Zend/Form/Decorator/FormErrors.php +++ b/libs/Zend/Form/Decorator/FormErrors.php @@ -28,13 +28,13 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * Displays all form errors in one view. * * Any options passed will be used as HTML attributes of the ul tag for the errors. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormErrors.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: FormErrors.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_FormErrors extends Zend_Form_Decorator_Abstract { @@ -67,8 +67,8 @@ class Zend_Form_Decorator_FormErrors extends Zend_Form_Decorator_Abstract /** * Render errors - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) @@ -104,7 +104,7 @@ class Zend_Form_Decorator_FormErrors extends Zend_Form_Decorator_Abstract /** * Initialize options - * + * * @return void */ public function initOptions() @@ -339,9 +339,9 @@ class Zend_Form_Decorator_FormErrors extends Zend_Form_Decorator_Abstract /** * Render element label - * - * @param Zend_Form_Element $element - * @param Zend_View_Interface $view + * + * @param Zend_Form_Element $element + * @param Zend_View_Interface $view * @return string */ public function renderLabel(Zend_Form_Element $element, Zend_View_Interface $view) @@ -358,9 +358,9 @@ class Zend_Form_Decorator_FormErrors extends Zend_Form_Decorator_Abstract /** * Recurse through a form object, rendering errors - * - * @param Zend_Form $form - * @param Zend_View_Interface $view + * + * @param Zend_Form $form + * @param Zend_View_Interface $view * @return string */ protected function _recurseForm(Zend_Form $form, Zend_View_Interface $view) diff --git a/libs/Zend/Form/Decorator/HtmlTag.php b/libs/Zend/Form/Decorator/HtmlTag.php index ce0cf2b..fabf8b2 100644 --- a/libs/Zend/Form/Decorator/HtmlTag.php +++ b/libs/Zend/Form/Decorator/HtmlTag.php @@ -32,20 +32,20 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * Options accepted are: * - tag: tag to use in decorator * - noAttribs: do not render attributes in the opening tag - * - placement: 'append' or 'prepend'. If 'append', renders opening and + * - placement: 'append' or 'prepend'. If 'append', renders opening and * closing tag after content; if prepend, renders opening and closing tag * before content. * - openOnly: render opening tag only * - closeOnly: render closing tag only * * Any other options passed are processed as HTML attributes of the tag. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HtmlTag.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: HtmlTag.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract { @@ -68,7 +68,7 @@ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract /** * Convert options to tag attributes - * + * * @return string */ protected function _htmlAttribs(array $attribs) @@ -89,8 +89,8 @@ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract * Normalize tag * * Ensures tag is alphanumeric characters only, and all lowercase. - * - * @param string $tag + * + * @param string $tag * @return string */ public function normalizeTag($tag) @@ -108,8 +108,8 @@ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract /** * Set tag to use - * - * @param string $tag + * + * @param string $tag * @return Zend_Form_Decorator_HtmlTag */ public function setTag($tag) @@ -122,7 +122,7 @@ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract * Get tag * * If no tag is registered, either via setTag() or as an option, uses 'div'. - * + * * @return string */ public function getTag() @@ -141,9 +141,9 @@ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract /** * Get the formatted open tag - * - * @param string $tag - * @param array $attribs + * + * @param string $tag + * @param array $attribs * @return string */ protected function _getOpenTag($tag, array $attribs = null) @@ -158,8 +158,8 @@ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract /** * Get formatted closing tag - * - * @param string $tag + * + * @param string $tag * @return string */ protected function _getCloseTag($tag) @@ -169,8 +169,8 @@ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract /** * Render content wrapped in an HTML tag - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) @@ -197,8 +197,8 @@ class Zend_Form_Decorator_HtmlTag extends Zend_Form_Decorator_Abstract if ($openOnly) { return $content . $this->_getOpenTag($tag, $attribs); } - return $content - . $this->_getOpenTag($tag, $attribs) + return $content + . $this->_getOpenTag($tag, $attribs) . $this->_getCloseTag($tag); case self::PREPEND: if ($closeOnly) { diff --git a/libs/Zend/Form/Decorator/Image.php b/libs/Zend/Form/Decorator/Image.php index a74b319..197248c 100644 --- a/libs/Zend/Form/Decorator/Image.php +++ b/libs/Zend/Form/Decorator/Image.php @@ -31,13 +31,13 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * - tag: if set, used to wrap the label in an additional HTML tag * * Any other options passed will be used as HTML attributes of the image tag. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Image.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Image.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_Image extends Zend_Form_Decorator_Abstract { @@ -61,8 +61,8 @@ class Zend_Form_Decorator_Image extends Zend_Form_Decorator_Abstract /** * Set HTML tag with which to surround label - * - * @param string $tag + * + * @param string $tag * @return Zend_Form_Decorator_Image */ public function setTag($tag) @@ -73,7 +73,7 @@ class Zend_Form_Decorator_Image extends Zend_Form_Decorator_Abstract /** * Get HTML tag, if any, with which to surround label - * + * * @return void */ public function getTag() @@ -92,7 +92,7 @@ class Zend_Form_Decorator_Image extends Zend_Form_Decorator_Abstract /** * Get attributes to pass to image helper - * + * * @return array */ public function getAttribs() @@ -115,8 +115,8 @@ class Zend_Form_Decorator_Image extends Zend_Form_Decorator_Abstract /** * Render a form image - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) @@ -134,7 +134,7 @@ class Zend_Form_Decorator_Image extends Zend_Form_Decorator_Abstract $attribs = $this->getAttribs(); $attribs['id'] = $element->getId(); - $image = $view->formImage($name, $element->getImageValue(), $attribs); + $image = $view->formImage($name, $element->getImageValue(), $attribs); if (null !== $tag) { require_once 'Zend/Form/Decorator/HtmlTag.php'; diff --git a/libs/Zend/Form/Decorator/Interface.php b/libs/Zend/Form/Decorator/Interface.php index 2c3b594..a42ce66 100644 --- a/libs/Zend/Form/Decorator/Interface.php +++ b/libs/Zend/Form/Decorator/Interface.php @@ -20,13 +20,13 @@ /** * Zend_Form_Decorator_Interface - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ interface Zend_Form_Decorator_Interface { @@ -34,8 +34,8 @@ interface Zend_Form_Decorator_Interface * Constructor * * Accept options during initialization. - * - * @param array|Zend_Config $options + * + * @param array|Zend_Config $options * @return void */ public function __construct($options = null); @@ -43,79 +43,79 @@ interface Zend_Form_Decorator_Interface /** * Set an element to decorate * - * While the name is "setElement", a form decorator could decorate either + * While the name is "setElement", a form decorator could decorate either * an element or a form object. - * - * @param mixed $element + * + * @param mixed $element * @return Zend_Form_Decorator_Interface */ public function setElement($element); /** * Retrieve current element - * + * * @return mixed */ public function getElement(); /** * Set decorator options from an array - * - * @param array $options + * + * @param array $options * @return Zend_Form_Decorator_Interface */ public function setOptions(array $options); /** * Set decorator options from a config object - * - * @param Zend_Config $config + * + * @param Zend_Config $config * @return Zend_Form_Decorator_Interface */ public function setConfig(Zend_Config $config); /** * Set a single option - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return Zend_Form_Decorator_Interface */ public function setOption($key, $value); /** * Retrieve a single option - * - * @param string $key + * + * @param string $key * @return mixed */ public function getOption($key); /** * Retrieve decorator options - * + * * @return array */ public function getOptions(); /** * Delete a single option - * - * @param string $key + * + * @param string $key * @return bool */ public function removeOption($key); /** * Clear all options - * + * * @return Zend_Form_Decorator_Interface */ public function clearOptions(); /** * Render the element - * + * * @param string $content Content to decorate * @return string */ diff --git a/libs/Zend/Form/Decorator/Label.php b/libs/Zend/Form/Decorator/Label.php index 3f27a82..df02b8a 100644 --- a/libs/Zend/Form/Decorator/Label.php +++ b/libs/Zend/Form/Decorator/Label.php @@ -41,7 +41,7 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Label.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Label.php 19050 2009-11-19 18:22:31Z matthew $ */ class Zend_Form_Decorator_Label extends Zend_Form_Decorator_Abstract { @@ -103,6 +103,9 @@ class Zend_Form_Decorator_Label extends Zend_Form_Decorator_Abstract } else { $this->_tag = (string) $tag; } + + $this->removeOption('tag'); + return $this; } diff --git a/libs/Zend/Form/Decorator/PrepareElements.php b/libs/Zend/Form/Decorator/PrepareElements.php index aa9857f..59d4480 100644 --- a/libs/Zend/Form/Decorator/PrepareElements.php +++ b/libs/Zend/Form/Decorator/PrepareElements.php @@ -31,20 +31,20 @@ require_once 'Zend/Form/Decorator/FormElements.php'; * - separator: Separator to use between elements * * Any other options passed will be used as HTML attributes of the form tag. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PrepareElements.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: PrepareElements.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_PrepareElements extends Zend_Form_Decorator_FormElements { /** * Render form elements * - * @param string $content + * @param string $content * @return string */ public function render($content) diff --git a/libs/Zend/Form/Decorator/Tooltip.php b/libs/Zend/Form/Decorator/Tooltip.php index 90cef40..2786352 100644 --- a/libs/Zend/Form/Decorator/Tooltip.php +++ b/libs/Zend/Form/Decorator/Tooltip.php @@ -41,18 +41,18 @@ class Zend_Form_Decorator_Tooltip extends Zend_Form_Decorator_Abstract * and if the translator is not disable on the element being rendered. * * @param string $content - * @return string + * @return string */ - public function render($content) + public function render($content) { - if (null !== ($title = $this->getElement()->getAttrib('title'))) { - if (null !== ($translator = $this->getElement()->getTranslator())) { - $title = $translator->translate($title); - } - } - + if (null !== ($title = $this->getElement()->getAttrib('title'))) { + if (null !== ($translator = $this->getElement()->getTranslator())) { + $title = $translator->translate($title); + } + } + $this->getElement()->setAttrib('title', $title); - return $content; + return $content; } - + } \ No newline at end of file diff --git a/libs/Zend/Form/Decorator/ViewHelper.php b/libs/Zend/Form/Decorator/ViewHelper.php index d941220..28e6504 100644 --- a/libs/Zend/Form/Decorator/ViewHelper.php +++ b/libs/Zend/Form/Decorator/ViewHelper.php @@ -31,15 +31,15 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * - placement: whether to append or prepend the generated content to the passed in content * - helper: the name of the view helper to use * - * Assumes the view helper accepts three parameters, the name, value, and + * Assumes the view helper accepts three parameters, the name, value, and * optional attributes; these will be provided by the element. - * + * * @category Zend * @package Zend_Form * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ViewHelper.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: ViewHelper.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_ViewHelper extends Zend_Form_Decorator_Abstract { @@ -61,8 +61,8 @@ class Zend_Form_Decorator_ViewHelper extends Zend_Form_Decorator_Abstract /** * Set view helper to use when rendering - * - * @param string $helper + * + * @param string $helper * @return Zend_Form_Decorator_Element_ViewHelper */ public function setHelper($helper) @@ -105,9 +105,9 @@ class Zend_Form_Decorator_ViewHelper extends Zend_Form_Decorator_Abstract /** * Get name * - * If element is a Zend_Form_Element, will attempt to namespace it if the + * If element is a Zend_Form_Element, will attempt to namespace it if the * element belongs to an array. - * + * * @return string */ public function getName() @@ -139,7 +139,7 @@ class Zend_Form_Decorator_ViewHelper extends Zend_Form_Decorator_Abstract * Retrieve element attributes * * Set id to element name and/or array item. - * + * * @return array */ public function getElementAttribs() @@ -182,8 +182,8 @@ class Zend_Form_Decorator_ViewHelper extends Zend_Form_Decorator_Abstract * Get value * * If element type is one of the button types, returns the label. - * - * @param Zend_Form_Element $element + * + * @param Zend_Form_Element $element * @return string|null */ public function getValue($element) @@ -208,10 +208,10 @@ class Zend_Form_Decorator_ViewHelper extends Zend_Form_Decorator_Abstract /** * Render an element using a view helper * - * Determine view helper from 'viewHelper' option, or, if none set, from - * the element type. Then call as + * Determine view helper from 'viewHelper' option, or, if none set, from + * the element type. Then call as * helper($element->getName(), $element->getValue(), $element->getAttribs()) - * + * * @param string $content * @return string * @throws Zend_Form_Decorator_Exception if element or view are not registered diff --git a/libs/Zend/Form/Decorator/ViewScript.php b/libs/Zend/Form/Decorator/ViewScript.php index c3ef7e5..43d794a 100644 --- a/libs/Zend/Form/Decorator/ViewScript.php +++ b/libs/Zend/Form/Decorator/ViewScript.php @@ -32,14 +32,14 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * - placement: whether to append or prepend view script content to provided content (defaults to prepend) * - viewScript: view script to use * - * The view script is rendered as a partial; the element being decorated is + * The view script is rendered as a partial; the element being decorated is * passed in as the 'element' variable: * * // in view script: * echo $this->element->getLabel(); * * - * Any options other than separator, placement, and viewScript are passed to + * Any options other than separator, placement, and viewScript are passed to * the partial as local variables. * * @category Zend @@ -47,7 +47,7 @@ require_once 'Zend/Form/Decorator/Abstract.php'; * @subpackage Decorator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ViewScript.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: ViewScript.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Decorator_ViewScript extends Zend_Form_Decorator_Abstract { @@ -65,8 +65,8 @@ class Zend_Form_Decorator_ViewScript extends Zend_Form_Decorator_Abstract /** * Set view script - * - * @param string $script + * + * @param string $script * @return Zend_Form_Decorator_ViewScript */ public function setViewScript($script) @@ -77,7 +77,7 @@ class Zend_Form_Decorator_ViewScript extends Zend_Form_Decorator_Abstract /** * Get view script - * + * * @return string|null */ public function getViewScript() @@ -101,8 +101,8 @@ class Zend_Form_Decorator_ViewScript extends Zend_Form_Decorator_Abstract /** * Render a view script - * - * @param string $content + * + * @param string $content * @return string */ public function render($content) diff --git a/libs/Zend/Form/DisplayGroup.php b/libs/Zend/Form/DisplayGroup.php index 44fcf3d..02ef03d 100644 --- a/libs/Zend/Form/DisplayGroup.php +++ b/libs/Zend/Form/DisplayGroup.php @@ -20,12 +20,12 @@ /** * Zend_Form_DisplayGroup - * + * * @category Zend * @package Zend_Form * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DisplayGroup.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: DisplayGroup.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_DisplayGroup implements Iterator,Countable { @@ -107,10 +107,10 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Constructor - * - * @param string $name - * @param Zend_Loader_PluginLoader $loader - * @param array|Zend_Config $options + * + * @param string $name + * @param Zend_Loader_PluginLoader $loader + * @param array|Zend_Config $options * @return void */ public function __construct($name, Zend_Loader_PluginLoader $loader, $options = null) @@ -133,7 +133,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Initialize object; used by extending classes - * + * * @return void */ public function init() @@ -142,8 +142,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set options - * - * @param array $options + * + * @param array $options * @return Zend_Form_DisplayGroup */ public function setOptions(array $options) @@ -171,8 +171,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set options from config object - * - * @param Zend_Config $config + * + * @param Zend_Config $config * @return Zend_Form_DisplayGroup */ public function setConfig(Zend_Config $config) @@ -182,9 +182,9 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set group attribute - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return Zend_Form_DisplayGroup */ public function setAttrib($key, $value) @@ -196,8 +196,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Add multiple form attributes at once - * - * @param array $attribs + * + * @param array $attribs * @return Zend_Form_DisplayGroup */ public function addAttribs(array $attribs) @@ -212,8 +212,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable * Set multiple form attributes at once * * Overwrites any previously set attributes. - * - * @param array $attribs + * + * @param array $attribs * @return Zend_Form_DisplayGroup */ public function setAttribs(array $attribs) @@ -224,8 +224,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve a single form attribute - * - * @param string $key + * + * @param string $key * @return mixed */ public function getAttrib($key) @@ -240,7 +240,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve all form attributes/metadata - * + * * @return array */ public function getAttribs() @@ -250,8 +250,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Remove attribute - * - * @param string $key + * + * @param string $key * @return bool */ public function removeAttrib($key) @@ -266,7 +266,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Clear all form attributes - * + * * @return Zend_Form */ public function clearAttribs() @@ -277,8 +277,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Filter a name to only allow valid variable characters - * - * @param string $value + * + * @param string $value * @return string */ public function filterName($value) @@ -288,8 +288,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set group name - * - * @param string $name + * + * @param string $name * @return Zend_Form_DisplayGroup */ public function setName($name) @@ -306,7 +306,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve group name - * + * * @return string */ public function getName() @@ -318,7 +318,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable * Get fully qualified name * * Places name as subitem of array and/or appends brackets. - * + * * @return string */ public function getFullyQualifiedName() @@ -328,7 +328,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Get element id - * + * * @return string */ public function getId() @@ -357,8 +357,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set group legend - * - * @param string $legend + * + * @param string $legend * @return Zend_Form_DisplayGroup */ public function setLegend($legend) @@ -368,7 +368,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve group legend - * + * * @return string */ public function getLegend() @@ -378,8 +378,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set description - * - * @param string $value + * + * @param string $value * @return Zend_Form_DisplayGroup */ public function setDescription($value) @@ -390,7 +390,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Get description - * + * * @return string */ public function getDescription() @@ -400,8 +400,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set group order - * - * @param int $order + * + * @param int $order * @return Zend_Form_Element */ public function setOrder($order) @@ -412,7 +412,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve group order - * + * * @return int */ public function getOrder() @@ -424,8 +424,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Add element to stack - * - * @param Zend_Form_Element $element + * + * @param Zend_Form_Element $element * @return Zend_Form_DisplayGroup */ public function addElement(Zend_Form_Element $element) @@ -437,8 +437,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Add multiple elements at once - * - * @param array $elements + * + * @param array $elements * @return Zend_Form_DisplayGroup * @throws Zend_Form_Exception if any element is not a Zend_Form_Element */ @@ -456,8 +456,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set multiple elements at once (overwrites) - * - * @param array $elements + * + * @param array $elements * @return Zend_Form_DisplayGroup */ public function setElements(array $elements) @@ -468,8 +468,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve element - * - * @param string $name + * + * @param string $name * @return Zend_Form_Element|null */ public function getElement($name) @@ -493,8 +493,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Remove a single element - * - * @param string $name + * + * @param string $name * @return boolean */ public function removeElement($name) @@ -511,7 +511,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Remove all elements - * + * * @return Zend_Form_DisplayGroup */ public function clearElements() @@ -525,8 +525,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set plugin loader - * - * @param Zend_Loader_PluginLoader $loader + * + * @param Zend_Loader_PluginLoader $loader * @return Zend_Form_DisplayGroup */ public function setPluginLoader(Zend_Loader_PluginLoader $loader) @@ -537,7 +537,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve plugin loader - * + * * @return Zend_Loader_PluginLoader */ public function getPluginLoader() @@ -547,9 +547,9 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Add a prefix path for the plugin loader - * - * @param string $prefix - * @param string $path + * + * @param string $prefix + * @param string $path * @return Zend_Form_DisplayGroup */ public function addPrefixPath($prefix, $path) @@ -560,15 +560,15 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Add several prefix paths at once - * - * @param array $spec + * + * @param array $spec * @return Zend_Form_DisplayGroup */ public function addPrefixPaths(array $spec) { if (isset($spec['prefix']) && isset($spec['path'])) { return $this->addPrefixPath($spec['prefix'], $spec['path']); - } + } foreach ($spec as $prefix => $paths) { if (is_numeric($prefix) && is_array($paths)) { $prefix = null; @@ -592,8 +592,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set flag to disable loading default decorators - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Form_Element */ public function setDisableLoadDefaultDecorators($flag) @@ -604,7 +604,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Should we load the default decorators? - * + * * @return bool */ public function loadDefaultDecoratorsIsDisabled() @@ -614,7 +614,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Load default decorators - * + * * @return void */ public function loadDefaultDecorators() @@ -634,9 +634,9 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Instantiate a decorator based on class name or class name fragment - * - * @param string $name - * @param null|array $options + * + * @param string $name + * @param null|array $options * @return Zend_Form_Decorator_Interface */ protected function _getDecorator($name, $options = null) @@ -653,8 +653,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Add a decorator for rendering the group - * - * @param string|Zend_Form_Decorator_Interface $decorator + * + * @param string|Zend_Form_Decorator_Interface $decorator * @param array|Zend_Config $options Options with which to initialize decorator * @return Zend_Form_DisplayGroup */ @@ -696,8 +696,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Add many decorators at once - * - * @param array $decorators + * + * @param array $decorators * @return Zend_Form_DisplayGroup */ public function addDecorators(array $decorators) @@ -740,8 +740,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Overwrite all decorators - * - * @param array $decorators + * + * @param array $decorators * @return Zend_Form_DisplayGroup */ public function setDecorators(array $decorators) @@ -752,8 +752,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve a registered decorator - * - * @param string $name + * + * @param string $name * @return false|Zend_Form_Decorator_Abstract */ public function getDecorator($name) @@ -784,7 +784,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve all decorators - * + * * @return array */ public function getDecorators() @@ -799,8 +799,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Remove a single decorator - * - * @param string $name + * + * @param string $name * @return bool */ public function removeDecorator($name) @@ -821,7 +821,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Clear all decorators - * + * * @return Zend_Form_DisplayGroup */ public function clearDecorators() @@ -832,8 +832,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set view - * - * @param Zend_View_Interface $view + * + * @param Zend_View_Interface $view * @return Zend_Form_DisplayGroup */ public function setView(Zend_View_Interface $view = null) @@ -844,7 +844,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve view - * + * * @return Zend_View_Interface */ public function getView() @@ -860,7 +860,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Render display group - * + * * @return string */ public function render(Zend_View_Interface $view = null) @@ -878,7 +878,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * String representation of group - * + * * @return string */ public function __toString() @@ -894,8 +894,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Set translator object - * - * @param Zend_Translate|Zend_Translate_Adapter|null $translator + * + * @param Zend_Translate|Zend_Translate_Adapter|null $translator * @return Zend_Form_DisplayGroup */ public function setTranslator($translator = null) @@ -913,7 +913,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Retrieve translator object - * + * * @return Zend_Translate_Adapter|null */ public function getTranslator() @@ -932,8 +932,8 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Indicate whether or not translation should be disabled - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Form_DisplayGroup */ public function setDisableTranslator($flag) @@ -944,7 +944,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Is translation disabled? - * + * * @return bool */ public function translatorIsDisabled() @@ -956,9 +956,9 @@ class Zend_Form_DisplayGroup implements Iterator,Countable * Overloading: allow rendering specific decorators * * Call renderDecoratorName() to render a specific decorator. - * - * @param string $method - * @param array $args + * + * @param string $method + * @param array $args * @return string * @throws Zend_Form_Exception for invalid decorator or invalid method call */ @@ -987,7 +987,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Current element - * + * * @return Zend_Form_Element */ public function current() @@ -1000,7 +1000,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Current element - * + * * @return string */ public function key() @@ -1011,7 +1011,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Move pointer to next element - * + * * @return void */ public function next() @@ -1022,7 +1022,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Move pointer to beginning of element loop - * + * * @return void */ public function rewind() @@ -1033,7 +1033,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Determine if current element/subform/display group is valid - * + * * @return bool */ public function valid() @@ -1044,7 +1044,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Count of elements/subforms that are iterable - * + * * @return int */ public function count() @@ -1054,7 +1054,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Sort items according to their order - * + * * @return void */ protected function _sort() @@ -1088,7 +1088,7 @@ class Zend_Form_DisplayGroup implements Iterator,Countable /** * Lazy-load a decorator - * + * * @param array $decorator Decorator type and options * @param mixed $name Decorator name or alias * @return Zend_Form_Decorator_Interface diff --git a/libs/Zend/Form/Element.php b/libs/Zend/Form/Element.php index f04e3cf..5790a09 100644 --- a/libs/Zend/Form/Element.php +++ b/libs/Zend/Form/Element.php @@ -32,7 +32,7 @@ require_once 'Zend/Validate/Interface.php'; * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Element.php 17506 2009-08-10 11:30:24Z yoshida@zend.co.jp $ + * @version $Id: Element.php 19130 2009-11-20 19:28:00Z matthew $ */ class Zend_Form_Element implements Zend_Validate_Interface { @@ -97,6 +97,13 @@ class Zend_Form_Element implements Zend_Validate_Interface */ protected $_errors = array(); + /** + * Separator to use when concatenating aggregate error messages (for + * elements having array values) + * @var string + */ + protected $_errorMessageSeparator = '; '; + /** * Element filters * @var array @@ -121,6 +128,12 @@ class Zend_Form_Element implements Zend_Validate_Interface */ protected $_isError = false; + /** + * Has the element been manually marked as invalid? + * @var bool + */ + protected $_isErrorForced = false; + /** * Element label * @var string @@ -197,6 +210,16 @@ class Zend_Form_Element implements Zend_Validate_Interface */ protected $_view; + /** + * Is a specific decorator being rendered via the magic renderDecorator()? + * + * This is to allow execution of logic inside the render() methods of child + * elements during the magic call while skipping the parent render() method. + * + * @var bool + */ + protected $_isPartialRendering = false; + /** * Constructor * @@ -900,6 +923,9 @@ class Zend_Form_Element implements Zend_Validate_Interface public function __call($method, $args) { if ('render' == substr($method, 0, 6)) { + $this->_isPartialRendering = true; + $this->render(); + $this->_isPartialRendering = false; $decoratorName = substr($method, 6); if (false !== ($decorator = $this->getDecorator($decoratorName))) { $decorator->setElement($this); @@ -1339,6 +1365,11 @@ class Zend_Form_Element implements Zend_Validate_Interface } } + // If element manually flagged as invalid, return false + if ($this->_isErrorForced) { + return false; + } + return $result; } @@ -1401,6 +1432,28 @@ class Zend_Form_Element implements Zend_Validate_Interface return $this; } + /** + * Get errorMessageSeparator + * + * @return string + */ + public function getErrorMessageSeparator() + { + return $this->_errorMessageSeparator; + } + + /** + * Set errorMessageSeparator + * + * @param string $separator + * @return Zend_Form_Element + */ + public function setErrorMessageSeparator($separator) + { + $this->_errorMessageSeparator = $separator; + return $this; + } + /** * Mark the element as being in a failed validation state * @@ -1416,6 +1469,7 @@ class Zend_Form_Element implements Zend_Validate_Interface } else { $this->_messages = $messages; } + $this->_isErrorForced = true; return $this; } @@ -1903,6 +1957,10 @@ class Zend_Form_Element implements Zend_Validate_Interface */ public function render(Zend_View_Interface $view = null) { + if ($this->_isPartialRendering) { + return ''; + } + if (null !== $view) { $this->setView($view); } @@ -2099,12 +2157,14 @@ class Zend_Form_Element implements Zend_Validate_Interface if (null !== $translator) { $message = $translator->translate($message); } - if ($this->isArray() || is_array($value)) { + if (($this->isArray() || is_array($value)) + && !empty($value) + ) { $aggregateMessages = array(); foreach ($value as $val) { $aggregateMessages[] = str_replace('%value%', $val, $message); } - $messages[$key] = $aggregateMessages; + $messages[$key] = implode($this->getErrorMessageSeparator(), $aggregateMessages); } else { $messages[$key] = str_replace('%value%', $value, $message); } diff --git a/libs/Zend/Form/Element/Button.php b/libs/Zend/Form/Element/Button.php index cdb1079..02444bd 100644 --- a/libs/Zend/Form/Element/Button.php +++ b/libs/Zend/Form/Element/Button.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Submit.php'; /** * Button form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Button.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Button.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Button extends Zend_Form_Element_Submit { diff --git a/libs/Zend/Form/Element/Checkbox.php b/libs/Zend/Form/Element/Checkbox.php index 3847a97..47707c6 100644 --- a/libs/Zend/Form/Element/Checkbox.php +++ b/libs/Zend/Form/Element/Checkbox.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Xhtml.php'; /** * Checkbox form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Checkbox.php 17716 2009-08-21 15:08:31Z matthew $ + * @version $Id: Checkbox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml { @@ -76,10 +76,10 @@ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml /** * Set options * - * Intercept checked and unchecked values and set them early; test stored + * Intercept checked and unchecked values and set them early; test stored * value against checked and unchecked values after configuration. - * - * @param array $options + * + * @param array $options * @return Zend_Form_Element_Checkbox */ public function setOptions(array $options) @@ -109,11 +109,11 @@ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml * If value matches checked value, sets to that value, and sets the checked * flag to true. * - * Any other value causes the unchecked value to be set as the current + * Any other value causes the unchecked value to be set as the current * value, and the checked flag to be set as false. * - * - * @param mixed $value + * + * @param mixed $value * @return Zend_Form_Element_Checkbox */ public function setValue($value) @@ -130,8 +130,8 @@ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml /** * Set checked value - * - * @param string $value + * + * @param string $value * @return Zend_Form_Element_Checkbox */ public function setCheckedValue($value) @@ -143,7 +143,7 @@ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml /** * Get value when checked - * + * * @return string */ public function getCheckedValue() @@ -153,8 +153,8 @@ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml /** * Set unchecked value - * - * @param string $value + * + * @param string $value * @return Zend_Form_Element_Checkbox */ public function setUncheckedValue($value) @@ -166,7 +166,7 @@ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml /** * Get value when not checked - * + * * @return string */ public function getUncheckedValue() @@ -176,8 +176,8 @@ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml /** * Set checked flag - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Form_Element_Checkbox */ public function setChecked($flag) @@ -193,7 +193,7 @@ class Zend_Form_Element_Checkbox extends Zend_Form_Element_Xhtml /** * Get checked flag - * + * * @return bool */ public function isChecked() diff --git a/libs/Zend/Form/Element/Hash.php b/libs/Zend/Form/Element/Hash.php index cd617c0..9d0a31c 100644 --- a/libs/Zend/Form/Element/Hash.php +++ b/libs/Zend/Form/Element/Hash.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Xhtml.php'; /** * CSRF form protection - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Hash.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Hash.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml { @@ -42,7 +42,7 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Actual hash used. - * + * * @var mixed */ protected $_hash; @@ -67,11 +67,11 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Constructor * - * Creates session namespace for CSRF token, and adds validator for CSRF + * Creates session namespace for CSRF token, and adds validator for CSRF * token. - * - * @param string|array|Zend_Config $spec - * @param array|Zend_Config $options + * + * @param string|array|Zend_Config $spec + * @param array|Zend_Config $options * @return void */ public function __construct($spec, $options = null) @@ -85,8 +85,8 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Set session object - * - * @param Zend_Session_Namespace $session + * + * @param Zend_Session_Namespace $session * @return Zend_Form_Element_Hash */ public function setSession($session) @@ -99,7 +99,7 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml * Get session object * * Instantiate session object if none currently exists - * + * * @return Zend_Session_Namespace */ public function getSession() @@ -114,9 +114,9 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Initialize CSRF validator * - * Creates Session namespace, and initializes CSRF token in session. + * Creates Session namespace, and initializes CSRF token in session. * Additionally, adds validator for validating CSRF token. - * + * * @return Zend_Form_Element_Hash */ public function initCsrfValidator() @@ -158,7 +158,7 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml * Retrieve CSRF token * * If no CSRF token currently exists, generates one. - * + * * @return string */ public function getHash() @@ -173,7 +173,7 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml * Get session namespace for CSRF token * * Generates a session namespace based on salt, element name, and class. - * + * * @return string */ public function getSessionName() @@ -183,8 +183,8 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Set timeout for CSRF session token - * - * @param int $ttl + * + * @param int $ttl * @return Zend_Form_Element_Hash */ public function setTimeout($ttl) @@ -195,7 +195,7 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Get CSRF session token timeout - * + * * @return int */ public function getTimeout() @@ -205,7 +205,7 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Override getLabel() to always be empty - * + * * @return null */ public function getLabel() @@ -215,7 +215,7 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Initialize CSRF token in session - * + * * @return void */ public function initCsrfToken() @@ -228,8 +228,8 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Render CSRF token in form - * - * @param Zend_View_Interface $view + * + * @param Zend_View_Interface $view * @return string */ public function render(Zend_View_Interface $view = null) @@ -241,17 +241,17 @@ class Zend_Form_Element_Hash extends Zend_Form_Element_Xhtml /** * Generate CSRF token * - * Generates CSRF token and stores both in {@link $_hash} and element + * Generates CSRF token and stores both in {@link $_hash} and element * value. - * + * * @return void */ protected function _generateHash() { $this->_hash = md5( - mt_rand(1,1000000) - . $this->getSalt() - . $this->getName() + mt_rand(1,1000000) + . $this->getSalt() + . $this->getName() . mt_rand(1,1000000) ); $this->setValue($this->_hash); diff --git a/libs/Zend/Form/Element/Hidden.php b/libs/Zend/Form/Element/Hidden.php index 491d457..41ace49 100644 --- a/libs/Zend/Form/Element/Hidden.php +++ b/libs/Zend/Form/Element/Hidden.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Xhtml.php'; /** * Hidden form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Hidden.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Hidden.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Hidden extends Zend_Form_Element_Xhtml { diff --git a/libs/Zend/Form/Element/Image.php b/libs/Zend/Form/Element/Image.php index c254209..2e10a29 100644 --- a/libs/Zend/Form/Element/Image.php +++ b/libs/Zend/Form/Element/Image.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Xhtml.php'; /** * Image form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Image.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Image.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Image extends Zend_Form_Element_Xhtml { @@ -54,7 +54,7 @@ class Zend_Form_Element_Image extends Zend_Form_Element_Xhtml /** * Load default decorators - * + * * @return void */ public function loadDefaultDecorators() @@ -75,8 +75,8 @@ class Zend_Form_Element_Image extends Zend_Form_Element_Xhtml /** * Set image path - * - * @param string $path + * + * @param string $path * @return Zend_Form_Element_Image */ public function setImage($path) @@ -87,7 +87,7 @@ class Zend_Form_Element_Image extends Zend_Form_Element_Xhtml /** * Get image path - * + * * @return string */ public function getImage() @@ -97,8 +97,8 @@ class Zend_Form_Element_Image extends Zend_Form_Element_Xhtml /** * Set image value to use when submitted - * - * @param mixed $value + * + * @param mixed $value * @return Zend_Form_Element_Image */ public function setImageValue($value) @@ -109,7 +109,7 @@ class Zend_Form_Element_Image extends Zend_Form_Element_Xhtml /** * Get image value to use when submitted - * + * * @return mixed */ public function getImageValue() @@ -119,7 +119,7 @@ class Zend_Form_Element_Image extends Zend_Form_Element_Xhtml /** * Was this element used to submit the form? - * + * * @return bool */ public function isChecked() @@ -127,5 +127,5 @@ class Zend_Form_Element_Image extends Zend_Form_Element_Xhtml $imageValue = $this->getImageValue(); return ((null !== $imageValue) && ($this->getValue() == $imageValue)); } - + } diff --git a/libs/Zend/Form/Element/MultiCheckbox.php b/libs/Zend/Form/Element/MultiCheckbox.php index 16d5bff..698619d 100644 --- a/libs/Zend/Form/Element/MultiCheckbox.php +++ b/libs/Zend/Form/Element/MultiCheckbox.php @@ -25,16 +25,16 @@ require_once 'Zend/Form/Element/Multi.php'; /** * MultiCheckbox form element * - * Allows specifyinc a (multi-)dimensional associative array of values to use - * as labelled checkboxes; these will return an array of values for those + * Allows specifyinc a (multi-)dimensional associative array of values to use + * as labelled checkboxes; these will return an array of values for those * checkboxes selected. - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MultiCheckbox.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: MultiCheckbox.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_MultiCheckbox extends Zend_Form_Element_Multi { diff --git a/libs/Zend/Form/Element/Multiselect.php b/libs/Zend/Form/Element/Multiselect.php index b3f1e64..dbcb94c 100644 --- a/libs/Zend/Form/Element/Multiselect.php +++ b/libs/Zend/Form/Element/Multiselect.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Select.php'; /** * Multiselect form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Multiselect.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Multiselect.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Multiselect extends Zend_Form_Element_Select { diff --git a/libs/Zend/Form/Element/Password.php b/libs/Zend/Form/Element/Password.php index 03cc967..32cb2e2 100644 --- a/libs/Zend/Form/Element/Password.php +++ b/libs/Zend/Form/Element/Password.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Xhtml.php'; /** * Password form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Password.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Password.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Password extends Zend_Form_Element_Xhtml { @@ -48,7 +48,7 @@ class Zend_Form_Element_Password extends Zend_Form_Element_Xhtml /** * Set flag indicating whether or not to render the password - * @param bool $flag + * @param bool $flag * @return Zend_Form_Element_Password */ public function setRenderPassword($flag) @@ -59,7 +59,7 @@ class Zend_Form_Element_Password extends Zend_Form_Element_Xhtml /** * Get value of renderPassword flag - * + * * @return bool */ public function renderPassword() @@ -71,9 +71,9 @@ class Zend_Form_Element_Password extends Zend_Form_Element_Xhtml * Override isValid() * * Ensure that validation error messages mask password value. - * - * @param string $value - * @param mixed $context + * + * @param string $value + * @param mixed $context * @return bool */ public function isValid($value, $context = null) diff --git a/libs/Zend/Form/Element/Radio.php b/libs/Zend/Form/Element/Radio.php index c021a54..e7795b6 100644 --- a/libs/Zend/Form/Element/Radio.php +++ b/libs/Zend/Form/Element/Radio.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Multi.php'; /** * Radio form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Radio.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Radio.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Radio extends Zend_Form_Element_Multi { @@ -39,4 +39,19 @@ class Zend_Form_Element_Radio extends Zend_Form_Element_Multi * @var string */ public $helper = 'formRadio'; + + /** + * Load default decorators + * + * Disables "for" attribute of label if label decorator enabled. + * + * @return void + */ + public function loadDefaultDecorators() + { + parent::loadDefaultDecorators(); + if (false !== $decorator = $this->getDecorator('Label')) { + $decorator->setOption('disableFor', true); + } + } } diff --git a/libs/Zend/Form/Element/Reset.php b/libs/Zend/Form/Element/Reset.php index b7f399f..b580161 100644 --- a/libs/Zend/Form/Element/Reset.php +++ b/libs/Zend/Form/Element/Reset.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Submit.php'; /** * Reset form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Reset.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Reset.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Reset extends Zend_Form_Element_Submit { diff --git a/libs/Zend/Form/Element/Select.php b/libs/Zend/Form/Element/Select.php index 26d0f4f..0bd7cb8 100644 --- a/libs/Zend/Form/Element/Select.php +++ b/libs/Zend/Form/Element/Select.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Multi.php'; /** * Select.php form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Select.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Select.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Select extends Zend_Form_Element_Multi { diff --git a/libs/Zend/Form/Element/Submit.php b/libs/Zend/Form/Element/Submit.php index e35749c..a0a63af 100644 --- a/libs/Zend/Form/Element/Submit.php +++ b/libs/Zend/Form/Element/Submit.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Xhtml.php'; /** * Submit form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Submit.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Submit.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Submit extends Zend_Form_Element_Xhtml { @@ -42,7 +42,7 @@ class Zend_Form_Element_Submit extends Zend_Form_Element_Xhtml /** * Constructor - * + * * @param string|array|Zend_Config $spec Element name or configuration * @param string|array|Zend_Config $options Element value or configuration * @return void @@ -62,7 +62,7 @@ class Zend_Form_Element_Submit extends Zend_Form_Element_Xhtml * If no label is present, returns the currently set name. * * If a translator is present, returns the translated label. - * + * * @return string */ public function getLabel() @@ -82,7 +82,7 @@ class Zend_Form_Element_Submit extends Zend_Form_Element_Xhtml /** * Has this submit button been selected? - * + * * @return bool */ public function isChecked() @@ -103,7 +103,7 @@ class Zend_Form_Element_Submit extends Zend_Form_Element_Xhtml * Default decorators * * Uses only 'Submit' and 'DtDdWrapper' decorators by default. - * + * * @return void */ public function loadDefaultDecorators() diff --git a/libs/Zend/Form/Element/Text.php b/libs/Zend/Form/Element/Text.php index ca1b251..0b68003 100644 --- a/libs/Zend/Form/Element/Text.php +++ b/libs/Zend/Form/Element/Text.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Xhtml.php'; /** * Text form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Text.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Text.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Text extends Zend_Form_Element_Xhtml { diff --git a/libs/Zend/Form/Element/Textarea.php b/libs/Zend/Form/Element/Textarea.php index 5cebb8a..f7403e3 100644 --- a/libs/Zend/Form/Element/Textarea.php +++ b/libs/Zend/Form/Element/Textarea.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element/Xhtml.php'; /** * Textarea form element - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Textarea.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Textarea.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_Element_Textarea extends Zend_Form_Element_Xhtml { diff --git a/libs/Zend/Form/Element/Xhtml.php b/libs/Zend/Form/Element/Xhtml.php index 3118609..1b080ce 100644 --- a/libs/Zend/Form/Element/Xhtml.php +++ b/libs/Zend/Form/Element/Xhtml.php @@ -24,13 +24,13 @@ require_once 'Zend/Form/Element.php'; /** * Base element for XHTML elements - * + * * @category Zend * @package Zend_Form * @subpackage Element * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Xhtml.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: Xhtml.php 18951 2009-11-12 16:26:19Z alexander $ */ abstract class Zend_Form_Element_Xhtml extends Zend_Form_Element { diff --git a/libs/Zend/Form/SubForm.php b/libs/Zend/Form/SubForm.php index 76fba8e..b395bcc 100644 --- a/libs/Zend/Form/SubForm.php +++ b/libs/Zend/Form/SubForm.php @@ -23,12 +23,12 @@ require_once 'Zend/Form.php'; /** * Zend_Form_SubForm - * + * * @category Zend * @package Zend_Form * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SubForm.php 16218 2009-06-21 19:44:04Z thomas $ + * @version $Id: SubForm.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Form_SubForm extends Zend_Form { @@ -40,7 +40,7 @@ class Zend_Form_SubForm extends Zend_Form /** * Load the default decorators - * + * * @return void */ public function loadDefaultDecorators() diff --git a/libs/Zend/Gdata/App.php b/libs/Zend/Gdata/App.php index 2df94fa..1995db1 100644 --- a/libs/Zend/Gdata/App.php +++ b/libs/Zend/Gdata/App.php @@ -18,7 +18,7 @@ * @subpackage App * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: App.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: App.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -757,7 +757,7 @@ class Zend_Gdata_App if (!$this->_useObjectMapping) { return $feedContent; } - + $protocolVersionStr = $response->getHeader('GData-Version'); $majorProtocolVersion = null; $minorProtocolVersion = null; diff --git a/libs/Zend/Gdata/App/CaptchaRequiredException.php b/libs/Zend/Gdata/App/CaptchaRequiredException.php index 99cc5c9..eb33a08 100644 --- a/libs/Zend/Gdata/App/CaptchaRequiredException.php +++ b/libs/Zend/Gdata/App/CaptchaRequiredException.php @@ -18,7 +18,7 @@ * @subpackage App * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CaptchaRequiredException.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CaptchaRequiredException.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -46,24 +46,24 @@ class Zend_Gdata_App_CaptchaRequiredException extends Zend_Gdata_App_AuthExcepti * The Google Accounts URL prefix. */ const ACCOUNTS_URL = 'https://www.google.com/accounts/'; - + /** * The token identifier from the server. - * + * * @var string */ private $captchaToken; - + /** * The URL of the CAPTCHA image. - * + * * @var string */ private $captchaUrl; - + /** * Constructs the exception to handle a CAPTCHA required response. - * + * * @param string $captchaToken The CAPTCHA token ID provided by the server. * @param string $captchaUrl The URL to the CAPTCHA challenge image. */ @@ -72,23 +72,23 @@ class Zend_Gdata_App_CaptchaRequiredException extends Zend_Gdata_App_AuthExcepti $this->captchaUrl = Zend_Gdata_App_CaptchaRequiredException::ACCOUNTS_URL . $captchaUrl; parent::__construct('CAPTCHA challenge issued by server'); } - + /** * Retrieves the token identifier as provided by the server. - * + * * @return string */ public function getCaptchaToken() { return $this->captchaToken; } - + /** * Retrieves the URL CAPTCHA image as provided by the server. - * + * * @return string */ public function getCaptchaUrl() { return $this->captchaUrl; } - + } diff --git a/libs/Zend/Gdata/App/Feed.php b/libs/Zend/Gdata/App/Feed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/App/FeedEntryParent.php b/libs/Zend/Gdata/App/FeedEntryParent.php old mode 100755 new mode 100644 index 0a3f8a8..72c2172 --- a/libs/Zend/Gdata/App/FeedEntryParent.php +++ b/libs/Zend/Gdata/App/FeedEntryParent.php @@ -18,7 +18,7 @@ * @subpackage App * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FeedEntryParent.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: FeedEntryParent.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -137,7 +137,7 @@ abstract class Zend_Gdata_App_FeedEntryParent extends Zend_Gdata_App_Base } } else { $this->transferFromDOM($element); - } + } } /** diff --git a/libs/Zend/Gdata/App/FeedSourceParent.php b/libs/Zend/Gdata/App/FeedSourceParent.php index 215b2f7..4ae08b7 100644 --- a/libs/Zend/Gdata/App/FeedSourceParent.php +++ b/libs/Zend/Gdata/App/FeedSourceParent.php @@ -18,7 +18,7 @@ * @subpackage App * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FeedSourceParent.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: FeedSourceParent.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -100,7 +100,7 @@ abstract class Zend_Gdata_App_FeedSourceParent extends Zend_Gdata_App_FeedEntryP } return $this; } - + /** * Set the active service instance for this feed and all enclosed entries. * This will be used to perform network requests, such as when calling @@ -117,7 +117,7 @@ abstract class Zend_Gdata_App_FeedSourceParent extends Zend_Gdata_App_FeedEntryP } return $this; } - + /** * Make accessing some individual elements of the feed easier. * diff --git a/libs/Zend/Gdata/App/LoggingHttpClientAdapterSocket.php b/libs/Zend/Gdata/App/LoggingHttpClientAdapterSocket.php index 9c0a444..caba90b 100644 --- a/libs/Zend/Gdata/App/LoggingHttpClientAdapterSocket.php +++ b/libs/Zend/Gdata/App/LoggingHttpClientAdapterSocket.php @@ -16,7 +16,7 @@ * @category Zend * @package Zend_Gdata * @subpackage App - * @version $Id: LoggingHttpClientAdapterSocket.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: LoggingHttpClientAdapterSocket.php 18951 2009-11-12 16:26:19Z alexander $ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -27,7 +27,7 @@ require_once 'Zend/Http/Client/Adapter/Socket.php'; /** - * Overrides the traditional socket-based adapter class for Zend_Http_Client to + * Overrides the traditional socket-based adapter class for Zend_Http_Client to * enable logging of requests. All requests are logged to a location specified * in the config as $config['logfile']. Requests and responses are logged after * they are sent and received/processed, thus an error could prevent logging. diff --git a/libs/Zend/Gdata/App/MediaFileSource.php b/libs/Zend/Gdata/App/MediaFileSource.php index f786416..5a64fc1 100644 --- a/libs/Zend/Gdata/App/MediaFileSource.php +++ b/libs/Zend/Gdata/App/MediaFileSource.php @@ -18,7 +18,7 @@ * @subpackage App * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MediaFileSource.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: MediaFileSource.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -40,7 +40,7 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource /** * The filename which is represented * - * @var string + * @var string */ protected $_filename = null; @@ -50,7 +50,7 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource * @var string */ protected $_contentType = null; - + /** * Create a new Zend_Gdata_App_MediaFileSource object. * @@ -60,7 +60,7 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource { $this->setFilename($filename); } - + /** * Return the MIME multipart representation of this MediaEntry. * @@ -69,7 +69,7 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource */ public function encode() { - if ($this->getFilename() !== null && + if ($this->getFilename() !== null && is_readable($this->getFilename())) { // Retrieves the file, using the include path @@ -84,11 +84,11 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource return $result; } else { require_once 'Zend/Gdata/App/IOException.php'; - throw new Zend_Gdata_App_IOException("Error reading file - " . + throw new Zend_Gdata_App_IOException("Error reading file - " . $this->getFilename() . '. File is not readable.'); } } - + /** * Get the filename associated with this reader. * @@ -101,7 +101,7 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource /** * Set the filename which is to be read. - * + * * @param string $value The desired file handle. * @return Zend_Gdata_App_MediaFileSource Provides a fluent interface. */ @@ -110,8 +110,8 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource $this->_filename = $value; return $this; } - - /** + + /** * The content type for the file attached (example image/png) * * @return string The content type @@ -121,7 +121,7 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource return $this->_contentType; } - /** + /** * Set the content type for the file attached (example image/png) * * @param string $value The content type @@ -132,7 +132,7 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource $this->_contentType = $value; return $this; } - + /** * Alias for getFilename(). * @@ -142,5 +142,5 @@ class Zend_Gdata_App_MediaFileSource extends Zend_Gdata_App_BaseMediaSource { return $this->getFilename(); } - + } diff --git a/libs/Zend/Gdata/App/MediaSource.php b/libs/Zend/Gdata/App/MediaSource.php index 234294c..b5956b4 100644 --- a/libs/Zend/Gdata/App/MediaSource.php +++ b/libs/Zend/Gdata/App/MediaSource.php @@ -18,7 +18,7 @@ * @subpackage App * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MediaSource.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: MediaSource.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,7 +39,7 @@ interface Zend_Gdata_App_MediaSource */ public function encode(); - /** + /** * Set the content type for the file attached (example image/png) * * @param string $value The content type @@ -47,7 +47,7 @@ interface Zend_Gdata_App_MediaSource */ public function setContentType($value); - /** + /** * The content type for the file attached (example image/png) * * @return string The content type @@ -55,7 +55,7 @@ interface Zend_Gdata_App_MediaSource public function getContentType(); /** - * Sets the Slug header value. Used by some services to determine the + * Sets the Slug header value. Used by some services to determine the * title for the uploaded file. A null value indicates no slug header. * * @var string The slug value @@ -64,7 +64,7 @@ interface Zend_Gdata_App_MediaSource public function setSlug($value); /** - * Returns the Slug header value. Used by some services to determine the + * Returns the Slug header value. Used by some services to determine the * title for the uploaded file. Returns null if no slug should be used. * * @return string The slug value diff --git a/libs/Zend/Gdata/AuthSub.php b/libs/Zend/Gdata/AuthSub.php index 881ea8e..484b8e4 100644 --- a/libs/Zend/Gdata/AuthSub.php +++ b/libs/Zend/Gdata/AuthSub.php @@ -18,7 +18,7 @@ * @subpackage Gdata * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AuthSub.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: AuthSub.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -57,26 +57,26 @@ class Zend_Gdata_AuthSub /** * Creates a URI to request a single-use AuthSub token. * - * @param string $next (required) URL identifying the service to be + * @param string $next (required) URL identifying the service to be * accessed. * The resulting token will enable access to the specified service only. * Some services may limit scope further, such as read-only access. - * @param string $scope (required) URL identifying the service to be - * accessed. The resulting token will enable + * @param string $scope (required) URL identifying the service to be + * accessed. The resulting token will enable * access to the specified service only. - * Some services may limit scope further, such + * Some services may limit scope further, such * as read-only access. - * @param int $secure (optional) Boolean flag indicating whether the - * authentication transaction should issue a secure + * @param int $secure (optional) Boolean flag indicating whether the + * authentication transaction should issue a secure * token (1) or a non-secure token (0). Secure tokens * are available to registered applications only. - * @param int $session (optional) Boolean flag indicating whether - * the one-time-use token may be exchanged for + * @param int $session (optional) Boolean flag indicating whether + * the one-time-use token may be exchanged for * a session token (1) or not (0). - * @param string $request_uri (optional) URI to which to direct the + * @param string $request_uri (optional) URI to which to direct the * authentication request. */ - public static function getAuthSubTokenUri($next, $scope, $secure=0, $session=0, + public static function getAuthSubTokenUri($next, $scope, $secure=0, $session=0, $request_uri = self::AUTHSUB_REQUEST_URI) { $querystring = '?next=' . urlencode($next) @@ -91,21 +91,21 @@ class Zend_Gdata_AuthSub * Upgrades a single use token to a session token * * @param string $token The single use token which is to be upgraded - * @param Zend_Http_Client $client (optional) HTTP client to use to + * @param Zend_Http_Client $client (optional) HTTP client to use to * make the request - * @param string $request_uri (optional) URI to which to direct + * @param string $request_uri (optional) URI to which to direct * the session token upgrade * @return string The upgraded token value * @throws Zend_Gdata_App_AuthException * @throws Zend_Gdata_App_HttpException */ public static function getAuthSubSessionToken( - $token, $client = null, + $token, $client = null, $request_uri = self::AUTHSUB_SESSION_TOKEN_URI) { $client = self::getHttpClient($token, $client); - - if ($client instanceof Zend_Gdata_HttpClient) { + + if ($client instanceof Zend_Gdata_HttpClient) { $filterResult = $client->filterHttpRequest('GET', $request_uri); $url = $filterResult['url']; $headers = $filterResult['headers']; @@ -153,7 +153,7 @@ class Zend_Gdata_AuthSub $request_uri = self::AUTHSUB_REVOKE_TOKEN_URI) { $client = self::getHttpClient($token, $client); - + if ($client instanceof Zend_Gdata_HttpClient) { $filterResult = $client->filterHttpRequest('GET', $request_uri); $url = $filterResult['url']; @@ -186,9 +186,9 @@ class Zend_Gdata_AuthSub * get token information * * @param string $token The token to retrieve information about - * @param Zend_Http_Client $client (optional) HTTP client to use to + * @param Zend_Http_Client $client (optional) HTTP client to use to * make the request - * @param string $request_uri (optional) URI to which to direct + * @param string $request_uri (optional) URI to which to direct * the information request */ public static function getAuthSubTokenInfo( diff --git a/libs/Zend/Gdata/Books.php b/libs/Zend/Gdata/Books.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Books/VolumeQuery.php b/libs/Zend/Gdata/Books/VolumeQuery.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/ClientLogin.php b/libs/Zend/Gdata/ClientLogin.php index 8e8e25e..5524e45 100644 --- a/libs/Zend/Gdata/ClientLogin.php +++ b/libs/Zend/Gdata/ClientLogin.php @@ -18,7 +18,7 @@ * @subpackage Gdata * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ClientLogin.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ClientLogin.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -71,7 +71,7 @@ class Zend_Gdata_ClientLogin * @param string $loginToken The token identifier as provided by the server. * @param string $loginCaptcha The user's response to the CAPTCHA challenge. * @param string $accountType An optional string to identify whether the - * account to be authenticated is a google or a hosted account. Defaults to + * account to be authenticated is a google or a hosted account. Defaults to * 'HOSTED_OR_GOOGLE'. See: http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html#Request * @throws Zend_Gdata_App_AuthException * @throws Zend_Gdata_App_HttpException @@ -119,7 +119,7 @@ class Zend_Gdata_ClientLogin if ($loginToken || $loginCaptcha) { if($loginToken && $loginCaptcha) { $client->setParameterPost('logintoken', (string) $loginToken); - $client->setParameterPost('logincaptcha', + $client->setParameterPost('logincaptcha', (string) $loginCaptcha); } else { diff --git a/libs/Zend/Gdata/Docs.php b/libs/Zend/Gdata/Docs.php old mode 100755 new mode 100644 index 817ef7a..e615798 --- a/libs/Zend/Gdata/Docs.php +++ b/libs/Zend/Gdata/Docs.php @@ -18,7 +18,7 @@ * @subpackage Docs * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Docs.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Docs.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -80,11 +80,11 @@ class Zend_Gdata_Docs extends Zend_Gdata /** * Looks up the mime type based on the file name extension. For example, - * calling this method with 'csv' would return - * 'text/comma-separated-values'. The Mime type is sent as a header in + * calling this method with 'csv' would return + * 'text/comma-separated-values'. The Mime type is sent as a header in * the upload HTTP POST request. * - * @param string $fileExtension + * @param string $fileExtension * @return string The mime type to be sent to the server to tell it how the * multipart mime data should be interpreted. */ @@ -135,14 +135,14 @@ class Zend_Gdata_Docs extends Zend_Gdata * * This method builds the URL where this item is stored using the type * and the id of the document. - * @param string $docId The URL key for the document. Examples: + * @param string $docId The URL key for the document. Examples: * dcmg89gw_62hfjj8m, pKq0CzjiF3YmGd0AIlHKqeg * @param string $docType The type of the document as used in the Google * Document List URLs. Examples: document, spreadsheet, presentation * @return Zend_Gdata_Docs_DocumentListEntry */ public function getDoc($docId, $docType) { - $location = 'http://docs.google.com/feeds/documents/private/full/' . + $location = 'http://docs.google.com/feeds/documents/private/full/' . $docType . '%3A' . $docId; return $this->getDocumentListEntry($location); } @@ -150,27 +150,27 @@ class Zend_Gdata_Docs extends Zend_Gdata /** * Retreive entry object for the desired word processing document. * - * @param string $id The URL id for the document. Example: + * @param string $id The URL id for the document. Example: * dcmg89gw_62hfjj8m */ public function getDocument($id) { return $this->getDoc($id, 'document'); } - + /** * Retreive entry object for the desired spreadsheet. * - * @param string $id The URL id for the document. Example: + * @param string $id The URL id for the document. Example: * pKq0CzjiF3YmGd0AIlHKqeg */ public function getSpreadsheet($id) { return $this->getDoc($id, 'spreadsheet'); } - + /** * Retreive entry object for the desired presentation. * - * @param string $id The URL id for the document. Example: + * @param string $id The URL id for the document. Example: * dcmg89gw_21gtrjcn */ public function getPresentation($id) { @@ -178,35 +178,35 @@ class Zend_Gdata_Docs extends Zend_Gdata } /** - * Upload a local file to create a new Google Document entry. + * Upload a local file to create a new Google Document entry. * * @param string $fileLocation The full or relative path of the file to * be uploaded. - * @param string $title The name that this document should have on the + * @param string $title The name that this document should have on the * server. If set, the title is used as the slug header in the - * POST request. If no title is provided, the location of the - * file will be used as the slug header in the request. If no + * POST request. If no title is provided, the location of the + * file will be used as the slug header in the request. If no * mimeType is provided, this method attempts to determine the - * mime type based on the slugHeader by looking for .doc, + * mime type based on the slugHeader by looking for .doc, * .csv, .txt, etc. at the end of the file name. * Example value: 'test.doc'. * @param string $mimeType Describes the type of data which is being sent - * to the server. This must be one of the accepted mime types + * to the server. This must be one of the accepted mime types * which are enumerated in SUPPORTED_FILETYPES. - * @param string $uri (optional) The URL to which the upload should be + * @param string $uri (optional) The URL to which the upload should be * made. * Example: 'http://docs.google.com/feeds/documents/private/full'. - * @return Zend_Gdata_Docs_DocumentListEntry The entry for the newly + * @return Zend_Gdata_Docs_DocumentListEntry The entry for the newly * created Google Document. */ - public function uploadFile($fileLocation, $title=null, $mimeType=null, + public function uploadFile($fileLocation, $title=null, $mimeType=null, $uri=null) { // Set the URI to which the file will be uploaded. if ($uri === null) { $uri = $this->_defaultPostUri; } - + // Create the media source which describes the file. $fs = $this->newMediaFileSource($fileLocation); if ($title !== null) { @@ -214,9 +214,9 @@ class Zend_Gdata_Docs extends Zend_Gdata } else { $slugHeader = $fileLocation; } - - // Set the slug header to tell the Google Documents server what the - // title of the document should be and what the file extension was + + // Set the slug header to tell the Google Documents server what the + // title of the document should be and what the file extension was // for the original file. $fs->setSlug($slugHeader); @@ -226,10 +226,10 @@ class Zend_Gdata_Docs extends Zend_Gdata $fileExtension = end($filenameParts); $mimeType = self::lookupMimeType($fileExtension); } - + // Set the mime type for the upload request. $fs->setContentType($mimeType); - + // Send the data to the server. return $this->insertDocument($fs, $uri); } @@ -237,17 +237,17 @@ class Zend_Gdata_Docs extends Zend_Gdata /** * Inserts an entry to a given URI and returns the response as an Entry. * - * @param mixed $data The Zend_Gdata_Docs_DocumentListEntry or media + * @param mixed $data The Zend_Gdata_Docs_DocumentListEntry or media * source to post. If it is a DocumentListEntry, the mediaSource - * should already have been set. If $data is a mediaSource, it + * should already have been set. If $data is a mediaSource, it * should have the correct slug header and mime type. * @param string $uri POST URI - * @param string $className (optional) The class of entry to be returned. + * @param string $className (optional) The class of entry to be returned. * The default is a 'Zend_Gdata_Docs_DocumentListEntry'. - * @return Zend_Gdata_Docs_DocumentListEntry The entry returned by the + * @return Zend_Gdata_Docs_DocumentListEntry The entry returned by the * service after insertion. */ - public function insertDocument($data, $uri, + public function insertDocument($data, $uri, $className='Zend_Gdata_Docs_DocumentListEntry') { return $this->insertEntry($data, $uri, $className); diff --git a/libs/Zend/Gdata/Docs/DocumentListEntry.php b/libs/Zend/Gdata/Docs/DocumentListEntry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Docs/DocumentListFeed.php b/libs/Zend/Gdata/Docs/DocumentListFeed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Docs/Query.php b/libs/Zend/Gdata/Docs/Query.php old mode 100755 new mode 100644 index cfcfe90..9d8a6aa --- a/libs/Zend/Gdata/Docs/Query.php +++ b/libs/Zend/Gdata/Docs/Query.php @@ -18,7 +18,7 @@ * @subpackage Docs * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Query.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Query.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -55,8 +55,8 @@ class Zend_Gdata_Docs_Query extends Zend_Gdata_Query protected $_defaultFeedUri = self::DOCUMENTS_LIST_FEED_URI; /** - * The visibility to be used when querying for the feed. A request for a - * feed with private visbility requires the user to be authenricated. + * The visibility to be used when querying for the feed. A request for a + * feed with private visbility requires the user to be authenricated. * Private is the only avilable visibility for the documents list. * * @var string @@ -81,7 +81,7 @@ class Zend_Gdata_Docs_Query extends Zend_Gdata_Query } /** - * Sets the projection for this query. Common values for projection + * Sets the projection for this query. Common values for projection * include 'full'. * * @param string $value @@ -127,7 +127,7 @@ class Zend_Gdata_Docs_Query extends Zend_Gdata_Query /** * Sets the title attribute for this query. The title parameter is used - * to restrict the results to documents whose titles either contain or + * to restrict the results to documents whose titles either contain or * completely match the title. * * @param string $value diff --git a/libs/Zend/Gdata/DublinCore.php b/libs/Zend/Gdata/DublinCore.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif.php b/libs/Zend/Gdata/Exif.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Entry.php b/libs/Zend/Gdata/Exif/Entry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/Distance.php b/libs/Zend/Gdata/Exif/Extension/Distance.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/Exposure.php b/libs/Zend/Gdata/Exif/Extension/Exposure.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/FStop.php b/libs/Zend/Gdata/Exif/Extension/FStop.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/Flash.php b/libs/Zend/Gdata/Exif/Extension/Flash.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/FocalLength.php b/libs/Zend/Gdata/Exif/Extension/FocalLength.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/ImageUniqueId.php b/libs/Zend/Gdata/Exif/Extension/ImageUniqueId.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/Iso.php b/libs/Zend/Gdata/Exif/Extension/Iso.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/Make.php b/libs/Zend/Gdata/Exif/Extension/Make.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/Model.php b/libs/Zend/Gdata/Exif/Extension/Model.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/Tags.php b/libs/Zend/Gdata/Exif/Extension/Tags.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Extension/Time.php b/libs/Zend/Gdata/Exif/Extension/Time.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Exif/Feed.php b/libs/Zend/Gdata/Exif/Feed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Gapps/EmailListFeed.php b/libs/Zend/Gdata/Gapps/EmailListFeed.php index 21a7e8c..c0c9ba4 100644 --- a/libs/Zend/Gdata/Gapps/EmailListFeed.php +++ b/libs/Zend/Gdata/Gapps/EmailListFeed.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: EmailListFeed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: EmailListFeed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,10 +32,10 @@ require_once 'Zend/Gdata/Feed.php'; require_once 'Zend/Gdata/Gapps/EmailListEntry.php'; /** - * Data model for a collection of Google Apps email list entries, usually + * Data model for a collection of Google Apps email list entries, usually * provided by the Google Apps servers. - * - * For information on requesting this feed from a server, see the Google + * + * For information on requesting this feed from a server, see the Google * Apps service class, Zend_Gdata_Gapps. * * @category Zend @@ -46,8 +46,8 @@ require_once 'Zend/Gdata/Gapps/EmailListEntry.php'; */ class Zend_Gdata_Gapps_EmailListFeed extends Zend_Gdata_Feed { - + protected $_entryClassName = 'Zend_Gdata_Gapps_EmailListEntry'; protected $_feedClassName = 'Zend_Gdata_Gapps_EmailListFeed'; - + } diff --git a/libs/Zend/Gdata/Gapps/EmailListQuery.php b/libs/Zend/Gdata/Gapps/EmailListQuery.php index 2d668a4..fb1ccf5 100644 --- a/libs/Zend/Gdata/Gapps/EmailListQuery.php +++ b/libs/Zend/Gdata/Gapps/EmailListQuery.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: EmailListQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: EmailListQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,13 +27,13 @@ require_once('Zend/Gdata/Gapps/Query.php'); /** - * Assists in constructing queries for Google Apps email list entries. - * Instances of this class can be provided in many places where a URL is + * Assists in constructing queries for Google Apps email list entries. + * Instances of this class can be provided in many places where a URL is * required. - * + * * For information on submitting queries to a server, see the Google Apps * service class, Zend_Gdata_Gapps. - * + * * @category Zend * @package Zend_Gdata * @subpackage Gapps @@ -44,26 +44,26 @@ class Zend_Gdata_Gapps_EmailListQuery extends Zend_Gdata_Gapps_Query { /** - * A string which, if not null, indicates which email list should + * A string which, if not null, indicates which email list should * be retrieved by this query. - * + * * @var string */ protected $_emailListName = null; /** * Create a new instance. - * - * @param string $domain (optional) The Google Apps-hosted domain to use + * + * @param string $domain (optional) The Google Apps-hosted domain to use * when constructing query URIs. - * @param string $emailListName (optional) Value for the emailListName + * @param string $emailListName (optional) Value for the emailListName * property. - * @param string $recipient (optional) Value for the recipient + * @param string $recipient (optional) Value for the recipient * property. - * @param string $startEmailListName (optional) Value for the + * @param string $startEmailListName (optional) Value for the * startEmailListName property. */ - public function __construct($domain = null, $emailListName = null, + public function __construct($domain = null, $emailListName = null, $recipient = null, $startEmailListName = null) { parent::__construct($domain); @@ -73,11 +73,11 @@ class Zend_Gdata_Gapps_EmailListQuery extends Zend_Gdata_Gapps_Query } /** - * Set the email list name to query for. When set, only lists with a name - * matching this value will be returned in search results. Set to + * Set the email list name to query for. When set, only lists with a name + * matching this value will be returned in search results. Set to * null to disable filtering by list name. - * - * @param string $value The email list name to filter search results by, + * + * @param string $value The email list name to filter search results by, * or null to disable. */ public function setEmailListName($value) @@ -86,9 +86,9 @@ class Zend_Gdata_Gapps_EmailListQuery extends Zend_Gdata_Gapps_Query } /** - * Get the email list name to query for. If no name is set, null will be + * Get the email list name to query for. If no name is set, null will be * returned. - * + * * @see setEmailListName * @return string The email list name to filter search results by, or null * if disabled. @@ -99,11 +99,11 @@ class Zend_Gdata_Gapps_EmailListQuery extends Zend_Gdata_Gapps_Query } /** - * Set the recipient to query for. When set, only subscribers with an - * email address matching this value will be returned in search results. + * Set the recipient to query for. When set, only subscribers with an + * email address matching this value will be returned in search results. * Set to null to disable filtering by username. - * - * @param string $value The recipient email address to filter search + * + * @param string $value The recipient email address to filter search * results by, or null to disable. */ public function setRecipient($value) @@ -117,11 +117,11 @@ class Zend_Gdata_Gapps_EmailListQuery extends Zend_Gdata_Gapps_Query } /** - * Get the recipient email address to query for. If no recipient is set, + * Get the recipient email address to query for. If no recipient is set, * null will be returned. - * + * * @see setRecipient - * @return string The recipient email address to filter search results by, + * @return string The recipient email address to filter search results by, * or null if disabled. */ public function getRecipient() @@ -134,10 +134,10 @@ class Zend_Gdata_Gapps_EmailListQuery extends Zend_Gdata_Gapps_Query } /** - * Set the first email list which should be displayed when retrieving + * Set the first email list which should be displayed when retrieving * a list of email lists. - * - * @param string $value The first email list to be returned, or null to + * + * @param string $value The first email list to be returned, or null to * disable. */ public function setStartEmailListName($value) @@ -150,10 +150,10 @@ class Zend_Gdata_Gapps_EmailListQuery extends Zend_Gdata_Gapps_Query } /** - * Get the first email list which should be displayed when retrieving + * Get the first email list which should be displayed when retrieving * a list of email lists. - * - * @return string The first email list to be returned, or null to + * + * @return string The first email list to be returned, or null to * disable. */ public function getStartEmailListName() @@ -166,15 +166,15 @@ class Zend_Gdata_Gapps_EmailListQuery extends Zend_Gdata_Gapps_Query } /** - * Returns the URL generated for this query, based on it's current + * Returns the URL generated for this query, based on it's current * parameters. - * + * * @return string A URL generated based on the state of this query. * @throws Zend_Gdata_App_InvalidArgumentException */ public function getQueryUrl() { - + $uri = $this->getBaseUrl(); $uri .= Zend_Gdata_Gapps::APPS_EMAIL_LIST_PATH; if ($this->_emailListName !== null) { diff --git a/libs/Zend/Gdata/Gapps/EmailListRecipientFeed.php b/libs/Zend/Gdata/Gapps/EmailListRecipientFeed.php index c8841bf..f3dfe71 100644 --- a/libs/Zend/Gdata/Gapps/EmailListRecipientFeed.php +++ b/libs/Zend/Gdata/Gapps/EmailListRecipientFeed.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: EmailListRecipientFeed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: EmailListRecipientFeed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,10 +32,10 @@ require_once 'Zend/Gdata/Feed.php'; require_once 'Zend/Gdata/Gapps/EmailListRecipientEntry.php'; /** - * Data model for a collection of Google Apps email list recipient entries, + * Data model for a collection of Google Apps email list recipient entries, * usually provided by the Google Apps servers. - * - * For information on requesting this feed from a server, see the Google + * + * For information on requesting this feed from a server, see the Google * Apps service class, Zend_Gdata_Gapps. * * @category Zend @@ -46,8 +46,8 @@ require_once 'Zend/Gdata/Gapps/EmailListRecipientEntry.php'; */ class Zend_Gdata_Gapps_EmailListRecipientFeed extends Zend_Gdata_Feed { - + protected $_entryClassName = 'Zend_Gdata_Gapps_EmailListRecipientEntry'; protected $_feedClassName = 'Zend_Gdata_Gapps_EmailListRecipientFeed'; - + } diff --git a/libs/Zend/Gdata/Gapps/EmailListRecipientQuery.php b/libs/Zend/Gdata/Gapps/EmailListRecipientQuery.php index 0fc3b36..65de6b4 100644 --- a/libs/Zend/Gdata/Gapps/EmailListRecipientQuery.php +++ b/libs/Zend/Gdata/Gapps/EmailListRecipientQuery.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: EmailListRecipientQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: EmailListRecipientQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,13 +27,13 @@ require_once('Zend/Gdata/Gapps/Query.php'); /** - * Assists in constructing queries for Google Apps email list recipient - * entries. Instances of this class can be provided in many places where a + * Assists in constructing queries for Google Apps email list recipient + * entries. Instances of this class can be provided in many places where a * URL is required. - * + * * For information on submitting queries to a server, see the Google Apps * service class, Zend_Gdata_Gapps. - * + * * @category Zend * @package Zend_Gdata * @subpackage Gapps @@ -42,23 +42,23 @@ require_once('Zend/Gdata/Gapps/Query.php'); */ class Zend_Gdata_Gapps_EmailListRecipientQuery extends Zend_Gdata_Gapps_Query { - + /** - * If not null, specifies the name of the email list which + * If not null, specifies the name of the email list which * should be requested by this query. - * + * * @var string */ protected $_emailListName = null; /** * Create a new instance. - * - * @param string $domain (optional) The Google Apps-hosted domain to use + * + * @param string $domain (optional) The Google Apps-hosted domain to use * when constructing query URIs. - * @param string $emailListName (optional) Value for the emailListName + * @param string $emailListName (optional) Value for the emailListName * property. - * @param string $startRecipient (optional) Value for the + * @param string $startRecipient (optional) Value for the * startRecipient property. */ public function __construct($domain = null, $emailListName = null, @@ -68,13 +68,13 @@ class Zend_Gdata_Gapps_EmailListRecipientQuery extends Zend_Gdata_Gapps_Query $this->setEmailListName($emailListName); $this->setStartRecipient($startRecipient); } - + /** - * Set the email list name to query for. When set, only lists with a name - * matching this value will be returned in search results. Set to + * Set the email list name to query for. When set, only lists with a name + * matching this value will be returned in search results. Set to * null to disable filtering by list name. - * - * @param string $value The email list name to filter search results by, + * + * @param string $value The email list name to filter search results by, * or null to disable. */ public function setEmailListName($value) @@ -83,10 +83,10 @@ class Zend_Gdata_Gapps_EmailListRecipientQuery extends Zend_Gdata_Gapps_Query } /** - * Get the email list name to query for. If no name is set, null will be + * Get the email list name to query for. If no name is set, null will be * returned. - * - * @param string $value The email list name to filter search results by, + * + * @param string $value The email list name to filter search results by, * or null if disabled. */ public function getEmailListName() @@ -95,10 +95,10 @@ class Zend_Gdata_Gapps_EmailListRecipientQuery extends Zend_Gdata_Gapps_Query } /** - * Set the first recipient which should be displayed when retrieving + * Set the first recipient which should be displayed when retrieving * a list of email list recipients. - * - * @param string $value The first recipient to be returned, or null to + * + * @param string $value The first recipient to be returned, or null to * disable. */ public function setStartRecipient($value) @@ -111,10 +111,10 @@ class Zend_Gdata_Gapps_EmailListRecipientQuery extends Zend_Gdata_Gapps_Query } /** - * Get the first recipient which should be displayed when retrieving + * Get the first recipient which should be displayed when retrieving * a list of email list recipients. - * - * @return string The first recipient to be returned, or null if + * + * @return string The first recipient to be returned, or null if * disabled. */ public function getStartRecipient() @@ -127,15 +127,15 @@ class Zend_Gdata_Gapps_EmailListRecipientQuery extends Zend_Gdata_Gapps_Query } /** - * Returns the URL generated for this query, based on it's current + * Returns the URL generated for this query, based on it's current * parameters. - * + * * @return string A URL generated based on the state of this query. * @throws Zend_Gdata_App_InvalidArgumentException */ public function getQueryUrl() { - + $uri = $this->getBaseUrl(); $uri .= Zend_Gdata_Gapps::APPS_EMAIL_LIST_PATH; if ($this->_emailListName !== null) { diff --git a/libs/Zend/Gdata/Gapps/Error.php b/libs/Zend/Gdata/Gapps/Error.php index 8b57892..0409fd0 100644 --- a/libs/Zend/Gdata/Gapps/Error.php +++ b/libs/Zend/Gdata/Gapps/Error.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Error.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Error.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -28,12 +28,12 @@ require_once 'Zend/Gdata/App/Base.php'; /** - * Gdata Gapps Error class. This class is used to represent errors returned - * within an AppsForYourDomainErrors message received from the Google Apps + * Gdata Gapps Error class. This class is used to represent errors returned + * within an AppsForYourDomainErrors message received from the Google Apps * servers. * - * Several different errors may be represented by this class, determined by - * the error code returned by the server. For a list of error codes + * Several different errors may be represented by this class, determined by + * the error code returned by the server. For a list of error codes * available at the time of this writing, see getErrorCode. * * @category Zend @@ -44,10 +44,10 @@ require_once 'Zend/Gdata/App/Base.php'; */ class Zend_Gdata_Gapps_Error extends Zend_Gdata_App_Base { - - // Error codes as defined at + + // Error codes as defined at // http://code.google.com/apis/apps/gdata_provisioning_api_v2.0_reference.html#appendix_d - + const UNKNOWN_ERROR = 1000; const USER_DELETED_RECENTLY = 1100; const USER_SUSPENDED = 1101; @@ -68,34 +68,34 @@ class Zend_Gdata_Gapps_Error extends Zend_Gdata_App_Base const INVALID_EMAIL_ADDRESS = 1406; const INVALID_QUERY_PARAMETER_VALUE = 1407; const TOO_MANY_RECIPIENTS_ON_EMAIL_LIST = 1500; - + protected $_errorCode = null; protected $_reason = null; protected $_invalidInput = null; - - public function __construct($errorCode = null, $reason = null, + + public function __construct($errorCode = null, $reason = null, $invalidInput = null) { parent::__construct("Google Apps error received: $errorCode ($reason)"); $this->_errorCode = $errorCode; $this->_reason = $reason; $this->_invalidInput = $invalidInput; } - + /** - * Set the error code for this exception. For more information about + * Set the error code for this exception. For more information about * error codes, see getErrorCode. - * + * * @see getErrorCode * @param integer $value The new value for the error code. */ public function setErrorCode($value) { $this->_errorCode = $value; } - - /** - * Get the error code for this exception. Currently valid values are + + /** + * Get the error code for this exception. Currently valid values are * available as constants within this class. These values are: - * + * * UNKNOWN_ERROR (1000) * USER_DELETED_RECENTLY (1100) * USER_SUSPENDED (1101) @@ -116,14 +116,14 @@ class Zend_Gdata_Gapps_Error extends Zend_Gdata_App_Base * INVALID_EMAIL_ADDRESS (1406) * INVALID_QUERY_PARAMETER_VALUE (1407) * TOO_MANY_RECIPIENTS_ON_EMAIL_LIST (1500) - * - * Numbers in parenthesis indicate the actual integer value of the - * constant. This list should not be treated as exhaustive, as additional + * + * Numbers in parenthesis indicate the actual integer value of the + * constant. This list should not be treated as exhaustive, as additional * error codes may be added at any time. - * - * For more information about these codes and their meaning, please + * + * For more information about these codes and their meaning, please * see Appendix D of the Google Apps Provisioning API Reference. - * + * * @link http://code.google.com/apis/apps/gdata_provisioning_api_v2.0_reference.html#appendix_d Google Apps Provisioning API Reference: Appendix D - Gdata Error Codes * @see setErrorCode * @return integer The error code returned by the Google Apps server. @@ -131,20 +131,20 @@ class Zend_Gdata_Gapps_Error extends Zend_Gdata_App_Base public function getErrorCode() { return $this->_errorCode; } - + /** * Set human-readable text describing the reason this exception occurred. - * + * * @see getReason * @param string $value The reason this exception occurred. */ public function setReason($value) { $this->_reason = $value; } - + /** * Get human-readable text describing the reason this exception occurred. - * + * * @see setReason * @return string The reason this exception occurred. */ @@ -154,24 +154,24 @@ class Zend_Gdata_Gapps_Error extends Zend_Gdata_App_Base /** * Set the invalid input which caused this exception. - * + * * @see getInvalidInput * @param string $value The invalid input that triggered this exception. */ public function setInvalidInput($value) { $this->_invalidInput = $value; } - + /** * Set the invalid input which caused this exception. - * + * * @see setInvalidInput * @return string The reason this exception occurred. */ public function getInvalidInput() { return $this->_invalidInput; } - + /** * Retrieves a DOMElement which corresponds to this element and all * child properties. This is used to build an entry back into a DOM @@ -195,7 +195,7 @@ class Zend_Gdata_Gapps_Error extends Zend_Gdata_App_Base } return $element; } - + /** * Given a DOMNode representing an attribute, tries to map the data into * instance members. If no mapping is defined, the name and value are @@ -219,10 +219,10 @@ class Zend_Gdata_Gapps_Error extends Zend_Gdata_App_Base parent::takeAttributeFromDOM($attribute); } } - + /** * Get a human readable version of this exception. - * + * * @return string */ public function __toString() { diff --git a/libs/Zend/Gdata/Gapps/NicknameFeed.php b/libs/Zend/Gdata/Gapps/NicknameFeed.php index 176d3d8..274ffe9 100644 --- a/libs/Zend/Gdata/Gapps/NicknameFeed.php +++ b/libs/Zend/Gdata/Gapps/NicknameFeed.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: NicknameFeed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: NicknameFeed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,10 +32,10 @@ require_once 'Zend/Gdata/Feed.php'; require_once 'Zend/Gdata/Gapps/NicknameEntry.php'; /** - * Data model for a collection of Google Apps nickname entries, usually + * Data model for a collection of Google Apps nickname entries, usually * provided by the Google Apps servers. - * - * For information on requesting this feed from a server, see the Google + * + * For information on requesting this feed from a server, see the Google * Apps service class, Zend_Gdata_Gapps. * * @category Zend @@ -46,8 +46,8 @@ require_once 'Zend/Gdata/Gapps/NicknameEntry.php'; */ class Zend_Gdata_Gapps_NicknameFeed extends Zend_Gdata_Feed { - + protected $_entryClassName = 'Zend_Gdata_Gapps_NicknameEntry'; protected $_feedClassName = 'Zend_Gdata_Gapps_NicknameFeed'; - + } diff --git a/libs/Zend/Gdata/Gapps/NicknameQuery.php b/libs/Zend/Gdata/Gapps/NicknameQuery.php index 0c9a97b..f8cff7e 100644 --- a/libs/Zend/Gdata/Gapps/NicknameQuery.php +++ b/libs/Zend/Gdata/Gapps/NicknameQuery.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: NicknameQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: NicknameQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,13 +27,13 @@ require_once('Zend/Gdata/Gapps/Query.php'); /** - * Assists in constructing queries for Google Apps nickname entries. - * Instances of this class can be provided in many places where a URL is + * Assists in constructing queries for Google Apps nickname entries. + * Instances of this class can be provided in many places where a URL is * required. - * + * * For information on submitting queries to a server, see the Google Apps * service class, Zend_Gdata_Gapps. - * + * * @category Zend * @package Zend_Gdata * @subpackage Gapps @@ -44,26 +44,26 @@ class Zend_Gdata_Gapps_NicknameQuery extends Zend_Gdata_Gapps_Query { /** - * If not null, indicates the name of the nickname entry which + * If not null, indicates the name of the nickname entry which * should be returned by this query. - * + * * @var string */ protected $_nickname = null; /** * Create a new instance. - * - * @param string $domain (optional) The Google Apps-hosted domain to use + * + * @param string $domain (optional) The Google Apps-hosted domain to use * when constructing query URIs. - * @param string $nickname (optional) Value for the nickname + * @param string $nickname (optional) Value for the nickname * property. - * @param string $username (optional) Value for the username + * @param string $username (optional) Value for the username * property. - * @param string $startNickname (optional) Value for the + * @param string $startNickname (optional) Value for the * startNickname property. */ - public function __construct($domain = null, $nickname = null, + public function __construct($domain = null, $nickname = null, $username = null, $startNickname = null) { parent::__construct($domain); @@ -73,11 +73,11 @@ class Zend_Gdata_Gapps_NicknameQuery extends Zend_Gdata_Gapps_Query } /** - * Set the nickname to query for. When set, only users with a nickname - * matching this value will be returned in search results. Set to + * Set the nickname to query for. When set, only users with a nickname + * matching this value will be returned in search results. Set to * null to disable filtering by username. - * - * @param string $value The nickname to filter search results by, or null + * + * @param string $value The nickname to filter search results by, or null * to disable. */ public function setNickname($value) @@ -86,11 +86,11 @@ class Zend_Gdata_Gapps_NicknameQuery extends Zend_Gdata_Gapps_Query } /** - * Get the nickname to query for. If no nickname is set, null will be + * Get the nickname to query for. If no nickname is set, null will be * returned. - * + * * @see setNickname - * @return string The nickname to filter search results by, or null if + * @return string The nickname to filter search results by, or null if * disabled. */ public function getNickname() @@ -99,11 +99,11 @@ class Zend_Gdata_Gapps_NicknameQuery extends Zend_Gdata_Gapps_Query } /** - * Set the username to query for. When set, only users with a username - * matching this value will be returned in search results. Set to + * Set the username to query for. When set, only users with a username + * matching this value will be returned in search results. Set to * null to disable filtering by username. - * - * @param string $value The username to filter search results by, or null + * + * @param string $value The username to filter search results by, or null * to disable. */ public function setUsername($value) @@ -117,11 +117,11 @@ class Zend_Gdata_Gapps_NicknameQuery extends Zend_Gdata_Gapps_Query } /** - * Get the username to query for. If no username is set, null will be + * Get the username to query for. If no username is set, null will be * returned. - * + * * @see setUsername - * @return string The username to filter search results by, or null if + * @return string The username to filter search results by, or null if * disabled. */ public function getUsername() @@ -134,10 +134,10 @@ class Zend_Gdata_Gapps_NicknameQuery extends Zend_Gdata_Gapps_Query } /** - * Set the first nickname which should be displayed when retrieving + * Set the first nickname which should be displayed when retrieving * a list of nicknames. - * - * @param string $value The first nickname to be returned, or null to + * + * @param string $value The first nickname to be returned, or null to * disable. */ public function setStartNickname($value) @@ -150,10 +150,10 @@ class Zend_Gdata_Gapps_NicknameQuery extends Zend_Gdata_Gapps_Query } /** - * Get the first nickname which should be displayed when retrieving + * Get the first nickname which should be displayed when retrieving * a list of nicknames. - * - * @return string The first nickname to be returned, or null to + * + * @return string The first nickname to be returned, or null to * disable. */ public function getStartNickname() @@ -166,14 +166,14 @@ class Zend_Gdata_Gapps_NicknameQuery extends Zend_Gdata_Gapps_Query } /** - * Returns the URL generated for this query, based on it's current + * Returns the URL generated for this query, based on it's current * parameters. - * + * * @return string A URL generated based on the state of this query. */ public function getQueryUrl() { - + $uri = $this->getBaseUrl(); $uri .= Zend_Gdata_Gapps::APPS_NICKNAME_PATH; if ($this->_nickname !== null) { diff --git a/libs/Zend/Gdata/Gapps/Query.php b/libs/Zend/Gdata/Gapps/Query.php index d13d82e..f37e8e1 100644 --- a/libs/Zend/Gdata/Gapps/Query.php +++ b/libs/Zend/Gdata/Gapps/Query.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Query.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Query.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,12 +32,12 @@ require_once('Zend/Gdata/Query.php'); require_once('Zend/Gdata/Gapps.php'); /** - * Assists in constructing queries for Google Apps entries. This class + * Assists in constructing queries for Google Apps entries. This class * provides common methods used by all other Google Apps query classes. * - * This class should never be instantiated directly. Instead, instantiate a + * This class should never be instantiated directly. Instead, instantiate a * class which inherits from this class. - * + * * @category Zend * @package Zend_Gdata * @subpackage Gapps @@ -46,18 +46,18 @@ require_once('Zend/Gdata/Gapps.php'); */ abstract class Zend_Gdata_Gapps_Query extends Zend_Gdata_Query { - + /** * The domain which is being administered via the Provisioning API. * * @var string */ protected $_domain = null; - + /** * Create a new instance. - * - * @param string $domain (optional) The Google Apps-hosted domain to use + * + * @param string $domain (optional) The Google Apps-hosted domain to use * when constructing query URIs. */ public function __construct($domain = null) @@ -65,16 +65,16 @@ abstract class Zend_Gdata_Gapps_Query extends Zend_Gdata_Query parent::__construct(); $this->_domain = $domain; } - + /** - * Set domain for this service instance. This should be a fully qualified + * Set domain for this service instance. This should be a fully qualified * domain, such as 'foo.example.com'. * - * This value is used when calculating URLs for retrieving and posting - * entries. If no value is specified, a URL will have to be manually - * constructed prior to using any methods which interact with the Google + * This value is used when calculating URLs for retrieving and posting + * entries. If no value is specified, a URL will have to be manually + * constructed prior to using any methods which interact with the Google * Apps provisioning service. - * + * * @param string $value The domain to be used for this session. */ public function setDomain($value) @@ -83,26 +83,26 @@ abstract class Zend_Gdata_Gapps_Query extends Zend_Gdata_Query } /** - * Get domain for this service instance. This should be a fully qualified - * domain, such as 'foo.example.com'. If no domain is set, null will be + * Get domain for this service instance. This should be a fully qualified + * domain, such as 'foo.example.com'. If no domain is set, null will be * returned. - * + * * @see setDomain - * @return string The domain to be used for this session, or null if not + * @return string The domain to be used for this session, or null if not * set. */ public function getDomain() { return $this->_domain; } - + /** - * Returns the base URL used to access the Google Apps service, based - * on the current domain. The current domain can be temporarily + * Returns the base URL used to access the Google Apps service, based + * on the current domain. The current domain can be temporarily * overridden by providing a fully qualified domain as $domain. * * @see setDomain - * @param string $domain (optional) A fully-qualified domain to use + * @param string $domain (optional) A fully-qualified domain to use * instead of the default domain for this service instance. */ public function getBaseUrl($domain = null) diff --git a/libs/Zend/Gdata/Gapps/ServiceException.php b/libs/Zend/Gdata/Gapps/ServiceException.php index d9b3174..6c73bed 100644 --- a/libs/Zend/Gdata/Gapps/ServiceException.php +++ b/libs/Zend/Gdata/Gapps/ServiceException.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ServiceException.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ServiceException.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -33,11 +33,11 @@ require_once 'Zend/Exception.php'; require_once 'Zend/Gdata/Gapps/Error.php'; /** - * Gdata Gapps Exception class. This is thrown when an - * AppsForYourDomainErrors message is received from the Google Apps + * Gdata Gapps Exception class. This is thrown when an + * AppsForYourDomainErrors message is received from the Google Apps * servers. * - * Several different errors may be represented by this exception. For a list + * Several different errors may be represented by this exception. For a list * of error codes available, see getErrorCode. * * @category Zend @@ -48,20 +48,20 @@ require_once 'Zend/Gdata/Gapps/Error.php'; */ class Zend_Gdata_Gapps_ServiceException extends Zend_Exception { - + protected $_rootElement = "AppsForYourDomainErrors"; - - /** + + /** * Array of Zend_Gdata_Error objects indexed by error code. - * + * * @var array */ protected $_errors = array(); - + /** * Create a new ServiceException. * - * @return array An array containing a collection of + * @return array An array containing a collection of * Zend_Gdata_Gapps_Error objects. */ public function __construct($errors = null) { @@ -70,32 +70,32 @@ class Zend_Gdata_Gapps_ServiceException extends Zend_Exception $this->setErrors($errors); } } - + /** - * Add a single Error object to the list of errors received by the + * Add a single Error object to the list of errors received by the * server. - * - * @param Zend_Gdata_Gapps_Error $error An instance of an error returned + * + * @param Zend_Gdata_Gapps_Error $error An instance of an error returned * by the server. The error's errorCode must be set. * @throws Zend_Gdata_App_Exception */ public function addError($error) { - // Make sure that we don't try to index an error that doesn't + // Make sure that we don't try to index an error that doesn't // contain an index value. if ($error->getErrorCode() == null) { require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception("Error encountered without corresponding error code."); } - + $this->_errors[$error->getErrorCode()] = $error; } - + /** - * Set the list of errors as sent by the server inside of an + * Set the list of errors as sent by the server inside of an * AppsForYourDomainErrors tag. - * - * @param array $array An associative array containing a collection of - * Zend_Gdata_Gapps_Error objects. All errors must have their + * + * @param array $array An associative array containing a collection of + * Zend_Gdata_Gapps_Error objects. All errors must have their * errorCode value set. * @throws Zend_Gdata_App_Exception */ @@ -105,22 +105,22 @@ class Zend_Gdata_Gapps_ServiceException extends Zend_Exception $this->addError($error); } } - + /** - * Get the list of errors as sent by the server inside of an + * Get the list of errors as sent by the server inside of an * AppsForYourDomainErrors tag. - * - * @return array An associative array containing a collection of + * + * @return array An associative array containing a collection of * Zend_Gdata_Gapps_Error objects, indexed by error code. */ public function getErrors() { return $this->_errors; } - + /** * Return the Error object associated with a specific error code. * - * @return Zend_Gdata_Gapps_Error The Error object requested, or null + * @return Zend_Gdata_Gapps_Error The Error object requested, or null * if not found. */ public function getError($errorCode) { @@ -131,22 +131,22 @@ class Zend_Gdata_Gapps_ServiceException extends Zend_Exception return null; } } - + /** - * Check whether or not a particular error code was returned by the + * Check whether or not a particular error code was returned by the * server. * * @param integer $errorCode The error code to check against. - * @return boolean Whether or not the supplied error code was returned + * @return boolean Whether or not the supplied error code was returned * by the server. */ public function hasError($errorCode) { return array_key_exists($errorCode, $this->_errors); } - + /** * Import an AppsForYourDomain error from XML. - * + * * @param string $string The XML data to be imported * @return Zend_Gdata_Gapps_ServiceException Provides a fluent interface. * @throws Zend_Gdata_App_Exception @@ -155,21 +155,21 @@ class Zend_Gdata_Gapps_ServiceException extends Zend_Exception if ($string) { // Check to see if an AppsForYourDomainError exists // - // track_errors is temporarily enabled so that if an error - // occurs while parsing the XML we can append it to an + // track_errors is temporarily enabled so that if an error + // occurs while parsing the XML we can append it to an // exception by referencing $php_errormsg @ini_set('track_errors', 1); $doc = new DOMDocument(); $success = @$doc->loadXML($string); @ini_restore('track_errors'); - + if (!$success) { require_once 'Zend/Gdata/App/Exception.php'; - // $php_errormsg is automatically generated by PHP if + // $php_errormsg is automatically generated by PHP if // an error occurs while calling loadXML(), above. throw new Zend_Gdata_App_Exception("DOMDocument cannot parse XML: $php_errormsg"); } - + // Ensure that the outermost node is an AppsForYourDomain error. // If it isn't, something has gone horribly wrong. $rootElement = $doc->getElementsByTagName($this->_rootElement)->item(0); @@ -177,7 +177,7 @@ class Zend_Gdata_Gapps_ServiceException extends Zend_Exception require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('No root <' . $this->_rootElement . '> element found, cannot parse feed.'); } - + foreach ($rootElement->childNodes as $errorNode) { if (!($errorNode instanceof DOMText)) { $error = new Zend_Gdata_Gapps_Error(); @@ -190,12 +190,12 @@ class Zend_Gdata_Gapps_ServiceException extends Zend_Exception require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('XML passed to transferFromXML cannot be null'); } - + } - + /** * Get a human readable version of this exception. - * + * * @return string */ public function __toString() { diff --git a/libs/Zend/Gdata/Gapps/UserFeed.php b/libs/Zend/Gdata/Gapps/UserFeed.php index 7cfd080..088b808 100644 --- a/libs/Zend/Gdata/Gapps/UserFeed.php +++ b/libs/Zend/Gdata/Gapps/UserFeed.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: UserFeed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: UserFeed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,10 +32,10 @@ require_once 'Zend/Gdata/Feed.php'; require_once 'Zend/Gdata/Gapps/UserEntry.php'; /** - * Data model for a collection of Google Apps user entries, usually + * Data model for a collection of Google Apps user entries, usually * provided by the Google Apps servers. - * - * For information on requesting this feed from a server, see the Google + * + * For information on requesting this feed from a server, see the Google * Apps service class, Zend_Gdata_Gapps. * * @category Zend @@ -46,8 +46,8 @@ require_once 'Zend/Gdata/Gapps/UserEntry.php'; */ class Zend_Gdata_Gapps_UserFeed extends Zend_Gdata_Feed { - + protected $_entryClassName = 'Zend_Gdata_Gapps_UserEntry'; protected $_feedClassName = 'Zend_Gdata_Gapps_UserFeed'; - + } diff --git a/libs/Zend/Gdata/Gapps/UserQuery.php b/libs/Zend/Gdata/Gapps/UserQuery.php index a8b4083..b278434 100644 --- a/libs/Zend/Gdata/Gapps/UserQuery.php +++ b/libs/Zend/Gdata/Gapps/UserQuery.php @@ -18,7 +18,7 @@ * @subpackage Gapps * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: UserQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: UserQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,13 +27,13 @@ require_once('Zend/Gdata/Gapps/Query.php'); /** - * Assists in constructing queries for Google Apps user entries. - * Instances of this class can be provided in many places where a URL is + * Assists in constructing queries for Google Apps user entries. + * Instances of this class can be provided in many places where a URL is * required. - * + * * For information on submitting queries to a server, see the Google Apps * service class, Zend_Gdata_Gapps. - * + * * @category Zend * @package Zend_Gdata * @subpackage Gapps @@ -44,24 +44,24 @@ class Zend_Gdata_Gapps_UserQuery extends Zend_Gdata_Gapps_Query { /** - * If not null, specifies the username of the user who should be + * If not null, specifies the username of the user who should be * retrieved by this query. - * + * * @var string */ protected $_username = null; /** * Create a new instance. - * - * @param string $domain (optional) The Google Apps-hosted domain to use + * + * @param string $domain (optional) The Google Apps-hosted domain to use * when constructing query URIs. - * @param string $username (optional) Value for the username + * @param string $username (optional) Value for the username * property. - * @param string $startUsername (optional) Value for the + * @param string $startUsername (optional) Value for the * startUsername property. */ - public function __construct($domain = null, $username = null, + public function __construct($domain = null, $username = null, $startUsername = null) { parent::__construct($domain); @@ -70,12 +70,12 @@ class Zend_Gdata_Gapps_UserQuery extends Zend_Gdata_Gapps_Query } /** - * Set the username to query for. When set, only users with a username - * matching this value will be returned in search results. Set to + * Set the username to query for. When set, only users with a username + * matching this value will be returned in search results. Set to * null to disable filtering by username. - * + * * @see getUsername - * @param string $value The username to filter search results by, or null to + * @param string $value The username to filter search results by, or null to * disable. */ public function setUsername($value) @@ -84,10 +84,10 @@ class Zend_Gdata_Gapps_UserQuery extends Zend_Gdata_Gapps_Query } /** - * Get the username to query for. If no username is set, null will be + * Get the username to query for. If no username is set, null will be * returned. - * - * @param string $value The username to filter search results by, or + * + * @param string $value The username to filter search results by, or * null if disabled. */ public function getUsername() @@ -96,10 +96,10 @@ class Zend_Gdata_Gapps_UserQuery extends Zend_Gdata_Gapps_Query } /** - * Set the first username which should be displayed when retrieving + * Set the first username which should be displayed when retrieving * a list of users. - * - * @param string $value The first username to be returned, or null to + * + * @param string $value The first username to be returned, or null to * disable. */ public function setStartUsername($value) @@ -112,11 +112,11 @@ class Zend_Gdata_Gapps_UserQuery extends Zend_Gdata_Gapps_Query } /** - * Get the first username which should be displayed when retrieving + * Get the first username which should be displayed when retrieving * a list of users. - * + * * @see setStartUsername - * @return string The first username to be returned, or null if + * @return string The first username to be returned, or null if * disabled. */ public function getStartUsername() @@ -130,7 +130,7 @@ class Zend_Gdata_Gapps_UserQuery extends Zend_Gdata_Gapps_Query /** * Returns the query URL generated by this query instance. - * + * * @return string The query URL for this instance. */ public function getQueryUrl() diff --git a/libs/Zend/Gdata/Gbase/ItemEntry.php b/libs/Zend/Gdata/Gbase/ItemEntry.php index 38ca405..3a6e97b 100644 --- a/libs/Zend/Gdata/Gbase/ItemEntry.php +++ b/libs/Zend/Gdata/Gbase/ItemEntry.php @@ -18,7 +18,7 @@ * @subpackage Gbase * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ItemEntry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ItemEntry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -49,7 +49,7 @@ class Zend_Gdata_Gbase_ItemEntry extends Zend_Gdata_Gbase_Entry /** * Set the value of the itme_type * - * @param Zend_Gdata_Gbase_Extension_ItemType $value The desired value for the item_type + * @param Zend_Gdata_Gbase_Extension_ItemType $value The desired value for the item_type * @return Zend_Gdata_Gbase_ItemEntry Provides a fluent interface */ public function setItemType($value) @@ -60,7 +60,7 @@ class Zend_Gdata_Gbase_ItemEntry extends Zend_Gdata_Gbase_Entry /** * Adds a custom attribute to the entry in the following format: - * <g:[$name] type='[$type]'>[$value]</g:[$name]> + * <g:[$name] type='[$type]'>[$value]</g:[$name]> * * @param string $name The name of the attribute * @param string $value The text value of the attribute @@ -76,7 +76,7 @@ class Zend_Gdata_Gbase_ItemEntry extends Zend_Gdata_Gbase_Entry /** * Removes a Base attribute from the current list of Base attributes - * + * * @param Zend_Gdata_Gbase_Extension_BaseAttribute $baseAttribute The attribute to be removed * @return Zend_Gdata_Gbase_ItemEntry Provides a fluent interface */ diff --git a/libs/Zend/Gdata/Gbase/ItemQuery.php b/libs/Zend/Gdata/Gbase/ItemQuery.php index 5112e0a..ff314c6 100644 --- a/libs/Zend/Gdata/Gbase/ItemQuery.php +++ b/libs/Zend/Gdata/Gbase/ItemQuery.php @@ -18,7 +18,7 @@ * @subpackage Gbase * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ItemQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ItemQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -54,14 +54,14 @@ class Zend_Gdata_Gbase_ItemQuery extends Zend_Gdata_Gbase_Query * The default URI for POST methods * * @var string - */ + */ protected $_defaultFeedUri = self::GBASE_ITEM_FEED_URI; /** * The id of an item * * @var string - */ + */ protected $_id = null; /** @@ -84,7 +84,7 @@ class Zend_Gdata_Gbase_ItemQuery extends Zend_Gdata_Gbase_Query /** * Returns the query URL generated by this query instance. - * + * * @return string The query URL for this instance. */ public function getQueryUrl() diff --git a/libs/Zend/Gdata/Gbase/Query.php b/libs/Zend/Gdata/Gbase/Query.php index eb123ab..2b42f72 100644 --- a/libs/Zend/Gdata/Gbase/Query.php +++ b/libs/Zend/Gdata/Gbase/Query.php @@ -18,7 +18,7 @@ * @subpackage Gbase * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Query.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Query.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -54,7 +54,7 @@ class Zend_Gdata_Gbase_Query extends Zend_Gdata_Query * The default URI for POST methods * * @var string - */ + */ protected $_defaultFeedUri = self::GBASE_ITEM_FEED_URI; /** diff --git a/libs/Zend/Gdata/Gbase/SnippetQuery.php b/libs/Zend/Gdata/Gbase/SnippetQuery.php index ac128bb..2642243 100644 --- a/libs/Zend/Gdata/Gbase/SnippetQuery.php +++ b/libs/Zend/Gdata/Gbase/SnippetQuery.php @@ -18,7 +18,7 @@ * @subpackage Gbase * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SnippetQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SnippetQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -53,12 +53,12 @@ class Zend_Gdata_Gbase_SnippetQuery extends Zend_Gdata_Gbase_Query * The default URI for POST methods * * @var string - */ + */ protected $_defaultFeedUri = self::BASE_SNIPPET_FEED_URI; /** * Returns the query URL generated by this query instance. - * + * * @return string The query URL for this instance. */ public function getQueryUrl() diff --git a/libs/Zend/Gdata/Geo.php b/libs/Zend/Gdata/Geo.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Geo/Entry.php b/libs/Zend/Gdata/Geo/Entry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Geo/Extension/GeoRssWhere.php b/libs/Zend/Gdata/Geo/Extension/GeoRssWhere.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Geo/Extension/GmlPoint.php b/libs/Zend/Gdata/Geo/Extension/GmlPoint.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Geo/Extension/GmlPos.php b/libs/Zend/Gdata/Geo/Extension/GmlPos.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Geo/Feed.php b/libs/Zend/Gdata/Geo/Feed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Health.php b/libs/Zend/Gdata/Health.php old mode 100755 new mode 100644 index 33e173e..5c1ea51 --- a/libs/Zend/Gdata/Health.php +++ b/libs/Zend/Gdata/Health.php @@ -18,7 +18,7 @@ * @subpackage Health * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Health.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Health.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -62,19 +62,19 @@ class Zend_Gdata_Health extends Zend_Gdata /** * URIs of the AuthSub/OAuth feeds. */ - const AUTHSUB_PROFILE_FEED_URI = + const AUTHSUB_PROFILE_FEED_URI = 'https://www.google.com/health/feeds/profile/default'; - const AUTHSUB_REGISTER_FEED_URI = + const AUTHSUB_REGISTER_FEED_URI = 'https://www.google.com/health/feeds/register/default'; /** * URIs of the ClientLogin feeds. */ - const CLIENTLOGIN_PROFILELIST_FEED_URI = + const CLIENTLOGIN_PROFILELIST_FEED_URI = 'https://www.google.com/health/feeds/profile/list'; - const CLIENTLOGIN_PROFILE_FEED_URI = + const CLIENTLOGIN_PROFILE_FEED_URI = 'https://www.google.com/health/feeds/profile/ui'; - const CLIENTLOGIN_REGISTER_FEED_URI = + const CLIENTLOGIN_REGISTER_FEED_URI = 'https://www.google.com/health/feeds/register/ui'; /** diff --git a/libs/Zend/Gdata/Health/Extension/Ccr.php b/libs/Zend/Gdata/Health/Extension/Ccr.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Health/ProfileEntry.php b/libs/Zend/Gdata/Health/ProfileEntry.php old mode 100755 new mode 100644 index 9a828b7..ef234f8 --- a/libs/Zend/Gdata/Health/ProfileEntry.php +++ b/libs/Zend/Gdata/Health/ProfileEntry.php @@ -18,7 +18,7 @@ * @subpackage Health * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProfileEntry.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: ProfileEntry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -57,7 +57,7 @@ class Zend_Gdata_Health_ProfileEntry extends Zend_Gdata_Entry * @var Zend_Gdata_Health_Extension_Ccr */ protected $_ccrData = null; - + /** * Constructs a new Zend_Gdata_Health_ProfileEntry object. * @param DOMElement $element (optional) The DOMElement on which to base this object. @@ -85,7 +85,7 @@ class Zend_Gdata_Health_ProfileEntry extends Zend_Gdata_Entry if ($this->_ccrData !== null) { $element->appendChild($this->_ccrData->getDOM($element->ownerDocument)); } - + return $element; } @@ -102,14 +102,14 @@ class Zend_Gdata_Health_ProfileEntry extends Zend_Gdata_Entry if (strstr($absoluteNodeName, $this->lookupNamespace('ccr') . ':')) { $ccrElement = new Zend_Gdata_Health_Extension_Ccr(); $ccrElement->transferFromDOM($child); - $this->_ccrData = $ccrElement; + $this->_ccrData = $ccrElement; } else { parent::takeChildFromDOM($child); - + } } - - /** + + /** * Sets the profile entry's CCR data * @param string $ccrXMLStr The CCR as an xml string * @return Zend_Gdata_Health_Extension_Ccr @@ -125,7 +125,7 @@ class Zend_Gdata_Health_ProfileEntry extends Zend_Gdata_Entry } - /** + /** * Returns all the CCR data in a profile entry * @return Zend_Gdata_Health_Extension_Ccr */ diff --git a/libs/Zend/Gdata/Health/ProfileFeed.php b/libs/Zend/Gdata/Health/ProfileFeed.php old mode 100755 new mode 100644 index f2086c3..df03248 --- a/libs/Zend/Gdata/Health/ProfileFeed.php +++ b/libs/Zend/Gdata/Health/ProfileFeed.php @@ -18,7 +18,7 @@ * @subpackage Health * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProfileFeed.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: ProfileFeed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -45,7 +45,7 @@ class Zend_Gdata_Health_ProfileFeed extends Zend_Gdata_Feed * @var string */ protected $_entryClassName = 'Zend_Gdata_Health_ProfileEntry'; - + /** * Creates a Health Profile feed, representing a user's Health profile * diff --git a/libs/Zend/Gdata/Health/ProfileListEntry.php b/libs/Zend/Gdata/Health/ProfileListEntry.php old mode 100755 new mode 100644 index 99adbfd..d5aa099 --- a/libs/Zend/Gdata/Health/ProfileListEntry.php +++ b/libs/Zend/Gdata/Health/ProfileListEntry.php @@ -18,7 +18,7 @@ * @subpackage Health * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProfileListEntry.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: ProfileListEntry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -80,16 +80,16 @@ class Zend_Gdata_Health_ProfileListEntry extends Zend_Gdata_Entry { parent::takeChildFromDOM($child); } - - /** + + /** * Retrieves the profile ID for the entry, which is contained in * @return string The profile id */ public function getProfileID() { return $this->getContent()->text; } - - /** + + /** * Retrieves the profile's title, which is contained in * @return string The profile name */ diff --git a/libs/Zend/Gdata/Health/ProfileListFeed.php b/libs/Zend/Gdata/Health/ProfileListFeed.php old mode 100755 new mode 100644 index 31dd657..188ee25 --- a/libs/Zend/Gdata/Health/ProfileListFeed.php +++ b/libs/Zend/Gdata/Health/ProfileListFeed.php @@ -18,7 +18,7 @@ * @subpackage Health * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProfileListFeed.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: ProfileListFeed.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -45,7 +45,7 @@ class Zend_Gdata_Health_ProfileListFeed extends Zend_Gdata_Feed * @var string */ protected $_entryClassName = 'Zend_Gdata_Health_ProfileListEntry'; - + public function getEntries() { return $this->entry; diff --git a/libs/Zend/Gdata/Health/Query.php b/libs/Zend/Gdata/Health/Query.php old mode 100755 new mode 100644 index 181584c..6730bd4 --- a/libs/Zend/Gdata/Health/Query.php +++ b/libs/Zend/Gdata/Health/Query.php @@ -18,7 +18,7 @@ * @subpackage Health * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Query.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Query.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -101,7 +101,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query */ public function setCategory($item, $name = null) { - $this->_category = $item . + $this->_category = $item . ($name ? '/' . urlencode('{' . self::ITEM_CATEGORY_NS . '}' . $name) : null); return $this; } @@ -133,7 +133,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query /** * Returns the value set for the grouped parameter. * - * @return string grouped parameter. + * @return string grouped parameter. */ public function getGrouped() { @@ -143,11 +143,11 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query return null; } } - + /** * Setter for the max-results-group parameter. * - * @param int $value Specifies the maximum number of groups to be + * @param int $value Specifies the maximum number of groups to be * retrieved. Must be an integer value greater than zero. This parameter * is only valid if grouped=true. * @return Zend_Gdata_Health_Query Provides a fluent interface @@ -159,7 +159,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query require_once 'Zend/Gdata/App/InvalidArgumentException.php'; throw new Zend_Gdata_App_InvalidArgumentException( 'The max-results-group parameter must be set to a value - greater than 0 and can only be used if grouped=true'); + greater than 0 and can only be used if grouped=true'); } else { $this->_params['max-results-group'] = $value; } @@ -170,7 +170,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query /** * Returns the value set for max-results-group. * - * @return int Returns max-results-group parameter. + * @return int Returns max-results-group parameter. */ public function getMaxResultsGroup() { @@ -184,9 +184,9 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query /** * Setter for the max-results-group parameter. * - * @param int $value Specifies the maximum number of records to be - * retrieved from each group. The limits that you specify with this - * parameter apply to all groups. Must be an integer value greater than + * @param int $value Specifies the maximum number of records to be + * retrieved from each group. The limits that you specify with this + * parameter apply to all groups. Must be an integer value greater than * zero. This parameter is only valid if grouped=true. * @return Zend_Gdata_Health_Query Provides a fluent interface */ @@ -195,8 +195,8 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query if ($value !== null) { if ($value <= 0 || $this->getGrouped() !== 'true') { throw new Zend_Gdata_App_InvalidArgumentException( - 'The max-results-in-group parameter must be set to a value - greater than 0 and can only be used if grouped=true'); + 'The max-results-in-group parameter must be set to a value + greater than 0 and can only be used if grouped=true'); } else { $this->_params['max-results-in-group'] = $value; } @@ -207,7 +207,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query /** * Returns the value set for max-results-in-group. * - * @return int Returns max-results-in-group parameter. + * @return int Returns max-results-in-group parameter. */ public function getMaxResultsInGroup() { @@ -221,9 +221,9 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query /** * Setter for the start-index-group parameter. * - * @param int $value Retrieves only items whose group ranking is at + * @param int $value Retrieves only items whose group ranking is at * least start-index-group. This should be set to a 1-based index of the - * first group to be retrieved. The range is applied per category. + * first group to be retrieved. The range is applied per category. * This parameter is only valid if grouped=true. * @return Zend_Gdata_Health_Query Provides a fluent interface */ @@ -231,7 +231,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query { if ($value !== null && $this->getGrouped() !== 'true') { throw new Zend_Gdata_App_InvalidArgumentException( - 'The start-index-group can only be used if grouped=true'); + 'The start-index-group can only be used if grouped=true'); } else { $this->_params['start-index-group'] = $value; } @@ -241,7 +241,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query /** * Returns the value set for start-index-group. * - * @return int Returns start-index-group parameter. + * @return int Returns start-index-group parameter. */ public function getStartIndexGroup() { @@ -255,7 +255,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query /** * Setter for the start-index-in-group parameter. * - * @param int $value A 1-based index of the records to be retrieved from + * @param int $value A 1-based index of the records to be retrieved from * each group. This parameter is only valid if grouped=true. * @return Zend_Gdata_Health_Query Provides a fluent interface */ @@ -272,7 +272,7 @@ class Zend_Gdata_Health_Query extends Zend_Gdata_Query /** * Returns the value set for start-index-in-group. * - * @return int Returns start-index-in-group parameter. + * @return int Returns start-index-in-group parameter. */ public function getStartIndexInGroup() { diff --git a/libs/Zend/Gdata/HttpAdapterStreamingProxy.php b/libs/Zend/Gdata/HttpAdapterStreamingProxy.php index c449047..337a081 100644 --- a/libs/Zend/Gdata/HttpAdapterStreamingProxy.php +++ b/libs/Zend/Gdata/HttpAdapterStreamingProxy.php @@ -18,7 +18,7 @@ * @subpackage Gdata * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HttpAdapterStreamingProxy.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HttpAdapterStreamingProxy.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -59,7 +59,7 @@ class Zend_Gdata_HttpAdapterStreamingProxy extends Zend_Http_Client_Adapter_Prox { // If no proxy is set, throw an error if (! $this->config['proxy_host']) { - require_once 'Zend/Http/Client/Adapter/Exception.php'; + require_once 'Zend/Http/Client/Adapter/Exception.php'; throw new Zend_Http_Client_Adapter_Exception('No proxy host set!'); } @@ -86,13 +86,13 @@ class Zend_Gdata_HttpAdapterStreamingProxy extends Zend_Http_Client_Adapter_Prox $this->config['proxy_user'], $this->config['proxy_pass'], $this->config['proxy_auth'] ); } - + // if we are proxying HTTPS, preform CONNECT handshake with the proxy if ($uri->getScheme() == 'https' && (! $this->negotiated)) { $this->connectHandshake($uri->getHost(), $uri->getPort(), $http_ver, $headers); $this->negotiated = true; } - + // Save request method for later $this->method = $method; diff --git a/libs/Zend/Gdata/HttpClient.php b/libs/Zend/Gdata/HttpClient.php index a3c2064..ede57e4 100644 --- a/libs/Zend/Gdata/HttpClient.php +++ b/libs/Zend/Gdata/HttpClient.php @@ -17,7 +17,7 @@ * @subpackage Gdata * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HttpClient.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HttpClient.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -253,7 +253,7 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client */ public function getAdapter() { - return $this->adapter; + return $this->adapter; } /** @@ -267,7 +267,7 @@ class Zend_Gdata_HttpClient extends Zend_Http_Client if ($adapter == null) { $this->adapter = $adapter; } else { - parent::setAdapter($adapter); + parent::setAdapter($adapter); } } diff --git a/libs/Zend/Gdata/Media.php b/libs/Zend/Gdata/Media.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Entry.php b/libs/Zend/Gdata/Media/Entry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaCategory.php b/libs/Zend/Gdata/Media/Extension/MediaCategory.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaContent.php b/libs/Zend/Gdata/Media/Extension/MediaContent.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaCopyright.php b/libs/Zend/Gdata/Media/Extension/MediaCopyright.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaCredit.php b/libs/Zend/Gdata/Media/Extension/MediaCredit.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaDescription.php b/libs/Zend/Gdata/Media/Extension/MediaDescription.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaGroup.php b/libs/Zend/Gdata/Media/Extension/MediaGroup.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaHash.php b/libs/Zend/Gdata/Media/Extension/MediaHash.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaKeywords.php b/libs/Zend/Gdata/Media/Extension/MediaKeywords.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaPlayer.php b/libs/Zend/Gdata/Media/Extension/MediaPlayer.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaRating.php b/libs/Zend/Gdata/Media/Extension/MediaRating.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaRestriction.php b/libs/Zend/Gdata/Media/Extension/MediaRestriction.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaText.php b/libs/Zend/Gdata/Media/Extension/MediaText.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaThumbnail.php b/libs/Zend/Gdata/Media/Extension/MediaThumbnail.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Extension/MediaTitle.php b/libs/Zend/Gdata/Media/Extension/MediaTitle.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Media/Feed.php b/libs/Zend/Gdata/Media/Feed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos.php b/libs/Zend/Gdata/Photos.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/AlbumEntry.php b/libs/Zend/Gdata/Photos/AlbumEntry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/AlbumFeed.php b/libs/Zend/Gdata/Photos/AlbumFeed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/AlbumQuery.php b/libs/Zend/Gdata/Photos/AlbumQuery.php old mode 100755 new mode 100644 index e2f28ee..ba6911f --- a/libs/Zend/Gdata/Photos/AlbumQuery.php +++ b/libs/Zend/Gdata/Photos/AlbumQuery.php @@ -18,7 +18,7 @@ * @subpackage Photos * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AlbumQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: AlbumQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -73,7 +73,7 @@ class Zend_Gdata_Photos_AlbumQuery extends Zend_Gdata_Photos_UserQuery { $this->_albumId = null; $this->_albumName = $value; - + return $this; } @@ -104,7 +104,7 @@ class Zend_Gdata_Photos_AlbumQuery extends Zend_Gdata_Photos_UserQuery { $this->_albumName = null; $this->_albumId = $value; - + return $this; } diff --git a/libs/Zend/Gdata/Photos/CommentEntry.php b/libs/Zend/Gdata/Photos/CommentEntry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Access.php b/libs/Zend/Gdata/Photos/Extension/Access.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/AlbumId.php b/libs/Zend/Gdata/Photos/Extension/AlbumId.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/BytesUsed.php b/libs/Zend/Gdata/Photos/Extension/BytesUsed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Checksum.php b/libs/Zend/Gdata/Photos/Extension/Checksum.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Client.php b/libs/Zend/Gdata/Photos/Extension/Client.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/CommentCount.php b/libs/Zend/Gdata/Photos/Extension/CommentCount.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/CommentingEnabled.php b/libs/Zend/Gdata/Photos/Extension/CommentingEnabled.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Height.php b/libs/Zend/Gdata/Photos/Extension/Height.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Id.php b/libs/Zend/Gdata/Photos/Extension/Id.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Location.php b/libs/Zend/Gdata/Photos/Extension/Location.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php b/libs/Zend/Gdata/Photos/Extension/MaxPhotosPerAlbum.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Name.php b/libs/Zend/Gdata/Photos/Extension/Name.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Nickname.php b/libs/Zend/Gdata/Photos/Extension/Nickname.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/NumPhotos.php b/libs/Zend/Gdata/Photos/Extension/NumPhotos.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php b/libs/Zend/Gdata/Photos/Extension/NumPhotosRemaining.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/PhotoId.php b/libs/Zend/Gdata/Photos/Extension/PhotoId.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Position.php b/libs/Zend/Gdata/Photos/Extension/Position.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/QuotaCurrent.php b/libs/Zend/Gdata/Photos/Extension/QuotaCurrent.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/QuotaLimit.php b/libs/Zend/Gdata/Photos/Extension/QuotaLimit.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Rotation.php b/libs/Zend/Gdata/Photos/Extension/Rotation.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Size.php b/libs/Zend/Gdata/Photos/Extension/Size.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Thumbnail.php b/libs/Zend/Gdata/Photos/Extension/Thumbnail.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Timestamp.php b/libs/Zend/Gdata/Photos/Extension/Timestamp.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/User.php b/libs/Zend/Gdata/Photos/Extension/User.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Version.php b/libs/Zend/Gdata/Photos/Extension/Version.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Weight.php b/libs/Zend/Gdata/Photos/Extension/Weight.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/Extension/Width.php b/libs/Zend/Gdata/Photos/Extension/Width.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/PhotoEntry.php b/libs/Zend/Gdata/Photos/PhotoEntry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/PhotoFeed.php b/libs/Zend/Gdata/Photos/PhotoFeed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/PhotoQuery.php b/libs/Zend/Gdata/Photos/PhotoQuery.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/TagEntry.php b/libs/Zend/Gdata/Photos/TagEntry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/UserEntry.php b/libs/Zend/Gdata/Photos/UserEntry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/UserFeed.php b/libs/Zend/Gdata/Photos/UserFeed.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/Photos/UserQuery.php b/libs/Zend/Gdata/Photos/UserQuery.php old mode 100755 new mode 100644 index f88d678..58ecf48 --- a/libs/Zend/Gdata/Photos/UserQuery.php +++ b/libs/Zend/Gdata/Photos/UserQuery.php @@ -18,7 +18,7 @@ * @subpackage Photos * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: UserQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: UserQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -50,7 +50,7 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query * @var string */ protected $_projection = 'api'; - + /** * Indicates whether to request a feed or entry in queries. Default * value is 'feed'; @@ -58,7 +58,7 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query * @var string */ protected $_type = 'feed'; - + /** * A string which, if not null, indicates which user should * be retrieved by this query. If null, the default user will be used @@ -67,7 +67,7 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query * @var string */ protected $_user = Zend_Gdata_Photos::DEFAULT_USER; - + /** * Create a new Query object with default values. */ @@ -75,9 +75,9 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query { parent::__construct(); } - + /** - * Set's the format of data returned in Atom feeds. Can be either + * Set's the format of data returned in Atom feeds. Can be either * 'api' or 'base'. Normally, 'api' will be desired. Default is 'api'. * * @param string $value @@ -99,9 +99,9 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query { return $this->_projection; } - + /** - * Set's the type of data returned in queries. Can be either + * Set's the type of data returned in queries. Can be either * 'feed' or 'entry'. Normally, 'feed' will be desired. Default is 'feed'. * * @param string $value @@ -153,13 +153,13 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query } /** - * Set the visibility filter for entries returned. Only entries which - * match this value will be returned. If null or unset, the default + * Set the visibility filter for entries returned. Only entries which + * match this value will be returned. If null or unset, the default * value will be used instead. - * - * Valid values are 'all' (default), 'public', and 'private'. * - * @param string $value The visibility to filter by, or null to use the + * Valid values are 'all' (default), 'public', and 'private'. + * + * @param string $value The visibility to filter by, or null to use the * default value. */ public function setAccess($value) @@ -184,10 +184,10 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query } /** - * Set the tag for entries that are returned. Only entries which + * Set the tag for entries that are returned. Only entries which * match this value will be returned. If null or unset, this filter will * not be applied. - * + * * See http://code.google.com/apis/picasaweb/reference.html#Parameters * for a list of valid values. * @@ -214,12 +214,12 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query { return $this->_params['tag']; } - + /** - * Set the kind of entries that are returned. Only entries which + * Set the kind of entries that are returned. Only entries which * match this value will be returned. If null or unset, this filter will * not be applied. - * + * * See http://code.google.com/apis/picasaweb/reference.html#Parameters * for a list of valid values. * @@ -246,12 +246,12 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query { return $this->_params['kind']; } - + /** - * Set the maximum image size for entries returned. Only entries which + * Set the maximum image size for entries returned. Only entries which * match this value will be returned. If null or unset, this filter will * not be applied. - * + * * See http://code.google.com/apis/picasaweb/reference.html#Parameters * for a list of valid values. * @@ -278,12 +278,12 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query { return $this->_params['imgmax']; } - + /** - * Set the thumbnail size filter for entries returned. Only entries which + * Set the thumbnail size filter for entries returned. Only entries which * match this value will be returned. If null or unset, this filter will * not be applied. - * + * * See http://code.google.com/apis/picasaweb/reference.html#Parameters * for a list of valid values. * @@ -310,7 +310,7 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query { return $this->_params['thumbsize']; } - + /** * Returns the URL generated for this query, based on it's current * parameters. @@ -321,7 +321,7 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query public function getQueryUrl($incomingUri = null) { $uri = Zend_Gdata_Photos::PICASA_BASE_URI; - + if ($this->getType() !== null) { $uri .= '/' . $this->getType(); } else { @@ -329,7 +329,7 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query throw new Zend_Gdata_App_InvalidArgumentException( 'Type must be feed or entry, not null'); } - + if ($this->getProjection() !== null) { $uri .= '/' . $this->getProjection(); } else { @@ -337,7 +337,7 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query throw new Zend_Gdata_App_InvalidArgumentException( 'Projection must not be null'); } - + if ($this->getUser() !== null) { $uri .= '/user/' . $this->getUser(); } else { @@ -346,7 +346,7 @@ class Zend_Gdata_Photos_UserQuery extends Zend_Gdata_Query throw new Zend_Gdata_App_InvalidArgumentException( 'User must not be null'); } - + $uri .= $incomingUri; $uri .= $this->getQueryString(); return $uri; diff --git a/libs/Zend/Gdata/Spreadsheets/DocumentQuery.php b/libs/Zend/Gdata/Spreadsheets/DocumentQuery.php index 7912e98..398cf6f 100644 --- a/libs/Zend/Gdata/Spreadsheets/DocumentQuery.php +++ b/libs/Zend/Gdata/Spreadsheets/DocumentQuery.php @@ -18,7 +18,7 @@ * @subpackage Spreadsheets * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DocumentQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: DocumentQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -224,14 +224,14 @@ class Zend_Gdata_Spreadsheets_DocumentQuery extends Zend_Gdata_Query if ($this->_visibility != null) { $uri .= '/'.$this->_visibility; } else { - require_once 'Zend/Gdata/App/Exception.php'; + require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('A visibility must be provided for document queries.'); } if ($this->_projection != null) { $uri .= '/'.$this->_projection; } else { - require_once 'Zend/Gdata/App/Exception.php'; + require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('A projection must be provided for document queries.'); } @@ -250,7 +250,7 @@ class Zend_Gdata_Spreadsheets_DocumentQuery extends Zend_Gdata_Query if ($this->_documentType != null) { $uri .= '/'.$this->_documentType; } else { - require_once 'Zend/Gdata/App/Exception.php'; + require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('A document type must be provided for document queries.'); } @@ -263,7 +263,7 @@ class Zend_Gdata_Spreadsheets_DocumentQuery extends Zend_Gdata_Query if ($this->_spreadsheetKey != null) { $uri .= '/'.$this->_spreadsheetKey; } else { - require_once 'Zend/Gdata/App/Exception.php'; + require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('A spreadsheet key must be provided for worksheet document queries.'); } $uri .= $this->appendVisibilityProjection(); diff --git a/libs/Zend/Gdata/Spreadsheets/ListQuery.php b/libs/Zend/Gdata/Spreadsheets/ListQuery.php index 10eeb00..64452fc 100644 --- a/libs/Zend/Gdata/Spreadsheets/ListQuery.php +++ b/libs/Zend/Gdata/Spreadsheets/ListQuery.php @@ -18,7 +18,7 @@ * @subpackage Spreadsheets * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ListQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ListQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -260,28 +260,28 @@ class Zend_Gdata_Spreadsheets_ListQuery extends Zend_Gdata_Query if ($this->_spreadsheetKey != null) { $uri .= '/'.$this->_spreadsheetKey; } else { - require_once 'Zend/Gdata/App/Exception.php'; + require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('A spreadsheet key must be provided for list queries.'); } if ($this->_worksheetId != null) { $uri .= '/'.$this->_worksheetId; } else { - require_once 'Zend/Gdata/App/Exception.php'; + require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('A worksheet id must be provided for list queries.'); } if ($this->_visibility != null) { $uri .= '/'.$this->_visibility; } else { - require_once 'Zend/Gdata/App/Exception.php'; + require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('A visibility must be provided for list queries.'); } if ($this->_projection != null) { $uri .= '/'.$this->_projection; } else { - require_once 'Zend/Gdata/App/Exception.php'; + require_once 'Zend/Gdata/App/Exception.php'; throw new Zend_Gdata_App_Exception('A projection must be provided for list queries.'); } diff --git a/libs/Zend/Gdata/YouTube/CommentEntry.php b/libs/Zend/Gdata/YouTube/CommentEntry.php index c812bbc..3888fc4 100644 --- a/libs/Zend/Gdata/YouTube/CommentEntry.php +++ b/libs/Zend/Gdata/YouTube/CommentEntry.php @@ -18,7 +18,7 @@ * @subpackage YouTube * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CommentEntry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CommentEntry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,7 +27,7 @@ require_once 'Zend/Gdata/Media/Feed.php'; /** - * The YouTube comments flavor of an Atom Entry + * The YouTube comments flavor of an Atom Entry * * @category Zend * @package Zend_Gdata diff --git a/libs/Zend/Gdata/YouTube/Extension/Control.php b/libs/Zend/Gdata/YouTube/Extension/Control.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/Extension/CountHint.php b/libs/Zend/Gdata/YouTube/Extension/CountHint.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/Extension/Link.php b/libs/Zend/Gdata/YouTube/Extension/Link.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/Extension/MediaContent.php b/libs/Zend/Gdata/YouTube/Extension/MediaContent.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/Extension/MediaGroup.php b/libs/Zend/Gdata/YouTube/Extension/MediaGroup.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/Extension/MediaRating.php b/libs/Zend/Gdata/YouTube/Extension/MediaRating.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/Extension/Private.php b/libs/Zend/Gdata/YouTube/Extension/Private.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/Extension/Statistics.php b/libs/Zend/Gdata/YouTube/Extension/Statistics.php index 3da6ab4..14c663c 100644 --- a/libs/Zend/Gdata/YouTube/Extension/Statistics.php +++ b/libs/Zend/Gdata/YouTube/Extension/Statistics.php @@ -18,7 +18,7 @@ * @subpackage YouTube * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Statistics.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Statistics.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -67,7 +67,7 @@ class Zend_Gdata_YouTube_Extension_Statistics extends Zend_Gdata_Extension * who have subscribed to a particular user's YouTube channel. * The subscriberCount attribute is only specified when the * tag appears within a user profile entry. - * + * * @var integer */ protected $_subscriberCount = null; @@ -213,7 +213,7 @@ class Zend_Gdata_YouTube_Extension_Statistics extends Zend_Gdata_Extension * Set the value for this element's videoWatchCount attribute. * * @param int $value The desired value for this attribute. - * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * @return Zend_Gdata_YouTube_Extension_Statistics The element being * modified. */ public function setVideoWatchCount($value) @@ -236,7 +236,7 @@ class Zend_Gdata_YouTube_Extension_Statistics extends Zend_Gdata_Extension * Set the value for this element's subscriberCount attribute. * * @param int $value The desired value for this attribute. - * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * @return Zend_Gdata_YouTube_Extension_Statistics The element being * modified. */ public function setSubscriberCount($value) @@ -259,7 +259,7 @@ class Zend_Gdata_YouTube_Extension_Statistics extends Zend_Gdata_Extension * Set the value for this element's lastWebAccess attribute. * * @param int $value The desired value for this attribute. - * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * @return Zend_Gdata_YouTube_Extension_Statistics The element being * modified. */ public function setLastWebAccess($value) @@ -282,7 +282,7 @@ class Zend_Gdata_YouTube_Extension_Statistics extends Zend_Gdata_Extension * Set the value for this element's favoriteCount attribute. * * @param int $value The desired value for this attribute. - * @return Zend_Gdata_YouTube_Extension_Statistics The element being + * @return Zend_Gdata_YouTube_Extension_Statistics The element being * modified. */ public function setFavoriteCount($value) diff --git a/libs/Zend/Gdata/YouTube/Extension/Token.php b/libs/Zend/Gdata/YouTube/Extension/Token.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/MediaEntry.php b/libs/Zend/Gdata/YouTube/MediaEntry.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Gdata/YouTube/PlaylistListEntry.php b/libs/Zend/Gdata/YouTube/PlaylistListEntry.php index cfd7c31..58d02b8 100644 --- a/libs/Zend/Gdata/YouTube/PlaylistListEntry.php +++ b/libs/Zend/Gdata/YouTube/PlaylistListEntry.php @@ -18,7 +18,7 @@ * @subpackage YouTube * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PlaylistListEntry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: PlaylistListEntry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -86,7 +86,7 @@ class Zend_Gdata_YouTube_PlaylistListEntry extends Zend_Gdata_Entry * @var Zend_Gdata_YouTube_Extension_PlaylistId */ protected $_playlistId = null; - + /** * CountHint for this playlist. * @@ -193,7 +193,7 @@ class Zend_Gdata_YouTube_PlaylistListEntry extends Zend_Gdata_Entry /** * Returns the description relating to the video. * - * @return Zend_Gdata_YouTube_Extension_Description The description + * @return Zend_Gdata_YouTube_Extension_Description The description * relating to the video */ public function getDescription() @@ -209,7 +209,7 @@ class Zend_Gdata_YouTube_PlaylistListEntry extends Zend_Gdata_Entry * Returns the countHint relating to the playlist. * * The countHint is the number of videos on a playlist. - * + * * @throws Zend_Gdata_App_VersionException * @return Zend_Gdata_YouTube_Extension_CountHint The count of videos on * a playlist. @@ -219,7 +219,7 @@ class Zend_Gdata_YouTube_PlaylistListEntry extends Zend_Gdata_Entry if (($this->getMajorProtocolVersion() == null) || ($this->getMajorProtocolVersion() == 1)) { require_once 'Zend/Gdata/App/VersionException.php'; - throw new Zend_Gdata_App_VersionException('The yt:countHint ' . + throw new Zend_Gdata_App_VersionException('The yt:countHint ' . 'element is not supported in versions earlier than 2.'); } else { return $this->_countHint; @@ -228,7 +228,7 @@ class Zend_Gdata_YouTube_PlaylistListEntry extends Zend_Gdata_Entry /** * Returns the Id relating to the playlist. - * + * * @throws Zend_Gdata_App_VersionException * @return Zend_Gdata_YouTube_Extension_PlaylistId The id of this playlist. */ @@ -237,7 +237,7 @@ class Zend_Gdata_YouTube_PlaylistListEntry extends Zend_Gdata_Entry if (($this->getMajorProtocolVersion() == null) || ($this->getMajorProtocolVersion() == 1)) { require_once 'Zend/Gdata/App/VersionException.php'; - throw new Zend_Gdata_App_VersionException('The yt:playlistId ' . + throw new Zend_Gdata_App_VersionException('The yt:playlistId ' . 'element is not supported in versions earlier than 2.'); } else { return $this->_playlistId; diff --git a/libs/Zend/Gdata/YouTube/SubscriptionEntry.php b/libs/Zend/Gdata/YouTube/SubscriptionEntry.php index e4f9215..4f9ceca 100644 --- a/libs/Zend/Gdata/YouTube/SubscriptionEntry.php +++ b/libs/Zend/Gdata/YouTube/SubscriptionEntry.php @@ -18,7 +18,7 @@ * @subpackage YouTube * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SubscriptionEntry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SubscriptionEntry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -86,35 +86,35 @@ class Zend_Gdata_YouTube_SubscriptionEntry extends Zend_Gdata_Entry * @var array */ protected $_feedLink = array(); - + /** * The username of this entry. * * @var Zend_Gdata_YouTube_Extension_Username */ protected $_username = null; - + /** * The playlist title for this entry. - * + * * This element is only used on subscriptions to playlists. * * @var Zend_Gdata_YouTube_Extension_PlaylistTitle */ protected $_playlistTitle = null; - + /** * The playlist id for this entry. - * + * * This element is only used on subscriptions to playlists. * * @var Zend_Gdata_YouTube_Extension_PlaylistId */ protected $_playlistId = null; - + /** * The media:thumbnail element for this entry. - * + * * This element is only used on subscriptions to playlists. * * @var Zend_Gdata_Media_Extension_MediaThumbnail @@ -276,7 +276,7 @@ class Zend_Gdata_YouTube_SubscriptionEntry extends Zend_Gdata_Entry return null; } } - + /** * Get the playlist title for a 'playlist' subscription. * @@ -299,7 +299,7 @@ class Zend_Gdata_YouTube_SubscriptionEntry extends Zend_Gdata_Entry /** * Sets the yt:playlistId element for a new playlist subscription. * - * @param Zend_Gdata_YouTube_Extension_PlaylistId $id The id of + * @param Zend_Gdata_YouTube_Extension_PlaylistId $id The id of * the playlist to which to subscribe to. * @throws Zend_Gdata_App_VersionException * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface @@ -363,7 +363,7 @@ class Zend_Gdata_YouTube_SubscriptionEntry extends Zend_Gdata_Entry /** * Sets the yt:playlistTitle element for a new playlist subscription. * - * @param Zend_Gdata_YouTube_Extension_PlaylistTitle $title The title of + * @param Zend_Gdata_YouTube_Extension_PlaylistTitle $title The title of * the playlist to which to subscribe to. * @throws Zend_Gdata_App_VersionException * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface @@ -419,7 +419,7 @@ class Zend_Gdata_YouTube_SubscriptionEntry extends Zend_Gdata_Entry return $this->_mediaThumbnail; } } - + /** * Get the username for a channel subscription. * @@ -433,7 +433,7 @@ class Zend_Gdata_YouTube_SubscriptionEntry extends Zend_Gdata_Entry /** * Sets the username for a new channel subscription. * - * @param Zend_Gdata_YouTube_Extension_Username $username The username of + * @param Zend_Gdata_YouTube_Extension_Username $username The username of * the channel to which to subscribe to. * @return Zend_Gdata_YouTube_SubscriptionEntry Provides a fluent interface */ diff --git a/libs/Zend/Gdata/YouTube/VideoQuery.php b/libs/Zend/Gdata/YouTube/VideoQuery.php index 8b4dc53..4441db9 100644 --- a/libs/Zend/Gdata/YouTube/VideoQuery.php +++ b/libs/Zend/Gdata/YouTube/VideoQuery.php @@ -18,7 +18,7 @@ * @subpackage YouTube * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: VideoQuery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: VideoQuery.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -177,7 +177,7 @@ class Zend_Gdata_YouTube_VideoQuery extends Zend_Gdata_Query public function setLocationRadius($value) { switch($value) { - case null: + case null: unset($this->_params['location-radius']); default: $this->_params['location-radius'] = $value; @@ -335,11 +335,11 @@ class Zend_Gdata_YouTube_VideoQuery extends Zend_Gdata_Query */ public function setSafeSearch($value) { - switch ($value) { + switch ($value) { case 'none': $this->_params['safeSearch'] = 'none'; break; - case 'moderate': + case 'moderate': $this->_params['safeSearch'] = 'moderate'; break; case 'strict': @@ -352,7 +352,7 @@ class Zend_Gdata_YouTube_VideoQuery extends Zend_Gdata_Query throw new Zend_Gdata_App_InvalidArgumentException( 'The safeSearch parameter only supports the values '. '\'none\', \'moderate\' or \'strict\'.'); - } + } } /** @@ -363,9 +363,9 @@ class Zend_Gdata_YouTube_VideoQuery extends Zend_Gdata_Query */ public function getSafeSearch() { - if (array_key_exists('safeSearch', $this->_params)) { - return $this->_params['safeSearch']; - } + if (array_key_exists('safeSearch', $this->_params)) { + return $this->_params['safeSearch']; + } return $this; } @@ -470,7 +470,7 @@ class Zend_Gdata_YouTube_VideoQuery extends Zend_Gdata_Query } break; - case 'racy': + case 'racy': if ($majorProtocolVersion == 2) { require_once 'Zend/Gdata/App/VersionException.php'; throw new Zend_Gdata_App_VersionException("The $name " . diff --git a/libs/Zend/Http/Client.php b/libs/Zend/Http/Client.php index a083c2c..5596a19 100644 --- a/libs/Zend/Http/Client.php +++ b/libs/Zend/Http/Client.php @@ -16,7 +16,7 @@ * @category Zend * @package Zend_Http * @subpackage Client - * @version $Id: Client.php 17374 2009-08-04 12:43:04Z shahar $ + * @version $Id: Client.php 17843 2009-08-27 14:40:35Z cogo $ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ diff --git a/libs/Zend/Http/Client/Adapter/Curl.php b/libs/Zend/Http/Client/Adapter/Curl.php index 3335745..37ffcc0 100644 --- a/libs/Zend/Http/Client/Adapter/Curl.php +++ b/libs/Zend/Http/Client/Adapter/Curl.php @@ -16,15 +16,19 @@ * @category Zend * @package Zend_Http * @subpackage Client_Adapter - * @version $Id: Curl.php 17118 2009-07-26 09:41:41Z shahar $ + * @version $Id: Curl.php 19087 2009-11-20 13:35:23Z padraic $ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -/** Zend_Uri_Http */ +/** + * @see Zend_Uri_Http + */ require_once 'Zend/Uri/Http.php'; -/** Zend_Http_Client_Adapter_Interface */ +/** + * @see Zend_Http_Client_Adapter_Interface + */ require_once 'Zend/Http/Client/Adapter/Interface.php'; /** @@ -78,7 +82,7 @@ class Zend_Http_Client_Adapter_Curl implements Zend_Http_Client_Adapter_Interfac CURLOPT_INFILESIZE, CURLOPT_PORT, CURLOPT_MAXREDIRS, - CURLOPT_TIMEOUT, + CURLOPT_CONNECTTIMEOUT, CURL_HTTP_VERSION_1_1, CURL_HTTP_VERSION_1_0, ); @@ -147,6 +151,17 @@ class Zend_Http_Client_Adapter_Curl implements Zend_Http_Client_Adapter_Interfac return $this; } + + /** + * Retrieve the array of all configuration options which + * are not simply passed immediately to CURL extension. + * + * @return array + */ + public function getConfig() + { + return $this->_config; + } /** * Direct setter for cURL adapter related options. @@ -196,7 +211,7 @@ class Zend_Http_Client_Adapter_Curl implements Zend_Http_Client_Adapter_Interfac } // Set timeout - curl_setopt($this->_curl, CURLOPT_TIMEOUT, $this->_config['timeout']); + curl_setopt($this->_curl, CURLOPT_CONNECTTIMEOUT, $this->_config['timeout']); // Set Max redirects curl_setopt($this->_curl, CURLOPT_MAXREDIRS, $this->_config['maxredirects']); diff --git a/libs/Zend/Http/Client/Adapter/Socket.php b/libs/Zend/Http/Client/Adapter/Socket.php index 13427c7..4257bc2 100644 --- a/libs/Zend/Http/Client/Adapter/Socket.php +++ b/libs/Zend/Http/Client/Adapter/Socket.php @@ -16,7 +16,7 @@ * @category Zend * @package Zend_Http * @subpackage Client_Adapter - * @version $Id: Socket.php 17124 2009-07-26 09:46:42Z shahar $ + * @version $Id: Socket.php 19087 2009-11-20 13:35:23Z padraic $ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -111,6 +111,16 @@ class Zend_Http_Client_Adapter_Socket implements Zend_Http_Client_Adapter_Interf $this->config[strtolower($k)] = $v; } } + + /** + * Retrieve the array of all configuration options + * + * @return array + */ + public function getConfig() + { + return $this->config; + } /** * Set the stream context for the TCP connection to the server diff --git a/libs/Zend/Http/Client/Adapter/Test.php b/libs/Zend/Http/Client/Adapter/Test.php index b054870..e36f43e 100644 --- a/libs/Zend/Http/Client/Adapter/Test.php +++ b/libs/Zend/Http/Client/Adapter/Test.php @@ -15,7 +15,7 @@ * @category Zend * @package Zend_Http * @subpackage Client_Adapter - * @version $Id: Test.php 17118 2009-07-26 09:41:41Z shahar $ + * @version $Id: Test.php 17869 2009-08-28 10:37:13Z cogo $ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ diff --git a/libs/Zend/InfoCard/Adapter/Exception.php b/libs/Zend/InfoCard/Adapter/Exception.php index 3c919a9..a3d9c7b 100644 --- a/libs/Zend/InfoCard/Adapter/Exception.php +++ b/libs/Zend/InfoCard/Adapter/Exception.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16877 2009-07-20 13:00:00Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,6 +31,6 @@ require_once 'Zend/InfoCard/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_InfoCard_Adapter_Exception extends Zend_InfoCard_Exception +class Zend_InfoCard_Adapter_Exception extends Zend_InfoCard_Exception { } diff --git a/libs/Zend/InfoCard/Cipher/Exception.php b/libs/Zend/InfoCard/Cipher/Exception.php index 11eb2bf..e70dcf7 100644 --- a/libs/Zend/InfoCard/Cipher/Exception.php +++ b/libs/Zend/InfoCard/Cipher/Exception.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Cipher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,6 +33,6 @@ require_once 'Zend/InfoCard/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_InfoCard_Cipher_Exception extends Zend_InfoCard_Exception +class Zend_InfoCard_Cipher_Exception extends Zend_InfoCard_Exception { } diff --git a/libs/Zend/InfoCard/Cipher/Pki/Interface.php b/libs/Zend/InfoCard/Cipher/Pki/Interface.php index f3df115..f1e2ff7 100644 --- a/libs/Zend/InfoCard/Cipher/Pki/Interface.php +++ b/libs/Zend/InfoCard/Cipher/Pki/Interface.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Cipher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,6 +28,6 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -interface Zend_InfoCard_Cipher_Pki_Interface +interface Zend_InfoCard_Cipher_Pki_Interface { } diff --git a/libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Abstract.php b/libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Abstract.php index 1816cad..9944676 100644 --- a/libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Abstract.php +++ b/libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Cipher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,7 +32,7 @@ require_once 'Zend/InfoCard/Cipher/Symmetric/Interface.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -abstract class Zend_InfoCard_Cipher_Symmetric_Adapter_Abstract - implements Zend_InfoCard_Cipher_Symmetric_Interface +abstract class Zend_InfoCard_Cipher_Symmetric_Adapter_Abstract + implements Zend_InfoCard_Cipher_Symmetric_Interface { } diff --git a/libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Aes128cbc.php b/libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Aes128cbc.php index 7b11f14..136649e 100644 --- a/libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Aes128cbc.php +++ b/libs/Zend/InfoCard/Cipher/Symmetric/Adapter/Aes128cbc.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Cipher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Aes128cbc.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Aes128cbc.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,14 +27,14 @@ require_once 'Zend/InfoCard/Cipher/Symmetric/Adapter/Aes256cbc.php'; /** * Implements AES128 with CBC encryption implemented using the mCrypt extension - * + * * @category Zend * @package Zend_InfoCard * @subpackage Zend_InfoCard_Cipher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_InfoCard_Cipher_Symmetric_Adapter_Aes128cbc - extends Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc +class Zend_InfoCard_Cipher_Symmetric_Adapter_Aes128cbc + extends Zend_InfoCard_Cipher_Symmetric_Adapter_Aes256cbc { } diff --git a/libs/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php b/libs/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php index 674929f..f99a265 100644 --- a/libs/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php +++ b/libs/Zend/InfoCard/Cipher/Symmetric/Aes128cbc/Interface.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Cipher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,7 +32,7 @@ require_once 'Zend/InfoCard/Cipher/Symmetric/Aes256cbc/Interface.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -interface Zend_InfoCard_Cipher_Symmetric_Aes128cbc_Interface - extends Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface +interface Zend_InfoCard_Cipher_Symmetric_Aes128cbc_Interface + extends Zend_InfoCard_Cipher_Symmetric_Aes256cbc_Interface { } diff --git a/libs/Zend/InfoCard/Cipher/Symmetric/Interface.php b/libs/Zend/InfoCard/Cipher/Symmetric/Interface.php index f3b0681..5b0da6b 100644 --- a/libs/Zend/InfoCard/Cipher/Symmetric/Interface.php +++ b/libs/Zend/InfoCard/Cipher/Symmetric/Interface.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Cipher * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,6 +27,6 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -interface Zend_InfoCard_Cipher_Symmetric_Interface +interface Zend_InfoCard_Cipher_Symmetric_Interface { } diff --git a/libs/Zend/InfoCard/Xml/Exception.php b/libs/Zend/InfoCard/Xml/Exception.php index 2eae3ef..44c8aff 100644 --- a/libs/Zend/InfoCard/Xml/Exception.php +++ b/libs/Zend/InfoCard/Xml/Exception.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Xml * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,6 +32,6 @@ require_once 'Zend/InfoCard/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_InfoCard_Xml_Exception extends Zend_InfoCard_Exception +class Zend_InfoCard_Xml_Exception extends Zend_InfoCard_Exception { } diff --git a/libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php b/libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php index 7392e11..7871844 100644 --- a/libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php +++ b/libs/Zend/InfoCard/Xml/KeyInfo/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Xml * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,6 +32,6 @@ require_once 'Zend/InfoCard/Xml/Element.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -abstract class Zend_InfoCard_Xml_KeyInfo_Abstract extends Zend_InfoCard_Xml_Element +abstract class Zend_InfoCard_Xml_KeyInfo_Abstract extends Zend_InfoCard_Xml_Element { } diff --git a/libs/Zend/InfoCard/Xml/Security/Exception.php b/libs/Zend/InfoCard/Xml/Security/Exception.php index 30b48ca..c6c4238 100644 --- a/libs/Zend/InfoCard/Xml/Security/Exception.php +++ b/libs/Zend/InfoCard/Xml/Security/Exception.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Xml_Security * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,6 +32,6 @@ require_once 'Zend/InfoCard/Xml/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_InfoCard_Xml_Security_Exception extends Zend_InfoCard_Xml_Exception +class Zend_InfoCard_Xml_Security_Exception extends Zend_InfoCard_Xml_Exception { } diff --git a/libs/Zend/InfoCard/Xml/Security/Transform/Exception.php b/libs/Zend/InfoCard/Xml/Security/Transform/Exception.php index 71a80c2..c5077a6 100644 --- a/libs/Zend/InfoCard/Xml/Security/Transform/Exception.php +++ b/libs/Zend/InfoCard/Xml/Security/Transform/Exception.php @@ -17,7 +17,7 @@ * @subpackage Zend_InfoCard_Xml_Security * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,6 +32,6 @@ require_once 'Zend/InfoCard/Xml/Security/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_InfoCard_Xml_Security_Transform_Exception extends Zend_InfoCard_Xml_Security_Exception +class Zend_InfoCard_Xml_Security_Transform_Exception extends Zend_InfoCard_Xml_Security_Exception { } diff --git a/libs/Zend/Json/Expr.php b/libs/Zend/Json/Expr.php index d8702a2..f41c529 100644 --- a/libs/Zend/Json/Expr.php +++ b/libs/Zend/Json/Expr.php @@ -17,14 +17,14 @@ * @subpackage Expr * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Expr.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Expr.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * Class for Zend_Json encode method. * * This class simply holds a string with a native Javascript Expression, - * so objects | arrays to be encoded with Zend_Json can contain native + * so objects | arrays to be encoded with Zend_Json can contain native * Javascript Expressions. * * Example: diff --git a/libs/Zend/Json/Server.php b/libs/Zend/Json/Server.php index 87ac2c8..a8d3a53 100644 --- a/libs/Zend/Json/Server.php +++ b/libs/Zend/Json/Server.php @@ -16,7 +16,7 @@ * @package Zend_Json * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Server.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Server.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -82,7 +82,7 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Attach a function or callback to the server - * + * * @param string|array $function Valid PHP callback * @param string $namespace Ignored * @return Zend_Json_Server @@ -134,8 +134,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Register a class with the server - * - * @param string $class + * + * @param string $class * @param string $namespace Ignored * @param mixed $argv Ignored * @return Zend_Json_Server @@ -160,9 +160,9 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Indicate fault response - * - * @param string $fault - * @param int $code + * + * @param string $fault + * @param int $code * @return false */ public function fault($fault = null, $code = 404, $data = null) @@ -175,8 +175,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Handle request - * - * @param Zend_Json_Server_Request $request + * + * @param Zend_Json_Server_Request $request * @return null|Zend_Json_Server_Response */ public function handle($request = false) @@ -206,8 +206,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Load function definitions - * - * @param array|Zend_Server_Definition $definition + * + * @param array|Zend_Server_Definition $definition * @return void */ public function loadFunctions($definition) @@ -229,8 +229,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Set request object - * - * @param Zend_Json_Server_Request $request + * + * @param Zend_Json_Server_Request $request * @return Zend_Json_Server */ public function setRequest(Zend_Json_Server_Request $request) @@ -241,7 +241,7 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Get JSON-RPC request object - * + * * @return Zend_Json_Server_Request */ public function getRequest() @@ -255,8 +255,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Set response object - * - * @param Zend_Json_Server_Response $response + * + * @param Zend_Json_Server_Response $response * @return Zend_Json_Server */ public function setResponse(Zend_Json_Server_Response $response) @@ -267,7 +267,7 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Get response object - * + * * @return Zend_Json_Server_Response */ public function getResponse() @@ -281,8 +281,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Set flag indicating whether or not to auto-emit response - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Json_Server */ public function setAutoEmitResponse($flag) @@ -293,7 +293,7 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Will we auto-emit the response? - * + * * @return bool */ public function autoEmitResponse() @@ -304,9 +304,9 @@ class Zend_Json_Server extends Zend_Server_Abstract // overloading for SMD metadata /** * Overload to accessors of SMD object - * - * @param string $method - * @param array $args + * + * @param string $method + * @param array $args * @return mixed */ public function __call($method, $args) @@ -327,7 +327,7 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Retrieve SMD object - * + * * @return Zend_Json_Server_Smd */ public function getServiceMap() @@ -341,8 +341,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Add service method to service map - * - * @param Zend_Server_Reflection_Function $method + * + * @param Zend_Server_Reflection_Function $method * @return void */ protected function _addMethodServiceMap(Zend_Server_Method_Definition $method) @@ -362,8 +362,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Translate PHP type to JSON type - * - * @param string $type + * + * @param string $type * @return string */ protected function _fixType($type) @@ -373,9 +373,9 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Get default params from signature - * - * @param array $args - * @param array $params + * + * @param array $args + * @param array $params * @return array */ protected function _getDefaultParams(array $args, array $params) @@ -393,8 +393,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Get method param type - * - * @param Zend_Server_Reflection_Function_Abstract $method + * + * @param Zend_Server_Reflection_Function_Abstract $method * @return string|array */ protected function _getParams(Zend_Server_Method_Definition $method) @@ -434,7 +434,7 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Set response state - * + * * @return Zend_Json_Server_Response */ protected function _getReadyResponse() @@ -455,8 +455,8 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Get method return type - * - * @param Zend_Server_Reflection_Function_Abstract $method + * + * @param Zend_Server_Reflection_Function_Abstract $method * @return string|array */ protected function _getReturnType(Zend_Server_Method_Definition $method) @@ -473,7 +473,7 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Retrieve list of allowed SMD methods for proxying - * + * * @return array */ protected function _getSmdMethods() @@ -497,7 +497,7 @@ class Zend_Json_Server extends Zend_Server_Abstract /** * Internal method for handling request - * + * * @return void */ protected function _handle() diff --git a/libs/Zend/Json/Server/Cache.php b/libs/Zend/Json/Server/Cache.php index ca47e2f..9cc16f2 100644 --- a/libs/Zend/Json/Server/Cache.php +++ b/libs/Zend/Json/Server/Cache.php @@ -17,7 +17,7 @@ * @subpackage Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Cache.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Cache.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Server_Cache */ @@ -38,9 +38,9 @@ class Zend_Json_Server_Cache extends Zend_Server_Cache * Cache a service map description (SMD) to a file * * Returns true on success, false on failure - * - * @param string $filename - * @param Zend_Json_Server $server + * + * @param string $filename + * @param Zend_Json_Server $server * @return boolean */ public static function saveSmd($filename, Zend_Json_Server $server) @@ -61,10 +61,10 @@ class Zend_Json_Server_Cache extends Zend_Server_Cache /** * Retrieve a cached SMD * - * On success, returns the cached SMD (a JSON string); an failure, returns + * On success, returns the cached SMD (a JSON string); an failure, returns * boolean false. - * - * @param string $filename + * + * @param string $filename * @return string|false */ public static function getSmd($filename) @@ -86,8 +86,8 @@ class Zend_Json_Server_Cache extends Zend_Server_Cache /** * Delete a file containing a cached SMD - * - * @param string $filename + * + * @param string $filename * @return bool */ public static function deleteSmd($filename) diff --git a/libs/Zend/Json/Server/Error.php b/libs/Zend/Json/Server/Error.php index 1f8d9e7..dab66df 100644 --- a/libs/Zend/Json/Server/Error.php +++ b/libs/Zend/Json/Server/Error.php @@ -16,7 +16,7 @@ * @package Zend_Json * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Error.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Error.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -67,10 +67,10 @@ class Zend_Json_Server_Error /** * Constructor - * - * @param string $message - * @param int $code - * @param mixed $data + * + * @param string $message + * @param int $code + * @param mixed $data * @return void */ public function __construct($message = null, $code = -32000, $data = null) @@ -82,8 +82,8 @@ class Zend_Json_Server_Error /** * Set error code - * - * @param int $code + * + * @param int $code * @return Zend_Json_Server_Error */ public function setCode($code) @@ -104,7 +104,7 @@ class Zend_Json_Server_Error /** * Get error code - * + * * @return int|null */ public function getCode() @@ -114,8 +114,8 @@ class Zend_Json_Server_Error /** * Set error message - * - * @param string $message + * + * @param string $message * @return Zend_Json_Server_Error */ public function setMessage($message) @@ -130,7 +130,7 @@ class Zend_Json_Server_Error /** * Get error message - * + * * @return string */ public function getMessage() @@ -140,8 +140,8 @@ class Zend_Json_Server_Error /** * Set error data - * - * @param mixed $data + * + * @param mixed $data * @return Zend_Json_Server_Error */ public function setData($data) @@ -152,7 +152,7 @@ class Zend_Json_Server_Error /** * Get error data - * + * * @return mixed */ public function getData() @@ -162,7 +162,7 @@ class Zend_Json_Server_Error /** * Cast error to array - * + * * @return array */ public function toArray() @@ -176,7 +176,7 @@ class Zend_Json_Server_Error /** * Cast error to JSON - * + * * @return string */ public function toJson() @@ -187,7 +187,7 @@ class Zend_Json_Server_Error /** * Cast to string (JSON) - * + * * @return string */ public function __toString() diff --git a/libs/Zend/Json/Server/Exception.php b/libs/Zend/Json/Server/Exception.php index 1f26b30..d24b69d 100644 --- a/libs/Zend/Json/Server/Exception.php +++ b/libs/Zend/Json/Server/Exception.php @@ -16,7 +16,7 @@ * @package Zend_Json * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Json_Exception */ @@ -24,7 +24,7 @@ require_once 'Zend/Json/Exception.php'; /** * Zend_Json_Server exceptions - * + * * @uses Zend_Json_Exception * @package Zend_Json * @subpackage Server diff --git a/libs/Zend/Json/Server/Request.php b/libs/Zend/Json/Server/Request.php index 8ad45aa..a99f801 100644 --- a/libs/Zend/Json/Server/Request.php +++ b/libs/Zend/Json/Server/Request.php @@ -17,7 +17,7 @@ * @subpackage Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Request.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Request.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -54,7 +54,7 @@ class Zend_Json_Server_Request protected $_methodRegex = '/^[a-z][a-z0-9_.]*$/i'; /** - * Request parameters + * Request parameters * @var array */ protected $_params = array(); @@ -67,8 +67,8 @@ class Zend_Json_Server_Request /** * Set request state - * - * @param array $options + * + * @param array $options * @return Zend_Json_Server_Request */ public function setOptions(array $options) @@ -87,9 +87,9 @@ class Zend_Json_Server_Request /** * Add a parameter to the request - * - * @param mixed $value - * @param string $key + * + * @param mixed $value + * @param string $key * @return Zend_Json_Server_Request */ public function addParam($value, $key = null) @@ -106,8 +106,8 @@ class Zend_Json_Server_Request /** * Add many params - * - * @param array $params + * + * @param array $params * @return Zend_Json_Server_Request */ public function addParams(array $params) @@ -120,8 +120,8 @@ class Zend_Json_Server_Request /** * Overwrite params - * - * @param array $params + * + * @param array $params * @return Zend_Json_Server_Request */ public function setParams(array $params) @@ -132,8 +132,8 @@ class Zend_Json_Server_Request /** * Retrieve param by index or key - * - * @param int|string $index + * + * @param int|string $index * @return mixed|null Null when not found */ public function getParam($index) @@ -146,8 +146,8 @@ class Zend_Json_Server_Request } /** - * Retrieve parameters - * + * Retrieve parameters + * * @return array */ public function getParams() @@ -157,8 +157,8 @@ class Zend_Json_Server_Request /** * Set request method - * - * @param string $name + * + * @param string $name * @return Zend_Json_Server_Request */ public function setMethod($name) @@ -173,7 +173,7 @@ class Zend_Json_Server_Request /** * Get request method name - * + * * @return string */ public function getMethod() @@ -182,8 +182,8 @@ class Zend_Json_Server_Request } /** - * Was a bad method provided? - * + * Was a bad method provided? + * * @return bool */ public function isMethodError() @@ -193,8 +193,8 @@ class Zend_Json_Server_Request /** * Set request identifier - * - * @param mixed $name + * + * @param mixed $name * @return Zend_Json_Server_Request */ public function setId($name) @@ -205,7 +205,7 @@ class Zend_Json_Server_Request /** * Retrieve request identifier - * + * * @return mixed */ public function getId() @@ -215,8 +215,8 @@ class Zend_Json_Server_Request /** * Set JSON-RPC version - * - * @param string $version + * + * @param string $version * @return Zend_Json_Server_Request */ public function setVersion($version) @@ -231,7 +231,7 @@ class Zend_Json_Server_Request /** * Retrieve JSON-RPC version - * + * * @return string */ public function getVersion() @@ -241,8 +241,8 @@ class Zend_Json_Server_Request /** * Set request state based on JSON - * - * @param string $json + * + * @param string $json * @return void */ public function loadJson($json) @@ -254,7 +254,7 @@ class Zend_Json_Server_Request /** * Cast request to JSON - * + * * @return string */ public function toJson() @@ -279,7 +279,7 @@ class Zend_Json_Server_Request /** * Cast request to string (JSON) - * + * * @return string */ public function __toString() diff --git a/libs/Zend/Json/Server/Request/Http.php b/libs/Zend/Json/Server/Request/Http.php index c4112f7..ce7e918 100644 --- a/libs/Zend/Json/Server/Request/Http.php +++ b/libs/Zend/Json/Server/Request/Http.php @@ -16,7 +16,7 @@ * @package Zend_Json * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Http.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Http.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -42,7 +42,7 @@ class Zend_Json_Server_Request_Http extends Zend_Json_Server_Request * Constructor * * Pull JSON request from raw POST body and use to populate request. - * + * * @return void */ public function __construct() @@ -56,7 +56,7 @@ class Zend_Json_Server_Request_Http extends Zend_Json_Server_Request /** * Get JSON from raw POST body - * + * * @return string */ public function getRawJson() diff --git a/libs/Zend/Json/Server/Response.php b/libs/Zend/Json/Server/Response.php index 5b3ec1b..ddd1b03 100644 --- a/libs/Zend/Json/Server/Response.php +++ b/libs/Zend/Json/Server/Response.php @@ -17,7 +17,7 @@ * @subpackage Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Response.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Response.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -61,8 +61,8 @@ class Zend_Json_Server_Response /** * Set result - * - * @param mixed $value + * + * @param mixed $value * @return Zend_Json_Server_Response */ public function setResult($value) @@ -73,7 +73,7 @@ class Zend_Json_Server_Response /** * Get result - * + * * @return mixed */ public function getResult() @@ -84,8 +84,8 @@ class Zend_Json_Server_Response // RPC error, if response results in fault /** * Set result error - * - * @param Zend_Json_Server_Error $error + * + * @param Zend_Json_Server_Error $error * @return Zend_Json_Server_Response */ public function setError(Zend_Json_Server_Error $error) @@ -96,7 +96,7 @@ class Zend_Json_Server_Response /** * Get response error - * + * * @return null|Zend_Json_Server_Error */ public function getError() @@ -106,7 +106,7 @@ class Zend_Json_Server_Response /** * Is the response an error? - * + * * @return bool */ public function isError() @@ -116,8 +116,8 @@ class Zend_Json_Server_Response /** * Set request ID - * - * @param mixed $name + * + * @param mixed $name * @return Zend_Json_Server_Response */ public function setId($name) @@ -128,7 +128,7 @@ class Zend_Json_Server_Response /** * Get request ID - * + * * @return mixed */ public function getId() @@ -138,8 +138,8 @@ class Zend_Json_Server_Response /** * Set JSON-RPC version - * - * @param string $version + * + * @param string $version * @return Zend_Json_Server_Response */ public function setVersion($version) @@ -156,7 +156,7 @@ class Zend_Json_Server_Response /** * Retrieve JSON-RPC version - * + * * @return string */ public function getVersion() @@ -166,7 +166,7 @@ class Zend_Json_Server_Response /** * Cast to JSON - * + * * @return string */ public function toJson() @@ -237,7 +237,7 @@ class Zend_Json_Server_Response /** * Cast to string (JSON) - * + * * @return string */ public function __toString() diff --git a/libs/Zend/Json/Server/Response/Http.php b/libs/Zend/Json/Server/Response/Http.php index 732e8ee..21492a9 100644 --- a/libs/Zend/Json/Server/Response/Http.php +++ b/libs/Zend/Json/Server/Response/Http.php @@ -16,7 +16,7 @@ * @package Zend_Json * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Http.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Http.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,7 +36,7 @@ class Zend_Json_Server_Response_Http extends Zend_Json_Server_Response * Emit JSON * * Send appropriate HTTP headers. If no Id, then return an empty string. - * + * * @return string */ public function toJson() @@ -52,10 +52,10 @@ class Zend_Json_Server_Response_Http extends Zend_Json_Server_Response /** * Send headers * - * If headers are already sent, do nothing. If null ID, send HTTP 204 - * header. Otherwise, send content type header based on content type of + * If headers are already sent, do nothing. If null ID, send HTTP 204 + * header. Otherwise, send content type header based on content type of * service map. - * + * * @return void */ public function sendHeaders() diff --git a/libs/Zend/Json/Server/Smd.php b/libs/Zend/Json/Server/Smd.php index 7ddda15..5cde5d8 100644 --- a/libs/Zend/Json/Server/Smd.php +++ b/libs/Zend/Json/Server/Smd.php @@ -17,7 +17,7 @@ * @subpackage Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Smd.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Smd.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -104,8 +104,8 @@ class Zend_Json_Server_Smd /** * Set object state via options - * - * @param array $options + * + * @param array $options * @return Zend_Json_Server_Smd */ public function setOptions(array $options) @@ -122,8 +122,8 @@ class Zend_Json_Server_Smd /** * Set transport - * - * @param string $transport + * + * @param string $transport * @return Zend_Json_Server_Smd */ public function setTransport($transport) @@ -138,7 +138,7 @@ class Zend_Json_Server_Smd /** * Get transport - * + * * @return string */ public function getTransport() @@ -148,8 +148,8 @@ class Zend_Json_Server_Smd /** * Set envelope - * - * @param string $envelopeType + * + * @param string $envelopeType * @return Zend_Json_Server_Smd */ public function setEnvelope($envelopeType) @@ -164,7 +164,7 @@ class Zend_Json_Server_Smd /** * Retrieve envelope - * + * * @return string */ public function getEnvelope() @@ -175,8 +175,8 @@ class Zend_Json_Server_Smd // Content-Type of response; default to application/json /** * Set content type - * - * @param string $type + * + * @param string $type * @return Zend_Json_Server_Smd */ public function setContentType($type) @@ -191,7 +191,7 @@ class Zend_Json_Server_Smd /** * Retrieve content type - * + * * @return string */ public function getContentType() @@ -201,8 +201,8 @@ class Zend_Json_Server_Smd /** * Set service target - * - * @param string $target + * + * @param string $target * @return Zend_Json_Server_Smd */ public function setTarget($target) @@ -213,7 +213,7 @@ class Zend_Json_Server_Smd /** * Retrieve service target - * + * * @return string */ public function getTarget() @@ -223,8 +223,8 @@ class Zend_Json_Server_Smd /** * Set service ID - * - * @param string $Id + * + * @param string $Id * @return Zend_Json_Server_Smd */ public function setId($id) @@ -234,8 +234,8 @@ class Zend_Json_Server_Smd } /** - * Get service id - * + * Get service id + * * @return string */ public function getId() @@ -245,8 +245,8 @@ class Zend_Json_Server_Smd /** * Set service description - * - * @param string $description + * + * @param string $description * @return Zend_Json_Server_Smd */ public function setDescription($description) @@ -256,8 +256,8 @@ class Zend_Json_Server_Smd } /** - * Get service description - * + * Get service description + * * @return string */ public function getDescription() @@ -267,8 +267,8 @@ class Zend_Json_Server_Smd /** * Indicate whether or not to generate Dojo-compatible SMD - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Json_Server_Smd */ public function setDojoCompatible($flag) @@ -279,7 +279,7 @@ class Zend_Json_Server_Smd /** * Is this a Dojo compatible SMD? - * + * * @return bool */ public function isDojoCompatible() @@ -288,9 +288,9 @@ class Zend_Json_Server_Smd } /** - * Add Service - * - * @param Zend_Json_Server_Smd_Service|array $service + * Add Service + * + * @param Zend_Json_Server_Smd_Service|array $service * @return void */ public function addService($service) @@ -317,8 +317,8 @@ class Zend_Json_Server_Smd /** * Add many services - * - * @param array $services + * + * @param array $services * @return Zend_Json_Server_Smd */ public function addServices(array $services) @@ -331,8 +331,8 @@ class Zend_Json_Server_Smd /** * Overwrite existing services with new ones - * - * @param array $services + * + * @param array $services * @return Zend_Json_Server_Smd */ public function setServices(array $services) @@ -343,8 +343,8 @@ class Zend_Json_Server_Smd /** * Get service object - * - * @param string $name + * + * @param string $name * @return false|Zend_Json_Server_Smd_Service */ public function getService($name) @@ -357,7 +357,7 @@ class Zend_Json_Server_Smd /** * Return services - * + * * @return array */ public function getServices() @@ -367,8 +367,8 @@ class Zend_Json_Server_Smd /** * Remove service - * - * @param string $name + * + * @param string $name * @return boolean */ public function removeService($name) @@ -382,7 +382,7 @@ class Zend_Json_Server_Smd /** * Cast to array - * + * * @return array */ public function toArray() @@ -419,7 +419,7 @@ class Zend_Json_Server_Smd /** * Export to DOJO-compatible SMD array - * + * * @return array */ public function toDojoArray() @@ -458,7 +458,7 @@ class Zend_Json_Server_Smd /** * Cast to JSON - * + * * @return string */ public function toJson() @@ -469,7 +469,7 @@ class Zend_Json_Server_Smd /** * Cast to string (JSON) - * + * * @return string */ public function __toString() diff --git a/libs/Zend/Json/Server/Smd/Service.php b/libs/Zend/Json/Server/Smd/Service.php index 83afbbd..42df421 100644 --- a/libs/Zend/Json/Server/Smd/Service.php +++ b/libs/Zend/Json/Server/Smd/Service.php @@ -25,10 +25,10 @@ require_once 'Zend/Json/Server/Smd.php'; /** * Create Service Mapping Description for a method - * + * * @package Zend_Json * @subpackage Server - * @version $Id: Service.php 16214 2009-06-21 19:34:03Z thomas $ + * @version $Id: Service.php 18951 2009-11-12 16:26:19Z alexander $ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -116,8 +116,8 @@ class Zend_Json_Server_Smd_Service /** * Constructor - * - * @param string|array $spec + * + * @param string|array $spec * @return void * @throws Zend_Json_Server_Exception if no name provided */ @@ -137,8 +137,8 @@ class Zend_Json_Server_Smd_Service /** * Set object state - * - * @param array $options + * + * @param array $options * @return Zend_Json_Server_Smd_Service */ public function setOptions(array $options) @@ -158,8 +158,8 @@ class Zend_Json_Server_Smd_Service /** * Set service name - * - * @param string $name + * + * @param string $name * @return Zend_Json_Server_Smd_Service * @throws Zend_Json_Server_Exception */ @@ -176,7 +176,7 @@ class Zend_Json_Server_Smd_Service /** * Retrieve name - * + * * @return string */ public function getName() @@ -185,11 +185,11 @@ class Zend_Json_Server_Smd_Service } /** - * Set Transport + * Set Transport * * Currently limited to POST - * - * @param string $transport + * + * @param string $transport * @return Zend_Json_Server_Smd_Service */ public function setTransport($transport) @@ -205,7 +205,7 @@ class Zend_Json_Server_Smd_Service /** * Get transport - * + * * @return string */ public function getTransport() @@ -215,8 +215,8 @@ class Zend_Json_Server_Smd_Service /** * Set service target - * - * @param string $target + * + * @param string $target * @return Zend_Json_Server_Smd_Service */ public function setTarget($target) @@ -227,7 +227,7 @@ class Zend_Json_Server_Smd_Service /** * Get service target - * + * * @return string */ public function getTarget() @@ -237,8 +237,8 @@ class Zend_Json_Server_Smd_Service /** * Set envelope type - * - * @param string $envelopeType + * + * @param string $envelopeType * @return Zend_Json_Server_Smd_Service */ public function setEnvelope($envelopeType) @@ -254,7 +254,7 @@ class Zend_Json_Server_Smd_Service /** * Get envelope type - * + * * @return string */ public function getEnvelope() @@ -264,10 +264,10 @@ class Zend_Json_Server_Smd_Service /** * Add a parameter to the service - * - * @param string|array $type - * @param array $options - * @param int|null $order + * + * @param string|array $type + * @param array $options + * @param int|null $order * @return Zend_Json_Server_Smd_Service */ public function addParam($type, array $options = array(), $order = null) @@ -309,8 +309,8 @@ class Zend_Json_Server_Smd_Service * Add params * * Each param should be an array, and should include the key 'type'. - * - * @param array $params + * + * @param array $params * @return Zend_Json_Server_Smd_Service */ public function addParams(array $params) @@ -332,8 +332,8 @@ class Zend_Json_Server_Smd_Service /** * Overwrite all parameters - * - * @param array $params + * + * @param array $params * @return Zend_Json_Server_Smd_Service */ public function setParams(array $params) @@ -343,10 +343,10 @@ class Zend_Json_Server_Smd_Service } /** - * Get all parameters + * Get all parameters * * Returns all params in specified order. - * + * * @return array */ public function getParams() @@ -370,8 +370,8 @@ class Zend_Json_Server_Smd_Service /** * Set return type - * - * @param string|array $type + * + * @param string|array $type * @return Zend_Json_Server_Smd_Service */ public function setReturn($type) @@ -392,7 +392,7 @@ class Zend_Json_Server_Smd_Service /** * Get return type - * + * * @return string|array */ public function getReturn() @@ -402,7 +402,7 @@ class Zend_Json_Server_Smd_Service /** * Cast service description to array - * + * * @return array */ public function toArray() @@ -416,14 +416,14 @@ class Zend_Json_Server_Smd_Service if (empty($target)) { return compact('envelope', 'transport', 'parameters', 'returns'); - } + } return $paramInfo = compact('envelope', 'target', 'transport', 'parameters', 'returns'); } /** * Return JSON encoding of service - * + * * @return string */ public function toJson() @@ -436,7 +436,7 @@ class Zend_Json_Server_Smd_Service /** * Cast to string - * + * * @return string */ public function __toString() @@ -446,8 +446,8 @@ class Zend_Json_Server_Smd_Service /** * Validate parameter type - * - * @param string $type + * + * @param string $type * @return true * @throws Zend_Json_Server_Exception */ diff --git a/libs/Zend/Layout.php b/libs/Zend/Layout.php index 46de129..9442eb1 100644 --- a/libs/Zend/Layout.php +++ b/libs/Zend/Layout.php @@ -16,7 +16,7 @@ * @package Zend_Layout * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Layout.php 16942 2009-07-22 04:03:09Z ralph $ + * @version $Id: Layout.php 19089 2009-11-20 14:16:17Z bate $ */ /** @@ -52,7 +52,7 @@ class Zend_Layout * @var string */ protected $_helperClass = 'Zend_Layout_Controller_Action_Helper_Layout'; - + /** * Inflector used to resolve layout script * @var Zend_Filter_Inflector @@ -82,7 +82,7 @@ class Zend_Layout * @var string */ protected $_viewScriptPath = null; - + protected $_viewBasePath = null; protected $_viewBasePrefix = 'Layout_View'; @@ -109,7 +109,7 @@ class Zend_Layout * @var string */ protected $_pluginClass = 'Zend_Layout_Controller_Plugin_Layout'; - + /** * @var Zend_View_Interface */ @@ -129,18 +129,18 @@ class Zend_Layout * - An array of options * - A Zend_Config object with options * - * Layout script path, either as argument or as key in options, is + * Layout script path, either as argument or as key in options, is * required. * - * If mvcEnabled flag is false from options, simply sets layout script path. - * Otherwise, also instantiates and registers action helper and controller + * If mvcEnabled flag is false from options, simply sets layout script path. + * Otherwise, also instantiates and registers action helper and controller * plugin. - * - * @param string|array|Zend_Config $options + * + * @param string|array|Zend_Config $options * @return void - */ - public function __construct($options = null, $initMvc = false) - { + */ + public function __construct($options = null, $initMvc = false) + { if (null !== $options) { if (is_string($options)) { $this->setLayoutPath($options); @@ -166,8 +166,8 @@ class Zend_Layout /** * Static method for initialization with MVC support - * - * @param string|array|Zend_Config $options + * + * @param string|array|Zend_Config $options * @return Zend_Layout */ public static function startMvc($options = null) @@ -175,7 +175,7 @@ class Zend_Layout if (null === self::$_mvcInstance) { self::$_mvcInstance = new self($options, true); } - + if (is_string($options)) { self::$_mvcInstance->setLayoutPath($options); } elseif (is_array($options) || $options instanceof Zend_Config) { @@ -187,7 +187,7 @@ class Zend_Layout /** * Retrieve MVC instance of Zend_Layout object - * + * * @return Zend_Layout|null */ public static function getMvcInstance() @@ -199,7 +199,7 @@ class Zend_Layout * Reset MVC instance * * Unregisters plugins and helpers, and destroys MVC layout instance. - * + * * @return void */ public static function resetMvcInstance() @@ -223,8 +223,8 @@ class Zend_Layout /** * Set options en masse - * - * @param array|Zend_Config $options + * + * @param array|Zend_Config $options * @return void */ public function setOptions($options) @@ -246,7 +246,7 @@ class Zend_Layout /** * Initialize MVC integration - * + * * @return void */ protected function _initMvc() @@ -257,7 +257,7 @@ class Zend_Layout /** * Initialize front controller plugin - * + * * @return void */ protected function _initPlugin() @@ -272,7 +272,7 @@ class Zend_Layout } $front->registerPlugin( // register to run last | BUT before the ErrorHandler (if its available) - new $pluginClass($this), + new $pluginClass($this), 99 ); } @@ -280,7 +280,7 @@ class Zend_Layout /** * Initialize action helper - * + * * @return void */ protected function _initHelper() @@ -298,8 +298,8 @@ class Zend_Layout /** * Set options from a config object - * - * @param Zend_Config $config + * + * @param Zend_Config $config * @return Zend_Layout */ public function setConfig(Zend_Config $config) @@ -310,7 +310,7 @@ class Zend_Layout /** * Initialize placeholder container for layout vars - * + * * @return Zend_View_Helper_Placeholder_Container */ protected function _initVarContainer() @@ -326,42 +326,45 @@ class Zend_Layout /** * Set layout script to use * - * Note: enables layout. - * - * @param string $name + * Note: enables layout by default, can be disabled + * + * @param string $name + * @param boolean $enabled * @return Zend_Layout - */ - public function setLayout($name) + */ + public function setLayout($name, $enabled = true) { $this->_layout = (string) $name; - $this->enableLayout(); + if ($enabled) { + $this->enableLayout(); + } return $this; } - + /** * Get current layout script - * + * * @return string - */ - public function getLayout() + */ + public function getLayout() { return $this->_layout; - } - + } + /** * Disable layout * * @return Zend_Layout - */ - public function disableLayout() + */ + public function disableLayout() { $this->_enabled = false; return $this; - } + } /** - * Enable layout - * + * Enable layout + * * @return Zend_Layout */ public function enableLayout() @@ -372,7 +375,7 @@ class Zend_Layout /** * Is layout enabled? - * + * * @return bool */ public function isEnabled() @@ -380,50 +383,50 @@ class Zend_Layout return $this->_enabled; } - + public function setViewBasePath($path, $prefix = 'Layout_View') { $this->_viewBasePath = $path; $this->_viewBasePrefix = $prefix; return $this; } - + public function getViewBasePath() { return $this->_viewBasePath; } - + public function setViewScriptPath($path) { $this->_viewScriptPath = $path; return $this; } - + public function getViewScriptPath() { return $this->_viewScriptPath; } - + /** * Set layout script path - * - * @param string $path + * + * @param string $path * @return Zend_Layout - */ - public function setLayoutPath($path) + */ + public function setLayoutPath($path) { return $this->setViewScriptPath($path); - } - + } + /** * Get current layout script path - * + * * @return string - */ - public function getLayoutPath() + */ + public function getLayoutPath() { return $this->getViewScriptPath(); - } + } /** * Set content key @@ -482,7 +485,7 @@ class Zend_Layout $this->_mvcSuccessfulActionOnly = ($successfulActionOnly) ? true : false; return $this; } - + /** * Get MVC Successful Action Only Flag * @@ -492,18 +495,18 @@ class Zend_Layout { return $this->_mvcSuccessfulActionOnly; } - + /** * Set view object - * + * * @param Zend_View_Interface $view * @return Zend_Layout - */ - public function setView(Zend_View_Interface $view) + */ + public function setView(Zend_View_Interface $view) { $this->_view = $view; return $this; - } + } /** * Retrieve helper class @@ -548,16 +551,16 @@ class Zend_Layout $this->_pluginClass = (string) $pluginClass; return $this; } - + /** * Get current view object * * If no view object currently set, retrieves it from the ViewRenderer. - * + * * @todo Set inflector from view renderer at same time * @return Zend_View_Interface - */ - public function getView() + */ + public function getView() { if (null === $this->_view) { require_once 'Zend/Controller/Action/HelperBroker.php'; @@ -568,7 +571,7 @@ class Zend_Layout $this->setView($viewRenderer->view); } return $this->_view; - } + } /** * Set layout view script suffix @@ -581,7 +584,7 @@ class Zend_Layout $this->_viewSuffix = (string) $viewSuffix; return $this; } - + /** * Retrieve layout view script suffix * @@ -647,7 +650,7 @@ class Zend_Layout /** * Enable inflector - * + * * @return Zend_Layout */ public function enableInflector() @@ -658,7 +661,7 @@ class Zend_Layout /** * Disable inflector - * + * * @return Zend_Layout */ public function disableInflector() @@ -669,7 +672,7 @@ class Zend_Layout /** * Return status of inflector enabled flag - * + * * @return bool */ public function inflectorEnabled() @@ -679,23 +682,23 @@ class Zend_Layout /** * Set layout variable - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return void - */ - public function __set($key, $value) + */ + public function __set($key, $value) { $this->_container[$key] = $value; } - + /** * Get layout variable - * + * * @param string $key * @return mixed - */ - public function __get($key) + */ + public function __get($key) { if (isset($this->_container[$key])) { return $this->_container[$key]; @@ -703,41 +706,41 @@ class Zend_Layout return null; } - + /** * Is a layout variable set? * * @param string $key * @return bool - */ - public function __isset($key) + */ + public function __isset($key) { return (isset($this->_container[$key])); - } - + } + /** * Unset a layout variable? * * @param string $key * @return void - */ - public function __unset($key) + */ + public function __unset($key) { if (isset($this->_container[$key])) { unset($this->_container[$key]); } - } - + } + /** * Assign one or more layout variables - * + * * @param mixed $spec Assoc array or string key; if assoc array, sets each * key as a layout variable * @param mixed $value Value if $spec is a key * @return Zend_Layout * @throws Zend_Layout_Exception if non-array/string value passed to $spec - */ - public function assign($spec, $value = null) + */ + public function assign($spec, $value = null) { if (is_array($spec)) { $orig = $this->_container->getArrayCopy(); @@ -758,17 +761,17 @@ class Zend_Layout /** * Render layout * - * Sets internal script path as last path on script path stack, assigns - * layout variables to view, determines layout name using inflector, and + * Sets internal script path as last path on script path stack, assigns + * layout variables to view, determines layout name using inflector, and * renders layout view script. * * $name will be passed to the inflector as the key 'script'. - * - * @param mixed $name + * + * @param mixed $name * @return mixed - */ - public function render($name = null) - { + */ + public function render($name = null) + { if (null === $name) { $name = $this->getLayout(); } diff --git a/libs/Zend/Layout/Controller/Action/Helper/Layout.php b/libs/Zend/Layout/Controller/Action/Helper/Layout.php index d7f69fe..05094c7 100644 --- a/libs/Zend/Layout/Controller/Action/Helper/Layout.php +++ b/libs/Zend/Layout/Controller/Action/Helper/Layout.php @@ -16,7 +16,7 @@ * @package Zend_Controller * @subpackage Zend_Controller_Action * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Layout.php 16213 2009-06-21 19:25:32Z thomas $ + * @version $Id: Layout.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -49,11 +49,11 @@ class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action * @var bool */ protected $_isActionControllerSuccessful = false; - + /** * Constructor - * - * @param Zend_Layout $layout + * + * @param Zend_Layout $layout * @return void */ public function __construct(Zend_Layout $layout = null) @@ -67,7 +67,7 @@ class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action require_once 'Zend/Layout.php'; $layout = Zend_Layout::getMvcInstance(); } - + if (null !== $layout) { $pluginClass = $layout->getPluginClass(); $front = $this->getFrontController(); @@ -85,7 +85,7 @@ class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action /** * Get front controller instance - * + * * @return Zend_Controller_Front */ public function getFrontController() @@ -100,10 +100,10 @@ class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action return $this->_frontController; } - + /** * Get layout object - * + * * @return Zend_Layout */ public function getLayoutInstance() @@ -123,8 +123,8 @@ class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action /** * Set layout object - * - * @param Zend_Layout $layout + * + * @param Zend_Layout $layout * @return Zend_Layout_Controller_Action_Helper_Layout */ public function setLayoutInstance(Zend_Layout $layout) @@ -143,7 +143,7 @@ class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action $this->_isActionControllerSuccessful = true; return $this; } - + /** * Did the previous action successfully complete? * @@ -153,12 +153,12 @@ class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action { return $this->_isActionControllerSuccessful; } - + /** * Strategy pattern; call object as method * * Returns layout object - * + * * @return Zend_Layout */ public function direct() @@ -168,9 +168,9 @@ class Zend_Layout_Controller_Action_Helper_Layout extends Zend_Controller_Action /** * Proxy method calls to layout object - * - * @param string $method - * @param array $args + * + * @param string $method + * @param array $args * @return mixed */ public function __call($method, $args) diff --git a/libs/Zend/Layout/Controller/Plugin/Layout.php b/libs/Zend/Layout/Controller/Plugin/Layout.php index 288972f..344bfb1 100644 --- a/libs/Zend/Layout/Controller/Plugin/Layout.php +++ b/libs/Zend/Layout/Controller/Plugin/Layout.php @@ -31,12 +31,12 @@ require_once 'Zend/Controller/Plugin/Abstract.php'; * @subpackage Plugins * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Layout.php 16213 2009-06-21 19:25:32Z thomas $ + * @version $Id: Layout.php 19091 2009-11-20 14:45:56Z bate $ */ class Zend_Layout_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstract { protected $_layoutActionHelper = null; - + /** * @var Zend_Layout */ @@ -44,8 +44,8 @@ class Zend_Layout_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstra /** * Constructor - * - * @param Zend_Layout $layout + * + * @param Zend_Layout $layout * @return void */ public function __construct(Zend_Layout $layout = null) @@ -79,8 +79,8 @@ class Zend_Layout_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstra /** * Set layout action helper - * - * @param Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper + * + * @param Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper * @return Zend_Layout_Controller_Plugin_Layout */ public function setLayoutActionHelper(Zend_Layout_Controller_Action_Helper_Layout $layoutActionHelper) @@ -91,14 +91,14 @@ class Zend_Layout_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstra /** * Retrieve layout action helper - * + * * @return Zend_Layout_Controller_Action_Helper_Layout */ public function getLayoutActionHelper() { return $this->_layoutActionHelper; } - + /** * postDispatch() plugin hook -- render layout * @@ -111,9 +111,10 @@ class Zend_Layout_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstra $helper = $this->getLayoutActionHelper(); // Return early if forward detected - if (!$request->isDispatched() - || ($layout->getMvcSuccessfulActionOnly() - && (!empty($helper) && !$helper->isActionControllerSuccessful()))) + if (!$request->isDispatched() + || $this->getResponse()->isRedirect() + || ($layout->getMvcSuccessfulActionOnly() + && (!empty($helper) && !$helper->isActionControllerSuccessful()))) { return; } @@ -135,7 +136,7 @@ class Zend_Layout_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstra } $layout->assign($content); - + $fullContent = null; $obStartLevel = ob_get_level(); try { diff --git a/libs/Zend/Ldap.php b/libs/Zend/Ldap.php index 758a5ae..344a1e5 100644 --- a/libs/Zend/Ldap.php +++ b/libs/Zend/Ldap.php @@ -17,7 +17,7 @@ * @package Zend_Ldap * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Ldap.php 16890 2009-07-20 19:30:49Z sgehrig $ + * @version $Id: Ldap.php 18881 2009-11-06 10:55:19Z sgehrig $ */ /** @@ -28,8 +28,8 @@ */ class Zend_Ldap { - const SEARCH_SCOPE_SUB = 1; - const SEARCH_SCOPE_ONE = 2; + const SEARCH_SCOPE_SUB = 1; + const SEARCH_SCOPE_ONE = 2; const SEARCH_SCOPE_BASE = 3; const ACCTNAME_FORM_DN = 1; @@ -72,18 +72,18 @@ class Zend_Ldap */ protected $_schema = null; - /** + /** * @deprecated will be removed, use {@see Zend_Ldap_Filter_Abstract::escapeValue()} * @param string $str The string to escape. * @return string The escaped string */ public static function filterEscape($str) { - /** - * @see Zend_Ldap_Filter_Abstract - */ - require_once 'Zend/Ldap/Filter/Abstract.php'; - return Zend_Ldap_Filter_Abstract::escapeValue($str); + /** + * @see Zend_Ldap_Filter_Abstract + */ + require_once 'Zend/Ldap/Filter/Abstract.php'; + return Zend_Ldap_Filter_Abstract::escapeValue($str); } /** @@ -96,15 +96,15 @@ class Zend_Ldap */ public static function explodeDn($dn, array &$keys = null, array &$vals = null) { - /** - * @see Zend_Ldap_Dn + /** + * @see Zend_Ldap_Dn */ - require_once 'Zend/Ldap/Dn.php'; + require_once 'Zend/Ldap/Dn.php'; return Zend_Ldap_Dn::checkDn($dn, $keys, $vals); } /** - * Constructor. + * Constructor. * * @param array|Zend_Config $options Options used in connecting, binding, etc. * @return void @@ -115,13 +115,13 @@ class Zend_Ldap } /** - * Destructor. - * - * @return void - */ - public function __destruct() - { - $this->disconnect(); + * Destructor. + * + * @return void + */ + public function __destruct() + { + $this->disconnect(); } /** @@ -159,7 +159,7 @@ class Zend_Ldap /** * Return the LDAP error message of the last LDAP command * - * @param int $errorCode + * @param int $errorCode * @param array $errorMessages * @return string */ @@ -225,9 +225,9 @@ class Zend_Ldap */ public function setOptions($options) { - if ($options instanceof Zend_Config) { - $options = $options->toArray(); - } + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } $permittedOptions = array( 'host' => null, @@ -276,10 +276,13 @@ class Zend_Ldap } if (count($options) > 0) { $key = key($options); + /** + * @see Zend_Ldap_Exception + */ require_once 'Zend/Ldap/Exception.php'; throw new Zend_Ldap_Exception(null, "Unknown Zend_Ldap option: $key"); } - $this->_options = $permittedOptions; + $this->_options = $permittedOptions; return $this; } @@ -350,7 +353,7 @@ class Zend_Ldap } /** - * @return string Either ACCTNAME_FORM_BACKSLASH, ACCTNAME_FORM_PRINCIPAL or + * @return integer Either ACCTNAME_FORM_BACKSLASH, ACCTNAME_FORM_PRINCIPAL or * ACCTNAME_FORM_USERNAME indicating the form usernames should be canonicalized to. */ protected function _getAccountCanonicalForm() @@ -439,9 +442,9 @@ class Zend_Ldap */ protected function _getAccountFilter($acctname) { - /** - * @see Zend_Ldap_Filter_Abstract - */ + /** + * @see Zend_Ldap_Filter_Abstract + */ require_once 'Zend/Ldap/Filter/Abstract.php'; $this->_splitName($acctname, $dname, $aname); $accountFilterFormat = $this->_getAccountFilterFormat(); @@ -457,9 +460,10 @@ class Zend_Ldap } /** - * @param string $name The name to split + * @param string $name The name to split * @param string $dname The resulting domain name (this is an out parameter) * @param string $aname The resulting account name (this is an out parameter) + * @return void */ protected function _splitName($name, &$dname, &$aname) { @@ -484,7 +488,7 @@ class Zend_Ldap } /** - * @param string $acctname The name of the account + * @param string $acctname The name of the account * @return string The DN of the specified account * @throws Zend_Ldap_Exception */ @@ -493,7 +497,7 @@ class Zend_Ldap /** * @see Zend_Ldap_Dn */ - require_once 'Zend/Ldap/Dn.php'; + require_once 'Zend/Ldap/Dn.php'; if (Zend_Ldap_Dn::checkDn($acctname)) return $acctname; $acctname = $this->getCanonicalAccountName($acctname, Zend_Ldap::ACCTNAME_FORM_USERNAME); $acct = $this->_getAccount($acctname, array('dn')); @@ -501,31 +505,31 @@ class Zend_Ldap } /** - * @param string $dname The domain name to check + * @param string $dname The domain name to check * @return boolean */ protected function _isPossibleAuthority($dname) { if ($dname === null) { - return true; + return true; } $accountDomainName = $this->_getAccountDomainName(); $accountDomainNameShort = $this->_getAccountDomainNameShort(); if ($accountDomainName === null && $accountDomainNameShort === null) { - return true; + return true; } if (strcasecmp($dname, $accountDomainName) == 0) { - return true; + return true; } if (strcasecmp($dname, $accountDomainNameShort) == 0) { - return true; + return true; } return false; } /** - * @param string $acctname The name to canonicalize - * @param int $type The desired form of canonicalization + * @param string $acctname The name to canonicalize + * @param int $type The desired form of canonicalization * @return string The canonicalized name in the desired form * @throws Zend_Ldap_Exception */ @@ -596,7 +600,7 @@ class Zend_Ldap } /** - * @param array $attrs An array of names of desired attributes + * @param array $attrs An array of names of desired attributes * @return array An array of the attributes representing the account * @throws Zend_Ldap_Exception */ @@ -624,28 +628,28 @@ class Zend_Ldap $this->bind(); } - $accounts = $this->search($accountFilter, $baseDn, self::SEARCH_SCOPE_SUB, $attrs); - $count = $accounts->count(); - if ($count === 1) { - $acct = $accounts->getFirst(); - $accounts->close(); - return $acct; - } else if ($count === 0) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; + $accounts = $this->search($accountFilter, $baseDn, self::SEARCH_SCOPE_SUB, $attrs); + $count = $accounts->count(); + if ($count === 1) { + $acct = $accounts->getFirst(); + $accounts->close(); + return $acct; + } else if ($count === 0) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; $code = Zend_Ldap_Exception::LDAP_NO_SUCH_OBJECT; - $str = "No object found for: $accountFilter"; - } else { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; + $str = "No object found for: $accountFilter"; + } else { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; $code = Zend_Ldap_Exception::LDAP_OPERATIONS_ERROR; - $str = "Unexpected result count ($count) for: $accountFilter"; - } - $accounts->close(); + $str = "Unexpected result count ($count) for: $accountFilter"; + } + $accounts->close(); /** * @see Zend_Ldap_Exception */ @@ -674,10 +678,10 @@ class Zend_Ldap } /** - * @param string $host The hostname of the LDAP server to connect to - * @param int $port The port number of the LDAP server to connect to - * @param boolean $useSsl Use SSL - * @param boolean $useStartTls Use STARTTLS + * @param string $host The hostname of the LDAP server to connect to + * @param int $port The port number of the LDAP server to connect to + * @param boolean $useSsl Use SSL + * @param boolean $useStartTls Use STARTTLS * @return Zend_Ldap Provides a fluent interface * @throws Zend_Ldap_Exception */ @@ -770,8 +774,8 @@ class Zend_Ldap } /** - * @param string $username The username for authenticating the bind - * @param string $password The password for authenticating the bind + * @param string $username The username for authenticating the bind + * @param string $password The password for authenticating the bind * @return Zend_Ldap Provides a fluent interface * @throws Zend_Ldap_Exception */ @@ -864,62 +868,62 @@ class Zend_Ldap $this->disconnect(); throw $zle; } - - /** - * A global LDAP search routine for finding information. - * - * @param string|Zend_Ldap_Filter_Abstract $filter - * @param string|Zend_Ldap_Dn $basedn - * @param integer $scope - * @param array $attributes - * @param string $sort - * @param string $collectionClass - * @return Zend_Ldap_Collection - * @throws Zend_Ldap_Exception - */ - public function search($filter, $basedn = null, $scope = self::SEARCH_SCOPE_SUB, - array $attributes = array(), $sort = null, $collectionClass = null) - { - if ($basedn === null) { - $basedn = $this->getBaseDn(); - } - else if ($basedn instanceof Zend_Ldap_Dn) { - $basedn = $basedn->toString(); - } - - if ($filter instanceof Zend_Ldap_Filter_Abstract) { - $filter = $filter->toString(); - } - - switch ($scope) { - case self::SEARCH_SCOPE_ONE: - $search = @ldap_list($this->getResource(), $basedn, $filter, $attributes); - break; - case self::SEARCH_SCOPE_BASE: - $search = @ldap_read($this->getResource(), $basedn, $filter, $attributes); - break; - case self::SEARCH_SCOPE_SUB: - default: - $search = @ldap_search($this->getResource(), $basedn, $filter, $attributes); - break; - } - - if($search === false) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception($this, 'searching: ' . $filter); - } - if (!is_null($sort) && is_string($sort)) { - $isSorted = @ldap_sort($this->getResource(), $search, $sort); - if($search === false) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception($this, 'sorting: ' . $sort); - } + + /** + * A global LDAP search routine for finding information. + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param string|Zend_Ldap_Dn|null $basedn + * @param integer $scope + * @param array $attributes + * @param string|null $sort + * @param string|null $collectionClass + * @return Zend_Ldap_Collection + * @throws Zend_Ldap_Exception + */ + public function search($filter, $basedn = null, $scope = self::SEARCH_SCOPE_SUB, + array $attributes = array(), $sort = null, $collectionClass = null) + { + if ($basedn === null) { + $basedn = $this->getBaseDn(); + } + else if ($basedn instanceof Zend_Ldap_Dn) { + $basedn = $basedn->toString(); + } + + if ($filter instanceof Zend_Ldap_Filter_Abstract) { + $filter = $filter->toString(); + } + + switch ($scope) { + case self::SEARCH_SCOPE_ONE: + $search = @ldap_list($this->getResource(), $basedn, $filter, $attributes); + break; + case self::SEARCH_SCOPE_BASE: + $search = @ldap_read($this->getResource(), $basedn, $filter, $attributes); + break; + case self::SEARCH_SCOPE_SUB: + default: + $search = @ldap_search($this->getResource(), $basedn, $filter, $attributes); + break; + } + + if($search === false) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception($this, 'searching: ' . $filter); + } + if (!is_null($sort) && is_string($sort)) { + $isSorted = @ldap_sort($this->getResource(), $search, $sort); + if($search === false) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception($this, 'sorting: ' . $sort); + } } /** @@ -934,153 +938,181 @@ class Zend_Ldap require_once 'Zend/Ldap/Collection.php'; return new Zend_Ldap_Collection($iterator); } else { - /** - * @todo implement checks - */ + $collectionClass = (string)$collectionClass; + if (!class_exists($collectionClass)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, + "Class '$collectionClass' can not be found"); + } + if (!is_subclass_of($collectionClass, 'Zend_Ldap_Collection')) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, + "Class '$collectionClass' must subclass 'Zend_Ldap_Collection'"); + } return new $collectionClass($iterator); } - } - - /** - * Count items found by given filter. - * - * @param string|Zend_Ldap_Filter_Abstract $filter - * @param string|Zend_Ldap_Dn $basedn - * @param integer $scope - * @return integer - * @throws Zend_Ldap_Exception - */ - public function count($filter, $basedn = null, $scope = self::SEARCH_SCOPE_SUB) - { - try { - $result = $this->search($filter, $basedn, $scope, array('dn'), null); - } catch (Zend_Ldap_Exception $e) { - if ($e->getCode() === Zend_Ldap_Exception::LDAP_NO_SUCH_OBJECT) return 0; - else throw $e; - } - return $result->count(); - } - - /** - * Count children for a given DN. - * - * @param string|Zend_Ldap_Dn $dn - * @return integer - * @throws Zend_Ldap_Exception - */ - public function countChildren($dn) - { - return $this->count('(objectClass=*)', $dn, self::SEARCH_SCOPE_ONE); - } - - /** - * Check if a given DN exists. - * - * @param string|Zend_Ldap_Dn $dn - * @return boolean - * @throws Zend_Ldap_Exception - */ - public function exists($dn) - { - return ($this->count('(objectClass=*)', $dn, self::SEARCH_SCOPE_BASE) == 1); - } - - /** - * Search LDAP registry for entries matching filter and optional attributes - * - * @param string|Zend_Ldap_Filter_Abstract $filter - * @param string|Zend_Ldap_Dn $basedn - * @param integer $scope - * @param array $attributes - * @param string $sort - * @return array - * @throws Zend_Ldap_Exception - */ - public function searchEntries($filter, $basedn = null, $scope = self::SEARCH_SCOPE_SUB, - array $attributes = array(), $sort = null) - { - $result = $this->search($filter, $basedn, $scope, $attributes, $sort); - return $result->toArray(); - } - - /** - * Get LDAP entry by DN - * - * @param string|Zend_Ldap_Dn $dn - * @param array $attributes - * @param boolean $throwOnNotFound - * @return array - * @throws Zend_Ldap_Exception - */ - public function getEntry($dn, array $attributes = array(), $throwOnNotFound = false) - { - try { - $result = $this->search("(objectClass=*)", $dn, self::SEARCH_SCOPE_BASE, - $attributes, null); - return $result->getFirst(); - } catch (Zend_Ldap_Exception $e){ - if ($throwOnNotFound !== false) throw $e; - } - return null; - } - - /** - * Prepares an ldap data entry array for insert/update operation - * - * @param array $entry - * @return void - * @throws InvalidArgumentException - */ - public static function prepareLdapEntryArray(array &$entry) - { - if (array_key_exists('dn', $entry)) unset($entry['dn']); - foreach ($entry as $key => $value) { - if (is_array($value)) { - foreach ($value as $i => $v) { - if (is_null($v)) unset($value[$i]); - else if (empty($v)) unset($value[$i]); - else if (!is_scalar($v)) { - throw new InvalidArgumentException('Only scalar values allowed in LDAP data'); - } - } - $entry[$key] = array_values($value); - } else { - if (is_null($value)) $entry[$key] = array(); - else if (empty($value)) $entry[$key] = array(); - else $entry[$key] = array($value); - } + } + + /** + * Count items found by given filter. + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param string|Zend_Ldap_Dn|null $basedn + * @param integer $scope + * @return integer + * @throws Zend_Ldap_Exception + */ + public function count($filter, $basedn = null, $scope = self::SEARCH_SCOPE_SUB) + { + try { + $result = $this->search($filter, $basedn, $scope, array('dn'), null); + } catch (Zend_Ldap_Exception $e) { + if ($e->getCode() === Zend_Ldap_Exception::LDAP_NO_SUCH_OBJECT) return 0; + else throw $e; } - $entry = array_change_key_case($entry, CASE_LOWER); - } - - /** - * Add new information to the LDAP repository - * - * @param string|Zend_Ldap_Dn $dn - * @param array $entry - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function add($dn, array $entry) + return $result->count(); + } + + /** + * Count children for a given DN. + * + * @param string|Zend_Ldap_Dn $dn + * @return integer + * @throws Zend_Ldap_Exception + */ + public function countChildren($dn) + { + return $this->count('(objectClass=*)', $dn, self::SEARCH_SCOPE_ONE); + } + + /** + * Check if a given DN exists. + * + * @param string|Zend_Ldap_Dn $dn + * @return boolean + * @throws Zend_Ldap_Exception + */ + public function exists($dn) + { + return ($this->count('(objectClass=*)', $dn, self::SEARCH_SCOPE_BASE) == 1); + } + + /** + * Search LDAP registry for entries matching filter and optional attributes + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param string|Zend_Ldap_Dn|null $basedn + * @param integer $scope + * @param array $attributes + * @param string|null $sort + * @return array + * @throws Zend_Ldap_Exception + */ + public function searchEntries($filter, $basedn = null, $scope = self::SEARCH_SCOPE_SUB, + array $attributes = array(), $sort = null) + { + $result = $this->search($filter, $basedn, $scope, $attributes, $sort); + return $result->toArray(); + } + + /** + * Get LDAP entry by DN + * + * @param string|Zend_Ldap_Dn $dn + * @param array $attributes + * @param boolean $throwOnNotFound + * @return array + * @throws Zend_Ldap_Exception + */ + public function getEntry($dn, array $attributes = array(), $throwOnNotFound = false) + { + try { + $result = $this->search("(objectClass=*)", $dn, self::SEARCH_SCOPE_BASE, + $attributes, null); + return $result->getFirst(); + } catch (Zend_Ldap_Exception $e){ + if ($throwOnNotFound !== false) throw $e; + } + return null; + } + + /** + * Prepares an ldap data entry array for insert/update operation + * + * @param array $entry + * @return void + * @throws InvalidArgumentException + */ + public static function prepareLdapEntryArray(array &$entry) + { + if (array_key_exists('dn', $entry)) unset($entry['dn']); + foreach ($entry as $key => $value) { + if (is_array($value)) { + foreach ($value as $i => $v) { + if (is_null($v)) unset($value[$i]); + else if (!is_scalar($v)) { + throw new InvalidArgumentException('Only scalar values allowed in LDAP data'); + } else { + $v = (string)$v; + if (strlen($v) == 0) { + unset($value[$i]); + } else { + $value[$i] = $v; + } + } + } + $entry[$key] = array_values($value); + } else { + if (is_null($value)) $entry[$key] = array(); + else if (!is_scalar($value)) { + throw new InvalidArgumentException('Only scalar values allowed in LDAP data'); + } else { + $value = (string)$value; + if (strlen($value) == 0) { + $entry[$key] = array(); + } else { + $entry[$key] = array($value); + } + } + } + } + $entry = array_change_key_case($entry, CASE_LOWER); + } + + /** + * Add new information to the LDAP repository + * + * @param string|Zend_Ldap_Dn $dn + * @param array $entry + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function add($dn, array $entry) { if (!($dn instanceof Zend_Ldap_Dn)) { $dn = Zend_Ldap_Dn::factory($dn, null); - } + } self::prepareLdapEntryArray($entry); - foreach ($entry as $key => $value) { - if (is_array($value) && count($value) === 0) { - unset($entry[$key]); - } - } - + foreach ($entry as $key => $value) { + if (is_array($value) && count($value) === 0) { + unset($entry[$key]); + } + } + $rdnParts = $dn->getRdn(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - foreach ($rdnParts as $key => $value) { - $value = Zend_Ldap_Dn::unescapeValue($value); + foreach ($rdnParts as $key => $value) { + $value = Zend_Ldap_Dn::unescapeValue($value); if (!array_key_exists($key, $entry) || !in_array($value, $entry[$key]) || - count($entry[$key]) !== 1) { - $entry[$key] = array($value); - } + count($entry[$key]) !== 1) { + $entry[$key] = array($value); + } } $adAttributes = array('distinguishedname', 'instancetype', 'name', 'objectcategory', 'objectguid', 'usnchanged', 'usncreated', 'whenchanged', 'whencreated'); @@ -1088,32 +1120,32 @@ class Zend_Ldap if (array_key_exists($attr, $entry)) { unset($entry[$attr]); } - } - - $isAdded = @ldap_add($this->getResource(), $dn->toString(), $entry); - if($isAdded === false) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception($this, 'adding: ' . $dn->toString()); - } - return $this; - } - - /** - * Update LDAP registry - * - * @param string|Zend_Ldap_Dn $dn - * @param array $entry - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function update($dn, array $entry) - { - if (!($dn instanceof Zend_Ldap_Dn)) { - $dn = Zend_Ldap_Dn::factory($dn, null); - } + } + + $isAdded = @ldap_add($this->getResource(), $dn->toString(), $entry); + if($isAdded === false) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception($this, 'adding: ' . $dn->toString()); + } + return $this; + } + + /** + * Update LDAP registry + * + * @param string|Zend_Ldap_Dn $dn + * @param array $entry + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function update($dn, array $entry) + { + if (!($dn instanceof Zend_Ldap_Dn)) { + $dn = Zend_Ldap_Dn::factory($dn, null); + } self::prepareLdapEntryArray($entry); $rdnParts = $dn->getRdn(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); @@ -1127,69 +1159,69 @@ class Zend_Ldap } if (count($entry) > 0) { - $isModified = @ldap_modify($this->getResource(), $dn->toString(), $entry); - if($isModified === false) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception($this, 'updating: ' . $dn->toString()); + $isModified = @ldap_modify($this->getResource(), $dn->toString(), $entry); + if($isModified === false) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception($this, 'updating: ' . $dn->toString()); } - } - return $this; - } - - /** - * Save entry to LDAP registry. - * - * Internally decides if entry will be updated to added by calling - * {@link exists()}. - * - * @param string|Zend_Ldap_Dn $dn - * @param array $entry - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function save($dn, array $entry) - { - if ($dn instanceof Zend_Ldap_Dn) { - $dn = $dn->toString(); - } - if ($this->exists($dn)) $this->update($dn, $entry); - else $this->add($dn, $entry); - return $this; - } - - /** - * Delete an LDAP entry - * - * @param string|Zend_Ldap_Dn $dn - * @param boolean $recursively - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function delete($dn, $recursively = false) - { - if ($dn instanceof Zend_Ldap_Dn) { - $dn = $dn->toString(); - } - if ($recursively === true) { - if ($this->countChildren($dn)>0) { - $children = $this->_getChildrenDns($dn); - foreach ($children as $c) { - $this->delete($c, true); - } - } - } - $isDeleted = @ldap_delete($this->getResource(), $dn); - if($isDeleted === false) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception($this, 'deleting: ' . $dn); - } - return $this; + } + return $this; + } + + /** + * Save entry to LDAP registry. + * + * Internally decides if entry will be updated to added by calling + * {@link exists()}. + * + * @param string|Zend_Ldap_Dn $dn + * @param array $entry + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function save($dn, array $entry) + { + if ($dn instanceof Zend_Ldap_Dn) { + $dn = $dn->toString(); + } + if ($this->exists($dn)) $this->update($dn, $entry); + else $this->add($dn, $entry); + return $this; + } + + /** + * Delete an LDAP entry + * + * @param string|Zend_Ldap_Dn $dn + * @param boolean $recursively + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function delete($dn, $recursively = false) + { + if ($dn instanceof Zend_Ldap_Dn) { + $dn = $dn->toString(); + } + if ($recursively === true) { + if ($this->countChildren($dn)>0) { + $children = $this->_getChildrenDns($dn); + foreach ($children as $c) { + $this->delete($c, true); + } + } + } + $isDeleted = @ldap_delete($this->getResource(), $dn); + if($isDeleted === false) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception($this, 'deleting: ' . $dn); + } + return $this; } /** @@ -1198,7 +1230,7 @@ class Zend_Ldap * This method is used in recursive methods like {@see delete()} * or {@see copy()} * - * @param string| $parentDn + * @param string|Zend_Ldap_Dn $parentDn * @return array of DNs */ protected function _getChildrenDns($parentDn) @@ -1223,187 +1255,187 @@ class Zend_Ldap } @ldap_free_result($search); return $children; - } - - /** - * Moves a LDAP entry from one DN to another subtree. - * - * @param string|Zend_Ldap_Dn $from - * @param string|Zend_Ldap_Dn $to - * @param boolean $recursively - * @param boolean $alwaysEmulate - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function moveToSubtree($from, $to, $recursively = false, $alwaysEmulate = false) - { - if ($from instanceof Zend_Ldap_Dn) { - $orgDnParts = $from->toArray(); - } else { - $orgDnParts = Zend_Ldap_Dn::explodeDn($from); - } - - if ($to instanceof Zend_Ldap_Dn) { - $newParentDnParts = $to->toArray(); - } else { - $newParentDnParts = Zend_Ldap_Dn::explodeDn($to); - } - - $newDnParts = array_merge(array(array_shift($orgDnParts)), $newParentDnParts); - $newDn = Zend_Ldap_Dn::fromArray($newDnParts); - return $this->rename($from, $newDn, $recursively, $alwaysEmulate); - } - - /** - * Moves a LDAP entry from one DN to another DN. - * - * This is an alias for {@link rename()} - * - * @param string|Zend_Ldap_Dn $from - * @param string|Zend_Ldap_Dn $to - * @param boolean $recursively - * @param boolean $alwaysEmulate - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function move($from, $to, $recursively = false, $alwaysEmulate = false) - { - return $this->rename($from, $to, $recursively, $alwaysEmulate); - } - - /** - * Renames a LDAP entry from one DN to another DN. - * - * This method implicitely moves the entry to another location within the tree. - * - * @param string|Zend_Ldap_Dn $from - * @param string|Zend_Ldap_Dn $to - * @param boolean $recursively - * @param boolean $alwaysEmulate - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function rename($from, $to, $recursively = false, $alwaysEmulate = false) - { - $emulate = (bool)$alwaysEmulate; - if (!function_exists('ldap_rename')) $emulate = true; - else if ($recursively) $emulate = true; - - if ($emulate === false) { - if ($from instanceof Zend_Ldap_Dn) { - $from = $from->toString(); - } - - if ($to instanceof Zend_Ldap_Dn) { - $newDnParts = $to->toArray(); - } else { - $newDnParts = Zend_Ldap_Dn::explodeDn($to); - } - - $newRdn = Zend_Ldap_Dn::implodeRdn(array_shift($newDnParts)); - $newParent = Zend_Ldap_Dn::implodeDn($newDnParts); - $isOK = @ldap_rename($this->getResource(), $from, $newRdn, $newParent, true); - if($isOK === false) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception($this, 'renaming ' . $from . ' to ' . $to); - } - else if (!$this->exists($to)) $emulate = true; - } - if ($emulate) { - $this->copy($from, $to, $recursively); - $this->delete($from, $recursively); - } - return $this; - } - - /** - * Copies a LDAP entry from one DN to another subtree. - * - * @param string|Zend_Ldap_Dn $from - * @param string|Zend_Ldap_Dn $to - * @param boolean $recursively - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function copyToSubtree($from, $to, $recursively = false) - { - if ($from instanceof Zend_Ldap_Dn) { - $orgDnParts = $from->toArray(); - } else { - $orgDnParts = Zend_Ldap_Dn::explodeDn($from); - } - - if ($to instanceof Zend_Ldap_Dn) { - $newParentDnParts = $to->toArray(); - } else { - $newParentDnParts = Zend_Ldap_Dn::explodeDn($to); - } - - $newDnParts = array_merge(array(array_shift($orgDnParts)), $newParentDnParts); - $newDn = Zend_Ldap_Dn::fromArray($newDnParts); - return $this->copy($from, $newDn, $recursively); - } - - /** - * Copies a LDAP entry from one DN to another DN. - * - * @param string|Zend_Ldap_Dn $from - * @param string|Zend_Ldap_Dn $to - * @param boolean $recursively - * @return Zend_Ldap *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function copy($from, $to, $recursively = false) - { - $entry = $this->getEntry($from, array(), true); - - if ($to instanceof Zend_Ldap_Dn) { - $toDnParts = $to->toArray(); - } else { - $toDnParts = Zend_Ldap_Dn::explodeDn($to); - } - $this->add($to, $entry); - - if ($recursively === true && $this->countChildren($from)>0) { - $children = $this->_getChildrenDns($from); - foreach ($children as $c) { - $cDnParts = Zend_Ldap_Dn::explodeDn($c); - $newChildParts = array_merge(array(array_shift($cDnParts)), $toDnParts); - $newChild = Zend_Ldap_Dn::implodeDn($newChildParts); - $this->copy($c, $newChild, true); - } - } - return $this; - } - - /** - * Returns the specified DN as a Zend_Ldap_Node - * - * @param string|Zend_Ldap_Dn $dn - * @return Zend_Ldap_Node - * @throws Zend_Ldap_Exception - */ - public function getNode($dn) - { - /** - * Zend_Ldap_Node - */ - require_once 'Zend/Ldap/Node.php'; - return Zend_Ldap_Node::fromLdap($dn, $this); - } - - /** - * Returns the base node as a Zend_Ldap_Node - * - * @return Zend_Ldap_Node - * @throws Zend_Ldap_Exception - */ - public function getBaseNode() - { - return $this->getNode($this->getBaseDn(), $this); + } + + /** + * Moves a LDAP entry from one DN to another subtree. + * + * @param string|Zend_Ldap_Dn $from + * @param string|Zend_Ldap_Dn $to + * @param boolean $recursively + * @param boolean $alwaysEmulate + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function moveToSubtree($from, $to, $recursively = false, $alwaysEmulate = false) + { + if ($from instanceof Zend_Ldap_Dn) { + $orgDnParts = $from->toArray(); + } else { + $orgDnParts = Zend_Ldap_Dn::explodeDn($from); + } + + if ($to instanceof Zend_Ldap_Dn) { + $newParentDnParts = $to->toArray(); + } else { + $newParentDnParts = Zend_Ldap_Dn::explodeDn($to); + } + + $newDnParts = array_merge(array(array_shift($orgDnParts)), $newParentDnParts); + $newDn = Zend_Ldap_Dn::fromArray($newDnParts); + return $this->rename($from, $newDn, $recursively, $alwaysEmulate); + } + + /** + * Moves a LDAP entry from one DN to another DN. + * + * This is an alias for {@link rename()} + * + * @param string|Zend_Ldap_Dn $from + * @param string|Zend_Ldap_Dn $to + * @param boolean $recursively + * @param boolean $alwaysEmulate + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function move($from, $to, $recursively = false, $alwaysEmulate = false) + { + return $this->rename($from, $to, $recursively, $alwaysEmulate); + } + + /** + * Renames a LDAP entry from one DN to another DN. + * + * This method implicitely moves the entry to another location within the tree. + * + * @param string|Zend_Ldap_Dn $from + * @param string|Zend_Ldap_Dn $to + * @param boolean $recursively + * @param boolean $alwaysEmulate + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function rename($from, $to, $recursively = false, $alwaysEmulate = false) + { + $emulate = (bool)$alwaysEmulate; + if (!function_exists('ldap_rename')) $emulate = true; + else if ($recursively) $emulate = true; + + if ($emulate === false) { + if ($from instanceof Zend_Ldap_Dn) { + $from = $from->toString(); + } + + if ($to instanceof Zend_Ldap_Dn) { + $newDnParts = $to->toArray(); + } else { + $newDnParts = Zend_Ldap_Dn::explodeDn($to); + } + + $newRdn = Zend_Ldap_Dn::implodeRdn(array_shift($newDnParts)); + $newParent = Zend_Ldap_Dn::implodeDn($newDnParts); + $isOK = @ldap_rename($this->getResource(), $from, $newRdn, $newParent, true); + if($isOK === false) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception($this, 'renaming ' . $from . ' to ' . $to); + } + else if (!$this->exists($to)) $emulate = true; + } + if ($emulate) { + $this->copy($from, $to, $recursively); + $this->delete($from, $recursively); + } + return $this; + } + + /** + * Copies a LDAP entry from one DN to another subtree. + * + * @param string|Zend_Ldap_Dn $from + * @param string|Zend_Ldap_Dn $to + * @param boolean $recursively + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function copyToSubtree($from, $to, $recursively = false) + { + if ($from instanceof Zend_Ldap_Dn) { + $orgDnParts = $from->toArray(); + } else { + $orgDnParts = Zend_Ldap_Dn::explodeDn($from); + } + + if ($to instanceof Zend_Ldap_Dn) { + $newParentDnParts = $to->toArray(); + } else { + $newParentDnParts = Zend_Ldap_Dn::explodeDn($to); + } + + $newDnParts = array_merge(array(array_shift($orgDnParts)), $newParentDnParts); + $newDn = Zend_Ldap_Dn::fromArray($newDnParts); + return $this->copy($from, $newDn, $recursively); + } + + /** + * Copies a LDAP entry from one DN to another DN. + * + * @param string|Zend_Ldap_Dn $from + * @param string|Zend_Ldap_Dn $to + * @param boolean $recursively + * @return Zend_Ldap Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function copy($from, $to, $recursively = false) + { + $entry = $this->getEntry($from, array(), true); + + if ($to instanceof Zend_Ldap_Dn) { + $toDnParts = $to->toArray(); + } else { + $toDnParts = Zend_Ldap_Dn::explodeDn($to); + } + $this->add($to, $entry); + + if ($recursively === true && $this->countChildren($from)>0) { + $children = $this->_getChildrenDns($from); + foreach ($children as $c) { + $cDnParts = Zend_Ldap_Dn::explodeDn($c); + $newChildParts = array_merge(array(array_shift($cDnParts)), $toDnParts); + $newChild = Zend_Ldap_Dn::implodeDn($newChildParts); + $this->copy($c, $newChild, true); + } + } + return $this; + } + + /** + * Returns the specified DN as a Zend_Ldap_Node + * + * @param string|Zend_Ldap_Dn $dn + * @return Zend_Ldap_Node|null + * @throws Zend_Ldap_Exception + */ + public function getNode($dn) + { + /** + * Zend_Ldap_Node + */ + require_once 'Zend/Ldap/Node.php'; + return Zend_Ldap_Node::fromLdap($dn, $this); + } + + /** + * Returns the base node as a Zend_Ldap_Node + * + * @return Zend_Ldap_Node + * @throws Zend_Ldap_Exception + */ + public function getBaseNode() + { + return $this->getNode($this->getBaseDn(), $this); } /** diff --git a/libs/Zend/Ldap/Attribute.php b/libs/Zend/Ldap/Attribute.php index 7af70d9..e43bbfd 100644 --- a/libs/Zend/Ldap/Attribute.php +++ b/libs/Zend/Ldap/Attribute.php @@ -1,111 +1,114 @@ -= 0 && $index= 0 && $index_iterator = $iterator; - } - - public function __destruct() - { - $this->close(); - } - - /** - * Closes the current result set - * - * @return boolean - */ - public function close() - { - return $this->_iterator->close(); - } - - /** - * Get all entries as an array - * - * @return array - */ - public function toArray() - { - $data = array(); - foreach ($this as $item) { - $data[] = $item; - } - return $data; - } - - /** - * Get first entry - * - * @return array - */ - public function getFirst() - { - if ($this->count()>0) { - $this->rewind(); - return $this->current(); - } - else return null; - } - - /** - * Returns the number of items in current result - * Implements Countable - * - * @return int - */ - public function count() - { - return $this->_iterator->count(); - } - - /** - * Return the current result item - * Implements Iterator - * - * @return array - * @throws Zend_Ldap_Exception - */ - public function current() - { - if (!array_key_exists($this->_currentNumber, $this->_cache)) - { + */ + public function __construct(Zend_Ldap_Collection_Iterator_Interface $iterator) + { + $this->_iterator = $iterator; + } + + public function __destruct() + { + $this->close(); + } + + /** + * Closes the current result set + * + * @return boolean + */ + public function close() + { + return $this->_iterator->close(); + } + + /** + * Get all entries as an array + * + * @return array + */ + public function toArray() + { + $data = array(); + foreach ($this as $item) { + $data[] = $item; + } + return $data; + } + + /** + * Get first entry + * + * @return array + */ + public function getFirst() + { + if ($this->count()>0) { + $this->rewind(); + return $this->current(); + } + else return null; + } + + /** + * Returns the number of items in current result + * Implements Countable + * + * @return int + */ + public function count() + { + return $this->_iterator->count(); + } + + /** + * Return the current result item + * Implements Iterator + * + * @return array + * @throws Zend_Ldap_Exception + */ + public function current() + { + if (!array_key_exists($this->_currentNumber, $this->_cache)) + { $this->_cache[$this->_currentNumber] = - $this->_createEntry($this->_iterator->current()); - } - return $this->_cache[$this->_currentNumber]; + $this->_createEntry($this->_iterator->current()); + } + return $this->_cache[$this->_currentNumber]; } /** * Creates the data structure for the given entry data * - * @param array $data + * @param array $data * @return array */ protected function _createEntry(array $data) { return $data; - } - - /** - * Return the result item key - * Implements Iterator - * - * @return int - */ - public function key() - { - return $this->_currentNumber; - } - - /** - * Move forward to next result item - * Implements Iterator - * - * @throws Zend_Ldap_Exception - */ - public function next() - { - $this->_iterator->next(); - $this->_currentNumber++; - } - - /** - * Rewind the Iterator to the first result item - * Implements Iterator - * - * @throws Zend_Ldap_Exception - */ - public function rewind() - { - $this->_iterator->rewind(); - $this->_currentNumber = 0; - } - - /** - * Check if there is a current result item - * after calls to rewind() or next() - * Implements Iterator - * - * @return boolean - */ - public function valid() + } + + /** + * Return the result item key + * Implements Iterator + * + * @return int + */ + public function key() + { + return $this->_currentNumber; + } + + /** + * Move forward to next result item + * Implements Iterator + * + * @throws Zend_Ldap_Exception + */ + public function next() + { + $this->_iterator->next(); + $this->_currentNumber++; + } + + /** + * Rewind the Iterator to the first result item + * Implements Iterator + * + * @throws Zend_Ldap_Exception + */ + public function rewind() + { + $this->_iterator->rewind(); + $this->_currentNumber = 0; + } + + /** + * Check if there is a current result item + * after calls to rewind() or next() + * Implements Iterator + * + * @return boolean + */ + public function valid() { if (isset($this->_cache[$this->_currentNumber])) { return true; - } else { + } else { return $this->_iterator->valid(); - } - } + } + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Collection/Iterator/Default.php b/libs/Zend/Ldap/Collection/Iterator/Default.php index 96a945c..e65cc28 100644 --- a/libs/Zend/Ldap/Collection/Iterator/Default.php +++ b/libs/Zend/Ldap/Collection/Iterator/Default.php @@ -1,40 +1,40 @@ -_current) && is_string($this->_currentDn)); } - + } \ No newline at end of file diff --git a/libs/Zend/Ldap/Collection/Iterator/Interface.php b/libs/Zend/Ldap/Collection/Iterator/Interface.php index bc42b0a..0b5bc24 100644 --- a/libs/Zend/Ldap/Collection/Iterator/Interface.php +++ b/libs/Zend/Ldap/Collection/Iterator/Interface.php @@ -1,34 +1,34 @@ - - * @link http://pear.php.net/package/Net_LDAP2 - * @author Benedikt Hallinger - * - * @param string $string String to convert - * @return string - */ - public static function ascToHex32($string) - { - for ($i = 0; $i, - * heavily based on work from DavidSmith@byu.net - * @link http://pear.php.net/package/Net_LDAP2 - * @author Benedikt Hallinger , heavily based on work from DavidSmith@byu.net - * - * @param string $string String to convert - * @return string - */ - public static function hex32ToAsc($string) - { - $string = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $string); - return $string; - } +/** + * Zend_Ldap_Converter is a collection of useful LDAP related conversion functions. + * + * @category Zend + * @package Zend_Ldap + * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Ldap_Converter +{ + /** + * Converts all ASCII chars < 32 to "\HEX" + * + * @see Net_LDAP2_Util::asc2hex32() from Benedikt Hallinger + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string $string String to convert + * @return string + */ + public static function ascToHex32($string) + { + for ($i = 0; $i, + * heavily based on work from DavidSmith@byu.net + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger , heavily based on work from DavidSmith@byu.net + * + * @param string $string String to convert + * @return string + */ + public static function hex32ToAsc($string) + { + $string = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $string); + return $string; + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Dn.php b/libs/Zend/Ldap/Dn.php index ba19d68..1be482c 100644 --- a/libs/Zend/Ldap/Dn.php +++ b/libs/Zend/Ldap/Dn.php @@ -1,310 +1,310 @@ -_dn = $dn; - $this->setCaseFold($caseFold); - } - - /** - * Gets the RDN of the current DN + $this->setCaseFold($caseFold); + } + + /** + * Gets the RDN of the current DN * - * @param string $caseFold - * @return array - * @throws Zend_Ldap_Exception if DN has no RDN (empty array) - */ - public function getRdn($caseFold = null) + * @param string $caseFold + * @return array + * @throws Zend_Ldap_Exception if DN has no RDN (empty array) + */ + public function getRdn($caseFold = null) { - $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); - return self::_caseFoldRdn($this->get(0, 1, $caseFold), null); - } - - /** - * Gets the RDN of the current DN as a string + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + return self::_caseFoldRdn($this->get(0, 1, $caseFold), null); + } + + /** + * Gets the RDN of the current DN as a string * - * @param string $caseFold - * @return string - * @throws Zend_Ldap_Exception if DN has no RDN (empty array) - */ - public function getRdnString($caseFold = null) + * @param string $caseFold + * @return string + * @throws Zend_Ldap_Exception if DN has no RDN (empty array) + */ + public function getRdnString($caseFold = null) { - $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); - return self::implodeRdn($this->getRdn(), $caseFold); - } - - /** - * Get the parent DN $levelUp levels up the tree - * - * @param int $levelUp - * @return Zend_Ldap_Dn - */ - public function getParentDn($levelUp = 1) - { - $levelUp = (int)$levelUp; - if ($levelUp < 1 || $levelUp >= count($this->_dn)) { - /** - * Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception(null, 'Cannot retrieve parent DN with given $levelUp'); - } - $newDn = array_slice($this->_dn, $levelUp); - return new self($newDn, $this->_caseFold); - } - - /** - * Get a DN part - * - * @param int $index - * @param int $length - * @param string $caseFold - * @return array - * @throws Zend_Ldap_Exception if index is illegal - */ - public function get($index, $length = 1, $caseFold = null) + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + return self::implodeRdn($this->getRdn(), $caseFold); + } + + /** + * Get the parent DN $levelUp levels up the tree + * + * @param int $levelUp + * @return Zend_Ldap_Dn + */ + public function getParentDn($levelUp = 1) { - $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); - $this->_assertIndex($index); - $length = (int)$length; - if ($length <= 0) { - $length = 1; - } - if ($length === 1) { - return self::_caseFoldRdn($this->_dn[$index], $caseFold); - } - else { - return self::_caseFoldDn(array_slice($this->_dn, $index, $length, false), $caseFold); - } - } - - /** - * Set a DN part - * - * @param int $index - * @param array $value - * @return Zend_Ldap_Dn Provides a fluent interface - * @throws Zend_Ldap_Exception if index is illegal - */ - public function set($index, array $value) - { - $this->_assertIndex($index); - self::_assertRdn($value); - $this->_dn[$index] = $value; - return $this; - } - - /** - * Remove a DN part - * - * @param int $index - * @param int $length - * @return Zend_Ldap_Dn Provides a fluent interface - * @throws Zend_Ldap_Exception if index is illegal - */ - public function remove($index, $length = 1) - { - $this->_assertIndex($index); - $length = (int)$length; - if ($length <= 0) { - $length = 1; - } - array_splice($this->_dn, $index, $length, null); - return $this; - } - - /** - * Append a DN part - * - * @param array $value - * @return Zend_Ldap_Dn Provides a fluent interface - */ - public function append(array $value) - { - self::_assertRdn($value); - $this->_dn[] = $value; - return $this; - } - - /** - * Prepend a DN part - * - * @param array $value - * @return Zend_Ldap_Dn Provides a fluent interface - */ - public function prepend(array $value) - { - self::_assertRdn($value); - array_unshift($this->_dn, $value); - return $this; - } - - /** - * Insert a DN part - * - * @param int index - * @param array $value - * @return Zend_Ldap_Dn Provides a fluent interface - * @throws Zend_Ldap_Exception if index is illegal - */ - public function insert($index, array $value) - { - $this->_assertIndex($index); - self::_assertRdn($value); - $first = array_slice($this->_dn, 0, $index + 1); - $second = array_slice($this->_dn, $index + 1); - $this->_dn = array_merge($first, array($value), $second); - return $this; - } - - /** - * Assert index is correct and usable - * - * @param mixed $index - * @return boolean - * @throws Zend_Ldap_Exception - */ - protected function _assertIndex($index) - { - if (!is_int($index)) { - /** - * Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception(null, 'Parameter $index must be an integer'); - } - if ($index < 0 || $index >= count($this->_dn)) { - /** - * Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception(null, 'Parameter $index out of bounds'); - } - return true; - } - - /** - * Assert if value is in a correct RDN format - * - * @param array $value - * @return boolean - * @throws Zend_Ldap_Exception - */ - protected static function _assertRdn(array $value) + $levelUp = (int)$levelUp; + if ($levelUp < 1 || $levelUp >= count($this->_dn)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Cannot retrieve parent DN with given $levelUp'); + } + $newDn = array_slice($this->_dn, $levelUp); + return new self($newDn, $this->_caseFold); + } + + /** + * Get a DN part + * + * @param int $index + * @param int $length + * @param string $caseFold + * @return array + * @throws Zend_Ldap_Exception if index is illegal + */ + public function get($index, $length = 1, $caseFold = null) + { + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + $this->_assertIndex($index); + $length = (int)$length; + if ($length <= 0) { + $length = 1; + } + if ($length === 1) { + return self::_caseFoldRdn($this->_dn[$index], $caseFold); + } + else { + return self::_caseFoldDn(array_slice($this->_dn, $index, $length, false), $caseFold); + } + } + + /** + * Set a DN part + * + * @param int $index + * @param array $value + * @return Zend_Ldap_Dn Provides a fluent interface + * @throws Zend_Ldap_Exception if index is illegal + */ + public function set($index, array $value) + { + $this->_assertIndex($index); + self::_assertRdn($value); + $this->_dn[$index] = $value; + return $this; + } + + /** + * Remove a DN part + * + * @param int $index + * @param int $length + * @return Zend_Ldap_Dn Provides a fluent interface + * @throws Zend_Ldap_Exception if index is illegal + */ + public function remove($index, $length = 1) + { + $this->_assertIndex($index); + $length = (int)$length; + if ($length <= 0) { + $length = 1; + } + array_splice($this->_dn, $index, $length, null); + return $this; + } + + /** + * Append a DN part + * + * @param array $value + * @return Zend_Ldap_Dn Provides a fluent interface + */ + public function append(array $value) + { + self::_assertRdn($value); + $this->_dn[] = $value; + return $this; + } + + /** + * Prepend a DN part + * + * @param array $value + * @return Zend_Ldap_Dn Provides a fluent interface + */ + public function prepend(array $value) + { + self::_assertRdn($value); + array_unshift($this->_dn, $value); + return $this; + } + + /** + * Insert a DN part + * + * @param int $index + * @param array $value + * @return Zend_Ldap_Dn Provides a fluent interface + * @throws Zend_Ldap_Exception if index is illegal + */ + public function insert($index, array $value) + { + $this->_assertIndex($index); + self::_assertRdn($value); + $first = array_slice($this->_dn, 0, $index + 1); + $second = array_slice($this->_dn, $index + 1); + $this->_dn = array_merge($first, array($value), $second); + return $this; + } + + /** + * Assert index is correct and usable + * + * @param mixed $index + * @return boolean + * @throws Zend_Ldap_Exception + */ + protected function _assertIndex($index) + { + if (!is_int($index)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Parameter $index must be an integer'); + } + if ($index < 0 || $index >= count($this->_dn)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Parameter $index out of bounds'); + } + return true; + } + + /** + * Assert if value is in a correct RDN format + * + * @param array $value + * @return boolean + * @throws Zend_Ldap_Exception + */ + protected static function _assertRdn(array $value) { if (count($value)<1) { /** @@ -313,7 +313,7 @@ class Zend_Ldap_Dn implements ArrayAccess require_once 'Zend/Ldap/Exception.php'; throw new Zend_Ldap_Exception(null, 'RDN Array is malformed: it must have at least one item'); } - + foreach (array_keys($value) as $key) { if (!is_string($key)) { /** @@ -323,57 +323,57 @@ class Zend_Ldap_Dn implements ArrayAccess throw new Zend_Ldap_Exception(null, 'RDN Array is malformed: it must use string keys'); } } - } - - /** - * Sets the case fold - * - * @param string|null $caseFold - */ - public function setCaseFold($caseFold) - { - $this->_caseFold = self::_sanitizeCaseFold($caseFold, self::$_defaultCaseFold); - } - - /** - * Return DN as a string - * - * @param string $caseFold - * @return string - * @throws Zend_Ldap_Exception - */ - public function toString($caseFold = null) - { - $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); - return self::implodeDn($this->_dn, $caseFold); - } - - /** - * Return DN as an array - * - * @param string $caseFold - * @return array - */ - public function toArray($caseFold = null) - { - $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); - - if ($caseFold === self::ATTR_CASEFOLD_NONE) { - return $this->_dn; - } else { - return self::_caseFoldDn($this->_dn, $caseFold); - } - } - - /** - * Do a case folding on a RDN - * - * @param array $part - * @param string $caseFold - * @return array - */ - protected static function _caseFoldRdn(array $part, $caseFold) - { + } + + /** + * Sets the case fold + * + * @param string|null $caseFold + */ + public function setCaseFold($caseFold) + { + $this->_caseFold = self::_sanitizeCaseFold($caseFold, self::$_defaultCaseFold); + } + + /** + * Return DN as a string + * + * @param string $caseFold + * @return string + * @throws Zend_Ldap_Exception + */ + public function toString($caseFold = null) + { + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + return self::implodeDn($this->_dn, $caseFold); + } + + /** + * Return DN as an array + * + * @param string $caseFold + * @return array + */ + public function toArray($caseFold = null) + { + $caseFold = self::_sanitizeCaseFold($caseFold, $this->_caseFold); + + if ($caseFold === self::ATTR_CASEFOLD_NONE) { + return $this->_dn; + } else { + return self::_caseFoldDn($this->_dn, $caseFold); + } + } + + /** + * Do a case folding on a RDN + * + * @param array $part + * @param string $caseFold + * @return array + */ + protected static function _caseFoldRdn(array $part, $caseFold) + { switch ($caseFold) { case self::ATTR_CASEFOLD_UPPER: return array_change_key_case($part, CASE_UPPER); @@ -382,14 +382,14 @@ class Zend_Ldap_Dn implements ArrayAccess case self::ATTR_CASEFOLD_NONE: default: return $part; - } + } } /** * Do a case folding on a DN ort part of it * - * @param array $dn - * @param string $caseFold + * @param array $dn + * @param string $caseFold * @return array */ protected static function _caseFoldDn(array $dn, $caseFold) @@ -399,324 +399,324 @@ class Zend_Ldap_Dn implements ArrayAccess $return[] = self::_caseFoldRdn($part, $caseFold); } return $return; - } - - /** - * Cast to string representation {@see toString()} - * - * @return string - */ - public function __toString() - { - return $this->toString(); - } - - /** - * Required by the ArrayAccess implementation - * - * @param int $offset - * @return boolean - */ - public function offsetExists($offset) - { - $offset = (int)$offset; - if ($offset < 0 || $offset >= count($this->_dn)) { - return false; - } else { - return true; - } - } - - /** - * Proxy to {@see get()} - * Required by the ArrayAccess implementation - * - * @param int $offset - * @return array - */ - public function offsetGet($offset) - { - return $this->get($offset, 1, null); - } - - /** - * Proxy to {@see set()} - * Required by the ArrayAccess implementation - * - * @param int $offset - * @param array $value - */ - public function offsetSet($offset, $value) - { - $this->set($offset, $value); - } - - /** - * Proxy to {@see remove()} - * Required by the ArrayAccess implementation - * - * @param int $offset - */ - public function offsetUnset($offset) - { - $this->remove($offset, 1); - } - - /** - * Sets the default case fold - * - * @param string $caseFold - */ - public static function setDefaultCaseFold($caseFold) - { - self::$_defaultCaseFold = self::_sanitizeCaseFold($caseFold, self::ATTR_CASEFOLD_NONE); - } - - /** - * Sanitizes the case fold - * - * @param string $caseFold - * @return string - */ - protected static function _sanitizeCaseFold($caseFold, $default) - { - switch ($caseFold) { - case self::ATTR_CASEFOLD_NONE: - case self::ATTR_CASEFOLD_UPPER: - case self::ATTR_CASEFOLD_LOWER: - return $caseFold; - break; - default: - return $default; - break; - } - } - - /** - * Escapes a DN value according to RFC 2253 - * - * Escapes the given VALUES according to RFC 2253 so that they can be safely used in LDAP DNs. - * The characters ",", "+", """, "\", "<", ">", ";", "#", " = " with a special meaning in RFC 2252 - * are preceeded by ba backslash. Control characters with an ASCII code < 32 are represented as \hexpair. - * Finally all leading and trailing spaces are converted to sequences of \20. - * @see Net_LDAP2_Util::escape_dn_value() from Benedikt Hallinger - * @link http://pear.php.net/package/Net_LDAP2 - * @author Benedikt Hallinger - * - * @param string|array $values An array containing the DN values that should be escaped - * @return array The array $values, but escaped - */ - public static function escapeValue($values = array()) - { - /** - * @see Zend_Ldap_Converter - */ - require_once 'Zend/Ldap/Converter.php'; - - if (!is_array($values)) $values = array($values); - foreach ($values as $key => $val) { - // Escaping of filter meta characters - $val = str_replace(array('\\', ',', '+', '"', '<', '>', ';', '#', '=', ), - array('\\\\', '\,', '\+', '\"', '\<', '\>', '\;', '\#', '\='), $val); - $val = Zend_Ldap_Converter::ascToHex32($val); - - // Convert all leading and trailing spaces to sequences of \20. - if (preg_match('/^(\s*)(.+?)(\s*)$/', $val, $matches)) { - $val = $matches[2]; - for ($i = 0; $i - * @link http://pear.php.net/package/Net_LDAP2 - * @author Benedikt Hallinger - * - * @param string|array $values Array of DN Values - * @return array Same as $values, but unescaped - */ - public static function unescapeValue($values = array()) - { - /** - * @see Zend_Ldap_Converter - */ - require_once 'Zend/Ldap/Converter.php'; - - if (!is_array($values)) $values = array($values); - foreach ($values as $key => $val) { - // strip slashes from special chars - $val = str_replace(array('\\\\', '\,', '\+', '\"', '\<', '\>', '\;', '\#', '\='), - array('\\', ',', '+', '"', '<', '>', ';', '#', '=', ), $val); - $values[$key] = Zend_Ldap_Converter::hex32ToAsc($val); - } - return (count($values) == 1) ? $values[0] : $values; - } - - /** - * Creates an array containing all parts of the given DN. - * - * Array will be of type - * array( - * array("cn" => "name1", "uid" => "user"), - * array("cn" => "name2"), - * array("dc" => "example"), - * array("dc" => "org") - * ) - * for a DN of cn=name1+uid=user,cn=name2,dc=example,dc=org. - * - * @param string $dn - * @param array $keys An optional array to receive DN keys (e.g. CN, OU, DC, ...) - * @param array $vals An optional array to receive DN values - * @param string $caseFold - * @return array - * @throws Zend_Ldap_Exception - */ - public static function explodeDn($dn, array &$keys = null, array &$vals = null, - $caseFold = self::ATTR_CASEFOLD_NONE) - { - $k = array(); - $v = array(); - if (!self::checkDn($dn, $k, $v, $caseFold)) { - /** - * Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception(null, 'DN is malformed'); - } - $ret = array(); - for ($i = 0; $i < count($k); $i++) { - if (is_array($k[$i]) && is_array($v[$i]) && (count($k[$i]) === count($v[$i]))) { - $multi = array(); + } + + /** + * Cast to string representation {@see toString()} + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Required by the ArrayAccess implementation + * + * @param int $offset + * @return boolean + */ + public function offsetExists($offset) + { + $offset = (int)$offset; + if ($offset < 0 || $offset >= count($this->_dn)) { + return false; + } else { + return true; + } + } + + /** + * Proxy to {@see get()} + * Required by the ArrayAccess implementation + * + * @param int $offset + * @return array + */ + public function offsetGet($offset) + { + return $this->get($offset, 1, null); + } + + /** + * Proxy to {@see set()} + * Required by the ArrayAccess implementation + * + * @param int $offset + * @param array $value + */ + public function offsetSet($offset, $value) + { + $this->set($offset, $value); + } + + /** + * Proxy to {@see remove()} + * Required by the ArrayAccess implementation + * + * @param int $offset + */ + public function offsetUnset($offset) + { + $this->remove($offset, 1); + } + + /** + * Sets the default case fold + * + * @param string $caseFold + */ + public static function setDefaultCaseFold($caseFold) + { + self::$_defaultCaseFold = self::_sanitizeCaseFold($caseFold, self::ATTR_CASEFOLD_NONE); + } + + /** + * Sanitizes the case fold + * + * @param string $caseFold + * @return string + */ + protected static function _sanitizeCaseFold($caseFold, $default) + { + switch ($caseFold) { + case self::ATTR_CASEFOLD_NONE: + case self::ATTR_CASEFOLD_UPPER: + case self::ATTR_CASEFOLD_LOWER: + return $caseFold; + break; + default: + return $default; + break; + } + } + + /** + * Escapes a DN value according to RFC 2253 + * + * Escapes the given VALUES according to RFC 2253 so that they can be safely used in LDAP DNs. + * The characters ",", "+", """, "\", "<", ">", ";", "#", " = " with a special meaning in RFC 2252 + * are preceeded by ba backslash. Control characters with an ASCII code < 32 are represented as \hexpair. + * Finally all leading and trailing spaces are converted to sequences of \20. + * @see Net_LDAP2_Util::escape_dn_value() from Benedikt Hallinger + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string|array $values An array containing the DN values that should be escaped + * @return array The array $values, but escaped + */ + public static function escapeValue($values = array()) + { + /** + * @see Zend_Ldap_Converter + */ + require_once 'Zend/Ldap/Converter.php'; + + if (!is_array($values)) $values = array($values); + foreach ($values as $key => $val) { + // Escaping of filter meta characters + $val = str_replace(array('\\', ',', '+', '"', '<', '>', ';', '#', '=', ), + array('\\\\', '\,', '\+', '\"', '\<', '\>', '\;', '\#', '\='), $val); + $val = Zend_Ldap_Converter::ascToHex32($val); + + // Convert all leading and trailing spaces to sequences of \20. + if (preg_match('/^(\s*)(.+?)(\s*)$/', $val, $matches)) { + $val = $matches[2]; + for ($i = 0; $i + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string|array $values Array of DN Values + * @return array Same as $values, but unescaped + */ + public static function unescapeValue($values = array()) + { + /** + * @see Zend_Ldap_Converter + */ + require_once 'Zend/Ldap/Converter.php'; + + if (!is_array($values)) $values = array($values); + foreach ($values as $key => $val) { + // strip slashes from special chars + $val = str_replace(array('\\\\', '\,', '\+', '\"', '\<', '\>', '\;', '\#', '\='), + array('\\', ',', '+', '"', '<', '>', ';', '#', '=', ), $val); + $values[$key] = Zend_Ldap_Converter::hex32ToAsc($val); + } + return (count($values) == 1) ? $values[0] : $values; + } + + /** + * Creates an array containing all parts of the given DN. + * + * Array will be of type + * array( + * array("cn" => "name1", "uid" => "user"), + * array("cn" => "name2"), + * array("dc" => "example"), + * array("dc" => "org") + * ) + * for a DN of cn=name1+uid=user,cn=name2,dc=example,dc=org. + * + * @param string $dn + * @param array $keys An optional array to receive DN keys (e.g. CN, OU, DC, ...) + * @param array $vals An optional array to receive DN values + * @param string $caseFold + * @return array + * @throws Zend_Ldap_Exception + */ + public static function explodeDn($dn, array &$keys = null, array &$vals = null, + $caseFold = self::ATTR_CASEFOLD_NONE) + { + $k = array(); + $v = array(); + if (!self::checkDn($dn, $k, $v, $caseFold)) { + /** + * Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'DN is malformed'); + } + $ret = array(); + for ($i = 0; $i < count($k); $i++) { + if (is_array($k[$i]) && is_array($v[$i]) && (count($k[$i]) === count($v[$i]))) { + $multi = array(); for ($j = 0; $j < count($k[$i]); $j++) { $key=$k[$i][$j]; - $val=$v[$i][$j]; - $multi[$key] = $val; - } - $ret[] = $multi; - } else if (is_string($k[$i]) && is_string($v[$i])) { - $ret[] = array($k[$i] => $v[$i]); - } - } - if (!is_null($keys)) $keys = $k; - if (!is_null($vals)) $vals = $v; - return $ret; - } - - /** - * @param string $dn The DN to parse - * @param array $keys An optional array to receive DN keys (e.g. CN, OU, DC, ...) - * @param array $vals An optional array to receive DN values - * @param string $caseFold - * @return boolean True if the DN was successfully parsed or false if the string is not a valid DN. - */ - public static function checkDn($dn, array &$keys = null, array &$vals = null, - $caseFold = self::ATTR_CASEFOLD_NONE) - { - /* This is a classic state machine parser. Each iteration of the - * loop processes one character. State 1 collects the key. When equals ( = ) - * is encountered the state changes to 2 where the value is collected - * until a comma (,) or semicolon (;) is encountered after which we switch back - * to state 1. If a backslash (\) is encountered, state 3 is used to collect the - * following character without engaging the logic of other states. - */ - $key = null; - $value = null; - $slen = strlen($dn); - $state = 1; - $ko = $vo = 0; - $multi = false; - $ka = array(); - $va = array(); - for ($di = 0; $di <= $slen; $di++) { - $ch = ($di == $slen) ? 0 : $dn[$di]; - switch ($state) { - case 1: // collect key - if ($ch === '=') { - $key = trim(substr($dn, $ko, $di - $ko)); - if ($caseFold == self::ATTR_CASEFOLD_LOWER) $key = strtolower($key); - else if ($caseFold == self::ATTR_CASEFOLD_UPPER) $key = strtoupper($key); - if (is_array($multi)) { - $keyId = strtolower($key); - if (in_array($keyId, $multi)) { - return false; - } - $ka[count($ka)-1][] = $key; - $multi[] = $keyId; - } else { - $ka[] = $key; - } - $state = 2; - $vo = $di + 1; - } else if ($ch === ',' || $ch === ';' || $ch === '+') { - return false; - } - break; - case 2: // collect value - if ($ch === '\\') { - $state = 3; - } else if ($ch === ',' || $ch === ';' || $ch === 0 || $ch === '+') { - $value = self::unescapeValue(trim(substr($dn, $vo, $di - $vo))); - if (is_array($multi)) { - $va[count($va)-1][] = $value; - } else { - $va[] = $value; - } - $state = 1; - $ko = $di + 1; - if ($ch === '+' && $multi === false) { - $lastKey = array_pop($ka); - $lastVal = array_pop($va); - $ka[] = array($lastKey); - $va[] = array($lastVal); + $val=$v[$i][$j]; + $multi[$key] = $val; + } + $ret[] = $multi; + } else if (is_string($k[$i]) && is_string($v[$i])) { + $ret[] = array($k[$i] => $v[$i]); + } + } + if (!is_null($keys)) $keys = $k; + if (!is_null($vals)) $vals = $v; + return $ret; + } + + /** + * @param string $dn The DN to parse + * @param array $keys An optional array to receive DN keys (e.g. CN, OU, DC, ...) + * @param array $vals An optional array to receive DN values + * @param string $caseFold + * @return boolean True if the DN was successfully parsed or false if the string is not a valid DN. + */ + public static function checkDn($dn, array &$keys = null, array &$vals = null, + $caseFold = self::ATTR_CASEFOLD_NONE) + { + /* This is a classic state machine parser. Each iteration of the + * loop processes one character. State 1 collects the key. When equals ( = ) + * is encountered the state changes to 2 where the value is collected + * until a comma (,) or semicolon (;) is encountered after which we switch back + * to state 1. If a backslash (\) is encountered, state 3 is used to collect the + * following character without engaging the logic of other states. + */ + $key = null; + $value = null; + $slen = strlen($dn); + $state = 1; + $ko = $vo = 0; + $multi = false; + $ka = array(); + $va = array(); + for ($di = 0; $di <= $slen; $di++) { + $ch = ($di == $slen) ? 0 : $dn[$di]; + switch ($state) { + case 1: // collect key + if ($ch === '=') { + $key = trim(substr($dn, $ko, $di - $ko)); + if ($caseFold == self::ATTR_CASEFOLD_LOWER) $key = strtolower($key); + else if ($caseFold == self::ATTR_CASEFOLD_UPPER) $key = strtoupper($key); + if (is_array($multi)) { + $keyId = strtolower($key); + if (in_array($keyId, $multi)) { + return false; + } + $ka[count($ka)-1][] = $key; + $multi[] = $keyId; + } else { + $ka[] = $key; + } + $state = 2; + $vo = $di + 1; + } else if ($ch === ',' || $ch === ';' || $ch === '+') { + return false; + } + break; + case 2: // collect value + if ($ch === '\\') { + $state = 3; + } else if ($ch === ',' || $ch === ';' || $ch === 0 || $ch === '+') { + $value = self::unescapeValue(trim(substr($dn, $vo, $di - $vo))); + if (is_array($multi)) { + $va[count($va)-1][] = $value; + } else { + $va[] = $value; + } + $state = 1; + $ko = $di + 1; + if ($ch === '+' && $multi === false) { + $lastKey = array_pop($ka); + $lastVal = array_pop($va); + $ka[] = array($lastKey); + $va[] = array($lastVal); $multi = array(strtolower($lastKey)); } else if ($ch === ','|| $ch === ';' || $ch === 0) { - $multi = false; - } - } else if ($ch === '=') { - return false; - } - break; - case 3: // escaped - $state = 2; - break; - } - } - - if ($keys !== null) { - $keys = $ka; - } - if ($vals !== null) { - $vals = $va; - } - - return ($state === 1 && $ko > 0); - } - - /** - * Returns a DN part in the form $attribute = $value - * - * This method supports the creation of multi-valued RDNs - * $part must contain an even number of elemets. - * - * @param array $attribute - * @param string $caseFold - * @return string - * @throws Zend_Ldap_Exception - */ - public static function implodeRdn(array $part, $caseFold = null) + $multi = false; + } + } else if ($ch === '=') { + return false; + } + break; + case 3: // escaped + $state = 2; + break; + } + } + + if ($keys !== null) { + $keys = $ka; + } + if ($vals !== null) { + $vals = $va; + } + + return ($state === 1 && $ko > 0); + } + + /** + * Returns a DN part in the form $attribute = $value + * + * This method supports the creation of multi-valued RDNs + * $part must contain an even number of elemets. + * + * @param array $attribute + * @param string $caseFold + * @return string + * @throws Zend_Ldap_Exception + */ + public static function implodeRdn(array $part, $caseFold = null) { self::_assertRdn($part); $part = self::_caseFoldRdn($part, $caseFold); @@ -728,33 +728,33 @@ class Zend_Ldap_Dn implements ArrayAccess } ksort($rdnParts, SORT_STRING); return implode('+', $rdnParts); - } - - /** - * Implodes an array in the form delivered by {@link explodeDn()} - * to a DN string. - * - * $dnArray must be of type + } + + /** + * Implodes an array in the form delivered by {@link explodeDn()} + * to a DN string. + * + * $dnArray must be of type * array( * array("cn" => "name1", "uid" => "user"), * array("cn" => "name2"), * array("dc" => "example"), * array("dc" => "org") - * ) - * - * @param array $dnArray - * @param string $caseFold - * @param string $separator - * @return string - * @throws Zend_Ldap_Exception - */ - public static function implodeDn(array $dnArray, $caseFold = null, $separator = ',') - { - $parts = array(); - foreach ($dnArray as $p) { - $parts[] = self::implodeRdn($p, $caseFold); - } - return implode($separator, $parts); + * ) + * + * @param array $dnArray + * @param string $caseFold + * @param string $separator + * @return string + * @throws Zend_Ldap_Exception + */ + public static function implodeDn(array $dnArray, $caseFold = null, $separator = ',') + { + $parts = array(); + foreach ($dnArray as $p) { + $parts[] = self::implodeRdn($p, $caseFold); + } + return implode($separator, $parts); } /** @@ -790,5 +790,5 @@ class Zend_Ldap_Dn implements ArrayAccess if ($cdn[$i+$startIndex] != $pdn[$i]) return false; } return true; - } + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Exception.php b/libs/Zend/Ldap/Exception.php index 022714c..1e13b95 100644 --- a/libs/Zend/Ldap/Exception.php +++ b/libs/Zend/Ldap/Exception.php @@ -17,7 +17,7 @@ * @package Zend_Ldap * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16880 2009-07-20 13:12:36Z mikaelkael $ + * @version $Id: Exception.php 17829 2009-08-26 15:07:10Z sgehrig $ */ /** @@ -118,8 +118,8 @@ class Zend_Ldap_Exception extends Zend_Exception /** * @param Zend_Ldap $ldap A Zend_Ldap object - * @param string $str An informtive exception message - * @param int $code An LDAP error code + * @param string $str An informtive exception message + * @param int $code An LDAP error code */ public function __construct(Zend_Ldap $ldap = null, $str = null, $code = 0) { diff --git a/libs/Zend/Ldap/Filter.php b/libs/Zend/Ldap/Filter.php index 9d51bc8..2d85dcf 100644 --- a/libs/Zend/Ldap/Filter.php +++ b/libs/Zend/Ldap/Filter.php @@ -1,265 +1,265 @@ -'; - const TYPE_GREATEROREQUAL = '>='; - const TYPE_LESS = '<'; - const TYPE_LESSOREQUAL = '<='; - const TYPE_APPROX = '~='; - - /** - * Creates an 'equals' filter. - * (attr=value) - * - * @param string $attr - * @param string $value - * @return Zend_Ldap_Filter - */ - public static function equals($attr, $value) - { - return new self($attr, $value, self::TYPE_EQUALS, null, null); - } - - /** - * Creates a 'begins with' filter. - * (attr=value*) - * - * @param string $attr - * @param string $value - * @return Zend_Ldap_Filter - */ - public static function begins($attr, $value) - { - return new self($attr, $value, self::TYPE_EQUALS, null, '*'); - } - - /** - * Creates an 'ends with' filter. - * (attr=*value) - * - * @param string $attr - * @param string $value - * @return Zend_Ldap_Filter - */ - public static function ends($attr, $value) - { - return new self($attr, $value, self::TYPE_EQUALS, '*', null); - } - - /** - * Creates a 'contains' filter. - * (attr=*value*) - * - * @param string $attr - * @param string $value - * @return Zend_Ldap_Filter - */ - public static function contains($attr, $value) - { - return new self($attr, $value, self::TYPE_EQUALS, '*', '*'); - } - - /** - * Creates a 'greater' filter. - * (attr>value) - * - * @param string $attr - * @param string $value - * @return Zend_Ldap_Filter - */ - public static function greater($attr, $value) - { - return new self($attr, $value, self::TYPE_GREATER, null, null); - } - - /** - * Creates a 'greater or equal' filter. - * (attr>=value) - * - * @param string $attr - * @param string $value - * @return Zend_Ldap_Filter - */ - public static function greaterOrEqual($attr, $value) - { - return new self($attr, $value, self::TYPE_GREATEROREQUAL, null, null); - } - - /** - * Creates a 'less' filter. - * (attrvalue) + * + * @param string $attr + * @param string $value + * @return Zend_Ldap_Filter + */ + public static function greater($attr, $value) + { + return new self($attr, $value, self::TYPE_GREATER, null, null); + } + + /** + * Creates a 'greater or equal' filter. + * (attr>=value) + * + * @param string $attr + * @param string $value + * @return Zend_Ldap_Filter + */ + public static function greaterOrEqual($attr, $value) + { + return new self($attr, $value, self::TYPE_GREATEROREQUAL, null, null); + } + + /** + * Creates a 'less' filter. + * (attrtoString(); - } - - /** - * Negates the filter. - * - * @return Zend_Ldap_Filter_Abstract - */ - public function negate() - { - /** - * Zend_Ldap_Filter_Not - */ - require_once 'Zend/Ldap/Filter/Not.php'; - return new Zend_Ldap_Filter_Not($this); - } - - /** - * Creates an 'and' filter. - * - * @param Zend_Ldap_Filter_Abstract $filter,... - * @return Zend_Ldap_Filter_And - */ - public function addAnd($filter) - { - /** - * Zend_Ldap_Filter_And - */ - require_once 'Zend/Ldap/Filter/And.php'; - $fa = func_get_args(); - $args = array_merge(array($this), $fa); - return new Zend_Ldap_Filter_And($args); - } - - /** - * Creates an 'or' filter. - * - * @param Zend_Ldap_Filter_Abstract $filter,... - * @return Zend_Ldap_Filter_Or - */ - public function addOr($filter) - { - /** - * Zend_Ldap_Filter_Or - */ - require_once 'Zend/Ldap/Filter/Or.php'; - $fa = func_get_args(); - $args = array_merge(array($this), $fa); - return new Zend_Ldap_Filter_Or($args); - } - - /** - * Escapes the given VALUES according to RFC 2254 so that they can be safely used in LDAP filters. - * - * Any control characters with an ACII code < 32 as well as the characters with special meaning in - * LDAP filters "*", "(", ")", and "\" (the backslash) are converted into the representation of a - * backslash followed by two hex digits representing the hexadecimal value of the character. - * @see Net_LDAP2_Util::escape_filter_value() from Benedikt Hallinger - * @link http://pear.php.net/package/Net_LDAP2 - * @author Benedikt Hallinger - * - * @param string|array $values Array of values to escape - * @return array Array $values, but escaped - */ - public static function escapeValue($values = array()) - { - /** - * @see Zend_Ldap_Converter - */ - require_once 'Zend/Ldap/Converter.php'; - - if (!is_array($values)) $values = array($values); - foreach ($values as $key => $val) { - // Escaping of filter meta characters - $val = str_replace(array('\\', '*', '(', ')'), array('\5c', '\2a', '\28', '\29'), $val); - // ASCII < 32 escaping - $val = Zend_Ldap_Converter::ascToHex32($val); - if (null === $val) $val = '\0'; // apply escaped "null" if string is empty - $values[$key] = $val; - } - return (count($values) == 1) ? $values[0] : $values; - } - - /** - * Undoes the conversion done by {@link escapeValue()}. - * - * Converts any sequences of a backslash followed by two hex digits into the corresponding character. - * @see Net_LDAP2_Util::escape_filter_value() from Benedikt Hallinger - * @link http://pear.php.net/package/Net_LDAP2 - * @author Benedikt Hallinger - * - * @param string|array $values Array of values to escape - * @return array Array $values, but unescaped - */ - public static function unescapeValue($values = array()) - { - /** - * @see Zend_Ldap_Converter - */ - require_once 'Zend/Ldap/Converter.php'; - - if (!is_array($values)) $values = array($values); - foreach ($values as $key => $value) { - // Translate hex code into ascii - $values[$key] = Zend_Ldap_Converter::hex32ToAsc($value); - } - return (count($values) == 1) ? $values[0] : $values; - } +toString(); + } + + /** + * Negates the filter. + * + * @return Zend_Ldap_Filter_Abstract + */ + public function negate() + { + /** + * Zend_Ldap_Filter_Not + */ + require_once 'Zend/Ldap/Filter/Not.php'; + return new Zend_Ldap_Filter_Not($this); + } + + /** + * Creates an 'and' filter. + * + * @param Zend_Ldap_Filter_Abstract $filter,... + * @return Zend_Ldap_Filter_And + */ + public function addAnd($filter) + { + /** + * Zend_Ldap_Filter_And + */ + require_once 'Zend/Ldap/Filter/And.php'; + $fa = func_get_args(); + $args = array_merge(array($this), $fa); + return new Zend_Ldap_Filter_And($args); + } + + /** + * Creates an 'or' filter. + * + * @param Zend_Ldap_Filter_Abstract $filter,... + * @return Zend_Ldap_Filter_Or + */ + public function addOr($filter) + { + /** + * Zend_Ldap_Filter_Or + */ + require_once 'Zend/Ldap/Filter/Or.php'; + $fa = func_get_args(); + $args = array_merge(array($this), $fa); + return new Zend_Ldap_Filter_Or($args); + } + + /** + * Escapes the given VALUES according to RFC 2254 so that they can be safely used in LDAP filters. + * + * Any control characters with an ACII code < 32 as well as the characters with special meaning in + * LDAP filters "*", "(", ")", and "\" (the backslash) are converted into the representation of a + * backslash followed by two hex digits representing the hexadecimal value of the character. + * @see Net_LDAP2_Util::escape_filter_value() from Benedikt Hallinger + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string|array $values Array of values to escape + * @return array Array $values, but escaped + */ + public static function escapeValue($values = array()) + { + /** + * @see Zend_Ldap_Converter + */ + require_once 'Zend/Ldap/Converter.php'; + + if (!is_array($values)) $values = array($values); + foreach ($values as $key => $val) { + // Escaping of filter meta characters + $val = str_replace(array('\\', '*', '(', ')'), array('\5c', '\2a', '\28', '\29'), $val); + // ASCII < 32 escaping + $val = Zend_Ldap_Converter::ascToHex32($val); + if (null === $val) $val = '\0'; // apply escaped "null" if string is empty + $values[$key] = $val; + } + return (count($values) == 1) ? $values[0] : $values; + } + + /** + * Undoes the conversion done by {@link escapeValue()}. + * + * Converts any sequences of a backslash followed by two hex digits into the corresponding character. + * @see Net_LDAP2_Util::escape_filter_value() from Benedikt Hallinger + * @link http://pear.php.net/package/Net_LDAP2 + * @author Benedikt Hallinger + * + * @param string|array $values Array of values to escape + * @return array Array $values, but unescaped + */ + public static function unescapeValue($values = array()) + { + /** + * @see Zend_Ldap_Converter + */ + require_once 'Zend/Ldap/Converter.php'; + + if (!is_array($values)) $values = array($values); + foreach ($values as $key => $value) { + // Translate hex code into ascii + $values[$key] = Zend_Ldap_Converter::hex32ToAsc($value); + } + return (count($values) == 1) ? $values[0] : $values; + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Filter/And.php b/libs/Zend/Ldap/Filter/And.php index cf3c269..94bd51f 100644 --- a/libs/Zend/Ldap/Filter/And.php +++ b/libs/Zend/Ldap/Filter/And.php @@ -1,48 +1,48 @@ - $s) { - if (is_string($s)) $subfilters[$key] = new Zend_Ldap_Filter_String($s); - else if (!($s instanceof Zend_Ldap_Filter_Abstract)) { - /** - * @see Zend_Ldap_Filter_Exception - */ - require_once 'Zend/Ldap/Filter/Exception.php'; - throw new Zend_Ldap_Filter_Exception('Only strings or Zend_Ldap_Filter_Abstract allowed.'); - } - } - $this->_subfilters = $subfilters; - $this->_symbol = $symbol; - } - - /** - * Adds a filter to this grouping filter. - * - * @param Zend_Ldap_Filter_Abstract $filter - * @return Zend_Ldap_Filter_Logical - */ - public function addFilter(Zend_Ldap_Filter_Abstract $filter) - { - $new = clone $this; - $new->_subfilters[] = $filter; - return $new; - } - - /** - * Returns a string representation of the filter. - * - * @return string - */ - public function toString() - { - $return = '(' . $this->_symbol; - foreach ($this->_subfilters as $sub) $return .= $sub->toString(); - $return .= ')'; - return $return; - } + $s) { + if (is_string($s)) $subfilters[$key] = new Zend_Ldap_Filter_String($s); + else if (!($s instanceof Zend_Ldap_Filter_Abstract)) { + /** + * @see Zend_Ldap_Filter_Exception + */ + require_once 'Zend/Ldap/Filter/Exception.php'; + throw new Zend_Ldap_Filter_Exception('Only strings or Zend_Ldap_Filter_Abstract allowed.'); + } + } + $this->_subfilters = $subfilters; + $this->_symbol = $symbol; + } + + /** + * Adds a filter to this grouping filter. + * + * @param Zend_Ldap_Filter_Abstract $filter + * @return Zend_Ldap_Filter_Logical + */ + public function addFilter(Zend_Ldap_Filter_Abstract $filter) + { + $new = clone $this; + $new->_subfilters[] = $filter; + return $new; + } + + /** + * Returns a string representation of the filter. + * + * @return string + */ + public function toString() + { + $return = '(' . $this->_symbol; + foreach ($this->_subfilters as $sub) $return .= $sub->toString(); + $return .= ')'; + return $return; + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Filter/Mask.php b/libs/Zend/Ldap/Filter/Mask.php index 6f3ad2e..9f39831 100644 --- a/libs/Zend/Ldap/Filter/Mask.php +++ b/libs/Zend/Ldap/Filter/Mask.php @@ -1,66 +1,66 @@ -_filter; - } + array_shift($args); + for ($i = 0; $i_filter; + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Filter/Not.php b/libs/Zend/Ldap/Filter/Not.php index d3393ed..0b6a9b1 100644 --- a/libs/Zend/Ldap/Filter/Not.php +++ b/libs/Zend/Ldap/Filter/Not.php @@ -1,75 +1,75 @@ -_filter = $filter; - } - - /** - * Negates the filter. - * - * @return Zend_Ldap_Filter_Abstract - */ - public function negate() - { - return $this->_filter; - } - - /** - * Returns a string representation of the filter. - * - * @return string - */ - public function toString() - { - return '(!' . $this->_filter->toString() . ')'; - } +_filter = $filter; + } + + /** + * Negates the filter. + * + * @return Zend_Ldap_Filter_Abstract + */ + public function negate() + { + return $this->_filter; + } + + /** + * Returns a string representation of the filter. + * + * @return string + */ + public function toString() + { + return '(!' . $this->_filter->toString() . ')'; + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Filter/Or.php b/libs/Zend/Ldap/Filter/Or.php index 6b48d58..a2d7747 100644 --- a/libs/Zend/Ldap/Filter/Or.php +++ b/libs/Zend/Ldap/Filter/Or.php @@ -1,48 +1,48 @@ -_filter = $filter; - } - - /** - * Returns a string representation of the filter. - * - * @return string - */ - public function toString() - { - return '(' . $this->_filter . ')'; - } +_filter = $filter; + } + + /** + * Returns a string representation of the filter. + * + * @return string + */ + public function toString() + { + return '(' . $this->_filter . ')'; + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Ldif/Encoder.php b/libs/Zend/Ldap/Ldif/Encoder.php index f0d5346..d435dac 100644 --- a/libs/Zend/Ldap/Ldif/Encoder.php +++ b/libs/Zend/Ldap/Ldif/Encoder.php @@ -1,35 +1,35 @@ - 78 ); + /** + * @var boolean + */ protected $_versionWritten = false; - + /** * Constructor. * - * @param array $options Additional options used during encoding + * @param array $options Additional options used during encoding * @return void */ protected function __construct(array $options = array()) @@ -58,7 +61,7 @@ class Zend_Ldap_Ldif_Encoder /** * Decodes the string $string into an array of LDIF items * - * @param string $string + * @param string $string * @return array */ public static function decode($string) @@ -70,7 +73,7 @@ class Zend_Ldap_Ldif_Encoder /** * Decodes the string $string into an array of LDIF items * - * @param string $string + * @param string $string * @return array */ protected function _decode($string) @@ -137,8 +140,8 @@ class Zend_Ldap_Ldif_Encoder /** * Encode $value into a LDIF representation * - * @param mixed $value The value to be encoded - * @param array $options Additional options used during encoding + * @param mixed $value The value to be encoded + * @param array $options Additional options used during encoding * @return string The encoded value */ public static function encode($value, array $options = array()) @@ -151,7 +154,7 @@ class Zend_Ldap_Ldif_Encoder * Recursive driver which determines the type of value to be encoded * and then dispatches to the appropriate method. * - * @param $value mixed The value to be encoded + * @param mixed $value The value to be encoded * @return string Encoded value */ protected function _encode($value) @@ -171,8 +174,8 @@ class Zend_Ldap_Ldif_Encoder * * @link http://www.faqs.org/rfcs/rfc2849.html * - * @param string $string - * @param boolen $base64 + * @param string $string + * @param boolen $base64 * @return string */ protected function _encodeString($string, &$base64 = null) @@ -229,8 +232,8 @@ class Zend_Ldap_Ldif_Encoder * * @link http://www.faqs.org/rfcs/rfc2849.html * - * @param string $name - * @param array|string $value + * @param string $name + * @param array|string $value * @return string */ protected function _encodeAttribute($name, $value) @@ -267,7 +270,7 @@ class Zend_Ldap_Ldif_Encoder * * @link http://www.faqs.org/rfcs/rfc2849.html * - * @param array $attributes + * @param array $attributes * @return string */ protected function _encodeAttributes(array $attributes) diff --git a/libs/Zend/Ldap/Node.php b/libs/Zend/Ldap/Node.php index bf62c7f..4768fa8 100644 --- a/libs/Zend/Ldap/Node.php +++ b/libs/Zend/Ldap/Node.php @@ -1,57 +1,57 @@ -attachLdap($ldap); - else $this->detachLdap(); - } - - /** - * Serialization callback - * - * Only DN and attributes will be serialized. - * - * @return array - */ - public function __sleep() + parent::__construct($dn, $data, $fromDataSource); + if (!is_null($ldap)) $this->attachLdap($ldap); + else $this->detachLdap(); + } + + /** + * Serialization callback + * + * Only DN and attributes will be serialized. + * + * @return array + */ + public function __sleep() { return array('_dn', '_currentData', '_newDn', '_originalData', - '_new', '_delete', '_children'); - } - - /** - * Deserialization callback - * - * Enforces a detached node. - * - * @return null - */ - public function __wakeup() - { - $this->detachLdap(); - } - - /** - * Gets the current LDAP connection. - * - * @return Zend_Ldap - * @throws Zend_Ldap_Exception - */ - public function getLdap() - { - if (is_null($this->_ldap)) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception(null, 'No LDAP connection specified.', Zend_Ldap_Exception::LDAP_OTHER); - } - else return $this->_ldap; + '_new', '_delete', '_children'); + } + + /** + * Deserialization callback + * + * Enforces a detached node. + * + * @return null + */ + public function __wakeup() + { + $this->detachLdap(); + } + + /** + * Gets the current LDAP connection. + * + * @return Zend_Ldap + * @throws Zend_Ldap_Exception + */ + public function getLdap() + { + if (is_null($this->_ldap)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'No LDAP connection specified.', Zend_Ldap_Exception::LDAP_OTHER); + } + else return $this->_ldap; } /** @@ -153,7 +153,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs * * @uses Zend_Ldap_Dn::isChildOf() * @param Zend_Ldap $ldap - * @return Zend_Ldap_Node *Provides a fluid interface* + * @return Zend_Ldap_Node Provides a fluid interface * @throws Zend_Ldap_Exception */ public function attachLdap(Zend_Ldap $ldap) @@ -183,7 +183,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs * * This is an offline method. * - * @return Zend_Ldap_Node *Provides a fluid interface* + * @return Zend_Ldap_Node Provides a fluid interface */ public function detachLdap() { @@ -206,14 +206,14 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs public function isAttached() { return (!is_null($this->_ldap)); - } - + } + /** - * @param array $data - * @param boolean $fromDataSource - * @throws Zend_Ldap_Exception - */ - protected function _loadData(array $data, $fromDataSource) + * @param array $data + * @param boolean $fromDataSource + * @throws Zend_Ldap_Exception + */ + protected function _loadData(array $data, $fromDataSource) { parent::_loadData($data, $fromDataSource); if ($fromDataSource === true) { @@ -224,44 +224,17 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs $this->_children = null; $this->_markAsNew(($fromDataSource === true) ? false : true); $this->_markAsToBeDeleted(false); - } - - /** - * Factory method to create a new detached Zend_Ldap_Node for a given DN. - * - * @param string|array|Zend_Ldap_Dn $dn - * @param array $objectClass - * @return Zend_Ldap_Node - * @throws Zend_Ldap_Exception - */ - public static function create($dn, array $objectClass = array()) - { - if (is_string($dn) || is_array($dn)) { - $dn = Zend_Ldap_Dn::factory($dn); - } else if ($dn instanceof Zend_Ldap_Dn) { - $dn = clone $dn; - } else { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception(null, '$dn is of a wrong data type.'); - } - $new = new self($dn, array(), false, null); - $new->_ensureRdnAttributeValues(); - $new->setAttribute('objectClass', $objectClass); - return $new; - } - - /** - * Factory method to create an attached Zend_Ldap_Node for a given DN. - * - * @param string|array|Zend_Ldap_Dn $dn - * @param Zend_Ldap $ldap - * @return Zend_Ldap_Node - * @throws Zend_Ldap_Exception - */ - public static function fromLdap($dn, Zend_Ldap $ldap) + } + + /** + * Factory method to create a new detached Zend_Ldap_Node for a given DN. + * + * @param string|array|Zend_Ldap_Dn $dn + * @param array $objectClass + * @return Zend_Ldap_Node + * @throws Zend_Ldap_Exception + */ + public static function create($dn, array $objectClass = array()) { if (is_string($dn) || is_array($dn)) { $dn = Zend_Ldap_Dn::factory($dn); @@ -274,20 +247,50 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs require_once 'Zend/Ldap/Exception.php'; throw new Zend_Ldap_Exception(null, '$dn is of a wrong data type.'); } - $data = $ldap->getEntry($dn, array('*', '+'), true); + $new = new self($dn, array(), false, null); + $new->_ensureRdnAttributeValues(); + $new->setAttribute('objectClass', $objectClass); + return $new; + } + + /** + * Factory method to create an attached Zend_Ldap_Node for a given DN. + * + * @param string|array|Zend_Ldap_Dn $dn + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node|null + * @throws Zend_Ldap_Exception + */ + public static function fromLdap($dn, Zend_Ldap $ldap) + { + if (is_string($dn) || is_array($dn)) { + $dn = Zend_Ldap_Dn::factory($dn); + } else if ($dn instanceof Zend_Ldap_Dn) { + $dn = clone $dn; + } else { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, '$dn is of a wrong data type.'); + } + $data = $ldap->getEntry($dn, array('*', '+'), true); + if ($data === null) { + return null; + } $entry = new self($dn, $data, true, $ldap); - return $entry; - } - - /** - * Factory method to create a detached Zend_Ldap_Node from array data. - * - * @param array $data - * @param boolean $fromDataSource - * @return Zend_Ldap_Node - * @throws Zend_Ldap_Exception - */ - public static function fromArray(array $data, $fromDataSource = false) + return $entry; + } + + /** + * Factory method to create a detached Zend_Ldap_Node from array data. + * + * @param array $data + * @param boolean $fromDataSource + * @return Zend_Ldap_Node + * @throws Zend_Ldap_Exception + */ + public static function fromArray(array $data, $fromDataSource = false) { if (!array_key_exists('dn', $data)) { /** @@ -310,7 +313,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs $fromDataSource = ($fromDataSource === true) ? true : false; $new = new self($dn, $data, $fromDataSource, null); $new->_ensureRdnAttributeValues(); - return $new; + return $new; } /** @@ -378,7 +381,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs * * Node will be deleted on calling update() if $delete is true. * - * @return Zend_Ldap_Node *Provides a fluid interface* + * @return Zend_Ldap_Node Provides a fluid interface */ public function delete() { @@ -405,8 +408,8 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs /** * Sends all pending changes to the LDAP server * - * @param Zend_Ldap $ldap - * @return Zend_Ldap_Node *Provides a fluid interface* + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node Provides a fluid interface * @throws Zend_Ldap_Exception */ public function update(Zend_Ldap $ldap = null) @@ -466,7 +469,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs protected function _getDn() { return ($this->_newDn === null) ? parent::_getDn() : $this->_newDn; - } + } /** * Gets the current DN of the current node as a Zend_Ldap_Dn. @@ -487,9 +490,9 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs * * This is an offline method. * - * @param Zend_Ldap_Dn|string|array $newDn + * @param Zend_Ldap_Dn|string|array $newDn * @throws Zend_Ldap_Exception - * @return Zend_Ldap_Node *Provides a fluid interface* + * @return Zend_Ldap_Node Provides a fluid interface */ public function setDn($newDn) { @@ -507,9 +510,9 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs * * This is an offline method. * - * @param Zend_Ldap_Dn|string|array $newDn + * @param Zend_Ldap_Dn|string|array $newDn * @throws Zend_Ldap_Exception - * @return Zend_Ldap_Node *Provides a fluid interface* + * @return Zend_Ldap_Node Provides a fluid interface */ public function move($newDn) { @@ -521,9 +524,9 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs * * This is an offline method. * - * @param Zend_Ldap_Dn|string|array $newDn + * @param Zend_Ldap_Dn|string|array $newDn * @throws Zend_Ldap_Exception - * @return Zend_Ldap_Node *Provides a fluid interface* + * @return Zend_Ldap_Node Provides a fluid interface */ public function rename($newDn) { @@ -536,7 +539,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs * This is an offline method. * * @param array|string $value - * @return Zend_Ldap_Node *Provides a fluid interface* + * @return Zend_Ldap_Node Provides a fluid interface * @throws Zend_Ldap_Exception */ public function setObjectClass($value) @@ -551,7 +554,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs * This is an offline method. * * @param array|string $value - * @return Zend_Ldap_Node *Provides a fluid interface* + * @return Zend_Ldap_Node Provides a fluid interface * @throws Zend_Ldap_Exception */ public function appendObjectClass($value) @@ -563,7 +566,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs /** * Returns a LDIF representation of the current node * - * @param array $options Additional options used during encoding + * @param array $options Additional options used during encoding * @return string */ public function toLdif(array $options = array()) @@ -575,19 +578,19 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs require_once 'Zend/Ldap/Ldif/Encoder.php'; return Zend_Ldap_Ldif_Encoder::encode($attributes, $options); } - - /** - * Gets changed node data. - * - * The array contains all changed attributes. - * This format can be used in {@link Zend_Ldap::add()} and {@link Zend_Ldap::update()}. - * - * This is an offline method. - * - * @return array - */ - public function getChangedData() - { + + /** + * Gets changed node data. + * + * The array contains all changed attributes. + * This format can be used in {@link Zend_Ldap::add()} and {@link Zend_Ldap::update()}. + * + * This is an offline method. + * + * @return array + */ + public function getChangedData() + { $changed = array(); foreach ($this->_currentData as $key => $value) { if (!array_key_exists($key, $this->_originalData) && !empty($value)) { @@ -596,7 +599,7 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs $changed[$key] = $value; } } - return $changed; + return $changed; } /** @@ -626,45 +629,45 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs } } return $changes; - } - - /** - * Sets a LDAP attribute. - * - * This is an offline method. - * - * @param string $name - * @param mixed $value - * @return Zend_Ldap_Node *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function setAttribute($name, $value) - { + } + + /** + * Sets a LDAP attribute. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function setAttribute($name, $value) + { $this->_setAttribute($name, $value, false); - return $this; - } - - /** - * Appends to a LDAP attribute. - * - * This is an offline method. - * - * @param string $name - * @param mixed $value - * @return Zend_Ldap_Node *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function appendToAttribute($name, $value) - { - $this->_setAttribute($name, $value, true); - return $this; + return $this; + } + + /** + * Appends to a LDAP attribute. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function appendToAttribute($name, $value) + { + $this->_setAttribute($name, $value, true); + return $this; } /** * Checks if the attribute can be set and sets it accordingly. * - * @param string $name - * @param mixed $value + * @param string $name + * @param mixed $value * @param boolean $append * @throws Zend_Ldap_Exception */ @@ -672,97 +675,97 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs { $this->_assertChangeableAttribute($name); Zend_Ldap_Attribute::setAttribute($this->_currentData, $name, $value, $append); - } - - /** - * Sets a LDAP date/time attribute. - * - * This is an offline method. - * - * @param string $name - * @param integer|array $value - * @param boolean $utc - * @return Zend_Ldap_Node *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function setDateTimeAttribute($name, $value, $utc = false) - { - $this->_setDateTimeAttribute($name, $value, $utc, false); - return $this; - } - - /** - * Appends to a LDAP date/time attribute. - * - * This is an offline method. - * - * @param string $name - * @param integer|array $value - * @param boolean $utc - * @return Zend_Ldap_Node *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function appendToDateTimeAttribute($name, $value, $utc = false) - { - $this->_setDateTimeAttribute($name, $value, $utc, true); - return $this; + } + + /** + * Sets a LDAP date/time attribute. + * + * This is an offline method. + * + * @param string $name + * @param integer|array $value + * @param boolean $utc + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function setDateTimeAttribute($name, $value, $utc = false) + { + $this->_setDateTimeAttribute($name, $value, $utc, false); + return $this; + } + + /** + * Appends to a LDAP date/time attribute. + * + * This is an offline method. + * + * @param string $name + * @param integer|array $value + * @param boolean $utc + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function appendToDateTimeAttribute($name, $value, $utc = false) + { + $this->_setDateTimeAttribute($name, $value, $utc, true); + return $this; } /** * Checks if the attribute can be set and sets it accordingly. * - * @param string $name + * @param string $name * @param integer|array $value - * @param boolean $utc - * @param boolean $append + * @param boolean $utc + * @param boolean $append * @throws Zend_Ldap_Exception */ protected function _setDateTimeAttribute($name, $value, $utc, $append) { $this->_assertChangeableAttribute($name); Zend_Ldap_Attribute::setDateTimeAttribute($this->_currentData, $name, $value, $utc, $append); - } - - /** - * Sets a LDAP password. - * - * @param string $password - * @param string $hashType - * @param string $attribName - * @return Zend_Ldap_Node *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function setPasswordAttribute($password, $hashType = Zend_Ldap_Attribute::PASSWORD_HASH_MD5, - $attribName = 'userPassword') - { - $this->_assertChangeableAttribute($attribName); - Zend_Ldap_Attribute::setPassword($this->_currentData, $password, $hashType, $attribName); - return $this; - } - - /** - * Deletes a LDAP attribute. - * - * This method deletes the attribute. - * - * This is an offline method. - * - * @param string $name - * @return Zend_Ldap_Node *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function deleteAttribute($name) + } + + /** + * Sets a LDAP password. + * + * @param string $password + * @param string $hashType + * @param string $attribName + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function setPasswordAttribute($password, $hashType = Zend_Ldap_Attribute::PASSWORD_HASH_MD5, + $attribName = 'userPassword') + { + $this->_assertChangeableAttribute($attribName); + Zend_Ldap_Attribute::setPassword($this->_currentData, $password, $hashType, $attribName); + return $this; + } + + /** + * Deletes a LDAP attribute. + * + * This method deletes the attribute. + * + * This is an offline method. + * + * @param string $name + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function deleteAttribute($name) { if ($this->existsAttribute($name, true)) { - $this->_setAttribute($name, null, false); - } - return $this; + $this->_setAttribute($name, null, false); + } + return $this; } /** * Removes duplicate values from a LDAP attribute * - * @param string $attribName + * @param string $attribName * @return void */ public function removeDuplicatesFromAttribute($attribName) @@ -773,210 +776,210 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs /** * Remove given values from a LDAP attribute * - * @param string $attribName - * @param mixed|array $value + * @param string $attribName + * @param mixed|array $value * @return void */ public function removeFromAttribute($attribName, $value) { Zend_Ldap_Attribute::removeFromAttribute($this->_currentData, $attribName, $value); - } - - /** - * @param string $name - * @return boolean - * @throws Zend_Ldap_Exception - */ - protected function _assertChangeableAttribute($name) - { + } + + /** + * @param string $name + * @return boolean + * @throws Zend_Ldap_Exception + */ + protected function _assertChangeableAttribute($name) + { $name = strtolower($name); - $rdn = $this->getRdnArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); - if ($name == 'dn') { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception(null, 'DN cannot be changed.'); - } - else if (array_key_exists($name, $rdn)) { - /** - * @see Zend_Ldap_Exception - */ - require_once 'Zend/Ldap/Exception.php'; - throw new Zend_Ldap_Exception(null, 'Cannot change attribute because it\'s part of the RDN'); + $rdn = $this->getRdnArray(Zend_Ldap_Dn::ATTR_CASEFOLD_LOWER); + if ($name == 'dn') { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'DN cannot be changed.'); + } + else if (array_key_exists($name, $rdn)) { + /** + * @see Zend_Ldap_Exception + */ + require_once 'Zend/Ldap/Exception.php'; + throw new Zend_Ldap_Exception(null, 'Cannot change attribute because it\'s part of the RDN'); } else if (in_array($name, self::$_systemAttributes)) { /** * @see Zend_Ldap_Exception */ require_once 'Zend/Ldap/Exception.php'; throw new Zend_Ldap_Exception(null, 'Cannot change attribute because it\'s read-only'); - } - else return true; - } - - /** - * Sets a LDAP attribute. - * - * This is an offline method. - * - * @param string $name - * @param mixed $value - * @return null - * @throws Zend_Ldap_Exception - */ - public function __set($name, $value) - { - $this->setAttribute($name, $value); - } - - /** - * Deletes a LDAP attribute. - * - * This method deletes the attribute. - * - * This is an offline method. - * - * @param string $name - * @return null - * @throws Zend_Ldap_Exception - */ - public function __unset($name) - { - $this->deleteAttribute($name); - } - - /** - * Sets a LDAP attribute. - * Implements ArrayAccess. - * - * This is an offline method. - * - * @param string $name - * @param mixed $value - * @return null - * @throws Zend_Ldap_Exception - */ - public function offsetSet($name, $value) - { - $this->setAttribute($name, $value); - } - - /** - * Deletes a LDAP attribute. - * Implements ArrayAccess. - * - * This method deletes the attribute. - * - * This is an offline method. - * - * @param string $name - * @return null - * @throws Zend_Ldap_Exception - */ - public function offsetUnset($name) - { - $this->deleteAttribute($name); - } - - /** - * Check if node exists on LDAP. - * - * This is an online method. + } + else return true; + } + + /** + * Sets a LDAP attribute. * - * @param Zend_Ldap $ldap - * @return boolean - * @throws Zend_Ldap_Exception - */ - public function exists(Zend_Ldap $ldap = null) + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return null + * @throws Zend_Ldap_Exception + */ + public function __set($name, $value) + { + $this->setAttribute($name, $value); + } + + /** + * Deletes a LDAP attribute. + * + * This method deletes the attribute. + * + * This is an offline method. + * + * @param string $name + * @return null + * @throws Zend_Ldap_Exception + */ + public function __unset($name) + { + $this->deleteAttribute($name); + } + + /** + * Sets a LDAP attribute. + * Implements ArrayAccess. + * + * This is an offline method. + * + * @param string $name + * @param mixed $value + * @return null + * @throws Zend_Ldap_Exception + */ + public function offsetSet($name, $value) + { + $this->setAttribute($name, $value); + } + + /** + * Deletes a LDAP attribute. + * Implements ArrayAccess. + * + * This method deletes the attribute. + * + * This is an offline method. + * + * @param string $name + * @return null + * @throws Zend_Ldap_Exception + */ + public function offsetUnset($name) + { + $this->deleteAttribute($name); + } + + /** + * Check if node exists on LDAP. + * + * This is an online method. + * + * @param Zend_Ldap $ldap + * @return boolean + * @throws Zend_Ldap_Exception + */ + public function exists(Zend_Ldap $ldap = null) { if ($ldap !== null) { $this->attachLdap($ldap); } - $ldap = $this->getLdap(); - return $ldap->exists($this->_getDn()); - } - - /** - * Reload node attributes from LDAP. - * - * This is an online method. + $ldap = $this->getLdap(); + return $ldap->exists($this->_getDn()); + } + + /** + * Reload node attributes from LDAP. * - * @param Zend_Ldap $ldap - * @return Zend_Ldap_Node *Provides a fluid interface* - * @throws Zend_Ldap_Exception - */ - public function reload(Zend_Ldap $ldap = null) + * This is an online method. + * + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node Provides a fluid interface + * @throws Zend_Ldap_Exception + */ + public function reload(Zend_Ldap $ldap = null) { if ($ldap !== null) { $this->attachLdap($ldap); } - $ldap = $this->getLdap(); - parent::reload($ldap); - return $this; - } - - /** - * Search current subtree with given options. - * - * This is an online method. - * - * @param string|Zend_Ldap_Filter_Abstract $filter - * @param integer $scope - * @param string $sort - * @return Zend_Ldap_Node_Collection - * @throws Zend_Ldap_Exception - */ - public function searchSubtree($filter, $scope = Zend_Ldap::SEARCH_SCOPE_SUB, $sort = null) + $ldap = $this->getLdap(); + parent::reload($ldap); + return $this; + } + + /** + * Search current subtree with given options. + * + * This is an online method. + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param integer $scope + * @param string $sort + * @return Zend_Ldap_Node_Collection + * @throws Zend_Ldap_Exception + */ + public function searchSubtree($filter, $scope = Zend_Ldap::SEARCH_SCOPE_SUB, $sort = null) { /** * @see Zend_Ldap_Node_Collection */ - require_once 'Zend/Ldap/Node/Collection.php'; + require_once 'Zend/Ldap/Node/Collection.php'; return $this->getLdap()->search($filter, $this->_getDn(), $scope, array('*', '+'), $sort, - 'Zend_Ldap_Node_Collection'); - } - - /** - * Count items in current subtree found by given filter. - * - * This is an online method. - * - * @param string|Zend_Ldap_Filter_Abstract $filter - * @param integer $scope - * @return integer - * @throws Zend_Ldap_Exception - */ - public function countSubtree($filter, $scope = Zend_Ldap::SEARCH_SCOPE_SUB) - { - return $this->getLdap()->count($filter, $this->_getDn(), $scope); - } - - /** - * Count children of current node. - * - * This is an online method. - * - * @return integer - * @throws Zend_Ldap_Exception - */ - public function countChildren() - { - return $this->countSubtree('(objectClass=*)', Zend_Ldap::SEARCH_SCOPE_ONE); - } - - /** - * Gets children of current node. - * - * This is an online method. - * - * @param string|Zend_Ldap_Filter_Abstract $filter - * @param string $sort - * @return Zend_Ldap_Node_Collection - * @throws Zend_Ldap_Exception - */ - public function searchChildren($filter, $sort = null) - { - return $this->searchSubtree($filter, Zend_Ldap::SEARCH_SCOPE_ONE, $sort); + 'Zend_Ldap_Node_Collection'); + } + + /** + * Count items in current subtree found by given filter. + * + * This is an online method. + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param integer $scope + * @return integer + * @throws Zend_Ldap_Exception + */ + public function countSubtree($filter, $scope = Zend_Ldap::SEARCH_SCOPE_SUB) + { + return $this->getLdap()->count($filter, $this->_getDn(), $scope); + } + + /** + * Count children of current node. + * + * This is an online method. + * + * @return integer + * @throws Zend_Ldap_Exception + */ + public function countChildren() + { + return $this->countSubtree('(objectClass=*)', Zend_Ldap::SEARCH_SCOPE_ONE); + } + + /** + * Gets children of current node. + * + * This is an online method. + * + * @param string|Zend_Ldap_Filter_Abstract $filter + * @param string $sort + * @return Zend_Ldap_Node_Collection + * @throws Zend_Ldap_Exception + */ + public function searchChildren($filter, $sort = null) + { + return $this->searchSubtree($filter, Zend_Ldap::SEARCH_SCOPE_ONE, $sort); } /** @@ -999,17 +1002,17 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs } else { return (count($this->_children) > 0); } - } - - /** - * Returns the children for the current node. - * - * Can be used offline but returns an empty array if children have not been retrieved yet. - * - * @return Zend_Ldap_Node_ChildrenIterator - * @throws Zend_Ldap_Exception - */ - public function getChildren() + } + + /** + * Returns the children for the current node. + * + * Can be used offline but returns an empty array if children have not been retrieved yet. + * + * @return Zend_Ldap_Node_ChildrenIterator + * @throws Zend_Ldap_Exception + */ + public function getChildren() { if (!is_array($this->_children)) { $this->_children = array(); @@ -1025,24 +1028,24 @@ class Zend_Ldap_Node extends Zend_Ldap_Node_Abstract implements Iterator, Recurs */ require_once 'Zend/Ldap/Node/ChildrenIterator.php'; return new Zend_Ldap_Node_ChildrenIterator($this->_children); - } - - /** - * Returns the parent of the current node. + } + + /** + * Returns the parent of the current node. * - * @param Zend_Ldap $ldap - * @return Zend_Ldap_Node - * @throws Zend_Ldap_Exception - */ - public function getParent(Zend_Ldap $ldap = null) + * @param Zend_Ldap $ldap + * @return Zend_Ldap_Node + * @throws Zend_Ldap_Exception + */ + public function getParent(Zend_Ldap $ldap = null) { if ($ldap !== null) { $this->attachLdap($ldap); } - $ldap = $this->getLdap(); - $parentDn = $this->_getDn()->getParentDn(1); - return self::fromLdap($parentDn, $ldap); - } + $ldap = $this->getLdap(); + $parentDn = $this->_getDn()->getParentDn(1); + return self::fromLdap($parentDn, $ldap); + } /** * Return the current attribute. diff --git a/libs/Zend/Ldap/Node/Abstract.php b/libs/Zend/Ldap/Node/Abstract.php index 3311d78..e0dd989 100644 --- a/libs/Zend/Ldap/Node/Abstract.php +++ b/libs/Zend/Ldap/Node/Abstract.php @@ -1,23 +1,23 @@ -_currentData); - } + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Node/ChildrenIterator.php b/libs/Zend/Ldap/Node/ChildrenIterator.php index a392c5c..d798a01 100644 --- a/libs/Zend/Ldap/Node/ChildrenIterator.php +++ b/libs/Zend/Ldap/Node/ChildrenIterator.php @@ -17,7 +17,7 @@ * @subpackage Node * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ChildrenIterator.php 13152 2008-12-11 11:28:02Z sgehrig $ + * @version $Id: ChildrenIterator.php 17829 2009-08-26 15:07:10Z sgehrig $ */ /** @@ -46,7 +46,7 @@ class Zend_Ldap_Node_ChildrenIterator implements Iterator, Countable, RecursiveI /** * Constructor. * - * @param array $data + * @param array $data * @return void */ public function __construct(array $data) diff --git a/libs/Zend/Ldap/Node/Collection.php b/libs/Zend/Ldap/Node/Collection.php index 05a444f..f8a8131 100644 --- a/libs/Zend/Ldap/Node/Collection.php +++ b/libs/Zend/Ldap/Node/Collection.php @@ -1,46 +1,46 @@ -attachLdap($this->_iterator->getLdap()); return $node; - } - - /** - * Return the child key (DN). - * Implements Iterator and RecursiveIterator - * - * @return string - */ - public function key() - { - return $this->_iterator->key(); - } + } + + /** + * Return the child key (DN). + * Implements Iterator and RecursiveIterator + * + * @return string + */ + public function key() + { + return $this->_iterator->key(); + } } \ No newline at end of file diff --git a/libs/Zend/Ldap/Node/RootDse.php b/libs/Zend/Ldap/Node/RootDse.php index 6c8abac..0b9bf90 100644 --- a/libs/Zend/Ldap/Node/RootDse.php +++ b/libs/Zend/Ldap/Node/RootDse.php @@ -1,46 +1,46 @@ -_namespaces); } + public function setZfPath($spec, $version = 'latest') + { + $path = $spec; + if (is_array($spec)) { + if (!isset($spec['path'])) { + throw new Zend_Loader_Exception('No path specified for ZF'); + } + $path = $spec['path']; + if (isset($spec['version'])) { + $version = $spec['version']; + } + } + + $this->_zfPath = $this->_getVersionPath($path, $version); + set_include_path(implode(PATH_SEPARATOR, array( + $this->_zfPath, + get_include_path(), + ))); + return $this; + } + + public function getZfPath() + { + return $this->_zfPath; + } + /** * Get or set the value of the "suppress not found warnings" flag - * - * @param null|bool $flag + * + * @param null|bool $flag * @return bool|Zend_Loader_Autoloader Returns boolean if no argument is passed, object instance otherwise */ public function suppressNotFoundWarnings($flag = null) @@ -265,8 +296,8 @@ class Zend_Loader_Autoloader /** * Indicate whether or not this autoloader should be a fallback autoloader - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Loader_Autoloader */ public function setFallbackAutoloader($flag) @@ -277,7 +308,7 @@ class Zend_Loader_Autoloader /** * Is this instance acting as a fallback autoloader? - * + * * @return bool */ public function isFallbackAutoloader() @@ -288,11 +319,11 @@ class Zend_Loader_Autoloader /** * Get autoloaders to use when matching class * - * Determines if the class matches a registered namespace, and, if so, - * returns only the autoloaders for that namespace. Otherwise, it returns + * Determines if the class matches a registered namespace, and, if so, + * returns only the autoloaders for that namespace. Otherwise, it returns * all non-namespaced autoloaders. * - * @param string $class + * @param string $class * @return array Array of autoloaders to use */ public function getClassAutoloaders($class) @@ -334,7 +365,7 @@ class Zend_Loader_Autoloader /** * Add an autoloader to the beginning of the stack - * + * * @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation * @param string|array $namespace Specific namespace(s) under which to register callback * @return Zend_Loader_Autoloader @@ -357,7 +388,7 @@ class Zend_Loader_Autoloader /** * Append an autoloader to the autoloader stack - * + * * @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation * @param string|array $namespace Specific namespace(s) under which to register callback * @return Zend_Loader_Autoloader @@ -380,7 +411,7 @@ class Zend_Loader_Autoloader /** * Remove an autoloader from the autoloader stack - * + * * @param object|array|string $callback PHP callback or Zend_Loader_Autoloader_Interface implementation * @param null|string|array $namespace Specific namespace(s) from which to remove autoloader * @return Zend_Loader_Autoloader @@ -418,7 +449,7 @@ class Zend_Loader_Autoloader * Constructor * * Registers instance with spl_autoload stack - * + * * @return void */ protected function __construct() @@ -429,8 +460,8 @@ class Zend_Loader_Autoloader /** * Internal autoloader implementation - * - * @param string $class + * + * @param string $class * @return bool */ protected function _autoload($class) @@ -450,9 +481,9 @@ class Zend_Loader_Autoloader /** * Set autoloaders for a specific namespace - * - * @param array $autoloaders - * @param string $namespace + * + * @param array $autoloaders + * @param string $namespace * @return Zend_Loader_Autoloader */ protected function _setNamespaceAutoloaders(array $autoloaders, $namespace = '') @@ -461,4 +492,93 @@ class Zend_Loader_Autoloader $this->_namespaceAutoloaders[$namespace] = $autoloaders; return $this; } + + /** + * Retrieve the filesystem path for the requested ZF version + * + * @param string $path + * @param string $version + * @return void + */ + protected function _getVersionPath($path, $version) + { + $type = $this->_getVersionType($version); + + if ($type == 'latest') { + $version = 'latest'; + } + + $availableVersions = $this->_getAvailableVersions($path, $version); + if (empty($availableVersions)) { + throw new Zend_Loader_Exception('No valid ZF installations discovered'); + } + + $matchedVersion = array_pop($availableVersions); + return $matchedVersion; + } + + /** + * Retrieve the ZF version type + * + * @param string $version + * @return string "latest", "major", "minor", or "specific" + * @throws Zend_Loader_Exception if version string contains too many dots + */ + protected function _getVersionType($version) + { + if (strtolower($version) == 'latest') { + return 'latest'; + } + + $parts = explode('.', $version); + $count = count($parts); + if (1 == $count) { + return 'major'; + } + if (2 == $count) { + return 'minor'; + } + if (3 < $count) { + throw new Zend_Loader_Exception('Invalid version string provided'); + } + return 'specific'; + } + + /** + * Get available versions for the version type requested + * + * @param string $path + * @param string $version + * @return array + */ + protected function _getAvailableVersions($path, $version) + { + if (!is_dir($path)) { + throw new Zend_Loader_Exception('Invalid ZF path provided'); + } + + $path = rtrim($path, '/'); + $path = rtrim($path, '\\'); + $versionLen = strlen($version); + $versions = array(); + $dirs = glob("$path/*", GLOB_ONLYDIR); + foreach ($dirs as $dir) { + $dirName = substr($dir, strlen($path) + 1); + if (!preg_match('/^(?:ZendFramework-)?(\d+\.\d+\.\d+((a|b|pl|pr|p|rc)\d+)?)(?:-minimal)?$/i', $dirName, $matches)) { + continue; + } + + $matchedVersion = $matches[1]; + + if (('latest' == $version) + || ((strlen($matchedVersion) >= $versionLen) + && (0 === strpos($matchedVersion, $version))) + ) { + $versions[$matchedVersion] = $dir . '/library'; + } + } + + uksort($versions, 'version_compare'); + return $versions; + } } diff --git a/libs/Zend/Loader/Autoloader/Interface.php b/libs/Zend/Loader/Autoloader/Interface.php index 09983ae..9e7ffca 100644 --- a/libs/Zend/Loader/Autoloader/Interface.php +++ b/libs/Zend/Loader/Autoloader/Interface.php @@ -16,13 +16,13 @@ * @package Zend_Loader * @subpackage Autoloader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Interface.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ /** * Autoloader interface - * + * * @package Zend_Loader * @subpackage Autoloader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) diff --git a/libs/Zend/Loader/Autoloader/Resource.php b/libs/Zend/Loader/Autoloader/Resource.php index 2acd1f4..b85e9e0 100644 --- a/libs/Zend/Loader/Autoloader/Resource.php +++ b/libs/Zend/Loader/Autoloader/Resource.php @@ -16,7 +16,7 @@ * @package Zend_Loader * @subpackage Autoloader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Resource.php 17417 2009-08-06 18:06:04Z matthew $ + * @version $Id: Resource.php 19190 2009-11-23 12:43:42Z bate $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -25,7 +25,7 @@ require_once 'Zend/Loader/Autoloader/Interface.php'; /** * Resource loader - * + * * @uses Zend_Loader_Autoloader_Interface * @package Zend_Loader * @subpackage Autoloader @@ -61,7 +61,7 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Constructor - * + * * @param array|Zend_Config $options Configuration options for resource autoloader * @return void */ @@ -94,7 +94,7 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Overloading: methods * - * Allow retrieving concrete resource object instances using 'get()' + * Allow retrieving concrete resource object instances using 'get()' * syntax. Example: * * $loader = new Zend_Loader_Autoloader_Resource(array( @@ -105,9 +105,9 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac * * $foo = $loader->getModel('Foo'); // get instance of Stuff_Model_Foo class * - * - * @param string $method - * @param array $args + * + * @param string $method + * @param array $args * @return mixed * @throws Zend_Loader_Exception if method not beginning with 'get' or not matching a valid resource type is called */ @@ -132,12 +132,12 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac } /** - * Attempt to autoload a class - * - * @param string $class - * @return mixed False if not matched, otherwise result if include operation + * Helper method to calculate the correct class path + * + * @param string $class + * @return False if not matched other wise the correct path */ - public function autoload($class) + public function getClassPath($class) { $segments = explode('_', $class); $namespaceTopLevel = $this->getNamespace(); @@ -171,15 +171,36 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac return false; } - $final = substr($class, strlen($lastMatch)); + $final = substr($class, strlen($lastMatch) + 1); $path = $this->_components[$lastMatch]; - return include $path . '/' . str_replace('_', '/', $final) . '.php'; + $classPath = $path . '/' . str_replace('_', '/', $final) . '.php'; + + if (Zend_Loader::isReadable($classPath)) { + return $classPath; + } + + return false; + } + + /** + * Attempt to autoload a class + * + * @param string $class + * @return mixed False if not matched, otherwise result if include operation + */ + public function autoload($class) + { + $classPath = $this->getClassPath($class); + if (false !== $classPath) { + return include $classPath; + } + return false; } /** * Set class state from options - * - * @param array $options + * + * @param array $options * @return Zend_Loader_Autoloader_Resource */ public function setOptions(array $options) @@ -196,8 +217,8 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Set namespace that this autoloader handles - * - * @param string $namespace + * + * @param string $namespace * @return Zend_Loader_Autoloader_Resource */ public function setNamespace($namespace) @@ -208,7 +229,7 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Get namespace this autoloader handles - * + * * @return string */ public function getNamespace() @@ -218,8 +239,8 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Set base path for this set of resources - * - * @param string $path + * + * @param string $path * @return Zend_Loader_Autoloader_Resource */ public function setBasePath($path) @@ -227,10 +248,10 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac $this->_basePath = (string) $path; return $this; } - + /** * Get base path to this set of resources - * + * * @return string */ public function getBasePath() @@ -240,7 +261,7 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Add resource type - * + * * @param string $type identifier for the resource type being loaded * @param string $path path relative to resource base path containing the resource types * @param null|string $namespace sub-component namespace to append to base namespace that qualifies this resource type @@ -264,7 +285,7 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac require_once 'Zend/Loader/Exception.php'; throw new Zend_Loader_Exception('Invalid path specification provided; must be string'); } - $this->_resourceTypes[$type]['path'] = $this->getBasePath() . '/' . $path; + $this->_resourceTypes[$type]['path'] = $this->getBasePath() . '/' . rtrim($path, '\/'); $component = $this->_resourceTypes[$type]['namespace']; $this->_components[$component] = $this->_resourceTypes[$type]['path']; @@ -274,10 +295,10 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Add multiple resources at once * - * $types should be an associative array of resource type => specification - * pairs. Each specification should be an associative array containing - * minimally the 'path' key (specifying the path relative to the resource - * base path) and optionally the 'namespace' key (indicating the subcomponent + * $types should be an associative array of resource type => specification + * pairs. Each specification should be an associative array containing + * minimally the 'path' key (specifying the path relative to the resource + * base path) and optionally the 'namespace' key (indicating the subcomponent * namespace to append to the resource namespace). * * As an example: @@ -293,8 +314,8 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac * ), * )); * - * - * @param array $types + * + * @param array $types * @return Zend_Loader_Autoloader_Resource */ public function addResourceTypes(array $types) @@ -320,9 +341,9 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Overwrite existing and set multiple resource types at once - * + * * @see Zend_Loader_Autoloader_Resource::addResourceTypes() - * @param array $types + * @param array $types * @return Zend_Loader_Autoloader_Resource */ public function setResourceTypes(array $types) @@ -333,7 +354,7 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Retrieve resource type mappings - * + * * @return array */ public function getResourceTypes() @@ -343,8 +364,8 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Is the requested resource type defined? - * - * @param string $type + * + * @param string $type * @return bool */ public function hasResourceType($type) @@ -354,8 +375,8 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Remove the requested resource type - * - * @param string $type + * + * @param string $type * @return Zend_Loader_Autoloader_Resource */ public function removeResourceType($type) @@ -370,7 +391,7 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Clear all resource types - * + * * @return Zend_Loader_Autoloader_Resource */ public function clearResourceTypes() @@ -382,8 +403,8 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Set default resource type to use when calling load() - * - * @param string $type + * + * @param string $type * @return Zend_Loader_Autoloader_Resource */ public function setDefaultResourceType($type) @@ -396,7 +417,7 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Get default resource type to use when calling load() - * + * * @return string|null */ public function getDefaultResourceType() @@ -407,12 +428,12 @@ class Zend_Loader_Autoloader_Resource implements Zend_Loader_Autoloader_Interfac /** * Object registry and factory * - * Loads the requested resource of type $type (or uses the default resource - * type if none provided). If the resource has been loaded previously, + * Loads the requested resource of type $type (or uses the default resource + * type if none provided). If the resource has been loaded previously, * returns the previous instance; otherwise, instantiates it. - * - * @param string $resource - * @param string $type + * + * @param string $resource + * @param string $type * @return object * @throws Zend_Loader_Exception if resource type not specified or invalid */ diff --git a/libs/Zend/Loader/Exception.php b/libs/Zend/Loader/Exception.php index b414dc8..0342064 100644 --- a/libs/Zend/Loader/Exception.php +++ b/libs/Zend/Loader/Exception.php @@ -16,7 +16,7 @@ * @package Zend_Loader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,5 +31,5 @@ require_once 'Zend/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Loader_Exception extends Zend_Exception +class Zend_Loader_Exception extends Zend_Exception {} \ No newline at end of file diff --git a/libs/Zend/Loader/PluginLoader.php b/libs/Zend/Loader/PluginLoader.php index 6cae064..d440762 100644 --- a/libs/Zend/Loader/PluginLoader.php +++ b/libs/Zend/Loader/PluginLoader.php @@ -17,7 +17,7 @@ * @subpackage PluginLoader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PluginLoader.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: PluginLoader.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Loader_PluginLoader_Interface */ @@ -123,9 +123,9 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface */ protected function _formatPrefix($prefix) { - if($prefix == "") { - return $prefix; - } + if($prefix == "") { + return $prefix; + } return rtrim($prefix, '_') . '_'; } @@ -149,7 +149,12 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface if ($this->_useStaticRegistry) { self::$_staticPrefixToPaths[$this->_useStaticRegistry][$prefix][] = $path; } else { - $this->_prefixToPaths[$prefix][] = $path; + if (!isset($this->_prefixToPaths[$prefix])) { + $this->_prefixToPaths[$prefix] = array(); + } + if (!in_array($path, $this->_prefixToPaths[$prefix])) { + $this->_prefixToPaths[$prefix][] = $path; + } } return $this; } @@ -293,7 +298,7 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface public function getClassName($name) { $name = $this->_formatName($name); - if ($this->_useStaticRegistry + if ($this->_useStaticRegistry && isset(self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name]) ) { return self::$_staticLoadedPlugins[$this->_useStaticRegistry][$name]; @@ -306,14 +311,14 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface /** * Get path to plugin class - * - * @param mixed $name + * + * @param mixed $name * @return string|false False if not found */ public function getClassPath($name) { $name = $this->_formatName($name); - if ($this->_useStaticRegistry + if ($this->_useStaticRegistry && !empty(self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name]) ) { return self::$_staticLoadedPluginPaths[$this->_useStaticRegistry][$name]; @@ -340,9 +345,9 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface * Load a plugin via the name provided * * @param string $name - * @param bool $throwExceptions Whether or not to throw exceptions if the + * @param bool $throwExceptions Whether or not to throw exceptions if the * class is not resolved - * @return string|false Class name of loaded class; false if $throwExceptions + * @return string|false Class name of loaded class; false if $throwExceptions * if false and no class found * @throws Zend_Loader_Exception if class not found */ @@ -414,10 +419,10 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface /** * Set path to class file cache * - * Specify a path to a file that will add include_once statements for each + * Specify a path to a file that will add include_once statements for each * plugin class loaded. This is an opt-in feature for performance purposes. - * - * @param string $file + * + * @param string $file * @return void * @throws Zend_Loader_PluginLoader_Exception if file is not writeable or path does not exist */ @@ -446,7 +451,7 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface /** * Retrieve class file cache path - * + * * @return string|null */ public static function getIncludeFileCache() @@ -456,8 +461,8 @@ class Zend_Loader_PluginLoader implements Zend_Loader_PluginLoader_Interface /** * Append an include_once statement to the class file cache - * - * @param string $incFile + * + * @param string $incFile * @return void */ protected static function _appendIncFile($incFile) diff --git a/libs/Zend/Loader/PluginLoader/Interface.php b/libs/Zend/Loader/PluginLoader/Interface.php index 67da668..cdefa10 100644 --- a/libs/Zend/Loader/PluginLoader/Interface.php +++ b/libs/Zend/Loader/PluginLoader/Interface.php @@ -17,7 +17,7 @@ * @subpackage PluginLoader * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,7 +39,7 @@ interface Zend_Loader_PluginLoader_Interface * @return Zend_Loader_PluginLoader */ public function addPrefixPath($prefix, $path); - + /** * Remove a prefix (or prefixed-path) from the registry * @@ -48,7 +48,7 @@ interface Zend_Loader_PluginLoader_Interface * @return Zend_Loader_PluginLoader */ public function removePrefixPath($prefix, $path = null); - + /** * Whether or not a Helper by a specific name * @@ -64,7 +64,7 @@ interface Zend_Loader_PluginLoader_Interface * @return string */ public function getClassName($name); - + /** * Load a helper via the name provided * diff --git a/libs/Zend/Locale/Format.php b/libs/Zend/Locale/Format.php index 12fb033..bbd79ee 100644 --- a/libs/Zend/Locale/Format.php +++ b/libs/Zend/Locale/Format.php @@ -16,7 +16,7 @@ * @package Zend_Locale * @subpackage Format * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Format.php 17080 2009-07-25 21:14:29Z thomas $ + * @version $Id: Format.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -319,6 +319,9 @@ class Zend_Locale_Format } } else { // seperate negative format pattern when available + // @todo: The below conditional is a repeat of logic in the + // previous conditional; it should be refactored to a protected + // method to prevent code duplication. if (iconv_strpos($format, ';') !== false) { if (call_user_func(Zend_Locale_Math::$comp, $value, 0, $options['precision']) < 0) { $tmpformat = iconv_substr($format, iconv_strpos($format, ';') + 1); @@ -335,6 +338,9 @@ class Zend_Locale_Format if (strpos($format, '.')) { if (is_numeric($options['precision'])) { $value = Zend_Locale_Math::round($value, $options['precision']); + // Need to "floatalize" the number; when precision > 4 + // and bcmath disabled, round() returns scientific notation + $value = self::_floatalize($value); } else { if (substr($format, iconv_strpos($format, '.') + 1, 3) == '###') { $options['precision'] = null; @@ -347,6 +353,9 @@ class Zend_Locale_Format } } else { $value = Zend_Locale_Math::round($value, 0); + // Need to "floatalize" the number; when precision > 4 + // and bcmath disabled, round() returns scientific notation + $value = self::_floatalize($value); $options['precision'] = 0; } $value = Zend_Locale_Math::normalize($value); diff --git a/libs/Zend/Log.php b/libs/Zend/Log.php index 04b7ebb..4e5c96f 100644 --- a/libs/Zend/Log.php +++ b/libs/Zend/Log.php @@ -16,7 +16,7 @@ * @package Zend_Log * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Log.php 16207 2009-06-21 19:17:51Z thomas $ + * @version $Id: Log.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -24,7 +24,7 @@ * @package Zend_Log * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Log.php 16207 2009-06-21 19:17:51Z thomas $ + * @version $Id: Log.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Log { @@ -184,7 +184,7 @@ class Zend_Log public function addFilter($filter) { if (is_integer($filter)) { - /** @see Zend_Log_Filter_Priority */ + /** @see Zend_Log_Filter_Priority */ require_once 'Zend/Log/Filter/Priority.php'; $filter = new Zend_Log_Filter_Priority($filter); } elseif(!is_object($filter) || ! $filter instanceof Zend_Log_Filter_Interface) { diff --git a/libs/Zend/Log/Formatter/Firebug.php b/libs/Zend/Log/Formatter/Firebug.php index 2d348d0..a5a672e 100644 --- a/libs/Zend/Log/Formatter/Firebug.php +++ b/libs/Zend/Log/Formatter/Firebug.php @@ -17,7 +17,7 @@ * @subpackage Formatter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Firebug.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Firebug.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Log_Formatter_Interface */ @@ -34,8 +34,8 @@ class Zend_Log_Formatter_Firebug implements Zend_Log_Formatter_Interface { /** * This method formats the event for the firebug writer. - * - * The default is to just send the message parameter, but through + * + * The default is to just send the message parameter, but through * extension of this class and calling the * {@see Zend_Log_Writer_Firebug::setFormatter()} method you can * pass as much of the event data as you are interested in. diff --git a/libs/Zend/Log/Writer/Firebug.php b/libs/Zend/Log/Writer/Firebug.php index 49eeae9..54616d5 100644 --- a/libs/Zend/Log/Writer/Firebug.php +++ b/libs/Zend/Log/Writer/Firebug.php @@ -17,7 +17,7 @@ * @subpackage Writer * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Firebug.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Firebug.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Log */ @@ -34,7 +34,7 @@ require_once 'Zend/Wildfire/Plugin/FirePhp.php'; /** * Writes log messages to the Firebug Console via FirePHP. - * + * * @category Zend * @package Zend_Log * @subpackage Writer @@ -56,19 +56,19 @@ class Zend_Log_Writer_Firebug extends Zend_Log_Writer_Abstract Zend_Log::NOTICE => Zend_Wildfire_Plugin_FirePhp::INFO, Zend_Log::INFO => Zend_Wildfire_Plugin_FirePhp::INFO, Zend_Log::DEBUG => Zend_Wildfire_Plugin_FirePhp::LOG); - + /** * The default logging style for un-mapped priorities * @var string - */ + */ protected $_defaultPriorityStyle = Zend_Wildfire_Plugin_FirePhp::LOG; - + /** * Flag indicating whether the log writer is enabled * @var boolean */ protected $_enabled = true; - + /** * Class constructor */ @@ -77,14 +77,14 @@ class Zend_Log_Writer_Firebug extends Zend_Log_Writer_Abstract if (php_sapi_name()=='cli') { $this->setEnabled(false); } - + $this->_formatter = new Zend_Log_Formatter_Firebug(); } - + /** * Enable or disable the log writer. - * - * @param boolean $enabled Set to TRUE to enable the log writer + * + * @param boolean $enabled Set to TRUE to enable the log writer * @return boolean The previous value. */ public function setEnabled($enabled) @@ -93,43 +93,43 @@ class Zend_Log_Writer_Firebug extends Zend_Log_Writer_Abstract $this->_enabled = $enabled; return $previous; } - + /** * Determine if the log writer is enabled. - * + * * @return boolean Returns TRUE if the log writer is enabled. */ public function getEnabled() { return $this->_enabled; } - + /** * Set the default display style for user-defined priorities - * + * * @param string $style The default log display style * @return string Returns previous default log display style - */ + */ public function setDefaultPriorityStyle($style) { $previous = $this->_defaultPriorityStyle; $this->_defaultPriorityStyle = $style; return $previous; } - + /** * Get the default display style for user-defined priorities - * + * * @return string Returns the default log display style - */ + */ public function getDefaultPriorityStyle() { return $this->_defaultPriorityStyle; } - + /** * Set a display style for a logging priority - * + * * @param int $priority The logging priority * @param string $style The logging display style * @return string|boolean The previous logging display style if defined or TRUE otherwise @@ -146,7 +146,7 @@ class Zend_Log_Writer_Firebug extends Zend_Log_Writer_Abstract /** * Get a display style for a logging priority - * + * * @param int $priority The logging priority * @return string|boolean The logging display style if defined or FALSE otherwise */ @@ -169,15 +169,15 @@ class Zend_Log_Writer_Firebug extends Zend_Log_Writer_Abstract if (!$this->getEnabled()) { return; } - + if (array_key_exists($event['priority'],$this->_priorityStyles)) { $type = $this->_priorityStyles[$event['priority']]; } else { $type = $this->_defaultPriorityStyle; } - + $message = $this->_formatter->format($event); - + $label = isset($event['firebugLabel'])?$event['firebugLabel']:null; Zend_Wildfire_Plugin_FirePhp::getInstance()->send($message, diff --git a/libs/Zend/Mail.php b/libs/Zend/Mail.php index ca3641e..ededed8 100644 --- a/libs/Zend/Mail.php +++ b/libs/Zend/Mail.php @@ -16,7 +16,7 @@ * @package Zend_Mail * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Mail.php 16207 2009-06-21 19:17:51Z thomas $ + * @version $Id: Mail.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -458,7 +458,7 @@ class Zend_Mail extends Zend_Mime_Message */ protected function _encodeHeader($value) { - if (Zend_Mime::isPrintable($value) === false) { + if (Zend_Mime::isPrintable($value) === false) { if ($this->getHeaderEncoding() === Zend_Mime::ENCODING_QUOTEDPRINTABLE) { $value = Zend_Mime::encodeQuotedPrintableHeader($value, $this->getCharset(), Zend_Mime::LINELENGTH, Zend_Mime::LINEEND); } else { @@ -763,22 +763,22 @@ class Zend_Mail extends Zend_Mime_Message } else if (is_string($date)) { $date = strtotime($date); if ($date === false || $date < 0) { - /** - * @see Zend_Mail_Exception - */ - require_once 'Zend/Mail/Exception.php'; - throw new Zend_Mail_Exception('String representations of Date Header must be ' . + /** + * @see Zend_Mail_Exception + */ + require_once 'Zend/Mail/Exception.php'; + throw new Zend_Mail_Exception('String representations of Date Header must be ' . 'strtotime()-compatible'); } $date = date('r', $date); } else if ($date instanceof Zend_Date) { $date = $date->get(Zend_Date::RFC_2822); } else { - /** - * @see Zend_Mail_Exception - */ - require_once 'Zend/Mail/Exception.php'; - throw new Zend_Mail_Exception(__METHOD__ . ' only accepts UNIX timestamps, Zend_Date objects, ' . + /** + * @see Zend_Mail_Exception + */ + require_once 'Zend/Mail/Exception.php'; + throw new Zend_Mail_Exception(__METHOD__ . ' only accepts UNIX timestamps, Zend_Date objects, ' . ' and strtotime()-compatible strings'); } $this->_date = $date; @@ -787,8 +787,8 @@ class Zend_Mail extends Zend_Mime_Message /** * @see Zend_Mail_Exception */ - require_once 'Zend/Mail/Exception.php'; - throw new Zend_Mail_Exception('Date Header set twice'); + require_once 'Zend/Mail/Exception.php'; + throw new Zend_Mail_Exception('Date Header set twice'); } return $this; } @@ -829,14 +829,14 @@ class Zend_Mail extends Zend_Mime_Message */ public function setMessageId($id = true) { - if ($id === null || $id === false) { - return $this; - } elseif ($id === true) { + if ($id === null || $id === false) { + return $this; + } elseif ($id === true) { $id = $this->createMessageId(); - } + } if ($this->_messageId === null) { - $id = $this->_filterOther($id); + $id = $this->_filterOther($id); $this->_messageId = $id; $this->_storeHeader('Message-Id', $this->_messageId); } else { @@ -884,25 +884,25 @@ class Zend_Mail extends Zend_Mime_Message $time = time(); if ($this->_from !== null) { - $user = $this->_from; + $user = $this->_from; } elseif (isset($_SERVER['REMOTE_ADDR'])) { - $user = $_SERVER['REMOTE_ADDR']; + $user = $_SERVER['REMOTE_ADDR']; } else { - $user = getmypid(); + $user = getmypid(); } - $rand = mt_rand(); + $rand = mt_rand(); - if ($this->_recipients !== array()) { + if ($this->_recipients !== array()) { $recipient = array_rand($this->_recipients); - } else { - $recipient = 'unknown'; - } + } else { + $recipient = 'unknown'; + } - if (isset($_SERVER["SERVER_NAME"])) { + if (isset($_SERVER["SERVER_NAME"])) { $hostName = $_SERVER["SERVER_NAME"]; } else { - $hostName = php_uname('n'); + $hostName = php_uname('n'); } return sha1($time . $user . $rand . $recipient) . '@' . $hostName; @@ -983,14 +983,14 @@ class Zend_Mail extends Zend_Mime_Message */ protected function _filterEmail($email) { - $rule = array("\r" => '', - "\n" => '', - "\t" => '', + $rule = array("\r" => '', + "\n" => '', + "\t" => '', '"' => '', - ',' => '', + ',' => '', '<' => '', '>' => '', - ); + ); return strtr($email, $rule); } @@ -1003,13 +1003,13 @@ class Zend_Mail extends Zend_Mime_Message */ protected function _filterName($name) { - $rule = array("\r" => '', + $rule = array("\r" => '', "\n" => '', "\t" => '', '"' => "'", '<' => '[', - '>' => ']', - ); + '>' => ']', + ); return trim(strtr($name, $rule)); } diff --git a/libs/Zend/Mail/Message/File.php b/libs/Zend/Mail/Message/File.php index 6d621ae..7d8ab49 100644 --- a/libs/Zend/Mail/Message/File.php +++ b/libs/Zend/Mail/Message/File.php @@ -16,7 +16,7 @@ * @package Zend_Mail * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: File.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: File.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -59,7 +59,7 @@ class Zend_Mail_Message_File extends Zend_Mail_Part_File implements Zend_Mail_Me // set key and value to the same value for easy lookup $this->_flags = array_combine($params['flags'], $params['flags']); } - + parent::__construct($params); } diff --git a/libs/Zend/Mail/Message/Interface.php b/libs/Zend/Mail/Message/Interface.php index a9752a3..ce46455 100644 --- a/libs/Zend/Mail/Message/Interface.php +++ b/libs/Zend/Mail/Message/Interface.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Part.php b/libs/Zend/Mail/Part.php index 4541a5a..dce238f 100644 --- a/libs/Zend/Mail/Part.php +++ b/libs/Zend/Mail/Part.php @@ -16,7 +16,7 @@ * @package Zend_Mail * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Part.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Part.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -381,7 +381,7 @@ class Zend_Mail_Part implements RecursiveIterator, Zend_Mail_Part_Interface return false; } } - + /** * Get a specific field from a header like content type or all fields as array * diff --git a/libs/Zend/Mail/Part/File.php b/libs/Zend/Mail/Part/File.php index efa0538..75c690b 100644 --- a/libs/Zend/Mail/Part/File.php +++ b/libs/Zend/Mail/Part/File.php @@ -16,7 +16,7 @@ * @package Zend_Mail * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: File.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: File.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -63,7 +63,7 @@ class Zend_Mail_Part_File extends Zend_Mail_Part require_once 'Zend/Mail/Exception.php'; throw new Zend_Mail_Exception('no file given in params'); } - + if (!is_resource($params['file'])) { $this->_fh = fopen($params['file'], 'r'); } else { @@ -86,7 +86,7 @@ class Zend_Mail_Part_File extends Zend_Mail_Part } Zend_Mime_Decode::splitMessage($header, $this->_headers, $null); - + $this->_contentPos[0] = ftell($this->_fh); if ($endPos !== null) { $this->_contentPos[1] = $endPos; @@ -97,7 +97,7 @@ class Zend_Mail_Part_File extends Zend_Mail_Part if (!$this->isMultipart()) { return; } - + $boundary = $this->getHeaderField('content-type', 'boundary'); if (!$boundary) { /** @@ -106,7 +106,7 @@ class Zend_Mail_Part_File extends Zend_Mail_Part require_once 'Zend/Mail/Exception.php'; throw new Zend_Mail_Exception('no boundary found in content type to split message'); } - + $part = array(); $pos = $this->_contentPos[0]; fseek($this->_fh, $pos); @@ -141,7 +141,7 @@ class Zend_Mail_Part_File extends Zend_Mail_Part } } $this->_countParts = count($this->_partPos); - + } @@ -157,7 +157,7 @@ class Zend_Mail_Part_File extends Zend_Mail_Part { fseek($this->_fh, $this->_contentPos[0]); if ($stream !== null) { - return stream_copy_to_stream($this->_fh, $stream, $this->_contentPos[1] - $this->_contentPos[0]); + return stream_copy_to_stream($this->_fh, $stream, $this->_contentPos[1] - $this->_contentPos[0]); } $length = $this->_contentPos[1] - $this->_contentPos[0]; return $length < 1 ? '' : fread($this->_fh, $length); @@ -192,7 +192,7 @@ class Zend_Mail_Part_File extends Zend_Mail_Part throw new Zend_Mail_Exception('part not found'); } - return new self(array('file' => $this->_fh, 'startPos' => $this->_partPos[$num][0], + return new self(array('file' => $this->_fh, 'startPos' => $this->_partPos[$num][0], 'endPos' => $this->_partPos[$num][1])); } } diff --git a/libs/Zend/Mail/Part/Interface.php b/libs/Zend/Mail/Part/Interface.php index 46cc4b0..d4c57bf 100644 --- a/libs/Zend/Mail/Part/Interface.php +++ b/libs/Zend/Mail/Part/Interface.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -95,7 +95,7 @@ interface Zend_Mail_Part_Interface extends RecursiveIterator * @throws Zend_Mail_Exception */ public function getHeader($name, $format = null); - + /** * Get a specific field from a header like content type or all fields as array * diff --git a/libs/Zend/Mail/Protocol/Abstract.php b/libs/Zend/Mail/Protocol/Abstract.php index 4ef5792..914d002 100644 --- a/libs/Zend/Mail/Protocol/Abstract.php +++ b/libs/Zend/Mail/Protocol/Abstract.php @@ -12,13 +12,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -38,13 +38,13 @@ require_once 'Zend/Validate/Hostname.php'; * Zend_Mail_Protocol_Abstract * * Provides low-level methods for concrete adapters to communicate with a remote mail server and track requests and responses. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ * @todo Implement proxy settings */ abstract class Zend_Mail_Protocol_Abstract diff --git a/libs/Zend/Mail/Protocol/Exception.php b/libs/Zend/Mail/Protocol/Exception.php index 117cafb..dc0aee0 100644 --- a/libs/Zend/Mail/Protocol/Exception.php +++ b/libs/Zend/Mail/Protocol/Exception.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Protocol/Imap.php b/libs/Zend/Mail/Protocol/Imap.php index 8aad419..b0da4f4 100644 --- a/libs/Zend/Mail/Protocol/Imap.php +++ b/libs/Zend/Mail/Protocol/Imap.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Imap.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Imap.php 18977 2009-11-14 14:15:59Z yoshida@zend.co.jp $ */ @@ -34,7 +34,7 @@ class Zend_Mail_Protocol_Imap * Default timeout in seconds for initiating session */ const TIMEOUT_CONNECTION = 30; - + /** * socket to imap server * @var resource|null @@ -50,7 +50,7 @@ class Zend_Mail_Protocol_Imap /** * Public constructor * - * @param string $host hostname of IP address of IMAP server, if given connect() is called + * @param string $host hostname or IP address of IMAP server, if given connect() is called * @param int|null $port port of IMAP server, null for default (143 or 993 for ssl) * @param bool $ssl use ssl? 'SSL', 'TLS' or false * @throws Zend_Mail_Protocol_Exception @@ -71,9 +71,9 @@ class Zend_Mail_Protocol_Imap } /** - * Open connection to POP3 server + * Open connection to IMAP server * - * @param string $host hostname of IP address of POP3 server + * @param string $host hostname or IP address of IMAP server * @param int|null $port of IMAP server, default is 143 (993 for ssl) * @param string|bool $ssl use 'SSL', 'TLS' or false * @return string welcome message @@ -97,7 +97,8 @@ class Zend_Mail_Protocol_Imap * @see Zend_Mail_Protocol_Exception */ require_once 'Zend/Mail/Protocol/Exception.php'; - throw new Zend_Mail_Protocol_Exception('cannot connect to host : ' . $errno . ' : ' . $errstr); + throw new Zend_Mail_Protocol_Exception('cannot connect to host; error = ' . $errstr . + ' (errno = ' . $errno . ' )'); } if (!$this->_assumedNextLine('* OK')) { @@ -195,8 +196,8 @@ class Zend_Mail_Protocol_Imap "foo" baz {3}bar ("f\\\"oo" bar) would be returned as: array('foo', 'baz', 'bar', array('f\\\"oo', 'bar')); - - // TODO: add handling of '[' and ']' to parser for easier handling of response text + + // TODO: add handling of '[' and ']' to parser for easier handling of response text */ // replace any trailling including spaces with a single space $line = rtrim($line) . ' '; @@ -208,7 +209,7 @@ class Zend_Mail_Protocol_Imap $token = substr($token, 1); } if ($token[0] == '"') { - if (preg_match('%^"((.|\\\\|\\")*?)" *%', $line, $matches)) { + if (preg_match('%^\(*"((.|\\\\|\\")*?)" *%', $line, $matches)) { $tokens[] = $matches[1]; $line = substr($line, strlen($matches[0])); continue; @@ -241,8 +242,8 @@ class Zend_Mail_Protocol_Imap // only count braces if more than one $braces -= strlen($token) + 1; // only add if token had more than just closing braces - if ($token) { - $tokens[] = $token; + if (rtrim($token) != '') { + $tokens[] = rtrim($token); } $token = $tokens; $tokens = array_pop($stack); @@ -824,7 +825,7 @@ class Zend_Mail_Protocol_Imap if (!$response) { return $response; } - + foreach ($response as $ids) { if ($ids[0] == 'SEARCH') { array_shift($ids); diff --git a/libs/Zend/Mail/Protocol/Pop3.php b/libs/Zend/Mail/Protocol/Pop3.php index cc7d5b2..5bf3287 100644 --- a/libs/Zend/Mail/Protocol/Pop3.php +++ b/libs/Zend/Mail/Protocol/Pop3.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Pop3.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Pop3.php 18731 2009-10-29 04:18:19Z yoshida@zend.co.jp $ */ @@ -34,7 +34,7 @@ class Zend_Mail_Protocol_Pop3 * Default timeout in seconds for initiating session */ const TIMEOUT_CONNECTION = 30; - + /** * saves if server supports top * @var null|bool @@ -57,7 +57,7 @@ class Zend_Mail_Protocol_Pop3 /** * Public constructor * - * @param string $host hostname of IP address of POP3 server, if given connect() is called + * @param string $host hostname or IP address of POP3 server, if given connect() is called * @param int|null $port port of POP3 server, null for default (110 or 995 for ssl) * @param bool|string $ssl use ssl? 'SSL', 'TLS' or false * @throws Zend_Mail_Protocol_Exception @@ -82,7 +82,7 @@ class Zend_Mail_Protocol_Pop3 /** * Open connection to POP3 server * - * @param string $host hostname of IP address of POP3 server + * @param string $host hostname or IP address of POP3 server * @param int|null $port of POP3 server, default is 110 (995 for ssl) * @param string|bool $ssl use 'SSL', 'TLS' or false * @return string welcome message @@ -106,7 +106,8 @@ class Zend_Mail_Protocol_Pop3 * @see Zend_Mail_Protocol_Exception */ require_once 'Zend/Mail/Protocol/Exception.php'; - throw new Zend_Mail_Protocol_Exception('cannot connect to host : ' . $errno . ' : ' . $errstr); + throw new Zend_Mail_Protocol_Exception('cannot connect to host; error = ' . $errstr . + ' (errno = ' . $errno . ' )'); } $welcome = $this->readResponse(); diff --git a/libs/Zend/Mail/Protocol/Smtp.php b/libs/Zend/Mail/Protocol/Smtp.php index 819b895..527f821 100644 --- a/libs/Zend/Mail/Protocol/Smtp.php +++ b/libs/Zend/Mail/Protocol/Smtp.php @@ -12,13 +12,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Smtp.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Smtp.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -38,7 +38,7 @@ require_once 'Zend/Mail/Protocol/Abstract.php'; * Smtp implementation of Zend_Mail_Protocol_Abstract * * Minimum implementation according to RFC2821: EHLO, MAIL FROM, RCPT TO, DATA, RSET, NOOP, QUIT - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol diff --git a/libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php b/libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php index ec5594e..955cbaf 100644 --- a/libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php +++ b/libs/Zend/Mail/Protocol/Smtp/Auth/Crammd5.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Crammd5.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Crammd5.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Protocol/Smtp/Auth/Login.php b/libs/Zend/Mail/Protocol/Smtp/Auth/Login.php index a624792..08cbbce 100644 --- a/libs/Zend/Mail/Protocol/Smtp/Auth/Login.php +++ b/libs/Zend/Mail/Protocol/Smtp/Auth/Login.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Login.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Login.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php b/libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php index 26e65d3..698acd9 100644 --- a/libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php +++ b/libs/Zend/Mail/Protocol/Smtp/Auth/Plain.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Protocol * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Plain.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Plain.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Storage/Abstract.php b/libs/Zend/Mail/Storage/Abstract.php index 052654b..fe59ee1 100644 --- a/libs/Zend/Mail/Storage/Abstract.php +++ b/libs/Zend/Mail/Storage/Abstract.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -78,7 +78,7 @@ abstract class Zend_Mail_Storage_Abstract implements Countable, ArrayAccess, See $var = strtolower(substr($var, 3)); return isset($this->_has[$var]) ? $this->_has[$var] : null; } - + /** * @see Zend_Mail_Storage_Exception */ diff --git a/libs/Zend/Mail/Storage/Exception.php b/libs/Zend/Mail/Storage/Exception.php index 497ab2c..1cd80b3 100644 --- a/libs/Zend/Mail/Storage/Exception.php +++ b/libs/Zend/Mail/Storage/Exception.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Storage/Folder.php b/libs/Zend/Mail/Storage/Folder.php index 1fc9641..146d80d 100644 --- a/libs/Zend/Mail/Storage/Folder.php +++ b/libs/Zend/Mail/Storage/Folder.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Folder.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Folder.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Storage/Folder/Interface.php b/libs/Zend/Mail/Storage/Folder/Interface.php index 683dc22..7b70ec8 100644 --- a/libs/Zend/Mail/Storage/Folder/Interface.php +++ b/libs/Zend/Mail/Storage/Folder/Interface.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Storage/Folder/Maildir.php b/libs/Zend/Mail/Storage/Folder/Maildir.php index c2bf340..d53cde6 100644 --- a/libs/Zend/Mail/Storage/Folder/Maildir.php +++ b/libs/Zend/Mail/Storage/Folder/Maildir.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Maildir.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Maildir.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Storage/Folder/Mbox.php b/libs/Zend/Mail/Storage/Folder/Mbox.php index e942322..ca097dd 100644 --- a/libs/Zend/Mail/Storage/Folder/Mbox.php +++ b/libs/Zend/Mail/Storage/Folder/Mbox.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Mbox.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Mbox.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Storage/Imap.php b/libs/Zend/Mail/Storage/Imap.php index 2495e90..ae6eb2d 100644 --- a/libs/Zend/Mail/Storage/Imap.php +++ b/libs/Zend/Mail/Storage/Imap.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Imap.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Imap.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -123,7 +123,7 @@ class Zend_Mail_Storage_Imap extends Zend_Mail_Storage_Abstract if ($flags === null) { return count($this->_protocol->search(array('ALL'))); } - + $params = array(); foreach ((array)$flags as $flag) { if (isset(self::$_searchFlags[$flag])) { diff --git a/libs/Zend/Mail/Storage/Maildir.php b/libs/Zend/Mail/Storage/Maildir.php index 3954db4..669d24c 100644 --- a/libs/Zend/Mail/Storage/Maildir.php +++ b/libs/Zend/Mail/Storage/Maildir.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Maildir.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Maildir.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -71,7 +71,7 @@ class Zend_Mail_Storage_Maildir extends Zend_Mail_Storage_Abstract 'R' => Zend_Mail_Storage::FLAG_ANSWERED, 'S' => Zend_Mail_Storage::FLAG_SEEN, 'T' => Zend_Mail_Storage::FLAG_DELETED); - + // TODO: getFlags($id) for fast access if headers are not needed (i.e. just setting flags)? /** @@ -86,7 +86,7 @@ class Zend_Mail_Storage_Maildir extends Zend_Mail_Storage_Abstract return count($this->_files); } - $count = 0; + $count = 0; if (!is_array($flags)) { foreach ($this->_files as $file) { if (isset($file['flaglookup'][$flags])) { @@ -95,7 +95,7 @@ class Zend_Mail_Storage_Maildir extends Zend_Mail_Storage_Abstract } return $count; } - + $flags = array_flip($flags); foreach ($this->_files as $file) { foreach ($flags as $flag => $v) { @@ -179,7 +179,7 @@ class Zend_Mail_Storage_Maildir extends Zend_Mail_Storage_Abstract return new $this->_messageClass(array('file' => $this->_getFileData($id, 'filename'), 'flags' => $this->_getFileData($id, 'flags'))); } - + return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $this->getRawHeader($id), 'flags' => $this->_getFileData($id, 'flags'))); } diff --git a/libs/Zend/Mail/Storage/Mbox.php b/libs/Zend/Mail/Storage/Mbox.php index 8fad784..3c5ebaa 100644 --- a/libs/Zend/Mail/Storage/Mbox.php +++ b/libs/Zend/Mail/Storage/Mbox.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Mbox.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Mbox.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -224,7 +224,7 @@ class Zend_Mail_Storage_Mbox extends Zend_Mail_Storage_Abstract if (is_array($params)) { $params = (object)$params; } - + if (!isset($params->filename) /* || Zend_Loader::isReadable($params['filename']) */) { /** * @see Zend_Mail_Storage_Exception diff --git a/libs/Zend/Mail/Storage/Pop3.php b/libs/Zend/Mail/Storage/Pop3.php index b3ea092..c8f6e1b 100644 --- a/libs/Zend/Mail/Storage/Pop3.php +++ b/libs/Zend/Mail/Storage/Pop3.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Pop3.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Pop3.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -244,7 +244,7 @@ class Zend_Mail_Storage_Pop3 extends Zend_Mail_Storage_Abstract } $count = $this->countMessages(); if ($count < 1) { - return array(); + return array(); } $range = range(1, $count); return array_combine($range, $range); diff --git a/libs/Zend/Mail/Storage/Writable/Interface.php b/libs/Zend/Mail/Storage/Writable/Interface.php index fd73380..527ced1 100644 --- a/libs/Zend/Mail/Storage/Writable/Interface.php +++ b/libs/Zend/Mail/Storage/Writable/Interface.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Storage/Writable/Maildir.php b/libs/Zend/Mail/Storage/Writable/Maildir.php index 303b860..d21992a 100644 --- a/libs/Zend/Mail/Storage/Writable/Maildir.php +++ b/libs/Zend/Mail/Storage/Writable/Maildir.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Maildir.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Maildir.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -49,7 +49,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai * @var bool|int */ protected $_quota; - + /** * create a new maildir * @@ -85,7 +85,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai } } } - + foreach (array('cur', 'tmp', 'new') as $subdir) { if (!@mkdir($dir . DIRECTORY_SEPARATOR . $subdir)) { // ignore if dir exists (i.e. was already valid maildir or two processes try to create one) @@ -99,7 +99,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai } } } - + /** * Create instance with parameters * Additional parameters are (see parent for more): @@ -112,11 +112,11 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai if (is_array($params)) { $params = (object)$params; } - + if (!empty($params->create) && isset($params->dirname) && !file_exists($params->dirname . DIRECTORY_SEPARATOR . 'cur')) { self::initMaildir($params->dirname); } - + parent::__construct($params); } @@ -546,7 +546,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; - throw new Zend_Mail_Storage_Exception('storage is over quota!'); + throw new Zend_Mail_Storage_Exception('storage is over quota!'); } if ($folder === null) { @@ -619,9 +619,9 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; - throw new Zend_Mail_Storage_Exception('storage is over quota!'); + throw new Zend_Mail_Storage_Exception('storage is over quota!'); } - + if (!($folder instanceof Zend_Mail_Storage_Folder)) { $folder = $this->getFolders($folder); } @@ -677,7 +677,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai 'flags' => $flags, 'filename' => $new_file); } - + if ($this->_quota) { $this->_addQuotaEntry((int)$size, 1); } @@ -695,7 +695,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai if (!($folder instanceof Zend_Mail_Storage_Folder)) { $folder = $this->getFolders($folder); } - + if ($folder->getGlobalName() == $this->_currentFolder || ($this->_currentFolder == 'INBOX' && $folder->getGlobalName() == '/')) { /** @@ -704,7 +704,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('target is current folder'); } - + $filedata = $this->_getFileData($id); $old_file = $filedata['filename']; $flags = $filedata['flags']; @@ -790,11 +790,11 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai public function removeMessage($id) { $filename = $this->_getFileData($id, 'filename'); - + if ($this->_quota) { $size = filesize($filename); } - + if (!@unlink($filename)) { /** * @see Zend_Mail_Storage_Exception @@ -809,7 +809,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai $this->_addQuotaEntry(0 - (int)$size, -1); } } - + /** * enable/disable quota and set a quota value if wanted or needed * @@ -824,7 +824,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai public function setQuota($value) { $this->_quota = $value; } - + /** * get currently set quota * @@ -855,10 +855,10 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai } return $quota; } - + return $this->_quota; } - + /** * @see http://www.inter7.com/courierimap/README.maildirquota.html "Calculating maildirsize" */ @@ -876,7 +876,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai throw new Zend_Mail_Storage_Exception('no quota defintion found'); } } - + $folders = new RecursiveIteratorIterator($this->getFolders(), RecursiveIteratorIterator::SELF_FIRST); foreach ($folders as $folder) { $subdir = $folder->getGlobalName(); @@ -888,29 +888,29 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai if ($subdir == 'Trash') { continue; } - + foreach (array('cur', 'new') as $subsubdir) { $dirname = $this->_rootdir . $subdir . DIRECTORY_SEPARATOR . $subsubdir . DIRECTORY_SEPARATOR; if (!file_exists($dirname)) { continue; } // NOTE: we are using mtime instead of "the latest timestamp". The latest would be atime - // and as we are accessing the directory it would make the whole calculation useless. + // and as we are accessing the directory it would make the whole calculation useless. $timestamps[$dirname] = filemtime($dirname); $dh = opendir($dirname); - // NOTE: Should have been checked in constructor. Not throwing an exception here, quotas will + // NOTE: Should have been checked in constructor. Not throwing an exception here, quotas will // therefore not be fully enforeced, but next request will fail anyway, if problem persists. if (!$dh) { continue; } - - + + while (($entry = readdir()) !== false) { if ($entry[0] == '.' || !is_file($dirname . $entry)) { continue; } - + if (strpos($entry, ',S=')) { strtok($entry, '='); $filesize = strtok(':'); @@ -930,7 +930,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai } } } - + $tmp = $this->_createTmpFile(); $fh = $tmp['handle']; $definition = array(); @@ -951,10 +951,10 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai break; } } - + return array('size' => $total_size, 'count' => $messages, 'quota' => $quota); } - + /** * @see http://www.inter7.com/courierimap/README.maildirquota.html "Calculating the quota for a Maildir++" */ @@ -1001,9 +1001,9 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai $messages += $count; } } - + $over_quota = false; - $over_quota = $over_quota || (isset($quota['size']) && $total_size > $quota['size']); + $over_quota = $over_quota || (isset($quota['size']) && $total_size > $quota['size']); $over_quota = $over_quota || (isset($quota['count']) && $messages > $quota['count']); // NOTE: $maildirsize equals false if it wasn't set (AKA we recalculated) or it's only // one line, because $maildirsize[0] gets unsetted. @@ -1015,18 +1015,18 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai $messages = $result['count']; $quota = $result['quota']; $over_quota = false; - $over_quota = $over_quota || (isset($quota['size']) && $total_size > $quota['size']); + $over_quota = $over_quota || (isset($quota['size']) && $total_size > $quota['size']); $over_quota = $over_quota || (isset($quota['count']) && $messages > $quota['count']); } - + if ($fh) { // TODO is there a safe way to keep the handle open for writing? fclose($fh); } - + return array('size' => $total_size, 'count' => $messages, 'quota' => $quota, 'over_quota' => $over_quota); } - + protected function _addQuotaEntry($size, $count = 1) { if (!file_exists($this->_rootdir . 'maildirsize')) { // TODO: should get file handler from _calculateQuota @@ -1035,7 +1035,7 @@ class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Mai $count = (int)$count; file_put_contents($this->_rootdir . 'maildirsize', "$size $count\n", FILE_APPEND); } - + /** * check if storage is currently over quota * diff --git a/libs/Zend/Mail/Transport/Abstract.php b/libs/Zend/Mail/Transport/Abstract.php index 5ef4b70..caf3c7a 100644 --- a/libs/Zend/Mail/Transport/Abstract.php +++ b/libs/Zend/Mail/Transport/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Transport * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 17334 2009-08-01 01:25:22Z yoshida@zend.co.jp $ + * @version $Id: Abstract.php 18760 2009-10-31 13:09:01Z yoshida@zend.co.jp $ */ @@ -140,7 +140,7 @@ abstract class Zend_Mail_Transport_Abstract } $this->_headers['Content-Type'] = array( - $type . '; charset=' . $this->_mail->getCharset() . ';' + $type . ';' . $this->EOL . " " . 'boundary="' . $boundary . '"' ); diff --git a/libs/Zend/Mail/Transport/Exception.php b/libs/Zend/Mail/Transport/Exception.php index 9947f45..6f3f3da 100644 --- a/libs/Zend/Mail/Transport/Exception.php +++ b/libs/Zend/Mail/Transport/Exception.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Transport * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ diff --git a/libs/Zend/Mail/Transport/Sendmail.php b/libs/Zend/Mail/Transport/Sendmail.php index 165d11a..dd5c121 100644 --- a/libs/Zend/Mail/Transport/Sendmail.php +++ b/libs/Zend/Mail/Transport/Sendmail.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Transport * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Sendmail.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Sendmail.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -164,6 +164,9 @@ class Zend_Mail_Transport_Sendmail extends Zend_Mail_Transport_Abstract // Prepare headers parent::_prepareHeaders($headers); + + // Fix issue with empty blank line ontop when using Sendmail Trnasport + $this->header = rtrim($this->header); } } diff --git a/libs/Zend/Mail/Transport/Smtp.php b/libs/Zend/Mail/Transport/Smtp.php index 0c1f7cb..fbb6437 100644 --- a/libs/Zend/Mail/Transport/Smtp.php +++ b/libs/Zend/Mail/Transport/Smtp.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Mail * @subpackage Transport * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Smtp.php 16219 2009-06-21 19:45:39Z thomas $ + * @version $Id: Smtp.php 18989 2009-11-15 13:23:41Z yoshida@zend.co.jp $ */ @@ -199,8 +199,8 @@ class Zend_Mail_Transport_Smtp extends Zend_Mail_Transport_Abstract $this->_connection->rset(); } - // Set mail return path from sender email address - $this->_connection->mail($this->_mail->getReturnPath()); + // Set sender email address + $this->_connection->mail($this->_mail->getFrom()); // Set recipient forward paths foreach ($this->_mail->getRecipients() as $recipient) { diff --git a/libs/Zend/Navigation/Container.php b/libs/Zend/Navigation/Container.php index e874e9e..0646b6f 100644 --- a/libs/Zend/Navigation/Container.php +++ b/libs/Zend/Navigation/Container.php @@ -16,7 +16,7 @@ * @package Zend_Navigation * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Container.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Container.php 19179 2009-11-22 16:12:57Z dragonbe $ */ /** @@ -369,11 +369,13 @@ abstract class Zend_Navigation_Container implements RecursiveIterator, Countable public function toArray() { $pages = array(); - - foreach ($this->_pages as $page) { - $pages[] = $page->toArray(); + + $this->_dirtyIndex = true; + $this->_sort(); + $indexes = array_keys($this->_index); + foreach ($indexes as $hash) { + $pages[] = $this->_pages[$hash]->toArray(); } - return $pages; } diff --git a/libs/Zend/Navigation/Page.php b/libs/Zend/Navigation/Page.php index 9781e2d..7b2babc 100644 --- a/libs/Zend/Navigation/Page.php +++ b/libs/Zend/Navigation/Page.php @@ -16,7 +16,7 @@ * @package Zend_Navigation * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Page.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Page.php 19027 2009-11-19 11:19:51Z yoshida@zend.co.jp $ */ /** @@ -237,7 +237,7 @@ abstract class Zend_Navigation_Page extends Zend_Navigation_Container if (is_array($options)) { $this->setOptions($options); } elseif ($options instanceof Zend_Config) { - $this->setConfig($config); + $this->setConfig($options); } // do custom initialization diff --git a/libs/Zend/Paginator/Adapter/Array.php b/libs/Zend/Paginator/Adapter/Array.php index b482bee..8e74575 100644 --- a/libs/Zend/Paginator/Adapter/Array.php +++ b/libs/Zend/Paginator/Adapter/Array.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Array.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Array.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,21 +34,21 @@ class Zend_Paginator_Adapter_Array implements Zend_Paginator_Adapter_Interface { /** * Array - * + * * @var array */ protected $_array = null; - + /** * Item count * * @var integer */ protected $_count = null; - + /** * Constructor. - * + * * @param array $array Array to paginate */ public function __construct(array $array) diff --git a/libs/Zend/Paginator/Adapter/DbTableSelect.php b/libs/Zend/Paginator/Adapter/DbTableSelect.php index 6da3de7..7d11223 100644 --- a/libs/Zend/Paginator/Adapter/DbTableSelect.php +++ b/libs/Zend/Paginator/Adapter/DbTableSelect.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbTableSelect.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: DbTableSelect.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -42,7 +42,7 @@ class Zend_Paginator_Adapter_DbTableSelect extends Zend_Paginator_Adapter_DbSele public function getItems($offset, $itemCountPerPage) { $this->_select->limit($itemCountPerPage, $offset); - + return $this->_select->getTable()->fetchAll($this->_select); } } \ No newline at end of file diff --git a/libs/Zend/Paginator/Adapter/Interface.php b/libs/Zend/Paginator/Adapter/Interface.php index a3ee776..cb3abca 100644 --- a/libs/Zend/Paginator/Adapter/Interface.php +++ b/libs/Zend/Paginator/Adapter/Interface.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,7 +35,7 @@ interface Zend_Paginator_Adapter_Interface extends Countable * @return integer */ //public function count(); - + /** * Returns an collection of items for a page. * diff --git a/libs/Zend/Paginator/Adapter/Iterator.php b/libs/Zend/Paginator/Adapter/Iterator.php index 4d19b55..4960cd1 100644 --- a/libs/Zend/Paginator/Adapter/Iterator.php +++ b/libs/Zend/Paginator/Adapter/Iterator.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Iterator.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Iterator.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,11 +34,11 @@ class Zend_Paginator_Adapter_Iterator implements Zend_Paginator_Adapter_Interfac { /** * Iterator which implements Countable - * + * * @var Iterator */ protected $_iterator = null; - + /** * Item count * @@ -48,7 +48,7 @@ class Zend_Paginator_Adapter_Iterator implements Zend_Paginator_Adapter_Interfac /** * Constructor. - * + * * @param Iterator $iterator Iterator to paginate * @throws Zend_Paginator_Exception */ @@ -59,7 +59,7 @@ class Zend_Paginator_Adapter_Iterator implements Zend_Paginator_Adapter_Interfac * @see Zend_Paginator_Exception */ require_once 'Zend/Paginator/Exception.php'; - + throw new Zend_Paginator_Exception('Iterator must implement Countable'); } diff --git a/libs/Zend/Paginator/Adapter/Null.php b/libs/Zend/Paginator/Adapter/Null.php index 8407123..08e8720 100644 --- a/libs/Zend/Paginator/Adapter/Null.php +++ b/libs/Zend/Paginator/Adapter/Null.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Null.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Null.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,10 +38,10 @@ class Zend_Paginator_Adapter_Null implements Zend_Paginator_Adapter_Interface * @var integer */ protected $_count = null; - + /** * Constructor. - * + * * @param array $count Total item count */ public function __construct($count = 0) diff --git a/libs/Zend/Paginator/ScrollingStyle/All.php b/libs/Zend/Paginator/ScrollingStyle/All.php index fed3100..00ff35e 100644 --- a/libs/Zend/Paginator/ScrollingStyle/All.php +++ b/libs/Zend/Paginator/ScrollingStyle/All.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: All.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: All.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -25,10 +25,10 @@ require_once 'Zend/Paginator/ScrollingStyle/Interface.php'; /** - * A scrolling style that returns every page in the collection. - * Useful when it is necessary to make every page available at + * A scrolling style that returns every page in the collection. + * Useful when it is necessary to make every page available at * once--for example, when using a dropdown menu pagination control. - * + * * @category Zend * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,7 +38,7 @@ class Zend_Paginator_ScrollingStyle_All implements Zend_Paginator_ScrollingStyle { /** * Returns an array of all pages given a page number and range. - * + * * @param Zend_Paginator $paginator * @param integer $pageRange Unused * @return array diff --git a/libs/Zend/Paginator/ScrollingStyle/Elastic.php b/libs/Zend/Paginator/ScrollingStyle/Elastic.php index 2580496..cb07598 100644 --- a/libs/Zend/Paginator/ScrollingStyle/Elastic.php +++ b/libs/Zend/Paginator/ScrollingStyle/Elastic.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Elastic.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Elastic.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,7 +28,7 @@ require_once 'Zend/Paginator/ScrollingStyle/Sliding.php'; * A Google-like scrolling style. Incrementally expands the range to about * twice the given page range, then behaves like a slider. See the example * link. - * + * * @link http://www.google.com/search?q=Zend+Framework * @category Zend * @package Zend_Paginator @@ -39,7 +39,7 @@ class Zend_Paginator_ScrollingStyle_Elastic extends Zend_Paginator_ScrollingStyl { /** * Returns an array of "local" pages given a page number and range. - * + * * @param Zend_Paginator $paginator * @param integer $pageRange Unused * @return array @@ -54,8 +54,10 @@ class Zend_Paginator_ScrollingStyle_Elastic extends Zend_Paginator_ScrollingStyl if ($originalPageRange + $pageNumber - 1 < $pageRange) { $pageRange = $originalPageRange + $pageNumber - 1; + } else if ($originalPageRange + $pageNumber - 1 > count($paginator)) { + $pageRange = $originalPageRange + count($paginator) - $pageNumber; } - + return parent::getPages($paginator, $pageRange); } } \ No newline at end of file diff --git a/libs/Zend/Paginator/ScrollingStyle/Interface.php b/libs/Zend/Paginator/ScrollingStyle/Interface.php index 0d81cb1..dff1f98 100644 --- a/libs/Zend/Paginator/ScrollingStyle/Interface.php +++ b/libs/Zend/Paginator/ScrollingStyle/Interface.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -29,7 +29,7 @@ interface Zend_Paginator_ScrollingStyle_Interface { /** * Returns an array of "local" pages given a page number and range. - * + * * @param Zend_Paginator $paginator * @param integer $pageRange (Optional) Page range * @return array diff --git a/libs/Zend/Paginator/ScrollingStyle/Jumping.php b/libs/Zend/Paginator/ScrollingStyle/Jumping.php index 31f4fe6..db01045 100644 --- a/libs/Zend/Paginator/ScrollingStyle/Jumping.php +++ b/libs/Zend/Paginator/ScrollingStyle/Jumping.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Jumping.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Jumping.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -25,10 +25,10 @@ require_once 'Zend/Paginator/ScrollingStyle/Interface.php'; /** - * A scrolling style in which the cursor advances to the upper bound - * of the page range, the page range "jumps" to the next section, and + * A scrolling style in which the cursor advances to the upper bound + * of the page range, the page range "jumps" to the next section, and * the cursor moves back to the beginning of the range. - * + * * @category Zend * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,7 +38,7 @@ class Zend_Paginator_ScrollingStyle_Jumping implements Zend_Paginator_ScrollingS { /** * Returns an array of "local" pages given a page number and range. - * + * * @param Zend_Paginator $paginator * @param integer $pageRange Unused * @return array @@ -47,17 +47,17 @@ class Zend_Paginator_ScrollingStyle_Jumping implements Zend_Paginator_ScrollingS { $pageRange = $paginator->getPageRange(); $pageNumber = $paginator->getCurrentPageNumber(); - + $delta = $pageNumber % $pageRange; - + if ($delta == 0) { $delta = $pageRange; } $offset = $pageNumber - $delta; - $lowerBound = $offset + 1; + $lowerBound = $offset + 1; $upperBound = $offset + $pageRange; - - return $paginator->getPagesInRange($lowerBound, $upperBound); + + return $paginator->getPagesInRange($lowerBound, $upperBound); } } \ No newline at end of file diff --git a/libs/Zend/Paginator/ScrollingStyle/Sliding.php b/libs/Zend/Paginator/ScrollingStyle/Sliding.php index 9160183..5116305 100644 --- a/libs/Zend/Paginator/ScrollingStyle/Sliding.php +++ b/libs/Zend/Paginator/ScrollingStyle/Sliding.php @@ -16,7 +16,7 @@ * @package Zend_Paginator * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Sliding.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Sliding.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -25,9 +25,9 @@ require_once 'Zend/Paginator/ScrollingStyle/Interface.php'; /** - * A Yahoo! Search-like scrolling style. The cursor will advance to - * the middle of the range, then remain there until the user reaches - * the end of the page set, at which point it will continue on to + * A Yahoo! Search-like scrolling style. The cursor will advance to + * the middle of the range, then remain there until the user reaches + * the end of the page set, at which point it will continue on to * the end of the range and the last page in the set. * * @link http://search.yahoo.com/search?p=Zend+Framework @@ -40,7 +40,7 @@ class Zend_Paginator_ScrollingStyle_Sliding implements Zend_Paginator_ScrollingS { /** * Returns an array of "local" pages given a page number and range. - * + * * @param Zend_Paginator $paginator * @param integer $pageRange (Optional) Page range * @return array @@ -53,23 +53,23 @@ class Zend_Paginator_ScrollingStyle_Sliding implements Zend_Paginator_ScrollingS $pageNumber = $paginator->getCurrentPageNumber(); $pageCount = count($paginator); - + if ($pageRange > $pageCount) { $pageRange = $pageCount; } - + $delta = ceil($pageRange / 2); if ($pageNumber - $delta > $pageCount - $pageRange) { $lowerBound = $pageCount - $pageRange + 1; - $upperBound = $pageCount; + $upperBound = $pageCount; } else { if ($pageNumber - $delta < 0) { $delta = $pageNumber; } - + $offset = $pageNumber - $delta; - $lowerBound = $offset + 1; + $lowerBound = $offset + 1; $upperBound = $offset + $pageRange; } diff --git a/libs/Zend/Pdf.php b/libs/Zend/Pdf.php index fab8cb3..6c2a26d 100644 --- a/libs/Zend/Pdf.php +++ b/libs/Zend/Pdf.php @@ -16,33 +16,19 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Pdf.php 17530 2009-08-10 18:47:29Z alexander $ + * @version $Id: Pdf.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */ +/** @todo Section should be removed with ZF 2.0 release as obsolete */ + /** Zend_Pdf_Page */ require_once 'Zend/Pdf/Page.php'; -/** Zend_Pdf_Cmap */ -require_once 'Zend/Pdf/Cmap.php'; - -/** Zend_Pdf_Font */ -require_once 'Zend/Pdf/Font.php'; - /** Zend_Pdf_Style */ require_once 'Zend/Pdf/Style.php'; -/** Zend_Pdf_Parser */ -require_once 'Zend/Pdf/Parser.php'; - -/** Zend_Pdf_Trailer */ -require_once 'Zend/Pdf/Trailer.php'; - -/** Zend_Pdf_Trailer_Generator */ -require_once 'Zend/Pdf/Trailer/Generator.php'; - -/** Zend_Pdf_Color */ -require_once 'Zend/Pdf/Color.php'; - /** Zend_Pdf_Color_GrayScale */ require_once 'Zend/Pdf/Color/GrayScale.php'; @@ -55,50 +41,24 @@ require_once 'Zend/Pdf/Color/Cmyk.php'; /** Zend_Pdf_Color_Html */ require_once 'Zend/Pdf/Color/Html.php'; -/** Zend_Pdf_Image */ -require_once 'Zend/Pdf/Resource/Image.php'; - /** Zend_Pdf_Image */ require_once 'Zend/Pdf/Image.php'; -/** Zend_Pdf_Image_Jpeg */ -require_once 'Zend/Pdf/Resource/Image/Jpeg.php'; +/** Zend_Pdf_Font */ +require_once 'Zend/Pdf/Font.php'; -/** Zend_Pdf_Image_Tiff */ -require_once 'Zend/Pdf/Resource/Image/Tiff.php'; -/** Zend_Pdf_Image_Png */ -require_once 'Zend/Pdf/Resource/Image/Png.php'; +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/String/Binary.php'; +require_once 'Zend/Pdf/Element/Boolean.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Null.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/String.php'; -/** Zend_Memory */ -require_once 'Zend/Memory.php'; - -/** Zend_Pdf_Action */ -require_once 'Zend/Pdf/Action.php'; - -/** Zend_Pdf_Destination */ -require_once 'Zend/Pdf/Destination.php'; - -/** Zend_Pdf_Destination_Explicit */ -require_once 'Zend/Pdf/Destination/Explicit.php'; - -/** Zend_Pdf_Destination_Named */ -require_once 'Zend/Pdf/Destination/Named.php'; - -/** Zend_Pdf_Outline_Created */ -require_once 'Zend/Pdf/Outline/Created.php'; - -/** Zend_Pdf_Outline_Loaded */ -require_once 'Zend/Pdf/Outline/Loaded.php'; - -/** Zend_Pdf_RecursivelyIteratableObjectsContainer */ -require_once 'Zend/Pdf/RecursivelyIteratableObjectsContainer.php'; - -/** Zend_Pdf_NameTree */ -require_once 'Zend/Pdf/NameTree.php'; - -/** Zend_Pdf_Destination */ -require_once 'Zend/Pdf/Exception.php'; /** * General entity which describes PDF document. @@ -251,6 +211,7 @@ class Zend_Pdf static public function getMemoryManager() { if (self::$_memoryManager === null) { + require_once 'Zend/Memory.php'; self::$_memoryManager = Zend_Memory::factory('none'); } @@ -334,9 +295,11 @@ class Zend_Pdf */ public function __construct($source = null, $revision = null, $load = false) { + require_once 'Zend/Pdf/ElementFactory.php'; $this->_objFactory = Zend_Pdf_ElementFactory::createFactory(1); if ($source !== null) { + require_once 'Zend/Pdf/Parser.php'; $this->_parser = new Zend_Pdf_Parser($source, $this->_objFactory, $load); $this->_pdfHeaderVersion = $this->_parser->getPDFVersion(); $this->_trailer = $this->_parser->getTrailer(); @@ -397,7 +360,8 @@ class Zend_Pdf $trailerDictionary->Size = new Zend_Pdf_Element_Numeric(0); - $this->_trailer = new Zend_Pdf_Trailer_Generator($trailerDictionary); + require_once 'Zend/Pdf/Trailer/Generator.php'; + $this->_trailer = new Zend_Pdf_Trailer_Generator($trailerDictionary); /** * Document catalog indirect object. @@ -502,6 +466,8 @@ class Zend_Pdf } } } + + require_once 'Zend/Pdf/Page.php'; $this->pages[] = new Zend_Pdf_Page($child, $this->_objFactory); } } @@ -526,6 +492,8 @@ class Zend_Pdf // PDF version is 1.2+ // Look for Destinations structure at Name dictionary if ($root->Names !== null && $root->Names->Dests !== null) { + require_once 'Zend/Pdf/NameTree.php'; + require_once 'Zend/Pdf/Target.php'; foreach (new Zend_Pdf_NameTree($root->Names->Dests) as $name => $destination) { $this->_namedTargets[$name] = Zend_Pdf_Target::load($destination); } @@ -539,6 +507,7 @@ class Zend_Pdf throw new Zend_Pdf_Exception('Document catalog Dests entry must be a dictionary.'); } + require_once 'Zend/Pdf/Target.php'; foreach ($root->Dests->getKeys() as $destKey) { $this->_namedTargets[$destKey] = Zend_Pdf_Target::load($root->Dests->$destKey); } @@ -576,6 +545,7 @@ class Zend_Pdf while ($outlineDictionary !== null && !$processedDictionaries->contains($outlineDictionary)) { $processedDictionaries->attach($outlineDictionary); + require_once 'Zend/Pdf/Outline/Loaded.php'; $this->outlines[] = new Zend_Pdf_Outline_Loaded($outlineDictionary); $outlineDictionary = $outlineDictionary->Next; @@ -640,6 +610,7 @@ class Zend_Pdf } // Refresh outlines + require_once 'Zend/Pdf/RecursivelyIteratableObjectsContainer.php'; $iterator = new RecursiveIteratorIterator(new Zend_Pdf_RecursivelyIteratableObjectsContainer($this->outlines), RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $outline) { $target = $outline->getTarget(); @@ -809,6 +780,7 @@ class Zend_Pdf */ public function newPage($param1, $param2 = null) { + require_once 'Zend/Pdf/Page.php'; if ($param2 === null) { return new Zend_Pdf_Page($param1, $this->_objFactory); } else { @@ -866,6 +838,7 @@ class Zend_Pdf public function getOpenAction() { if ($this->_trailer->Root->OpenAction !== null) { + require_once 'Zend/Pdf/Target.php'; return Zend_Pdf_Target::load($this->_trailer->Root->OpenAction); } else { return null; @@ -1043,7 +1016,7 @@ class Zend_Pdf * * @todo Give appropriate name and make method public * - * @param $action + * @param Zend_Pdf_Action $action * @param boolean $refreshPagesHash Refresh page collection hashes before processing * @return Zend_Pdf_Action|null */ @@ -1120,6 +1093,7 @@ class Zend_Pdf foreach ($fontResourcesUnique as $resourceId => $fontDictionary) { try { // Try to extract font + require_once 'Zend/Pdf/Resource/Font/Extracted.php'; $extractedFont = new Zend_Pdf_Resource_Font_Extracted($fontDictionary); $fonts[$resourceId] = $extractedFont; @@ -1178,6 +1152,7 @@ class Zend_Pdf try { // Try to extract font + require_once 'Zend/Pdf/Resource/Font/Extracted.php'; return new Zend_Pdf_Resource_Font_Extracted($fontDictionary); } catch (Zend_Pdf_Exception $e) { if ($e->getMessage() != 'Unsupported font type.') { diff --git a/libs/Zend/Pdf/Action.php b/libs/Zend/Pdf/Action.php index 6f8862f..1013eaa 100644 --- a/libs/Zend/Pdf/Action.php +++ b/libs/Zend/Pdf/Action.php @@ -17,11 +17,14 @@ * @subpackage Actions * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Action.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: Action.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; + +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; +require_once 'Zend/Pdf/Element/Array.php'; + /** Zend_Pdf_Target */ require_once 'Zend/Pdf/Target.php'; @@ -68,6 +71,7 @@ abstract class Zend_Pdf_Action extends Zend_Pdf_Target implements RecursiveItera */ public function __construct(Zend_Pdf_Element $dictionary, SplObjectStorage $processedActions) { + require_once 'Zend/Pdf/Element.php'; if ($dictionary->getType() != Zend_Pdf_Element::TYPE_DICTIONARY) { require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('$dictionary mast be a direct or an indirect dictionary object.'); @@ -114,6 +118,7 @@ abstract class Zend_Pdf_Action extends Zend_Pdf_Target implements RecursiveItera $processedActions = new SplObjectStorage(); } + require_once 'Zend/Pdf/Element.php'; if ($dictionary->getType() != Zend_Pdf_Element::TYPE_DICTIONARY) { require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('$dictionary mast be a direct or an indirect dictionary object.'); @@ -287,6 +292,7 @@ abstract class Zend_Pdf_Action extends Zend_Pdf_Target implements RecursiveItera break; default: + require_once 'Zend/Pdf/Element/Array.php'; $pdfChildArray = new Zend_Pdf_Element_Array(); foreach ($this->next as $child) { @@ -364,7 +370,7 @@ abstract class Zend_Pdf_Action extends Zend_Pdf_Target implements RecursiveItera /** * Returns the child action. * - * @return Zend_Pdf_Outline|null + * @return Zend_Pdf_Action|null */ public function getChildren() { diff --git a/libs/Zend/Pdf/Action/GoTo.php b/libs/Zend/Pdf/Action/GoTo.php index fa29f0a..d6da669 100644 --- a/libs/Zend/Pdf/Action/GoTo.php +++ b/libs/Zend/Pdf/Action/GoTo.php @@ -17,16 +17,19 @@ * @subpackage Actions * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: GoTo.php 17245 2009-07-28 13:59:45Z alexander $ + * @version $Id: GoTo.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Destination.php'; + +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Action */ require_once 'Zend/Pdf/Action.php'; -/** Zend_Pdf_Destination */ -require_once 'Zend/Pdf/Destination.php'; - - /** * PDF 'Go to' action * @@ -81,7 +84,7 @@ class Zend_Pdf_Action_GoTo extends Zend_Pdf_Action $dictionary->Type = new Zend_Pdf_Element_Name('Action'); $dictionary->S = new Zend_Pdf_Element_Name('GoTo'); $dictionary->Next = null; - $dictionary->D = $destination->getResource(); + $dictionary->D = $destination->getResource(); return new Zend_Pdf_Action_GoTo($dictionary, new SplObjectStorage()); } @@ -111,4 +114,3 @@ class Zend_Pdf_Action_GoTo extends Zend_Pdf_Action return $this->_destination; } } - diff --git a/libs/Zend/Pdf/Annotation.php b/libs/Zend/Pdf/Annotation.php index f470251..ee76995 100644 --- a/libs/Zend/Pdf/Annotation.php +++ b/libs/Zend/Pdf/Annotation.php @@ -20,9 +20,8 @@ * @version $Id: */ -/** @see Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; /** * Abstract PDF annotation representation class @@ -169,6 +168,8 @@ abstract class Zend_Pdf_Annotation * @return Zend_Pdf_Annotation */ public function setText($text) { + require_once 'Zend/Pdf/Element/String.php'; + if ($this->_annotationDictionary->Contents === null) { $this->_annotationDictionary->touch(); $this->_annotationDictionary->Contents = new Zend_Pdf_Element_String($text); @@ -220,7 +221,7 @@ abstract class Zend_Pdf_Annotation * * @internal * @param $destinationArray - * @return Zend_Pdf_Destination + * @return Zend_Pdf_Annotation */ public static function load(Zend_Pdf_Element $resource) { diff --git a/libs/Zend/Pdf/Annotation/FileAttachment.php b/libs/Zend/Pdf/Annotation/FileAttachment.php index 64e32b4..0a0881d 100644 --- a/libs/Zend/Pdf/Annotation/FileAttachment.php +++ b/libs/Zend/Pdf/Annotation/FileAttachment.php @@ -20,10 +20,18 @@ * @version $Id: */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/String.php'; + + /** Zend_Pdf_Annotation */ require_once 'Zend/Pdf/Annotation.php'; - /** * A file attachment annotation contains a reference to a file, * which typically is embedded in the PDF file. diff --git a/libs/Zend/Pdf/Annotation/Link.php b/libs/Zend/Pdf/Annotation/Link.php index af9e4b6..cb1fe1f 100644 --- a/libs/Zend/Pdf/Annotation/Link.php +++ b/libs/Zend/Pdf/Annotation/Link.php @@ -20,13 +20,17 @@ * @version $Id: */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Annotation */ require_once 'Zend/Pdf/Annotation.php'; -/** Zend_Pdf_Destination */ -require_once 'Zend/Pdf/Destination.php'; - - /** * A link annotation represents either a hypertext link to a destination elsewhere in * the document or an action to be performed. @@ -148,8 +152,10 @@ class Zend_Pdf_Annotation_Link extends Zend_Pdf_Annotation } if ($this->_annotationDictionary->Dest !== null) { + require_once 'Zend/Pdf/Destination.php'; return Zend_Pdf_Destination::load($this->_annotationDictionary->Dest); } else { + require_once 'Zend/Pdf/Action.php'; return Zend_Pdf_Action::load($this->_annotationDictionary->A); } } diff --git a/libs/Zend/Pdf/Annotation/Text.php b/libs/Zend/Pdf/Annotation/Text.php index 64bb33a..fa69086 100644 --- a/libs/Zend/Pdf/Annotation/Text.php +++ b/libs/Zend/Pdf/Annotation/Text.php @@ -20,10 +20,18 @@ * @version $Id: */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/String.php'; + + /** Zend_Pdf_Annotation */ require_once 'Zend/Pdf/Annotation.php'; - /** * A text annotation represents a "sticky note" attached to a point in the PDF document. * diff --git a/libs/Zend/Pdf/Cmap.php b/libs/Zend/Pdf/Cmap.php index 30e0ece..d0aa087 100644 --- a/libs/Zend/Pdf/Cmap.php +++ b/libs/Zend/Pdf/Cmap.php @@ -17,20 +17,9 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Cmap.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Cmap.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Cmap_ByteEncoding */ -require_once 'Zend/Pdf/Cmap/ByteEncoding.php'; - -/** Zend_Pdf_Cmap_ByteEncoding_Static */ -require_once 'Zend/Pdf/Cmap/ByteEncoding/Static.php'; - -/** Zend_Pdf_Cmap_SegmentToDelta */ -require_once 'Zend/Pdf/Cmap/SegmentToDelta.php'; - -/** Zend_Pdf_Cmap_TrimmedTable */ -require_once 'Zend/Pdf/Cmap/TrimmedTable.php'; /** * Abstract helper class for {@link Zend_Pdf_Resource_Font} which manages font @@ -157,9 +146,11 @@ abstract class Zend_Pdf_Cmap { switch ($cmapType) { case Zend_Pdf_Cmap::TYPE_BYTE_ENCODING: + require_once 'Zend/Pdf/Cmap/ByteEncoding.php'; return new Zend_Pdf_Cmap_ByteEncoding($cmapData); case Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC: + require_once 'Zend/Pdf/Cmap/ByteEncoding/Static.php'; return new Zend_Pdf_Cmap_ByteEncoding_Static($cmapData); case Zend_Pdf_Cmap::TYPE_HIGH_BYTE_MAPPING: @@ -168,9 +159,11 @@ abstract class Zend_Pdf_Cmap Zend_Pdf_Exception::CMAP_TYPE_UNSUPPORTED); case Zend_Pdf_Cmap::TYPE_SEGMENT_TO_DELTA: + require_once 'Zend/Pdf/Cmap/SegmentToDelta.php'; return new Zend_Pdf_Cmap_SegmentToDelta($cmapData); case Zend_Pdf_Cmap::TYPE_TRIMMED_TABLE: + require_once 'Zend/Pdf/Cmap/TrimmedTable.php'; return new Zend_Pdf_Cmap_TrimmedTable($cmapData); case Zend_Pdf_Cmap::TYPE_MIXED_COVERAGE: diff --git a/libs/Zend/Pdf/Cmap/ByteEncoding.php b/libs/Zend/Pdf/Cmap/ByteEncoding.php index 657a7ad..3084876 100644 --- a/libs/Zend/Pdf/Cmap/ByteEncoding.php +++ b/libs/Zend/Pdf/Cmap/ByteEncoding.php @@ -17,7 +17,7 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ByteEncoding.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: ByteEncoding.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Cmap */ @@ -119,9 +119,9 @@ class Zend_Pdf_Cmap_ByteEncoding extends Zend_Pdf_Cmap /** * Returns an array containing the glyphs numbers that have entries in this character map. * Keys are Unicode character codes (integers) - * + * * This functionality is partially covered by glyphNumbersForCharacters(getCoveredCharacters()) - * call, but this method do it in more effective way (prepare complete list instead of searching + * call, but this method do it in more effective way (prepare complete list instead of searching * glyph for each character code). * * @internal @@ -150,6 +150,7 @@ class Zend_Pdf_Cmap_ByteEncoding extends Zend_Pdf_Cmap */ $actualLength = strlen($cmapData); if ($actualLength != 262) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Insufficient table data', Zend_Pdf_Exception::CMAP_TABLE_DATA_TOO_SMALL); } @@ -158,12 +159,14 @@ class Zend_Pdf_Cmap_ByteEncoding extends Zend_Pdf_Cmap */ $type = $this->_extractUInt2($cmapData, 0); if ($type != Zend_Pdf_Cmap::TYPE_BYTE_ENCODING) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong cmap table type', Zend_Pdf_Exception::CMAP_WRONG_TABLE_TYPE); } $length = $this->_extractUInt2($cmapData, 2); if ($length != $actualLength) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Table length ($length) does not match actual length ($actualLength)", Zend_Pdf_Exception::CMAP_WRONG_TABLE_LENGTH); } diff --git a/libs/Zend/Pdf/Cmap/ByteEncoding/Static.php b/libs/Zend/Pdf/Cmap/ByteEncoding/Static.php index eb5cfd3..bfcf99a 100644 --- a/libs/Zend/Pdf/Cmap/ByteEncoding/Static.php +++ b/libs/Zend/Pdf/Cmap/ByteEncoding/Static.php @@ -17,7 +17,7 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Static.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Static.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Cmap_ByteEncoding */ @@ -52,6 +52,7 @@ class Zend_Pdf_Cmap_ByteEncoding_Static extends Zend_Pdf_Cmap_ByteEncoding public function __construct($cmapData) { if (! is_array($cmapData)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Constructor parameter must be an array', Zend_Pdf_Exception::BAD_PARAMETER_TYPE); } diff --git a/libs/Zend/Pdf/Cmap/SegmentToDelta.php b/libs/Zend/Pdf/Cmap/SegmentToDelta.php index b428d17..b3c1406 100644 --- a/libs/Zend/Pdf/Cmap/SegmentToDelta.php +++ b/libs/Zend/Pdf/Cmap/SegmentToDelta.php @@ -17,7 +17,7 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SegmentToDelta.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: SegmentToDelta.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Cmap */ @@ -261,13 +261,13 @@ class Zend_Pdf_Cmap_SegmentToDelta extends Zend_Pdf_Cmap return $characterCodes; } - + /** * Returns an array containing the glyphs numbers that have entries in this character map. * Keys are Unicode character codes (integers) - * + * * This functionality is partially covered by glyphNumbersForCharacters(getCoveredCharacters()) - * call, but this method do it in more effective way (prepare complete list instead of searching + * call, but this method do it in more effective way (prepare complete list instead of searching * glyph for each character code). * * @internal @@ -276,7 +276,7 @@ class Zend_Pdf_Cmap_SegmentToDelta extends Zend_Pdf_Cmap public function getCoveredCharactersGlyphs() { $glyphNumbers = array(); - + for ($segmentNum = 1; $segmentNum <= $this->_segmentCount; $segmentNum++) { if ($this->_segmentTableIdRangeOffsets[$segmentNum] == 0) { $delta = $this->_segmentTableIdDeltas[$segmentNum]; @@ -298,7 +298,7 @@ class Zend_Pdf_Cmap_SegmentToDelta extends Zend_Pdf_Cmap } } } - + return $glyphNumbers; } @@ -321,6 +321,7 @@ class Zend_Pdf_Cmap_SegmentToDelta extends Zend_Pdf_Cmap */ $actualLength = strlen($cmapData); if ($actualLength < 23) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Insufficient table data', Zend_Pdf_Exception::CMAP_TABLE_DATA_TOO_SMALL); } @@ -329,12 +330,14 @@ class Zend_Pdf_Cmap_SegmentToDelta extends Zend_Pdf_Cmap */ $type = $this->_extractUInt2($cmapData, 0); if ($type != Zend_Pdf_Cmap::TYPE_SEGMENT_TO_DELTA) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong cmap table type', Zend_Pdf_Exception::CMAP_WRONG_TABLE_TYPE); } $length = $this->_extractUInt2($cmapData, 2); if ($length != $actualLength) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Table length ($length) does not match actual length ($actualLength)", Zend_Pdf_Exception::CMAP_WRONG_TABLE_LENGTH); } @@ -395,6 +398,7 @@ class Zend_Pdf_Cmap_SegmentToDelta extends Zend_Pdf_Cmap * of the table. */ if ($offset != $length) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Ending offset ($offset) does not match length ($length)", Zend_Pdf_Exception::CMAP_FINAL_OFFSET_NOT_LENGTH); } diff --git a/libs/Zend/Pdf/Cmap/TrimmedTable.php b/libs/Zend/Pdf/Cmap/TrimmedTable.php index 0aaa755..28682f6 100644 --- a/libs/Zend/Pdf/Cmap/TrimmedTable.php +++ b/libs/Zend/Pdf/Cmap/TrimmedTable.php @@ -17,7 +17,7 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TrimmedTable.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: TrimmedTable.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Cmap */ @@ -134,9 +134,9 @@ class Zend_Pdf_Cmap_TrimmedTable extends Zend_Pdf_Cmap /** * Returns an array containing the glyphs numbers that have entries in this character map. * Keys are Unicode character codes (integers) - * + * * This functionality is partially covered by glyphNumbersForCharacters(getCoveredCharacters()) - * call, but this method do it in more effective way (prepare complete list instead of searching + * call, but this method do it in more effective way (prepare complete list instead of searching * glyph for each character code). * * @internal @@ -170,6 +170,7 @@ class Zend_Pdf_Cmap_TrimmedTable extends Zend_Pdf_Cmap */ $actualLength = strlen($cmapData); if ($actualLength < 9) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Insufficient table data', Zend_Pdf_Exception::CMAP_TABLE_DATA_TOO_SMALL); } @@ -178,12 +179,14 @@ class Zend_Pdf_Cmap_TrimmedTable extends Zend_Pdf_Cmap */ $type = $this->_extractUInt2($cmapData, 0); if ($type != Zend_Pdf_Cmap::TYPE_TRIMMED_TABLE) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong cmap table type', Zend_Pdf_Exception::CMAP_WRONG_TABLE_TYPE); } $length = $this->_extractUInt2($cmapData, 2); if ($length != $actualLength) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Table length ($length) does not match actual length ($actualLength)", Zend_Pdf_Exception::CMAP_WRONG_TABLE_LENGTH); } @@ -203,6 +206,7 @@ class Zend_Pdf_Cmap_TrimmedTable extends Zend_Pdf_Cmap $entryCount = $this->_extractUInt2($cmapData, 8); $expectedCount = ($length - 10) >> 1; if ($entryCount != $expectedCount) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Entry count is wrong; expected: $expectedCount; actual: $entryCount", Zend_Pdf_Exception::CMAP_WRONG_ENTRY_COUNT); } @@ -218,6 +222,7 @@ class Zend_Pdf_Cmap_TrimmedTable extends Zend_Pdf_Cmap * of the table. */ if ($offset != $length) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Ending offset ($offset) does not match length ($length)", Zend_Pdf_Exception::CMAP_FINAL_OFFSET_NOT_LENGTH); } diff --git a/libs/Zend/Pdf/Color/Cmyk.php b/libs/Zend/Pdf/Color/Cmyk.php index 8bfaf69..cc8b592 100644 --- a/libs/Zend/Pdf/Color/Cmyk.php +++ b/libs/Zend/Pdf/Color/Cmyk.php @@ -16,15 +16,16 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Cmyk.php 16978 2009-07-22 19:59:40Z alexander $ + * @version $Id: Cmyk.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Color */ require_once 'Zend/Pdf/Color.php'; -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - /** * CMYK color implementation * diff --git a/libs/Zend/Pdf/Color/GrayScale.php b/libs/Zend/Pdf/Color/GrayScale.php index babc6d9..fdb5808 100644 --- a/libs/Zend/Pdf/Color/GrayScale.php +++ b/libs/Zend/Pdf/Color/GrayScale.php @@ -16,15 +16,17 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: GrayScale.php 16978 2009-07-22 19:59:40Z alexander $ + * @version $Id: GrayScale.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Color */ require_once 'Zend/Pdf/Color.php'; -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - /** * GrayScale color implementation * diff --git a/libs/Zend/Pdf/Color/Html.php b/libs/Zend/Pdf/Color/Html.php index e9a8dc1..a49586f 100644 --- a/libs/Zend/Pdf/Color/Html.php +++ b/libs/Zend/Pdf/Color/Html.php @@ -16,17 +16,12 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Html.php 16978 2009-07-22 19:59:40Z alexander $ + * @version $Id: Html.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Color */ require_once 'Zend/Pdf/Color.php'; -/** Zend_Pdf_Color_Rgb */ -require_once 'Zend/Pdf/Color/Rgb.php'; - -/** Zend_Pdf_GrayScale */ -require_once 'Zend/Pdf/Color/GrayScale.php'; /** * HTML color implementation @@ -99,8 +94,10 @@ class Zend_Pdf_Color_Html extends Zend_Pdf_Color $g = round((hexdec($matches[2]) / 255), 3); $b = round((hexdec($matches[3]) / 255), 3); if (($r == $g) && ($g == $b)) { + require_once 'Zend/Pdf/Color/GrayScale.php'; return new Zend_Pdf_Color_GrayScale($r); } else { + require_once 'Zend/Pdf/Color/Rgb.php'; return new Zend_Pdf_Color_Rgb($r, $g, $b); } } else { @@ -405,10 +402,11 @@ class Zend_Pdf_Color_Html extends Zend_Pdf_Color throw new Zend_Pdf_Exception('Unknown color name: ' . $color); } if (($r == $g) && ($g == $b)) { + require_once 'Zend/Pdf/Color/GrayScale.php'; return new Zend_Pdf_Color_GrayScale($r); } else { + require_once 'Zend/Pdf/Color/Rgb.php'; return new Zend_Pdf_Color_Rgb($r, $g, $b); } } } - diff --git a/libs/Zend/Pdf/Color/Rgb.php b/libs/Zend/Pdf/Color/Rgb.php index 1cc2a15..ae8d268 100644 --- a/libs/Zend/Pdf/Color/Rgb.php +++ b/libs/Zend/Pdf/Color/Rgb.php @@ -16,15 +16,17 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Rgb.php 16978 2009-07-22 19:59:40Z alexander $ + * @version $Id: Rgb.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Color */ require_once 'Zend/Pdf/Color.php'; -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - /** * RGB color implementation * diff --git a/libs/Zend/Pdf/Destination.php b/libs/Zend/Pdf/Destination.php index 42ea17d..269582b 100644 --- a/libs/Zend/Pdf/Destination.php +++ b/libs/Zend/Pdf/Destination.php @@ -17,14 +17,13 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Destination.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: Destination.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; -/** Zend_Pdf_Page */ -require_once 'Zend/Pdf/Page.php'; +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; + /** Zend_Pdf_Target */ require_once 'Zend/Pdf/Target.php'; @@ -49,6 +48,7 @@ abstract class Zend_Pdf_Destination extends Zend_Pdf_Target */ public static function load(Zend_Pdf_Element $resource) { + require_once 'Zend/Pdf/Element.php'; if ($resource->getType() == Zend_Pdf_Element::TYPE_NAME || $resource->getType() == Zend_Pdf_Element::TYPE_STRING) { require_once 'Zend/Pdf/Destination/Named.php'; return new Zend_Pdf_Destination_Named($resource); diff --git a/libs/Zend/Pdf/Destination/Explicit.php b/libs/Zend/Pdf/Destination/Explicit.php index 1750211..ffaf7a3 100644 --- a/libs/Zend/Pdf/Destination/Explicit.php +++ b/libs/Zend/Pdf/Destination/Explicit.php @@ -20,13 +20,14 @@ * @version $Id: Destination.php 16978 2009-07-22 19:59:40Z alexander $ */ -/** Zend_Pdf_Page */ -require_once 'Zend/Pdf/Page.php'; + +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; + /** Zend_Pdf_Destination */ require_once 'Zend/Pdf/Destination.php'; - /** * Abstract PDF explicit destination representation class * diff --git a/libs/Zend/Pdf/Destination/Fit.php b/libs/Zend/Pdf/Destination/Fit.php index f7c1e2b..2e6201d 100644 --- a/libs/Zend/Pdf/Destination/Fit.php +++ b/libs/Zend/Pdf/Destination/Fit.php @@ -17,13 +17,19 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Fit.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: Fit.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Destination_Explicit */ require_once 'Zend/Pdf/Destination/Explicit.php'; - /** * Zend_Pdf_Destination_Fit explicit detination * diff --git a/libs/Zend/Pdf/Destination/FitBoundingBox.php b/libs/Zend/Pdf/Destination/FitBoundingBox.php index 8df5ca1..3eeb9fa 100644 --- a/libs/Zend/Pdf/Destination/FitBoundingBox.php +++ b/libs/Zend/Pdf/Destination/FitBoundingBox.php @@ -17,13 +17,19 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FitBoundingBox.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: FitBoundingBox.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Destination_Explicit */ require_once 'Zend/Pdf/Destination/Explicit.php'; - /** * Zend_Pdf_Destination_FitBoundingBox explicit detination * diff --git a/libs/Zend/Pdf/Destination/FitBoundingBoxHorizontally.php b/libs/Zend/Pdf/Destination/FitBoundingBoxHorizontally.php index 0f10311..b56a8ea 100644 --- a/libs/Zend/Pdf/Destination/FitBoundingBoxHorizontally.php +++ b/libs/Zend/Pdf/Destination/FitBoundingBoxHorizontally.php @@ -17,13 +17,19 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FitBoundingBoxHorizontally.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: FitBoundingBoxHorizontally.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Destination_Explicit */ require_once 'Zend/Pdf/Destination/Explicit.php'; - /** * Zend_Pdf_Destination_FitBoundingBoxHorizontally explicit detination * diff --git a/libs/Zend/Pdf/Destination/FitBoundingBoxVertically.php b/libs/Zend/Pdf/Destination/FitBoundingBoxVertically.php index 67af696..1270038 100644 --- a/libs/Zend/Pdf/Destination/FitBoundingBoxVertically.php +++ b/libs/Zend/Pdf/Destination/FitBoundingBoxVertically.php @@ -17,13 +17,18 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FitBoundingBoxVertically.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: FitBoundingBoxVertically.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Destination_Explicit */ require_once 'Zend/Pdf/Destination/Explicit.php'; - /** * Zend_Pdf_Destination_FitBoundingBoxVertically explicit detination * diff --git a/libs/Zend/Pdf/Destination/FitHorizontally.php b/libs/Zend/Pdf/Destination/FitHorizontally.php index 4109ccd..0fdf277 100644 --- a/libs/Zend/Pdf/Destination/FitHorizontally.php +++ b/libs/Zend/Pdf/Destination/FitHorizontally.php @@ -17,13 +17,19 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FitHorizontally.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: FitHorizontally.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Destination_Explicit */ require_once 'Zend/Pdf/Destination/Explicit.php'; - /** * Zend_Pdf_Destination_FitHorizontally explicit detination * diff --git a/libs/Zend/Pdf/Destination/FitRectangle.php b/libs/Zend/Pdf/Destination/FitRectangle.php index 145cab5..51160bb 100644 --- a/libs/Zend/Pdf/Destination/FitRectangle.php +++ b/libs/Zend/Pdf/Destination/FitRectangle.php @@ -17,13 +17,19 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FitRectangle.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: FitRectangle.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Destination_Explicit */ require_once 'Zend/Pdf/Destination/Explicit.php'; - /** * Zend_Pdf_Destination_FitRectangle explicit detination * diff --git a/libs/Zend/Pdf/Destination/FitVertically.php b/libs/Zend/Pdf/Destination/FitVertically.php index 48d32ab..196de23 100644 --- a/libs/Zend/Pdf/Destination/FitVertically.php +++ b/libs/Zend/Pdf/Destination/FitVertically.php @@ -17,13 +17,19 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FitVertically.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: FitVertically.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Destination_Explicit */ require_once 'Zend/Pdf/Destination/Explicit.php'; - /** * Zend_Pdf_Destination_FitVertically explicit detination * diff --git a/libs/Zend/Pdf/Destination/Named.php b/libs/Zend/Pdf/Destination/Named.php index c34e18c..34cdcbc 100644 --- a/libs/Zend/Pdf/Destination/Named.php +++ b/libs/Zend/Pdf/Destination/Named.php @@ -20,10 +20,14 @@ * @version $Id: Fit.php 16971 2009-07-22 18:05:45Z mikaelkael $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; +require_once 'Zend/Pdf/Element/String.php'; + + /** Zend_Pdf_Destination */ require_once 'Zend/Pdf/Destination.php'; - /** * Destination array: [page /Fit] * diff --git a/libs/Zend/Pdf/Destination/Zoom.php b/libs/Zend/Pdf/Destination/Zoom.php index 5787bf8..f103c1a 100644 --- a/libs/Zend/Pdf/Destination/Zoom.php +++ b/libs/Zend/Pdf/Destination/Zoom.php @@ -17,13 +17,19 @@ * @subpackage Destination * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Zoom.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: Zoom.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Null.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Destination_Explicit */ require_once 'Zend/Pdf/Destination/Explicit.php'; - /** * Zend_Pdf_Destination_Zoom explicit detination * diff --git a/libs/Zend/Pdf/Element.php b/libs/Zend/Pdf/Element.php index bee10bf..ba72ead 100644 --- a/libs/Zend/Pdf/Element.php +++ b/libs/Zend/Pdf/Element.php @@ -16,14 +16,10 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Element.php 16978 2009-07-22 19:59:40Z alexander $ + * @version $Id: Element.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Element_Object */ -require_once 'Zend/Pdf/Element/Object.php'; - - /** * PDF file element implementation * @@ -131,8 +127,10 @@ abstract class Zend_Pdf_Element public static function phpToPdf($input) { if (is_numeric($input)) { + require_once 'Zend/Pdf/Element/Numeric.php'; return new Zend_Pdf_Element_Numeric($input); } else if (is_bool($input)) { + require_once 'Zend/Pdf/Element/Boolean.php'; return new Zend_Pdf_Element_Boolean($input); } else if (is_array($input)) { $pdfElementsArray = array(); @@ -146,13 +144,15 @@ abstract class Zend_Pdf_Element } if ($isDictionary) { + require_once 'Zend/Pdf/Element/Dictionary.php'; return new Zend_Pdf_Element_Dictionary($pdfElementsArray); } else { + require_once 'Zend/Pdf/Element/Array.php'; return new Zend_Pdf_Element_Array($pdfElementsArray); } } else { + require_once 'Zend/Pdf/Element/String.php'; return new Zend_Pdf_Element_String((string)$input); } } } - diff --git a/libs/Zend/Pdf/Element/Array.php b/libs/Zend/Pdf/Element/Array.php index e432359..101645d 100644 --- a/libs/Zend/Pdf/Element/Array.php +++ b/libs/Zend/Pdf/Element/Array.php @@ -16,7 +16,7 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Array.php 17532 2009-08-10 19:04:14Z alexander $ + * @version $Id: Array.php 18993 2009-11-15 17:09:16Z alexander $ */ @@ -57,11 +57,13 @@ class Zend_Pdf_Element_Array extends Zend_Pdf_Element if ($val !== null && is_array($val)) { foreach ($val as $element) { if (!$element instanceof Zend_Pdf_Element) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Array elements must be Zend_Pdf_Element objects'); } $this->items[] = $element; } } else if ($val !== null){ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Argument must be an array'); } } diff --git a/libs/Zend/Pdf/Element/Boolean.php b/libs/Zend/Pdf/Element/Boolean.php index 17ef83c..32f4371 100644 --- a/libs/Zend/Pdf/Element/Boolean.php +++ b/libs/Zend/Pdf/Element/Boolean.php @@ -16,7 +16,7 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Boolean.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Boolean.php 18993 2009-11-15 17:09:16Z alexander $ */ @@ -51,6 +51,7 @@ class Zend_Pdf_Element_Boolean extends Zend_Pdf_Element public function __construct($val) { if (! is_bool($val)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Argument must be boolean.'); } diff --git a/libs/Zend/Pdf/Element/Dictionary.php b/libs/Zend/Pdf/Element/Dictionary.php index ca95659..355ad82 100644 --- a/libs/Zend/Pdf/Element/Dictionary.php +++ b/libs/Zend/Pdf/Element/Dictionary.php @@ -16,14 +16,17 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Dictionary.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Dictionary.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Element */ require_once 'Zend/Pdf/Element.php'; - /** * PDF file 'dictionary' element implementation * @@ -54,14 +57,17 @@ class Zend_Pdf_Element_Dictionary extends Zend_Pdf_Element if ($val === null) { return; } else if (!is_array($val)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Argument must be an array'); } foreach ($val as $name => $element) { if (!$element instanceof Zend_Pdf_Element) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Array elements must be Zend_Pdf_Element objects'); } if (!is_string($name)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Array keys must be strings'); } $this->_items[$name] = $element; @@ -145,6 +151,7 @@ class Zend_Pdf_Element_Dictionary extends Zend_Pdf_Element foreach ($this->_items as $name => $element) { if (!is_object($element)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong data'); } diff --git a/libs/Zend/Pdf/Element/Name.php b/libs/Zend/Pdf/Element/Name.php index 1959a1b..635e429 100644 --- a/libs/Zend/Pdf/Element/Name.php +++ b/libs/Zend/Pdf/Element/Name.php @@ -16,7 +16,7 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Name.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Name.php 18993 2009-11-15 17:09:16Z alexander $ */ @@ -52,6 +52,7 @@ class Zend_Pdf_Element_Name extends Zend_Pdf_Element { settype($val, 'string'); if (strpos($val,"\x00") !== false) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Null character is not allowed in PDF Names'); } $this->value = (string)$val; diff --git a/libs/Zend/Pdf/Element/Object.php b/libs/Zend/Pdf/Element/Object.php index 04e96dd..e2b538a 100644 --- a/libs/Zend/Pdf/Element/Object.php +++ b/libs/Zend/Pdf/Element/Object.php @@ -16,16 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Object.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: Object.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Element */ require_once 'Zend/Pdf/Element.php'; -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - /** * PDF file 'indirect object' element implementation @@ -77,14 +74,17 @@ class Zend_Pdf_Element_Object extends Zend_Pdf_Element public function __construct(Zend_Pdf_Element $val, $objNum, $genNum, Zend_Pdf_ElementFactory $factory) { if ($val instanceof self) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object number must not be an instance of Zend_Pdf_Element_Object.'); } if ( !(is_integer($objNum) && $objNum > 0) ) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object number must be positive integer.'); } if ( !(is_integer($genNum) && $genNum >= 0) ) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Generation number must be non-negative integer.'); } diff --git a/libs/Zend/Pdf/Element/Object/Stream.php b/libs/Zend/Pdf/Element/Object/Stream.php index a780a7d..2d8118d 100644 --- a/libs/Zend/Pdf/Element/Object/Stream.php +++ b/libs/Zend/Pdf/Element/Object/Stream.php @@ -16,32 +16,19 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Stream.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Stream.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Stream.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Element_Object */ require_once 'Zend/Pdf/Element/Object.php'; -/** Zend_Pdf_Element_Stream */ -require_once 'Zend/Pdf/Element/Stream.php'; - -/** Zend_Pdf_Filter_Ascii85 */ -require_once 'Zend/Pdf/Filter/Ascii85.php'; - -/** Zend_Pdf_Filter_AsciiHex */ -require_once 'Zend/Pdf/Filter/AsciiHex.php'; - -/** Zend_Pdf_Filter_Compression_Flate */ -require_once 'Zend/Pdf/Filter/Compression/Flate.php'; - -/** Zend_Pdf_Filter_Compression_Lzw */ -require_once 'Zend/Pdf/Filter/Compression/Lzw.php'; - -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - - /** * PDF file 'stream object' element implementation * @@ -194,6 +181,7 @@ class Zend_Pdf_Element_Object_Stream extends Zend_Pdf_Element_Object */ if (isset($this->_originalDictionary['F'])) { /** @todo Check, how external files can be processed. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('External filters are not supported now.'); } @@ -202,24 +190,29 @@ class Zend_Pdf_Element_Object_Stream extends Zend_Pdf_Element_Object $this->_value->value->touch(); switch ($filterName) { case 'ASCIIHexDecode': + require_once 'Zend/Pdf/Filter/AsciiHex.php'; $valueRef = Zend_Pdf_Filter_AsciiHex::decode($valueRef); break; case 'ASCII85Decode': + require_once 'Zend/Pdf/Filter/Ascii85.php'; $valueRef = Zend_Pdf_Filter_Ascii85::decode($valueRef); break; case 'FlateDecode': + require_once 'Zend/Pdf/Filter/Compression/Flate.php'; $valueRef = Zend_Pdf_Filter_Compression_Flate::decode($valueRef, $this->_originalDictionary['DecodeParms'][$id]); break; case 'LZWDecode': + require_once 'Zend/Pdf/Filter/Compression/Lzw.php'; $valueRef = Zend_Pdf_Filter_Compression_Lzw::decode($valueRef, $this->_originalDictionary['DecodeParms'][$id]); break; default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unknown stream filter: \'' . $filterName . '\'.'); } } @@ -240,6 +233,7 @@ class Zend_Pdf_Element_Object_Stream extends Zend_Pdf_Element_Object */ if (isset($this->_originalDictionary['F'])) { /** @todo Check, how external files can be processed. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('External filters are not supported now.'); } @@ -250,24 +244,29 @@ class Zend_Pdf_Element_Object_Stream extends Zend_Pdf_Element_Object $this->_value->value->touch(); switch ($filterName) { case 'ASCIIHexDecode': + require_once 'Zend/Pdf/Filter/AsciiHex.php'; $valueRef = Zend_Pdf_Filter_AsciiHex::encode($valueRef); break; case 'ASCII85Decode': + require_once 'Zend/Pdf/Filter/Ascii85.php'; $valueRef = Zend_Pdf_Filter_Ascii85::encode($valueRef); break; case 'FlateDecode': + require_once 'Zend/Pdf/Filter/Compression/Flate.php'; $valueRef = Zend_Pdf_Filter_Compression_Flate::encode($valueRef, $this->_originalDictionary['DecodeParms'][$id]); break; case 'LZWDecode': + require_once 'Zend/Pdf/Filter/Compression/Lzw.php'; $valueRef = Zend_Pdf_Filter_Compression_Lzw::encode($valueRef, $this->_originalDictionary['DecodeParms'][$id]); break; default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unknown stream filter: \'' . $filterName . '\'.'); } } @@ -303,6 +302,7 @@ class Zend_Pdf_Element_Object_Stream extends Zend_Pdf_Element_Object return $this->_value->value->getRef(); } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unknown stream object property requested.'); } @@ -325,6 +325,7 @@ class Zend_Pdf_Element_Object_Stream extends Zend_Pdf_Element_Object return; } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unknown stream object property: \'' . $property . '\'.'); } @@ -357,6 +358,7 @@ class Zend_Pdf_Element_Object_Stream extends Zend_Pdf_Element_Object case 1: return $this->_value->$method($args[0]); default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unsupported number of arguments'); } } diff --git a/libs/Zend/Pdf/Element/Reference.php b/libs/Zend/Pdf/Element/Reference.php index 24be978..1fb4e00 100644 --- a/libs/Zend/Pdf/Element/Reference.php +++ b/libs/Zend/Pdf/Element/Reference.php @@ -16,23 +16,17 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Reference.php 17533 2009-08-10 19:06:27Z alexander $ + * @version $Id: Reference.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Null.php'; + + /** Zend_Pdf_Element */ require_once 'Zend/Pdf/Element.php'; -/** Zend_Pdf_Element_Reference_Context */ -require_once 'Zend/Pdf/Element/Reference/Context.php'; - -/** Zend_Pdf_Element_Reference_Table */ -require_once 'Zend/Pdf/Element/Reference/Table.php'; - -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - - /** * PDF file 'reference' element implementation * @@ -97,9 +91,11 @@ class Zend_Pdf_Element_Reference extends Zend_Pdf_Element public function __construct($objNum, $genNum = 0, Zend_Pdf_Element_Reference_Context $context, Zend_Pdf_ElementFactory $factory) { if ( !(is_integer($objNum) && $objNum > 0) ) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object number must be positive integer'); } if ( !(is_integer($genNum) && $genNum >= 0) ) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Generation number must be non-negative integer'); } @@ -178,6 +174,7 @@ class Zend_Pdf_Element_Reference extends Zend_Pdf_Element } if ($obj->toString() != $this->_objNum . ' ' . $this->_genNum . ' R') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Incorrect reference to the object'); } diff --git a/libs/Zend/Pdf/Element/Reference/Context.php b/libs/Zend/Pdf/Element/Reference/Context.php index e7b973b..fba3356 100644 --- a/libs/Zend/Pdf/Element/Reference/Context.php +++ b/libs/Zend/Pdf/Element/Reference/Context.php @@ -16,17 +16,10 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Context.php 16978 2009-07-22 19:59:40Z alexander $ + * @version $Id: Context.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_StringParser */ -require_once 'Zend/Pdf/StringParser.php'; - -/** Zend_Pdf_Element_Reference_Table */ -require_once 'Zend/Pdf/Element/Reference/Table.php'; - - /** * PDF reference object context * Reference context is defined by PDF parser and PDF Refernce table @@ -41,7 +34,7 @@ class Zend_Pdf_Element_Reference_Context /** * PDF parser object. * - * @var Zend_Pdf_Parser + * @var Zend_Pdf_StringParser */ private $_stringParser; diff --git a/libs/Zend/Pdf/Element/Reference/Table.php b/libs/Zend/Pdf/Element/Reference/Table.php index 51a0fba..b7ca1d5 100644 --- a/libs/Zend/Pdf/Element/Reference/Table.php +++ b/libs/Zend/Pdf/Element/Reference/Table.php @@ -16,7 +16,7 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Table.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Table.php 18993 2009-11-15 17:09:16Z alexander $ */ @@ -93,6 +93,7 @@ class Zend_Pdf_Element_Reference_Table { $refElements = explode(' ', $ref); if (!is_numeric($refElements[0]) || !is_numeric($refElements[1]) || $refElements[2] != 'R') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Incorrect reference: '$ref'"); } $objNum = (int)$refElements[0]; @@ -153,6 +154,7 @@ class Zend_Pdf_Element_Reference_Table public function getNextFree($ref) { if (isset($this->_inuse[$ref])) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object is not free'); } @@ -164,6 +166,7 @@ class Zend_Pdf_Element_Reference_Table return $this->_parent->getNextFree($ref); } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object not found.'); } @@ -177,6 +180,7 @@ class Zend_Pdf_Element_Reference_Table public function getNewGeneration($objNum) { if (isset($this->_usedObjects[$objNum])) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object is not free'); } @@ -188,7 +192,7 @@ class Zend_Pdf_Element_Reference_Table return $this->_parent->getNewGeneration($objNum); } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object not found.'); } } - diff --git a/libs/Zend/Pdf/Element/Stream.php b/libs/Zend/Pdf/Element/Stream.php index 57d2347..178fe59 100644 --- a/libs/Zend/Pdf/Element/Stream.php +++ b/libs/Zend/Pdf/Element/Stream.php @@ -16,24 +16,16 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Stream.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Stream.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** - * @see Zend_Pdf - */ +/** Internally used classes */ require_once 'Zend/Pdf.php'; -/** - * @see Zend_Pdf_Element - */ -require_once 'Zend/Pdf/Element.php'; -/** - * @see Zend_Memory - */ -require_once 'Zend/Memory.php'; +/** Zend_Pdf_Element */ +require_once 'Zend/Pdf/Element.php'; /** * PDF file 'stream' element implementation diff --git a/libs/Zend/Pdf/Element/String.php b/libs/Zend/Pdf/Element/String.php index b83873a..f65119c 100644 --- a/libs/Zend/Pdf/Element/String.php +++ b/libs/Zend/Pdf/Element/String.php @@ -16,14 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: String.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: String.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Element */ require_once 'Zend/Pdf/Element.php'; - /** * PDF file 'string' element implementation * @@ -78,170 +77,187 @@ class Zend_Pdf_Element_String extends Zend_Pdf_Element /** * Escape string according to the PDF rules * - * @param string $inStr + * @param string $str * @return string */ - public static function escape($inStr) + public static function escape($str) { - $outStr = ''; - $lastNL = 0; + $outEntries = array(); - for ($count = 0; $count < strlen($inStr); $count++) { - if (strlen($outStr) - $lastNL > 128) { - $outStr .= "\\\n"; - $lastNL = strlen($outStr); + foreach (str_split($str, 128) as $chunk) { + // Collect sequence of unescaped characters + $offset = strcspn($chunk, "\n\r\t\x08\x0C()\\"); + $chunkOut = substr($chunk, 0, $offset); + + while ($offset < strlen($chunk)) { + $nextCode = ord($chunk[$offset++]); + switch ($nextCode) { + // "\n" - line feed (LF) + case 10: + $chunkOut .= '\\n'; + break; + + // "\r" - carriage return (CR) + case 13: + $chunkOut .= '\\r'; + break; + + // "\t" - horizontal tab (HT) + case 9: + $chunkOut .= '\\t'; + break; + + // "\b" - backspace (BS) + case 8: + $chunkOut .= '\\b'; + break; + + // "\f" - form feed (FF) + case 12: + $chunkOut .= '\\f'; + break; + + // '(' - left paranthesis + case 40: + $chunkOut .= '\\('; + break; + + // ')' - right paranthesis + case 41: + $chunkOut .= '\\)'; + break; + + // '\' - backslash + case 92: + $chunkOut .= '\\\\'; + break; + + default: + // This code is never executed extually + // + // Don't use non-ASCII characters escaping + // if ($nextCode >= 32 && $nextCode <= 126 ) { + // // Visible ASCII symbol + // $chunkEntries[] = chr($nextCode); + // } else { + // $chunkEntries[] = sprintf('\\%03o', $nextCode); + // } + + break; + } + + // Collect sequence of unescaped characters + $start = $offset; + $offset += strcspn($chunk, "\n\r\t\x08\x0C()\\", $offset); + $chunkOut .= substr($chunk, $start, $offset - $start); } - $nextCode = ord($inStr[$count]); - switch ($nextCode) { - // "\n" - line feed (LF) - case 10: - $outStr .= '\\n'; - break; - - // "\r" - carriage return (CR) - case 13: - $outStr .= '\\r'; - break; - - // "\t" - horizontal tab (HT) - case 9: - $outStr .= '\\t'; - break; - - // "\b" - backspace (BS) - case 8: - $outStr .= '\\b'; - break; - - // "\f" - form feed (FF) - case 12: - $outStr .= '\\f'; - break; - - // '(' - left paranthesis - case 40: - $outStr .= '\\('; - break; - - // ')' - right paranthesis - case 41: - $outStr .= '\\)'; - break; - - // '\' - backslash - case 92: - $outStr .= '\\\\'; - break; - - default: - // Don't use non-ASCII characters escaping - // if ($nextCode >= 32 && $nextCode <= 126 ) { - // // Visible ASCII symbol - // $outStr .= $inStr[$count]; - // } else { - // $outStr .= sprintf('\\%03o', $nextCode); - // } - $outStr .= $inStr[$count]; - - break; - } + $outEntries[] = $chunkOut; } - return $outStr; + return implode("\\\n", $outEntries); } /** * Unescape string according to the PDF rules * - * @param string $inStr + * @param string $str * @return string */ - public static function unescape($inStr) + public static function unescape($str) { - $outStr = ''; + $outEntries = array(); - for ($count = 0; $count < strlen($inStr); $count++) { - if ($inStr[$count] != '\\' || $count == strlen($inStr)-1) { - $outStr .= $inStr[$count]; - } else { // Escape sequence - switch ($inStr{++$count}) { + $offset = 0; + while ($offset < strlen($str)) { + // Searche for the next escaped character/sequence + $escapeCharOffset = strpos($str, '\\', $offset); + if ($escapeCharOffset === false || $escapeCharOffset == strlen($str) - 1) { + // There are no escaped characters or '\' char has came at the end of string + $outEntries[] = substr($str, $offset); + break; + } else { + // Collect unescaped characters sequence + $outEntries[] = substr($str, $offset, $escapeCharOffset - $offset); + // Go to the escaped character + $offset = $escapeCharOffset + 1; + + switch ($str[$offset]) { // '\\n' - line feed (LF) case 'n': - $outStr .= "\n"; + $outEntries[] = "\n"; break; // '\\r' - carriage return (CR) case 'r': - $outStr .= "\r"; + $outEntries[] = "\r"; break; // '\\t' - horizontal tab (HT) case 't': - $outStr .= "\t"; + $outEntries[] = "\t"; break; // '\\b' - backspace (BS) case 'b': - $outStr .= "\x08"; + $outEntries[] = "\x08"; break; // '\\f' - form feed (FF) case 'f': - $outStr .= "\x0C"; + $outEntries[] = "\x0C"; break; // '\\(' - left paranthesis case '(': - $outStr .= '('; + $outEntries[] = '('; break; // '\\)' - right paranthesis case ')': - $outStr .= ')'; + $outEntries[] = ')'; break; // '\\\\' - backslash case '\\': - $outStr .= '\\'; + $outEntries[] = '\\'; break; // "\\\n" or "\\\n\r" case "\n": // skip new line symbol - if ($inStr[$count+1] == "\r") { - $count++; + if ($str[$offset + 1] == "\r") { + $offset++; } break; default: - if (ord($inStr[$count]) >= ord('0') && - ord($inStr[$count]) <= ord('9')) { + if (strpos('0123456789', $str[$offset]) !== false) { // Character in octal representation // '\\xxx' - $nextCode = '0' . $inStr[$count]; + $nextCode = '0' . $str[$offset]; - if (ord($inStr[$count+1]) >= ord('0') && - ord($inStr[$count+1]) <= ord('9')) { - $nextCode .= $inStr{++$count}; + if (strpos('0123456789', $str[$offset + 1]) !== false) { + $nextCode .= $str[++$offset]; - if (ord($inStr[$count+1]) >= ord('0') && - ord($inStr[$count+1]) <= ord('9')) { - $nextCode .= $inStr{++$count}; + if (strpos('0123456789', $str[$offset + 1]) !== false) { + $nextCode .= $str[++$offset]; } } - $outStr .= chr($nextCode); + $outEntries[] = chr($nextCode); } else { - $outStr .= $inStr[$count]; + $outEntries[] = $str[$offset]; } break; } + + $offset++; } } - return $outStr; + return implode($outEntries); } } diff --git a/libs/Zend/Pdf/Element/String/Binary.php b/libs/Zend/Pdf/Element/String/Binary.php index e1c08b5..301823b 100644 --- a/libs/Zend/Pdf/Element/String/Binary.php +++ b/libs/Zend/Pdf/Element/String/Binary.php @@ -16,7 +16,7 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Binary.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Binary.php 18985 2009-11-14 18:51:34Z alexander $ */ @@ -50,12 +50,7 @@ class Zend_Pdf_Element_String_Binary extends Zend_Pdf_Element_String */ public static function escape($inStr) { - $outStr = ''; - - for ($count = 0; $count < strlen($inStr); $count++) { - $outStr .= sprintf('%02X', ord($inStr[$count])); - } - return $outStr; + return strtoupper(bin2hex($inStr)); } @@ -67,34 +62,26 @@ class Zend_Pdf_Element_String_Binary extends Zend_Pdf_Element_String */ public static function unescape($inStr) { - $outStr = ''; - $nextHexCode = ''; + $chunks = array(); + $offset = 0; + $length = 0; + while ($offset < strlen($inStr)) { + // Collect hexadecimal characters + $start = $offset; + $offset += strspn($inStr, "0123456789abcdefABCDEF", $offset); + $chunks[] = substr($inStr, $start, $offset - $start); + $length += strlen(end($chunks)); - for ($count = 0; $count < strlen($inStr); $count++) { - $nextCharCode = ord($inStr[$count]); - - if( ($nextCharCode >= 48 /*'0'*/ && - $nextCharCode <= 57 /*'9'*/ ) || - ($nextCharCode >= 97 /*'a'*/ && - $nextCharCode <= 102 /*'f'*/ ) || - ($nextCharCode >= 65 /*'A'*/ && - $nextCharCode <= 70 /*'F'*/ ) ) { - $nextHexCode .= $inStr[$count]; - } - - if (strlen($nextHexCode) == 2) { - $outStr .= chr(intval($nextHexCode, 16)); - $nextHexCode = ''; - } + // Skip non-hexadecimal characters + $offset += strcspn($inStr, "0123456789abcdefABCDEF", $offset); } - - if ($nextHexCode != '') { + if ($length % 2 != 0) { // We have odd number of digits. // Final digit is assumed to be '0' - $outStr .= chr(base_convert($nextHexCode . '0', 16, 10)); + $chunks[] = '0'; } - return $outStr; + return pack('H*' , implode($chunks)); } diff --git a/libs/Zend/Pdf/ElementFactory.php b/libs/Zend/Pdf/ElementFactory.php index d0eb9f4..fdd1633 100644 --- a/libs/Zend/Pdf/ElementFactory.php +++ b/libs/Zend/Pdf/ElementFactory.php @@ -16,56 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ElementFactory.php 17533 2009-08-10 19:06:27Z alexander $ + * @version $Id: ElementFactory.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_ElementFactory_Interface */ require_once 'Zend/Pdf/ElementFactory/Interface.php'; -/** Zend_Pdf_ElementFactory_Proxy */ -require_once 'Zend/Pdf/ElementFactory/Proxy.php'; - -/** Zend_Pdf_Element */ -require_once 'Zend/Pdf/Element.php'; - -/** Zend_Pdf_Element_Array */ -require_once 'Zend/Pdf/Element/Array.php'; - -/** Zend_Pdf_Element_String_Binary */ -require_once 'Zend/Pdf/Element/String/Binary.php'; - -/** Zend_Pdf_Element_Boolean */ -require_once 'Zend/Pdf/Element/Boolean.php'; - -/** Zend_Pdf_Element_Dictionary */ -require_once 'Zend/Pdf/Element/Dictionary.php'; - -/** Zend_Pdf_Element_Name */ -require_once 'Zend/Pdf/Element/Name.php'; - -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - -/** Zend_Pdf_Element_Object */ -require_once 'Zend/Pdf/Element/Object.php'; - -/** Zend_Pdf_Element_Reference */ -require_once 'Zend/Pdf/Element/Reference.php'; - -/** Zend_Pdf_Element_Object_Stream */ -require_once 'Zend/Pdf/Element/Object/Stream.php'; - -/** Zend_Pdf_Element_String */ -require_once 'Zend/Pdf/Element/String.php'; - -/** Zend_Pdf_Element_Null */ -require_once 'Zend/Pdf/Element/Null.php'; - -/** Zend_Pdf_UpdateInfoContainer */ -require_once 'Zend/Pdf/UpdateInfoContainer.php'; - - /** * PDF element factory. * Responsibility is to log PDF changes @@ -167,6 +124,7 @@ class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface */ static public function createFactory($objCount) { + require_once 'Zend/Pdf/ElementFactory/Proxy.php'; return new Zend_Pdf_ElementFactory_Proxy(new Zend_Pdf_ElementFactory($objCount)); } @@ -292,9 +250,6 @@ class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface /** * Clean enumeration shift cache. * Has to be used after PDF render operation to let followed updates be correct. - * - * @param Zend_Pdf_ElementFactory_Interface $factory - * @return integer */ public function cleanEnumerationShiftCache() { @@ -315,6 +270,7 @@ class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface public function getEnumerationShift(Zend_Pdf_ElementFactory_Interface $factory) { if (($shift = $this->calculateShift($factory)) == -1) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong object context'); } @@ -330,6 +286,7 @@ class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface public function markAsModified(Zend_Pdf_Element_Object $obj) { if ($obj->getFactory() !== $this) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object is not generated by this factory'); } @@ -346,6 +303,7 @@ class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface public function remove(Zend_Pdf_Element_Object $obj) { if (!$obj->compareFactory($this)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Object is not generated by this factory'); } @@ -364,6 +322,7 @@ class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface */ public function newObject(Zend_Pdf_Element $objectValue) { + require_once 'Zend/Pdf/Element/Object.php'; $obj = new Zend_Pdf_Element_Object($objectValue, $this->_objectCount++, 0, $this); $this->_modifiedObjects[$obj->getObjNum()] = $obj; return $obj; @@ -379,6 +338,7 @@ class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface */ public function newStreamObject($streamValue) { + require_once 'Zend/Pdf/Element/Object/Stream.php'; $obj = new Zend_Pdf_Element_Object_Stream($streamValue, $this->_objectCount++, 0, $this); $this->_modifiedObjects[$obj->getObjNum()] = $obj; return $obj; @@ -404,9 +364,10 @@ class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface ksort($this->_modifiedObjects); $result = array(); + require_once 'Zend/Pdf/UpdateInfoContainer.php'; foreach ($this->_modifiedObjects as $objNum => $obj) { if ($this->_removedObjects->contains($obj)) { - $result[$objNum+$shift] = new Zend_Pdf_UpdateInfoContainer($objNum + $shift, + $result[$objNum+$shift] = new Zend_Pdf_UpdateInfoContainer($objNum + $shift, $obj->getGenNum()+1, true); } else { diff --git a/libs/Zend/Pdf/ElementFactory/Interface.php b/libs/Zend/Pdf/ElementFactory/Interface.php index 11fc6ce..82fe319 100644 --- a/libs/Zend/Pdf/ElementFactory/Interface.php +++ b/libs/Zend/Pdf/ElementFactory/Interface.php @@ -16,7 +16,7 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: Interface.php 18993 2009-11-15 17:09:16Z alexander $ */ /** @@ -149,4 +149,3 @@ interface Zend_Pdf_ElementFactory_Interface */ public function isModified(); } - diff --git a/libs/Zend/Pdf/ElementFactory/Proxy.php b/libs/Zend/Pdf/ElementFactory/Proxy.php index 62fae84..cea2da9 100644 --- a/libs/Zend/Pdf/ElementFactory/Proxy.php +++ b/libs/Zend/Pdf/ElementFactory/Proxy.php @@ -16,13 +16,12 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Proxy.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: Proxy.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_ElementFactory_Interface */ require_once 'Zend/Pdf/ElementFactory/Interface.php'; - /** * PDF element factory interface. * Responsibility is to log PDF changes @@ -223,4 +222,3 @@ class Zend_Pdf_ElementFactory_Proxy implements Zend_Pdf_ElementFactory_Interface return $this->_factory->isModified(); } } - diff --git a/libs/Zend/Pdf/FileParser/Font.php b/libs/Zend/Pdf/FileParser/Font.php index 771fb11..8bdb81c 100644 --- a/libs/Zend/Pdf/FileParser/Font.php +++ b/libs/Zend/Pdf/FileParser/Font.php @@ -17,9 +17,13 @@ * @subpackage FileParser * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Font.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Font.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Font.php'; + + /** Zend_Pdf_FileParser */ require_once 'Zend/Pdf/FileParser.php'; @@ -206,8 +210,8 @@ abstract class Zend_Pdf_FileParser_Font extends Zend_Pdf_FileParser $message = vsprintf($message, $args); } + require_once 'Zend/Log.php'; $logger = new Zend_Log(); $logger->log($message, Zend_Log::DEBUG); } - } diff --git a/libs/Zend/Pdf/FileParser/Font/OpenType.php b/libs/Zend/Pdf/FileParser/Font/OpenType.php index 414b29f..66caac4 100644 --- a/libs/Zend/Pdf/FileParser/Font/OpenType.php +++ b/libs/Zend/Pdf/FileParser/Font/OpenType.php @@ -17,16 +17,12 @@ * @subpackage FileParser * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: OpenType.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: OpenType.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_FileParser_Font */ require_once 'Zend/Pdf/FileParser/Font.php'; -/** Zend_Pdf_Cmap */ -require_once 'Zend/Pdf/Cmap.php'; - - /** * Abstract base class for OpenType font file parsers. * @@ -166,6 +162,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon * are defined, so use 50 as a practical limit. */ if (($tableCount < 7) || ($tableCount > 50)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Table count not within expected range', Zend_Pdf_Exception::BAD_TABLE_COUNT); } @@ -196,10 +193,12 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon */ $fileSize = $this->_dataSource->getSize(); if (($tableOffset < 0) || ($tableOffset > $fileSize)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Table offset ($tableOffset) not within expected range", Zend_Pdf_Exception::INDEX_OUT_OF_RANGE); } if (($tableLength < 0) || (($tableOffset + $tableLength) > $fileSize)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Table length ($tableLength) not within expected range", Zend_Pdf_Exception::INDEX_OUT_OF_RANGE); } @@ -232,6 +231,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon $magicNumber = $this->readUInt(4); if ($magicNumber != 0x5f0f3cf5) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong magic number. Expected: 0x5f0f3cf5; actual: ' . sprintf('%x', $magicNumber), Zend_Pdf_Exception::BAD_MAGIC_NUMBER); @@ -292,6 +292,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon */ $tableFormat = $this->readUInt(2); if ($tableFormat != 0) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Unable to read format $tableFormat table", Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); } @@ -492,6 +493,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon protected function _parseOs2Table() { if (! $this->numberHMetrics) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("hhea table must be parsed prior to calling this method", Zend_Pdf_Exception::PARSED_OUT_OF_ORDER); } @@ -501,6 +503,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon } catch (Zend_Pdf_Exception $exception) { /* This table is not always present. If missing, use default values. */ + require_once 'Zend/Pdf/Exception.php'; if ($exception->getCode() == Zend_Pdf_Exception::REQUIRED_TABLE_NOT_FOUND) { $this->_debugLog('No OS/2 table found. Using default values'); $this->fontWeight = Zend_Pdf_Font::WEIGHT_NORMAL; @@ -547,6 +550,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon */ $tableVersion = $this->readUInt(2); if (($tableVersion < 0) || ($tableVersion > 3)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Unable to read version $tableVersion table", Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); } @@ -728,6 +732,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon $this->_jumpToTable('hmtx'); if (! $this->numberHMetrics) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("hhea table must be parsed prior to calling this method", Zend_Pdf_Exception::PARSED_OUT_OF_ORDER); } @@ -735,6 +740,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon /* We only understand version 0 tables. */ if ($this->metricDataFormat != 0) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Unable to read format $this->metricDataFormat table.", Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); } @@ -787,6 +793,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon */ $tableVersion = $this->readUInt(2); if ($tableVersion != 0) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Unable to read version $tableVersion table", Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); } @@ -915,6 +922,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon break; } if ($cmapType == -1) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unable to find usable cmap table', Zend_Pdf_Exception::CANT_FIND_GOOD_CMAP); } @@ -925,6 +933,8 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon $cmapType, $cmapOffset, $cmapLength); $this->moveToOffset($cmapOffset); $cmapData = $this->readBytes($cmapLength); + + require_once 'Zend/Pdf/Cmap.php'; $this->cmap = Zend_Pdf_Cmap::cmapWithTypeData($cmapType, $cmapData); } @@ -964,10 +974,12 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon break; case 0x74797031: // 'typ1' + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unsupported font type: PostScript in sfnt wrapper', Zend_Pdf_Exception::WRONG_FONT_TYPE); default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not an OpenType font file', Zend_Pdf_Exception::WRONG_FONT_TYPE); } @@ -984,6 +996,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon protected function _jumpToTable($tableName) { if (empty($this->_tableDirectory[$tableName])) { // do not allow NULL or zero + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Required table '$tableName' not found!", Zend_Pdf_Exception::REQUIRED_TABLE_NOT_FOUND); } @@ -1005,6 +1018,7 @@ abstract class Zend_Pdf_FileParser_Font_OpenType extends Zend_Pdf_FileParser_Fon { $tableVersion = $this->readFixed(16, 16); if (($tableVersion < $minVersion) || ($tableVersion > $maxVersion)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Unable to read version $tableVersion table", Zend_Pdf_Exception::DONT_UNDERSTAND_TABLE_VERSION); } diff --git a/libs/Zend/Pdf/FileParser/Font/OpenType/TrueType.php b/libs/Zend/Pdf/FileParser/Font/OpenType/TrueType.php index 543ecd5..7b3689c 100644 --- a/libs/Zend/Pdf/FileParser/Font/OpenType/TrueType.php +++ b/libs/Zend/Pdf/FileParser/Font/OpenType/TrueType.php @@ -17,13 +17,13 @@ * @subpackage FileParser * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TrueType.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: TrueType.php 18993 2009-11-15 17:09:16Z alexander $ */ + /** Zend_Pdf_FileParser_Font_OpenType */ require_once 'Zend/Pdf/FileParser/Font/OpenType.php'; - /** * Parses an OpenType font file containing TrueType outlines. * @@ -60,6 +60,7 @@ class Zend_Pdf_FileParser_Font_OpenType_TrueType extends Zend_Pdf_FileParser_Fon break; default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not a TrueType font file', Zend_Pdf_Exception::WRONG_FONT_TYPE); } diff --git a/libs/Zend/Pdf/FileParser/Image.php b/libs/Zend/Pdf/FileParser/Image.php index 61465c4..450d481 100644 --- a/libs/Zend/Pdf/FileParser/Image.php +++ b/libs/Zend/Pdf/FileParser/Image.php @@ -17,12 +17,17 @@ * @subpackage FileParser * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Image.php 17182 2009-07-27 13:54:11Z alexander $ + * @version $Id: Image.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** - * @see Zend_Pdf_FileParser - */ + +/** Internally used classes */ + +/** Zend_Pdf_Image */ +require_once 'Zend/Pdf/Image.php'; + + +/** Zend_Pdf_FileParser */ require_once 'Zend/Pdf/FileParser.php'; /** @@ -55,5 +60,4 @@ abstract class Zend_Pdf_FileParser_Image extends Zend_Pdf_FileParser parent::__construct($dataSource); $this->imageType = Zend_Pdf_Image::TYPE_UNKNOWN; } - } diff --git a/libs/Zend/Pdf/FileParser/Image/Png.php b/libs/Zend/Pdf/FileParser/Image/Png.php index 1c215f7..71b4fb3 100644 --- a/libs/Zend/Pdf/FileParser/Image/Png.php +++ b/libs/Zend/Pdf/FileParser/Image/Png.php @@ -17,7 +17,7 @@ * @subpackage FileParser * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Png.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Png.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_FileParser_Image */ @@ -178,6 +178,7 @@ class Zend_Pdf_FileParser_Image_Png extends Zend_Pdf_FileParser_Image while($size - $this->getOffset() >= 8) { $chunkLength = $this->readUInt(4); if($chunkLength < 0 || ($chunkLength + $this->getOffset() + 4) > $size) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("PNG Corrupt: Invalid Chunk Size In File."); } @@ -208,6 +209,7 @@ class Zend_Pdf_FileParser_Image_Png extends Zend_Pdf_FileParser_Image } } if(empty($this->_imageData)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception ( "This PNG is corrupt. All png must contain IDAT chunks." ); } } @@ -215,6 +217,7 @@ class Zend_Pdf_FileParser_Image_Png extends Zend_Pdf_FileParser_Image protected function _parseIHDRChunk() { $this->moveToOffset(12); //IHDR must always start at offset 12 and run for 17 bytes if(!$this->readBytes(4) == 'IHDR') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception( "This PNG is corrupt. The first chunk in a PNG file must be IHDR." ); } $this->_width = $this->readUInt(4); @@ -225,6 +228,7 @@ class Zend_Pdf_FileParser_Image_Png extends Zend_Pdf_FileParser_Image $this->_preFilter = $this->readInt(1); $this->_interlacing = $this->readInt(1); if($this->_interlacing != Zend_Pdf_Image::PNG_INTERLACING_DISABLED) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception( "Only non-interlaced images are currently supported." ); } } @@ -317,10 +321,9 @@ class Zend_Pdf_FileParser_Image_Png extends Zend_Pdf_FileParser_Image case Zend_Pdf_Image::PNG_CHANNEL_GRAY_ALPHA: //Fall through to the next case case Zend_Pdf_Image::PING_CHANNEL_RGB_ALPHA: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception( "tRNS chunk illegal for Alpha Channel Images" ); break; } } } - - diff --git a/libs/Zend/Pdf/FileParserDataSource/File.php b/libs/Zend/Pdf/FileParserDataSource/File.php index cbf16c0..4850cb7 100644 --- a/libs/Zend/Pdf/FileParserDataSource/File.php +++ b/libs/Zend/Pdf/FileParserDataSource/File.php @@ -17,7 +17,7 @@ * @subpackage FileParser * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: File.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: File.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_FileParserDataSource */ @@ -75,18 +75,22 @@ class Zend_Pdf_FileParserDataSource_File extends Zend_Pdf_FileParserDataSource public function __construct($filePath) { if (! (is_file($filePath) || is_link($filePath))) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Invalid file path: $filePath", Zend_Pdf_Exception::BAD_FILE_PATH); } if (! is_readable($filePath)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("File is not readable: $filePath", Zend_Pdf_Exception::NOT_READABLE); } if (($this->_size = @filesize($filePath)) === false) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Error while obtaining file size: $filePath", Zend_Pdf_Exception::CANT_GET_FILE_SIZE); } if (($this->_fileResource = @fopen($filePath, 'rb')) === false) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Cannot open file for reading: $filePath", Zend_Pdf_Exception::CANT_OPEN_FILE); } @@ -122,10 +126,12 @@ class Zend_Pdf_FileParserDataSource_File extends Zend_Pdf_FileParserDataSource { $bytes = @fread($this->_fileResource, $byteCount); if ($bytes === false) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unexpected error while reading file', Zend_Pdf_Exception::ERROR_DURING_READ); } if (strlen($bytes) != $byteCount) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Insufficient data to read $byteCount bytes", Zend_Pdf_Exception::INSUFFICIENT_DATA); } @@ -178,10 +184,12 @@ class Zend_Pdf_FileParserDataSource_File extends Zend_Pdf_FileParserDataSource parent::moveToOffset($offset); $result = @fseek($this->_fileResource, $offset, SEEK_SET); if ($result !== 0) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Error while setting new file position', Zend_Pdf_Exception::CANT_SET_FILE_POSITION); } if (feof($this->_fileResource)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Moved beyond the end of the file', Zend_Pdf_Exception::MOVE_BEYOND_END_OF_FILE); } diff --git a/libs/Zend/Pdf/FileParserDataSource/String.php b/libs/Zend/Pdf/FileParserDataSource/String.php index 4076bad..064ba77 100644 --- a/libs/Zend/Pdf/FileParserDataSource/String.php +++ b/libs/Zend/Pdf/FileParserDataSource/String.php @@ -17,13 +17,12 @@ * @subpackage FileParser * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: String.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: String.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_FileParserDataSource */ require_once 'Zend/Pdf/FileParserDataSource.php'; - /** * Concrete subclass of {@link Zend_Pdf_FileParserDataSource} that provides an * interface to binary strings. @@ -61,6 +60,7 @@ class Zend_Pdf_FileParserDataSource_String extends Zend_Pdf_FileParserDataSource public function __construct($string) { if (empty($string)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('String is empty', Zend_Pdf_Exception::PARAMETER_VALUE_OUT_OF_RANGE); } @@ -92,6 +92,7 @@ class Zend_Pdf_FileParserDataSource_String extends Zend_Pdf_FileParserDataSource public function readBytes($byteCount) { if (($this->_offset + $byteCount) > $this->_size) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Insufficient data to read $byteCount bytes", Zend_Pdf_Exception::INSUFFICIENT_DATA); } @@ -124,5 +125,4 @@ class Zend_Pdf_FileParserDataSource_String extends Zend_Pdf_FileParserDataSource { return "String ($this->_size bytes)"; } - } diff --git a/libs/Zend/Pdf/Filter/Ascii85.php b/libs/Zend/Pdf/Filter/Ascii85.php index 69b99de..ab114f6 100644 --- a/libs/Zend/Pdf/Filter/Ascii85.php +++ b/libs/Zend/Pdf/Filter/Ascii85.php @@ -16,14 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Ascii85.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Ascii85.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Filter_Interface */ require_once 'Zend/Pdf/Filter/Interface.php'; - /** * ASCII85 stream filter * @@ -43,6 +42,7 @@ class Zend_Pdf_Filter_Ascii85 implements Zend_Pdf_Filter_Interface */ public static function encode($data, $params = null) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not implemented yet'); } @@ -56,6 +56,7 @@ class Zend_Pdf_Filter_Ascii85 implements Zend_Pdf_Filter_Interface */ public static function decode($data, $params = null) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not implemented yet'); } } diff --git a/libs/Zend/Pdf/Filter/AsciiHex.php b/libs/Zend/Pdf/Filter/AsciiHex.php index 2ed0d99..5128612 100644 --- a/libs/Zend/Pdf/Filter/AsciiHex.php +++ b/libs/Zend/Pdf/Filter/AsciiHex.php @@ -16,14 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AsciiHex.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: AsciiHex.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Filter_Interface */ require_once 'Zend/Pdf/Filter/Interface.php'; - /** * AsciiHex stream filter * @@ -100,6 +99,7 @@ class Zend_Pdf_Filter_AsciiHex implements Zend_Pdf_Filter_Interface } else if ($charCode >= 0x61 /*'a'*/ && $charCode <= 0x66 /*'f'*/) { $code = $charCode - 0x57/*0x61 - 0x0A*/; } else { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong character in a encoded stream'); } @@ -121,6 +121,7 @@ class Zend_Pdf_Filter_AsciiHex implements Zend_Pdf_Filter_Interface /* Check that stream is terminated by End Of Data marker */ if ($data[$count] != '>') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong encoded stream End Of Data marker.'); } diff --git a/libs/Zend/Pdf/Filter/Compression.php b/libs/Zend/Pdf/Filter/Compression.php index cbdcac2..11c041c 100644 --- a/libs/Zend/Pdf/Filter/Compression.php +++ b/libs/Zend/Pdf/Filter/Compression.php @@ -16,14 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Compression.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Compression.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Filter_Interface */ require_once 'Zend/Pdf/Filter/Interface.php'; - /** * ASCII85 stream filter * @@ -76,6 +75,7 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface if ($predictor != 1 && $predictor != 2 && $predictor != 10 && $predictor != 11 && $predictor != 12 && $predictor != 13 && $predictor != 14 && $predictor != 15) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Invalid value of \'Predictor\' decode param - ' . $predictor . '.' ); } return $predictor; @@ -97,6 +97,7 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface $colors = $params['Colors']; if ($colors != 1 && $colors != 2 && $colors != 3 && $colors != 4) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Invalid value of \'Color\' decode param - ' . $colors . '.' ); } return $colors; @@ -120,6 +121,7 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface if ($bitsPerComponent != 1 && $bitsPerComponent != 2 && $bitsPerComponent != 4 && $bitsPerComponent != 8 && $bitsPerComponent != 16 ) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Invalid value of \'BitsPerComponent\' decode param - ' . $bitsPerComponent . '.' ); } return $bitsPerComponent; @@ -165,6 +167,7 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface /** TIFF Predictor 2 */ if ($predictor == 2) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not implemented yet' ); } @@ -184,6 +187,7 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface $predictor -= 10; if($bitsPerComponent == 16) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("PNG Prediction with bit depth greater than 8 not yet supported."); } @@ -195,6 +199,7 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface $offset = 0; if (!is_integer($rows)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Wrong data length.'); } @@ -273,6 +278,7 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface return $output; } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unknown prediction algorithm - ' . $predictor . '.' ); } @@ -296,6 +302,7 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface /** TIFF Predictor 2 */ if ($predictor == 2) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not implemented yet' ); } @@ -371,12 +378,14 @@ abstract class Zend_Pdf_Filter_Compression implements Zend_Pdf_Filter_Interface break; default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unknown prediction tag.'); } } return $output; } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unknown prediction algorithm - ' . $predictor . '.' ); } } diff --git a/libs/Zend/Pdf/Filter/Compression/Flate.php b/libs/Zend/Pdf/Filter/Compression/Flate.php index 6ef0479..26fdc73 100644 --- a/libs/Zend/Pdf/Filter/Compression/Flate.php +++ b/libs/Zend/Pdf/Filter/Compression/Flate.php @@ -16,14 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Flate.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Flate.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Filter_Compression */ require_once 'Zend/Pdf/Filter/Compression.php'; - /** * Flate stream filter * @@ -53,11 +52,13 @@ class Zend_Pdf_Filter_Compression_Flate extends Zend_Pdf_Filter_Compression if (($output = @gzcompress($data)) === false) { ini_set('track_errors', $trackErrors); + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception($php_errormsg); } ini_set('track_errors', $trackErrors); } else { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not implemented yet. You have to use zlib extension.'); } @@ -82,11 +83,13 @@ class Zend_Pdf_Filter_Compression_Flate extends Zend_Pdf_Filter_Compression if (($output = @gzuncompress($data)) === false) { ini_set('track_errors', $trackErrors); + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception($php_errormsg); } ini_set('track_errors', $trackErrors); } else { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not implemented yet'); } diff --git a/libs/Zend/Pdf/Filter/Compression/Lzw.php b/libs/Zend/Pdf/Filter/Compression/Lzw.php index f0df897..1f34e0f 100644 --- a/libs/Zend/Pdf/Filter/Compression/Lzw.php +++ b/libs/Zend/Pdf/Filter/Compression/Lzw.php @@ -16,14 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Lzw.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Lzw.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Filter_Compression */ require_once 'Zend/Pdf/Filter/Compression.php'; - /** * LZW stream filter * @@ -46,6 +45,7 @@ class Zend_Pdf_Filter_Compression_Lzw extends Zend_Pdf_Filter_Compression $earlyChange = $params['EarlyChange']; if ($earlyChange != 0 && $earlyChange != 1) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Invalid value of \'EarlyChange\' decode param - ' . $earlyChange . '.' ); } return $earlyChange; @@ -69,6 +69,7 @@ class Zend_Pdf_Filter_Compression_Lzw extends Zend_Pdf_Filter_Compression $data = self::_applyEncodeParams($data, $params); } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not implemented yet'); } @@ -82,6 +83,7 @@ class Zend_Pdf_Filter_Compression_Lzw extends Zend_Pdf_Filter_Compression */ public static function decode($data, $params = null) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Not implemented yet'); if ($params !== null) { diff --git a/libs/Zend/Pdf/Font.php b/libs/Zend/Pdf/Font.php index 0b4bd4d..fbf6c55 100644 --- a/libs/Zend/Pdf/Font.php +++ b/libs/Zend/Pdf/Font.php @@ -17,75 +17,9 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Font.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Font.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_FileParserDataSource */ -require_once 'Zend/Pdf/FileParserDataSource.php'; - -/** Zend_Pdf_FileParserDataSource_File */ -require_once 'Zend/Pdf/FileParserDataSource/File.php'; - -/** Zend_Pdf_FileParserDataSource_String */ -require_once 'Zend/Pdf/FileParserDataSource/String.php'; - -/** Zend_Pdf_FileParser_Font_OpenType_TrueType */ -require_once 'Zend/Pdf/FileParser/Font/OpenType/TrueType.php'; - -/** Zend_Pdf_Resource_Font_Simple_Parsed_TrueType */ -require_once 'Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php'; - -/** Zend_Pdf_Resource_Font_Type0 */ -require_once 'Zend/Pdf/Resource/Font/Type0.php'; - -/** Zend_Pdf_Resource_Font_CidFont_TrueType */ -require_once 'Zend/Pdf/Resource/Font/CidFont/TrueType.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_Courier */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/Courier.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_CourierBold */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_CourierBoldOblique */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_CourierOblique */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_Helvetica */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBold */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBoldOblique */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_HelveticaOblique */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_Symbol */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_TimesBold */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_TimesBoldItalic */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_TimesItalic */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_TimesRoman */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php'; - -/** Zend_Pdf_Resource_Font_Simple_Standard_ZapfDingbats */ -require_once 'Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php'; - -/** Zend_Pdf_Resource_Font_Extracted */ -require_once 'Zend/Pdf/Resource/Font/Extracted.php'; - /** * Abstract factory class which vends {@link Zend_Pdf_Resource_Font} objects. @@ -547,62 +481,77 @@ abstract class Zend_Pdf_Font */ switch ($name) { case Zend_Pdf_Font::FONT_COURIER: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/Courier.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_Courier(); break; case Zend_Pdf_Font::FONT_COURIER_BOLD: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_CourierBold(); break; case Zend_Pdf_Font::FONT_COURIER_OBLIQUE: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_CourierOblique(); break; case Zend_Pdf_Font::FONT_COURIER_BOLD_OBLIQUE: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_CourierBoldOblique(); break; case Zend_Pdf_Font::FONT_HELVETICA: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_Helvetica(); break; case Zend_Pdf_Font::FONT_HELVETICA_BOLD: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBold(); break; case Zend_Pdf_Font::FONT_HELVETICA_OBLIQUE: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_HelveticaOblique(); break; case Zend_Pdf_Font::FONT_HELVETICA_BOLD_OBLIQUE: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBoldOblique(); break; case Zend_Pdf_Font::FONT_SYMBOL: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_Symbol(); break; case Zend_Pdf_Font::FONT_TIMES_ROMAN: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_TimesRoman(); break; case Zend_Pdf_Font::FONT_TIMES_BOLD: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_TimesBold(); break; case Zend_Pdf_Font::FONT_TIMES_ITALIC: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_TimesItalic(); break; case Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_TimesBoldItalic(); break; case Zend_Pdf_Font::FONT_ZAPFDINGBATS: + require_once 'Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php'; $font = new Zend_Pdf_Resource_Font_Simple_Standard_ZapfDingbats(); break; default: + require_once 'Zend/Pdf/Excaption.php'; throw new Zend_Pdf_Exception("Unknown font name: $name", Zend_Pdf_Exception::BAD_FONT_NAME); } @@ -650,6 +599,7 @@ abstract class Zend_Pdf_Font /* Create a file parser data source object for this file. File path and * access permission checks are handled here. */ + require_once 'Zend/Pdf/FileParserDataSource/File.php'; $dataSource = new Zend_Pdf_FileParserDataSource_File($filePath); /* Attempt to determine the type of font. We can't always trust file @@ -713,6 +663,7 @@ abstract class Zend_Pdf_Font } else { /* The type of font could not be determined. Give up. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Cannot determine font type: $filePath", Zend_Pdf_Exception::CANT_DETERMINE_FONT_TYPE); } @@ -744,12 +695,16 @@ abstract class Zend_Pdf_Font protected static function _extractTrueTypeFont($dataSource, $embeddingOptions) { try { + require_once 'Zend/Pdf/FileParser/Font/OpenType/TrueType.php'; $fontParser = new Zend_Pdf_FileParser_Font_OpenType_TrueType($dataSource); $fontParser->parse(); if ($fontParser->isAdobeLatinSubset) { + require_once 'Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php'; $font = new Zend_Pdf_Resource_Font_Simple_Parsed_TrueType($fontParser, $embeddingOptions); } else { + require_once 'Zend/Pdf/Resource/Font/CidFont/TrueType.php'; + require_once 'Zend/Pdf/Resource/Font/Type0.php'; /* Use Composite Type 0 font which supports Unicode character mapping */ $cidFont = new Zend_Pdf_Resource_Font_CidFont_TrueType($fontParser, $embeddingOptions); $font = new Zend_Pdf_Resource_Font_Type0($cidFont); @@ -761,6 +716,7 @@ abstract class Zend_Pdf_Font * a problem; throw the exception again. */ $fontParser = null; + require_once 'Zend/Pdf/Exception.php'; switch ($exception->getCode()) { case Zend_Pdf_Exception::WRONG_FONT_TYPE: // break intentionally omitted case Zend_Pdf_Exception::BAD_TABLE_COUNT: // break intentionally omitted @@ -773,5 +729,4 @@ abstract class Zend_Pdf_Font } return $font; } - } diff --git a/libs/Zend/Pdf/Image.php b/libs/Zend/Pdf/Image.php index bfa66ba..777a46f 100644 --- a/libs/Zend/Pdf/Image.php +++ b/libs/Zend/Pdf/Image.php @@ -17,17 +17,9 @@ * @subpackage Images * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Image.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Image.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_FileParserDataSource */ -require_once 'Zend/Pdf/FileParserDataSource.php'; - -/** Zend_Pdf_FileParserDataSource_File */ -require_once 'Zend/Pdf/FileParserDataSource/File.php'; - -/** Zend_Pdf_FileParserDataSource_String */ -require_once 'Zend/Pdf/FileParserDataSource/String.php'; /** * Abstract factory class which vends {@link Zend_Pdf_Resource_Image} objects. @@ -124,7 +116,6 @@ abstract class Zend_Pdf_Image */ public static function imageWithPath($filePath) { - /** * use old implementation * @todo switch to new implementation @@ -136,6 +127,7 @@ abstract class Zend_Pdf_Image /* Create a file parser data source object for this file. File path and * access permission checks are handled here. */ + require_once 'Zend/Pdf/FileParserDataSource/File.php'; $dataSource = new Zend_Pdf_FileParserDataSource_File($filePath); /* Attempt to determine the type of image. We can't always trust file @@ -163,6 +155,7 @@ abstract class Zend_Pdf_Image $image = Zend_Pdf_Image::_extractJpegImage($dataSource); break; default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Cannot create image resource. File extension not known or unsupported type."); break; } @@ -177,17 +170,18 @@ abstract class Zend_Pdf_Image } else { /* The type of image could not be determined. Give up. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Cannot determine image type: $filePath", - Zend_Pdf_Exception::CANT_DETERMINE_IMAGE_TYPE); + Zend_Pdf_Exception::CANT_DETERMINE_IMAGE_TYPE); } } - /**** Internal Methods ****/ + /**** Internal Methods ****/ - /* Image Extraction Methods */ + /* Image Extraction Methods */ /** * Attempts to extract a JPEG Image from the data source. @@ -199,7 +193,12 @@ abstract class Zend_Pdf_Image */ protected static function _extractJpegImage($dataSource) { + require_once 'Zend/Pdf/Exception.php'; + throw new Zend_Pdf_Exception('Jpeg image fileparser is not implemented. Old styly implementation has to be used.'); + + require_once 'Zend/Pdf/FileParser/Image/Jpeg.php'; $imageParser = new Zend_Pdf_FileParser_Image_Jpeg($dataSource); + require_once 'Zend/Pdf/Resource/Image/Jpeg.php'; $image = new Zend_Pdf_Resource_Image_Jpeg($imageParser); unset($imageParser); @@ -212,12 +211,13 @@ abstract class Zend_Pdf_Image * @param Zend_Pdf_FileParserDataSource $dataSource * @return Zend_Pdf_Resource_Image_Png May also return null if * the data source does not appear to contain valid image data. - * @throws Zend_Pdf_Exception */ protected static function _extractPngImage($dataSource) { - $imageParser = new Zend_Pdf_FileParser_Image_PNG($dataSource); - $image = new Zend_Pdf_Resource_Image_PNG($imageParser); + require_once 'Zend/Pdf/FileParser/Image/Png.php'; + $imageParser = new Zend_Pdf_FileParser_Image_Png($dataSource); + require_once 'Zend/Pdf/Resource/Image/Png.php'; + $image = new Zend_Pdf_Resource_Image_Png($imageParser); unset($imageParser); return $image; @@ -233,14 +233,15 @@ abstract class Zend_Pdf_Image */ protected static function _extractTiffImage($dataSource) { + require_once 'Zend/Pdf/Exception.php'; + throw new Zend_Pdf_Exception('Tiff image fileparser is not implemented. Old styly implementation has to be used.'); + + require_once 'Zend/Pdf/FileParser/Image/Tiff.php'; $imageParser = new Zend_Pdf_FileParser_Image_Tiff($dataSource); + require_once 'Zend/Pdf/Resource/Image/Tiff.php'; $image = new Zend_Pdf_Resource_Image_Tiff($imageParser); unset($imageParser); return $image; } - } - - - diff --git a/libs/Zend/Pdf/NameTree.php b/libs/Zend/Pdf/NameTree.php index 0f591de..e131f8b 100644 --- a/libs/Zend/Pdf/NameTree.php +++ b/libs/Zend/Pdf/NameTree.php @@ -20,8 +20,8 @@ * @version $Id: Action.php 16978 2009-07-22 19:59:40Z alexander $ */ -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; /** diff --git a/libs/Zend/Pdf/Outline.php b/libs/Zend/Pdf/Outline.php index 6b9598c..3c88299 100644 --- a/libs/Zend/Pdf/Outline.php +++ b/libs/Zend/Pdf/Outline.php @@ -20,9 +20,6 @@ * @version $Id$ */ -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - /** * Abstract PDF outline representation class @@ -170,7 +167,7 @@ abstract class Zend_Pdf_Outline implements RecursiveIterator, Countable * Set outline options * * @param array $options - * @return Zend_Pdf_Actions + * @return Zend_Pdf_Action * @throws Zend_Pdf_Exception */ public function setOptions(array $options) @@ -232,13 +229,13 @@ abstract class Zend_Pdf_Outline implements RecursiveIterator, Countable */ public static function create($param1, $param2 = null) { + require_once 'Zend/Pdf/Outline/Created.php'; if (is_string($param1)) { if ($param2 !== null && !($param2 instanceof Zend_Pdf_Target || is_string($param2))) { require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Outline create method takes $title (string) and $target (Zend_Pdf_Target or string) or an array as an input'); } - require_once 'Zend/Pdf/Outline/Created.php'; return new Zend_Pdf_Outline_Created(array('title' => $param1, 'target' => $param2)); } else { diff --git a/libs/Zend/Pdf/Outline/Created.php b/libs/Zend/Pdf/Outline/Created.php index 6b79a2f..7d03c80 100644 --- a/libs/Zend/Pdf/Outline/Created.php +++ b/libs/Zend/Pdf/Outline/Created.php @@ -20,19 +20,17 @@ * @version $Id$ */ -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/String.php'; + /** Zend_Pdf_Outline */ require_once 'Zend/Pdf/Outline.php'; -/** Zend_Pdf_Destination */ -require_once 'Zend/Pdf/Destination.php'; - -/** Zend_Pdf_Action */ -require_once 'Zend/Pdf/Action.php'; - - /** * PDF outline representation class * diff --git a/libs/Zend/Pdf/Outline/Loaded.php b/libs/Zend/Pdf/Outline/Loaded.php index 8f2b8b8..5ccea31 100644 --- a/libs/Zend/Pdf/Outline/Loaded.php +++ b/libs/Zend/Pdf/Outline/Loaded.php @@ -20,19 +20,17 @@ * @version $Id$ */ -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; + +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/String.php'; + /** Zend_Pdf_Outline */ require_once 'Zend/Pdf/Outline.php'; -/** Zend_Pdf_Destination */ -require_once 'Zend/Pdf/Destination.php'; - -/** Zend_Pdf_Action */ -require_once 'Zend/Pdf/Action.php'; - - /** * Traceable PDF outline representation class * @@ -239,8 +237,10 @@ class Zend_Pdf_Outline_Loaded extends Zend_Pdf_Outline throw new Zend_Pdf_Exception('Outline dictionary may contain Dest or A entry, but not both.'); } + require_once 'Zend/Pdf/Destination.php'; return Zend_Pdf_Destination::load($this->_outlineDictionary->Dest); } else if ($this->_outlineDictionary->A !== null) { + require_once 'Zend/Pdf/Action.php'; return Zend_Pdf_Action::load($this->_outlineDictionary->A); } diff --git a/libs/Zend/Pdf/Page.php b/libs/Zend/Pdf/Page.php index 096f39b..89d5df3 100644 --- a/libs/Zend/Pdf/Page.php +++ b/libs/Zend/Pdf/Page.php @@ -16,38 +16,20 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Page.php 17532 2009-08-10 19:04:14Z alexander $ + * @version $Id: Page.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Resource_Font */ -require_once 'Zend/Pdf/Resource/Font.php'; - -/** Zend_Pdf_Style */ -require_once 'Zend/Pdf/Style.php'; - -/** Zend_Pdf_Element_Dictionary */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element.php'; +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/String/Binary.php'; +require_once 'Zend/Pdf/Element/Boolean.php'; require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Null.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/String.php'; -/** Zend_Pdf_Element_Reference */ -require_once 'Zend/Pdf/Element/Reference.php'; - -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - -/** Zend_Pdf_Color */ -require_once 'Zend/Pdf/Color.php'; - -/** Zend_Pdf_Color_GrayScale */ -require_once 'Zend/Pdf/Color/GrayScale.php'; - -/** Zend_Pdf_Color_Rgb */ -require_once 'Zend/Pdf/Color/Rgb.php'; - -/** Zend_Pdf_Color_Cmyk */ -require_once 'Zend/Pdf/Color/Cmyk.php'; - -/** Zend_Pdf_Annotation */ -require_once 'Zend/Pdf/Annotation.php'; /** * PDF Page @@ -279,7 +261,12 @@ class Zend_Pdf_Page } else if (is_string($param1) && ($param2 === null || $param2 instanceof Zend_Pdf_ElementFactory_Interface) && $param3 === null) { - $this->_objFactory = ($param2 !== null)? $param2 : Zend_Pdf_ElementFactory::createFactory(1); + if ($param2 !== null) { + $this->_objFactory = $param2; + } else { + require_once 'Zend/Pdf/ElementFactory.php'; + $this->_objFactory = Zend_Pdf_ElementFactory::createFactory(1); + } $this->_attached = false; $this->_safeGS = true; /** New page created. That's users App responsibility to track GS changes */ @@ -318,7 +305,13 @@ class Zend_Pdf_Page } else if (is_numeric($param1) && is_numeric($param2) && ($param3 === null || $param3 instanceof Zend_Pdf_ElementFactory_Interface)) { - $this->_objFactory = ($param3 !== null)? $param3 : Zend_Pdf_ElementFactory::createFactory(1); + if ($param3 !== null) { + $this->_objFactory = $param3; + } else { + require_once 'Zend/Pdf/ElementFactory.php'; + $this->_objFactory = Zend_Pdf_ElementFactory::createFactory(1); + } + $this->_attached = false; $this->_safeGS = true; /** New page created. That's users App responsibility to track GS changes */ $pageWidth = $param1; @@ -331,6 +324,7 @@ class Zend_Pdf_Page $this->_pageDictionary = $this->_objFactory->newObject(new Zend_Pdf_Element_Dictionary()); $this->_pageDictionary->Type = new Zend_Pdf_Element_Name('Page'); + require_once 'Zend/Pdf.php'; $this->_pageDictionary->LastModified = new Zend_Pdf_Element_String(Zend_Pdf::pdfDate()); $this->_pageDictionary->Resources = new Zend_Pdf_Element_Dictionary(); $this->_pageDictionary->MediaBox = new Zend_Pdf_Element_Array(); @@ -758,6 +752,7 @@ class Zend_Pdf_Page require_once 'Zend/Pdf/Exception.php'; foreach ($fontResourcesUnique as $resourceId => $fontDictionary) { try { + require_once 'Zend/Pdf/Resource/Font/Extracted.php'; // Try to extract font $extractedFont = new Zend_Pdf_Resource_Font_Extracted($fontDictionary); @@ -815,6 +810,7 @@ class Zend_Pdf_Page try { // Try to extract font + require_once 'Zend/Pdf/Resource/Font/Extracted.php'; return new Zend_Pdf_Resource_Font_Extracted($fontDictionary); } catch (Zend_Pdf_Exception $e) { if ($e->getMessage() != 'Unsupported font type.') { diff --git a/libs/Zend/Pdf/Parser.php b/libs/Zend/Pdf/Parser.php index f301f11..e090bc0 100644 --- a/libs/Zend/Pdf/Parser.php +++ b/libs/Zend/Pdf/Parser.php @@ -16,56 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Parser.php 17530 2009-08-10 18:47:29Z alexander $ + * @version $Id: Parser.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Element */ +/** Internally used classes */ require_once 'Zend/Pdf/Element.php'; - -/** Zend_Pdf_Element_Array */ -require_once 'Zend/Pdf/Element/Array.php'; - -/** Zend_Pdf_Element_String_Binary */ -require_once 'Zend/Pdf/Element/String/Binary.php'; - -/** Zend_Pdf_Element_Boolean */ -require_once 'Zend/Pdf/Element/Boolean.php'; - -/** Zend_Pdf_Element_Dictionary */ -require_once 'Zend/Pdf/Element/Dictionary.php'; - -/** Zend_Pdf_Element_Name */ -require_once 'Zend/Pdf/Element/Name.php'; - -/** Zend_Pdf_Element_Numeric */ require_once 'Zend/Pdf/Element/Numeric.php'; -/** Zend_Pdf_Element_Object */ -require_once 'Zend/Pdf/Element/Object.php'; - -/** Zend_Pdf_Element_Reference */ -require_once 'Zend/Pdf/Element/Reference.php'; - -/** Zend_Pdf_Element_Object_Stream */ -require_once 'Zend/Pdf/Element/Object/Stream.php'; - -/** Zend_Pdf_Element_String */ -require_once 'Zend/Pdf/Element/String.php'; - -/** Zend_Pdf_Element_Null */ -require_once 'Zend/Pdf/Element/Null.php'; - -/** Zend_Pdf_Element_Reference_Context */ -require_once 'Zend/Pdf/Element/Reference/Context.php'; - -/** Zend_Pdf_Element_Reference_Table */ -require_once 'Zend/Pdf/Element/Reference/Table.php'; - -/** Zend_Pdf_Trailer_Keeper */ -require_once 'Zend/Pdf/Trailer/Keeper.php'; - -/** Zend_Pdf_ElementFactory_Interface */ -require_once 'Zend/Pdf/ElementFactory/Interface.php'; /** Zend_Pdf_StringParser */ require_once 'Zend/Pdf/StringParser.php'; @@ -143,7 +100,9 @@ class Zend_Pdf_Parser { $this->_stringParser->offset = $offset; + require_once 'Zend/Pdf/Element/Reference/Table.php'; $refTable = new Zend_Pdf_Element_Reference_Table(); + require_once 'Zend/Pdf/Element/Reference/Context.php'; $context = new Zend_Pdf_Element_Reference_Context($this->_stringParser, $refTable); $this->_stringParser->setContext($context); @@ -155,12 +114,14 @@ class Zend_Pdf_Parser $this->_stringParser->skipWhiteSpace(); while ( ($nextLexeme = $this->_stringParser->readLexeme()) != 'trailer' ) { if (!ctype_digit($nextLexeme)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Cross-reference table subheader values must contain only digits.', $this->_stringParser->offset-strlen($nextLexeme))); } $objNum = (int)$nextLexeme; $refCount = $this->_stringParser->readLexeme(); if (!ctype_digit($refCount)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Cross-reference table subheader values must contain only digits.', $this->_stringParser->offset-strlen($refCount))); } @@ -168,6 +129,7 @@ class Zend_Pdf_Parser while ($refCount > 0) { $objectOffset = substr($this->_stringParser->data, $this->_stringParser->offset, 10); if (!ctype_digit($objectOffset)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file cross-reference table syntax error. Offset - 0x%X. Offset must contain only digits.', $this->_stringParser->offset)); } // Force $objectOffset to be treated as decimal instead of octal number @@ -179,13 +141,15 @@ class Zend_Pdf_Parser $objectOffset = substr($objectOffset, $numStart); $this->_stringParser->offset += 10; - if ( !Zend_Pdf_StringParser::isWhiteSpace(ord( $this->_stringParser->data[$this->_stringParser->offset] )) ) { + if (strpos("\x00\t\n\f\r ", $this->_stringParser->data[$this->_stringParser->offset]) === false) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file cross-reference table syntax error. Offset - 0x%X. Value separator must be white space.', $this->_stringParser->offset)); } $this->_stringParser->offset++; $genNumber = substr($this->_stringParser->data, $this->_stringParser->offset, 5); if (!ctype_digit($objectOffset)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file cross-reference table syntax error. Offset - 0x%X. Offset must contain only digits.', $this->_stringParser->offset)); } // Force $objectOffset to be treated as decimal instead of octal number @@ -197,7 +161,8 @@ class Zend_Pdf_Parser $genNumber = substr($genNumber, $numStart); $this->_stringParser->offset += 5; - if ( !Zend_Pdf_StringParser::isWhiteSpace(ord( $this->_stringParser->data[$this->_stringParser->offset] )) ) { + if (strpos("\x00\t\n\f\r ", $this->_stringParser->data[$this->_stringParser->offset]) === false) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file cross-reference table syntax error. Offset - 0x%X. Value separator must be white space.', $this->_stringParser->offset)); } $this->_stringParser->offset++; @@ -223,10 +188,12 @@ class Zend_Pdf_Parser } if ( !Zend_Pdf_StringParser::isWhiteSpace(ord( $this->_stringParser->data[$this->_stringParser->offset] )) ) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file cross-reference table syntax error. Offset - 0x%X. Value separator must be white space.', $this->_stringParser->offset)); } $this->_stringParser->offset++; if ( !Zend_Pdf_StringParser::isWhiteSpace(ord( $this->_stringParser->data[$this->_stringParser->offset] )) ) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file cross-reference table syntax error. Offset - 0x%X. Value separator must be white space.', $this->_stringParser->offset)); } $this->_stringParser->offset++; @@ -239,20 +206,24 @@ class Zend_Pdf_Parser $trailerDictOffset = $this->_stringParser->offset; $trailerDict = $this->_stringParser->readElement(); if (!$trailerDict instanceof Zend_Pdf_Element_Dictionary) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Dictionary expected after \'trailer\' keyword.', $trailerDictOffset)); } } else { $xrefStream = $this->_stringParser->getObject($offset, $context); if (!$xrefStream instanceof Zend_Pdf_Element_Object_Stream) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Cross-reference stream expected.', $offset)); } $trailerDict = $xrefStream->dictionary; if ($trailerDict->Type->value != 'XRef') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Cross-reference stream object must have /Type property assigned to /XRef.', $offset)); } if ($trailerDict->W === null || $trailerDict->W->getType() != Zend_Pdf_Element::TYPE_ARRAY) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Cross reference stream dictionary doesn\'t have W entry or it\'s not an array.', $offset)); } @@ -261,6 +232,7 @@ class Zend_Pdf_Parser $entryField3Size = $trailerDict->W->items[2]->value; if ($entryField2Size == 0 || $entryField3Size == 0) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Wrong W dictionary entry. Only type field of stream entries has default value and could be zero length.', $offset)); } @@ -268,6 +240,7 @@ class Zend_Pdf_Parser if ($trailerDict->Index !== null) { if ($trailerDict->Index->getType() != Zend_Pdf_Element::TYPE_ARRAY) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Cross reference stream dictionary Index entry must be an array.', $offset)); } $sections = count($trailerDict->Index->items)/2; @@ -341,10 +314,12 @@ class Zend_Pdf_Parser // $streamOffset . ' ' . strlen($xrefStreamData) . "\n"; // "$entries\n"; + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Cross-reference streams are not supported yet.'); } + require_once 'Zend/Pdf/Trailer/Keeper.php'; $trailerObj = new Zend_Pdf_Trailer_Keeper($trailerDict, $context); if ($trailerDict->Prev instanceof Zend_Pdf_Element_Numeric || $trailerDict->Prev instanceof Zend_Pdf_Element_Reference ) { @@ -388,6 +363,7 @@ class Zend_Pdf_Parser { if ($load) { if (($pdfFile = @fopen($source, 'rb')) === false ) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception( "Can not open '$source' file for reading." ); } @@ -408,6 +384,7 @@ class Zend_Pdf_Parser $pdfVersionComment = $this->_stringParser->readComment(); if (substr($pdfVersionComment, 0, 5) != '%PDF-') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('File is not a PDF.'); } @@ -421,6 +398,7 @@ class Zend_Pdf_Parser * Stream compression filter must be implemented (for compressed object streams). * Cross reference streams must be implemented */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('Unsupported PDF version. Zend_Pdf supports PDF 1.0-1.4. Current version - \'%f\'', $pdfVersion)); } $this->_pdfVersion = $pdfVersion; @@ -428,6 +406,7 @@ class Zend_Pdf_Parser $this->_stringParser->offset = strrpos($this->_stringParser->data, '%%EOF'); if ($this->_stringParser->offset === false || strlen($this->_stringParser->data) - $this->_stringParser->offset > 7) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Pdf file syntax error. End-of-fle marker expected at the end of file.'); } @@ -460,11 +439,13 @@ class Zend_Pdf_Parser $nextLexeme = $this->_stringParser->readLexeme(); if ($nextLexeme != 'startxref') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('Pdf file syntax error. \'startxref\' keyword expected. Offset - 0x%X.', $this->_stringParser->offset-strlen($nextLexeme))); } $startXref = $this->_stringParser->readLexeme(); if (!ctype_digit($startXref)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('Pdf file syntax error. Cross-reference table offset must contain only digits. Offset - 0x%X.', $this->_stringParser->offset-strlen($nextLexeme))); } diff --git a/libs/Zend/Pdf/Resource.php b/libs/Zend/Pdf/Resource.php index faaeb50..f35eec8 100644 --- a/libs/Zend/Pdf/Resource.php +++ b/libs/Zend/Pdf/Resource.php @@ -16,20 +16,10 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Resource.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Resource.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - -/** Zend_Pdf_Element_Object */ -require_once 'Zend/Pdf/Element/Object.php'; - -/** Zend_Pdf_Element_Dictionary */ -require_once 'Zend/Pdf/Element/Dictionary.php'; - - /** * PDF file Resource abstraction * @@ -76,6 +66,8 @@ abstract class Zend_Pdf_Resource */ public function __construct($resource) { + require_once 'Zend/Pdf/ElementFactory.php'; + $this->_objectFactory = Zend_Pdf_ElementFactory::createFactory(1); if ($resource instanceof Zend_Pdf_Element) { $this->_resource = $this->_objectFactory->newObject($resource); @@ -107,4 +99,3 @@ abstract class Zend_Pdf_Resource return $this->_objectFactory; } } - diff --git a/libs/Zend/Pdf/Resource/Font.php b/libs/Zend/Pdf/Resource/Font.php index 0b9fe8d..3ce81ba 100644 --- a/libs/Zend/Pdf/Resource/Font.php +++ b/libs/Zend/Pdf/Resource/Font.php @@ -17,12 +17,20 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Font.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Font.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Resource */ require_once 'Zend/Pdf/Resource.php'; +/** + * Zend_Pdf_Font + * + * Zend_Pdf_Font class constants are used within Zend_Pdf_Resource_Font + * and its subclusses. + */ +require_once 'Zend/Pdf/Font.php'; + /** * Abstract class which manages PDF fonts. * diff --git a/libs/Zend/Pdf/Resource/Font/CidFont.php b/libs/Zend/Pdf/Resource/Font/CidFont.php index ce84adc..e678ee6 100644 --- a/libs/Zend/Pdf/Resource/Font/CidFont.php +++ b/libs/Zend/Pdf/Resource/Font/CidFont.php @@ -17,35 +17,35 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CidFont.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CidFont.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/String.php'; + + /** Zend_Pdf_Resource_Font */ require_once 'Zend/Pdf/Resource/Font.php'; -/** Zend_Pdf_FileParser_Font_OpenType */ -require_once 'Zend/Pdf/FileParser/Font/OpenType.php'; - -/** Zend_Pdf_Cmap */ -require_once 'Zend/Pdf/Cmap.php'; - - - /** * Adobe PDF CIDFont font object implementation - * + * * A CIDFont program contains glyph descriptions that are accessed using a CID as * the character selector. There are two types of CIDFont. A Type 0 CIDFont contains * glyph descriptions based on Adobe’s Type 1 font format, whereas those in a * Type 2 CIDFont are based on the TrueType font format. * - * A CIDFont dictionary is a PDF object that contains information about a CIDFont program. - * Although its Type value is Font, a CIDFont is not actually a font. It does not have an Encoding - * entry, it cannot be listed in the Font subdictionary of a resource dictionary, and it cannot be - * used as the operand of the Tf operator. It is used only as a descendant of a Type 0 font. - * The CMap in the Type 0 font is what defines the encoding that maps character codes to CIDs - * in the CIDFont. - * + * A CIDFont dictionary is a PDF object that contains information about a CIDFont program. + * Although its Type value is Font, a CIDFont is not actually a font. It does not have an Encoding + * entry, it cannot be listed in the Font subdictionary of a resource dictionary, and it cannot be + * used as the operand of the Tf operator. It is used only as a descendant of a Type 0 font. + * The CMap in the Type 0 font is what defines the encoding that maps character codes to CIDs + * in the CIDFont. + * * Font objects should be normally be obtained from the factory methods * {@link Zend_Pdf_Font::fontWithName} and {@link Zend_Pdf_Font::fontWithPath}. * @@ -71,11 +71,11 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font /** * Width for characters missed in the font - * + * * @var integer */ protected $_missingCharWidth = 0; - + /** * Object constructor @@ -90,7 +90,7 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font parent::__construct(); $fontParser->parse(); - + /* Object properties */ @@ -132,7 +132,7 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font $charWidths[$charCode] = $glyphWidths[$glyph]; } $this->_charWidths = $charWidths; - $this->_missingCharWidth = $glyphWidths[0]; + $this->_missingCharWidth = $glyphWidths[0]; /* Width array optimization. Step1: extract default value */ $widthFrequencies = array_count_values($charWidths); @@ -147,12 +147,12 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font // Store default value in the font dictionary $this->_resource->DW = new Zend_Pdf_Element_Numeric($this->toEmSpace($defaultWidth)); - + // Remove characters which corresponds to default width from the widths array $defWidthChars = array_keys($charWidths, $defaultWidth); foreach ($defWidthChars as $charCode) { unset($charWidths[$charCode]); - } + } // Order cheracter widths aray by character codes ksort($charWidths, SORT_NUMERIC); @@ -166,7 +166,7 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font $sequenceStartCode = $charCode; } else if ($charCode != $lastCharCode + 1) { // New chracters sequence detected - $widthsSequences[$sequenceStartCode] = $charCodesSequense; + $widthsSequences[$sequenceStartCode] = $charCodesSequense; $charCodesSequense = array(); $sequenceStartCode = $charCode; } @@ -176,7 +176,7 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font // Save last sequence, if widths array is not empty (it may happens for monospaced fonts) if (count($charWidths) != 0) { $widthsSequences[$sequenceStartCode] = $charCodesSequense; - } + } $pdfCharsWidths = array(); foreach ($widthsSequences as $startCode => $widthsSequence) { @@ -191,7 +191,7 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font // Previous width value was a part of the widths sequence. Save it as 'c_1st c_last w'. $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($startCode); // First character code $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($startCode + $widthsInSequence - 1); // Last character code - $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($this->toEmSpace($lastWidth)); // Width + $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($this->toEmSpace($lastWidth)); // Width // Reset widths sequence $startCode = $startCode + $widthsInSequence; @@ -205,13 +205,13 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font } else { // Width is equal to previous if (count($pdfWidths) != 0) { - // We already have some widths collected + // We already have some widths collected // So, we've just detected new widths sequence - + // Remove last element from widths list, since it's a part of widths sequence array_pop($pdfWidths); - // and write the rest if it's not empty + // and write the rest if it's not empty if (count($pdfWidths) != 0) { // Save it as 'c_1st [w1 w2 ... wn]'. $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($startCode); // First character code @@ -241,7 +241,7 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font // Save it as 'c_1st c_last w'. $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($startCode); // First character code $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($startCode + $widthsInSequence - 1); // Last character code - $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($this->toEmSpace($lastWidth)); // Width + $pdfCharsWidths[] = new Zend_Pdf_Element_Numeric($this->toEmSpace($lastWidth)); // Width } } @@ -252,7 +252,7 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font $widthsObject = $this->_objectFactory->newObject($widthsArrayElement); $this->_resource->W = $widthsObject; - + /* CIDSystemInfo dictionary */ $cidSystemInfo = new Zend_Pdf_Element_Dictionary(); $cidSystemInfo->Registry = new Zend_Pdf_Element_String('Adobe'); @@ -262,8 +262,8 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font $this->_resource->CIDSystemInfo = $cidSystemInfoObject; } - - + + /** * Returns an array of glyph numbers corresponding to the Unicode characters. * @@ -278,12 +278,13 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font public function glyphNumbersForCharacters($characterCodes) { /** - * CIDFont object is not actually a font. It does not have an Encoding entry, - * it cannot be listed in the Font subdictionary of a resource dictionary, and + * CIDFont object is not actually a font. It does not have an Encoding entry, + * it cannot be listed in the Font subdictionary of a resource dictionary, and * it cannot be used as the operand of the Tf operator. - * + * * Throw an exception. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); } @@ -302,12 +303,13 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font public function glyphNumberForCharacter($characterCode) { /** - * CIDFont object is not actually a font. It does not have an Encoding entry, - * it cannot be listed in the Font subdictionary of a resource dictionary, and + * CIDFont object is not actually a font. It does not have an Encoding entry, + * it cannot be listed in the Font subdictionary of a resource dictionary, and * it cannot be used as the operand of the Tf operator. - * + * * Throw an exception. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); } @@ -401,7 +403,7 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font } return $this->_charWidths[$charCode]; } - + /** * Returns the widths of the glyphs. * @@ -412,12 +414,13 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font public function widthsForGlyphs($glyphNumbers) { /** - * CIDFont object is not actually a font. It does not have an Encoding entry, - * it cannot be listed in the Font subdictionary of a resource dictionary, and + * CIDFont object is not actually a font. It does not have an Encoding entry, + * it cannot be listed in the Font subdictionary of a resource dictionary, and * it cannot be used as the operand of the Tf operator. - * + * * Throw an exception. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); } @@ -433,12 +436,13 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font public function widthForGlyph($glyphNumber) { /** - * CIDFont object is not actually a font. It does not have an Encoding entry, - * it cannot be listed in the Font subdictionary of a resource dictionary, and + * CIDFont object is not actually a font. It does not have an Encoding entry, + * it cannot be listed in the Font subdictionary of a resource dictionary, and * it cannot be used as the operand of the Tf operator. - * + * * Throw an exception. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); } @@ -453,12 +457,13 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font public function encodeString($string, $charEncoding) { /** - * CIDFont object is not actually a font. It does not have an Encoding entry, - * it cannot be listed in the Font subdictionary of a resource dictionary, and + * CIDFont object is not actually a font. It does not have an Encoding entry, + * it cannot be listed in the Font subdictionary of a resource dictionary, and * it cannot be used as the operand of the Tf operator. - * + * * Throw an exception. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); } @@ -473,12 +478,13 @@ abstract class Zend_Pdf_Resource_Font_CidFont extends Zend_Pdf_Resource_Font public function decodeString($string, $charEncoding) { /** - * CIDFont object is not actually a font. It does not have an Encoding entry, - * it cannot be listed in the Font subdictionary of a resource dictionary, and + * CIDFont object is not actually a font. It does not have an Encoding entry, + * it cannot be listed in the Font subdictionary of a resource dictionary, and * it cannot be used as the operand of the Tf operator. - * + * * Throw an exception. */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('CIDFont PDF objects could not be used as the operand of the text drawing operators'); } } diff --git a/libs/Zend/Pdf/Resource/Font/CidFont/TrueType.php b/libs/Zend/Pdf/Resource/Font/CidFont/TrueType.php index d6d3d2a..f72c12d 100644 --- a/libs/Zend/Pdf/Resource/Font/CidFont/TrueType.php +++ b/libs/Zend/Pdf/Resource/Font/CidFont/TrueType.php @@ -17,16 +17,21 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TrueType.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TrueType.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Resource_Font_CidFont */ -require_once 'Zend/Pdf/Resource/Font/CidFont.php'; + +/** Internally used classes */ + +require_once 'Zend/Pdf/Element/Name.php'; /** Zend_Pdf_Resource_Font_FontDescriptor */ require_once 'Zend/Pdf/Resource/Font/FontDescriptor.php'; +/** Zend_Pdf_Resource_Font_CidFont */ +require_once 'Zend/Pdf/Resource/Font/CidFont.php'; + /** * Type 2 CIDFonts implementation * @@ -46,8 +51,8 @@ class Zend_Pdf_Resource_Font_CidFont_TrueType extends Zend_Pdf_Resource_Font_Cid { /** * Object constructor - * - * @todo Joing this class with Zend_Pdf_Resource_Font_Simple_Parsed_TrueType + * + * @todo Joing this class with Zend_Pdf_Resource_Font_Simple_Parsed_TrueType * * @param Zend_Pdf_FileParser_Font_OpenType_TrueType $fontParser Font parser * object containing parsed TrueType file. @@ -61,7 +66,7 @@ class Zend_Pdf_Resource_Font_CidFont_TrueType extends Zend_Pdf_Resource_Font_Cid $this->_fontType = Zend_Pdf_Font::TYPE_CIDFONT_TYPE_2; $this->_resource->Subtype = new Zend_Pdf_Element_Name('CIDFontType2'); - + $fontDescriptor = Zend_Pdf_Resource_Font_FontDescriptor::factory($this, $fontParser, $embeddingOptions); $this->_resource->FontDescriptor = $this->_objectFactory->newObject($fontDescriptor); diff --git a/libs/Zend/Pdf/Resource/Font/Extracted.php b/libs/Zend/Pdf/Resource/Font/Extracted.php index a9785cb..fb076a3 100644 --- a/libs/Zend/Pdf/Resource/Font/Extracted.php +++ b/libs/Zend/Pdf/Resource/Font/Extracted.php @@ -17,17 +17,13 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Extracted.php 17530 2009-08-10 18:47:29Z alexander $ + * @version $Id: Extracted.php 18993 2009-11-15 17:09:16Z alexander $ */ + /** Zend_Pdf_Resource_Font */ require_once 'Zend/Pdf/Resource/Font.php'; -/** Zend_Pdf_Cmap */ -require_once 'Zend/Pdf/Cmap.php'; - - - /** * Extracted fonts implementation * @@ -73,6 +69,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font // Composite type 0 font if (count($fontDictionary->DescendantFonts->items) != 1) { // Multiple descendant fonts are not supported + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unsupported font type.'); } @@ -111,6 +108,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font break; default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Unsupported font type.'); } @@ -142,6 +140,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font */ public function glyphNumbersForCharacters($characterCodes) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); } @@ -159,6 +158,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font */ public function glyphNumberForCharacter($characterCode) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); } @@ -182,6 +182,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font */ public function getCoveredPercentage($string, $charEncoding = '') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); } @@ -199,6 +200,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font */ public function widthsForGlyphs($glyphNumbers) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); } @@ -213,6 +215,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font */ public function widthForGlyph($glyphNumber) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Operation is not supported for extracted fonts'); } @@ -235,6 +238,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font return iconv($charEncoding, 'CP1252//IGNORE', $string); } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Fonf encoding is not supported'); } @@ -257,6 +261,7 @@ class Zend_Pdf_Resource_Font_Extracted extends Zend_Pdf_Resource_Font return iconv('CP1252', $charEncoding, $string); } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Fonf encoding is not supported'); } } diff --git a/libs/Zend/Pdf/Resource/Font/FontDescriptor.php b/libs/Zend/Pdf/Resource/Font/FontDescriptor.php index 6c3be5c..afbe288 100644 --- a/libs/Zend/Pdf/Resource/Font/FontDescriptor.php +++ b/libs/Zend/Pdf/Resource/Font/FontDescriptor.php @@ -17,23 +17,24 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FontDescriptor.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: FontDescriptor.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + /** Zend_Pdf_Font */ require_once 'Zend/Pdf/Font.php'; -/** Zend_Pdf_Resource_Font */ -require_once 'Zend/Pdf/Resource/Font.php'; - -/** Zend_Pdf_FileParser_Font_OpenType */ -require_once 'Zend/Pdf/FileParser/Font/OpenType.php'; - /** * FontDescriptor implementation * - * A font descriptor specifies metrics and other attributes of a simple font or a + * A font descriptor specifies metrics and other attributes of a simple font or a * CIDFont as a whole, as distinct from the metrics of individual glyphs. These font * metrics provide information that enables a viewer application to synthesize a * substitute font or select a similar font when the font program is unavailable. The @@ -52,12 +53,13 @@ class Zend_Pdf_Resource_Font_FontDescriptor */ public function __construct() { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('Zend_Pdf_Resource_Font_FontDescriptor is not intended to be instantiated'); - } - + } + /** * Object constructor - * + * * The $embeddingOptions parameter allows you to set certain flags related * to font embedding. You may combine options by OR-ing them together. See * the EMBED_ constants defined in {@link Zend_Pdf_Font} for the list of @@ -67,8 +69,8 @@ class Zend_Pdf_Resource_Font_FontDescriptor * to use them. If the recipient of the PDF has the font installed on their * computer, they will see the correct fonts in the document. If they don't, * the PDF viewer will substitute or synthesize a replacement. - * - * + * + * * @param Zend_Pdf_Resource_Font $font Font * @param Zend_Pdf_FileParser_Font_OpenType $fontParser Font parser object containing parsed TrueType file. * @param integer $embeddingOptions Options for font embedding. @@ -129,7 +131,7 @@ class Zend_Pdf_Resource_Font_FontDescriptor * @todo Calculate value for StemV. */ $fontDescriptor->StemV = new Zend_Pdf_Element_Numeric(0); - + $fontDescriptor->MissingWidth = new Zend_Pdf_Element_Numeric($fontParser->glyphWidths[0]); /* Set up font embedding. This is where the actual font program itself @@ -164,6 +166,7 @@ class Zend_Pdf_Resource_Font_FontDescriptor $message = 'This font cannot be embedded in the PDF document. If you would like to use ' . 'it anyway, you must pass Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION ' . 'in the $options parameter of the font constructor.'; + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception($message, Zend_Pdf_Exception::FONT_CANT_BE_EMBEDDED); } diff --git a/libs/Zend/Pdf/Resource/Font/Simple.php b/libs/Zend/Pdf/Resource/Font/Simple.php index e7e23d6..5e56763 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple.php +++ b/libs/Zend/Pdf/Resource/Font/Simple.php @@ -17,21 +17,21 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Simple.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Simple.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font */ require_once 'Zend/Pdf/Resource/Font.php'; -/** Zend_Pdf_Cmap */ -require_once 'Zend/Pdf/Cmap.php'; - - - /** * Adobe PDF Simple fonts implementation - * - * PDF simple fonts functionality is presented by Adobe Type 1 + * + * PDF simple fonts functionality is presented by Adobe Type 1 * (including standard PDF Type1 built-in fonts) and TrueType fonts support. * * Both fonts have the following properties: @@ -40,17 +40,17 @@ require_once 'Zend/Pdf/Cmap.php'; * into a table of 256 glyphs; the mapping from codes to glyphs is called the font’s * encoding. * PDF specification provides a possibility to specify any user defined encoding in addition - * to the standard built-in encodings: Standard-Encoding, MacRomanEncoding, WinAnsiEncoding, - * and PDFDocEncoding, but Zend_Pdf simple fonts implementation operates only with + * to the standard built-in encodings: Standard-Encoding, MacRomanEncoding, WinAnsiEncoding, + * and PDFDocEncoding, but Zend_Pdf simple fonts implementation operates only with * Windows ANSI encoding (except Symbol and ZapfDingbats built-in fonts). * * - Each glyph has a single set of metrics, including a horizontal displacement or * width. That is, simple fonts support only horizontal writing mode. * - * + * * The code in this class is common to both types. However, you will only deal * directly with subclasses. - * + * * Font objects should be normally be obtained from the factory methods * {@link Zend_Pdf_Font::fontWithName} and {@link Zend_Pdf_Font::fontWithPath}. * @@ -81,12 +81,12 @@ abstract class Zend_Pdf_Resource_Font_Simple extends Zend_Pdf_Resource_Font /** * Width for glyphs missed in the font - * + * * Note: Adobe PDF specfication (V1.4 - V1.6) doesn't define behavior for rendering * characters missed in the standard PDF fonts (such us 0x7F (DEL) Windows ANSI code) * Adobe Font Metrics files doesn't also define metrics for "missed glyph". * We provide character width as "0" for this case, but actually it depends on PDF viewer - * implementation. + * implementation. * * @var integer */ @@ -108,13 +108,13 @@ abstract class Zend_Pdf_Resource_Font_Simple extends Zend_Pdf_Resource_Font /** * @todo - * It's easy to add other encodings support now (Standard-Encoding, MacRomanEncoding, + * It's easy to add other encodings support now (Standard-Encoding, MacRomanEncoding, * PDFDocEncoding, MacExpertEncoding, Symbol, and ZapfDingbats). * Steps for the implementation: * - completely describe all PDF single byte encodings in the documentation * - implement non-WinAnsi encodings processing into encodeString()/decodeString() methods - * - * These encodings will be automatically supported for standard builtin PDF fonts as well + * + * These encodings will be automatically supported for standard builtin PDF fonts as well * as for external fonts. */ $this->_resource->Encoding = new Zend_Pdf_Element_Name('WinAnsiEncoding'); @@ -251,8 +251,8 @@ abstract class Zend_Pdf_Resource_Font_Simple extends Zend_Pdf_Resource_Font /** * Convert string to the font encoding. - * - * The method is used to prepare string for text drawing operators + * + * The method is used to prepare string for text drawing operators * * @param string $string * @param string $charEncoding Character encoding of source text. @@ -263,7 +263,7 @@ abstract class Zend_Pdf_Resource_Font_Simple extends Zend_Pdf_Resource_Font if (PHP_OS == 'AIX') { return $string; // returning here b/c AIX doesnt know what CP1252 is } - + return iconv($charEncoding, 'CP1252//IGNORE', $string); } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Parsed.php b/libs/Zend/Pdf/Resource/Font/Simple/Parsed.php index 620c8d7..82015fa 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Parsed.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Parsed.php @@ -17,16 +17,19 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Parsed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Parsed.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Resource_Font_Simple */ require_once 'Zend/Pdf/Resource/Font/Simple.php'; -/** Zend_Pdf_FileParser_Font_OpenType */ -require_once 'Zend/Pdf/FileParser/Font/OpenType.php'; - - /** * Parsed and (optionaly) embedded fonts implementation * @@ -48,8 +51,8 @@ abstract class Zend_Pdf_Resource_Font_Simple_Parsed extends Zend_Pdf_Resource_Fo public function __construct(Zend_Pdf_FileParser_Font_OpenType $fontParser) { parent::__construct(); - - + + $fontParser->parse(); /* Object properties */ @@ -99,5 +102,4 @@ abstract class Zend_Pdf_Resource_Font_Simple_Parsed extends Zend_Pdf_Resource_Fo $widthsObject = $this->_objectFactory->newObject($widthsArrayElement); $this->_resource->Widths = $widthsObject; } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php b/libs/Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php index 130a1c9..3959fa9 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Parsed/TrueType.php @@ -17,16 +17,19 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TrueType.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: TrueType.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Resource_Font_Simple_Parsed */ -require_once 'Zend/Pdf/Resource/Font/Simple/Parsed.php'; + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; /** Zend_Pdf_Resource_Font_FontDescriptor */ require_once 'Zend/Pdf/Resource/Font/FontDescriptor.php'; +/** Zend_Pdf_Resource_Font_Simple_Parsed */ +require_once 'Zend/Pdf/Resource/Font/Simple/Parsed.php'; /** * TrueType fonts implementation diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard.php index c2dd6ad..f0fadb6 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Standard.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Standard.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple */ require_once 'Zend/Pdf/Resource/Font/Simple.php'; - /** * Abstract class definition for the standard 14 Type 1 PDF fonts. * @@ -75,5 +79,4 @@ abstract class Zend_Pdf_Resource_Font_Simple_Standard extends Zend_Pdf_Resource_ parent::__construct(); $this->_resource->Subtype = new Zend_Pdf_Element_Name('Type1'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/Courier.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Courier.php index b9ee831..770bdbc 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/Courier.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Courier.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Courier.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Courier.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Courier. * @@ -275,8 +279,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_Courier extends Zend_Pdf_Resource_F 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -287,5 +292,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_Courier extends Zend_Pdf_Resource_F */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Courier'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php index 4e2303a..25feae6 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBold.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CourierBold.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CourierBold.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Courier-Bold. * @@ -276,8 +280,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_CourierBold extends Zend_Pdf_Resour 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -288,5 +293,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_CourierBold extends Zend_Pdf_Resour */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Courier-Bold'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php index ff4344f..795aac8 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierBoldOblique.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CourierBoldOblique.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CourierBoldOblique.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Courier-BoldOblique. * @@ -277,8 +281,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_CourierBoldOblique extends Zend_Pdf 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -289,5 +294,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_CourierBoldOblique extends Zend_Pdf */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Courier-BoldOblique'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php index be79194..1f0b34d 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/CourierOblique.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CourierOblique.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CourierOblique.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Courier-Oblique. * @@ -277,8 +281,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_CourierOblique extends Zend_Pdf_Res 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -289,5 +294,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_CourierOblique extends Zend_Pdf_Res */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Courier-Oblique'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php index 3a67df1..86e4da6 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Helvetica.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Helvetica.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Helvetica.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Helvetica. * @@ -285,8 +289,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_Helvetica extends Zend_Pdf_Resource 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -297,5 +302,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_Helvetica extends Zend_Pdf_Resource */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Helvetica'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php index c06e09b..f52434e 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBold.php @@ -17,13 +17,16 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HelveticaBold.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HelveticaBold.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Helvetica-Bold. * @@ -286,8 +289,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBold extends Zend_Pdf_Reso 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -298,5 +302,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBold extends Zend_Pdf_Reso */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Helvetica-Bold'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php index 815e853..3a2cd0c 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaBoldOblique.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HelveticaBoldOblique.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HelveticaBoldOblique.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Helvetica-BoldOblique. * @@ -288,8 +292,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBoldOblique extends Zend_P 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -300,5 +305,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_HelveticaBoldOblique extends Zend_P */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Helvetica-BoldOblique'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php index d6ec9dc..871fcc8 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/HelveticaOblique.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HelveticaOblique.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HelveticaOblique.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Helvetica-Oblique. * @@ -287,8 +291,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_HelveticaOblique extends Zend_Pdf_R 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -299,5 +304,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_HelveticaOblique extends Zend_Pdf_R */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Helvetica-Oblique'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php index 2a496d5..3c9cb0e 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/Symbol.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Symbol.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Symbol.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Symbol. * @@ -342,8 +346,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_Symbol extends Zend_Pdf_Resource_Fo 0xf8f6 => 0xb5, 0xf8f7 => 0xb6, 0xf8f8 => 0xb7, 0xf8f9 => 0xb8, 0xf8fa => 0xb9, 0xf8fb => 0xba, 0xf8fc => 0xbb, 0xf8fd => 0xbc, 0xf8fe => 0xbd, 0xf8ff => 0xbe); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -457,5 +462,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_Symbol extends Zend_Pdf_Resource_Fo } return $this->decodeString($string, 'UTF-16BE'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php index 94e48db..801accc 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBold.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TimesBold.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TimesBold.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Times-Bold. * @@ -284,8 +288,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_TimesBold extends Zend_Pdf_Resource 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -296,5 +301,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_TimesBold extends Zend_Pdf_Resource */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Times-Bold'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php index 93de86b..9eb9d73 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesBoldItalic.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TimesBoldItalic.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TimesBoldItalic.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Times-BoldItalic. * @@ -285,8 +289,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_TimesBoldItalic extends Zend_Pdf_Re 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -297,5 +302,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_TimesBoldItalic extends Zend_Pdf_Re */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Times-BoldItalic'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php index 746c12f..c61d409 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesItalic.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TimesItalic.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TimesItalic.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Times-Italic. * @@ -285,8 +289,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_TimesItalic extends Zend_Pdf_Resour 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -297,5 +302,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_TimesItalic extends Zend_Pdf_Resour */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Times-Italic'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php index f83ccba..7d3a837 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/TimesRoman.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TimesRoman.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TimesRoman.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font Times-Roman. * @@ -285,8 +289,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_TimesRoman extends Zend_Pdf_Resourc 0xac => 0x0131, 0xf6 => 0x0132, 0xfc => 0x0133, 0x2260 => 0x0134, 0x0123 => 0x0135, 0xf0 => 0x0136, 0x017e => 0x0137, 0x0146 => 0x0138, 0xb9 => 0x0139, 0x012b => 0x013a, 0x20ac => 0x013b); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -297,5 +302,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_TimesRoman extends Zend_Pdf_Resourc */ $this->_resource->BaseFont = new Zend_Pdf_Element_Name('Times-Roman'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php b/libs/Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php index d714e29..0957af6 100644 --- a/libs/Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php +++ b/libs/Zend/Pdf/Resource/Font/Simple/Standard/ZapfDingbats.php @@ -17,13 +17,17 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ZapfDingbats.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ZapfDingbats.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font_Simple_Standard */ require_once 'Zend/Pdf/Resource/Font/Simple/Standard.php'; - /** * Implementation for the standard PDF font ZapfDingbats. * @@ -368,8 +372,9 @@ class Zend_Pdf_Resource_Font_Simple_Standard_ZapfDingbats extends Zend_Pdf_Resou 0x27b5 => 0xc1, 0x27b6 => 0xc2, 0x27b7 => 0xc3, 0x27b8 => 0xc4, 0x27b9 => 0xc5, 0x27ba => 0xc6, 0x27bb => 0xc7, 0x27bc => 0xc8, 0x27bd => 0xc9, 0x27be => 0xca); + require_once 'Zend/Pdf/Cmap.php'; $this->_cmap = Zend_Pdf_Cmap::cmapWithTypeData( - Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); + Zend_Pdf_Cmap::TYPE_BYTE_ENCODING_STATIC, $cmapData); /* Resource dictionary */ @@ -483,5 +488,4 @@ class Zend_Pdf_Resource_Font_Simple_Standard_ZapfDingbats extends Zend_Pdf_Resou } return $this->decodeString($string, 'UTF-16BE'); } - } diff --git a/libs/Zend/Pdf/Resource/Font/Type0.php b/libs/Zend/Pdf/Resource/Font/Type0.php index bf84e70..4e6e732 100644 --- a/libs/Zend/Pdf/Resource/Font/Type0.php +++ b/libs/Zend/Pdf/Resource/Font/Type0.php @@ -17,42 +17,41 @@ * @subpackage Fonts * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Type0.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Type0.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; + + /** Zend_Pdf_Resource_Font */ require_once 'Zend/Pdf/Resource/Font.php'; -/** Zend_Pdf_Resource_Font_CidFont */ -require_once 'Zend/Pdf/Resource/Font/CidFont.php'; - -/** Zend_Pdf_Resource_Font_CidFont_TrueType */ -require_once 'Zend/Pdf/Resource/Font/CidFont/TrueType.php'; - - /** * Adobe PDF composite fonts implementation - * + * * A composite font is one whose glyphs are obtained from other fonts or from fontlike * objects called CIDFonts ({@link Zend_Pdf_Resource_Font_CidFont}), organized hierarchically. - * In PDF, a composite font is represented by a font dictionary whose Subtype value is Type0; - * this is also called a Type 0 font (the Type 0 font at the top level of the hierarchy is the + * In PDF, a composite font is represented by a font dictionary whose Subtype value is Type0; + * this is also called a Type 0 font (the Type 0 font at the top level of the hierarchy is the * root font). - * + * * In PDF, a Type 0 font is a CID-keyed font. * * CID-keyed fonts provide effective method to operate with multi-byte character encodings. - * - * The CID-keyed font architecture specifies the external representation of certain font programs, + * + * The CID-keyed font architecture specifies the external representation of certain font programs, * called CMap and CIDFont files, along with some conventions for combining and using those files. - * - * A CID-keyed font is the combination of a CMap with one or more CIDFonts, simple fonts, + * + * A CID-keyed font is the combination of a CMap with one or more CIDFonts, simple fonts, * or composite fonts containing glyph descriptions. - * + * * The term 'CID-keyed font' reflects the fact that CID (character identifier) numbers * are used to index and access the glyph descriptions in the font. - * - * + * + * * Font objects should be normally be obtained from the factory methods * {@link Zend_Pdf_Font::fontWithName} and {@link Zend_Pdf_Font::fontWithPath}. * @@ -65,7 +64,7 @@ class Zend_Pdf_Resource_Font_Type0 extends Zend_Pdf_Resource_Font { /** * Descendant CIDFont - * + * * @var Zend_Pdf_Resource_Font_CidFont */ private $_descendantFont; @@ -73,7 +72,7 @@ class Zend_Pdf_Resource_Font_Type0 extends Zend_Pdf_Resource_Font /** * Generate ToUnicode character map data - * + * * @return string */ static private function getToUnicodeCMapData() @@ -107,9 +106,9 @@ class Zend_Pdf_Resource_Font_Type0 extends Zend_Pdf_Resource_Font public function __construct(Zend_Pdf_Resource_Font_CidFont $descendantFont) { parent::__construct(); - + $this->_objectFactory->attach($descendantFont->getFactory()); - + $this->_fontType = Zend_Pdf_Font::TYPE_TYPE_0; $this->_descendantFont = $descendantFont; @@ -130,23 +129,23 @@ class Zend_Pdf_Resource_Font_Type0 extends Zend_Pdf_Resource_Font $this->_ascent = $descendantFont->getAscent(); $this->_descent = $descendantFont->getDescent(); $this->_lineGap = $descendantFont->getLineGap(); - - + + $this->_resource->Subtype = new Zend_Pdf_Element_Name('Type0'); $this->_resource->BaseFont = new Zend_Pdf_Element_Name($descendantFont->getResource()->BaseFont->value); $this->_resource->DescendantFonts = new Zend_Pdf_Element_Array(array( $descendantFont->getResource() )); $this->_resource->Encoding = new Zend_Pdf_Element_Name('Identity-H'); - + $toUnicode = $this->_objectFactory->newStreamObject(self::getToUnicodeCMapData()); $this->_resource->ToUnicode = $toUnicode; - + } /** * Returns an array of glyph numbers corresponding to the Unicode characters. * * Zend_Pdf uses 'Identity-H' encoding for Type 0 fonts. - * So we don't need to perform any conversion + * So we don't need to perform any conversion * * See also {@link glyphNumberForCharacter()}. * @@ -162,7 +161,7 @@ class Zend_Pdf_Resource_Font_Type0 extends Zend_Pdf_Resource_Font * Returns the glyph number corresponding to the Unicode character. * * Zend_Pdf uses 'Identity-H' encoding for Type 0 fonts. - * So we don't need to perform any conversion + * So we don't need to perform any conversion * * @param integer $characterCode Unicode character code (code point). * @return integer Glyph number. @@ -171,7 +170,7 @@ class Zend_Pdf_Resource_Font_Type0 extends Zend_Pdf_Resource_Font { return $characterCode; } - + /** * Returns a number between 0 and 1 inclusive that indicates the percentage * of characters in the string which are covered by glyphs in this font. @@ -230,8 +229,8 @@ class Zend_Pdf_Resource_Font_Type0 extends Zend_Pdf_Resource_Font /** * Convert string to the font encoding. - * - * The method is used to prepare string for text drawing operators + * + * The method is used to prepare string for text drawing operators * * @param string $string * @param string $charEncoding Character encoding of source text. diff --git a/libs/Zend/Pdf/Resource/Image.php b/libs/Zend/Pdf/Resource/Image.php index 660d9ec..877efa4 100644 --- a/libs/Zend/Pdf/Resource/Image.php +++ b/libs/Zend/Pdf/Resource/Image.php @@ -16,19 +16,16 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Image.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Image.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Element_Object */ -require_once 'Zend/Pdf/Element/Object.php'; - -/** Zend_Pdf_Element_Dictionary */ -require_once 'Zend/Pdf/Element/Dictionary.php'; +/** Internally used classes */ /** Zend_Pdf_Element_Name */ require_once 'Zend/Pdf/Element/Name.php'; + /** Zend_Pdf_Resource */ require_once 'Zend/Pdf/Resource.php'; diff --git a/libs/Zend/Pdf/Resource/Image/Jpeg.php b/libs/Zend/Pdf/Resource/Image/Jpeg.php index c25c841..435a571 100644 --- a/libs/Zend/Pdf/Resource/Image/Jpeg.php +++ b/libs/Zend/Pdf/Resource/Image/Jpeg.php @@ -16,20 +16,18 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Jpeg.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Jpeg.php 19039 2009-11-19 15:05:32Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Resource_Image */ require_once 'Zend/Pdf/Resource/Image.php'; -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - -/** Zend_Pdf_Element_Name */ -require_once 'Zend/Pdf/Element/Name.php'; - - /** * JPEG image * @@ -58,7 +56,8 @@ class Zend_Pdf_Resource_Image_Jpeg extends Zend_Pdf_Resource_Image } $gd_options = gd_info(); - if (!$gd_options['JPG Support'] ) { + if ( (!isset($gd_options['JPG Support']) || $gd_options['JPG Support'] != true) && + (!isset($gd_options['JPEG Support']) || $gd_options['JPEG Support'] != true) ) { require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception('JPG support is not configured properly.'); } diff --git a/libs/Zend/Pdf/Resource/Image/Png.php b/libs/Zend/Pdf/Resource/Image/Png.php index 7aa87c0..6fbf33f 100644 --- a/libs/Zend/Pdf/Resource/Image/Png.php +++ b/libs/Zend/Pdf/Resource/Image/Png.php @@ -16,21 +16,21 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Png.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Png.php 18993 2009-11-15 17:09:16Z alexander $ */ + +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Dictionary.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/String/Binary.php'; + + /** Zend_Pdf_Resource_Image */ require_once 'Zend/Pdf/Resource/Image.php'; -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - -/** Zend_Pdf_Element_Name */ -require_once 'Zend/Pdf/Element/Name.php'; - -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - /** * PNG image * @@ -149,20 +149,27 @@ class Zend_Pdf_Resource_Image_Png extends Zend_Pdf_Resource_Image switch ($color) { case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_GRAY: $baseColor = ord(substr($trnsData, 1, 1)); - $transparencyData = array(new Zend_Pdf_Element_Numeric($baseColor), new Zend_Pdf_Element_Numeric($baseColor)); + $transparencyData = array(new Zend_Pdf_Element_Numeric($baseColor), + new Zend_Pdf_Element_Numeric($baseColor)); break; case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_RGB: $red = ord(substr($trnsData,1,1)); $green = ord(substr($trnsData,3,1)); $blue = ord(substr($trnsData,5,1)); - $transparencyData = array(new Zend_Pdf_Element_Numeric($red), new Zend_Pdf_Element_Numeric($red), new Zend_Pdf_Element_Numeric($green), new Zend_Pdf_Element_Numeric($green), new Zend_Pdf_Element_Numeric($blue), new Zend_Pdf_Element_Numeric($blue)); + $transparencyData = array(new Zend_Pdf_Element_Numeric($red), + new Zend_Pdf_Element_Numeric($red), + new Zend_Pdf_Element_Numeric($green), + new Zend_Pdf_Element_Numeric($green), + new Zend_Pdf_Element_Numeric($blue), + new Zend_Pdf_Element_Numeric($blue)); break; case Zend_Pdf_Resource_Image_Png::PNG_CHANNEL_INDEXED: //Find the first transparent color in the index, we will mask that. (This is a bit of a hack. This should be a SMask and mask all entries values). if(($trnsIdx = strpos($trnsData, chr(0))) !== false) { - $transparencyData = array(new Zend_Pdf_Element_Numeric($trnsIdx), new Zend_Pdf_Element_Numeric($trnsIdx)); + $transparencyData = array(new Zend_Pdf_Element_Numeric($trnsIdx), + new Zend_Pdf_Element_Numeric($trnsIdx)); } break; @@ -225,6 +232,7 @@ class Zend_Pdf_Resource_Image_Png extends Zend_Pdf_Resource_Image $colorSpace = new Zend_Pdf_Element_Name('DeviceGray'); + require_once 'Zend/Pdf/ElementFactory.php'; $decodingObjFactory = Zend_Pdf_ElementFactory::createFactory(1); $decodingStream = $decodingObjFactory->newStreamObject($imageData); $decodingStream->dictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); @@ -259,6 +267,7 @@ class Zend_Pdf_Resource_Image_Png extends Zend_Pdf_Resource_Image $colorSpace = new Zend_Pdf_Element_Name('DeviceRGB'); + require_once 'Zend/Pdf/ElementFactory.php'; $decodingObjFactory = Zend_Pdf_ElementFactory::createFactory(1); $decodingStream = $decodingObjFactory->newStreamObject($imageData); $decodingStream->dictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); @@ -297,11 +306,11 @@ class Zend_Pdf_Resource_Image_Png extends Zend_Pdf_Resource_Image * Includes the Alpha transparency data as a Gray Image, then assigns the image as the Shadow Mask for the main image data. */ $smaskStream = $this->_objectFactory->newStreamObject($smaskData); - $smaskStream->dictionary->Type = new Zend_Pdf_Element_Name('XObject'); - $smaskStream->dictionary->Subtype = new Zend_Pdf_Element_Name('Image'); - $smaskStream->dictionary->Width = new Zend_Pdf_Element_Numeric($width); - $smaskStream->dictionary->Height = new Zend_Pdf_Element_Numeric($height); - $smaskStream->dictionary->ColorSpace = new Zend_Pdf_Element_Name('DeviceGray'); + $smaskStream->dictionary->Type = new Zend_Pdf_Element_Name('XObject'); + $smaskStream->dictionary->Subtype = new Zend_Pdf_Element_Name('Image'); + $smaskStream->dictionary->Width = new Zend_Pdf_Element_Numeric($width); + $smaskStream->dictionary->Height = new Zend_Pdf_Element_Numeric($height); + $smaskStream->dictionary->ColorSpace = new Zend_Pdf_Element_Name('DeviceGray'); $smaskStream->dictionary->BitsPerComponent = new Zend_Pdf_Element_Numeric($bits); $imageDictionary->SMask = $smaskStream; diff --git a/libs/Zend/Pdf/Resource/Image/Tiff.php b/libs/Zend/Pdf/Resource/Image/Tiff.php index bd9e9dc..66c0970 100644 --- a/libs/Zend/Pdf/Resource/Image/Tiff.php +++ b/libs/Zend/Pdf/Resource/Image/Tiff.php @@ -16,18 +16,18 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Tiff.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Tiff.php 18993 2009-11-15 17:09:16Z alexander $ */ +/** Internally used classes */ +require_once 'Zend/Pdf/Element/Array.php'; +require_once 'Zend/Pdf/Element/Name.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; + + /** Zend_Pdf_Resource_Image */ require_once 'Zend/Pdf/Resource/Image.php'; -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - -/** Zend_Pdf_Element_Name */ -require_once 'Zend/Pdf/Element/Name.php'; - /** * TIFF image * diff --git a/libs/Zend/Pdf/Resource/ImageFactory.php b/libs/Zend/Pdf/Resource/ImageFactory.php index c7e6b64..989c11b 100644 --- a/libs/Zend/Pdf/Resource/ImageFactory.php +++ b/libs/Zend/Pdf/Resource/ImageFactory.php @@ -16,14 +16,10 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ImageFactory.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: ImageFactory.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf */ -require_once 'Zend/Pdf.php'; - - /** * Zend_Pdf_ImageFactory * @@ -38,6 +34,7 @@ class Zend_Pdf_Resource_ImageFactory { public static function factory($filename) { if(!is_file($filename)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Cannot create image resource. File not found."); } $extension = pathinfo($filename, PATHINFO_EXTENSION); @@ -49,9 +46,11 @@ class Zend_Pdf_Resource_ImageFactory case 'tif': //Fall through to next case; case 'tiff': + require_once 'Zend/Pdf/Resource/Image/Tiff.php'; return new Zend_Pdf_Resource_Image_Tiff($filename); break; case 'png': + require_once 'Zend/Pdf/Resource/Image/Png.php'; return new Zend_Pdf_Resource_Image_Png($filename); break; case 'jpg': @@ -59,9 +58,11 @@ class Zend_Pdf_Resource_ImageFactory case 'jpe': //Fall through to next case; case 'jpeg': + require_once 'Zend/Pdf/Resource/Image/Jpeg.php'; return new Zend_Pdf_Resource_Image_Jpeg($filename); break; default: + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Cannot create image resource. File extension not known or unsupported type."); break; } diff --git a/libs/Zend/Pdf/StringParser.php b/libs/Zend/Pdf/StringParser.php index 7e803a4..8719410 100644 --- a/libs/Zend/Pdf/StringParser.php +++ b/libs/Zend/Pdf/StringParser.php @@ -16,54 +16,22 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: StringParser.php 17532 2009-08-10 19:04:14Z alexander $ + * @version $Id: StringParser.php 18985 2009-11-14 18:51:34Z alexander $ */ -/** Zend_Pdf_Element */ -require_once 'Zend/Pdf/Element.php'; - -/** Zend_Pdf_Element_Array */ +/** Internally used classes */ require_once 'Zend/Pdf/Element/Array.php'; - -/** Zend_Pdf_Element_String_Binary */ require_once 'Zend/Pdf/Element/String/Binary.php'; - -/** Zend_Pdf_Element_Boolean */ require_once 'Zend/Pdf/Element/Boolean.php'; - -/** Zend_Pdf_Element_Dictionary */ require_once 'Zend/Pdf/Element/Dictionary.php'; - -/** Zend_Pdf_Element_Name */ require_once 'Zend/Pdf/Element/Name.php'; - -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - -/** Zend_Pdf_Element_Object */ -require_once 'Zend/Pdf/Element/Object.php'; - -/** Zend_Pdf_Element_Reference */ -require_once 'Zend/Pdf/Element/Reference.php'; - -/** Zend_Pdf_Element_Object_Stream */ -require_once 'Zend/Pdf/Element/Object/Stream.php'; - -/** Zend_Pdf_Element_String */ -require_once 'Zend/Pdf/Element/String.php'; - -/** Zend_Pdf_Element_Null */ require_once 'Zend/Pdf/Element/Null.php'; - -/** Zend_Pdf_Element_Reference_Context */ -require_once 'Zend/Pdf/Element/Reference/Context.php'; - -/** Zend_Pdf_Element_Reference_Table */ -require_once 'Zend/Pdf/Element/Reference/Table.php'; - -/** Zend_Pdf_ElementFactory_Interface */ -require_once 'Zend/Pdf/ElementFactory/Interface.php'; +require_once 'Zend/Pdf/Element/Numeric.php'; +require_once 'Zend/Pdf/Element/Object.php'; +require_once 'Zend/Pdf/Element/Object/Stream.php'; +require_once 'Zend/Pdf/Element/Reference.php'; +require_once 'Zend/Pdf/Element/String.php'; /** @@ -178,15 +146,33 @@ class Zend_Pdf_StringParser */ public function skipWhiteSpace($skipComment = true) { - while ($this->offset < strlen($this->data)) { - if (self::isWhiteSpace( ord($this->data[$this->offset]) )) { - $this->offset++; - } else if (ord($this->data[$this->offset]) == 0x25 && $skipComment) { // '%' - $this->skipComment(); - } else { - return; + if ($skipComment) { + while (true) { + $this->offset += strspn($this->data, "\x00\t\n\f\r ", $this->offset); + + if ($this->offset < strlen($this->data) && $this->data[$this->offset] == '%') { + // Skip comment + $this->offset += strcspn($this->data, "\r\n", $this->offset); + } else { + // Non white space character not equal to '%' is found + return; + } } + } else { + $this->offset += strspn($this->data, "\x00\t\n\f\r ", $this->offset); } + +// /** Original (non-optimized) implementation. */ +// +// while ($this->offset < strlen($this->data)) { +// if (strpos("\x00\t\n\f\r ", $this->data[$this->offset]) !== false) { +// $this->offset++; +// } else if (ord($this->data[$this->offset]) == 0x25 && $skipComment) { // '%' +// $this->skipComment(); +// } else { +// return; +// } +// } } @@ -247,13 +233,8 @@ class Zend_Pdf_StringParser while (true) { $this->offset += strspn($this->data, "\x00\t\n\f\r ", $this->offset); - if ($this->data[$this->offset] == '%') { - preg_match('/[\r\n]/', $this->data, $matches, PREG_OFFSET_CAPTURE, $this->offset); - if (count($matches) > 0) { - $this->offset += strlen($matches[0][0]) + $matches[0][1]; - } else { - $this->offset = strlen($this->data); - } + if ($this->offset < strlen($this->data) && $this->data[$this->offset] == '%') { + $this->offset += strcspn($this->data, "\r\n", $this->offset); } else { break; } @@ -263,25 +244,27 @@ class Zend_Pdf_StringParser return ''; } - $start = $this->offset; + if ( /* self::isDelimiter( ord($this->data[$start]) ) */ + strpos('()<>[]{}/%', $this->data[$this->offset]) !== false ) { - if (self::isDelimiter( ord($this->data[$start]) )) { - if ($this->data[$start] == '<' && $this->offset + 1 < strlen($this->data) && $this->data[$start+1] == '<') { - $this->offset += 2; - return '<<'; - } else if ($this->data[$start] == '>' && $this->offset + 1 < strlen($this->data) && $this->data[$start+1] == '>') { - $this->offset += 2; - return '>>'; - } else { - $this->offset++; - return $this->data[$start]; + switch (substr($this->data, $this->offset, 2)) { + case '<<': + $this->offset += 2; + return '<<'; + break; + + case '>>': + $this->offset += 2; + return '>>'; + break; + + default: + return $this->data[$this->offset++]; + break; } } else { - while ( ($this->offset < strlen($this->data)) && - (!self::isDelimiter( ord($this->data[$this->offset]) )) && - (!self::isWhiteSpace( ord($this->data[$this->offset]) )) ) { - $this->offset++; - } + $start = $this->offset; + $this->offset += strcspn($this->data, "()<>[]{}/%\x00\t\n\f\r ", $this->offset); return substr($this->data, $start, $this->offset - $start); } @@ -314,7 +297,7 @@ class Zend_Pdf_StringParser case '/': return ($this->_elements[] = new Zend_Pdf_Element_Name( - Zend_Pdf_Element_Name::unescape( $this->readLexeme() ) + Zend_Pdf_Element_Name::unescape( $this->readLexeme() ) )); case '[': @@ -334,6 +317,7 @@ class Zend_Pdf_StringParser case '{': // fall through to next case case '}': + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X.', $this->offset)); @@ -368,32 +352,38 @@ class Zend_Pdf_StringParser $start = $this->offset; $openedBrackets = 1; + $this->offset += strcspn($this->data, '()\\', $this->offset); + while ($this->offset < strlen($this->data)) { switch (ord( $this->data[$this->offset] )) { case 0x28: // '(' - opened bracket in the string, needs balanced pair. + $this->offset++; $openedBrackets++; break; case 0x29: // ')' - pair to the opened bracket + $this->offset++; $openedBrackets--; break; case 0x5C: // '\\' - escape sequence, skip next char from a check - $this->offset++; + $this->offset += 2; } - $this->offset++; if ($openedBrackets == 0) { break; // end of string } + + $this->offset += strcspn($this->data, '()\\', $this->offset); } if ($openedBrackets != 0) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected end of file while string reading. Offset - 0x%X. \')\' expected.', $start)); } return new Zend_Pdf_Element_String(Zend_Pdf_Element_String::unescape( substr($this->data, - $start, - $this->offset - $start - 1) )); + $start, + $this->offset - $start - 1) )); } @@ -408,21 +398,22 @@ class Zend_Pdf_StringParser { $start = $this->offset; - while ($this->offset < strlen($this->data)) { - if (self::isWhiteSpace( ord($this->data[$this->offset]) ) || - ctype_xdigit( $this->data[$this->offset] ) ) { - $this->offset++; - } else if ($this->data[$this->offset] == '>') { - $this->offset++; - return new Zend_Pdf_Element_String_Binary( - Zend_Pdf_Element_String_Binary::unescape( substr($this->data, - $start, - $this->offset - $start - 1) )); - } else { - throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected character while binary string reading. Offset - 0x%X.', $this->offset)); - } + $this->offset += strspn($this->data, "\x00\t\n\f\r 0123456789abcdefABCDEF", $this->offset); + + if ($this->offset >= strlen($this->data) - 1) { + require_once 'Zend/Pdf/Exception.php'; + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected end of file while reading binary string. Offset - 0x%X. \'>\' expected.', $start)); } - throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected end of file while binary string reading. Offset - 0x%X. \'>\' expected.', $start)); + + if ($this->data[$this->offset++] != '>') { + require_once 'Zend/Pdf/Exception.php'; + throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected character while binary string reading. Offset - 0x%X.', $this->offset)); + } + + return new Zend_Pdf_Element_String_Binary( + Zend_Pdf_Element_String_Binary::unescape( substr($this->data, + $start, + $this->offset - $start - 1) )); } @@ -445,6 +436,7 @@ class Zend_Pdf_StringParser } } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected end of file while array reading. Offset - 0x%X. \']\' expected.', $this->offset)); } @@ -468,6 +460,7 @@ class Zend_Pdf_StringParser $value = $this->readElement(); if (!$name instanceof Zend_Pdf_Element_Name) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Name object expected while dictionary reading. Offset - 0x%X.', $nameStart)); } @@ -477,6 +470,7 @@ class Zend_Pdf_StringParser } } + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Unexpected end of file while dictionary reading. Offset - 0x%X. \'>>\' expected.', $this->offset)); } @@ -557,16 +551,19 @@ class Zend_Pdf_StringParser $objNum = $this->readLexeme(); if (!ctype_digit($objNum)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Object number expected.', $this->offset - strlen($objNum))); } $genNum = $this->readLexeme(); if (!ctype_digit($genNum)) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Object generation number expected.', $this->offset - strlen($genNum))); } $objKeyword = $this->readLexeme(); if ($objKeyword != 'obj') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. \'obj\' keyword expected.', $this->offset - strlen($objKeyword))); } @@ -595,10 +592,12 @@ class Zend_Pdf_StringParser * It's a stream object */ if ($nextLexeme != 'stream') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. \'endobj\' or \'stream\' keywords expected.', $this->offset - strlen($nextLexeme))); } if (!$objValue instanceof Zend_Pdf_Element_Dictionary) { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. Stream extent must be preceded by stream dictionary.', $this->offset - strlen($nextLexeme))); } @@ -617,6 +616,7 @@ class Zend_Pdf_StringParser } else if ($this->data[$this->offset] == "\n" ) { $this->offset++; } else { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. \'stream\' must be followed by either cr-lf sequence or lf character only.', $this->offset - strlen($nextLexeme))); } @@ -626,11 +626,13 @@ class Zend_Pdf_StringParser $nextLexeme = $this->readLexeme(); if ($nextLexeme != 'endstream') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. \'endstream\' keyword expected.', $this->offset - strlen($nextLexeme))); } $nextLexeme = $this->readLexeme(); if ($nextLexeme != 'endobj') { + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception(sprintf('PDF file syntax error. Offset - 0x%X. \'endobj\' keyword expected.', $this->offset - strlen($nextLexeme))); } diff --git a/libs/Zend/Pdf/Style.php b/libs/Zend/Pdf/Style.php index c1523f8..be7d55d 100644 --- a/libs/Zend/Pdf/Style.php +++ b/libs/Zend/Pdf/Style.php @@ -16,24 +16,10 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Style.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Style.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Color */ -require_once 'Zend/Pdf/Color.php'; - - -/** Zend_Pdf_Element_Numeric */ -require_once 'Zend/Pdf/Element/Numeric.php'; - -/** Zend_Pdf_Element_Array */ -require_once 'Zend/Pdf/Element/Array.php'; - -/** Zend_Pdf_Resource_Font */ -require_once 'Zend/Pdf/Resource/Font.php'; - - /** * Style object. * Style object doesn't directly correspond to any PDF file object. @@ -148,6 +134,7 @@ class Zend_Pdf_Style */ public function setLineWidth($width) { + require_once 'Zend/Pdf/Element/Numeric.php'; $this->_lineWidth = new Zend_Pdf_Element_Numeric($width); } @@ -160,11 +147,13 @@ class Zend_Pdf_Style */ public function setLineDashingPattern($pattern, $phase = 0) { + require_once 'Zend/Pdf/Page.php'; if ($pattern === Zend_Pdf_Page::LINE_DASHING_SOLID) { $pattern = array(); $phase = 0; } + require_once 'Zend/Pdf/Element/Numeric.php'; $this->_lineDashingPattern = $pattern; $this->_lineDashingPhase = new Zend_Pdf_Element_Numeric($phase); } @@ -286,8 +275,10 @@ class Zend_Pdf_Style } if ($this->_lineDashingPattern !== null) { + require_once 'Zend/Pdf/Element/Array.php'; $dashPattern = new Zend_Pdf_Element_Array(); + require_once 'Zend/Pdf/Element/Numeric.php'; foreach ($this->_lineDashingPattern as $dashItem) { $dashElement = new Zend_Pdf_Element_Numeric($dashItem); $dashPattern->items[] = $dashElement; diff --git a/libs/Zend/Pdf/Target.php b/libs/Zend/Pdf/Target.php index 45e4973..f411f11 100644 --- a/libs/Zend/Pdf/Target.php +++ b/libs/Zend/Pdf/Target.php @@ -20,9 +20,6 @@ * @version $Id$ */ -/** Zend_Pdf_ElementFactory */ -require_once 'Zend/Pdf/ElementFactory.php'; - /** * PDF target (action or destination) @@ -42,9 +39,11 @@ abstract class Zend_Pdf_Target * @throws Zend_Pdf_Exception */ public static function load(Zend_Pdf_Element $resource) { + require_once 'Zend/Pdf/Element.php'; if ($resource->getType() == Zend_Pdf_Element::TYPE_DICTIONARY) { if (($resource->Type === null || $resource->Type->value =='Action') && $resource->S !== null) { // It's a well-formed action, load it + require_once 'Zend/Pdf/Action.php'; return Zend_Pdf_Action::load($resource); } else if ($resource->D !== null) { // It's a destination @@ -56,9 +55,10 @@ abstract class Zend_Pdf_Target } if ($resource->getType() == Zend_Pdf_Element::TYPE_ARRAY || - $resource->getType() == Zend_Pdf_Element::TYPE_NAME || - $resource->getType() == Zend_Pdf_Element::TYPE_STRING) { + $resource->getType() == Zend_Pdf_Element::TYPE_NAME || + $resource->getType() == Zend_Pdf_Element::TYPE_STRING) { // Resource is an array, just treat it as an explicit destination array + require_once 'Zend/Pdf/Destination.php'; return Zend_Pdf_Destination::load($resource); } else { require_once 'Zend/Pdf/Exception.php'; diff --git a/libs/Zend/Pdf/Trailer.php b/libs/Zend/Pdf/Trailer.php index 569345f..60ad5e3 100644 --- a/libs/Zend/Pdf/Trailer.php +++ b/libs/Zend/Pdf/Trailer.php @@ -16,14 +16,10 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Trailer.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Trailer.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Element_Dictionary */ -require_once 'Zend/Pdf/Element/Dictionary.php'; - - /** * PDF file trailer * @@ -52,6 +48,7 @@ abstract class Zend_Pdf_Trailer { if ( !in_array($key, self::$_allowedKeys) ) { /** @todo Make warning (log entry) instead of an exception */ + require_once 'Zend/Pdf/Exception.php'; throw new Zend_Pdf_Exception("Unknown trailer dictionary key: '$key'."); } } diff --git a/libs/Zend/Pdf/Trailer/Generator.php b/libs/Zend/Pdf/Trailer/Generator.php index ad640f2..f129e25 100644 --- a/libs/Zend/Pdf/Trailer/Generator.php +++ b/libs/Zend/Pdf/Trailer/Generator.php @@ -16,14 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Generator.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Generator.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Trailer */ require_once 'Zend/Pdf/Trailer.php'; - /** * PDF file trailer generator (used for just created PDF) * @@ -50,6 +49,7 @@ class Zend_Pdf_Trailer_Generator extends Zend_Pdf_Trailer */ public function getPDFLength() { + require_once 'Zend/Pdf.php'; return strlen(Zend_Pdf::PDF_HEADER); } @@ -60,6 +60,7 @@ class Zend_Pdf_Trailer_Generator extends Zend_Pdf_Trailer */ public function getPDFString() { + require_once 'Zend/Pdf.php'; return Zend_Pdf::PDF_HEADER; } diff --git a/libs/Zend/Pdf/Trailer/Keeper.php b/libs/Zend/Pdf/Trailer/Keeper.php index cc96a15..a76b407 100644 --- a/libs/Zend/Pdf/Trailer/Keeper.php +++ b/libs/Zend/Pdf/Trailer/Keeper.php @@ -16,17 +16,13 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Keeper.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Keeper.php 18993 2009-11-15 17:09:16Z alexander $ */ /** Zend_Pdf_Trailer */ require_once 'Zend/Pdf/Trailer.php'; -/** Zend_Pdf_Element_Reference_Context */ -require_once 'Zend/Pdf/Element/Reference/Context.php'; - - /** * PDF file trailer. * Stores and provides access to the trailer parced from a PDF file @@ -61,7 +57,7 @@ class Zend_Pdf_Trailer_Keeper extends Zend_Pdf_Trailer */ public function __construct(Zend_Pdf_Element_Dictionary $dict, Zend_Pdf_Element_Reference_Context $context, - $prev = null) + Zend_Pdf_Trailer $prev = null) { parent::__construct($dict); diff --git a/libs/Zend/Pdf/UpdateInfoContainer.php b/libs/Zend/Pdf/UpdateInfoContainer.php index 0907724..e8c649b 100644 --- a/libs/Zend/Pdf/UpdateInfoContainer.php +++ b/libs/Zend/Pdf/UpdateInfoContainer.php @@ -16,18 +16,9 @@ * @package Zend_Pdf * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: UpdateInfoContainer.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: UpdateInfoContainer.php 18993 2009-11-15 17:09:16Z alexander $ */ -/** Zend_Pdf_Element */ -require_once 'Zend/Pdf/Element.php'; - -/** Zend_Pdf_Element_Object */ -require_once 'Zend/Pdf/Element/Object.php'; - -/** Zend_Memory */ -require_once 'Zend/Memory.php'; - /** * Container which collects updated object info. @@ -80,6 +71,7 @@ class Zend_Pdf_UpdateInfoContainer if ($dump !== null) { if (strlen($dump) > 1024) { + require_once 'Zend/Pdf.php'; $this->_dump = Zend_Pdf::getMemoryManager()->create($dump); } else { $this->_dump = $dump; diff --git a/libs/Zend/ProgressBar/Adapter/Console.php b/libs/Zend/ProgressBar/Adapter/Console.php index 42cfaca..c7b4e5f 100644 --- a/libs/Zend/ProgressBar/Adapter/Console.php +++ b/libs/Zend/ProgressBar/Adapter/Console.php @@ -14,7 +14,7 @@ * @package Zend_ProgressBar * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Console.php 16215 2009-06-21 19:36:07Z thomas $ + * @version $Id: Console.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -145,7 +145,7 @@ class Zend_ProgressBar_Adapter_Console extends Zend_ProgressBar_Adapter * @var boolean */ protected $_outputStarted = false; - + /** * Charset of text element * @@ -197,10 +197,10 @@ class Zend_ProgressBar_Adapter_Console extends Zend_ProgressBar_Adapter if ($this->_outputStream !== null) { fclose($this->_outputStream); } - + $this->_outputStream = $stream; } - + /** * Get the current output stream * @@ -210,15 +210,15 @@ class Zend_ProgressBar_Adapter_Console extends Zend_ProgressBar_Adapter { if ($this->_outputStream === null) { if (!defined('STDOUT')) { - $this->_outputStream = fopen('php://stdout', 'w'); + $this->_outputStream = fopen('php://stdout', 'w'); } else { return STDOUT; } } - + return $this->_outputStream; } - + /** * Set the width of the progressbar * @@ -355,7 +355,7 @@ class Zend_ProgressBar_Adapter_Console extends Zend_ProgressBar_Adapter { $this->_charset = $charset; } - + /** * Set the finish action * diff --git a/libs/Zend/Queue.php b/libs/Zend/Queue.php index 0386809..1c2d2d5 100644 --- a/libs/Zend/Queue.php +++ b/libs/Zend/Queue.php @@ -16,7 +16,7 @@ * @package Zend_Queue * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Queue.php 16939 2009-07-22 02:22:03Z matthew $ + * @version $Id: Queue.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -142,9 +142,9 @@ class Zend_Queue implements Countable } /** - * Set queue options - * - * @param array $options + * Set queue options + * + * @param array $options * @return Zend_Queue */ public function setOptions(array $options) @@ -155,9 +155,9 @@ class Zend_Queue implements Countable /** * Set an individual configuration option - * - * @param string $name - * @param mixed $value + * + * @param string $name + * @param mixed $value * @return Zend_Queue */ public function setOption($name, $value) @@ -178,8 +178,8 @@ class Zend_Queue implements Countable /** * Determine if a requested option has been defined - * - * @param string $name + * + * @param string $name * @return bool */ public function hasOption($name) @@ -189,8 +189,8 @@ class Zend_Queue implements Countable /** * Retrieve a single option - * - * @param string $name + * + * @param string $name * @return null|mixed Returns null if option does not exist; option value otherwise */ public function getOption($name) @@ -215,11 +215,11 @@ class Zend_Queue implements Countable } $adapterName = str_replace( - ' ', + ' ', '_', ucwords( str_replace( - '_', + '_', ' ', strtolower($adapterNamespace . '_' . $adapter) ) @@ -236,8 +236,8 @@ class Zend_Queue implements Countable * Pass the configuration to the adapter class constructor. */ $adapter = new $adapterName($this->getOptions(), $this); - } - + } + if (!$adapter instanceof Zend_Queue_Adapter_AdapterInterface) { require_once 'Zend/Queue/Exception.php'; throw new Zend_Queue_Exception("Adapter class '" . get_class($adapterName) . "' does not implement Zend_Queue_Adapter_AdapterInterface"); diff --git a/libs/Zend/Queue/Adapter/Activemq.php b/libs/Zend/Queue/Adapter/Activemq.php index 9c41cb0..dcea86b 100644 --- a/libs/Zend/Queue/Adapter/Activemq.php +++ b/libs/Zend/Queue/Adapter/Activemq.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Activemq.php 17241 2009-07-28 13:01:20Z matthew $ + * @version $Id: Activemq.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -95,7 +95,7 @@ class Zend_Queue_Adapter_Activemq extends Zend_Queue_Adapter_AdapterAbstract $response = $this->_client->send($connect)->receive(); - if ((false !== $response) + if ((false !== $response) && ($response->getCommand() != 'CONNECTED') ) { require_once 'Zend/Queue/Exception.php'; @@ -196,6 +196,9 @@ class Zend_Queue_Adapter_Activemq extends Zend_Queue_Adapter_AdapterAbstract $queue = $this->_queue; } + // read + $data = array(); + // signal that we are reading $frame = $this->_client->createFrame(); $frame->setCommand('SUBSCRIBE'); @@ -203,26 +206,26 @@ class Zend_Queue_Adapter_Activemq extends Zend_Queue_Adapter_AdapterAbstract $frame->setHeader('ack','client'); $this->_client->send($frame); - // read - $data = array(); - if ($this->_client->canRead()) { - for ($i = 0; $i < $maxMessages; $i++) { - $response = $this->_client->receive(); + if ($maxMessages > 0) { + if ($this->_client->canRead()) { + for ($i = 0; $i < $maxMessages; $i++) { + $response = $this->_client->receive(); - switch ($response->getCommand()) { - case 'MESSAGE': - $datum = array( - 'message_id' => $response->getHeader('message-id'), - 'handle' => $response->getHeader('message-id'), - 'body' => $response->getBody(), - 'md5' => md5($response->getBody()) - ); - $data[] = $datum; - break; - default: - $block = print_r($response, true); - require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception('Invalid response received: ' . $block); + switch ($response->getCommand()) { + case 'MESSAGE': + $datum = array( + 'message_id' => $response->getHeader('message-id'), + 'handle' => $response->getHeader('message-id'), + 'body' => $response->getBody(), + 'md5' => md5($response->getBody()) + ); + $data[] = $datum; + break; + default: + $block = print_r($response, true); + require_once 'Zend/Queue/Exception.php'; + throw new Zend_Queue_Exception('Invalid response received: ' . $block); + } } } } diff --git a/libs/Zend/Queue/Adapter/AdapterInterface.php b/libs/Zend/Queue/Adapter/AdapterInterface.php index 2716777..ea24eb3 100644 --- a/libs/Zend/Queue/Adapter/AdapterInterface.php +++ b/libs/Zend/Queue/Adapter/AdapterInterface.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AdapterInterface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: AdapterInterface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,24 +33,24 @@ interface Zend_Queue_Adapter_AdapterInterface { /** * Constructor - * - * @param array|Zend_Config $options - * @param Zend_Queue $queue + * + * @param array|Zend_Config $options + * @param Zend_Queue $queue * @return void */ public function __construct($options, Zend_Queue $queue = null); /** * Retrieve queue instance - * + * * @return Zend_Queue */ public function getQueue(); /** * Set queue instnace - * - * @param Zend_Queue $queue + * + * @param Zend_Queue $queue * @return Zend_Queue_Adapter_AdapterInterface */ public function setQueue(Zend_Queue $queue); @@ -69,10 +69,10 @@ interface Zend_Queue_Adapter_AdapterInterface /** * Create a new queue * - * Visibility timeout is how long a message is left in the queue - * "invisible" to other readers. If the message is acknowleged (deleted) - * before the timeout, then the message is deleted. However, if the - * timeout expires then the message will be made available to other queue + * Visibility timeout is how long a message is left in the queue + * "invisible" to other readers. If the message is acknowleged (deleted) + * before the timeout, then the message is deleted. However, if the + * timeout expires then the message will be made available to other queue * readers. * * @param string $name Queue name diff --git a/libs/Zend/Queue/Adapter/Array.php b/libs/Zend/Queue/Adapter/Array.php index 3a1013e..d76c53a 100644 --- a/libs/Zend/Queue/Adapter/Array.php +++ b/libs/Zend/Queue/Adapter/Array.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Array.php 16881 2009-07-20 13:24:19Z mikaelkael $ + * @version $Id: Array.php 18701 2009-10-26 13:03:47Z matthew $ */ /** @@ -223,22 +223,26 @@ class Zend_Queue_Adapter_Array extends Zend_Queue_Adapter_AdapterAbstract } $data = array(); - $start_time = microtime(true); + if ($maxMessages > 0) { + $start_time = microtime(true); - $count = 0; - $temp = &$this->_data[$queue->getName()]; - foreach ($temp as $key=>&$msg) { - if (($msg['handle'] === null) - || ($msg['timeout'] + $timeout < $start_time) - ) { - $msg['handle'] = md5(uniqid(rand(), true)); - $msg['timeout'] = microtime(true); - $data[] = $msg; - $count++; - } + $count = 0; + $temp = &$this->_data[$queue->getName()]; + foreach ($temp as $key=>&$msg) { + // count check has to be first, as someone can ask for 0 messages + // ZF-7650 + if ($count >= $maxMessages) { + break; + } - if ($count >= $maxMessages) { - break; + if (($msg['handle'] === null) + || ($msg['timeout'] + $timeout < $start_time) + ) { + $msg['handle'] = md5(uniqid(rand(), true)); + $msg['timeout'] = microtime(true); + $data[] = $msg; + $count++; + } } } diff --git a/libs/Zend/Queue/Adapter/Db.php b/libs/Zend/Queue/Adapter/Db.php index a81dd49..941bbbc 100644 --- a/libs/Zend/Queue/Adapter/Db.php +++ b/libs/Zend/Queue/Adapter/Db.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Db.php 17217 2009-07-28 02:02:37Z matthew $ + * @version $Id: Db.php 18705 2009-10-26 13:05:13Z matthew $ */ /** @@ -66,6 +66,11 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract */ protected $_messageTable = null; + /** + * @var Zend_Db_Table_Row_Abstract + */ + protected $_messageRow = null; + /** * Constructor * @@ -87,6 +92,33 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract throw new Zend_Queue_Exception('Options array item: Zend_Db_Select::FOR_UPDATE must be boolean'); } + if (isset($this->_options['dbAdapter']) + && $this->_options['dbAdapter'] instanceof Zend_Db_Adapter_Abstract) { + $db = $this->_options['dbAdapter']; + } else { + $db = $this->_initDbAdapter(); + } + + $this->_queueTable = new Zend_Queue_Adapter_Db_Queue(array( + 'db' => $db, + )); + + $this->_messageTable = new Zend_Queue_Adapter_Db_Message(array( + 'db' => $db, + )); + + } + + /** + * Initialize Db adapter using 'driverOptions' section of the _options array + * + * Throws an exception if the adapter cannot connect to DB. + * + * @return Zend_Db_Adapter_Abstract + * @throws Zend_Queue_Exception + */ + protected function _initDbAdapter() + { $options = &$this->_options['driverOptions']; if (!array_key_exists('type', $options)) { require_once 'Zend/Queue/Exception.php'; @@ -113,20 +145,17 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract throw new Zend_Queue_Exception("Configuration array must have a key for 'dbname' for the database to use"); } + $type = $options['type']; + unset($options['type']); + try { - $db = Zend_Db::factory($options['type'], $options); - - $this->_queueTable = new Zend_Queue_Adapter_Db_Queue(array( - 'db' => $db, - )); - - $this->_messageTable = new Zend_Queue_Adapter_Db_Message(array( - 'db' => $db, - )); + $db = Zend_Db::factory($type, $options); } catch (Zend_Db_Exception $e) { require_once 'Zend/Queue/Exception.php'; throw new Zend_Queue_Exception('Error connecting to database: ' . $e->getMessage(), $e->getCode()); } + + return $db; } /******************************************************************** @@ -146,7 +175,15 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract */ public function isExists($name) { - return in_array($name, $this->getQueues()); + $id = 0; + + try { + $id = $this->getQueueId($name); + } catch (Zend_Queue_Exception $e) { + return false; + } + + return ($id > 0); } /** @@ -170,10 +207,10 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract $queue = $this->_queueTable->createRow(); $queue->queue_name = $name; - $queue->timeout = ($timeout === null) ? self::CREATE_TIMEOUT_DEFAULT : (int)$timeout; + $queue->timeout = ($timeout === null) ? self::CREATE_TIMEOUT_DEFAULT : (int)$timeout; try { - if ($id = $queue->save()) { + if ($queue->save()) { return true; } } catch (Exception $e) { @@ -213,6 +250,10 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract } } + if (array_key_exists($name, $this->_queues)) { + unset($this->_queues[$name]); + } + return true; } @@ -230,11 +271,13 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract $query = $this->_queueTable->select(); $query->from($this->_queueTable, array('queue_id', 'queue_name')); - $list = array(); + $this->_queues = array(); foreach ($this->_queueTable->fetchAll($query) as $queue) { - $list[] = $queue->queue_name; + $this->_queues[$queue->queue_name] = (int)$queue->queue_id; } + $list = array_keys($this->_queues); + return $list; } @@ -275,6 +318,10 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract */ public function send($message, Zend_Queue $queue = null) { + if ($this->_messageRow === null) { + $this->_messageRow = $this->_messageTable->createRow(); + } + if ($queue === null) { $queue = $this->_queue; } @@ -291,7 +338,7 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract throw new Zend_Queue_Exception('Queue does not exist:' . $queue->getName()); } - $msg = $this->_messageTable->createRow(); + $msg = clone $this->_messageRow; $msg->queue_id = $this->getQueueId($queue->getName()); $msg->created = time(); $msg->body = $message; @@ -346,41 +393,43 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract // start transaction handling try { - $db->beginTransaction(); + if ( $maxMessages > 0 ) { // ZF-7666 LIMIT 0 clause not included. + $db->beginTransaction(); - $query = $db->select(); - if ($this->_config['options'][Zend_Db_Select::FOR_UPDATE]) { - // turn on forUpdate - $query->forUpdate(); - } - $query->from($info['name'], array('*')) - ->where('queue_id=?', $this->getQueueId($queue->getName())) - ->where('handle IS NULL OR timeout+' . (int)$timeout . ' < ' . (int)$microtime) - ->limit($maxMessages); - - foreach ($db->fetchAll($query) as $data) { - // setup our changes to the message - $data['handle'] = md5(uniqid(rand(), true)); - - $update = array( - 'handle' => $data['handle'], - 'timeout' => $microtime, - ); - - // update the database - $where = array(); - $where[] = $db->quoteInto('message_id=?', $data['message_id']); - $where[] = 'handle IS NULL OR timeout+' . (int)$timeout . ' < ' . (int)$microtime; - - $count = $db->update($info['name'], $update, $where); - - // we check count to make sure no other thread has gotten - // the rows after our select, but before our update. - if ($count > 0) { - $msgs[] = $data; + $query = $db->select(); + if ($this->_options['options'][Zend_Db_Select::FOR_UPDATE]) { + // turn on forUpdate + $query->forUpdate(); } + $query->from($info['name'], array('*')) + ->where('queue_id=?', $this->getQueueId($queue->getName())) + ->where('handle IS NULL OR timeout+' . (int)$timeout . ' < ' . (int)$microtime) + ->limit($maxMessages); + + foreach ($db->fetchAll($query) as $data) { + // setup our changes to the message + $data['handle'] = md5(uniqid(rand(), true)); + + $update = array( + 'handle' => $data['handle'], + 'timeout' => $microtime, + ); + + // update the database + $where = array(); + $where[] = $db->quoteInto('message_id=?', $data['message_id']); + $where[] = 'handle IS NULL OR timeout+' . (int)$timeout . ' < ' . (int)$microtime; + + $count = $db->update($info['name'], $update, $where); + + // we check count to make sure no other thread has gotten + // the rows after our select, but before our update. + if ($count > 0) { + $msgs[] = $data; + } + } + $db->commit(); } - $db->commit(); } catch (Exception $e) { $db->rollBack(); @@ -465,6 +514,10 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract */ protected function getQueueId($name) { + if (array_key_exists($name, $this->_queues)) { + return $this->_queues[$name]; + } + $query = $this->_queueTable->select(); $query->from($this->_queueTable, array('queue_id')) ->where('queue_name=?', $name); @@ -476,6 +529,8 @@ class Zend_Queue_Adapter_Db extends Zend_Queue_Adapter_AdapterAbstract throw new Zend_Queue_Exception('Queue does not exist: ' . $name); } - return (int)$queue->queue_id; + $this->_queues[$name] = (int)$queue->queue_id; + + return $this->_queues[$name]; } } diff --git a/libs/Zend/Queue/Adapter/Db/queue.sql b/libs/Zend/Queue/Adapter/Db/mysql.sql similarity index 100% rename from libs/Zend/Queue/Adapter/Db/queue.sql rename to libs/Zend/Queue/Adapter/Db/mysql.sql diff --git a/libs/Zend/Queue/Adapter/Db/postgresql.sql b/libs/Zend/Queue/Adapter/Db/postgresql.sql new file mode 100644 index 0000000..333790f --- /dev/null +++ b/libs/Zend/Queue/Adapter/Db/postgresql.sql @@ -0,0 +1,49 @@ +/* +Sample grant for PostgreSQL + +CREATE ROLE queue LOGIN + PASSWORD '[CHANGE ME]' + NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE; + +*/ + +-- +-- Table structure for table `queue` +-- + +DROP TABLE IF EXISTS queue; + +CREATE TABLE queue +( + queue_id serial NOT NULL, + queue_name character varying(100) NOT NULL, + timeout smallint NOT NULL DEFAULT 30, + CONSTRAINT queue_pk PRIMARY KEY (queue_id) +) +WITH (OIDS=FALSE); +ALTER TABLE queue OWNER TO queue; + + +-- -------------------------------------------------------- +-- +-- Table structure for table `message` +-- + +DROP TABLE IF EXISTS message; + +CREATE TABLE message +( + message_id bigserial NOT NULL, + queue_id integer, + handle character(32), + body character varying(8192) NOT NULL, + md5 character(32) NOT NULL, + timeout real, + created integer, + CONSTRAINT message_pk PRIMARY KEY (message_id), + CONSTRAINT message_ibfk_1 FOREIGN KEY (queue_id) + REFERENCES queue (queue_id) MATCH SIMPLE + ON UPDATE CASCADE ON DELETE CASCADE +) +WITH (OIDS=FALSE); +ALTER TABLE message OWNER TO queue; \ No newline at end of file diff --git a/libs/Zend/Queue/Adapter/Db/queue_sqlite.php b/libs/Zend/Queue/Adapter/Db/queue_sqlite.php new file mode 100644 index 0000000..7d96ab0 --- /dev/null +++ b/libs/Zend/Queue/Adapter/Db/queue_sqlite.php @@ -0,0 +1,40 @@ +/* +Sample grant for SQLite + +CREATE ROLE queue LOGIN + PASSWORD '[CHANGE ME]' + NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE; + +*/ + +-- +-- Table structure for table `queue` +-- + +CREATE TABLE queue +( + queue_id INTEGER PRIMARY KEY AUTOINCREMENT, + queue_name VARCHAR(100) NOT NULL, + timeout INTEGER NOT NULL DEFAULT 30 +); + + + + +-- -------------------------------------------------------- +-- +-- Table structure for table `message` +-- + +CREATE TABLE message +( + message_id INTEGER PRIMARY KEY AUTOINCREMENT, + queue_id INTEGER PRIMARY KEY, + handle CHAR(32), + body VARCHAR(8192) NOT NULL, + md5 CHAR(32) NOT NULL, + timeout REAL, + created INTEGER, + FOREIGN KEY (queue_id) REFERENCES queue(queue_id) +); + diff --git a/libs/Zend/Queue/Adapter/Memcacheq.php b/libs/Zend/Queue/Adapter/Memcacheq.php index cc95a7c..4eb6e10 100644 --- a/libs/Zend/Queue/Adapter/Memcacheq.php +++ b/libs/Zend/Queue/Adapter/Memcacheq.php @@ -17,7 +17,7 @@ * @subpackage Adapter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Memcacheq.php 17241 2009-07-28 13:01:20Z matthew $ + * @version $Id: Memcacheq.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -55,6 +55,11 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract */ protected $_port = null; + /** + * @var resource + */ + protected $_socket = null; + /******************************************************************** * Constructor / Destructor *********************************************************************/ @@ -107,6 +112,11 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract if ($this->_cache instanceof Memcache) { $this->_cache->close(); } + if (is_resource($this->_socket)) { + $cmd = 'quit' . self::EOL; + fwrite($this->_socket, $cmd); + fclose($this->_socket); + } } /******************************************************************** @@ -126,7 +136,11 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract */ public function isExists($name) { - return in_array($name, $this->getQueues()); + if (empty($this->_queues)) { + $this->getQueues(); + } + + return in_array($name, $this->_queues); } /** @@ -158,6 +172,8 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract $result = $this->_cache->set($name, 'creating queue', 0, 15); $result = $this->_cache->get($name); + $this->_queues[] = $name; + return true; } @@ -175,6 +191,11 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract $response = $this->_sendCommand('delete ' . $name, array('DELETED', 'NOT_FOUND'), true); if (in_array('DELETED', $response)) { + $key = array_search($name, $this->_queues); + + if ($key !== false) { + unset($this->_queues[$key]); + } return true; } @@ -192,14 +213,15 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract */ public function getQueues() { + $this->_queues = array(); + $response = $this->_sendCommand('stats queue', array('END')); - $list = array(); foreach ($response as $i => $line) { - $list[] = str_replace('STAT ', '', $line); + $this->_queues[] = str_replace('STAT ', '', $line); } - return $list; + return $this->_queues; } /** @@ -279,6 +301,7 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract if ($maxMessages === null) { $maxMessages = 1; } + if ($timeout === null) { $timeout = self::RECEIVE_TIMEOUT_DEFAULT; } @@ -287,13 +310,15 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract } $msgs = array(); - for ($i = 0; $i < $maxMessages; $i++) { - $data = array( - 'handle' => md5(uniqid(rand(), true)), - 'body' => $this->_cache->get($queue->getName()), - ); + if ($maxMessages > 0 ) { + for ($i = 0; $i < $maxMessages; $i++) { + $data = array( + 'handle' => md5(uniqid(rand(), true)), + 'body' => $this->_cache->get($queue->getName()), + ); - $msgs[] = $data; + $msgs[] = $data; + } } $options = array( @@ -372,8 +397,10 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract */ protected function _sendCommand($command, array $terminator, $include_term=false) { - $fp = fsockopen($this->_host, $this->_port, $errno, $errstr, 10); - if ($fp === false) { + if (!is_resource($this->_socket)) { + $this->_socket = fsockopen($this->_host, $this->_port, $errno, $errstr, 10); + } + if ($this->_socket === false) { require_once 'Zend/Queue/Exception.php'; throw new Zend_Queue_Exception("Could not open a connection to $this->_host:$this->_port errno=$errno : $errstr"); } @@ -381,11 +408,11 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract $response = array(); $cmd = $command . self::EOL; - fwrite($fp, $cmd); + fwrite($this->_socket, $cmd); $continue_reading = true; - while (!feof($fp) && $continue_reading) { - $resp = trim(fgets($fp, 1024)); + while (!feof($this->_socket) && $continue_reading) { + $resp = trim(fgets($this->_socket, 1024)); if (in_array($resp, $terminator)) { if ($include_term) { $response[] = $resp; @@ -396,10 +423,6 @@ class Zend_Queue_Adapter_Memcacheq extends Zend_Queue_Adapter_AdapterAbstract } } - $cmd = 'quit' . self::EOL; - fwrite($fp, $cmd); - fclose($fp); - return $response; } } diff --git a/libs/Zend/Queue/Adapter/PlatformJobQueue.php b/libs/Zend/Queue/Adapter/PlatformJobQueue.php index 2f02cd3..73c2c9f 100644 --- a/libs/Zend/Queue/Adapter/PlatformJobQueue.php +++ b/libs/Zend/Queue/Adapter/PlatformJobQueue.php @@ -51,17 +51,17 @@ class Zend_Queue_Adapter_PlatformJobQueue extends Zend_Queue_Adapter_AdapterAbst public function __construct($options, Zend_Queue $queue = null) { parent::__construct($options, $queue); - + if (!extension_loaded("jobqueue_client")) { require_once 'Zend/Queue/Exception.php'; throw new Zend_Queue_Exception('Platform Job Queue extension does not appear to be loaded'); } - + if (! isset($this->_options['daemonOptions'])) { require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception('Job Queue host and password should be provided'); + throw new Zend_Queue_Exception('Job Queue host and password should be provided'); } - + $options = $this->_options['daemonOptions']; if (!array_key_exists('host', $options)) { @@ -72,7 +72,7 @@ class Zend_Queue_Adapter_PlatformJobQueue extends Zend_Queue_Adapter_AdapterAbst require_once 'Zend/Queue/Exception.php'; throw new Zend_Queue_Exception('Platform Job Queue password should be provided'); } - + $this->_zendQueue = new ZendApi_Queue($options['host']); if (!$this->_zendQueue) { @@ -83,12 +83,12 @@ class Zend_Queue_Adapter_PlatformJobQueue extends Zend_Queue_Adapter_AdapterAbst require_once 'Zend/Queue/Exception.php'; throw new Zend_Queue_Exception('Job Queue login failed'); } - + if ($this->_queue) { $this->_queue->setMessageClass('Zend_Queue_Message_PlatformJob'); } } - + /******************************************************************** * Queue management functions ********************************************************************/ @@ -186,21 +186,21 @@ class Zend_Queue_Adapter_PlatformJobQueue extends Zend_Queue_Adapter_AdapterAbst require_once 'Zend/Loader.php'; Zend_Loader::loadClass($classname); } - + if ($message instanceof ZendAPI_Job) { $message = array('data' => $message); } - + $zendApiJob = new $classname($message); // Unfortunately, the Platform JQ API is PHP4-style... $platformJob = $zendApiJob->getJob(); - + $jobId = $this->_zendQueue->addJob($platformJob); - + if (!$jobId) { require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception('Failed to add a job to queue: ' + throw new Zend_Queue_Exception('Failed to add a job to queue: ' . $this->_zendQueue->getLastError()); } @@ -222,20 +222,20 @@ class Zend_Queue_Adapter_PlatformJobQueue extends Zend_Queue_Adapter_AdapterAbst if ($maxMessages === null) { $maxMessages = 1; } - + if ($queue !== null) { require_once 'Zend/Queue/Exception.php'; - throw new Zend_Queue_Exception('Queue shouldn\'t be set'); + throw new Zend_Queue_Exception('Queue shouldn\'t be set'); } $jobs = $this->_zendQueue->getJobsInQueue(null, $maxMessages, true); - + $classname = $this->_queue->getMessageClass(); if (!class_exists($classname)) { require_once 'Zend/Loader.php'; Zend_Loader::loadClass($classname); } - + $options = array( 'queue' => $this->_queue, 'data' => $jobs, @@ -270,10 +270,10 @@ class Zend_Queue_Adapter_PlatformJobQueue extends Zend_Queue_Adapter_AdapterAbst . 'Zend_Queue_Message_PlatformJob may be used' ); } - + return $this->_zendQueue->removeJob($message->getJobId()); } - + public function isJobIdExist($id) { return (($this->_zendQueue->getJob($id))? true : false); @@ -319,7 +319,7 @@ class Zend_Queue_Adapter_PlatformJobQueue extends Zend_Queue_Adapter_AdapterAbst { return array('_options'); } - + /** * Unserialize * diff --git a/libs/Zend/Queue/Message.php b/libs/Zend/Queue/Message.php index f98e106..367e1bc 100644 --- a/libs/Zend/Queue/Message.php +++ b/libs/Zend/Queue/Message.php @@ -17,7 +17,7 @@ * @subpackage Message * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Message.php 16586 2009-07-09 19:20:27Z matthew $ + * @version $Id: Message.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -81,8 +81,8 @@ class Zend_Queue_Message require_once 'Zend/Queue/Exception.php'; throw new Zend_Queue_Exception( - '$options[\'queue\'] = ' - . $result + '$options[\'queue\'] = ' + . $result . ': must be instanceof Zend_Queue' ); } diff --git a/libs/Zend/Queue/Message/Iterator.php b/libs/Zend/Queue/Message/Iterator.php index 0882b2b..70c7684 100644 --- a/libs/Zend/Queue/Message/Iterator.php +++ b/libs/Zend/Queue/Message/Iterator.php @@ -17,7 +17,7 @@ * @subpackage Message * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Iterator.php 17189 2009-07-27 17:41:34Z matthew $ + * @version $Id: Iterator.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -226,8 +226,8 @@ class Zend_Queue_Message_Iterator implements Iterator, Countable */ public function current() { - return (($this->valid() === false) - ? null + return (($this->valid() === false) + ? null : $this->_data[$this->_pointer]); // return the messages object } diff --git a/libs/Zend/Reflection/Class.php b/libs/Zend/Reflection/Class.php index c20c918..936da70 100644 --- a/libs/Zend/Reflection/Class.php +++ b/libs/Zend/Reflection/Class.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Class.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Class.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -56,7 +56,7 @@ class Zend_Reflection_Class extends ReflectionClass } return $instance; } - + /** * Return the classes Docblock reflection object * @@ -78,7 +78,7 @@ class Zend_Reflection_Class extends ReflectionClass } return $instance; } - + /** * Return the start line of the class * @@ -92,10 +92,10 @@ class Zend_Reflection_Class extends ReflectionClass return $this->getDocblock()->getStartLine(); } } - + return parent::getStartLine(); } - + /** * Return the contents of the class * @@ -108,10 +108,10 @@ class Zend_Reflection_Class extends ReflectionClass $filelines = file($filename); $startnum = $this->getStartLine($includeDocblock); $endnum = $this->getEndLine() - $this->getStartLine(); - + return implode('', array_splice($filelines, $startnum, $endnum, true)); } - + /** * Get all reflection objects of implemented interfaces * @@ -134,7 +134,7 @@ class Zend_Reflection_Class extends ReflectionClass unset($phpReflections); return $zendReflections; } - + /** * Return method reflection by name * @@ -220,7 +220,7 @@ class Zend_Reflection_Class extends ReflectionClass unset($phpReflection); return $zendReflection; } - + /** * Return reflection properties of this class * diff --git a/libs/Zend/Reflection/Docblock.php b/libs/Zend/Reflection/Docblock.php index 7747028..a8a76b0 100644 --- a/libs/Zend/Reflection/Docblock.php +++ b/libs/Zend/Reflection/Docblock.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Docblock.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Docblock.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,39 +36,39 @@ class Zend_Reflection_Docblock implements Reflector * @var Reflector */ protected $_reflector = null; - + /**#@+ * @var int */ protected $_startLine = null; protected $_endLine = null; /**#@-*/ - + /** * @var string */ protected $_docComment = null; - + /** * @var string */ protected $_cleanDocComment = null; - + /** * @var string */ protected $_longDescription = null; - + /** * @var string */ protected $_shortDescription = null; - + /** * @var array */ protected $_tags = array(); - + /** * Export reflection * @@ -79,8 +79,9 @@ class Zend_Reflection_Docblock implements Reflector */ public static function export() { + } - + /** * Serialize to string * @@ -91,8 +92,19 @@ class Zend_Reflection_Docblock implements Reflector */ public function __toString() { + $str = "Docblock [ /* Docblock */ ] {".PHP_EOL.PHP_EOL; + $str .= " - Tags [".count($this->_tags)."] {".PHP_EOL; + + foreach($this->_tags AS $tag) { + $str .= " ".$tag; + } + + $str .= " }".PHP_EOL; + $str .= "}".PHP_EOL; + + return $str; } - + /** * Constructor * @@ -107,28 +119,28 @@ class Zend_Reflection_Docblock implements Reflector throw new Zend_Reflection_Exception('Reflector must contain method "getDocComment"'); } $docComment = $commentOrReflector->getDocComment(); - + $lineCount = substr_count($docComment, "\n"); - + $this->_startLine = $this->_reflector->getStartLine() - $lineCount - 1; $this->_endLine = $this->_reflector->getStartLine() - 1; - + } elseif (is_string($commentOrReflector)) { $docComment = $commentOrReflector; } else { require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception(get_class($this) . ' must have a (string) DocComment or a Reflector in the constructor'); } - + if ($docComment == '') { require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception('DocComment cannot be empty'); } - + $this->_docComment = $docComment; $this->_parse(); } - + /** * Retrieve contents of docblock * @@ -138,7 +150,7 @@ class Zend_Reflection_Docblock implements Reflector { return $this->_cleanDocComment; } - + /** * Get start line (position) of docblock * @@ -148,7 +160,7 @@ class Zend_Reflection_Docblock implements Reflector { return $this->_startLine; } - + /** * Get last line (position) of docblock * @@ -158,7 +170,7 @@ class Zend_Reflection_Docblock implements Reflector { return $this->_endLine; } - + /** * Get docblock short description * @@ -168,7 +180,7 @@ class Zend_Reflection_Docblock implements Reflector { return $this->_shortDescription; } - + /** * Get docblock long description * @@ -178,7 +190,7 @@ class Zend_Reflection_Docblock implements Reflector { return $this->_longDescription; } - + /** * Does the docblock contain the given annotation tag? * @@ -194,7 +206,7 @@ class Zend_Reflection_Docblock implements Reflector } return false; } - + /** * Retrieve the given docblock tag * @@ -208,10 +220,10 @@ class Zend_Reflection_Docblock implements Reflector return $tag; } } - + return false; } - + /** * Get all docblock annotation tags * @@ -223,7 +235,7 @@ class Zend_Reflection_Docblock implements Reflector if ($filter === null || !is_string($filter)) { return $this->_tags; } - + $returnTags = array(); foreach ($this->_tags as $tag) { if ($tag->getName() == $filter) { @@ -232,7 +244,7 @@ class Zend_Reflection_Docblock implements Reflector } return $returnTags; } - + /** * Parse the docblock * @@ -241,22 +253,22 @@ class Zend_Reflection_Docblock implements Reflector protected function _parse() { $docComment = $this->_docComment; - + // First remove doc block line starters $docComment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ ]{0,1}(.*)?#', '$1', $docComment); $docComment = ltrim($docComment, "\r\n"); // @todo should be changed to remove first and last empty line - + $this->_cleanDocComment = $docComment; - + // Next parse out the tags and descriptions $parsedDocComment = $docComment; $lineNumber = $firstBlandLineEncountered = 0; while (($newlinePos = strpos($parsedDocComment, "\n")) !== false) { $lineNumber++; $line = substr($parsedDocComment, 0, $newlinePos); - + $matches = array(); - + if ((strpos($line, '@') === 0) && (preg_match('#^(@\w+.*?)(\n)(?:@|\r?\n|$)#s', $parsedDocComment, $matches))) { $this->_tags[] = Zend_Reflection_Docblock_Tag::factory($matches[1]); $parsedDocComment = str_replace($matches[1] . $matches[2], '', $parsedDocComment); @@ -266,14 +278,14 @@ class Zend_Reflection_Docblock implements Reflector } else { $this->_longDescription .= $line . "\n"; } - + if ($line == '') { $firstBlandLineEncountered = true; } - + $parsedDocComment = substr($parsedDocComment, $newlinePos + 1); } - + } $this->_shortDescription = rtrim($this->_shortDescription); diff --git a/libs/Zend/Reflection/Docblock/Tag.php b/libs/Zend/Reflection/Docblock/Tag.php index 6ee9b5f..9d6347c 100644 --- a/libs/Zend/Reflection/Docblock/Tag.php +++ b/libs/Zend/Reflection/Docblock/Tag.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Tag.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Tag.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Loader */ @@ -42,7 +42,7 @@ class Zend_Reflection_Docblock_Tag implements Reflector * @var string */ protected $_name = null; - + /** * @var string */ @@ -57,8 +57,8 @@ class Zend_Reflection_Docblock_Tag implements Reflector public static function factory($tagDocblockLine) { $matches = array(); - - if (!preg_match('#^@(\w+)\s#', $tagDocblockLine, $matches)) { + + if (!preg_match('#^@(\w+)(\s|$)#', $tagDocblockLine, $matches)) { require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception('No valid tag name found within provided docblock line.'); } @@ -73,7 +73,7 @@ class Zend_Reflection_Docblock_Tag implements Reflector } return new self($tagDocblockLine); } - + /** * Export reflection * @@ -85,7 +85,7 @@ class Zend_Reflection_Docblock_Tag implements Reflector public static function export() { } - + /** * Serialize to string * @@ -96,8 +96,11 @@ class Zend_Reflection_Docblock_Tag implements Reflector */ public function __toString() { + $str = "Docblock Tag [ * @".$this->_name." ]".PHP_EOL; + + return $str; } - + /** * Constructor * @@ -109,17 +112,17 @@ class Zend_Reflection_Docblock_Tag implements Reflector $matches = array(); // find the line - if (!preg_match('#^@(\w+)\s(.*)?#', $tagDocblockLine, $matches)) { + if (!preg_match('#^@(\w+)(?:\s+([^\s].*)|$)?#', $tagDocblockLine, $matches)) { require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception('Provided docblock line does not contain a valid tag'); } $this->_name = $matches[1]; - if ($matches[2]) { + if (isset($matches[2]) && $matches[2]) { $this->_description = $matches[2]; } } - + /** * Get annotation tag name * @@ -129,7 +132,7 @@ class Zend_Reflection_Docblock_Tag implements Reflector { return $this->_name; } - + /** * Get annotation tag description * diff --git a/libs/Zend/Reflection/Docblock/Tag/Param.php b/libs/Zend/Reflection/Docblock/Tag/Param.php index b82dd7f..2218dd3 100644 --- a/libs/Zend/Reflection/Docblock/Tag/Param.php +++ b/libs/Zend/Reflection/Docblock/Tag/Param.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Param.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Param.php 19062 2009-11-19 21:04:08Z beberlei $ */ /** Zend_Reflection_Docblock_Tag */ @@ -34,12 +34,12 @@ class Zend_Reflection_Docblock_Tag_Param extends Zend_Reflection_Docblock_Tag * @var string */ protected $_type = null; - + /** * @var string */ protected $_variableName = null; - + /** * Constructor * @@ -48,29 +48,29 @@ class Zend_Reflection_Docblock_Tag_Param extends Zend_Reflection_Docblock_Tag public function __construct($tagDocblockLine) { $matches = array(); - - if (!preg_match('#^@(\w+)\s(\w+)(?:\s(\$\S+))?(?:\s(.*))?#s', $tagDocblockLine, $matches)) { + + if (!preg_match('#^@(\w+)\s+([\w|\\\]+)(?:\s+(\$\S+))?(?:\s+(.*))?#s', $tagDocblockLine, $matches)) { require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception('Provided docblock line is does not contain a valid tag'); } - + if ($matches[1] != 'param') { require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception('Provided docblock line is does not contain a valid @param tag'); } - + $this->_name = 'param'; $this->_type = $matches[2]; - + if (isset($matches[3])) { $this->_variableName = $matches[3]; } - + if (isset($matches[4])) { $this->_description = preg_replace('#\s+#', ' ', $matches[4]); } } - + /** * Get parameter variable type * @@ -80,7 +80,7 @@ class Zend_Reflection_Docblock_Tag_Param extends Zend_Reflection_Docblock_Tag { return $this->_type; } - + /** * Get parameter name * diff --git a/libs/Zend/Reflection/Docblock/Tag/Return.php b/libs/Zend/Reflection/Docblock/Tag/Return.php index 5469284..4058284 100644 --- a/libs/Zend/Reflection/Docblock/Tag/Return.php +++ b/libs/Zend/Reflection/Docblock/Tag/Return.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Return.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Return.php 19062 2009-11-19 21:04:08Z beberlei $ */ /** Zend_Reflection_Docblock_Tag */ @@ -34,7 +34,7 @@ class Zend_Reflection_Docblock_Tag_Return extends Zend_Reflection_Docblock_Tag * @var string */ protected $_type = null; - + /** * Constructor * @@ -43,23 +43,23 @@ class Zend_Reflection_Docblock_Tag_Return extends Zend_Reflection_Docblock_Tag */ public function __construct($tagDocblockLine) { - if (!preg_match('#^@(\w+)\s(\w+)(?:\s(.*))?#', $tagDocblockLine, $matches)) { + if (!preg_match('#^@(\w+)\s+([\w|\\\]+)(?:\s+(.*))?#', $tagDocblockLine, $matches)) { require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception('Provided docblock line is does not contain a valid tag'); } - + if ($matches[1] != 'return') { require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception('Provided docblock line is does not contain a valid @return tag'); } - + $this->_name = 'return'; $this->_type = $matches[2]; if (isset($matches[3])) { $this->_description = $matches[3]; } } - + /** * Get return variable type * diff --git a/libs/Zend/Reflection/Exception.php b/libs/Zend/Reflection/Exception.php index a4a2c4e..4243939 100644 --- a/libs/Zend/Reflection/Exception.php +++ b/libs/Zend/Reflection/Exception.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,5 +32,5 @@ require_once 'Zend/Exception.php'; */ class Zend_Reflection_Exception extends Zend_Exception { - + } diff --git a/libs/Zend/Reflection/Extension.php b/libs/Zend/Reflection/Extension.php index 51987d2..0c24015 100644 --- a/libs/Zend/Reflection/Extension.php +++ b/libs/Zend/Reflection/Extension.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Extension.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Extension.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -59,7 +59,7 @@ class Zend_Reflection_Extension extends ReflectionExtension unset($phpReflections); return $zendReflections; } - + /** * Get extension class reflection objects * diff --git a/libs/Zend/Reflection/File.php b/libs/Zend/Reflection/File.php index 703fec1..da3ed23 100644 --- a/libs/Zend/Reflection/File.php +++ b/libs/Zend/Reflection/File.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: File.php 17516 2009-08-10 13:50:26Z ralph $ + * @version $Id: File.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -41,37 +41,37 @@ class Zend_Reflection_File implements Reflector * @var string */ protected $_filepath = null; - + /** * @var string */ protected $_docComment = null; - + /** * @var int */ protected $_startLine = 1; - + /** * @var int */ protected $_endLine = null; - + /** * @var string[] */ protected $_requiredFiles = array(); - + /** * @var Zend_Reflection_Class[] */ protected $_classes = array(); - + /** * @var Zend_Reflection_Function[] */ protected $_functions = array(); - + /** * @var string */ @@ -83,7 +83,7 @@ class Zend_Reflection_File implements Reflector * @param string $file * @return void */ - public function __construct($file) + public function __construct($file) { $fileName = $file; @@ -112,15 +112,15 @@ class Zend_Reflection_File implements Reflector $includePaths = explode(PATH_SEPARATOR, get_include_path()); while (count($includePaths) > 0) { $filePath = array_shift($includePaths) . DIRECTORY_SEPARATOR . $fileName; - + if ( ($foundRealpath = realpath($filePath)) !== false) { break; } } - + return $foundRealpath; } - + /** * Export * @@ -133,7 +133,7 @@ class Zend_Reflection_File implements Reflector { return null; } - + /** * Return the file name of the reflected file * @@ -143,7 +143,7 @@ class Zend_Reflection_File implements Reflector { return $this->_fileName; } - + /** * Get the start line - Always 1, staying consistent with the Reflection API * @@ -153,7 +153,7 @@ class Zend_Reflection_File implements Reflector { return $this->_startLine; } - + /** * Get the end line / number of lines * @@ -163,7 +163,7 @@ class Zend_Reflection_File implements Reflector { return $this->_endLine; } - + /** * Return the doc comment * @@ -173,7 +173,7 @@ class Zend_Reflection_File implements Reflector { return $this->_docComment; } - + /** * Return the docblock * @@ -189,7 +189,7 @@ class Zend_Reflection_File implements Reflector } return $instance; } - + /** * Return the reflection classes of the classes found inside this file * @@ -209,8 +209,8 @@ class Zend_Reflection_File implements Reflector } return $classes; } - - /** + + /** * Return the reflection functions of the functions found inside this file * * @param string $reflectionClass Name of reflection class to use for instances @@ -229,7 +229,7 @@ class Zend_Reflection_File implements Reflector } return $functions; } - + /** * Retrieve the reflection class of a given class found in this file * @@ -250,7 +250,7 @@ class Zend_Reflection_File implements Reflector } return $instance; } - + if (in_array($name, $this->_classes)) { $instance = new $reflectionClass($name); if (!$instance instanceof Zend_Reflection_Class) { @@ -259,7 +259,7 @@ class Zend_Reflection_File implements Reflector } return $instance; } - + require_once 'Zend/Reflection/Exception.php'; throw new Zend_Reflection_Exception('Class by name ' . $name . ' not found.'); } @@ -273,7 +273,7 @@ class Zend_Reflection_File implements Reflector { return $this->_contents; } - + /** * Serialize to string * @@ -286,7 +286,7 @@ class Zend_Reflection_File implements Reflector { return ''; } - + /** * This method does the work of "reflecting" the file * @@ -298,27 +298,27 @@ class Zend_Reflection_File implements Reflector { $contents = $this->_contents; $tokens = token_get_all($contents); - + $functionTrapped = false; $classTrapped = false; $requireTrapped = false; $openBraces = 0; - + $this->_checkFileDocBlock($tokens); - + foreach ($tokens as $token) { /* - * Tokens are characters representing symbols or arrays - * representing strings. The keys/values in the arrays are + * Tokens are characters representing symbols or arrays + * representing strings. The keys/values in the arrays are * - * - 0 => token id, - * - 1 => string, + * - 0 => token id, + * - 1 => string, * - 2 => line number * - * Token ID's are explained here: + * Token ID's are explained here: * http://www.php.net/manual/en/tokens.php. */ - + if (is_array($token)) { $type = $token[0]; $value = $token[1]; @@ -331,10 +331,10 @@ class Zend_Reflection_File implements Reflector } else if ($token == '}') { $openBraces--; } - + continue; } - + switch ($type) { // Name of something case T_STRING: @@ -346,7 +346,7 @@ class Zend_Reflection_File implements Reflector $classTrapped = false; } continue; - + // Required file names are T_CONSTANT_ENCAPSED_STRING case T_CONSTANT_ENCAPSED_STRING: if ($requireTrapped) { @@ -354,20 +354,20 @@ class Zend_Reflection_File implements Reflector $requireTrapped = false; } continue; - + // Functions case T_FUNCTION: if ($openBraces == 0) { $functionTrapped = true; } break; - + // Classes case T_CLASS: case T_INTERFACE: $classTrapped = true; break; - + // All types of requires case T_REQUIRE: case T_REQUIRE_ONCE: @@ -381,13 +381,13 @@ class Zend_Reflection_File implements Reflector break; } } - + $this->_endLine = count(explode("\n", $this->_contents)); } - + /** * Validate / check a file level docblock - * + * * @param array $tokens Array of tokenizer tokens * @return void */ diff --git a/libs/Zend/Reflection/Function.php b/libs/Zend/Reflection/Function.php index d0d0fe2..7f12762 100644 --- a/libs/Zend/Reflection/Function.php +++ b/libs/Zend/Reflection/Function.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Function.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Function.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -51,7 +51,7 @@ class Zend_Reflection_Function extends ReflectionFunction } return $instance; } - + /** * Get start line (position) of function * @@ -65,10 +65,10 @@ class Zend_Reflection_Function extends ReflectionFunction return $this->getDocblock()->getStartLine(); } } - + return parent::getStartLine(); } - + /** * Get contents of function * @@ -77,16 +77,16 @@ class Zend_Reflection_Function extends ReflectionFunction */ public function getContents($includeDocblock = true) { - return implode("\n", + return implode("\n", array_splice( file($this->getFileName()), - $this->getStartLine($includeDocblock), - ($this->getEndLine() - $this->getStartLine()), + $this->getStartLine($includeDocblock), + ($this->getEndLine() - $this->getStartLine()), true ) ); } - + /** * Get function parameters * @@ -109,7 +109,7 @@ class Zend_Reflection_Function extends ReflectionFunction unset($phpReflections); return $zendReflections; } - + /** * Get return type tag * diff --git a/libs/Zend/Reflection/Method.php b/libs/Zend/Reflection/Method.php index e330391..b59b061 100644 --- a/libs/Zend/Reflection/Method.php +++ b/libs/Zend/Reflection/Method.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Method.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Method.php 18165 2009-09-17 13:24:09Z carlton $ */ /** @@ -62,7 +62,7 @@ class Zend_Reflection_Method extends ReflectionMethod } return $instance; } - + /** * Get start line (position) of method * @@ -76,10 +76,10 @@ class Zend_Reflection_Method extends ReflectionMethod return $this->getDocblock()->getStartLine(); } } - + return parent::getStartLine(); } - + /** * Get reflection of declaring class * @@ -97,7 +97,7 @@ class Zend_Reflection_Method extends ReflectionMethod unset($phpReflection); return $zendReflection; } - + /** * Get all method parameter reflection objects * @@ -120,7 +120,7 @@ class Zend_Reflection_Method extends ReflectionMethod unset($phpReflections); return $zendReflections; } - + /** * Get method contents * @@ -132,10 +132,10 @@ class Zend_Reflection_Method extends ReflectionMethod $fileContents = file($this->getFileName()); $startNum = $this->getStartLine($includeDocblock); $endNum = ($this->getEndLine() - $this->getStartLine()); - + return implode("\n", array_splice($fileContents, $startNum, $endNum, true)); } - + /** * Get method body * @@ -144,25 +144,25 @@ class Zend_Reflection_Method extends ReflectionMethod public function getBody() { $lines = array_slice( - file($this->getDeclaringClass()->getFileName()), - $this->getStartLine(), - ($this->getEndLine() - $this->getStartLine()), + file($this->getDeclaringClass()->getFileName(), FILE_IGNORE_NEW_LINES), + $this->getStartLine(), + ($this->getEndLine() - $this->getStartLine()), true ); - + $firstLine = array_shift($lines); if (trim($firstLine) !== '{') { array_unshift($lines, $firstLine); } - + $lastLine = array_pop($lines); - + if (trim($lastLine) !== '}') { array_push($lines, $lastLine); } - // just in case we had code on the braket lines + // just in case we had code on the bracket lines return rtrim(ltrim(implode("\n", $lines), '{'), '}'); } } diff --git a/libs/Zend/Reflection/Parameter.php b/libs/Zend/Reflection/Parameter.php index d47c0cd..b43489d 100644 --- a/libs/Zend/Reflection/Parameter.php +++ b/libs/Zend/Reflection/Parameter.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Parameter.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Parameter.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -25,13 +25,13 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Reflection_Parameter extends ReflectionParameter +class Zend_Reflection_Parameter extends ReflectionParameter { /** * @var bool */ protected $_isFromMethod = false; - + /** * Get declaring class reflection object * @@ -49,7 +49,7 @@ class Zend_Reflection_Parameter extends ReflectionParameter unset($phpReflection); return $zendReflection; } - + /** * Get class reflection object * @@ -59,6 +59,10 @@ class Zend_Reflection_Parameter extends ReflectionParameter public function getClass($reflectionClass = 'Zend_Reflection_Class') { $phpReflection = parent::getClass(); + if($phpReflection == null) { + return null; + } + $zendReflection = new $reflectionClass($phpReflection->getName()); if (!$zendReflection instanceof Zend_Reflection_Class) { require_once 'Zend/Reflection/Exception.php'; @@ -67,7 +71,7 @@ class Zend_Reflection_Parameter extends ReflectionParameter unset($phpReflection); return $zendReflection; } - + /** * Get declaring function reflection object * @@ -97,7 +101,7 @@ class Zend_Reflection_Parameter extends ReflectionParameter unset($phpReflection); return $zendReflection; } - + /** * Get parameter type * @@ -107,13 +111,13 @@ class Zend_Reflection_Parameter extends ReflectionParameter { if ($docblock = $this->getDeclaringFunction()->getDocblock()) { $params = $docblock->getTags('param'); - - if (isset($params[$this->getPosition() - 1])) { - return $params[$this->getPosition() - 1]->getType(); + + if (isset($params[$this->getPosition()])) { + return $params[$this->getPosition()]->getType(); } - + } - + return null; } } diff --git a/libs/Zend/Reflection/Property.php b/libs/Zend/Reflection/Property.php index f09e6f4..eea7e53 100644 --- a/libs/Zend/Reflection/Property.php +++ b/libs/Zend/Reflection/Property.php @@ -16,7 +16,7 @@ * @package Zend_Reflection * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Property.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Property.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -47,8 +47,8 @@ class Zend_Reflection_Property extends ReflectionProperty /** * Get docblock comment - * - * @param string $reflectionClass + * + * @param string $reflectionClass * @return Zend_Reflection_Docblock|false False if no docblock defined */ public function getDocComment($reflectionClass = 'Zend_Reflection_Docblock') diff --git a/libs/Zend/Rest/Client.php b/libs/Zend/Rest/Client.php index 127e5dd..122c3e5 100644 --- a/libs/Zend/Rest/Client.php +++ b/libs/Zend/Rest/Client.php @@ -17,7 +17,7 @@ * @subpackage Client * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Client.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Client.php 18173 2009-09-17 15:35:05Z padraic $ */ @@ -126,6 +126,7 @@ class Zend_Rest_Client extends Zend_Service_Abstract * * @param string $path * @param array $query Array of GET parameters + * @throws Zend_Http_Client_Exception * @return Zend_Http_Response */ final public function restGet($path, array $query = null) @@ -163,6 +164,7 @@ class Zend_Rest_Client extends Zend_Service_Abstract * * @param string $path * @param mixed $data Raw data to send + * @throws Zend_Http_Client_Exception * @return Zend_Http_Response */ final public function restPost($path, $data = null) @@ -176,6 +178,7 @@ class Zend_Rest_Client extends Zend_Service_Abstract * * @param string $path * @param mixed $data Raw data to send in request + * @throws Zend_Http_Client_Exception * @return Zend_Http_Response */ final public function restPut($path, $data = null) @@ -188,6 +191,7 @@ class Zend_Rest_Client extends Zend_Service_Abstract * Performs an HTTP DELETE request to $path. * * @param string $path + * @throws Zend_Http_Client_Exception * @return Zend_Http_Response */ final public function restDelete($path) diff --git a/libs/Zend/Rest/Controller.php b/libs/Zend/Rest/Controller.php index e333087..eb221bc 100644 --- a/libs/Zend/Rest/Controller.php +++ b/libs/Zend/Rest/Controller.php @@ -15,7 +15,7 @@ * @package Zend_Rest * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Controller.php 16595 2009-07-09 20:26:25Z matthew $ + * @version $Id: Controller.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Controller_Action */ @@ -24,45 +24,45 @@ require_once 'Zend/Controller/Action.php'; /** * An abstract class to guide implementation of action controllers for use with * Zend_Rest_Route. - * + * * @package Zend_Rest * @see Zend_Rest_Route * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License + * @license http://framework.zend.com/license/new-bsd New BSD License */ abstract class Zend_Rest_Controller extends Zend_Controller_Action { /** * The index action handles index/list requests; it should respond with a * list of the requested resources. - */ + */ abstract public function indexAction(); /** - * The get action handles GET requests and receives an 'id' parameter; it + * The get action handles GET requests and receives an 'id' parameter; it * should respond with the server resource state of the resource identified * by the 'id' value. - */ + */ abstract public function getAction(); - + /** * The post action handles POST requests; it should accept and digest a * POSTed resource representation and persist the resource state. - */ + */ abstract public function postAction(); - + /** - * The put action handles PUT requests and receives an 'id' parameter; it - * should update the server resource state of the resource identified by + * The put action handles PUT requests and receives an 'id' parameter; it + * should update the server resource state of the resource identified by * the 'id' value. - */ + */ abstract public function putAction(); - + /** - * The delete action handles DELETE requests and receives an 'id' + * The delete action handles DELETE requests and receives an 'id' * parameter; it should update the server resource state of the resource * identified by the 'id' value. - */ + */ abstract public function deleteAction(); - + } \ No newline at end of file diff --git a/libs/Zend/Rest/Route.php b/libs/Zend/Rest/Route.php index 14a363e..221467d 100644 --- a/libs/Zend/Rest/Route.php +++ b/libs/Zend/Rest/Route.php @@ -15,25 +15,25 @@ * @package Zend_Rest * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Route.php 16891 2009-07-20 19:37:29Z doctorrock83 $ + * @version $Id: Route.php 19078 2009-11-20 00:36:49Z matthew $ */ -/** - * @see Zend_Controller_Router_Route_Interface +/** + * @see Zend_Controller_Router_Route_Interface */ require_once 'Zend/Controller/Router/Route/Interface.php'; -/** +/** * @see Zend_Controller_Router_Route_Module */ require_once 'Zend/Controller/Router/Route/Module.php'; -/** +/** * @see Zend_Controller_Dispatcher_Interface */ require_once 'Zend/Controller/Dispatcher/Interface.php'; -/** +/** * @see Zend_Controller_Request_Abstract */ require_once 'Zend/Controller/Request/Abstract.php'; @@ -52,37 +52,41 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module /** * Specific Modules to receive RESTful routes * @var array - */ - protected $_restfulModules = null; - + */ + protected $_restfulModules = null; + /** * Specific Modules=>Controllers to receive RESTful routes * @var array - */ - protected $_restfulControllers = null; - + */ + protected $_restfulControllers = null; + + /** + * @var Zend_Controller_Front + */ + protected $_front; + /** * Constructor * * @param Zend_Controller_Front $front Front Controller object * @param array $defaults Defaults for map variables with keys as variable names * @param array $responders Modules or controllers to receive RESTful routes - */ - public function __construct(Zend_Controller_Front $front, - array $defaults = array(), - array $responders = array()) - { - $this->_defaults = $defaults; - - if($responders) - $this->_parseResponders($responders); - - if (isset($front)) { - $this->_request = $front->getRequest(); - $this->_dispatcher = $front->getDispatcher(); - } - } - + */ + public function __construct(Zend_Controller_Front $front, + array $defaults = array(), + array $responders = array() + ) { + $this->_defaults = $defaults; + + if ($responders) { + $this->_parseResponders($responders); + } + + $this->_front = $front; + $this->_dispatcher = $front->getDispatcher(); + } + /** * Matches a user submitted request. Assigns and returns an array of variables * on a successful match. @@ -93,83 +97,87 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module * * @param Zend_Controller_Request_Http $request Request used to match against this routing ruleset * @return array An array of assigned values or a false on a mismatch - */ - public function match($request) - { - $this->_setRequestKeys(); - - $path = $request->getPathInfo(); - $values = array(); - $params = array(); - $path = trim($path, self::URI_DELIMITER); - - if ($path != '') { - - $path = explode(self::URI_DELIMITER, $path); - - // Determine Module - $moduleName = $this->_defaults[$this->_moduleKey]; - if ($this->_dispatcher && $this->_dispatcher->isValidModule($path[0])) { - $moduleName = $path[0]; - if ($this->_checkRestfulModule($moduleName)) { - $values[$this->_moduleKey] = array_shift($path); - $this->_moduleValid = true; - } - } - - // Determine Controller - $controllerName = $this->_defaults[$this->_controllerKey]; - if (count($path) && !empty($path[0])) { - if ($this->_checkRestfulController($moduleName, $path[0])) { - $controllerName = $path[0]; - $values[$this->_controllerKey] = array_shift($path); - $values[$this->_actionKey] = 'get'; - } else { - // If Controller in URI is not found to be a RESTful - // Controller, return false to fall back to other routes - return false; - } - } - + */ + public function match($request, $partial = false) + { + if (!$request instanceof Zend_Controller_Request_Http) { + $request = $this->_front->getRequest(); + } + $this->_request = $request; + $this->_setRequestKeys(); + + $path = $request->getPathInfo(); + $values = array(); + $params = array(); + $path = trim($path, self::URI_DELIMITER); + + if ($path != '') { + + $path = explode(self::URI_DELIMITER, $path); + + // Determine Module + $moduleName = $this->_defaults[$this->_moduleKey]; + $dispatcher = $this->_front->getDispatcher(); + if ($dispatcher && $dispatcher->isValidModule($path[0])) { + $moduleName = $path[0]; + if ($this->_checkRestfulModule($moduleName)) { + $values[$this->_moduleKey] = array_shift($path); + $this->_moduleValid = true; + } + } + + // Determine Controller + $controllerName = $this->_defaults[$this->_controllerKey]; + if (count($path) && !empty($path[0])) { + if ($this->_checkRestfulController($moduleName, $path[0])) { + $controllerName = $path[0]; + $values[$this->_controllerKey] = array_shift($path); + $values[$this->_actionKey] = 'get'; + } else { + // If Controller in URI is not found to be a RESTful + // Controller, return false to fall back to other routes + return false; + } + } + //Store path count for method mapping $pathElementCount = count($path); - - // Check for leading "special get" URI's + + // Check for leading "special get" URI's $specialGetTarget = false; - if ($pathElementCount && array_search($path[0], array('index', 'new')) > -1) { + if ($pathElementCount && array_search($path[0], array('index', 'new')) > -1) { $specialGetTarget = array_shift($path); + } elseif ($pathElementCount && $path[$pathElementCount-1] == 'edit') { + $specialGetTarget = 'edit'; + $params['id'] = $path[$pathElementCount-2]; } elseif ($pathElementCount == 1) { - $params['id'] = array_shift($path); + $params['id'] = array_shift($path); } elseif ($pathElementCount == 0 || $pathElementCount > 1) { - $specialGetTarget = 'list'; + $specialGetTarget = 'index'; } - - // Digest URI params - if ($numSegs = count($path)) { - for ($i = 0; $i < $numSegs; $i = $i + 2) { - $key = urldecode($path[$i]); - $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null; - $params[$key] = $val; - } - } - - // Check for trailing "special get" URI - if (array_key_exists('edit', $params)) - $specialGetTarget = 'edit'; - - // Determine Action - $requestMethod = strtolower($request->getMethod()); - if ($requestMethod != 'get') { - if ($request->getParam('_method')) { - $values[$this->_actionKey] = strtolower($request->getParam('_method')); - } elseif ( $this->_request->getHeader('X-HTTP-Method-Override') ) { - $values[$this->_actionKey] = strtolower($this->_request->getHeader('X-HTTP-Method-Override')); - } else { - $values[$this->_actionKey] = $requestMethod; + + // Digest URI params + if ($numSegs = count($path)) { + for ($i = 0; $i < $numSegs; $i = $i + 2) { + $key = urldecode($path[$i]); + $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null; + $params[$key] = $val; + } + } + + // Determine Action + $requestMethod = strtolower($request->getMethod()); + if ($requestMethod != 'get') { + if ($request->getParam('_method')) { + $values[$this->_actionKey] = strtolower($request->getParam('_method')); + } elseif ( $request->getHeader('X-HTTP-Method-Override') ) { + $values[$this->_actionKey] = strtolower($request->getHeader('X-HTTP-Method-Override')); + } else { + $values[$this->_actionKey] = $requestMethod; } - //Map PUT and POST to actual create/update actions - //based on parameter count (posting to resource or collection) + // Map PUT and POST to actual create/update actions + // based on parameter count (posting to resource or collection) switch( $values[$this->_actionKey] ){ case 'post': if ($pathElementCount > 0) { @@ -182,17 +190,22 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module $values[$this->_actionKey] = 'put'; break; } - - } elseif ($specialGetTarget) { - $values[$this->_actionKey] = $specialGetTarget; - } - - } + + } elseif ($specialGetTarget) { + $values[$this->_actionKey] = $specialGetTarget; + } + + } $this->_values = $values + $params; - - return $this->_values + $this->_defaults; - } - + + $result = $this->_values + $this->_defaults; + + if ($partial && $result) + $this->setMatchedPath($request->getPathInfo()); + + return $result; + } + /** * Assembles user submitted parameters forming a URL path defined by this route * @@ -200,71 +213,72 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module * @param bool $reset Weither to reset the current params * @param bool $encode Weither to return urlencoded string * @return string Route path with user submitted parameters - */ - public function assemble($data = array(), $reset = false, $encode = true) - { - if (!$this->_keysSet) { - $this->_setRequestKeys(); - } - - $params = (!$reset) ? $this->_values : array(); - - foreach ($data as $key => $value) { - if ($value !== null) { - $params[$key] = $value; - } elseif (isset($params[$key])) { - unset($params[$key]); - } - } - - $params += $this->_defaults; - - $url = ''; - - if ($this->_moduleValid || array_key_exists($this->_moduleKey, $data)) { - if ($params[$this->_moduleKey] != $this->_defaults[$this->_moduleKey]) { - $module = $params[$this->_moduleKey]; - } - } - unset($params[$this->_moduleKey]); - - $controller = $params[$this->_controllerKey]; + */ + public function assemble($data = array(), $reset = false, $encode = true) + { + if (!$this->_keysSet) { + if (null === $this->_request) { + $this->_request = $this->_front->getRequest(); + } + $this->_setRequestKeys(); + } + + $params = (!$reset) ? $this->_values : array(); + + foreach ($data as $key => $value) { + if ($value !== null) { + $params[$key] = $value; + } elseif (isset($params[$key])) { + unset($params[$key]); + } + } + + $params += $this->_defaults; + + $url = ''; + + if ($this->_moduleValid || array_key_exists($this->_moduleKey, $data)) { + if ($params[$this->_moduleKey] != $this->_defaults[$this->_moduleKey]) { + $module = $params[$this->_moduleKey]; + } + } + unset($params[$this->_moduleKey]); + + $controller = $params[$this->_controllerKey]; unset($params[$this->_controllerKey]); unset($params[$this->_actionKey]); - + if (isset($params['index']) && $params['index']) { unset($params['index']); $url .= '/index'; - foreach ($params as $key => $value) { - $url .= '/' . $key; - $url .= '/' . $value; + foreach ($params as $key => $value) { + $url .= '/' . $key . '/' . $value; } - } else { - if (isset($params['id'])) - $url .= '/' . $params['id']; + } elseif (isset($params['id'])) { + $url .= '/' . $params['id']; } - - if (!empty($url) || $controller !== $this->_defaults[$this->_controllerKey]) { - $url = '/' . $controller . $url; - } - - if (isset($module)) { - $url = '/' . $module . $url; - } - - return ltrim($url, self::URI_DELIMITER); - } - + + if (!empty($url) || $controller !== $this->_defaults[$this->_controllerKey]) { + $url = '/' . $controller . $url; + } + + if (isset($module)) { + $url = '/' . $module . $url; + } + + return ltrim($url, self::URI_DELIMITER); + } + /** * Tells Rewrite Router which version this Route is * * @return int Route "version" - */ - public function getVersion() - { - return 2; - } + */ + public function getVersion() + { + return 2; + } /** * Parses the responders array sent to constructor to know @@ -272,19 +286,21 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module * * @param array $responders */ - private function _parseResponders($responders) - { - $modulesOnly = true; - foreach ($responders as $responder) { - if(is_array($responder)) - $modulesOnly = false; - } - if ($modulesOnly) { - $this->_restfulModules = $responders; - } else { - $this->_restfulControllers = $responders; - } - } + private function _parseResponders($responders) + { + $modulesOnly = true; + foreach ($responders as $responder) { + if(is_array($responder)) { + $modulesOnly = false; + break; + } + } + if ($modulesOnly) { + $this->_restfulModules = $responders; + } else { + $this->_restfulControllers = $responders; + } + } /** * Determine if a specified module supports RESTful routing @@ -292,16 +308,19 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module * @param string $moduleName * @return bool */ - private function _checkRestfulModule($moduleName) - { - if ($this->_allRestful()) - return true; - if ($this->_fullRestfulModule($moduleName)) - return true; - if ($this->_restfulControllers && array_key_exists($moduleName, $this->_restfulControllers)) - return true; - return false; - } + private function _checkRestfulModule($moduleName) + { + if ($this->_allRestful()) { + return true; + } + if ($this->_fullRestfulModule($moduleName)) { + return true; + } + if ($this->_restfulControllers && array_key_exists($moduleName, $this->_restfulControllers)) { + return true; + } + return false; + } /** * Determine if a specified module + controller combination supports @@ -311,28 +330,32 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module * @param string $controllerName * @return bool */ - private function _checkRestfulController($moduleName, $controllerName) - { - if ($this->_allRestful()) - return true; - if ($this->_fullRestfulModule($moduleName)) - return true; - if ($this->_checkRestfulModule($moduleName) - && $this->_restfulControllers - && array_search($controllerName, $this->_restfulControllers[$moduleName]) !== false) - return true; - return false; - } + private function _checkRestfulController($moduleName, $controllerName) + { + if ($this->_allRestful()) { + return true; + } + if ($this->_fullRestfulModule($moduleName)) { + return true; + } + if ($this->_checkRestfulModule($moduleName) + && $this->_restfulControllers + && (false !== array_search($controllerName, $this->_restfulControllers[$moduleName])) + ) { + return true; + } + return false; + } /** * Determines if RESTful routing applies to the entire app * * @return bool */ - private function _allRestful() - { - return (!$this->_restfulModules && !$this->_restfulControllers); - } + private function _allRestful() + { + return (!$this->_restfulModules && !$this->_restfulControllers); + } /** * Determines if RESTful routing applies to an entire module @@ -340,9 +363,11 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module * @param string $moduleName * @return bool */ - private function _fullRestfulModule($moduleName) - { - return ($this->_restfulModules && array_search($moduleName, $this->_restfulModules) !== false); - } - -} \ No newline at end of file + private function _fullRestfulModule($moduleName) + { + return ( + $this->_restfulModules + && (false !==array_search($moduleName, $this->_restfulModules)) + ); + } +} diff --git a/libs/Zend/Rest/Server.php b/libs/Zend/Rest/Server.php index 476d6a7..410aefd 100644 --- a/libs/Zend/Rest/Server.php +++ b/libs/Zend/Rest/Server.php @@ -17,21 +17,21 @@ * @subpackage Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Server.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Server.php 18545 2009-10-15 11:06:03Z yoshida@zend.co.jp $ */ /** - * Zend_Server_Interface + * @see Zend_Server_Interface */ require_once 'Zend/Server/Interface.php'; /** - * Zend_Server_Reflection + * @see Zend_Server_Reflection */ require_once 'Zend/Server/Reflection.php'; /** - * Zend_Server_Abstract + * @see Zend_Server_Abstract */ require_once 'Zend/Server/Abstract.php'; @@ -592,9 +592,11 @@ class Zend_Rest_Server implements Zend_Server_Interface $object = $this->_functions[$this->_method]->getDeclaringClass()->newInstance(); } } catch (Exception $e) { - echo $e->getMessage(); require_once 'Zend/Rest/Server/Exception.php'; - throw new Zend_Rest_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $this->_functions[$this->_method]->getName(), 500); + throw new Zend_Rest_Server_Exception('Error instantiating class ' . $class . + ' to invoke method ' . $this->_functions[$this->_method]->getName() . + ' (' . $e->getMessage() . ') ', + 500); } try { diff --git a/libs/Zend/Search/Lucene.php b/libs/Zend/Search/Lucene.php index b595993..ca7a1a3 100644 --- a/libs/Zend/Search/Lucene.php +++ b/libs/Zend/Search/Lucene.php @@ -16,11 +16,12 @@ * @package Zend_Search_Lucene * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Lucene.php 17164 2009-07-27 03:59:23Z matthew $ + * @version $Id: Lucene.php 19012 2009-11-17 15:13:49Z alexander $ */ -/** Zend_Search_Lucene_Document */ -require_once 'Zend/Search/Lucene/Document.php'; + +/** User land classes and interfaces turned on by Zend/Search/Lucene.php file inclusion. */ +/** @todo Section should be removed with ZF 2.0 release as obsolete */ /** Zend_Search_Lucene_Document_Html */ require_once 'Zend/Search/Lucene/Document/Html.php'; @@ -34,53 +35,56 @@ require_once 'Zend/Search/Lucene/Document/Pptx.php'; /** Zend_Search_Lucene_Document_Xlsx */ require_once 'Zend/Search/Lucene/Document/Xlsx.php'; -/** Zend_Search_Lucene_Storage_Directory_Filesystem */ -require_once 'Zend/Search/Lucene/Storage/Directory/Filesystem.php'; - -/** Zend_Search_Lucene_Storage_File_Memory */ -require_once 'Zend/Search/Lucene/Storage/File/Memory.php'; - -/** Zend_Search_Lucene_Index_Term */ -require_once 'Zend/Search/Lucene/Index/Term.php'; - -/** Zend_Search_Lucene_Index_TermInfo */ -require_once 'Zend/Search/Lucene/Index/TermInfo.php'; - -/** Zend_Search_Lucene_Index_SegmentInfo */ -require_once 'Zend/Search/Lucene/Index/SegmentInfo.php'; - -/** Zend_Search_Lucene_Index_FieldInfo */ -require_once 'Zend/Search/Lucene/Index/FieldInfo.php'; - -/** Zend_Search_Lucene_Index_Writer */ -require_once 'Zend/Search/Lucene/Index/Writer.php'; - /** Zend_Search_Lucene_Search_QueryParser */ require_once 'Zend/Search/Lucene/Search/QueryParser.php'; /** Zend_Search_Lucene_Search_QueryHit */ require_once 'Zend/Search/Lucene/Search/QueryHit.php'; -/** Zend_Search_Lucene_Search_Similarity */ -require_once 'Zend/Search/Lucene/Search/Similarity.php'; +/** Zend_Search_Lucene_Analysis_Analyzer */ +require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; -/** Zend_Search_Lucene_Index_TermsPriorityQueue */ -require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php'; +/** Zend_Search_Lucene_Search_Query_Term */ +require_once 'Zend/Search/Lucene/Search/Query/Term.php'; -/** Zend_Search_Lucene_TermStreamsPriorityQueue */ -require_once 'Zend/Search/Lucene/TermStreamsPriorityQueue.php'; +/** Zend_Search_Lucene_Search_Query_Phrase */ +require_once 'Zend/Search/Lucene/Search/Query/Phrase.php'; -/** Zend_Search_Lucene_Index_DocsFilter */ -require_once 'Zend/Search/Lucene/Index/DocsFilter.php'; +/** Zend_Search_Lucene_Search_Query_MultiTerm */ +require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; -/** Zend_Search_Lucene_LockManager */ -require_once 'Zend/Search/Lucene/LockManager.php'; +/** Zend_Search_Lucene_Search_Query_Wildcard */ +require_once 'Zend/Search/Lucene/Search/Query/Wildcard.php'; + +/** Zend_Search_Lucene_Search_Query_Range */ +require_once 'Zend/Search/Lucene/Search/Query/Range.php'; + +/** Zend_Search_Lucene_Search_Query_Fuzzy */ +require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php'; + +/** Zend_Search_Lucene_Search_Query_Boolean */ +require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; + +/** Zend_Search_Lucene_Search_Query_Empty */ +require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; + +/** Zend_Search_Lucene_Search_Query_Insignificant */ +require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; + + + + +/** Internally used classes */ /** Zend_Search_Lucene_Interface */ require_once 'Zend/Search/Lucene/Interface.php'; -/** Zend_Search_Lucene_Proxy */ -require_once 'Zend/Search/Lucene/Proxy.php'; +/** Zend_Search_Lucene_Index_SegmentInfo */ +require_once 'Zend/Search/Lucene/Index/SegmentInfo.php'; + +/** Zend_Search_Lucene_LockManager */ +require_once 'Zend/Search/Lucene/LockManager.php'; + /** * @category Zend @@ -139,7 +143,7 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface private $_writer = null; /** - * Array of Zend_Search_Lucene_Index_SegmentInfo objects for this index. + * Array of Zend_Search_Lucene_Index_SegmentInfo objects for current version of index. * * @var array Zend_Search_Lucene_Index_SegmentInfo */ @@ -201,6 +205,9 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface */ public static function create($directory) { + /** Zend_Search_Lucene_Proxy */ + require_once 'Zend/Search/Lucene/Proxy.php'; + return new Zend_Search_Lucene_Proxy(new Zend_Search_Lucene($directory, true)); } @@ -212,6 +219,9 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface */ public static function open($directory) { + /** Zend_Search_Lucene_Proxy */ + require_once 'Zend/Search/Lucene/Proxy.php'; + return new Zend_Search_Lucene_Proxy(new Zend_Search_Lucene($directory, false)); } @@ -477,7 +487,7 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface * IndexReader constructor needs Directory as a parameter. It should be * a string with a path to the index folder or a Directory object. * - * @param mixed $directory + * @param Zend_Search_Lucene_Storage_Directory_Filesystem|string $directory * @throws Zend_Search_Lucene_Exception */ public function __construct($directory = null, $create = false) @@ -487,12 +497,13 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface throw new Zend_Search_Exception('No index directory specified'); } - if ($directory instanceof Zend_Search_Lucene_Storage_Directory_Filesystem) { - $this->_directory = $directory; - $this->_closeDirOnExit = false; - } else { + if (is_string($directory)) { + require_once 'Zend/Search/Lucene/Storage/Directory/Filesystem.php'; $this->_directory = new Zend_Search_Lucene_Storage_Directory_Filesystem($directory); $this->_closeDirOnExit = true; + } else { + $this->_directory = $directory; + $this->_closeDirOnExit = false; } $this->_segmentInfos = array(); @@ -529,6 +540,7 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface $this->_generation++; } + require_once 'Zend/Search/Lucene/Index/Writer.php'; Zend_Search_Lucene_Index_Writer::createIndex($this->_directory, $this->_generation, $nameCounter); Zend_Search_Lucene_LockManager::releaseWriteLock($this->_directory); @@ -611,8 +623,11 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface */ private function _getIndexWriter() { - if (!$this->_writer instanceof Zend_Search_Lucene_Index_Writer) { - $this->_writer = new Zend_Search_Lucene_Index_Writer($this->_directory, $this->_segmentInfos, $this->_formatVersion); + if ($this->_writer === null) { + require_once 'Zend/Search/Lucene/Index/Writer.php'; + $this->_writer = new Zend_Search_Lucene_Index_Writer($this->_directory, + $this->_segmentInfos, + $this->_formatVersion); } return $this->_writer; @@ -881,13 +896,15 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface * of Zend_Search_Lucene_Search_QueryHit objects. * Input is a string or Zend_Search_Lucene_Search_Query. * - * @param mixed $query + * @param Zend_Search_Lucene_Search_QueryParser|string $query * @return array Zend_Search_Lucene_Search_QueryHit * @throws Zend_Search_Lucene_Exception */ public function find($query) { if (is_string($query)) { + require_once 'Zend/Search/Lucene/Search/QueryParser.php'; + $query = Zend_Search_Lucene_Search_QueryParser::parse($query); } @@ -908,6 +925,9 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface $topScore = 0; + /** Zend_Search_Lucene_Search_QueryHit */ + require_once 'Zend/Search/Lucene/Search/QueryHit.php'; + foreach ($query->matchedDocs() as $id => $num) { $docScore = $query->score($id, $this); if( $docScore != 0 ) { @@ -953,8 +973,8 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface $sortArgs = array(); // PHP 5.3 now expects all arguments to array_multisort be passed by - // reference; since constants can't be passed by reference, create - // some placeholder variables. + // reference (if it's invoked through call_user_func_array()); + // since constants can't be passed by reference, create some placeholder variables. $sortReg = SORT_REGULAR; $sortAsc = SORT_ASC; $sortNum = SORT_NUMERIC; @@ -967,26 +987,31 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface throw new Zend_Search_Lucene_Exception('Field name must be a string.'); } - if (!in_array($fieldName, $fieldNames)) { - throw new Zend_Search_Lucene_Exception('Wrong field name.'); - } - - $valuesArray = array(); - foreach ($hits as $hit) { - try { - $value = $hit->getDocument()->getFieldValue($fieldName); - } catch (Zend_Search_Lucene_Exception $e) { - if (strpos($e->getMessage(), 'not found') === false) { - throw $e; - } else { - $value = null; - } + if (strtolower($fieldName) == 'score') { + $sortArgs[] = $scores; + } else { + if (!in_array($fieldName, $fieldNames)) { + throw new Zend_Search_Lucene_Exception('Wrong field name.'); } - $valuesArray[] = $value; - } + $valuesArray = array(); + foreach ($hits as $hit) { + try { + $value = $hit->getDocument()->getFieldValue($fieldName); + } catch (Zend_Search_Lucene_Exception $e) { + if (strpos($e->getMessage(), 'not found') === false) { + throw $e; + } else { + $value = null; + } + } - $sortArgs[] = &$valuesArray; + $valuesArray[] = $value; + } + + $sortArgs[] = &$valuesArray; + unset($valuesArray); + } if ($count + 1 < count($argList) && is_integer($argList[$count+1])) { $count++; @@ -1119,7 +1144,7 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface public function hasTerm(Zend_Search_Lucene_Index_Term $term) { foreach ($this->_segmentInfos as $segInfo) { - if ($segInfo->getTermInfo($term) instanceof Zend_Search_Lucene_Index_TermInfo) { + if ($segInfo->getTermInfo($term) !== null) { return true; } } @@ -1147,7 +1172,7 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface if (count($subResults) == 0) { return array(); - } else if (count($subResults) == 0) { + } else if (count($subResults) == 1) { // Index is optimized (only one segment) // Do not perform array reindexing return reset($subResults); @@ -1181,7 +1206,7 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface if (count($subResults) == 0) { return array(); - } else if (count($subResults) == 0) { + } else if (count($subResults) == 1) { // Index is optimized (only one segment) // Do not perform array reindexing return reset($subResults); @@ -1263,6 +1288,9 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface */ public function getSimilarity() { + /** Zend_Search_Lucene_Search_Similarity */ + require_once 'Zend/Search/Lucene/Search/Similarity.php'; + return Zend_Search_Lucene_Search_Similarity::getDefault(); } @@ -1415,6 +1443,9 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface { $result = array(); + /** Zend_Search_Lucene_Index_TermsPriorityQueue */ + require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php'; + $segmentInfoQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue(); foreach ($this->_segmentInfos as $segmentInfo) { @@ -1456,11 +1487,14 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface */ public function resetTermsStream() { - if ($this->_termsStream === null) { + if ($this->_termsStream === null) { + /** Zend_Search_Lucene_TermStreamsPriorityQueue */ + require_once 'Zend/Search/Lucene/TermStreamsPriorityQueue.php'; + $this->_termsStream = new Zend_Search_Lucene_TermStreamsPriorityQueue($this->_segmentInfos); - } else { - $this->_termsStream->resetTermsStream(); - } + } else { + $this->_termsStream->resetTermsStream(); + } } /** diff --git a/libs/Zend/Search/Lucene/Analysis/Analyzer.php b/libs/Zend/Search/Lucene/Analysis/Analyzer.php index 171f2b2..5e1c4eb 100644 --- a/libs/Zend/Search/Lucene/Analysis/Analyzer.php +++ b/libs/Zend/Search/Lucene/Analysis/Analyzer.php @@ -17,42 +17,37 @@ * @subpackage Analysis * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Analyzer.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Analyzer.php 18947 2009-11-12 11:57:17Z alexander $ */ -/** Zend_Search_Lucene_Analysis_Token */ -require_once 'Zend/Search/Lucene/Analysis/Token.php'; +/** User land classes and interfaces turned on by Zend/Search/Analyzer.php file inclusion. */ +/** @todo Section should be removed with ZF 2.0 release as obsolete */ +if (!defined('ZEND_SEARCH_LUCENE_COMMON_ANALYZER_PROCESSED')) { + /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php'; -/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php'; + /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php'; -/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php'; + /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php'; -/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php'; + /** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num/CaseInsensitive.php'; -/** Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num/CaseInsensitive.php'; + /** Zend_Search_Lucene_Analysis_Analyzer_Common_Text */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php'; -/** Zend_Search_Lucene_Analysis_Analyzer_Common_Text */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text.php'; + /** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php'; -/** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php'; + /** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum.php'; -/** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum.php'; - -/** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum/CaseInsensitive.php'; - -/** Zend_Search_Lucene_Analysis_TokenFilter_StopWords */ -require_once 'Zend/Search/Lucene/Analysis/TokenFilter/StopWords.php'; - -/** Zend_Search_Lucene_Analysis_TokenFilter_ShortWords */ -require_once 'Zend/Search/Lucene/Analysis/TokenFilter/ShortWords.php'; + /** Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/TextNum/CaseInsensitive.php'; +} /** @@ -167,6 +162,9 @@ abstract class Zend_Search_Lucene_Analysis_Analyzer */ public static function getDefault() { + /** Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer/Common/Text/CaseInsensitive.php'; + if (!self::$_defaultImpl instanceof Zend_Search_Lucene_Analysis_Analyzer) { self::$_defaultImpl = new Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive(); } diff --git a/libs/Zend/Search/Lucene/Analysis/Analyzer/Common.php b/libs/Zend/Search/Lucene/Analysis/Analyzer/Common.php index de63cdb..64ad1fc 100644 --- a/libs/Zend/Search/Lucene/Analysis/Analyzer/Common.php +++ b/libs/Zend/Search/Lucene/Analysis/Analyzer/Common.php @@ -17,13 +17,24 @@ * @subpackage Analysis * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Common.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Common.php 18947 2009-11-12 11:57:17Z alexander $ */ +/** Define constant used to provide correct file processing order */ +/** @todo Section should be removed with ZF 2.0 release as obsolete */ +define('ZEND_SEARCH_LUCENE_COMMON_ANALYZER_PROCESSED', true); + + /** Zend_Search_Lucene_Analysis_Analyzer */ require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; +/** Zend_Search_Lucene_Analysis_Token */ +require_once 'Zend/Search/Lucene/Analysis/Token.php'; + +/** Zend_Search_Lucene_Analysis_TokenFilter */ +require_once 'Zend/Search/Lucene/Analysis/TokenFilter.php'; + /** * Common implementation of the Zend_Search_Lucene_Analysis_Analyzer interface. diff --git a/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php b/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php index 0a8237f..68988cb 100644 --- a/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php +++ b/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8.php @@ -17,7 +17,7 @@ * @subpackage Analysis * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Utf8.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Utf8.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -48,7 +48,7 @@ class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 extends Zend_Search_Lucen * @var integer */ private $_bytePosition; - + /** * Object constructor * @@ -101,12 +101,12 @@ class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 extends Zend_Search_Lucen // matched string $matchedWord = $match[0][0]; - + // binary position of the matched word in the input stream $binStartPos = $match[0][1]; - + // character position of the matched word in the input stream - $startPos = $this->_position + + $startPos = $this->_position + iconv_strlen(substr($this->_input, $this->_bytePosition, $binStartPos - $this->_bytePosition), diff --git a/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php b/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php index dfc8651..351b9ed 100644 --- a/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php +++ b/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8/CaseInsensitive.php @@ -17,7 +17,7 @@ * @subpackage Analysis * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CaseInsensitive.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CaseInsensitive.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -37,7 +37,7 @@ require_once 'Zend/Search/Lucene/Analysis/TokenFilter/LowerCaseUtf8.php'; */ -class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive extends Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 +class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive extends Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8 { public function __construct() { diff --git a/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php b/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php index b39cc40..476d71a 100644 --- a/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php +++ b/libs/Zend/Search/Lucene/Analysis/Analyzer/Common/Utf8Num.php @@ -17,7 +17,7 @@ * @subpackage Analysis * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Utf8Num.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Utf8Num.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -101,12 +101,12 @@ class Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num extends Zend_Search_Lu // matched string $matchedWord = $match[0][0]; - + // binary position of the matched word in the input stream $binStartPos = $match[0][1]; - + // character position of the matched word in the input stream - $startPos = $this->_position + + $startPos = $this->_position + iconv_strlen(substr($this->_input, $this->_bytePosition, $binStartPos - $this->_bytePosition), diff --git a/libs/Zend/Search/Lucene/Analysis/TokenFilter.php b/libs/Zend/Search/Lucene/Analysis/TokenFilter.php index 895b400..cfaa3c9 100644 --- a/libs/Zend/Search/Lucene/Analysis/TokenFilter.php +++ b/libs/Zend/Search/Lucene/Analysis/TokenFilter.php @@ -17,7 +17,7 @@ * @subpackage Analysis * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TokenFilter.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: TokenFilter.php 18947 2009-11-12 11:57:17Z alexander $ */ @@ -34,7 +34,6 @@ require_once 'Zend/Search/Lucene/Analysis/Token.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ - abstract class Zend_Search_Lucene_Analysis_TokenFilter { /** diff --git a/libs/Zend/Search/Lucene/Analysis/TokenFilter/LowerCaseUtf8.php b/libs/Zend/Search/Lucene/Analysis/TokenFilter/LowerCaseUtf8.php index 7f9bbb2..499ad23 100644 --- a/libs/Zend/Search/Lucene/Analysis/TokenFilter/LowerCaseUtf8.php +++ b/libs/Zend/Search/Lucene/Analysis/TokenFilter/LowerCaseUtf8.php @@ -17,7 +17,7 @@ * @subpackage Analysis * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: LowerCaseUtf8.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: LowerCaseUtf8.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -48,7 +48,7 @@ class Zend_Search_Lucene_Analysis_TokenFilter_LowerCaseUtf8 extends Zend_Search_ throw new Zend_Search_Lucene_Exception('Utf8 compatible lower case filter needs mbstring extension to be enabled.'); } } - + /** * Normalize Token or remove it (if null is returned) * diff --git a/libs/Zend/Search/Lucene/Document/Docx.php b/libs/Zend/Search/Lucene/Document/Docx.php index 19de6df..ad903db 100644 --- a/libs/Zend/Search/Lucene/Document/Docx.php +++ b/libs/Zend/Search/Lucene/Document/Docx.php @@ -17,7 +17,7 @@ * @subpackage Document * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Docx.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Docx.php 19035 2009-11-19 14:34:11Z alexander $ */ /** Zend_Search_Lucene_Document_OpenXml */ @@ -47,6 +47,7 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX * * @param string $fileName * @param boolean $storeContent + * @throws Zend_Search_Lucene_Exception */ private function __construct($fileName, $storeContent) { // Document data holders @@ -58,7 +59,12 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX $package->open($fileName); // Read relations and search for officeDocument - $relations = simplexml_load_string($package->getFromName('_rels/.rels')); + $relationsXml = $package->getFromName('_rels/.rels'); + if ($relationsXml === false) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Invalid archive or corrupted .docx file.'); + } + $relations = simplexml_load_string($relationsXml); foreach($relations->Relationship as $rel) { if ($rel ["Type"] == Zend_Search_Lucene_Document_OpenXml::SCHEMA_OFFICEDOCUMENT) { // Found office document! Read in contents... @@ -75,8 +81,8 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX $runs = $paragraph->xpath('.//w:r/*[name() = "w:t" or name() = "w:br"]'); if ($runs === false) { - // Paragraph doesn't contain any text or breaks - continue; + // Paragraph doesn't contain any text or breaks + continue; } foreach ($runs as $run) { @@ -84,7 +90,7 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX // Break element $documentBody[] = ' '; } else { - $documentBody[] = (string)$run; + $documentBody[] = (string)$run; } } @@ -133,11 +139,11 @@ class Zend_Search_Lucene_Document_Docx extends Zend_Search_Lucene_Document_OpenX */ public static function loadDocxFile($fileName, $storeContent = false) { if (!is_readable($fileName)) { - require_once 'Zend/Search/Lucene/Document/Exception.php'; - throw new Zend_Search_Lucene_Document_Exception('Provided file \'' . $fileName . '\' is not readable.'); + require_once 'Zend/Search/Lucene/Document/Exception.php'; + throw new Zend_Search_Lucene_Document_Exception('Provided file \'' . $fileName . '\' is not readable.'); } - return new Zend_Search_Lucene_Document_Docx($fileName, $storeContent); + return new Zend_Search_Lucene_Document_Docx($fileName, $storeContent); } } diff --git a/libs/Zend/Search/Lucene/Document/Html.php b/libs/Zend/Search/Lucene/Document/Html.php index af0bc6e..e408775 100644 --- a/libs/Zend/Search/Lucene/Document/Html.php +++ b/libs/Zend/Search/Lucene/Document/Html.php @@ -17,7 +17,7 @@ * @subpackage Document * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Html.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Html.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -88,28 +88,28 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document @$this->_doc->loadHTML($htmlData); if ($this->_doc->encoding === null) { - // Document encoding is not recognized + // Document encoding is not recognized - /** @todo improve HTML vs HTML fragment recognition */ - if (preg_match('//i', $htmlData, $matches, PREG_OFFSET_CAPTURE)) { - // It's an HTML document - // Add additional HEAD section and recognize document - $htmlTagOffset = $matches[0][1] + strlen($matches[0][1]); + /** @todo improve HTML vs HTML fragment recognition */ + if (preg_match('//i', $htmlData, $matches, PREG_OFFSET_CAPTURE)) { + // It's an HTML document + // Add additional HEAD section and recognize document + $htmlTagOffset = $matches[0][1] + strlen($matches[0][0]); - @$this->_doc->loadHTML(iconv($defaultEncoding, 'UTF-8//IGNORE', substr($htmlData, 0, $htmlTagOffset)) + @$this->_doc->loadHTML(iconv($defaultEncoding, 'UTF-8//IGNORE', substr($htmlData, 0, $htmlTagOffset)) . '' . iconv($defaultEncoding, 'UTF-8//IGNORE', substr($htmlData, $htmlTagOffset))); // Remove additional HEAD section $xpath = new DOMXPath($this->_doc); $head = $xpath->query('/html/head')->item(0); - $head->parentNode->removeChild($head); - } else { - // It's an HTML fragment - @$this->_doc->loadHTML('' - . iconv($defaultEncoding, 'UTF-8//IGNORE', $htmlData) - . ''); - } + $head->parentNode->removeChild($head); + } else { + // It's an HTML fragment + @$this->_doc->loadHTML('' + . iconv($defaultEncoding, 'UTF-8//IGNORE', $htmlData) + . ''); + } } /** @todo Add correction of wrong HTML encoding recognition processing @@ -264,6 +264,9 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document */ protected function _highlightTextNode(DOMText $node, $wordsToHighlight, $callback, $params) { + /** Zend_Search_Lucene_Analysis_Analyzer */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + $analyzer = Zend_Search_Lucene_Analysis_Analyzer::getDefault(); $analyzer->setInput($node->nodeValue, 'UTF-8'); @@ -301,16 +304,16 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document . $highlightedWordNodeSetHtml . ''); if (!$success) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception("Error occured while loading highlighted text fragment: '$highlightedNodeHtml'."); + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception("Error occured while loading highlighted text fragment: '$highlightedNodeHtml'."); } $highlightedWordNodeSetXpath = new DOMXPath($highlightedWordNodeSetDomDocument); $highlightedWordNodeSet = $highlightedWordNodeSetXpath->query('/html/body')->item(0)->childNodes; for ($count = 0; $count < $highlightedWordNodeSet->length; $count++) { - $nodeToImport = $highlightedWordNodeSet->item($count); - $node->parentNode->insertBefore($this->_doc->importNode($nodeToImport, true /* deep copy */), - $matchedWordNode); + $nodeToImport = $highlightedWordNodeSet->item($count); + $node->parentNode->insertBefore($this->_doc->importNode($nodeToImport, true /* deep copy */), + $matchedWordNode); } $node->parentNode->removeChild($matchedWordNode); @@ -372,7 +375,7 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document */ public function highlight($words, $colour = '#66ffff') { - return $this->highlightExtended($words, array($this, 'applyColour'), array($colour)); + return $this->highlightExtended($words, array($this, 'applyColour'), array($colour)); } @@ -389,6 +392,9 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document */ public function highlightExtended($words, $callback, $params = array()) { + /** Zend_Search_Lucene_Analysis_Analyzer */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + if (!is_array($words)) { $words = array($words); } @@ -410,8 +416,8 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document } if (!is_callable($callback)) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('$viewHelper parameter mast be a View Helper name, View Helper object or callback.'); + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('$viewHelper parameter mast be a View Helper name, View Helper object or callback.'); } $xpath = new DOMXPath($this->_doc); @@ -445,7 +451,7 @@ class Zend_Search_Lucene_Document_Html extends Zend_Search_Lucene_Document $outputFragments = array(); for ($count = 0; $count < $bodyNodes->length; $count++) { - $outputFragments[] = $this->_doc->saveXML($bodyNodes->item($count)); + $outputFragments[] = $this->_doc->saveXML($bodyNodes->item($count)); } return implode($outputFragments); diff --git a/libs/Zend/Search/Lucene/Document/OpenXml.php b/libs/Zend/Search/Lucene/Document/OpenXml.php index 96492a2..a6647f8 100644 --- a/libs/Zend/Search/Lucene/Document/OpenXml.php +++ b/libs/Zend/Search/Lucene/Document/OpenXml.php @@ -17,13 +17,14 @@ * @subpackage Document * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: OpenXml.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: OpenXml.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Search_Lucene_Document */ require_once 'Zend/Search/Lucene/Document.php'; + if (class_exists('ZipArchive', false)) { /** @@ -82,7 +83,7 @@ abstract class Zend_Search_Lucene_Document_OpenXml extends Zend_Search_Lucene_Do { // Data holders $coreProperties = array(); - + // Read relations and search for core properties $relations = simplexml_load_string($package->getFromName("_rels/.rels")); foreach ($relations->Relationship as $rel) { @@ -103,10 +104,10 @@ abstract class Zend_Search_Lucene_Document_OpenXml extends Zend_Search_Lucene_Do } } } - + return $coreProperties; } - + /** * Determine absolute zip path * diff --git a/libs/Zend/Search/Lucene/Document/Pptx.php b/libs/Zend/Search/Lucene/Document/Pptx.php index 6625170..c306176 100644 --- a/libs/Zend/Search/Lucene/Document/Pptx.php +++ b/libs/Zend/Search/Lucene/Document/Pptx.php @@ -17,7 +17,7 @@ * @subpackage Document * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Pptx.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Pptx.php 19035 2009-11-19 14:34:11Z alexander $ */ @@ -70,6 +70,7 @@ class Zend_Search_Lucene_Document_Pptx extends Zend_Search_Lucene_Document_OpenX * * @param string $fileName * @param boolean $storeContent + * @throws Zend_Search_Lucene_Exception */ private function __construct($fileName, $storeContent) { @@ -84,7 +85,12 @@ class Zend_Search_Lucene_Document_Pptx extends Zend_Search_Lucene_Document_OpenX $package->open($fileName); // Read relations and search for officeDocument - $relations = simplexml_load_string($package->getFromName("_rels/.rels")); + $relationsXml = $package->getFromName('_rels/.rels'); + if ($relationsXml === false) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Invalid archive or corrupted .pptx file.'); + } + $relations = simplexml_load_string($relationsXml); foreach ($relations->Relationship as $rel) { if ($rel["Type"] == Zend_Search_Lucene_Document_OpenXml::SCHEMA_OFFICEDOCUMENT) { // Found office document! Search for slides... diff --git a/libs/Zend/Search/Lucene/Document/Xlsx.php b/libs/Zend/Search/Lucene/Document/Xlsx.php index bcdda57..715132d 100644 --- a/libs/Zend/Search/Lucene/Document/Xlsx.php +++ b/libs/Zend/Search/Lucene/Document/Xlsx.php @@ -17,7 +17,7 @@ * @subpackage Document * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Xlsx.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Xlsx.php 19035 2009-11-19 14:34:11Z alexander $ */ @@ -77,6 +77,7 @@ class Zend_Search_Lucene_Document_Xlsx extends Zend_Search_Lucene_Document_OpenX * * @param string $fileName * @param boolean $storeContent + * @throws Zend_Search_Lucene_Exception */ private function __construct($fileName, $storeContent) { @@ -91,7 +92,12 @@ class Zend_Search_Lucene_Document_Xlsx extends Zend_Search_Lucene_Document_OpenX $package->open($fileName); // Read relations and search for officeDocument - $relations = simplexml_load_string($package->getFromName("_rels/.rels")); + $relationsXml = $package->getFromName('_rels/.rels'); + if ($relationsXml === false) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Invalid archive or corrupted .xlsx file.'); + } + $relations = simplexml_load_string($relationsXml); foreach ($relations->Relationship as $rel) { if ($rel["Type"] == Zend_Search_Lucene_Document_OpenXml::SCHEMA_OFFICEDOCUMENT) { // Found office document! Read relations for workbook... diff --git a/libs/Zend/Search/Lucene/Field.php b/libs/Zend/Search/Lucene/Field.php index c8465d3..9e3cb22 100644 --- a/libs/Zend/Search/Lucene/Field.php +++ b/libs/Zend/Search/Lucene/Field.php @@ -17,7 +17,7 @@ * @subpackage Document * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Field.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Field.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -46,41 +46,41 @@ class Zend_Search_Lucene_Field /** * Field value - * + * * @var boolean */ public $value; - + /** * Field is to be stored in the index for return with search hits. - * + * * @var boolean */ public $isStored = false; - + /** * Field is to be indexed, so that it may be searched on. - * + * * @var boolean */ public $isIndexed = true; /** * Field should be tokenized as text prior to indexing. - * + * * @var boolean */ public $isTokenized = true; /** * Field is stored as binary. - * + * * @var boolean */ public $isBinary = false; /** * Field are stored as a term vector - * + * * @var boolean */ public $storeTermVector = false; @@ -218,7 +218,7 @@ class Zend_Search_Lucene_Field strcasecmp($this->encoding, 'utf-8') == 0 ) { return $this->value; } else { - + return (PHP_OS != 'AIX') ? iconv($this->encoding, 'UTF-8', $this->value) : iconv('ISO8859-1', 'UTF-8', $this->value); } } diff --git a/libs/Zend/Search/Lucene/Index/SegmentInfo.php b/libs/Zend/Search/Lucene/Index/SegmentInfo.php index c4c05b2..096bb07 100644 --- a/libs/Zend/Search/Lucene/Index/SegmentInfo.php +++ b/libs/Zend/Search/Lucene/Index/SegmentInfo.php @@ -17,18 +17,25 @@ * @subpackage Index * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SegmentInfo.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: SegmentInfo.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** Zend_Search_Lucene_Index_DictionaryLoader */ -require_once 'Zend/Search/Lucene/Index/DictionaryLoader.php'; - -/** Zend_Search_Lucene_Index_DocsFilter */ -require_once 'Zend/Search/Lucene/Index/DocsFilter.php'; - /** Zend_Search_Lucene_Index_TermsStream_Interface */ require_once 'Zend/Search/Lucene/Index/TermsStream/Interface.php'; + +/** Zend_Search_Lucene_Search_Similarity */ +require_once 'Zend/Search/Lucene/Search/Similarity.php'; + +/** Zend_Search_Lucene_Index_FieldInfo */ +require_once 'Zend/Search/Lucene/Index/FieldInfo.php'; + +/** Zend_Search_Lucene_Index_Term */ +require_once 'Zend/Search/Lucene/Index/Term.php'; + +/** Zend_Search_Lucene_Index_TermInfo */ +require_once 'Zend/Search/Lucene/Index/TermInfo.php'; + /** * @category Zend * @package Zend_Search_Lucene @@ -297,6 +304,7 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T $fieldNames = array(); $fieldNums = array(); $this->_fields = array(); + for ($count=0; $count < $fieldsCount; $count++) { $fieldName = $fnmFile->readString(); $fieldBits = $fnmFile->readByte(); @@ -318,8 +326,8 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T $this->_fieldsDicPositions = array_flip($fieldNums); if ($this->_delGen == -2) { - // SegmentInfo constructor is invoked from index writer - // Autodetect current delete file generation number + // SegmentInfo constructor is invoked from index writer + // Autodetect current delete file generation number $this->_delGen = $this->_detectLatestDelGen(); } @@ -436,18 +444,18 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T if (extension_loaded('bitset')) { - for ($bit = 0; $bit < 8; $bit++) { - if ($nonZeroByte & (1<<$bit)) { + for ($bit = 0; $bit < 8; $bit++) { + if ($nonZeroByte & (1<<$bit)) { bitset_incl($deletions, $byteNum*8 + $bit); - } - } + } + } return $deletions; } else { - for ($bit = 0; $bit < 8; $bit++) { - if ($nonZeroByte & (1<<$bit)) { + for ($bit = 0; $bit < 8; $bit++) { + if ($nonZeroByte & (1<<$bit)) { $deletions[$byteNum*8 + $bit] = 1; - } - } + } + } return (count($deletions) > 0) ? $deletions : null; } @@ -785,6 +793,9 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T $tiiFile = $this->openCompoundFile('.tii'); $tiiFileData = $tiiFile->readBytes($this->compoundFileLength('.tii')); + /** Zend_Search_Lucene_Index_DictionaryLoader */ + require_once 'Zend/Search/Lucene/Index/DictionaryLoader.php'; + // Load dictionary index data list($this->_termDictionary, $this->_termDictionaryInfos) = Zend_Search_Lucene_Index_DictionaryLoader::load($tiiFileData); @@ -1549,35 +1560,35 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T $latestDelGen = $this->_detectLatestDelGen(); if (!$this->_deletedDirty) { - // There was no deletions by current process + // There was no deletions by current process if ($latestDelGen == $this->_delGen) { - // Delete file hasn't been updated by any concurrent process - return; + // Delete file hasn't been updated by any concurrent process + return; } else if ($latestDelGen > $this->_delGen) { - // Delete file has been updated by some concurrent process - // Reload deletions file - $this->_delGen = $latestDelGen; - $this->_deleted = $this->_loadDelFile(); + // Delete file has been updated by some concurrent process + // Reload deletions file + $this->_delGen = $latestDelGen; + $this->_deleted = $this->_loadDelFile(); - return; + return; } else { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Delete file processing workflow is corrupted for the segment \'' . $this->_name . '\'.'); + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Delete file processing workflow is corrupted for the segment \'' . $this->_name . '\'.'); } } if ($latestDelGen > $this->_delGen) { - // Merge current deletions with latest deletions file - $this->_delGen = $latestDelGen; + // Merge current deletions with latest deletions file + $this->_delGen = $latestDelGen; - $latestDelete = $this->_loadDelFile(); + $latestDelete = $this->_loadDelFile(); - if (extension_loaded('bitset')) { - $this->_deleted = bitset_union($this->_deleted, $latestDelete); - } else { - $this->_deleted += $latestDelete; - } + if (extension_loaded('bitset')) { + $this->_deleted = bitset_union($this->_deleted, $latestDelete); + } else { + $this->_deleted += $latestDelete; + } } if (extension_loaded('bitset')) { @@ -1756,19 +1767,19 @@ class Zend_Search_Lucene_Index_SegmentInfo implements Zend_Search_Lucene_Index_T */ public function resetTermsStream(/** $startId = 0, $mode = self::SM_TERMS_ONLY */) { - /** - * SegmentInfo->resetTermsStream() method actually takes two optional parameters: - * $startId (default value is 0) - * $mode (default value is self::SM_TERMS_ONLY) - */ - $argList = func_get_args(); - if (count($argList) > 2) { + /** + * SegmentInfo->resetTermsStream() method actually takes two optional parameters: + * $startId (default value is 0) + * $mode (default value is self::SM_TERMS_ONLY) + */ + $argList = func_get_args(); + if (count($argList) > 2) { require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('Wrong number of arguments'); - } else if (count($argList) == 2) { - $startId = $argList[0]; - $mode = $argList[1]; - } else if (count($argList) == 1) { + } else if (count($argList) == 2) { + $startId = $argList[0]; + $mode = $argList[1]; + } else if (count($argList) == 1) { $startId = $argList[0]; $mode = self::SM_TERMS_ONLY; } else { diff --git a/libs/Zend/Search/Lucene/Index/SegmentMerger.php b/libs/Zend/Search/Lucene/Index/SegmentMerger.php index 5afdced..15ae432 100644 --- a/libs/Zend/Search/Lucene/Index/SegmentMerger.php +++ b/libs/Zend/Search/Lucene/Index/SegmentMerger.php @@ -17,17 +17,12 @@ * @subpackage Index * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SegmentMerger.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: SegmentMerger.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Index_SegmentInfo */ require_once 'Zend/Search/Lucene/Index/SegmentInfo.php'; -/** Zend_Search_Lucene_Index_SegmentWriter_StreamWriter */ -require_once 'Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php'; - -/** Zend_Search_Lucene_Index_TermsPriorityQueue */ -require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php'; /** * @category Zend @@ -87,6 +82,8 @@ class Zend_Search_Lucene_Index_SegmentMerger */ public function __construct($directory, $name) { + /** Zend_Search_Lucene_Index_SegmentWriter_StreamWriter */ + require_once 'Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php'; $this->_writer = new Zend_Search_Lucene_Index_SegmentWriter_StreamWriter($directory, $name); } @@ -226,6 +223,9 @@ class Zend_Search_Lucene_Index_SegmentMerger */ private function _mergeTerms() { + /** Zend_Search_Lucene_Index_TermsPriorityQueue */ + require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php'; + $segmentInfoQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue(); $segmentStartId = 0; diff --git a/libs/Zend/Search/Lucene/Index/SegmentWriter.php b/libs/Zend/Search/Lucene/Index/SegmentWriter.php index 63cd4ea..d2a7796 100644 --- a/libs/Zend/Search/Lucene/Index/SegmentWriter.php +++ b/libs/Zend/Search/Lucene/Index/SegmentWriter.php @@ -17,11 +17,18 @@ * @subpackage Index * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SegmentWriter.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: SegmentWriter.php 18947 2009-11-12 11:57:17Z alexander $ */ -/** Zend_Search_Lucene_Index_SegmentInfo */ -require_once 'Zend/Search/Lucene/Index/SegmentInfo.php'; + +/** Zend_Search_Lucene_Index_FieldInfo */ +require_once 'Zend/Search/Lucene/Index/FieldInfo.php'; + +/** Zend_Search_Lucene_Index_Term */ +require_once 'Zend/Search/Lucene/Index/Term.php'; + +/** Zend_Search_Lucene_Index_TermInfo */ +require_once 'Zend/Search/Lucene/Index/TermInfo.php'; /** * @category Zend diff --git a/libs/Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php b/libs/Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php index 1e9f885..cdb9a8f 100644 --- a/libs/Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php +++ b/libs/Zend/Search/Lucene/Index/SegmentWriter/DocumentWriter.php @@ -17,12 +17,9 @@ * @subpackage Index * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DocumentWriter.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: DocumentWriter.php 18947 2009-11-12 11:57:17Z alexander $ */ -/** Zend_Search_Lucene_Analysis_Analyzer */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; - /** Zend_Search_Lucene_Index_SegmentWriter */ require_once 'Zend/Search/Lucene/Index/SegmentWriter.php'; @@ -74,6 +71,9 @@ class Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter extends Zend_Search_ */ public function addDocument(Zend_Search_Lucene_Document $document) { + /** Zend_Search_Lucene_Search_Similarity */ + require_once 'Zend/Search/Lucene/Search/Similarity.php'; + $storedFields = array(); $docNorms = array(); $similarity = Zend_Search_Lucene_Search_Similarity::getDefault(); @@ -92,6 +92,9 @@ class Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter extends Zend_Search_ if ($field->isIndexed) { if ($field->isTokenized) { + /** Zend_Search_Lucene_Analysis_Analyzer */ + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + $analyzer = Zend_Search_Lucene_Analysis_Analyzer::getDefault(); $analyzer->setInput($field->value, $field->encoding); @@ -201,6 +204,9 @@ class Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter extends Zend_Search_ $this->_generateCFS(); + /** Zend_Search_Lucene_Index_SegmentInfo */ + require_once 'Zend/Search/Lucene/Index/SegmentInfo.php'; + return new Zend_Search_Lucene_Index_SegmentInfo($this->_directory, $this->_name, $this->_docCount, diff --git a/libs/Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php b/libs/Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php index b6b2ca8..06369e5 100644 --- a/libs/Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php +++ b/libs/Zend/Search/Lucene/Index/SegmentWriter/StreamWriter.php @@ -17,12 +17,9 @@ * @subpackage Index * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: StreamWriter.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: StreamWriter.php 18947 2009-11-12 11:57:17Z alexander $ */ -/** Zend_Search_Lucene_Index_SegmentInfo */ -require_once 'Zend/Search/Lucene/Index/SegmentInfo.php'; - /** Zend_Search_Lucene_Index_SegmentWriter */ require_once 'Zend/Search/Lucene/Index/SegmentWriter.php'; @@ -82,6 +79,9 @@ class Zend_Search_Lucene_Index_SegmentWriter_StreamWriter extends Zend_Search_Lu $this->_dumpFNM(); $this->_generateCFS(); + /** Zend_Search_Lucene_Index_SegmentInfo */ + require_once 'Zend/Search/Lucene/Index/SegmentInfo.php'; + return new Zend_Search_Lucene_Index_SegmentInfo($this->_directory, $this->_name, $this->_docCount, diff --git a/libs/Zend/Search/Lucene/Index/TermsPriorityQueue.php b/libs/Zend/Search/Lucene/Index/TermsPriorityQueue.php index cbe1021..45260ca 100644 --- a/libs/Zend/Search/Lucene/Index/TermsPriorityQueue.php +++ b/libs/Zend/Search/Lucene/Index/TermsPriorityQueue.php @@ -17,10 +17,10 @@ * @subpackage Index * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TermsPriorityQueue.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: TermsPriorityQueue.php 18947 2009-11-12 11:57:17Z alexander $ */ -/** Zend_Search_Lucene */ +/** Zend_Search_Lucene_PriorityQueue */ require_once 'Zend/Search/Lucene/PriorityQueue.php'; /** diff --git a/libs/Zend/Search/Lucene/Index/TermsStream/Interface.php b/libs/Zend/Search/Lucene/Index/TermsStream/Interface.php index 900b34e..e276ba3 100644 --- a/libs/Zend/Search/Lucene/Index/TermsStream/Interface.php +++ b/libs/Zend/Search/Lucene/Index/TermsStream/Interface.php @@ -1,66 +1,66 @@ -_currentSegment === null) { $this->_currentSegment = new Zend_Search_Lucene_Index_SegmentWriter_DocumentWriter($this->_directory, $this->_newSegmentName()); @@ -379,6 +372,9 @@ class Zend_Search_Lucene_Index_Writer private function _mergeSegments($segments) { $newName = $this->_newSegmentName(); + + /** Zend_Search_Lucene_Index_SegmentMerger */ + require_once 'Zend/Search/Lucene/Index/SegmentMerger.php'; $merger = new Zend_Search_Lucene_Index_SegmentMerger($this->_directory, $newName); foreach ($segments as $segmentInfo) { @@ -521,6 +517,8 @@ class Zend_Search_Lucene_Index_Writer $isCompound = true; } + /** Zend_Search_Lucene_Index_SegmentInfo */ + require_once 'Zend/Search/Lucene/Index/SegmentInfo.php'; $this->_segmentInfos[$segName] = new Zend_Search_Lucene_Index_SegmentInfo($this->_directory, $segName, diff --git a/libs/Zend/Search/Lucene/Interface.php b/libs/Zend/Search/Lucene/Interface.php index 0052b14..acb1db8 100644 --- a/libs/Zend/Search/Lucene/Interface.php +++ b/libs/Zend/Search/Lucene/Interface.php @@ -16,13 +16,26 @@ * @package Zend_Search_Lucene * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18947 2009-11-12 11:57:17Z alexander $ */ + /** Zend_Search_Lucene_Index_TermsStream_Interface */ require_once 'Zend/Search/Lucene/Index/TermsStream/Interface.php'; +/** Classes used within Zend_Search_Lucene_Interface API */ + +/** Zend_Search_Lucene_Document */ +require_once 'Zend/Search/Lucene/Document.php'; + +/** Zend_Search_Lucene_Index_Term */ +require_once 'Zend/Search/Lucene/Index/Term.php'; + +/** Zend_Search_Lucene_Index_DocsFilter */ +require_once 'Zend/Search/Lucene/Index/DocsFilter.php'; + + /** * @category Zend * @package Zend_Search_Lucene diff --git a/libs/Zend/Search/Lucene/MultiSearcher.php b/libs/Zend/Search/Lucene/MultiSearcher.php index b8c3997..3ccd855 100644 --- a/libs/Zend/Search/Lucene/MultiSearcher.php +++ b/libs/Zend/Search/Lucene/MultiSearcher.php @@ -1,963 +1,968 @@ -_indices = $indices; - - foreach ($this->_indices as $index) { - if (!$index instanceof Zend_Search_Lucene_Interface) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('sub-index objects have to implement Zend_Search_Lucene_Interface.'); - } - } - } - - /** - * Add index for searching. - * - * @param Zend_Search_Lucene_Interface $index - */ - public function addIndex(Zend_Search_Lucene_Interface $index) - { - $this->_indices[] = $index; - } - - - /** - * Get current generation number - * - * Returns generation number - * 0 means pre-2.1 index format - * -1 means there are no segments files. - * - * @param Zend_Search_Lucene_Storage_Directory $directory - * @return integer - * @throws Zend_Search_Lucene_Exception - */ - public static function getActualGeneration(Zend_Search_Lucene_Storage_Directory $directory) - { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception("Generation number can't be retrieved for multi-searcher"); - } - - /** - * Get segments file name - * - * @param integer $generation - * @return string - */ - public static function getSegmentFileName($generation) - { - return Zend_Search_Lucene::getSegmentFileName($generation); - } - - /** - * Get index format version - * - * @return integer - * @throws Zend_Search_Lucene_Exception - */ - public function getFormatVersion() - { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception("Format version can't be retrieved for multi-searcher"); - } - - /** - * Set index format version. - * Index is converted to this format at the nearest upfdate time - * - * @param int $formatVersion - */ - public function setFormatVersion($formatVersion) - { - foreach ($this->_indices as $index) { - $index->setFormatVersion($formatVersion); - } - } - - /** - * Returns the Zend_Search_Lucene_Storage_Directory instance for this index. - * - * @return Zend_Search_Lucene_Storage_Directory - */ - public function getDirectory() - { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception("Index directory can't be retrieved for multi-searcher"); - } - - /** - * Returns the total number of documents in this index (including deleted documents). - * - * @return integer - */ - public function count() - { - $count = 0; - - foreach ($this->_indices as $index) { - $count += $this->_indices->count(); - } - - return $count; - } - - /** - * Returns one greater than the largest possible document number. - * This may be used to, e.g., determine how big to allocate a structure which will have - * an element for every document number in an index. - * - * @return integer - */ - public function maxDoc() - { - return $this->count(); - } - - /** - * Returns the total number of non-deleted documents in this index. - * - * @return integer - */ - public function numDocs() - { - $docs = 0; - - foreach ($this->_indices as $index) { - $docs += $this->_indices->numDocs(); - } - - return $docs; - } - - /** - * Checks, that document is deleted - * - * @param integer $id - * @return boolean - * @throws Zend_Search_Lucene_Exception Exception is thrown if $id is out of the range - */ - public function isDeleted($id) - { - foreach ($this->_indices as $index) { - $indexCount = $index->count(); - - if ($indexCount > $id) { - return $index->isDeleted($id); - } - - $id -= $indexCount; - } - - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Document id is out of the range.'); - } - - /** - * Set default search field. - * - * Null means, that search is performed through all fields by default - * - * Default value is null - * - * @param string $fieldName - */ - public static function setDefaultSearchField($fieldName) - { - foreach ($this->_indices as $index) { - $index->setDefaultSearchField($fieldName); - } - } - - - /** - * Get default search field. - * - * Null means, that search is performed through all fields by default - * - * @return string - * @throws Zend_Search_Lucene_Exception - */ - public static function getDefaultSearchField() - { - if (count($this->_indices) == 0) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices list is empty'); - } - - $defaultSearchField = reset($this->_indices)->getDefaultSearchField(); - - foreach ($this->_indices as $index) { - if ($index->getDefaultSearchField() !== $defaultSearchField) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); - } - } - - return $defaultSearchField; - } - - /** - * Set result set limit. - * - * 0 (default) means no limit - * - * @param integer $limit - */ - public static function setResultSetLimit($limit) - { - foreach ($this->_indices as $index) { - $index->setResultSetLimit($limit); - } - } - - /** - * Set result set limit. - * - * 0 means no limit - * - * @return integer - * @throws Zend_Search_Lucene_Exception - */ - public static function getResultSetLimit() - { - if (count($this->_indices) == 0) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices list is empty'); - } - - $defaultResultSetLimit = reset($this->_indices)->getResultSetLimit(); - - foreach ($this->_indices as $index) { - if ($index->getResultSetLimit() !== $defaultResultSetLimit) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); - } - } - - return $defaultResultSetLimit; - } - - /** - * Retrieve index maxBufferedDocs option - * - * maxBufferedDocs is a minimal number of documents required before - * the buffered in-memory documents are written into a new Segment - * - * Default value is 10 - * - * @return integer - * @throws Zend_Search_Lucene_Exception - */ - public function getMaxBufferedDocs() - { - if (count($this->_indices) == 0) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices list is empty'); - } - - $maxBufferedDocs = reset($this->_indices)->getMaxBufferedDocs(); - - foreach ($this->_indices as $index) { - if ($index->getMaxBufferedDocs() !== $maxBufferedDocs) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); - } - } - - return $maxBufferedDocs; - } - - /** - * Set index maxBufferedDocs option - * - * maxBufferedDocs is a minimal number of documents required before - * the buffered in-memory documents are written into a new Segment - * - * Default value is 10 - * - * @param integer $maxBufferedDocs - */ - public function setMaxBufferedDocs($maxBufferedDocs) - { - foreach ($this->_indices as $index) { - $index->setMaxBufferedDocs($maxBufferedDocs); - } - } - - /** - * Retrieve index maxMergeDocs option - * - * maxMergeDocs is a largest number of documents ever merged by addDocument(). - * Small values (e.g., less than 10,000) are best for interactive indexing, - * as this limits the length of pauses while indexing to a few seconds. - * Larger values are best for batched indexing and speedier searches. - * - * Default value is PHP_INT_MAX - * - * @return integer - * @throws Zend_Search_Lucene_Exception - */ - public function getMaxMergeDocs() - { - if (count($this->_indices) == 0) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices list is empty'); - } - - $maxMergeDocs = reset($this->_indices)->getMaxMergeDocs(); - - foreach ($this->_indices as $index) { - if ($index->getMaxMergeDocs() !== $maxMergeDocs) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); - } - } - - return $maxMergeDocs; - } - - /** - * Set index maxMergeDocs option - * - * maxMergeDocs is a largest number of documents ever merged by addDocument(). - * Small values (e.g., less than 10,000) are best for interactive indexing, - * as this limits the length of pauses while indexing to a few seconds. - * Larger values are best for batched indexing and speedier searches. - * - * Default value is PHP_INT_MAX - * - * @param integer $maxMergeDocs - */ - public function setMaxMergeDocs($maxMergeDocs) - { - foreach ($this->_indices as $index) { - $index->setMaxMergeDocs($maxMergeDocs); - } - } - - /** - * Retrieve index mergeFactor option - * - * mergeFactor determines how often segment indices are merged by addDocument(). - * With smaller values, less RAM is used while indexing, - * and searches on unoptimized indices are faster, - * but indexing speed is slower. - * With larger values, more RAM is used during indexing, - * and while searches on unoptimized indices are slower, - * indexing is faster. - * Thus larger values (> 10) are best for batch index creation, - * and smaller values (< 10) for indices that are interactively maintained. - * - * Default value is 10 - * - * @return integer - * @throws Zend_Search_Lucene_Exception - */ - public function getMergeFactor() - { - if (count($this->_indices) == 0) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices list is empty'); - } - - $mergeFactor = reset($this->_indices)->getMergeFactor(); - - foreach ($this->_indices as $index) { - if ($index->getMergeFactor() !== $mergeFactor) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); - } - } - - return $mergeFactor; - } - - /** - * Set index mergeFactor option - * - * mergeFactor determines how often segment indices are merged by addDocument(). - * With smaller values, less RAM is used while indexing, - * and searches on unoptimized indices are faster, - * but indexing speed is slower. - * With larger values, more RAM is used during indexing, - * and while searches on unoptimized indices are slower, - * indexing is faster. - * Thus larger values (> 10) are best for batch index creation, - * and smaller values (< 10) for indices that are interactively maintained. - * - * Default value is 10 - * - * @param integer $maxMergeDocs - */ - public function setMergeFactor($mergeFactor) - { - foreach ($this->_indices as $index) { - $index->setMaxMergeDocs($maxMergeDocs); - } - } - - /** - * Performs a query against the index and returns an array - * of Zend_Search_Lucene_Search_QueryHit objects. - * Input is a string or Zend_Search_Lucene_Search_Query. - * - * @param mixed $query - * @return array Zend_Search_Lucene_Search_QueryHit - * @throws Zend_Search_Lucene_Exception - */ - public function find($query) - { - $hitsList = array(); - - $indexShift = 0; - foreach ($this->_indices as $index) { - $hits = $index->find($query); - - if ($indexShift != 0) { - foreach ($hits as $hit) { - $hit->id += $indexShift; - } - } - - $indexShift += $index->count(); - $hitsList[] = $hits; - } - - /** @todo Implement advanced sorting */ - - return call_user_func_array('array_merge', $hitsList); - } - - /** - * Returns a list of all unique field names that exist in this index. - * - * @param boolean $indexed - * @return array - */ - public function getFieldNames($indexed = false) - { - $fieldNamesList = array(); - - foreach ($this->_indices as $index) { - $fieldNamesList[] = $index->getFieldNames($indexed); - } - - return array_unique(call_user_func_array('array_merge', $fieldNamesList)); - } - - /** - * Returns a Zend_Search_Lucene_Document object for the document - * number $id in this index. - * - * @param integer|Zend_Search_Lucene_Search_QueryHit $id - * @return Zend_Search_Lucene_Document - * @throws Zend_Search_Lucene_Exception Exception is thrown if $id is out of the range - */ - public function getDocument($id) - { - if ($id instanceof Zend_Search_Lucene_Search_QueryHit) { - /* @var $id Zend_Search_Lucene_Search_QueryHit */ - $id = $id->id; - } - - foreach ($this->_indices as $index) { - $indexCount = $index->count(); - - if ($indexCount > $id) { - return $index->getDocument($id); - } - - $id -= $indexCount; - } - - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Document id is out of the range.'); - } - - /** - * Returns true if index contain documents with specified term. - * - * Is used for query optimization. - * - * @param Zend_Search_Lucene_Index_Term $term - * @return boolean - */ - public function hasTerm(Zend_Search_Lucene_Index_Term $term) - { - foreach ($this->_indices as $index) { - if ($index->hasTerm($term)) { - return true; - } - } - - return false; - } - - /** - * Returns IDs of all the documents containing term. - * - * @param Zend_Search_Lucene_Index_Term $term - * @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter - * @return array - * @throws Zend_Search_Lucene_Exception - */ - public function termDocs(Zend_Search_Lucene_Index_Term $term, $docsFilter = null) - { - if ($docsFilter != null) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Document filters could not used with multi-searcher'); - } - - $docsList = array(); - - $indexShift = 0; - foreach ($this->_indices as $index) { - $docs = $index->termDocs($term); - - if ($indexShift != 0) { - foreach ($docs as $id => $docId) { - $docs[$id] += $indexShift; - } - } - - $indexShift += $index->count(); - $docsList[] = $docs; - } - - return call_user_func_array('array_merge', $docsList); - } - - /** - * Returns documents filter for all documents containing term. - * - * It performs the same operation as termDocs, but return result as - * Zend_Search_Lucene_Index_DocsFilter object - * - * @param Zend_Search_Lucene_Index_Term $term - * @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter - * @return Zend_Search_Lucene_Index_DocsFilter - * @throws Zend_Search_Lucene_Exception - */ - public function termDocsFilter(Zend_Search_Lucene_Index_Term $term, $docsFilter = null) - { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Document filters could not used with multi-searcher'); - } - - /** - * Returns an array of all term freqs. - * Return array structure: array( docId => freq, ...) - * - * @param Zend_Search_Lucene_Index_Term $term - * @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter - * @return integer - * @throws Zend_Search_Lucene_Exception - */ - public function termFreqs(Zend_Search_Lucene_Index_Term $term, $docsFilter = null) - { - if ($docsFilter != null) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Document filters could not used with multi-searcher'); - } - - $freqsList = array(); - - $indexShift = 0; - foreach ($this->_indices as $index) { - $freqs = $index->termFreqs($term); - - if ($indexShift != 0) { - $freqsShifted = array(); - - foreach ($freqs as $docId => $freq) { - $freqsShifted[$docId + $indexShift] = $freq; - } - $freqs = $freqsShifted; - } - - $indexShift += $index->count(); - $freqsList[] = $freqs; - } - - return call_user_func_array('array_merge', $freqsList); - } - - /** - * Returns an array of all term positions in the documents. - * Return array structure: array( docId => array( pos1, pos2, ...), ...) - * - * @param Zend_Search_Lucene_Index_Term $term - * @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter - * @return array - * @throws Zend_Search_Lucene_Exception - */ - public function termPositions(Zend_Search_Lucene_Index_Term $term, $docsFilter = null) - { - if ($docsFilter != null) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Document filters could not used with multi-searcher'); - } - - $termPositionsList = array(); - - $indexShift = 0; - foreach ($this->_indices as $index) { - $termPositions = $index->termPositions($term); - - if ($indexShift != 0) { - $termPositionsShifted = array(); - - foreach ($termPositions as $docId => $positions) { - $termPositions[$docId + $indexShift] = $positions; - } - $termPositions = $termPositionsShifted; - } - - $indexShift += $index->count(); - $termPositionsList[] = $termPositions; - } - - return call_user_func_array('array_merge', $termPositions); - } - - /** - * Returns the number of documents in this index containing the $term. - * - * @param Zend_Search_Lucene_Index_Term $term - * @return integer - */ - public function docFreq(Zend_Search_Lucene_Index_Term $term) - { - $docFreq = 0; - - foreach ($this->_indices as $index) { - $docFreq += $index->docFreq($term); - } - - return $docFreq; - } - - /** - * Retrive similarity used by index reader - * - * @return Zend_Search_Lucene_Search_Similarity - * @throws Zend_Search_Lucene_Exception - */ - public function getSimilarity() - { - if (count($this->_indices) == 0) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices list is empty'); - } - - $similarity = reset($this->_indices)->getSimilarity(); - - foreach ($this->_indices as $index) { - if ($index->getSimilarity() !== $similarity) { - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Indices have different similarity.'); - } - } - - return $similarity; - } - - /** - * Returns a normalization factor for "field, document" pair. - * - * @param integer $id - * @param string $fieldName - * @return float - */ - public function norm($id, $fieldName) - { - foreach ($this->_indices as $index) { - $indexCount = $index->count(); - - if ($indexCount > $id) { - return $index->norm($id, $fieldName); - } - - $id -= $indexCount; - } - - return null; - } - - /** - * Returns true if any documents have been deleted from this index. - * - * @return boolean - */ - public function hasDeletions() - { - foreach ($this->_indices as $index) { - if ($index->hasDeletions()) { - return true; - } - } - - return false; - } - - /** - * Deletes a document from the index. - * $id is an internal document id - * - * @param integer|Zend_Search_Lucene_Search_QueryHit $id - * @throws Zend_Search_Lucene_Exception - */ - public function delete($id) - { - foreach ($this->_indices as $index) { - $indexCount = $index->count(); - - if ($indexCount > $id) { - $index->delete($id); - return; - } - - $id -= $indexCount; - } - - require_once 'Zend/Search/Lucene/Exception.php'; - throw new Zend_Search_Lucene_Exception('Document id is out of the range.'); - } - - - /** - * Callback used to choose target index for new documents - * - * Function/method signature: - * Zend_Search_Lucene_Interface callbackFunction(Zend_Search_Lucene_Document $document, array $indices); - * - * null means "default documents distributing algorithm" - * - * @var callback - */ - protected $_documentDistributorCallBack = null; - - /** - * Set callback for choosing target index. - * - * @param callback $callback - */ - public function setDocumentDistributorCallback($callback) - { - if ($callback !== null && !is_callable($callback)) - $this->_documentDistributorCallBack = $callback; - } - - /** - * Get callback for choosing target index. - * - * @return callback - */ - public function getDocumentDistributorCallback() - { - return $this->_documentDistributorCallBack; - } - - /** - * Adds a document to this index. - * - * @param Zend_Search_Lucene_Document $document - * @throws Zend_Search_Lucene_Exception - */ - public function addDocument(Zend_Search_Lucene_Document $document) - { - if ($this->_documentDistributorCallBack !== null) { - $index = call_user_func($this->_documentDistributorCallBack, $document, $this->_indices); - } else { - $index = $this->_indices[ array_rand($this->_indices) ]; - } - - $index->addDocument($document); - } - - /** - * Commit changes resulting from delete() or undeleteAll() operations. - */ - public function commit() - { - foreach ($this->_indices as $index) { - $index->commit(); - } - } - - /** - * Optimize index. - * - * Merges all segments into one - */ - public function optimize() - { - foreach ($this->_indices as $index) { - $index->_optimise(); - } - } - - /** - * Returns an array of all terms in this index. - * - * @return array - */ - public function terms() - { - $termsList = array(); - - foreach ($this->_indices as $index) { - $termsList[] = $index->terms(); - } - - return array_unique(call_user_func_array('array_merge', $termsList)); - } - - - /** - * Terms stream priority queue object - * - * @var Zend_Search_Lucene_TermStreamsPriorityQueue - */ - private $_termsStream = null; - - /** - * Reset terms stream. - */ - public function resetTermsStream() - { - if ($this->_termsStream === null) { - $this->_termsStream = new Zend_Search_Lucene_TermStreamsPriorityQueue($this->_indices); - } else { - $this->_termsStream->resetTermsStream(); - } - } - - /** - * Skip terms stream up to specified term preffix. - * - * Prefix contains fully specified field info and portion of searched term - * - * @param Zend_Search_Lucene_Index_Term $prefix - */ - public function skipTo(Zend_Search_Lucene_Index_Term $prefix) - { - $this->_termsStream->skipTo($prefix); - } - - /** - * Scans terms dictionary and returns next term - * - * @return Zend_Search_Lucene_Index_Term|null - */ - public function nextTerm() - { - return $this->_termsStream->nextTerm(); - } - - /** - * Returns term in current position - * - * @return Zend_Search_Lucene_Index_Term|null - */ - public function currentTerm() - { - return $this->_termsStream->currentTerm(); - } - - /** - * Close terms stream - * - * Should be used for resources clean up if stream is not read up to the end - */ - public function closeTermsStream() - { - $this->_termsStream->closeTermsStream(); - $this->_termsStream = null; - } - - - /** - * Undeletes all documents currently marked as deleted in this index. - */ - public function undeleteAll() - { - foreach ($this->_indices as $index) { - $index->undeleteAll(); - } - } - - - /** - * Add reference to the index object - * - * @internal - */ - public function addReference() - { - // Do nothing, since it's never referenced by indices - } - - /** - * Remove reference from the index object - * - * When reference count becomes zero, index is closed and resources are cleaned up - * - * @internal - */ - public function removeReference() - { - // Do nothing, since it's never referenced by indices - } -} +_indices = $indices; + + foreach ($this->_indices as $index) { + if (!$index instanceof Zend_Search_Lucene_Interface) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('sub-index objects have to implement Zend_Search_Lucene_Interface.'); + } + } + } + + /** + * Add index for searching. + * + * @param Zend_Search_Lucene_Interface $index + */ + public function addIndex(Zend_Search_Lucene_Interface $index) + { + $this->_indices[] = $index; + } + + + /** + * Get current generation number + * + * Returns generation number + * 0 means pre-2.1 index format + * -1 means there are no segments files. + * + * @param Zend_Search_Lucene_Storage_Directory $directory + * @return integer + * @throws Zend_Search_Lucene_Exception + */ + public static function getActualGeneration(Zend_Search_Lucene_Storage_Directory $directory) + { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception("Generation number can't be retrieved for multi-searcher"); + } + + /** + * Get segments file name + * + * @param integer $generation + * @return string + */ + public static function getSegmentFileName($generation) + { + return Zend_Search_Lucene::getSegmentFileName($generation); + } + + /** + * Get index format version + * + * @return integer + * @throws Zend_Search_Lucene_Exception + */ + public function getFormatVersion() + { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception("Format version can't be retrieved for multi-searcher"); + } + + /** + * Set index format version. + * Index is converted to this format at the nearest upfdate time + * + * @param int $formatVersion + */ + public function setFormatVersion($formatVersion) + { + foreach ($this->_indices as $index) { + $index->setFormatVersion($formatVersion); + } + } + + /** + * Returns the Zend_Search_Lucene_Storage_Directory instance for this index. + * + * @return Zend_Search_Lucene_Storage_Directory + */ + public function getDirectory() + { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception("Index directory can't be retrieved for multi-searcher"); + } + + /** + * Returns the total number of documents in this index (including deleted documents). + * + * @return integer + */ + public function count() + { + $count = 0; + + foreach ($this->_indices as $index) { + $count += $this->_indices->count(); + } + + return $count; + } + + /** + * Returns one greater than the largest possible document number. + * This may be used to, e.g., determine how big to allocate a structure which will have + * an element for every document number in an index. + * + * @return integer + */ + public function maxDoc() + { + return $this->count(); + } + + /** + * Returns the total number of non-deleted documents in this index. + * + * @return integer + */ + public function numDocs() + { + $docs = 0; + + foreach ($this->_indices as $index) { + $docs += $this->_indices->numDocs(); + } + + return $docs; + } + + /** + * Checks, that document is deleted + * + * @param integer $id + * @return boolean + * @throws Zend_Search_Lucene_Exception Exception is thrown if $id is out of the range + */ + public function isDeleted($id) + { + foreach ($this->_indices as $index) { + $indexCount = $index->count(); + + if ($indexCount > $id) { + return $index->isDeleted($id); + } + + $id -= $indexCount; + } + + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Document id is out of the range.'); + } + + /** + * Set default search field. + * + * Null means, that search is performed through all fields by default + * + * Default value is null + * + * @param string $fieldName + */ + public static function setDefaultSearchField($fieldName) + { + foreach ($this->_indices as $index) { + $index->setDefaultSearchField($fieldName); + } + } + + + /** + * Get default search field. + * + * Null means, that search is performed through all fields by default + * + * @return string + * @throws Zend_Search_Lucene_Exception + */ + public static function getDefaultSearchField() + { + if (count($this->_indices) == 0) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices list is empty'); + } + + $defaultSearchField = reset($this->_indices)->getDefaultSearchField(); + + foreach ($this->_indices as $index) { + if ($index->getDefaultSearchField() !== $defaultSearchField) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); + } + } + + return $defaultSearchField; + } + + /** + * Set result set limit. + * + * 0 (default) means no limit + * + * @param integer $limit + */ + public static function setResultSetLimit($limit) + { + foreach ($this->_indices as $index) { + $index->setResultSetLimit($limit); + } + } + + /** + * Set result set limit. + * + * 0 means no limit + * + * @return integer + * @throws Zend_Search_Lucene_Exception + */ + public static function getResultSetLimit() + { + if (count($this->_indices) == 0) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices list is empty'); + } + + $defaultResultSetLimit = reset($this->_indices)->getResultSetLimit(); + + foreach ($this->_indices as $index) { + if ($index->getResultSetLimit() !== $defaultResultSetLimit) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); + } + } + + return $defaultResultSetLimit; + } + + /** + * Retrieve index maxBufferedDocs option + * + * maxBufferedDocs is a minimal number of documents required before + * the buffered in-memory documents are written into a new Segment + * + * Default value is 10 + * + * @return integer + * @throws Zend_Search_Lucene_Exception + */ + public function getMaxBufferedDocs() + { + if (count($this->_indices) == 0) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices list is empty'); + } + + $maxBufferedDocs = reset($this->_indices)->getMaxBufferedDocs(); + + foreach ($this->_indices as $index) { + if ($index->getMaxBufferedDocs() !== $maxBufferedDocs) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); + } + } + + return $maxBufferedDocs; + } + + /** + * Set index maxBufferedDocs option + * + * maxBufferedDocs is a minimal number of documents required before + * the buffered in-memory documents are written into a new Segment + * + * Default value is 10 + * + * @param integer $maxBufferedDocs + */ + public function setMaxBufferedDocs($maxBufferedDocs) + { + foreach ($this->_indices as $index) { + $index->setMaxBufferedDocs($maxBufferedDocs); + } + } + + /** + * Retrieve index maxMergeDocs option + * + * maxMergeDocs is a largest number of documents ever merged by addDocument(). + * Small values (e.g., less than 10,000) are best for interactive indexing, + * as this limits the length of pauses while indexing to a few seconds. + * Larger values are best for batched indexing and speedier searches. + * + * Default value is PHP_INT_MAX + * + * @return integer + * @throws Zend_Search_Lucene_Exception + */ + public function getMaxMergeDocs() + { + if (count($this->_indices) == 0) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices list is empty'); + } + + $maxMergeDocs = reset($this->_indices)->getMaxMergeDocs(); + + foreach ($this->_indices as $index) { + if ($index->getMaxMergeDocs() !== $maxMergeDocs) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); + } + } + + return $maxMergeDocs; + } + + /** + * Set index maxMergeDocs option + * + * maxMergeDocs is a largest number of documents ever merged by addDocument(). + * Small values (e.g., less than 10,000) are best for interactive indexing, + * as this limits the length of pauses while indexing to a few seconds. + * Larger values are best for batched indexing and speedier searches. + * + * Default value is PHP_INT_MAX + * + * @param integer $maxMergeDocs + */ + public function setMaxMergeDocs($maxMergeDocs) + { + foreach ($this->_indices as $index) { + $index->setMaxMergeDocs($maxMergeDocs); + } + } + + /** + * Retrieve index mergeFactor option + * + * mergeFactor determines how often segment indices are merged by addDocument(). + * With smaller values, less RAM is used while indexing, + * and searches on unoptimized indices are faster, + * but indexing speed is slower. + * With larger values, more RAM is used during indexing, + * and while searches on unoptimized indices are slower, + * indexing is faster. + * Thus larger values (> 10) are best for batch index creation, + * and smaller values (< 10) for indices that are interactively maintained. + * + * Default value is 10 + * + * @return integer + * @throws Zend_Search_Lucene_Exception + */ + public function getMergeFactor() + { + if (count($this->_indices) == 0) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices list is empty'); + } + + $mergeFactor = reset($this->_indices)->getMergeFactor(); + + foreach ($this->_indices as $index) { + if ($index->getMergeFactor() !== $mergeFactor) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices have different default search field.'); + } + } + + return $mergeFactor; + } + + /** + * Set index mergeFactor option + * + * mergeFactor determines how often segment indices are merged by addDocument(). + * With smaller values, less RAM is used while indexing, + * and searches on unoptimized indices are faster, + * but indexing speed is slower. + * With larger values, more RAM is used during indexing, + * and while searches on unoptimized indices are slower, + * indexing is faster. + * Thus larger values (> 10) are best for batch index creation, + * and smaller values (< 10) for indices that are interactively maintained. + * + * Default value is 10 + * + * @param integer $maxMergeDocs + */ + public function setMergeFactor($mergeFactor) + { + foreach ($this->_indices as $index) { + $index->setMaxMergeDocs($mergeFactor); + } + } + + /** + * Performs a query against the index and returns an array + * of Zend_Search_Lucene_Search_QueryHit objects. + * Input is a string or Zend_Search_Lucene_Search_Query. + * + * @param mixed $query + * @return array Zend_Search_Lucene_Search_QueryHit + * @throws Zend_Search_Lucene_Exception + */ + public function find($query) + { + if (count($this->_indices) == 0) { + return array(); + } + + $hitsList = array(); + + $indexShift = 0; + foreach ($this->_indices as $index) { + $hits = $index->find($query); + + if ($indexShift != 0) { + foreach ($hits as $hit) { + $hit->id += $indexShift; + } + } + + $indexShift += $index->count(); + $hitsList[] = $hits; + } + + /** @todo Implement advanced sorting */ + + return call_user_func_array('array_merge', $hitsList); + } + + /** + * Returns a list of all unique field names that exist in this index. + * + * @param boolean $indexed + * @return array + */ + public function getFieldNames($indexed = false) + { + $fieldNamesList = array(); + + foreach ($this->_indices as $index) { + $fieldNamesList[] = $index->getFieldNames($indexed); + } + + return array_unique(call_user_func_array('array_merge', $fieldNamesList)); + } + + /** + * Returns a Zend_Search_Lucene_Document object for the document + * number $id in this index. + * + * @param integer|Zend_Search_Lucene_Search_QueryHit $id + * @return Zend_Search_Lucene_Document + * @throws Zend_Search_Lucene_Exception Exception is thrown if $id is out of the range + */ + public function getDocument($id) + { + if ($id instanceof Zend_Search_Lucene_Search_QueryHit) { + /* @var $id Zend_Search_Lucene_Search_QueryHit */ + $id = $id->id; + } + + foreach ($this->_indices as $index) { + $indexCount = $index->count(); + + if ($indexCount > $id) { + return $index->getDocument($id); + } + + $id -= $indexCount; + } + + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Document id is out of the range.'); + } + + /** + * Returns true if index contain documents with specified term. + * + * Is used for query optimization. + * + * @param Zend_Search_Lucene_Index_Term $term + * @return boolean + */ + public function hasTerm(Zend_Search_Lucene_Index_Term $term) + { + foreach ($this->_indices as $index) { + if ($index->hasTerm($term)) { + return true; + } + } + + return false; + } + + /** + * Returns IDs of all the documents containing term. + * + * @param Zend_Search_Lucene_Index_Term $term + * @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter + * @return array + * @throws Zend_Search_Lucene_Exception + */ + public function termDocs(Zend_Search_Lucene_Index_Term $term, $docsFilter = null) + { + if ($docsFilter != null) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Document filters could not used with multi-searcher'); + } + + $docsList = array(); + + $indexShift = 0; + foreach ($this->_indices as $index) { + $docs = $index->termDocs($term); + + if ($indexShift != 0) { + foreach ($docs as $id => $docId) { + $docs[$id] += $indexShift; + } + } + + $indexShift += $index->count(); + $docsList[] = $docs; + } + + return call_user_func_array('array_merge', $docsList); + } + + /** + * Returns documents filter for all documents containing term. + * + * It performs the same operation as termDocs, but return result as + * Zend_Search_Lucene_Index_DocsFilter object + * + * @param Zend_Search_Lucene_Index_Term $term + * @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter + * @return Zend_Search_Lucene_Index_DocsFilter + * @throws Zend_Search_Lucene_Exception + */ + public function termDocsFilter(Zend_Search_Lucene_Index_Term $term, $docsFilter = null) + { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Document filters could not used with multi-searcher'); + } + + /** + * Returns an array of all term freqs. + * Return array structure: array( docId => freq, ...) + * + * @param Zend_Search_Lucene_Index_Term $term + * @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter + * @return integer + * @throws Zend_Search_Lucene_Exception + */ + public function termFreqs(Zend_Search_Lucene_Index_Term $term, $docsFilter = null) + { + if ($docsFilter != null) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Document filters could not used with multi-searcher'); + } + + $freqsList = array(); + + $indexShift = 0; + foreach ($this->_indices as $index) { + $freqs = $index->termFreqs($term); + + if ($indexShift != 0) { + $freqsShifted = array(); + + foreach ($freqs as $docId => $freq) { + $freqsShifted[$docId + $indexShift] = $freq; + } + $freqs = $freqsShifted; + } + + $indexShift += $index->count(); + $freqsList[] = $freqs; + } + + return call_user_func_array('array_merge', $freqsList); + } + + /** + * Returns an array of all term positions in the documents. + * Return array structure: array( docId => array( pos1, pos2, ...), ...) + * + * @param Zend_Search_Lucene_Index_Term $term + * @param Zend_Search_Lucene_Index_DocsFilter|null $docsFilter + * @return array + * @throws Zend_Search_Lucene_Exception + */ + public function termPositions(Zend_Search_Lucene_Index_Term $term, $docsFilter = null) + { + if ($docsFilter != null) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Document filters could not used with multi-searcher'); + } + + $termPositionsList = array(); + + $indexShift = 0; + foreach ($this->_indices as $index) { + $termPositions = $index->termPositions($term); + + if ($indexShift != 0) { + $termPositionsShifted = array(); + + foreach ($termPositions as $docId => $positions) { + $termPositions[$docId + $indexShift] = $positions; + } + $termPositions = $termPositionsShifted; + } + + $indexShift += $index->count(); + $termPositionsList[] = $termPositions; + } + + return call_user_func_array('array_merge', $termPositions); + } + + /** + * Returns the number of documents in this index containing the $term. + * + * @param Zend_Search_Lucene_Index_Term $term + * @return integer + */ + public function docFreq(Zend_Search_Lucene_Index_Term $term) + { + $docFreq = 0; + + foreach ($this->_indices as $index) { + $docFreq += $index->docFreq($term); + } + + return $docFreq; + } + + /** + * Retrive similarity used by index reader + * + * @return Zend_Search_Lucene_Search_Similarity + * @throws Zend_Search_Lucene_Exception + */ + public function getSimilarity() + { + if (count($this->_indices) == 0) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices list is empty'); + } + + $similarity = reset($this->_indices)->getSimilarity(); + + foreach ($this->_indices as $index) { + if ($index->getSimilarity() !== $similarity) { + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Indices have different similarity.'); + } + } + + return $similarity; + } + + /** + * Returns a normalization factor for "field, document" pair. + * + * @param integer $id + * @param string $fieldName + * @return float + */ + public function norm($id, $fieldName) + { + foreach ($this->_indices as $index) { + $indexCount = $index->count(); + + if ($indexCount > $id) { + return $index->norm($id, $fieldName); + } + + $id -= $indexCount; + } + + return null; + } + + /** + * Returns true if any documents have been deleted from this index. + * + * @return boolean + */ + public function hasDeletions() + { + foreach ($this->_indices as $index) { + if ($index->hasDeletions()) { + return true; + } + } + + return false; + } + + /** + * Deletes a document from the index. + * $id is an internal document id + * + * @param integer|Zend_Search_Lucene_Search_QueryHit $id + * @throws Zend_Search_Lucene_Exception + */ + public function delete($id) + { + foreach ($this->_indices as $index) { + $indexCount = $index->count(); + + if ($indexCount > $id) { + $index->delete($id); + return; + } + + $id -= $indexCount; + } + + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Document id is out of the range.'); + } + + + /** + * Callback used to choose target index for new documents + * + * Function/method signature: + * Zend_Search_Lucene_Interface callbackFunction(Zend_Search_Lucene_Document $document, array $indices); + * + * null means "default documents distributing algorithm" + * + * @var callback + */ + protected $_documentDistributorCallBack = null; + + /** + * Set callback for choosing target index. + * + * @param callback $callback + */ + public function setDocumentDistributorCallback($callback) + { + if ($callback !== null && !is_callable($callback)) + $this->_documentDistributorCallBack = $callback; + } + + /** + * Get callback for choosing target index. + * + * @return callback + */ + public function getDocumentDistributorCallback() + { + return $this->_documentDistributorCallBack; + } + + /** + * Adds a document to this index. + * + * @param Zend_Search_Lucene_Document $document + * @throws Zend_Search_Lucene_Exception + */ + public function addDocument(Zend_Search_Lucene_Document $document) + { + if ($this->_documentDistributorCallBack !== null) { + $index = call_user_func($this->_documentDistributorCallBack, $document, $this->_indices); + } else { + $index = $this->_indices[ array_rand($this->_indices) ]; + } + + $index->addDocument($document); + } + + /** + * Commit changes resulting from delete() or undeleteAll() operations. + */ + public function commit() + { + foreach ($this->_indices as $index) { + $index->commit(); + } + } + + /** + * Optimize index. + * + * Merges all segments into one + */ + public function optimize() + { + foreach ($this->_indices as $index) { + $index->_optimise(); + } + } + + /** + * Returns an array of all terms in this index. + * + * @return array + */ + public function terms() + { + $termsList = array(); + + foreach ($this->_indices as $index) { + $termsList[] = $index->terms(); + } + + return array_unique(call_user_func_array('array_merge', $termsList)); + } + + + /** + * Terms stream priority queue object + * + * @var Zend_Search_Lucene_TermStreamsPriorityQueue + */ + private $_termsStream = null; + + /** + * Reset terms stream. + */ + public function resetTermsStream() + { + if ($this->_termsStream === null) { + /** Zend_Search_Lucene_TermStreamsPriorityQueue */ + require_once 'Zend/Search/Lucene/TermStreamsPriorityQueue.php'; + + $this->_termsStream = new Zend_Search_Lucene_TermStreamsPriorityQueue($this->_indices); + } else { + $this->_termsStream->resetTermsStream(); + } + } + + /** + * Skip terms stream up to specified term preffix. + * + * Prefix contains fully specified field info and portion of searched term + * + * @param Zend_Search_Lucene_Index_Term $prefix + */ + public function skipTo(Zend_Search_Lucene_Index_Term $prefix) + { + $this->_termsStream->skipTo($prefix); + } + + /** + * Scans terms dictionary and returns next term + * + * @return Zend_Search_Lucene_Index_Term|null + */ + public function nextTerm() + { + return $this->_termsStream->nextTerm(); + } + + /** + * Returns term in current position + * + * @return Zend_Search_Lucene_Index_Term|null + */ + public function currentTerm() + { + return $this->_termsStream->currentTerm(); + } + + /** + * Close terms stream + * + * Should be used for resources clean up if stream is not read up to the end + */ + public function closeTermsStream() + { + $this->_termsStream->closeTermsStream(); + $this->_termsStream = null; + } + + + /** + * Undeletes all documents currently marked as deleted in this index. + */ + public function undeleteAll() + { + foreach ($this->_indices as $index) { + $index->undeleteAll(); + } + } + + + /** + * Add reference to the index object + * + * @internal + */ + public function addReference() + { + // Do nothing, since it's never referenced by indices + } + + /** + * Remove reference from the index object + * + * When reference count becomes zero, index is closed and resources are cleaned up + * + * @internal + */ + public function removeReference() + { + // Do nothing, since it's never referenced by indices + } +} diff --git a/libs/Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php b/libs/Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php index 3fd4019..21ce353 100644 --- a/libs/Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php +++ b/libs/Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php @@ -17,19 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: BooleanExpressionRecognizer.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: BooleanExpressionRecognizer.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_FSM */ require_once 'Zend/Search/Lucene/FSM.php'; -/** Zend_Search_Lucene_Search_QueryToken */ -require_once 'Zend/Search/Lucene/Search/QueryToken.php'; - -/** Zend_Search_Lucene_Search_QueryParser */ -require_once 'Zend/Search/Lucene/Search/QueryParser.php'; - /** * @category Zend * @package Zend_Search_Lucene @@ -220,6 +214,9 @@ class Zend_Search_Lucene_Search_BooleanExpressionRecognizer extends Zend_Search_ */ public function emptyOperatorAction() { + /** Zend_Search_Lucene_Search_QueryParser */ + require_once 'Zend/Search/Lucene/Search/QueryParser.php'; + if (Zend_Search_Lucene_Search_QueryParser::getDefaultOperator() == Zend_Search_Lucene_Search_QueryParser::B_AND) { // Do nothing } else { @@ -235,6 +232,9 @@ class Zend_Search_Lucene_Search_BooleanExpressionRecognizer extends Zend_Search_ */ public function emptyNotOperatorAction() { + /** Zend_Search_Lucene_Search_QueryParser */ + require_once 'Zend/Search/Lucene/Search/QueryParser.php'; + if (Zend_Search_Lucene_Search_QueryParser::getDefaultOperator() == Zend_Search_Lucene_Search_QueryParser::B_AND) { // Do nothing } else { diff --git a/libs/Zend/Search/Lucene/Search/Highlighter/Default.php b/libs/Zend/Search/Lucene/Search/Highlighter/Default.php index ed59b35..9c615e7 100644 --- a/libs/Zend/Search/Lucene/Search/Highlighter/Default.php +++ b/libs/Zend/Search/Lucene/Search/Highlighter/Default.php @@ -1,94 +1,94 @@ -_doc = $document; - } - - /** - * Get document for highlighting. - * - * @return Zend_Search_Lucene_Document_Html $document - */ - public function getDocument() - { - return $this->_doc; - } - - /** - * Highlight specified words - * - * @param string|array $words Words to highlight. They could be organized using the array or string. - */ - public function highlight($words) - { - $color = $this->_highlightColors[$this->_currentColorIndex]; - $this->_currentColorIndex = ($this->_currentColorIndex + 1) % count($this->_highlightColors); - - $this->_doc->highlight($words, $color); - } - -} +_doc = $document; + } + + /** + * Get document for highlighting. + * + * @return Zend_Search_Lucene_Document_Html $document + */ + public function getDocument() + { + return $this->_doc; + } + + /** + * Highlight specified words + * + * @param string|array $words Words to highlight. They could be organized using the array or string. + */ + public function highlight($words) + { + $color = $this->_highlightColors[$this->_currentColorIndex]; + $this->_currentColorIndex = ($this->_currentColorIndex + 1) % count($this->_highlightColors); + + $this->_doc->highlight($words, $color); + } + +} diff --git a/libs/Zend/Search/Lucene/Search/Highlighter/Interface.php b/libs/Zend/Search/Lucene/Search/Highlighter/Interface.php index bf13871..a99f695 100644 --- a/libs/Zend/Search/Lucene/Search/Highlighter/Interface.php +++ b/libs/Zend/Search/Lucene/Search/Highlighter/Interface.php @@ -1,53 +1,53 @@ -setDocument($doc); @@ -217,13 +212,17 @@ abstract class Zend_Search_Lucene_Search_Query public function htmlFragmentHighlightMatches($inputHtmlFragment, $encoding = 'UTF-8', $highlighter = null) { if ($highlighter === null) { + require_once 'Zend/Search/Lucene/Search/Highlighter/Default.php'; $highlighter = new Zend_Search_Lucene_Search_Highlighter_Default(); } $inputHTML = '' . iconv($encoding, 'UTF-8//IGNORE', $inputHtmlFragment) . ''; - $doc = Zend_Search_Lucene_Document_Html::loadHTML($inputHTML); + /** Zend_Search_Lucene_Document_Html */ + require_once 'Zend/Search/Lucene/Document/Html.php'; + + $doc = Zend_Search_Lucene_Document_Html::loadHTML($inputHTML); $highlighter->setDocument($doc); $this->_highlightMatches($highlighter); diff --git a/libs/Zend/Search/Lucene/Search/Query/Boolean.php b/libs/Zend/Search/Lucene/Search/Query/Boolean.php index 781b602..e8e5bbe 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Boolean.php +++ b/libs/Zend/Search/Lucene/Search/Query/Boolean.php @@ -17,16 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Boolean.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Boolean.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** Zend_Search_Lucene_Search_Weight_Boolean */ -require_once 'Zend/Search/Lucene/Search/Weight/Boolean.php'; - /** * @category Zend @@ -177,6 +174,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ } if (count($subqueries) == 0) { // Boolean query doesn't has non-insignificant subqueries + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; return new Zend_Search_Lucene_Search_Query_Insignificant(); } // Check if all non-insignificant subqueries are prohibited @@ -188,6 +186,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ } } if ($allProhibited) { + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; return new Zend_Search_Lucene_Search_Query_Insignificant(); } @@ -197,6 +196,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ if ($subquery instanceof Zend_Search_Lucene_Search_Query_Empty) { if ($signs[$id] === true) { // Matching is required, but is actually empty + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } else { // Matching is optional or prohibited, but is empty @@ -209,6 +209,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ // Check, if reduced subqueries list is empty if (count($subqueries) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } @@ -221,6 +222,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ } } if ($allProhibited) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } @@ -355,6 +357,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ // Check, if all subqueries have been decomposed and all terms has the same boost factor if (count($subqueries) == 0 && count(array_unique($boostFactors)) == 1) { + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; $optimizedQuery = new Zend_Search_Lucene_Search_Query_MultiTerm($terms, $tsigns); $optimizedQuery->setBoost(reset($boostFactors)*$this->getBoost()); @@ -378,6 +381,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ } if (count($terms) == 1) { + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; $clause = new Zend_Search_Lucene_Search_Query_Term(reset($terms)); $clause->setBoost(reset($boostFactors)); @@ -387,6 +391,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ // Clear terms list $terms = array(); } else if (count($terms) > 1 && count(array_unique($boostFactors)) == 1) { + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; $clause = new Zend_Search_Lucene_Search_Query_MultiTerm($terms, $tsigns); $clause->setBoost(reset($boostFactors)); @@ -400,6 +405,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ if (count($prohibitedTerms) == 1) { // (boost factors are not significant for prohibited clauses) + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; $subqueries[] = new Zend_Search_Lucene_Search_Query_Term(reset($prohibitedTerms)); $signs[] = false; @@ -414,6 +420,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ } // (boost factors are not significant for prohibited clauses) + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; $subqueries[] = new Zend_Search_Lucene_Search_Query_MultiTerm($prohibitedTerms, $prohibitedSigns); // Clause sign is 'prohibited' $signs[] = false; @@ -464,6 +471,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ */ public function createWeight(Zend_Search_Lucene_Interface $reader) { + require_once 'Zend/Search/Lucene/Search/Weight/Boolean.php'; $this->_weight = new Zend_Search_Lucene_Search_Weight_Boolean($this, $reader); return $this->_weight; } @@ -686,6 +694,7 @@ class Zend_Search_Lucene_Search_Query_Boolean extends Zend_Search_Lucene_Search_ if ($docsFilter === null) { // Create local documents filter if it's not provided by upper query + require_once 'Zend/Search/Lucene/Index/DocsFilter.php'; $docsFilter = new Zend_Search_Lucene_Index_DocsFilter(); } diff --git a/libs/Zend/Search/Lucene/Search/Query/Empty.php b/libs/Zend/Search/Lucene/Search/Query/Empty.php index 2c6b935..af26c36 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Empty.php +++ b/libs/Zend/Search/Lucene/Search/Query/Empty.php @@ -17,16 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Empty.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Empty.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** Zend_Search_Lucene_Search_Weight_Empty */ -require_once 'Zend/Search/Lucene/Search/Weight/Empty.php'; - /** * @category Zend @@ -68,6 +65,7 @@ class Zend_Search_Lucene_Search_Query_Empty extends Zend_Search_Lucene_Search_Qu */ public function createWeight(Zend_Search_Lucene_Interface $reader) { + require_once 'Zend/Search/Lucene/Search/Weight/Empty.php'; return new Zend_Search_Lucene_Search_Weight_Empty(); } diff --git a/libs/Zend/Search/Lucene/Search/Query/Fuzzy.php b/libs/Zend/Search/Lucene/Search/Query/Fuzzy.php index 8f8d78c..74df54d 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Fuzzy.php +++ b/libs/Zend/Search/Lucene/Search/Query/Fuzzy.php @@ -17,16 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Fuzzy.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Fuzzy.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** Zend_Search_Lucene_Search_Query_MultiTerm */ -require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; - /** * @category Zend @@ -196,6 +193,7 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu $fields = array($this->_term->field); } + require_once 'Zend/Search/Lucene/Index/Term.php'; $prefix = Zend_Search_Lucene_Index_Term::getPrefix($this->_term->text, $this->_prefixLength); $prefixByteLength = strlen($prefix); $prefixUtf8Length = Zend_Search_Lucene_Index_Term::getLength($prefix); @@ -208,10 +206,12 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu $scaleFactor = 1/(1 - $this->_minimumSimilarity); + require_once 'Zend/Search/Lucene.php'; $maxTerms = Zend_Search_Lucene::getTermsPerQueryLimit(); foreach ($fields as $field) { $index->resetTermsStream(); + require_once 'Zend/Search/Lucene/Index/Term.php'; if ($prefix != '') { $index->skipTo(new Zend_Search_Lucene_Index_Term($prefix, $field)); @@ -298,10 +298,13 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu } if (count($this->_matches) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } else if (count($this->_matches) == 1) { + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; return new Zend_Search_Lucene_Search_Query_Term(reset($this->_matches)); } else { + require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; $rewrittenQuery = new Zend_Search_Lucene_Search_Query_Boolean(); array_multisort($this->_scores, SORT_DESC, SORT_NUMERIC, @@ -309,6 +312,7 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu $this->_matches); $termCount = 0; + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; foreach ($this->_matches as $id => $matchedTerm) { $subquery = new Zend_Search_Lucene_Search_Query_Term($matchedTerm); $subquery->setBoost($this->_scores[$id]); @@ -418,6 +422,7 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu { $words = array(); + require_once 'Zend/Search/Lucene/Index/Term.php'; $prefix = Zend_Search_Lucene_Index_Term::getPrefix($this->_term->text, $this->_prefixLength); $prefixByteLength = strlen($prefix); $prefixUtf8Length = Zend_Search_Lucene_Index_Term::getLength($prefix); @@ -430,13 +435,13 @@ class Zend_Search_Lucene_Search_Query_Fuzzy extends Zend_Search_Lucene_Search_Qu $scaleFactor = 1/(1 - $this->_minimumSimilarity); - $docBody = $highlighter->getDocument()->getFieldUtf8Value('body'); + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($docBody, 'UTF-8'); foreach ($tokens as $token) { - $termText = $token->getTermText(); + $termText = $token->getTermText(); - if (substr($termText, 0, $prefixByteLength) == $prefix) { + if (substr($termText, 0, $prefixByteLength) == $prefix) { // Calculate similarity $target = substr($termText, $prefixByteLength); diff --git a/libs/Zend/Search/Lucene/Search/Query/Insignificant.php b/libs/Zend/Search/Lucene/Search/Query/Insignificant.php index 16d22d0..87046e3 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Insignificant.php +++ b/libs/Zend/Search/Lucene/Search/Query/Insignificant.php @@ -17,16 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Insignificant.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Insignificant.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** Zend_Search_Lucene_Search_Weight_Empty */ -require_once 'Zend/Search/Lucene/Search/Weight/Empty.php'; - /** * The insignificant query returns empty result, but doesn't limit result set as a part of other queries @@ -69,6 +66,7 @@ class Zend_Search_Lucene_Search_Query_Insignificant extends Zend_Search_Lucene_S */ public function createWeight(Zend_Search_Lucene_Interface $reader) { + require_once 'Zend/Search/Lucene/Search/Weight/Empty.php'; return new Zend_Search_Lucene_Search_Weight_Empty(); } diff --git a/libs/Zend/Search/Lucene/Search/Query/MultiTerm.php b/libs/Zend/Search/Lucene/Search/Query/MultiTerm.php index c57bcb5..52c87d2 100644 --- a/libs/Zend/Search/Lucene/Search/Query/MultiTerm.php +++ b/libs/Zend/Search/Lucene/Search/Query/MultiTerm.php @@ -17,16 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MultiTerm.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: MultiTerm.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** Zend_Search_Lucene_Search_Weight_MultiTerm */ -require_once 'Zend/Search/Lucene/Search/Weight/MultiTerm.php'; - /** * @category Zend @@ -109,6 +106,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc public function __construct($terms = null, $signs = null) { if (is_array($terms)) { + require_once 'Zend/Search/Lucene.php'; if (count($terms) > Zend_Search_Lucene::getTermsPerQueryLimit()) { throw new Zend_Search_Lucene_Exception('Terms per query limit is reached.'); } @@ -165,6 +163,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc public function rewrite(Zend_Search_Lucene_Interface $index) { if (count($this->_terms) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } @@ -181,9 +180,11 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc return $this; } else { /** transform multiterm query to boolean and apply rewrite() method to subqueries. */ + require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; $query = new Zend_Search_Lucene_Search_Query_Boolean(); $query->setBoost($this->getBoost()); + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; foreach ($this->_terms as $termId => $term) { $subquery = new Zend_Search_Lucene_Search_Query_Term($term); @@ -210,6 +211,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc if (!$index->hasTerm($term)) { if ($signs === null || $signs[$id] === true) { // Term is required + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } else { // Term is optional or prohibited @@ -233,6 +235,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc } } if ($allProhibited) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } @@ -245,6 +248,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc // It's already checked, that it's not a prohibited term // It's one term query with one required or optional element + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; $optimizedQuery = new Zend_Search_Lucene_Search_Query_Term(reset($terms)); $optimizedQuery->setBoost($this->getBoost()); @@ -252,6 +256,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc } if (count($terms) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } @@ -303,6 +308,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc */ public function createWeight(Zend_Search_Lucene_Interface $reader) { + require_once 'Zend/Search/Lucene/Search/Weight/MultiTerm.php'; $this->_weight = new Zend_Search_Lucene_Search_Weight_MultiTerm($this, $reader); return $this->_weight; } @@ -333,6 +339,7 @@ class Zend_Search_Lucene_Search_Query_MultiTerm extends Zend_Search_Lucene_Searc $ids, SORT_ASC, SORT_NUMERIC, $this->_terms); + require_once 'Zend/Search/Lucene/Index/DocsFilter.php'; $docsFilter = new Zend_Search_Lucene_Index_DocsFilter(); foreach ($this->_terms as $termId => $term) { $termDocs = $reader->termDocs($term, $docsFilter); diff --git a/libs/Zend/Search/Lucene/Search/Query/Phrase.php b/libs/Zend/Search/Lucene/Search/Query/Phrase.php index a98c590..e34e225 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Phrase.php +++ b/libs/Zend/Search/Lucene/Search/Query/Phrase.php @@ -17,20 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Phrase.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Phrase.php 18954 2009-11-12 20:01:33Z alexander $ */ -/** - * Zend_Search_Lucene_Search_Query - */ +/** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** - * Zend_Search_Lucene_Search_Weight_Phrase - */ -require_once 'Zend/Search/Lucene/Search/Weight/Phrase.php'; - /** * A Query that matches documents containing a particular sequence of terms. @@ -109,6 +102,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q if (is_array($terms)) { $this->_terms = array(); + require_once 'Zend/Search/Lucene/Index/Term.php'; foreach ($terms as $termId => $termText) { $this->_terms[$termId] = ($field !== null)? new Zend_Search_Lucene_Index_Term($termText, $field): new Zend_Search_Lucene_Index_Term($termText); @@ -116,11 +110,13 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q } else if ($terms === null) { $this->_terms = array(); } else { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('terms argument must be array of strings or null'); } if (is_array($offsets)) { if (count($this->_terms) != count($offsets)) { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('terms and offsets arguments must have the same size.'); } $this->_offsets = $offsets; @@ -131,6 +127,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q $this->_offsets[$termId] = $position; } } else { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('offsets argument must be array of strings or null'); } } @@ -167,6 +164,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q */ public function addTerm(Zend_Search_Lucene_Index_Term $term, $position = null) { if ((count($this->_terms) != 0)&&(end($this->_terms)->field != $term->field)) { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('All phrase terms must be in the same field: ' . $term->field . ':' . $term->text); } @@ -191,10 +189,12 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q public function rewrite(Zend_Search_Lucene_Interface $index) { if (count($this->_terms) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } else if ($this->_terms[0]->field !== null) { return $this; } else { + require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; $query = new Zend_Search_Lucene_Search_Query_Boolean(); $query->setBoost($this->getBoost()); @@ -202,6 +202,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q $subquery = new Zend_Search_Lucene_Search_Query_Phrase(); $subquery->setSlop($this->getSlop()); + require_once 'Zend/Search/Lucene/Index/Term.php'; foreach ($this->_terms as $termId => $term) { $qualifiedTerm = new Zend_Search_Lucene_Index_Term($term->text, $fieldName); @@ -226,12 +227,14 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q // Check, that index contains all phrase terms foreach ($this->_terms as $term) { if (!$index->hasTerm($term)) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } } if (count($this->_terms) == 1) { // It's one term query + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; $optimizedQuery = new Zend_Search_Lucene_Search_Query_Term(reset($this->_terms)); $optimizedQuery->setBoost($this->getBoost()); @@ -239,6 +242,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q } if (count($this->_terms) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } @@ -277,6 +281,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q */ public function createWeight(Zend_Search_Lucene_Interface $reader) { + require_once 'Zend/Search/Lucene/Search/Weight/Phrase.php'; $this->_weight = new Zend_Search_Lucene_Search_Weight_Phrase($this, $reader); return $this->_weight; } @@ -543,7 +548,7 @@ class Zend_Search_Lucene_Search_Query_Phrase extends Zend_Search_Lucene_Search_Q if (isset($this->_terms[0]) && $this->_terms[0]->field !== null) { $query = $this->_terms[0]->field . ':'; } else { - $query = ''; + $query = ''; } $query .= '"'; diff --git a/libs/Zend/Search/Lucene/Search/Query/Preprocessing.php b/libs/Zend/Search/Lucene/Search/Query/Preprocessing.php index 4a0f4aa..b693625 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Preprocessing.php +++ b/libs/Zend/Search/Lucene/Search/Query/Preprocessing.php @@ -1,134 +1,127 @@ -_word = $word; - $this->_encoding = $encoding; - $this->_field = $fieldName; - $this->_minimumSimilarity = $minimumSimilarity; - } - - /** - * Re-write query into primitive queries in the context of specified index - * - * @param Zend_Search_Lucene_Interface $index - * @return Zend_Search_Lucene_Search_Query - */ - public function rewrite(Zend_Search_Lucene_Interface $index) - { - if ($this->_field === null) { - $query = new Zend_Search_Lucene_Search_Query_Boolean(); - - $hasInsignificantSubqueries = false; - - if (Zend_Search_Lucene::getDefaultSearchField() === null) { - $searchFields = $index->getFieldNames(true); - } else { - $searchFields = array(Zend_Search_Lucene::getDefaultSearchField()); - } - - foreach ($searchFields as $fieldName) { - $subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy($this->_word, - $this->_encoding, - $fieldName, - $this->_minimumSimilarity); - - $rewrittenSubquery = $subquery->rewrite($index); - - if ( !($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant || - $rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Empty) ) { - $query->addSubquery($rewrittenSubquery); - } - - if ($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant) { - $hasInsignificantSubqueries = true; - } - } - - $subqueries = $query->getSubqueries(); - - if (count($subqueries) == 0) { - $this->_matches = array(); - if ($hasInsignificantSubqueries) { - return new Zend_Search_Lucene_Search_Query_Insignificant(); - } else { - return new Zend_Search_Lucene_Search_Query_Empty(); - } - } - - if (count($subqueries) == 1) { - $query = reset($subqueries); - } - - $query->setBoost($this->getBoost()); - - $this->_matches = $query->getQueryTerms(); - return $query; - } - - // ------------------------------------- - // Recognize exact term matching (it corresponds to Keyword fields stored in the index) - // encoding is not used since we expect binary matching - $term = new Zend_Search_Lucene_Index_Term($this->_word, $this->_field); - if ($index->hasTerm($term)) { - $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity); - $query->setBoost($this->getBoost()); - - // Get rewritten query. Important! It also fills terms matching container. - $rewrittenQuery = $query->rewrite($index); - $this->_matches = $query->getQueryTerms(); - - return $rewrittenQuery; - } - - - // ------------------------------------- - // Recognize wildcard queries - - /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ - if (@preg_match('/\pL/u', 'a') == 1) { - $subPatterns = preg_split('/[*?]/u', iconv($this->_encoding, 'UTF-8', $this->_word)); - } else { - $subPatterns = preg_split('/[*?]/', $this->_word); - } - if (count($subPatterns) > 1) { - require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; - throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search doesn\'t support wildcards (except within Keyword fields).'); - } - - - // ------------------------------------- - // Recognize one-term multi-term and "insignificant" queries - $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding); - - if (count($tokens) == 0) { - $this->_matches = array(); - return new Zend_Search_Lucene_Search_Query_Insignificant(); - } - - if (count($tokens) == 1) { - $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); - $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity); - $query->setBoost($this->getBoost()); - - // Get rewritten query. Important! It also fills terms matching container. - $rewrittenQuery = $query->rewrite($index); - $this->_matches = $query->getQueryTerms(); - - return $rewrittenQuery; - } - - // Word is tokenized into several tokens - require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; - throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search is supported only for non-multiple word terms'); - } - - /** - * Query specific matches highlighting - * - * @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting) - */ - protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter) - { - /** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */ - - /** Skip exact term matching recognition, keyword fields highlighting is not supported */ - - // ------------------------------------- - // Recognize wildcard queries - - /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ - if (@preg_match('/\pL/u', 'a') == 1) { - $subPatterns = preg_split('/[*?]/u', iconv($this->_encoding, 'UTF-8', $this->_word)); - } else { - $subPatterns = preg_split('/[*?]/', $this->_word); - } - if (count($subPatterns) > 1) { - // Do nothing - return; - } - - // ------------------------------------- - // Recognize one-term multi-term and "insignificant" queries - $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding); - if (count($tokens) == 0) { - // Do nothing - return; - } - if (count($tokens) == 1) { - $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); - $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity); - - $query->_highlightMatches($highlighter); - return; - } - - // Word is tokenized into several tokens - // But fuzzy search is supported only for non-multiple word terms - // Do nothing - } - - /** - * Print a query - * - * @return string - */ - public function __toString() - { - // It's used only for query visualisation, so we don't care about characters escaping - if ($this->_field !== null) { - $query = $this->_field . ':'; - } else { - $query = ''; - } - - $query .= $this->_word; - - if ($this->getBoost() != 1) { - $query .= '^' . round($this->getBoost(), 4); - } - - return $query; - } -} +_word = $word; + $this->_encoding = $encoding; + $this->_field = $fieldName; + $this->_minimumSimilarity = $minimumSimilarity; + } + + /** + * Re-write query into primitive queries in the context of specified index + * + * @param Zend_Search_Lucene_Interface $index + * @return Zend_Search_Lucene_Search_Query + */ + public function rewrite(Zend_Search_Lucene_Interface $index) + { + if ($this->_field === null) { + require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; + $query = new Zend_Search_Lucene_Search_Query_Boolean(); + + $hasInsignificantSubqueries = false; + + require_once 'Zend/Search/Lucene.php'; + if (Zend_Search_Lucene::getDefaultSearchField() === null) { + $searchFields = $index->getFieldNames(true); + } else { + $searchFields = array(Zend_Search_Lucene::getDefaultSearchField()); + } + + require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Fuzzy.php'; + foreach ($searchFields as $fieldName) { + $subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy($this->_word, + $this->_encoding, + $fieldName, + $this->_minimumSimilarity); + + $rewrittenSubquery = $subquery->rewrite($index); + + if ( !($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant || + $rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Empty) ) { + $query->addSubquery($rewrittenSubquery); + } + + if ($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant) { + $hasInsignificantSubqueries = true; + } + } + + $subqueries = $query->getSubqueries(); + + if (count($subqueries) == 0) { + $this->_matches = array(); + if ($hasInsignificantSubqueries) { + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; + return new Zend_Search_Lucene_Search_Query_Insignificant(); + } else { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; + return new Zend_Search_Lucene_Search_Query_Empty(); + } + } + + if (count($subqueries) == 1) { + $query = reset($subqueries); + } + + $query->setBoost($this->getBoost()); + + $this->_matches = $query->getQueryTerms(); + return $query; + } + + // ------------------------------------- + // Recognize exact term matching (it corresponds to Keyword fields stored in the index) + // encoding is not used since we expect binary matching + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($this->_word, $this->_field); + if ($index->hasTerm($term)) { + require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php'; + $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity); + $query->setBoost($this->getBoost()); + + // Get rewritten query. Important! It also fills terms matching container. + $rewrittenQuery = $query->rewrite($index); + $this->_matches = $query->getQueryTerms(); + + return $rewrittenQuery; + } + + + // ------------------------------------- + // Recognize wildcard queries + + /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ + if (@preg_match('/\pL/u', 'a') == 1) { + $subPatterns = preg_split('/[*?]/u', iconv($this->_encoding, 'UTF-8', $this->_word)); + } else { + $subPatterns = preg_split('/[*?]/', $this->_word); + } + if (count($subPatterns) > 1) { + require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; + throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search doesn\'t support wildcards (except within Keyword fields).'); + } + + + // ------------------------------------- + // Recognize one-term multi-term and "insignificant" queries + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding); + + if (count($tokens) == 0) { + $this->_matches = array(); + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; + return new Zend_Search_Lucene_Search_Query_Insignificant(); + } + + if (count($tokens) == 1) { + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); + require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php'; + $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity); + $query->setBoost($this->getBoost()); + + // Get rewritten query. Important! It also fills terms matching container. + $rewrittenQuery = $query->rewrite($index); + $this->_matches = $query->getQueryTerms(); + + return $rewrittenQuery; + } + + // Word is tokenized into several tokens + require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; + throw new Zend_Search_Lucene_Search_QueryParserException('Fuzzy search is supported only for non-multiple word terms'); + } + + /** + * Query specific matches highlighting + * + * @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting) + */ + protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter) + { + /** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */ + + /** Skip exact term matching recognition, keyword fields highlighting is not supported */ + + // ------------------------------------- + // Recognize wildcard queries + + /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ + if (@preg_match('/\pL/u', 'a') == 1) { + $subPatterns = preg_split('/[*?]/u', iconv($this->_encoding, 'UTF-8', $this->_word)); + } else { + $subPatterns = preg_split('/[*?]/', $this->_word); + } + if (count($subPatterns) > 1) { + // Do nothing + return; + } + + + // ------------------------------------- + // Recognize one-term multi-term and "insignificant" queries + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding); + if (count($tokens) == 0) { + // Do nothing + return; + } + if (count($tokens) == 1) { + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); + require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php'; + $query = new Zend_Search_Lucene_Search_Query_Fuzzy($term, $this->_minimumSimilarity); + + $query->_highlightMatches($highlighter); + return; + } + + // Word is tokenized into several tokens + // But fuzzy search is supported only for non-multiple word terms + // Do nothing + } + + /** + * Print a query + * + * @return string + */ + public function __toString() + { + // It's used only for query visualisation, so we don't care about characters escaping + if ($this->_field !== null) { + $query = $this->_field . ':'; + } else { + $query = ''; + } + + $query .= $this->_word; + + if ($this->getBoost() != 1) { + $query .= '^' . round($this->getBoost(), 4); + } + + return $query; + } +} diff --git a/libs/Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php b/libs/Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php index 6ec236c..ded81fe 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php +++ b/libs/Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php @@ -1,274 +1,270 @@ -_phrase = $phrase; - $this->_phraseEncoding = $phraseEncoding; - $this->_field = $fieldName; - } - - /** - * Set slop - * - * @param integer $slop - */ - public function setSlop($slop) - { - $this->_slop = $slop; - } - - - /** - * Get slop - * - * @return integer - */ - public function getSlop() - { - return $this->_slop; - } - - /** - * Re-write query into primitive queries in the context of specified index - * - * @param Zend_Search_Lucene_Interface $index - * @return Zend_Search_Lucene_Search_Query - */ - public function rewrite(Zend_Search_Lucene_Interface $index) - { -// Allow to use wildcards within phrases -// They are either removed by text analyzer or used as a part of keyword for keyword fields -// -// if (strpos($this->_phrase, '?') !== false || strpos($this->_phrase, '*') !== false) { -// require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; -// throw new Zend_Search_Lucene_Search_QueryParserException('Wildcards are only allowed in a single terms.'); -// } - - // Split query into subqueries if field name is not specified - if ($this->_field === null) { - $query = new Zend_Search_Lucene_Search_Query_Boolean(); - $query->setBoost($this->getBoost()); - - if (Zend_Search_Lucene::getDefaultSearchField() === null) { - $searchFields = $index->getFieldNames(true); - } else { - $searchFields = array(Zend_Search_Lucene::getDefaultSearchField()); - } - - foreach ($searchFields as $fieldName) { - $subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase, - $this->_phraseEncoding, - $fieldName); - $subquery->setSlop($this->getSlop()); - - $query->addSubquery($subquery->rewrite($index)); - } - - $this->_matches = $query->getQueryTerms(); - return $query; - } - - // Recognize exact term matching (it corresponds to Keyword fields stored in the index) - // encoding is not used since we expect binary matching - $term = new Zend_Search_Lucene_Index_Term($this->_phrase, $this->_field); - if ($index->hasTerm($term)) { - $query = new Zend_Search_Lucene_Search_Query_Term($term); - $query->setBoost($this->getBoost()); - - $this->_matches = $query->getQueryTerms(); - return $query; - } - - - // tokenize phrase using current analyzer and process it as a phrase query - $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding); - - if (count($tokens) == 0) { - $this->_matches = array(); - return new Zend_Search_Lucene_Search_Query_Insignificant(); - } - - if (count($tokens) == 1) { - $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); - $query = new Zend_Search_Lucene_Search_Query_Term($term); - $query->setBoost($this->getBoost()); - - $this->_matches = $query->getQueryTerms(); - return $query; - } - - //It's non-trivial phrase query - $position = -1; - $query = new Zend_Search_Lucene_Search_Query_Phrase(); - foreach ($tokens as $token) { - $position += $token->getPositionIncrement(); - $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field); - $query->addTerm($term, $position); - $query->setSlop($this->getSlop()); - } - $this->_matches = $query->getQueryTerms(); - return $query; - } - - /** - * Query specific matches highlighting - * - * @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting) - */ - protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter) - { - /** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */ - - /** Skip exact term matching recognition, keyword fields highlighting is not supported */ - - /** Skip wildcard queries recognition. Supported wildcards are removed by text analyzer */ - - // tokenize phrase using current analyzer and process it as a phrase query - $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding); - - if (count($tokens) == 0) { - // Do nothing - return; - } - - if (count($tokens) == 1) { - $highlighter->highlight($tokens[0]->getTermText()); - return; - } - - //It's non-trivial phrase query - $words = array(); - foreach ($tokens as $token) { - $words[] = $token->getTermText(); - } - $highlighter->highlight($words); - } - - /** - * Print a query - * - * @return string - */ - public function __toString() - { - // It's used only for query visualisation, so we don't care about characters escaping - if ($this->_field !== null) { - $query = $this->_field . ':'; - } else { - $query = ''; - } - - $query .= '"' . $this->_phrase . '"'; - - if ($this->_slop != 0) { - $query .= '~' . $this->_slop; - } - - if ($this->getBoost() != 1) { - $query .= '^' . round($this->getBoost(), 4); - } - - return $query; - } -} +_phrase = $phrase; + $this->_phraseEncoding = $phraseEncoding; + $this->_field = $fieldName; + } + + /** + * Set slop + * + * @param integer $slop + */ + public function setSlop($slop) + { + $this->_slop = $slop; + } + + + /** + * Get slop + * + * @return integer + */ + public function getSlop() + { + return $this->_slop; + } + + /** + * Re-write query into primitive queries in the context of specified index + * + * @param Zend_Search_Lucene_Interface $index + * @return Zend_Search_Lucene_Search_Query + */ + public function rewrite(Zend_Search_Lucene_Interface $index) + { +// Allow to use wildcards within phrases +// They are either removed by text analyzer or used as a part of keyword for keyword fields +// +// if (strpos($this->_phrase, '?') !== false || strpos($this->_phrase, '*') !== false) { +// require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; +// throw new Zend_Search_Lucene_Search_QueryParserException('Wildcards are only allowed in a single terms.'); +// } + + // Split query into subqueries if field name is not specified + if ($this->_field === null) { + require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; + $query = new Zend_Search_Lucene_Search_Query_Boolean(); + $query->setBoost($this->getBoost()); + + require_once 'Zend/Search/Lucene.php'; + if (Zend_Search_Lucene::getDefaultSearchField() === null) { + $searchFields = $index->getFieldNames(true); + } else { + $searchFields = array(Zend_Search_Lucene::getDefaultSearchField()); + } + + foreach ($searchFields as $fieldName) { + $subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase, + $this->_phraseEncoding, + $fieldName); + $subquery->setSlop($this->getSlop()); + + $query->addSubquery($subquery->rewrite($index)); + } + + $this->_matches = $query->getQueryTerms(); + return $query; + } + + // Recognize exact term matching (it corresponds to Keyword fields stored in the index) + // encoding is not used since we expect binary matching + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($this->_phrase, $this->_field); + if ($index->hasTerm($term)) { + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; + $query = new Zend_Search_Lucene_Search_Query_Term($term); + $query->setBoost($this->getBoost()); + + $this->_matches = $query->getQueryTerms(); + return $query; + } + + + // tokenize phrase using current analyzer and process it as a phrase query + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding); + + if (count($tokens) == 0) { + $this->_matches = array(); + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; + return new Zend_Search_Lucene_Search_Query_Insignificant(); + } + + if (count($tokens) == 1) { + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; + $query = new Zend_Search_Lucene_Search_Query_Term($term); + $query->setBoost($this->getBoost()); + + $this->_matches = $query->getQueryTerms(); + return $query; + } + + //It's non-trivial phrase query + $position = -1; + require_once 'Zend/Search/Lucene/Search/Query/Phrase.php'; + $query = new Zend_Search_Lucene_Search_Query_Phrase(); + require_once 'Zend/Search/Lucene/Index/Term.php'; + foreach ($tokens as $token) { + $position += $token->getPositionIncrement(); + $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field); + $query->addTerm($term, $position); + $query->setSlop($this->getSlop()); + } + $this->_matches = $query->getQueryTerms(); + return $query; + } + + /** + * Query specific matches highlighting + * + * @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting) + */ + protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter) + { + /** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */ + + /** Skip exact term matching recognition, keyword fields highlighting is not supported */ + + /** Skip wildcard queries recognition. Supported wildcards are removed by text analyzer */ + + + // tokenize phrase using current analyzer and process it as a phrase query + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_phrase, $this->_phraseEncoding); + + if (count($tokens) == 0) { + // Do nothing + return; + } + + if (count($tokens) == 1) { + $highlighter->highlight($tokens[0]->getTermText()); + return; + } + + //It's non-trivial phrase query + $words = array(); + foreach ($tokens as $token) { + $words[] = $token->getTermText(); + } + $highlighter->highlight($words); + } + + /** + * Print a query + * + * @return string + */ + public function __toString() + { + // It's used only for query visualisation, so we don't care about characters escaping + if ($this->_field !== null) { + $query = $this->_field . ':'; + } else { + $query = ''; + } + + $query .= '"' . $this->_phrase . '"'; + + if ($this->_slop != 0) { + $query .= '~' . $this->_slop; + } + + if ($this->getBoost() != 1) { + $query .= '^' . round($this->getBoost(), 4); + } + + return $query; + } +} diff --git a/libs/Zend/Search/Lucene/Search/Query/Preprocessing/Term.php b/libs/Zend/Search/Lucene/Search/Query/Preprocessing/Term.php index 720a892..f54fb5e 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Preprocessing/Term.php +++ b/libs/Zend/Search/Lucene/Search/Query/Preprocessing/Term.php @@ -1,335 +1,341 @@ -_word = $word; - $this->_encoding = $encoding; - $this->_field = $fieldName; - } - - /** - * Re-write query into primitive queries in the context of specified index - * - * @param Zend_Search_Lucene_Interface $index - * @return Zend_Search_Lucene_Search_Query - */ - public function rewrite(Zend_Search_Lucene_Interface $index) - { - if ($this->_field === null) { - $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); - $query->setBoost($this->getBoost()); - - $hasInsignificantSubqueries = false; - - if (Zend_Search_Lucene::getDefaultSearchField() === null) { - $searchFields = $index->getFieldNames(true); - } else { - $searchFields = array(Zend_Search_Lucene::getDefaultSearchField()); - } - - foreach ($searchFields as $fieldName) { - $subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Term($this->_word, - $this->_encoding, - $fieldName); - $rewrittenSubquery = $subquery->rewrite($index); - foreach ($rewrittenSubquery->getQueryTerms() as $term) { - $query->addTerm($term); - } - - if ($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant) { - $hasInsignificantSubqueries = true; - } - } - - if (count($query->getTerms()) == 0) { - $this->_matches = array(); - if ($hasInsignificantSubqueries) { - return new Zend_Search_Lucene_Search_Query_Insignificant(); - } else { - return new Zend_Search_Lucene_Search_Query_Empty(); - } - } - - $this->_matches = $query->getQueryTerms(); - return $query; - } - - // ------------------------------------- - // Recognize exact term matching (it corresponds to Keyword fields stored in the index) - // encoding is not used since we expect binary matching - $term = new Zend_Search_Lucene_Index_Term($this->_word, $this->_field); - if ($index->hasTerm($term)) { - $query = new Zend_Search_Lucene_Search_Query_Term($term); - $query->setBoost($this->getBoost()); - - $this->_matches = $query->getQueryTerms(); - return $query; - } - - - // ------------------------------------- - // Recognize wildcard queries - - /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ - if (@preg_match('/\pL/u', 'a') == 1) { - $word = iconv($this->_encoding, 'UTF-8', $this->_word); - $wildcardsPattern = '/[*?]/u'; - $subPatternsEncoding = 'UTF-8'; - } else { - $word = $this->_word; - $wildcardsPattern = '/[*?]/'; - $subPatternsEncoding = $this->_encoding; - } - - $subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE); - - if (count($subPatterns) > 1) { - // Wildcard query is recognized - - $pattern = ''; - - foreach ($subPatterns as $id => $subPattern) { - // Append corresponding wildcard character to the pattern before each sub-pattern (except first) - if ($id != 0) { - $pattern .= $word[ $subPattern[1] - 1 ]; - } - - // Check if each subputtern is a single word in terms of current analyzer - $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding); - if (count($tokens) > 1) { - require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; - throw new Zend_Search_Lucene_Search_QueryParserException('Wildcard search is supported only for non-multiple word terms'); - } - foreach ($tokens as $token) { - $pattern .= $token->getTermText(); - } - } - - $term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field); - $query = new Zend_Search_Lucene_Search_Query_Wildcard($term); - $query->setBoost($this->getBoost()); - - // Get rewritten query. Important! It also fills terms matching container. - $rewrittenQuery = $query->rewrite($index); - $this->_matches = $query->getQueryTerms(); - - return $rewrittenQuery; - } - - - // ------------------------------------- - // Recognize one-term multi-term and "insignificant" queries - $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding); - - if (count($tokens) == 0) { - $this->_matches = array(); - return new Zend_Search_Lucene_Search_Query_Insignificant(); - } - - if (count($tokens) == 1) { - $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); - $query = new Zend_Search_Lucene_Search_Query_Term($term); - $query->setBoost($this->getBoost()); - - $this->_matches = $query->getQueryTerms(); - return $query; - } - - //It's not insignificant or one term query - $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); - - /** - * @todo Process $token->getPositionIncrement() to support stemming, synonyms and other - * analizer design features - */ - foreach ($tokens as $token) { - $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field); - $query->addTerm($term, true); // all subterms are required - } - - $query->setBoost($this->getBoost()); - - $this->_matches = $query->getQueryTerms(); - return $query; - } - - /** - * Query specific matches highlighting - * - * @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting) - */ - protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter) - { - /** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */ - - /** Skip exact term matching recognition, keyword fields highlighting is not supported */ - - // ------------------------------------- - // Recognize wildcard queries - /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ - if (@preg_match('/\pL/u', 'a') == 1) { - $word = iconv($this->_encoding, 'UTF-8', $this->_word); - $wildcardsPattern = '/[*?]/u'; - $subPatternsEncoding = 'UTF-8'; - } else { - $word = $this->_word; - $wildcardsPattern = '/[*?]/'; - $subPatternsEncoding = $this->_encoding; - } - $subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE); - if (count($subPatterns) > 1) { - // Wildcard query is recognized - - $pattern = ''; - - foreach ($subPatterns as $id => $subPattern) { - // Append corresponding wildcard character to the pattern before each sub-pattern (except first) - if ($id != 0) { - $pattern .= $word[ $subPattern[1] - 1 ]; - } - - // Check if each subputtern is a single word in terms of current analyzer - $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding); - if (count($tokens) > 1) { - // Do nothing (nothing is highlighted) - return; - } - foreach ($tokens as $token) { - $pattern .= $token->getTermText(); - } - } - - $term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field); - $query = new Zend_Search_Lucene_Search_Query_Wildcard($term); - - $query->_highlightMatches($highlighter); - return; - } - - // ------------------------------------- - // Recognize one-term multi-term and "insignificant" queries - $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding); - - if (count($tokens) == 0) { - // Do nothing - return; - } - - if (count($tokens) == 1) { - $highlighter->highlight($tokens[0]->getTermText()); - return; - } - - //It's not insignificant or one term query - $words = array(); - foreach ($tokens as $token) { - $words[] = $token->getTermText(); - } - $highlighter->highlight($words); - } - - /** - * Print a query - * - * @return string - */ - public function __toString() - { - // It's used only for query visualisation, so we don't care about characters escaping - if ($this->_field !== null) { - $query = $this->_field . ':'; - } else { - $query = ''; - } - - $query .= $this->_word; - - if ($this->getBoost() != 1) { - $query .= '^' . round($this->getBoost(), 4); - } - - return $query; - } -} +_word = $word; + $this->_encoding = $encoding; + $this->_field = $fieldName; + } + + /** + * Re-write query into primitive queries in the context of specified index + * + * @param Zend_Search_Lucene_Interface $index + * @return Zend_Search_Lucene_Search_Query + */ + public function rewrite(Zend_Search_Lucene_Interface $index) + { + if ($this->_field === null) { + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; + $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); + $query->setBoost($this->getBoost()); + + $hasInsignificantSubqueries = false; + + require_once 'Zend/Search/Lucene.php'; + if (Zend_Search_Lucene::getDefaultSearchField() === null) { + $searchFields = $index->getFieldNames(true); + } else { + $searchFields = array(Zend_Search_Lucene::getDefaultSearchField()); + } + + require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Term.php'; + foreach ($searchFields as $fieldName) { + $subquery = new Zend_Search_Lucene_Search_Query_Preprocessing_Term($this->_word, + $this->_encoding, + $fieldName); + $rewrittenSubquery = $subquery->rewrite($index); + foreach ($rewrittenSubquery->getQueryTerms() as $term) { + $query->addTerm($term); + } + + if ($rewrittenSubquery instanceof Zend_Search_Lucene_Search_Query_Insignificant) { + $hasInsignificantSubqueries = true; + } + } + + if (count($query->getTerms()) == 0) { + $this->_matches = array(); + if ($hasInsignificantSubqueries) { + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; + return new Zend_Search_Lucene_Search_Query_Insignificant(); + } else { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; + return new Zend_Search_Lucene_Search_Query_Empty(); + } + } + + $this->_matches = $query->getQueryTerms(); + return $query; + } + + // ------------------------------------- + // Recognize exact term matching (it corresponds to Keyword fields stored in the index) + // encoding is not used since we expect binary matching + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($this->_word, $this->_field); + if ($index->hasTerm($term)) { + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; + $query = new Zend_Search_Lucene_Search_Query_Term($term); + $query->setBoost($this->getBoost()); + + $this->_matches = $query->getQueryTerms(); + return $query; + } + + + // ------------------------------------- + // Recognize wildcard queries + + /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ + if (@preg_match('/\pL/u', 'a') == 1) { + $word = iconv($this->_encoding, 'UTF-8', $this->_word); + $wildcardsPattern = '/[*?]/u'; + $subPatternsEncoding = 'UTF-8'; + } else { + $word = $this->_word; + $wildcardsPattern = '/[*?]/'; + $subPatternsEncoding = $this->_encoding; + } + + $subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE); + + if (count($subPatterns) > 1) { + // Wildcard query is recognized + + $pattern = ''; + + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + foreach ($subPatterns as $id => $subPattern) { + // Append corresponding wildcard character to the pattern before each sub-pattern (except first) + if ($id != 0) { + $pattern .= $word[ $subPattern[1] - 1 ]; + } + + // Check if each subputtern is a single word in terms of current analyzer + $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding); + if (count($tokens) > 1) { + require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; + throw new Zend_Search_Lucene_Search_QueryParserException('Wildcard search is supported only for non-multiple word terms'); + } + foreach ($tokens as $token) { + $pattern .= $token->getTermText(); + } + } + + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field); + require_once 'Zend/Search/Lucene/Search/Query/Wildcard.php'; + $query = new Zend_Search_Lucene_Search_Query_Wildcard($term); + $query->setBoost($this->getBoost()); + + // Get rewritten query. Important! It also fills terms matching container. + $rewrittenQuery = $query->rewrite($index); + $this->_matches = $query->getQueryTerms(); + + return $rewrittenQuery; + } + + + // ------------------------------------- + // Recognize one-term multi-term and "insignificant" queries + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding); + + if (count($tokens) == 0) { + $this->_matches = array(); + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; + return new Zend_Search_Lucene_Search_Query_Insignificant(); + } + + if (count($tokens) == 1) { + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($tokens[0]->getTermText(), $this->_field); + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; + $query = new Zend_Search_Lucene_Search_Query_Term($term); + $query->setBoost($this->getBoost()); + + $this->_matches = $query->getQueryTerms(); + return $query; + } + + //It's not insignificant or one term query + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; + $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); + + /** + * @todo Process $token->getPositionIncrement() to support stemming, synonyms and other + * analizer design features + */ + require_once 'Zend/Search/Lucene/Index/Term.php'; + foreach ($tokens as $token) { + $term = new Zend_Search_Lucene_Index_Term($token->getTermText(), $this->_field); + $query->addTerm($term, true); // all subterms are required + } + + $query->setBoost($this->getBoost()); + + $this->_matches = $query->getQueryTerms(); + return $query; + } + + /** + * Query specific matches highlighting + * + * @param Zend_Search_Lucene_Search_Highlighter_Interface $highlighter Highlighter object (also contains doc for highlighting) + */ + protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter) + { + /** Skip fields detection. We don't need it, since we expect all fields presented in the HTML body and don't differentiate them */ + + /** Skip exact term matching recognition, keyword fields highlighting is not supported */ + + // ------------------------------------- + // Recognize wildcard queries + /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ + if (@preg_match('/\pL/u', 'a') == 1) { + $word = iconv($this->_encoding, 'UTF-8', $this->_word); + $wildcardsPattern = '/[*?]/u'; + $subPatternsEncoding = 'UTF-8'; + } else { + $word = $this->_word; + $wildcardsPattern = '/[*?]/'; + $subPatternsEncoding = $this->_encoding; + } + $subPatterns = preg_split($wildcardsPattern, $word, -1, PREG_SPLIT_OFFSET_CAPTURE); + if (count($subPatterns) > 1) { + // Wildcard query is recognized + + $pattern = ''; + + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + foreach ($subPatterns as $id => $subPattern) { + // Append corresponding wildcard character to the pattern before each sub-pattern (except first) + if ($id != 0) { + $pattern .= $word[ $subPattern[1] - 1 ]; + } + + // Check if each subputtern is a single word in terms of current analyzer + $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($subPattern[0], $subPatternsEncoding); + if (count($tokens) > 1) { + // Do nothing (nothing is highlighted) + return; + } + foreach ($tokens as $token) { + $pattern .= $token->getTermText(); + } + } + + require_once 'Zend/Search/Lucene/Index/Term.php'; + $term = new Zend_Search_Lucene_Index_Term($pattern, $this->_field); + require_once 'Zend/Search/Lucene/Search/Query/Wildcard.php'; + $query = new Zend_Search_Lucene_Search_Query_Wildcard($term); + + $query->_highlightMatches($highlighter); + return; + } + + + // ------------------------------------- + // Recognize one-term multi-term and "insignificant" queries + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; + $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_word, $this->_encoding); + + if (count($tokens) == 0) { + // Do nothing + return; + } + + if (count($tokens) == 1) { + $highlighter->highlight($tokens[0]->getTermText()); + return; + } + + //It's not insignificant or one term query + $words = array(); + foreach ($tokens as $token) { + $words[] = $token->getTermText(); + } + $highlighter->highlight($words); + } + + /** + * Print a query + * + * @return string + */ + public function __toString() + { + // It's used only for query visualisation, so we don't care about characters escaping + if ($this->_field !== null) { + $query = $this->_field . ':'; + } else { + $query = ''; + } + + $query .= $this->_word; + + if ($this->getBoost() != 1) { + $query .= '^' . round($this->getBoost(), 4); + } + + return $query; + } +} diff --git a/libs/Zend/Search/Lucene/Search/Query/Range.php b/libs/Zend/Search/Lucene/Search/Query/Range.php index a1c5602..2ac9741 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Range.php +++ b/libs/Zend/Search/Lucene/Search/Query/Range.php @@ -17,16 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Range.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Range.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** Zend_Search_Lucene_Search_Query_MultiTerm */ -require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; - /** * @category Zend @@ -162,10 +159,12 @@ class Zend_Search_Lucene_Search_Query_Range extends Zend_Search_Lucene_Search_Qu $fields = array($this->_field); } + require_once 'Zend/Search/Lucene.php'; $maxTerms = Zend_Search_Lucene::getTermsPerQueryLimit(); foreach ($fields as $field) { $index->resetTermsStream(); + require_once 'Zend/Search/Lucene/Index/Term.php'; if ($this->_lowerTerm !== null) { $lowerTerm = new Zend_Search_Lucene_Index_Term($this->_lowerTerm->text, $field); @@ -220,10 +219,13 @@ class Zend_Search_Lucene_Search_Query_Range extends Zend_Search_Lucene_Search_Qu } if (count($this->_matches) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } else if (count($this->_matches) == 1) { + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; return new Zend_Search_Lucene_Search_Query_Term(reset($this->_matches)); } else { + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; $rewrittenQuery = new Zend_Search_Lucene_Search_Query_MultiTerm(); foreach ($this->_matches as $matchedTerm) { @@ -328,19 +330,20 @@ class Zend_Search_Lucene_Search_Query_Range extends Zend_Search_Lucene_Search_Qu $words = array(); $docBody = $highlighter->getDocument()->getFieldUtf8Value('body'); + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($docBody, 'UTF-8'); $lowerTermText = ($this->_lowerTerm !== null)? $this->_lowerTerm->text : null; $upperTermText = ($this->_upperTerm !== null)? $this->_upperTerm->text : null; if ($this->_inclusive) { - foreach ($tokens as $token) { - $termText = $token->getTermText(); - if (($lowerTermText == null || $lowerTermText <= $termText) && - ($upperTermText == null || $termText <= $upperTermText)) { - $words[] = $termText; - } - } + foreach ($tokens as $token) { + $termText = $token->getTermText(); + if (($lowerTermText == null || $lowerTermText <= $termText) && + ($upperTermText == null || $termText <= $upperTermText)) { + $words[] = $termText; + } + } } else { foreach ($tokens as $token) { $termText = $token->getTermText(); diff --git a/libs/Zend/Search/Lucene/Search/Query/Term.php b/libs/Zend/Search/Lucene/Search/Query/Term.php index 2df9f86..24060c1 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Term.php +++ b/libs/Zend/Search/Lucene/Search/Query/Term.php @@ -17,16 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Term.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Term.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** Zend_Search_Lucene_Search_Weight_Term */ -require_once 'Zend/Search/Lucene/Search/Weight/Term.php'; - /** * @category Zend @@ -82,9 +79,11 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que if ($this->_term->field != null) { return $this; } else { + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); $query->setBoost($this->getBoost()); + require_once 'Zend/Search/Lucene/Index/Term.php'; foreach ($index->getFieldNames(true) as $fieldName) { $term = new Zend_Search_Lucene_Index_Term($this->_term->text, $fieldName); @@ -105,6 +104,7 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que { // Check, that index contains specified term if (!$index->hasTerm($this->_term)) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } @@ -120,6 +120,7 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que */ public function createWeight(Zend_Search_Lucene_Interface $reader) { + require_once 'Zend/Search/Lucene/Search/Weight/Term.php'; $this->_weight = new Zend_Search_Lucene_Search_Weight_Term($this->_term, $this, $reader); return $this->_weight; } @@ -198,7 +199,7 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que */ protected function _highlightMatches(Zend_Search_Lucene_Search_Highlighter_Interface $highlighter) { - $highlighter->highlight($this->_term->text); + $highlighter->highlight($this->_term->text); } /** @@ -210,9 +211,9 @@ class Zend_Search_Lucene_Search_Query_Term extends Zend_Search_Lucene_Search_Que { // It's used only for query visualisation, so we don't care about characters escaping if ($this->_term->field !== null) { - $query = $this->_term->field . ':'; + $query = $this->_term->field . ':'; } else { - $query = ''; + $query = ''; } $query .= $this->_term->text; diff --git a/libs/Zend/Search/Lucene/Search/Query/Wildcard.php b/libs/Zend/Search/Lucene/Search/Query/Wildcard.php index a1bf9b8..f777107 100644 --- a/libs/Zend/Search/Lucene/Search/Query/Wildcard.php +++ b/libs/Zend/Search/Lucene/Search/Query/Wildcard.php @@ -17,16 +17,13 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Wildcard.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Wildcard.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Search_Query */ require_once 'Zend/Search/Lucene/Search/Query.php'; -/** Zend_Search_Lucene_Search_Query_MultiTerm */ -require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; - /** * @category Zend @@ -84,7 +81,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search */ public static function getMinPrefixLength() { - return self::$_minPrefixLength; + return self::$_minPrefixLength; } /** @@ -94,7 +91,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search */ public static function setMinPrefixLength($minPrefixLength) { - self::$_minPrefixLength = $minPrefixLength; + self::$_minPrefixLength = $minPrefixLength; } /** @@ -144,7 +141,8 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search $matchExpression = '/^' . str_replace(array('\\?', '\\*'), array('.', '.*') , preg_quote($this->_pattern->text, '/')) . '$/'; if ($prefixLength < self::$_minPrefixLength) { - throw new Zend_Search_Lucene_Exception('At least ' . self::$_minPrefixLength . ' non-wildcard characters are required at the beginning of pattern.'); + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('At least ' . self::$_minPrefixLength . ' non-wildcard characters are required at the beginning of pattern.'); } /** @todo check for PCRE unicode support may be performed through Zend_Environment in some future */ @@ -158,6 +156,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search foreach ($fields as $field) { $index->resetTermsStream(); + require_once 'Zend/Search/Lucene/Index/Term.php'; if ($prefix != '') { $index->skipTo(new Zend_Search_Lucene_Index_Term($prefix, $field)); @@ -168,7 +167,8 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search $this->_matches[] = $index->currentTerm(); if ($maxTerms != 0 && count($this->_matches) > $maxTerms) { - throw new Zend_Search_Lucene_Exception('Terms per query limit is reached.'); + require_once 'Zend/Search/Lucene/Exception.php'; + throw new Zend_Search_Lucene_Exception('Terms per query limit is reached.'); } } @@ -182,6 +182,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search $this->_matches[] = $index->currentTerm(); if ($maxTerms != 0 && count($this->_matches) > $maxTerms) { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('Terms per query limit is reached.'); } } @@ -194,10 +195,13 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search } if (count($this->_matches) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; return new Zend_Search_Lucene_Search_Query_Empty(); } else if (count($this->_matches) == 1) { + require_once 'Zend/Search/Lucene/Search/Query/Term.php'; return new Zend_Search_Lucene_Search_Query_Term(reset($this->_matches)); } else { + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; $rewrittenQuery = new Zend_Search_Lucene_Search_Query_MultiTerm(); foreach ($this->_matches as $matchedTerm) { @@ -216,6 +220,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search */ public function optimize(Zend_Search_Lucene_Interface $index) { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)'); } @@ -240,6 +245,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search public function getQueryTerms() { if ($this->_matches === null) { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('Search has to be performed first to get matched terms'); } @@ -255,6 +261,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search */ public function createWeight(Zend_Search_Lucene_Interface $reader) { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)'); } @@ -269,6 +276,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search */ public function execute(Zend_Search_Lucene_Interface $reader, $docsFilter = null) { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)'); } @@ -282,6 +290,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search */ public function matchedDocs() { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)'); } @@ -295,6 +304,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search */ public function score($docId, Zend_Search_Lucene_Interface $reader) { + require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception('Wildcard query should not be directly used for search. Use $query->rewrite($index)'); } @@ -315,6 +325,7 @@ class Zend_Search_Lucene_Search_Query_Wildcard extends Zend_Search_Lucene_Search } $docBody = $highlighter->getDocument()->getFieldUtf8Value('body'); + require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; $tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($docBody, 'UTF-8'); foreach ($tokens as $token) { if (preg_match($matchExpression, $token->getTermText()) === 1) { diff --git a/libs/Zend/Search/Lucene/Search/QueryEntry.php b/libs/Zend/Search/Lucene/Search/QueryEntry.php index d25f7e8..8a8295c 100644 --- a/libs/Zend/Search/Lucene/Search/QueryEntry.php +++ b/libs/Zend/Search/Lucene/Search/QueryEntry.php @@ -17,21 +17,9 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: QueryEntry.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: QueryEntry.php 18954 2009-11-12 20:01:33Z alexander $ */ -/** Zend_Search_Lucene_Index_Term */ -require_once 'Zend/Search/Lucene/Index/Term.php'; - -/** Zend_Search_Lucene_Search_QueryEntry_Term */ -require_once 'Zend/Search/Lucene/Search/QueryEntry/Term.php'; - -/** Zend_Search_Lucene_Search_QueryEntry_Phrase */ -require_once 'Zend/Search/Lucene/Search/QueryEntry/Phrase.php'; - -/** Zend_Search_Lucene_Search_QueryEntry_Subquery */ -require_once 'Zend/Search/Lucene/Search/QueryEntry/Subquery.php'; - /** * @category Zend * @package Zend_Search_Lucene diff --git a/libs/Zend/Search/Lucene/Search/QueryEntry/Phrase.php b/libs/Zend/Search/Lucene/Search/QueryEntry/Phrase.php index dc8ec39..7bb2a7c 100644 --- a/libs/Zend/Search/Lucene/Search/QueryEntry/Phrase.php +++ b/libs/Zend/Search/Lucene/Search/QueryEntry/Phrase.php @@ -17,18 +17,12 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Phrase.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Phrase.php 18954 2009-11-12 20:01:33Z alexander $ */ -/** Zend_Search_Lucene_Index_Term */ -require_once 'Zend/Search/Lucene/Index/Term.php'; - /** Zend_Search_Lucene_Search_QueryEntry */ require_once 'Zend/Search/Lucene/Search/QueryEntry.php'; -/** Zend_Search_Lucene_Analysis_Analyzer */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; - /** * @category Zend * @package Zend_Search_Lucene @@ -103,11 +97,13 @@ class Zend_Search_Lucene_Search_QueryEntry_Phrase extends Zend_Search_Lucene_Sea */ public function getQuery($encoding) { - $query = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase, - $encoding, - ($this->_field !== null)? - iconv($encoding, 'UTF-8', $this->_field) : - null); + /** Zend_Search_Lucene_Search_Query_Preprocessing_Phrase */ + require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php'; + $query = new Zend_Search_Lucene_Search_Query_Preprocessing_Phrase($this->_phrase, + $encoding, + ($this->_field !== null)? + iconv($encoding, 'UTF-8', $this->_field) : + null); if ($this->_proximityQuery) { $query->setSlop($this->_wordsDistance); diff --git a/libs/Zend/Search/Lucene/Search/QueryEntry/Subquery.php b/libs/Zend/Search/Lucene/Search/QueryEntry/Subquery.php index f0fec48..a59ee05 100644 --- a/libs/Zend/Search/Lucene/Search/QueryEntry/Subquery.php +++ b/libs/Zend/Search/Lucene/Search/QueryEntry/Subquery.php @@ -17,12 +17,9 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Subquery.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Subquery.php 18954 2009-11-12 20:01:33Z alexander $ */ -/** Zend_Search_Lucene_Index_Term */ -require_once 'Zend/Search/Lucene/Index/Term.php'; - /** Zend_Search_Lucene_Search_QueryEntry */ require_once 'Zend/Search/Lucene/Search/QueryEntry.php'; diff --git a/libs/Zend/Search/Lucene/Search/QueryEntry/Term.php b/libs/Zend/Search/Lucene/Search/QueryEntry/Term.php index 8001637..c9588db 100644 --- a/libs/Zend/Search/Lucene/Search/QueryEntry/Term.php +++ b/libs/Zend/Search/Lucene/Search/QueryEntry/Term.php @@ -17,18 +17,12 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Term.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Term.php 18954 2009-11-12 20:01:33Z alexander $ */ -/** Zend_Search_Lucene_Index_Term */ -require_once 'Zend/Search/Lucene/Index/Term.php'; - /** Zend_Search_Lucene_Search_QueryEntry */ require_once 'Zend/Search/Lucene/Search/QueryEntry.php'; -/** Zend_Search_Lucene_Analysis_Analyzer */ -require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; - /** * @category Zend * @package Zend_Search_Lucene @@ -92,6 +86,8 @@ class Zend_Search_Lucene_Search_QueryEntry_Term extends Zend_Search_Lucene_Searc if ($parameter !== null) { $this->_similarity = $parameter; } else { + /** Zend_Search_Lucene_Search_Query_Fuzzy */ + require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php'; $this->_similarity = Zend_Search_Lucene_Search_Query_Fuzzy::DEFAULT_MIN_SIMILARITY; } } @@ -105,26 +101,30 @@ class Zend_Search_Lucene_Search_QueryEntry_Term extends Zend_Search_Lucene_Searc */ public function getQuery($encoding) { - if ($this->_fuzzyQuery) { - $query = new Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy($this->_term, - $encoding, - ($this->_field !== null)? + if ($this->_fuzzyQuery) { + /** Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy */ + require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Fuzzy.php'; + $query = new Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy($this->_term, + $encoding, + ($this->_field !== null)? iconv($encoding, 'UTF-8', $this->_field) : null, - $this->_similarity - ); + $this->_similarity + ); $query->setBoost($this->_boost); return $query; - } + } - $query = new Zend_Search_Lucene_Search_Query_Preprocessing_Term($this->_term, - $encoding, - ($this->_field !== null)? + /** Zend_Search_Lucene_Search_Query_Preprocessing_Term */ + require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Term.php'; + $query = new Zend_Search_Lucene_Search_Query_Preprocessing_Term($this->_term, + $encoding, + ($this->_field !== null)? iconv($encoding, 'UTF-8', $this->_field) : null ); - $query->setBoost($this->_boost); + $query->setBoost($this->_boost); return $query; } } diff --git a/libs/Zend/Search/Lucene/Search/QueryHit.php b/libs/Zend/Search/Lucene/Search/QueryHit.php index ae3910a..ce39aed 100644 --- a/libs/Zend/Search/Lucene/Search/QueryHit.php +++ b/libs/Zend/Search/Lucene/Search/QueryHit.php @@ -17,7 +17,7 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: QueryHit.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: QueryHit.php 18954 2009-11-12 20:01:33Z alexander $ */ @@ -64,6 +64,7 @@ class Zend_Search_Lucene_Search_QueryHit public function __construct(Zend_Search_Lucene_Interface $index) { + require_once 'Zend/Search/Lucene/Proxy.php'; $this->_index = new Zend_Search_Lucene_Proxy($index); } diff --git a/libs/Zend/Search/Lucene/Search/QueryParser.php b/libs/Zend/Search/Lucene/Search/QueryParser.php index 41360e5..ceed728 100644 --- a/libs/Zend/Search/Lucene/Search/QueryParser.php +++ b/libs/Zend/Search/Lucene/Search/QueryParser.php @@ -17,50 +17,19 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: QueryParser.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: QueryParser.php 18954 2009-11-12 20:01:33Z alexander $ */ -/** Zend_Search_Lucene_Index_Term */ -require_once 'Zend/Search/Lucene/Index/Term.php'; -/** Zend_Search_Lucene_Search_Query_Term */ -require_once 'Zend/Search/Lucene/Search/Query/Term.php'; +/** Internally used classes */ -/** Zend_Search_Lucene_Search_Query_MultiTerm */ -require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; +/** Zend_Search_Lucene_Analysis_Analyzer */ +require_once 'Zend/Search/Lucene/Analysis/Analyzer.php'; -/** Zend_Search_Lucene_Search_Query_Boolean */ -require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; +/** Zend_Search_Lucene_Search_QueryToken */ +require_once 'Zend/Search/Lucene/Search/QueryToken.php'; -/** Zend_Search_Lucene_Search_Query_Preprocessing_Phrase */ -require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php'; -/** Zend_Search_Lucene_Search_Query_Preprocessing_Term */ -require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Term.php'; - -/** Zend_Search_Lucene_Search_Query_Preprocessing_Fuzzy */ -require_once 'Zend/Search/Lucene/Search/Query/Preprocessing/Fuzzy.php'; - -/** Zend_Search_Lucene_Search_Query_Wildcard */ -require_once 'Zend/Search/Lucene/Search/Query/Wildcard.php'; - -/** Zend_Search_Lucene_Search_Query_Range */ -require_once 'Zend/Search/Lucene/Search/Query/Range.php'; - -/** Zend_Search_Lucene_Search_Query_Fuzzy */ -require_once 'Zend/Search/Lucene/Search/Query/Fuzzy.php'; - -/** Zend_Search_Lucene_Search_Query_Empty */ -require_once 'Zend/Search/Lucene/Search/Query/Empty.php'; - -/** Zend_Search_Lucene_Search_Query_Insignificant */ -require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; - -/** Zend_Search_Lucene_Search_QueryLexer */ -require_once 'Zend/Search/Lucene/Search/QueryLexer.php'; - -/** Zend_Search_Lucene_Search_QueryParserContext */ -require_once 'Zend/Search/Lucene/Search/QueryParserContext.php'; /** Zend_Search_Lucene_FSM */ require_once 'Zend/Search/Lucene/FSM.php'; @@ -281,7 +250,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM $this->addEntryAction(self::ST_CLOSEDINT_RQ_LAST_TERM, $closedRQLastTermAction); - + require_once 'Zend/Search/Lucene/Search/QueryLexer.php'; $this->_lexer = new Zend_Search_Lucene_Search_QueryLexer(); } @@ -380,6 +349,8 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; try { + require_once 'Zend/Search/Lucene/Search/QueryParserContext.php'; + self::$_instance->_encoding = ($encoding !== null) ? $encoding : self::$_instance->_defaultEncoding; self::$_instance->_lastToken = null; self::$_instance->_context = new Zend_Search_Lucene_Search_QueryParserContext(self::$_instance->_encoding); @@ -388,6 +359,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM // Empty query if (count(self::$_instance->_tokens) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; return new Zend_Search_Lucene_Search_Query_Insignificant(); } @@ -416,10 +388,12 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM if (self::$_instance->_suppressQueryParsingExceptions) { $queryTokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($strQuery, self::$_instance->_encoding); + require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); $termsSign = (self::$_instance->_defaultOperator == self::B_AND) ? true /* required term */ : null /* optional term */; + require_once 'Zend/Search/Lucene/Index/Term.php'; foreach ($queryTokens as $token) { $query->addTerm(new Zend_Search_Lucene_Index_Term($token->getTermText()), $termsSign); } @@ -443,6 +417,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM */ public function addTermEntry() { + require_once 'Zend/Search/Lucene/Search/QueryEntry/Term.php'; $entry = new Zend_Search_Lucene_Search_QueryEntry_Term($this->_currentToken->text, $this->_context->getField()); $this->_context->addEntry($entry); } @@ -452,6 +427,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM */ public function addPhraseEntry() { + require_once 'Zend/Search/Lucene/Search/QueryEntry/Phrase.php'; $entry = new Zend_Search_Lucene_Search_QueryEntry_Phrase($this->_currentToken->text, $this->_context->getField()); $this->_context->addEntry($entry); } @@ -515,6 +491,8 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM */ public function subqueryStart() { + require_once 'Zend/Search/Lucene/Search/QueryParserContext.php'; + $this->_contextStack[] = $this->_context; $this->_context = new Zend_Search_Lucene_Search_QueryParserContext($this->_encoding, $this->_context->getField()); } @@ -532,6 +510,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM $query = $this->_context->getQuery(); $this->_context = array_pop($this->_contextStack); + require_once 'Zend/Search/Lucene/Search/QueryEntry/Subquery.php'; $this->_context->addEntry(new Zend_Search_Lucene_Search_QueryEntry_Subquery($query)); } @@ -563,6 +542,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms'); } else if (count($tokens) == 1) { + require_once 'Zend/Search/Lucene/Index/Term.php'; $from = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField()); } else { $from = null; @@ -573,6 +553,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms'); } else if (count($tokens) == 1) { + require_once 'Zend/Search/Lucene/Index/Term.php'; $to = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField()); } else { $to = null; @@ -583,7 +564,9 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM throw new Zend_Search_Lucene_Search_QueryParserException('At least one range query boundary term must be non-empty term'); } + require_once 'Zend/Search/Lucene/Search/Query/Range.php'; $rangeQuery = new Zend_Search_Lucene_Search_Query_Range($from, $to, false); + require_once 'Zend/Search/Lucene/Search/QueryEntry/Subquery.php'; $entry = new Zend_Search_Lucene_Search_QueryEntry_Subquery($rangeQuery); $this->_context->addEntry($entry); } @@ -608,6 +591,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms'); } else if (count($tokens) == 1) { + require_once 'Zend/Search/Lucene/Index/Term.php'; $from = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField()); } else { $from = null; @@ -618,6 +602,7 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM require_once 'Zend/Search/Lucene/Search/QueryParserException.php'; throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms'); } else if (count($tokens) == 1) { + require_once 'Zend/Search/Lucene/Index/Term.php'; $to = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField()); } else { $to = null; @@ -628,7 +613,9 @@ class Zend_Search_Lucene_Search_QueryParser extends Zend_Search_Lucene_FSM throw new Zend_Search_Lucene_Search_QueryParserException('At least one range query boundary term must be non-empty term'); } + require_once 'Zend/Search/Lucene/Search/Query/Range.php'; $rangeQuery = new Zend_Search_Lucene_Search_Query_Range($from, $to, true); + require_once 'Zend/Search/Lucene/Search/QueryEntry/Subquery.php'; $entry = new Zend_Search_Lucene_Search_QueryEntry_Subquery($rangeQuery); $this->_context->addEntry($entry); } diff --git a/libs/Zend/Search/Lucene/Search/QueryParserContext.php b/libs/Zend/Search/Lucene/Search/QueryParserContext.php index 1f3bd92..e81036d 100644 --- a/libs/Zend/Search/Lucene/Search/QueryParserContext.php +++ b/libs/Zend/Search/Lucene/Search/QueryParserContext.php @@ -17,35 +17,12 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: QueryParserContext.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: QueryParserContext.php 18954 2009-11-12 20:01:33Z alexander $ */ -/** Zend_Search_Lucene_FSM */ -require_once 'Zend/Search/Lucene/FSM.php'; - -/** Zend_Search_Lucene_Index_Term */ -require_once 'Zend/Search/Lucene/Index/Term.php'; - /** Zend_Search_Lucene_Search_QueryToken */ require_once 'Zend/Search/Lucene/Search/QueryToken.php'; -/** Zend_Search_Lucene_Search_Query_Term */ -require_once 'Zend/Search/Lucene/Search/Query/Term.php'; - -/** Zend_Search_Lucene_Search_Query_MultiTerm */ -require_once 'Zend/Search/Lucene/Search/Query/MultiTerm.php'; - -/** Zend_Search_Lucene_Search_Query_Boolean */ -require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; - -/** Zend_Search_Lucene_Search_Query_Phrase */ -require_once 'Zend/Search/Lucene/Search/Query/Phrase.php'; - -/** Zend_Search_Lucene_Search_BooleanExpressionRecognizer */ -require_once 'Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php'; - -/** Zend_Search_Lucene_Search_QueryEntry */ -require_once 'Zend/Search/Lucene/Search/QueryEntry.php'; /** * @category Zend @@ -277,8 +254,10 @@ class Zend_Search_Lucene_Search_QueryParserContext */ public function _signStyleExpressionQuery() { + require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; $query = new Zend_Search_Lucene_Search_Query_Boolean(); + require_once 'Zend/Search/Lucene/Search/QueryParser.php'; if (Zend_Search_Lucene_Search_QueryParser::getDefaultOperator() == Zend_Search_Lucene_Search_QueryParser::B_AND) { $defaultSign = true; // required } else { @@ -314,6 +293,7 @@ class Zend_Search_Lucene_Search_QueryParserContext * one or more query entries */ + require_once 'Zend/Search/Lucene/Search/BooleanExpressionRecognizer.php'; $expressionRecognizer = new Zend_Search_Lucene_Search_BooleanExpressionRecognizer(); require_once 'Zend/Search/Lucene/Exception.php'; @@ -373,6 +353,7 @@ class Zend_Search_Lucene_Search_QueryParserContext if (count($conjuction) == 1) { $subqueries[] = $conjuction[0][0]->getQuery($this->_encoding); } else { + require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; $subquery = new Zend_Search_Lucene_Search_Query_Boolean(); foreach ($conjuction as $conjuctionEntry) { @@ -384,6 +365,7 @@ class Zend_Search_Lucene_Search_QueryParserContext } if (count($subqueries) == 0) { + require_once 'Zend/Search/Lucene/Search/Query/Insignificant.php'; return new Zend_Search_Lucene_Search_Query_Insignificant(); } @@ -392,6 +374,7 @@ class Zend_Search_Lucene_Search_QueryParserContext } + require_once 'Zend/Search/Lucene/Search/Query/Boolean.php'; $query = new Zend_Search_Lucene_Search_Query_Boolean(); foreach ($subqueries as $subquery) { diff --git a/libs/Zend/Search/Lucene/Search/Similarity.php b/libs/Zend/Search/Lucene/Search/Similarity.php index cd16414..908c55e 100644 --- a/libs/Zend/Search/Lucene/Search/Similarity.php +++ b/libs/Zend/Search/Lucene/Search/Similarity.php @@ -17,14 +17,10 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Similarity.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Similarity.php 18954 2009-11-12 20:01:33Z alexander $ */ -/** Zend_Search_Lucene_Search_Similarity_Default */ -require_once 'Zend/Search/Lucene/Search/Similarity/Default.php'; - - /** * @category Zend * @package Zend_Search_Lucene @@ -326,6 +322,7 @@ abstract class Zend_Search_Lucene_Search_Similarity public static function getDefault() { if (!self::$_defaultImpl instanceof Zend_Search_Lucene_Search_Similarity) { + require_once 'Zend/Search/Lucene/Search/Similarity/Default.php'; self::$_defaultImpl = new Zend_Search_Lucene_Search_Similarity_Default(); } diff --git a/libs/Zend/Search/Lucene/Search/Weight/MultiTerm.php b/libs/Zend/Search/Lucene/Search/Weight/MultiTerm.php index 445e57b..e652c94 100644 --- a/libs/Zend/Search/Lucene/Search/Weight/MultiTerm.php +++ b/libs/Zend/Search/Lucene/Search/Weight/MultiTerm.php @@ -17,7 +17,7 @@ * @subpackage Search * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MultiTerm.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: MultiTerm.php 18954 2009-11-12 20:01:33Z alexander $ */ @@ -76,6 +76,7 @@ class Zend_Search_Lucene_Search_Weight_MultiTerm extends Zend_Search_Lucene_Sear foreach ($query->getTerms() as $id => $term) { if ($signs === null || $signs[$id] === null || $signs[$id]) { + require_once 'Zend/Search/Lucene/Search/Weight/Term.php'; $this->_weights[$id] = new Zend_Search_Lucene_Search_Weight_Term($term, $query, $reader); $query->setWeight($id, $this->_weights[$id]); } diff --git a/libs/Zend/Search/Lucene/Storage/Directory.php b/libs/Zend/Search/Lucene/Storage/Directory.php index e124ad3..2a716d1 100644 --- a/libs/Zend/Search/Lucene/Storage/Directory.php +++ b/libs/Zend/Search/Lucene/Storage/Directory.php @@ -17,7 +17,7 @@ * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Directory.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Directory.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -64,14 +64,14 @@ abstract class Zend_Search_Lucene_Storage_Directory /** * Purge file if it's cached by directory object - * + * * Method is used to prevent 'too many open files' error * * @param string $filename * @return void */ abstract public function purgeFile($filename); - + /** * Returns true if a file with the given $filename exists. * diff --git a/libs/Zend/Search/Lucene/Storage/Directory/Filesystem.php b/libs/Zend/Search/Lucene/Storage/Directory/Filesystem.php index f44aaa6..85a50f2 100644 --- a/libs/Zend/Search/Lucene/Storage/Directory/Filesystem.php +++ b/libs/Zend/Search/Lucene/Storage/Directory/Filesystem.php @@ -17,16 +17,13 @@ * @subpackage Storage * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Filesystem.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Filesystem.php 18954 2009-11-12 20:01:33Z alexander $ */ /** Zend_Search_Lucene_Storage_Directory */ require_once 'Zend/Search/Lucene/Storage/Directory.php'; -/** Zend_Search_Lucene_Storage_File_Filesystem */ -require_once 'Zend/Search/Lucene/Storage/File/Filesystem.php'; - /** * FileSystem implementation of Directory abstraction. @@ -183,6 +180,7 @@ class Zend_Search_Lucene_Storage_Directory_Filesystem extends Zend_Search_Lucene $this->_fileHandlers[$filename]->close(); } unset($this->_fileHandlers[$filename]); + require_once 'Zend/Search/Lucene/Storage/File/Filesystem.php'; $this->_fileHandlers[$filename] = new Zend_Search_Lucene_Storage_File_Filesystem($this->_dirPath . '/' . $filename, 'w+b'); // Set file permissions, but don't care about any possible failures, since file may be already @@ -347,6 +345,7 @@ class Zend_Search_Lucene_Storage_Directory_Filesystem extends Zend_Search_Lucene { $fullFilename = $this->_dirPath . '/' . $filename; + require_once 'Zend/Search/Lucene/Storage/File/Filesystem.php'; if (!$shareHandler) { return new Zend_Search_Lucene_Storage_File_Filesystem($fullFilename); } diff --git a/libs/Zend/Search/Lucene/TermStreamsPriorityQueue.php b/libs/Zend/Search/Lucene/TermStreamsPriorityQueue.php index f8c4527..73e9aed 100644 --- a/libs/Zend/Search/Lucene/TermStreamsPriorityQueue.php +++ b/libs/Zend/Search/Lucene/TermStreamsPriorityQueue.php @@ -1,176 +1,176 @@ -_termStreams = $termStreams; - - $this->resetTermsStream(); - } - - /** - * Reset terms stream. - */ - public function resetTermsStream() - { - $this->_termsStreamQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue(); - - foreach ($this->_termStreams as $termStream) { - $termStream->resetTermsStream(); - - // Skip "empty" containers - if ($termStream->currentTerm() !== null) { - $this->_termsStreamQueue->put($termStream); - } - } - - $this->nextTerm(); - } - - /** - * Skip terms stream up to specified term preffix. - * - * Prefix contains fully specified field info and portion of searched term - * - * @param Zend_Search_Lucene_Index_Term $prefix - */ - public function skipTo(Zend_Search_Lucene_Index_Term $prefix) - { - $termStreams = array(); - - while (($termStream = $this->_termsStreamQueue->pop()) !== null) { - $termStreams[] = $termStream; - } - - foreach ($termStreams as $termStream) { - $termStream->skipTo($prefix); - - if ($termStream->currentTerm() !== null) { - $this->_termsStreamQueue->put($termStream); - } - } - - $this->nextTerm(); - } - - /** - * Scans term streams and returns next term - * - * @return Zend_Search_Lucene_Index_Term|null - */ - public function nextTerm() - { - while (($termStream = $this->_termsStreamQueue->pop()) !== null) { - if ($this->_termsStreamQueue->top() === null || - $this->_termsStreamQueue->top()->currentTerm()->key() != - $termStream->currentTerm()->key()) { - // We got new term - $this->_lastTerm = $termStream->currentTerm(); - - if ($termStream->nextTerm() !== null) { - // Put segment back into the priority queue - $this->_termsStreamQueue->put($termStream); - } - - return $this->_lastTerm; - } - - if ($termStream->nextTerm() !== null) { - // Put segment back into the priority queue - $this->_termsStreamQueue->put($termStream); - } - } - - // End of stream - $this->_lastTerm = null; - - return null; - } - - /** - * Returns term in current position - * - * @return Zend_Search_Lucene_Index_Term|null - */ - public function currentTerm() - { - return $this->_lastTerm; - } - - /** - * Close terms stream - * - * Should be used for resources clean up if stream is not read up to the end - */ - public function closeTermsStream() - { - while (($termStream = $this->_termsStreamQueue->pop()) !== null) { - $termStream->closeTermsStream(); - } - - $this->_termsStreamQueue = null; - $this->_lastTerm = null; - } -} +_termStreams = $termStreams; + + $this->resetTermsStream(); + } + + /** + * Reset terms stream. + */ + public function resetTermsStream() + { + /** Zend_Search_Lucene_Index_TermsPriorityQueue */ + require_once 'Zend/Search/Lucene/Index/TermsPriorityQueue.php'; + + $this->_termsStreamQueue = new Zend_Search_Lucene_Index_TermsPriorityQueue(); + + foreach ($this->_termStreams as $termStream) { + $termStream->resetTermsStream(); + + // Skip "empty" containers + if ($termStream->currentTerm() !== null) { + $this->_termsStreamQueue->put($termStream); + } + } + + $this->nextTerm(); + } + + /** + * Skip terms stream up to specified term preffix. + * + * Prefix contains fully specified field info and portion of searched term + * + * @param Zend_Search_Lucene_Index_Term $prefix + */ + public function skipTo(Zend_Search_Lucene_Index_Term $prefix) + { + $termStreams = array(); + + while (($termStream = $this->_termsStreamQueue->pop()) !== null) { + $termStreams[] = $termStream; + } + + foreach ($termStreams as $termStream) { + $termStream->skipTo($prefix); + + if ($termStream->currentTerm() !== null) { + $this->_termsStreamQueue->put($termStream); + } + } + + $this->nextTerm(); + } + + /** + * Scans term streams and returns next term + * + * @return Zend_Search_Lucene_Index_Term|null + */ + public function nextTerm() + { + while (($termStream = $this->_termsStreamQueue->pop()) !== null) { + if ($this->_termsStreamQueue->top() === null || + $this->_termsStreamQueue->top()->currentTerm()->key() != + $termStream->currentTerm()->key()) { + // We got new term + $this->_lastTerm = $termStream->currentTerm(); + + if ($termStream->nextTerm() !== null) { + // Put segment back into the priority queue + $this->_termsStreamQueue->put($termStream); + } + + return $this->_lastTerm; + } + + if ($termStream->nextTerm() !== null) { + // Put segment back into the priority queue + $this->_termsStreamQueue->put($termStream); + } + } + + // End of stream + $this->_lastTerm = null; + + return null; + } + + /** + * Returns term in current position + * + * @return Zend_Search_Lucene_Index_Term|null + */ + public function currentTerm() + { + return $this->_lastTerm; + } + + /** + * Close terms stream + * + * Should be used for resources clean up if stream is not read up to the end + */ + public function closeTermsStream() + { + while (($termStream = $this->_termsStreamQueue->pop()) !== null) { + $termStream->closeTermsStream(); + } + + $this->_termsStreamQueue = null; + $this->_lastTerm = null; + } +} diff --git a/libs/Zend/Server/Abstract.php b/libs/Zend/Server/Abstract.php index 305722c..ac470cb 100644 --- a/libs/Zend/Server/Abstract.php +++ b/libs/Zend/Server/Abstract.php @@ -53,7 +53,7 @@ require_once 'Zend/Server/Method/Parameter.php'; * @package Zend_Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16210 2009-06-21 19:22:17Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ abstract class Zend_Server_Abstract implements Zend_Server_Interface { @@ -90,7 +90,7 @@ abstract class Zend_Server_Abstract implements Zend_Server_Interface * Constructor * * Setup server description - * + * * @return void */ public function __construct() @@ -115,7 +115,7 @@ abstract class Zend_Server_Abstract implements Zend_Server_Interface * Lowercase a string * * Lowercase's a string by reference - * + * * @deprecated * @param string $string value * @param string $key @@ -129,8 +129,8 @@ abstract class Zend_Server_Abstract implements Zend_Server_Interface /** * Build callback for method signature - * - * @param Zend_Server_Reflection_Function_Abstract $reflection + * + * @param Zend_Server_Reflection_Function_Abstract $reflection * @return Zend_Server_Method_Callback */ protected function _buildCallback(Zend_Server_Reflection_Function_Abstract $reflection) @@ -149,8 +149,8 @@ abstract class Zend_Server_Abstract implements Zend_Server_Interface /** * Build a method signature - * - * @param Zend_Server_Reflection_Function_Abstract $reflection + * + * @param Zend_Server_Reflection_Function_Abstract $reflection * @param null|string|object $class * @return Zend_Server_Method_Definition * @throws Zend_Server_Exception on duplicate entry @@ -197,9 +197,9 @@ abstract class Zend_Server_Abstract implements Zend_Server_Interface /** * Dispatch method - * - * @param Zend_Server_Method_Definition $invocable - * @param array $params + * + * @param Zend_Server_Method_Definition $invocable + * @param array $params * @return mixed */ protected function _dispatch(Zend_Server_Method_Definition $invocable, array $params) @@ -234,8 +234,8 @@ abstract class Zend_Server_Abstract implements Zend_Server_Interface /** * Map PHP type to protocol type - * - * @param string $type + * + * @param string $type * @return string */ abstract protected function _fixType($type); diff --git a/libs/Zend/Server/Cache.php b/libs/Zend/Server/Cache.php index 8567411..1378182 100644 --- a/libs/Zend/Server/Cache.php +++ b/libs/Zend/Server/Cache.php @@ -16,7 +16,7 @@ * @package Zend_Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Cache.php 16210 2009-06-21 19:22:17Z thomas $ + * @version $Id: Cache.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -78,10 +78,10 @@ class Zend_Server_Cache /** * Load server definition from a file * - * Unserializes a stored server definition from $filename. Returns false if + * Unserializes a stored server definition from $filename. Returns false if * it fails in any way, true on success. * - * Useful to prevent needing to build the server definition on each + * Useful to prevent needing to build the server definition on each * request. Sample usage: * * diff --git a/libs/Zend/Server/Definition.php b/libs/Zend/Server/Definition.php index ca4b8af..37706e9 100644 --- a/libs/Zend/Server/Definition.php +++ b/libs/Zend/Server/Definition.php @@ -16,7 +16,7 @@ * @package Zend_Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Definition.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Definition.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -42,8 +42,8 @@ class Zend_Server_Definition implements Countable, Iterator /** * Constructor - * - * @param null|array $methods + * + * @param null|array $methods * @return void */ public function __construct($methods = null) @@ -55,8 +55,8 @@ class Zend_Server_Definition implements Countable, Iterator /** * Set flag indicating whether or not overwriting existing methods is allowed - * - * @param mixed $flag + * + * @param mixed $flag * @return void */ public function setOverwriteExistingMethods($flag) @@ -67,9 +67,9 @@ class Zend_Server_Definition implements Countable, Iterator /** * Add method to definition - * - * @param array|Zend_Server_Method_Definition $method - * @param null|string $name + * + * @param array|Zend_Server_Method_Definition $method + * @param null|string $name * @return Zend_Server_Definition * @throws Zend_Server_Exception if duplicate or invalid method provided */ @@ -106,7 +106,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Add multiple methods - * + * * @param array $methods Array of Zend_Server_Method_Definition objects or arrays * @return Zend_Server_Definition */ @@ -120,7 +120,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Set all methods at once (overwrite) - * + * * @param array $methods Array of Zend_Server_Method_Definition objects or arrays * @return Zend_Server_Definition */ @@ -133,8 +133,8 @@ class Zend_Server_Definition implements Countable, Iterator /** * Does the definition have the given method? - * - * @param string $method + * + * @param string $method * @return bool */ public function hasMethod($method) @@ -144,8 +144,8 @@ class Zend_Server_Definition implements Countable, Iterator /** * Get a given method definition - * - * @param string $method + * + * @param string $method * @return null|Zend_Server_Method_Definition */ public function getMethod($method) @@ -158,7 +158,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Get all method definitions - * + * * @return array Array of Zend_Server_Method_Definition objects */ public function getMethods() @@ -168,8 +168,8 @@ class Zend_Server_Definition implements Countable, Iterator /** * Remove a method definition - * - * @param string $method + * + * @param string $method * @return Zend_Server_Definition */ public function removeMethod($method) @@ -182,7 +182,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Clear all method definitions - * + * * @return Zend_Server_Definition */ public function clearMethods() @@ -193,7 +193,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Cast definition to an array - * + * * @return array */ public function toArray() @@ -207,7 +207,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Countable: count of methods - * + * * @return int */ public function count() @@ -217,7 +217,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Iterator: current item - * + * * @return mixed */ public function current() @@ -227,7 +227,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Iterator: current item key - * + * * @return int|string */ public function key() @@ -237,7 +237,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Iterator: advance to next method - * + * * @return void */ public function next() @@ -247,7 +247,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Iterator: return to first method - * + * * @return void */ public function rewind() @@ -257,7 +257,7 @@ class Zend_Server_Definition implements Countable, Iterator /** * Iterator: is the current index valid? - * + * * @return bool */ public function valid() diff --git a/libs/Zend/Server/Method/Callback.php b/libs/Zend/Server/Method/Callback.php index d01e540..dd890ae 100644 --- a/libs/Zend/Server/Method/Callback.php +++ b/libs/Zend/Server/Method/Callback.php @@ -17,7 +17,7 @@ * @subpackage Method * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Callback.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Callback.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -58,8 +58,8 @@ class Zend_Server_Method_Callback /** * Constructor - * - * @param null|array $options + * + * @param null|array $options * @return void */ public function __construct($options = null) @@ -71,8 +71,8 @@ class Zend_Server_Method_Callback /** * Set object state from array of options - * - * @param array $options + * + * @param array $options * @return Zend_Server_Method_Callback */ public function setOptions(array $options) @@ -88,8 +88,8 @@ class Zend_Server_Method_Callback /** * Set callback class - * - * @param string $class + * + * @param string $class * @return Zend_Server_Method_Callback */ public function setClass($class) @@ -103,7 +103,7 @@ class Zend_Server_Method_Callback /** * Get callback class - * + * * @return string|null */ public function getClass() @@ -113,8 +113,8 @@ class Zend_Server_Method_Callback /** * Set callback function - * - * @param string $function + * + * @param string $function * @return Zend_Server_Method_Callback */ public function setFunction($function) @@ -126,7 +126,7 @@ class Zend_Server_Method_Callback /** * Get callback function - * + * * @return null|string */ public function getFunction() @@ -136,8 +136,8 @@ class Zend_Server_Method_Callback /** * Set callback class method - * - * @param string $method + * + * @param string $method * @return Zend_Server_Method_Callback */ public function setMethod($method) @@ -148,7 +148,7 @@ class Zend_Server_Method_Callback /** * Get callback class method - * + * * @return null|string */ public function getMethod() @@ -158,8 +158,8 @@ class Zend_Server_Method_Callback /** * Set callback type - * - * @param string $type + * + * @param string $type * @return Zend_Server_Method_Callback * @throws Zend_Server_Exception */ @@ -175,7 +175,7 @@ class Zend_Server_Method_Callback /** * Get callback type - * + * * @return string */ public function getType() @@ -185,7 +185,7 @@ class Zend_Server_Method_Callback /** * Cast callback to array - * + * * @return array */ public function toArray() diff --git a/libs/Zend/Server/Method/Definition.php b/libs/Zend/Server/Method/Definition.php index fe18648..caa8e05 100644 --- a/libs/Zend/Server/Method/Definition.php +++ b/libs/Zend/Server/Method/Definition.php @@ -17,7 +17,7 @@ * @subpackage Method * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Definition.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Definition.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -63,8 +63,8 @@ class Zend_Server_Method_Definition /** * Constructor - * - * @param null|array $options + * + * @param null|array $options * @return void */ public function __construct($options = null) @@ -76,8 +76,8 @@ class Zend_Server_Method_Definition /** * Set object state from options - * - * @param array $options + * + * @param array $options * @return Zend_Server_Method_Definition */ public function setOptions(array $options) @@ -93,8 +93,8 @@ class Zend_Server_Method_Definition /** * Set method name - * - * @param string $name + * + * @param string $name * @return Zend_Server_Method_Definition */ public function setName($name) @@ -105,7 +105,7 @@ class Zend_Server_Method_Definition /** * Get method name - * + * * @return string */ public function getName() @@ -115,8 +115,8 @@ class Zend_Server_Method_Definition /** * Set method callback - * - * @param array|Zend_Server_Method_Callback $callback + * + * @param array|Zend_Server_Method_Callback $callback * @return Zend_Server_Method_Definition */ public function setCallback($callback) @@ -134,7 +134,7 @@ class Zend_Server_Method_Definition /** * Get method callback - * + * * @return Zend_Server_Method_Callback */ public function getCallback() @@ -144,8 +144,8 @@ class Zend_Server_Method_Definition /** * Add prototype to method definition - * - * @param array|Zend_Server_Method_Prototype $prototype + * + * @param array|Zend_Server_Method_Prototype $prototype * @return Zend_Server_Method_Definition */ public function addPrototype($prototype) @@ -163,7 +163,7 @@ class Zend_Server_Method_Definition /** * Add multiple prototypes at once - * + * * @param array $prototypes Array of Zend_Server_Method_Prototype objects or arrays * @return Zend_Server_Method_Definition */ @@ -177,7 +177,7 @@ class Zend_Server_Method_Definition /** * Set all prototypes at once (overwrites) - * + * * @param array $prototypes Array of Zend_Server_Method_Prototype objects or arrays * @return Zend_Server_Method_Definition */ @@ -190,7 +190,7 @@ class Zend_Server_Method_Definition /** * Get all prototypes - * + * * @return array $prototypes Array of Zend_Server_Method_Prototype objects or arrays */ public function getPrototypes() @@ -200,8 +200,8 @@ class Zend_Server_Method_Definition /** * Set method help - * - * @param string $methodHelp + * + * @param string $methodHelp * @return Zend_Server_Method_Definition */ public function setMethodHelp($methodHelp) @@ -212,7 +212,7 @@ class Zend_Server_Method_Definition /** * Get method help - * + * * @return string */ public function getMethodHelp() @@ -222,8 +222,8 @@ class Zend_Server_Method_Definition /** * Set object to use with method calls - * - * @param object $object + * + * @param object $object * @return Zend_Server_Method_Definition */ public function setObject($object) @@ -238,7 +238,7 @@ class Zend_Server_Method_Definition /** * Get object to use with method calls - * + * * @return null|object */ public function getObject() @@ -270,7 +270,7 @@ class Zend_Server_Method_Definition /** * Serialize to array - * + * * @return array */ public function toArray() diff --git a/libs/Zend/Server/Method/Parameter.php b/libs/Zend/Server/Method/Parameter.php index 0dce29f..09f3d2e 100644 --- a/libs/Zend/Server/Method/Parameter.php +++ b/libs/Zend/Server/Method/Parameter.php @@ -17,7 +17,7 @@ * @subpackage Method * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Parameter.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Parameter.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -58,8 +58,8 @@ class Zend_Server_Method_Parameter /** * Constructor - * - * @param null|array $options + * + * @param null|array $options * @return void */ public function __construct($options = null) @@ -71,8 +71,8 @@ class Zend_Server_Method_Parameter /** * Set object state from array of options - * - * @param array $options + * + * @param array $options * @return Zend_Server_Method_Parameter */ public function setOptions(array $options) @@ -154,8 +154,8 @@ class Zend_Server_Method_Parameter /** * Set optional flag - * - * @param bool $flag + * + * @param bool $flag * @return Zend_Server_Method_Parameter */ public function setOptional($flag) @@ -166,7 +166,7 @@ class Zend_Server_Method_Parameter /** * Is the parameter optional? - * + * * @return bool */ public function isOptional() @@ -176,8 +176,8 @@ class Zend_Server_Method_Parameter /** * Set parameter type - * - * @param string $type + * + * @param string $type * @return Zend_Server_Method_Parameter */ public function setType($type) @@ -188,7 +188,7 @@ class Zend_Server_Method_Parameter /** * Retrieve parameter type - * + * * @return string */ public function getType() @@ -198,7 +198,7 @@ class Zend_Server_Method_Parameter /** * Cast to array - * + * * @return array */ public function toArray() diff --git a/libs/Zend/Server/Method/Prototype.php b/libs/Zend/Server/Method/Prototype.php index 8b31778..3107f84 100644 --- a/libs/Zend/Server/Method/Prototype.php +++ b/libs/Zend/Server/Method/Prototype.php @@ -17,7 +17,7 @@ * @subpackage Method * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Prototype.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Prototype.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -47,9 +47,9 @@ class Zend_Server_Method_Prototype protected $_parameters = array(); /** - * Constructor - * - * @param null|array $options + * Constructor + * + * @param null|array $options * @return void */ public function __construct($options = null) @@ -83,8 +83,8 @@ class Zend_Server_Method_Prototype /** * Add a parameter - * - * @param string $parameter + * + * @param string $parameter * @return Zend_Server_Method_Prototype */ public function addParameter($parameter) @@ -106,8 +106,8 @@ class Zend_Server_Method_Prototype /** * Add parameters - * - * @param array $parameter + * + * @param array $parameter * @return Zend_Server_Method_Prototype */ public function addParameters(array $parameters) @@ -148,7 +148,7 @@ class Zend_Server_Method_Prototype /** * Get parameter objects - * + * * @return array */ public function getParameterObjects() @@ -158,8 +158,8 @@ class Zend_Server_Method_Prototype /** * Retrieve a single parameter by name or index - * - * @param string|int $index + * + * @param string|int $index * @return null|Zend_Server_Method_Parameter */ public function getParameter($index) @@ -178,8 +178,8 @@ class Zend_Server_Method_Prototype /** * Set object state from array - * - * @param array $options + * + * @param array $options * @return Zend_Server_Method_Prototype */ public function setOptions(array $options) @@ -195,7 +195,7 @@ class Zend_Server_Method_Prototype /** * Serialize to array - * + * * @return array */ public function toArray() diff --git a/libs/Zend/Service/Akismet.php b/libs/Zend/Service/Akismet.php index 4eb6c14..d002674 100644 --- a/libs/Zend/Service/Akismet.php +++ b/libs/Zend/Service/Akismet.php @@ -17,7 +17,7 @@ * @subpackage Akismet * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Akismet.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Akismet.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -26,7 +26,7 @@ */ require_once 'Zend/Version.php'; -/** +/** * @see Zend_Service_Abstract */ require_once 'Zend/Service/Abstract.php'; diff --git a/libs/Zend/Service/Amazon.php b/libs/Zend/Service/Amazon.php index 42dd8ad..1fc99cc 100644 --- a/libs/Zend/Service/Amazon.php +++ b/libs/Zend/Service/Amazon.php @@ -18,7 +18,7 @@ * @subpackage Amazon * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Amazon.php 17146 2009-07-26 13:25:34Z beberlei $ + * @version $Id: Amazon.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -44,7 +44,7 @@ class Zend_Service_Amazon /** * @var string - */ + */ protected $_secretKey = null; /** diff --git a/libs/Zend/Service/Amazon/Abstract.php b/libs/Zend/Service/Amazon/Abstract.php index 360df36..5b7f4a7 100644 --- a/libs/Zend/Service/Amazon/Abstract.php +++ b/libs/Zend/Service/Amazon/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Amazon * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18926 2009-11-10 19:16:03Z sidhighwind $ */ require_once 'Zend/Service/Abstract.php'; diff --git a/libs/Zend/Service/Amazon/Ec2/Abstract.php b/libs/Zend/Service/Amazon/Ec2/Abstract.php index 44c3fdf..f828c67 100644 --- a/libs/Zend/Service/Amazon/Ec2/Abstract.php +++ b/libs/Zend/Service/Amazon/Ec2/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Ec2 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18926 2009-11-10 19:16:03Z sidhighwind $ */ require_once 'Zend/Service/Amazon/Abstract.php'; diff --git a/libs/Zend/Service/Amazon/Ec2/CloudWatch.php b/libs/Zend/Service/Amazon/Ec2/CloudWatch.php index 1a50225..64da527 100644 --- a/libs/Zend/Service/Amazon/Ec2/CloudWatch.php +++ b/libs/Zend/Service/Amazon/Ec2/CloudWatch.php @@ -17,7 +17,7 @@ * @subpackage Ec2 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CloudWatch.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CloudWatch.php 19067 2009-11-19 22:13:54Z sidhighwind $ */ require_once 'Zend/Service/Amazon/Ec2/Abstract.php'; @@ -274,8 +274,12 @@ class Zend_Service_Amazon_Ec2_CloudWatch extends Zend_Service_Amazon_Ec2_Abstrac $x = 1; foreach($options['Dimensions'] as $dimKey=>$dimVal) { if(!in_array($dimKey, $this->_validDimensionsKeys, true)) continue; - $options[$dimKey . '.member.' . $x++] = $dimVal; + $options['Dimensions.member.' . $x . '.Name'] = $dimKey; + $options['Dimensions.member.' . $x . '.Value'] = $dimVal; + $x++; } + + unset($options['Dimensions']); } $params = array_merge($params, $options); @@ -310,8 +314,8 @@ class Zend_Service_Amazon_Ec2_CloudWatch extends Zend_Service_Amazon_Ec2_Abstrac * Return the Metrics that are aviable for your current monitored instances * * @param string $nextToken The NextToken parameter is an optional parameter - * that allows you to retrieve the next set of results - * for your ListMetrics query. + * that allows you to retrieve the next set of results + * for your ListMetrics query. * @return array */ public function listMetrics($nextToken = null) diff --git a/libs/Zend/Service/Amazon/Ec2/Securitygroups.php b/libs/Zend/Service/Amazon/Ec2/Securitygroups.php index f1d6bd9..873d16b 100644 --- a/libs/Zend/Service/Amazon/Ec2/Securitygroups.php +++ b/libs/Zend/Service/Amazon/Ec2/Securitygroups.php @@ -17,7 +17,7 @@ * @subpackage Ec2 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Securitygroups.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Securitygroups.php 18096 2009-09-13 17:39:19Z sidhighwind $ */ require_once 'Zend/Service/Amazon/Ec2/Abstract.php'; @@ -106,7 +106,17 @@ class Zend_Service_Amazon_Ec2_Securitygroups extends Zend_Service_Amazon_Ec2_Abs $sItem['ipProtocol'] = $xpath->evaluate('string(ec2:ipProtocol/text())', $ip_node); $sItem['fromPort'] = $xpath->evaluate('string(ec2:fromPort/text())', $ip_node); $sItem['toPort'] = $xpath->evaluate('string(ec2:toPort/text())', $ip_node); - $sItem['ipRanges'] = $xpath->evaluate('string(ec2:ipRanges/ec2:item/ec2:cidrIp/text())', $ip_node); + + $ips = $xpath->query('ec2:ipRanges/ec2:item', $ip_node); + + $sItem['ipRanges'] = array(); + foreach($ips as $ip) { + $sItem['ipRanges'][] = $xpath->evaluate('string(ec2:cidrIp/text())', $ip); + } + + if(count($sItem['ipRanges']) == 1) { + $sItem['ipRanges'] = $sItem['ipRanges'][0]; + } $item['ipPermissions'][] = $sItem; unset($ip_node, $sItem); diff --git a/libs/Zend/Service/Amazon/Exception.php b/libs/Zend/Service/Amazon/Exception.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Service/Amazon/S3.php b/libs/Zend/Service/Amazon/S3.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Service/Amazon/S3/Exception.php b/libs/Zend/Service/Amazon/S3/Exception.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Service/Amazon/S3/Stream.php b/libs/Zend/Service/Amazon/S3/Stream.php old mode 100755 new mode 100644 index 6d1a5f1..fcbe330 --- a/libs/Zend/Service/Amazon/S3/Stream.php +++ b/libs/Zend/Service/Amazon/S3/Stream.php @@ -17,7 +17,7 @@ * @subpackage Amazon_S3 * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Stream.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Stream.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -331,13 +331,13 @@ class Zend_Service_Amazon_S3_Stream $stat['blksize'] = 0; $stat['blocks'] = 0; - if(($slash = strchr($this->_objectName, '/')) === false || $slash == strlen($this->_objectName)-1) { - /* bucket */ - $stat['mode'] |= 040000; - } else { - $stat['mode'] |= 0100000; - } - $info = $this->_s3->getInfo($this->_objectName); + if(($slash = strchr($this->_objectName, '/')) === false || $slash == strlen($this->_objectName)-1) { + /* bucket */ + $stat['mode'] |= 040000; + } else { + $stat['mode'] |= 0100000; + } + $info = $this->_s3->getInfo($this->_objectName); if (!empty($info)) { $stat['size'] = $info['size']; $stat['atime'] = time(); @@ -441,14 +441,14 @@ class Zend_Service_Amazon_S3_Stream $stat['blksize'] = 0; $stat['blocks'] = 0; - $name = $this->_getNamePart($path); - if(($slash = strchr($name, '/')) === false || $slash == strlen($name)-1) { - /* bucket */ - $stat['mode'] |= 040000; - } else { - $stat['mode'] |= 0100000; - } - $info = $this->_getS3Client($path)->getInfo($name); + $name = $this->_getNamePart($path); + if(($slash = strchr($name, '/')) === false || $slash == strlen($name)-1) { + /* bucket */ + $stat['mode'] |= 040000; + } else { + $stat['mode'] |= 0100000; + } + $info = $this->_getS3Client($path)->getInfo($name); if (!empty($info)) { $stat['size'] = $info['size']; diff --git a/libs/Zend/Service/Audioscrobbler.php b/libs/Zend/Service/Audioscrobbler.php index 1bb2a33..f3bc32e 100644 --- a/libs/Zend/Service/Audioscrobbler.php +++ b/libs/Zend/Service/Audioscrobbler.php @@ -18,7 +18,7 @@ * @subpackage Audioscrobbler * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Audioscrobbler.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Audioscrobbler.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -76,7 +76,7 @@ class Zend_Service_Audioscrobbler /** * Set Http Client - * + * * @param Zend_Http_Client $client */ public function setHttpClient(Zend_Http_Client $client) @@ -86,7 +86,7 @@ class Zend_Service_Audioscrobbler /** * Get current http client. - * + * * @return Zend_Http_Client */ public function getHttpClient() @@ -201,7 +201,7 @@ class Zend_Service_Audioscrobbler /** * Utility function to get Audioscrobbler profile information (eg: Name, Gender) - * + * * @return array containing information */ public function userGetProfileInformation() @@ -212,7 +212,7 @@ class Zend_Service_Audioscrobbler /** * Utility function get this user's 50 most played artists - * + * * @return array containing info */ public function userGetTopArtists() @@ -244,7 +244,7 @@ class Zend_Service_Audioscrobbler /** * Utility function to get this user's 50 most used tags - * + * * @return SimpleXMLElement object containing result set */ public function userGetTopTags() @@ -301,7 +301,7 @@ class Zend_Service_Audioscrobbler /** * Utility function that returns a list of people with similar listening preferences to this user - * + * * @return SimpleXMLElement object containing result set */ public function userGetNeighbours() @@ -445,7 +445,7 @@ class Zend_Service_Audioscrobbler /** * Utility function that returns a list of this artist's top-rated tracks - * + * * @return SimpleXMLElement object containing result set */ public function artistGetTopTracks() @@ -456,7 +456,7 @@ class Zend_Service_Audioscrobbler /** * Utility function that returns a list of this artist's top-rated albums - * + * * @return SimpleXMLElement object containing result set */ public function artistGetTopAlbums() @@ -467,7 +467,7 @@ class Zend_Service_Audioscrobbler /** * Utility function that returns a list of this artist's top-rated tags - * + * * @return SimpleXMLElement object containing result set */ public function artistGetTopTags() @@ -490,7 +490,7 @@ class Zend_Service_Audioscrobbler /** * Get top fans of the current track. - * + * * @return SimpleXMLElement */ public function trackGetTopFans() @@ -534,7 +534,7 @@ class Zend_Service_Audioscrobbler /** * Get top artists by current tag. - * + * * @return SimpleXMLElement */ public function tagGetTopArtists() @@ -611,7 +611,7 @@ class Zend_Service_Audioscrobbler /** * Retrieve Weekly album charts. - * + * * @param int $from * @param int $to * @return SimpleXMLElement diff --git a/libs/Zend/Service/Delicious.php b/libs/Zend/Service/Delicious.php index f4217e0..77e1e21 100644 --- a/libs/Zend/Service/Delicious.php +++ b/libs/Zend/Service/Delicious.php @@ -18,7 +18,7 @@ * @subpackage Delicious * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Delicious.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Delicious.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -426,10 +426,10 @@ class Zend_Service_Delicious $path = sprintf(self::JSON_FANS, $user); return $this->makeRequest($path, array(), 'json'); } - + /** * Get details on a particular bookmarked URL - * + * * Returned array contains four elements: * - hash - md5 hash of URL * - top_tags - array of tags and their respective usage counts @@ -439,14 +439,14 @@ class Zend_Service_Delicious * If URL hasen't been bookmarked null is returned. * * @param string $url URL for which to get details - * @return array + * @return array */ - public function getUrlDetails($url) + public function getUrlDetails($url) { $parms = array('hash' => md5($url)); - + $res = $this->makeRequest(self::JSON_URL, $parms, 'json'); - + if(isset($res[0])) { return $res[0]; } else { diff --git a/libs/Zend/Service/Flickr.php b/libs/Zend/Service/Flickr.php index c04e3f9..8921447 100644 --- a/libs/Zend/Service/Flickr.php +++ b/libs/Zend/Service/Flickr.php @@ -18,7 +18,7 @@ * @subpackage Flickr * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Flickr.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Flickr.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -192,7 +192,7 @@ class Zend_Service_Flickr require_once 'Zend/Service/Flickr/ResultSet.php'; return new Zend_Service_Flickr_ResultSet($dom, $this); } - + /** * Finds photos in a group's pool. * @@ -509,8 +509,8 @@ class Zend_Service_Flickr } } - - + + /** * Validate Group Search Options * @@ -542,7 +542,7 @@ class Zend_Service_Flickr */ require_once 'Zend/Validate/Int.php'; $int = new Zend_Validate_Int(); - + if (!$int->isValid($options['page'])) { /** * @see Zend_Service_Exception diff --git a/libs/Zend/Service/Nirvanix.php b/libs/Zend/Service/Nirvanix.php index 94eaf20..1893346 100644 --- a/libs/Zend/Service/Nirvanix.php +++ b/libs/Zend/Service/Nirvanix.php @@ -17,9 +17,9 @@ * @subpackage Nirvanix * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Nirvanix.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Nirvanix.php 18951 2009-11-12 16:26:19Z alexander $ */ - + /** * @see Zend_Http_Client */ @@ -45,7 +45,7 @@ class Zend_Service_Nirvanix protected $_options; /** - * Class constructor. Authenticates with Nirvanix to receive a + * Class constructor. Authenticates with Nirvanix to receive a * sessionToken, which is then passed to each future request. * * @param array $authParams Authentication POST parameters. This @@ -64,7 +64,7 @@ class Zend_Service_Nirvanix // login and save sessionToken to default POST params $resp = $this->getService('Authentication')->login($authParams); $this->_options['defaults']['sessionToken'] = (string)$resp->SessionToken; - } + } /** * Nirvanix divides its service into namespaces, with each namespace @@ -93,7 +93,7 @@ class Zend_Service_Nirvanix } return new $class($options); } - + /** * Get the configured options. * diff --git a/libs/Zend/Service/Nirvanix/Namespace/Base.php b/libs/Zend/Service/Nirvanix/Namespace/Base.php index 150d41a..c4a879e 100644 --- a/libs/Zend/Service/Nirvanix/Namespace/Base.php +++ b/libs/Zend/Service/Nirvanix/Namespace/Base.php @@ -17,9 +17,9 @@ * @subpackage Nirvanix * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Base.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Base.php 18951 2009-11-12 16:26:19Z alexander $ */ - + /** * @see Zend_Http_Client */ @@ -34,7 +34,7 @@ require_once 'Zend/Service/Nirvanix/Response.php'; * The Nirvanix web services are split into namespaces. This is a proxy class * representing one namespace. It allows calls to the namespace to be made by * PHP object calls rather than by having to construct HTTP client requests. - * + * * @category Zend * @package Zend_Service * @subpackage Nirvanix @@ -49,7 +49,7 @@ class Zend_Service_Nirvanix_Namespace_Base * @var Zend_Http_Client */ protected $_httpClient; - + /** * Host to use for calls to this Nirvanix namespace. It is possible * that the user will wish to use different hosts for different namespaces. @@ -67,19 +67,19 @@ class Zend_Service_Nirvanix_Namespace_Base * Defaults for POST parameters. When a request to the service is to be * made, the POST parameters are merged into these. This is a convenience * feature so parameters that are repeatedly required like sessionToken - * do not need to be supplied again and again by the user. + * do not need to be supplied again and again by the user. * * @param array */ - protected $_defaults = array(); + protected $_defaults = array(); /** - * Class constructor. + * Class constructor. * * @param $options array Options and dependency injection */ public function __construct($options = array()) - { + { if (isset($options['baseUrl'])) { $this->_host = $options['baseUrl']; } @@ -97,19 +97,19 @@ class Zend_Service_Nirvanix_Namespace_Base } $this->_httpClient = $options['httpClient']; } - + /** * When a method call is made against this proxy, convert it to - * an HTTP request to make against the Nirvanix REST service. + * an HTTP request to make against the Nirvanix REST service. * * $imfs->DeleteFiles(array('filePath' => 'foo')); * - * Assuming this object was proxying the IMFS namespace, the + * Assuming this object was proxying the IMFS namespace, the * method call above would call the DeleteFiles command. The - * POST parameters would be filePath, merged with the + * POST parameters would be filePath, merged with the * $this->_defaults (containing the sessionToken). * - * @param string $methodName Name of the command to call + * @param string $methodName Name of the command to call * on this namespace. * @param array $args Only the first is used and it must be * an array. It contains the POST params. @@ -121,7 +121,7 @@ class Zend_Service_Nirvanix_Namespace_Base $uri = $this->_makeUri($methodName); $this->_httpClient->setUri($uri); - if (!isset($args[0]) || !is_array($args[0])) { + if (!isset($args[0]) || !is_array($args[0])) { $args[0] = array(); } @@ -148,19 +148,19 @@ class Zend_Service_Nirvanix_Namespace_Base /** * Make a complete URI from an RPC method name. All Nirvanix REST * service URIs use the same format. - * + * * @param string $methodName RPC method name - * @return string + * @return string */ protected function _makeUri($methodName) { $methodName = ucfirst($methodName); return "{$this->_host}/ws/{$this->_namespace}/{$methodName}.ashx"; } - + /** * All Nirvanix REST service calls return an XML payload. This method - * makes a Zend_Service_Nirvanix_Response from that XML payload. + * makes a Zend_Service_Nirvanix_Response from that XML payload. * * @param Zend_Http_Response $httpResponse Raw response from Nirvanix * @return Zend_Service_Nirvanix_Response Wrapped response diff --git a/libs/Zend/Service/Nirvanix/Namespace/Imfs.php b/libs/Zend/Service/Nirvanix/Namespace/Imfs.php index f128926..06a4b98 100644 --- a/libs/Zend/Service/Nirvanix/Namespace/Imfs.php +++ b/libs/Zend/Service/Nirvanix/Namespace/Imfs.php @@ -17,17 +17,17 @@ * @subpackage Nirvanix * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Imfs.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Imfs.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * @see Zend_Service_Nirvanix_Namespace_Base */ -require_once 'Zend/Service/Nirvanix/Namespace/Base.php'; - +require_once 'Zend/Service/Nirvanix/Namespace/Base.php'; + /** * Namespace proxy with additional convenience methods for the IMFS namespace. - * + * * @category Zend * @package Zend_Service * @subpackage Nirvanix @@ -43,7 +43,7 @@ class Zend_Service_Nirvanix_Namespace_Imfs extends Zend_Service_Nirvanix_Namespa * @param string $filePath Remote path and filename * @param integer $expiration Number of seconds that Nirvanix * make the file available for download. - * @return string Contents of file + * @return string Contents of file */ public function getContents($filePath, $expiration = 3600) { @@ -82,13 +82,13 @@ class Zend_Service_Nirvanix_Namespace_Imfs extends Zend_Service_Nirvanix_Namespa $this->_httpClient->resetParameters(); $this->_httpClient->setUri("http://{$host}/Upload.ashx"); $this->_httpClient->setParameterPost('uploadToken', $uploadToken); - $this->_httpClient->setParameterPost('destFolderPath', dirname($filePath)); + $this->_httpClient->setParameterPost('destFolderPath', str_replace('\\', '/',dirname($filePath))); $this->_httpClient->setFileUpload(basename($filePath), 'uploadFile', $data, $mimeType); $response = $this->_httpClient->request(Zend_Http_Client::POST); return new Zend_Service_Nirvanix_Response($response->getBody()); } - + /** * Convenience function to remove a file from the Nirvanix IMFS. * Analog to PHP's unlink(). diff --git a/libs/Zend/Service/Nirvanix/Response.php b/libs/Zend/Service/Nirvanix/Response.php index 3287b50..7df6185 100644 --- a/libs/Zend/Service/Nirvanix/Response.php +++ b/libs/Zend/Service/Nirvanix/Response.php @@ -17,12 +17,12 @@ * @subpackage Nirvanix * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Response.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Response.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * This class decorates a SimpleXMLElement parsed from a Nirvanix web service - * response. It is primarily exists to provide a convenience feature that + * response. It is primarily exists to provide a convenience feature that * throws an exception when contains an error. * * @category Zend @@ -35,11 +35,11 @@ class Zend_Service_Nirvanix_Response { /** * SimpleXMLElement parsed from Nirvanix web service response. - * + * * @var SimpleXMLElement */ protected $_sxml; - + /** * Class constructor. Parse the XML response from a Nirvanix method * call into a decorated SimpleXMLElement element. @@ -59,7 +59,7 @@ class Zend_Service_Nirvanix_Response if ($name != 'Response') { $this->_throwException("Expected XML element Response, got $name"); } - + $code = (int)$this->_sxml->ResponseCode; if ($code != 0) { $msg = (string)$this->_sxml->ErrorMessage; @@ -84,7 +84,7 @@ class Zend_Service_Nirvanix_Response * @param string $offset Undefined property name * @return mixed */ - public function __get($offset) + public function __get($offset) { return $this->_sxml->$offset; } @@ -104,7 +104,7 @@ class Zend_Service_Nirvanix_Response /** * Throw an exception. This method exists to only contain the * lazy-require() of the exception class. - * + * * @param string $message Error message * @param integer $code Error code * @throws Zend_Service_Nirvanix_Exception @@ -115,7 +115,7 @@ class Zend_Service_Nirvanix_Response /** * @see Zend_Service_Nirvanix_Exception */ - require_once 'Zend/Service/Nirvanix/Exception.php'; + require_once 'Zend/Service/Nirvanix/Exception.php'; throw new Zend_Service_Nirvanix_Exception($message, $code); } diff --git a/libs/Zend/Service/Simpy.php b/libs/Zend/Service/Simpy.php index 0349f8d..c350bce 100644 --- a/libs/Zend/Service/Simpy.php +++ b/libs/Zend/Service/Simpy.php @@ -18,7 +18,7 @@ * @subpackage Simpy * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Simpy.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Simpy.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -42,9 +42,9 @@ class Zend_Service_Simpy protected $_baseUri = 'http://simpy.com/simpy/api/rest/'; /** - * HTTP client for use in making web service calls + * HTTP client for use in making web service calls * - * @var Zend_Http_Client + * @var Zend_Http_Client */ protected $_http; @@ -66,7 +66,7 @@ class Zend_Service_Simpy } /** - * Returns the HTTP client currently in use by this class for REST API + * Returns the HTTP client currently in use by this class for REST API * calls, intended mainly for testing. * * @return Zend_Http_Client diff --git a/libs/Zend/Service/Technorati/Author.php b/libs/Zend/Service/Technorati/Author.php index bb7c089..e5d029d 100644 --- a/libs/Zend/Service/Technorati/Author.php +++ b/libs/Zend/Service/Technorati/Author.php @@ -17,7 +17,7 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Author.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Author.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -29,7 +29,7 @@ require_once 'Zend/Service/Technorati/Utils.php'; /** * Represents a weblog Author object. It usually belongs to a Technorati account. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -53,7 +53,7 @@ class Zend_Service_Technorati_Author * @access protected */ protected $_lastName; - + /** * Technorati account username * @@ -61,7 +61,7 @@ class Zend_Service_Technorati_Author * @access protected */ protected $_username; - + /** * Technorati account description * @@ -98,27 +98,27 @@ class Zend_Service_Technorati_Author $result = $xpath->query('./firstname/text()', $dom); if ($result->length == 1) $this->setFirstName($result->item(0)->data); - + $result = $xpath->query('./lastname/text()', $dom); if ($result->length == 1) $this->setLastName($result->item(0)->data); - + $result = $xpath->query('./username/text()', $dom); if ($result->length == 1) $this->setUsername($result->item(0)->data); - + $result = $xpath->query('./description/text()', $dom); if ($result->length == 1) $this->setDescription($result->item(0)->data); - + $result = $xpath->query('./bio/text()', $dom); if ($result->length == 1) $this->setBio($result->item(0)->data); $result = $xpath->query('./thumbnailpicture/text()', $dom); if ($result->length == 1) $this->setThumbnailPicture($result->item(0)->data); } - + /** * Returns Author first name. - * + * * @return string Author first name */ public function getFirstName() { @@ -127,7 +127,7 @@ class Zend_Service_Technorati_Author /** * Returns Author last name. - * + * * @return string Author last name */ public function getLastName() { @@ -136,7 +136,7 @@ class Zend_Service_Technorati_Author /** * Returns Technorati account username. - * + * * @return string Technorati account username */ public function getUsername() { @@ -145,7 +145,7 @@ class Zend_Service_Technorati_Author /** * Returns Technorati account description. - * + * * @return string Technorati account description */ public function getDescription() { @@ -154,7 +154,7 @@ class Zend_Service_Technorati_Author /** * Returns Technorati account biography. - * + * * @return string Technorati account biography */ public function getBio() { @@ -163,7 +163,7 @@ class Zend_Service_Technorati_Author /** * Returns Technorati account thumbnail picture. - * + * * @return null|Zend_Uri_Http Technorati account thumbnail picture */ public function getThumbnailPicture() { @@ -173,8 +173,8 @@ class Zend_Service_Technorati_Author /** * Sets author first name. - * - * @param string $input first Name input value + * + * @param string $input first Name input value * @return Zend_Service_Technorati_Author $this instance */ public function setFirstName($input) { @@ -184,8 +184,8 @@ class Zend_Service_Technorati_Author /** * Sets author last name. - * - * @param string $input last Name input value + * + * @param string $input last Name input value * @return Zend_Service_Technorati_Author $this instance */ public function setLastName($input) { @@ -195,8 +195,8 @@ class Zend_Service_Technorati_Author /** * Sets Technorati account username. - * - * @param string $input username input value + * + * @param string $input username input value * @return Zend_Service_Technorati_Author $this instance */ public function setUsername($input) { @@ -206,7 +206,7 @@ class Zend_Service_Technorati_Author /** * Sets Technorati account biography. - * + * * @param string $input biography input value * @return Zend_Service_Technorati_Author $this instance */ @@ -217,7 +217,7 @@ class Zend_Service_Technorati_Author /** * Sets Technorati account description. - * + * * @param string $input description input value * @return Zend_Service_Technorati_Author $this instance */ @@ -228,7 +228,7 @@ class Zend_Service_Technorati_Author /** * Sets Technorati account thumbnail picture. - * + * * @param string|Zend_Uri_Http $input thumbnail picture URI * @return Zend_Service_Technorati_Author $this instance * @throws Zend_Service_Technorati_Exception if $input is an invalid URI diff --git a/libs/Zend/Service/Technorati/BlogInfoResult.php b/libs/Zend/Service/Technorati/BlogInfoResult.php index cc95853..28cc2a0 100644 --- a/libs/Zend/Service/Technorati/BlogInfoResult.php +++ b/libs/Zend/Service/Technorati/BlogInfoResult.php @@ -17,7 +17,7 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: BlogInfoResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: BlogInfoResult.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -29,7 +29,7 @@ require_once 'Zend/Service/Technorati/Utils.php'; /** * Represents a single Technorati BlogInfo query result object. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -69,7 +69,7 @@ class Zend_Service_Technorati_BlogInfoResult * @access protected */ protected $_inboundLinks; - + /** * Constructs a new object object from DOM Document. @@ -88,7 +88,7 @@ class Zend_Service_Technorati_BlogInfoResult if ($result->length == 1) { $this->_weblog = new Zend_Service_Technorati_Weblog($result->item(0)); } else { - // follow the same behavior of blogPostTags + // follow the same behavior of blogPostTags // and raise an Exception if the URL is not a valid weblog /** * @see Zend_Service_Technorati_Exception @@ -97,11 +97,11 @@ class Zend_Service_Technorati_BlogInfoResult throw new Zend_Service_Technorati_Exception( "Your URL is not a recognized Technorati weblog"); } - + $result = $xpath->query('//result/url/text()'); if ($result->length == 1) { try { - // fetched URL often doens't include schema + // fetched URL often doens't include schema // and this issue causes the following line to fail $this->_url = Zend_Service_Technorati_Utils::normalizeUriHttp($result->item(0)->data); } catch(Zend_Service_Technorati_Exception $e) { @@ -110,52 +110,52 @@ class Zend_Service_Technorati_BlogInfoResult } } } - + $result = $xpath->query('//result/inboundblogs/text()'); if ($result->length == 1) $this->_inboundBlogs = (int) $result->item(0)->data; - + $result = $xpath->query('//result/inboundlinks/text()'); if ($result->length == 1) $this->_inboundLinks = (int) $result->item(0)->data; - + } /** * Returns the weblog URL. - * + * * @return Zend_Uri_Http */ public function getUrl() { return $this->_url; } - + /** * Returns the weblog. - * + * * @return Zend_Service_Technorati_Weblog */ public function getWeblog() { return $this->_weblog; } - + /** * Returns number of unique blogs linking this blog. - * + * * @return integer the number of inbound blogs */ - public function getInboundBlogs() + public function getInboundBlogs() { return (int) $this->_inboundBlogs; } - + /** * Returns number of incoming links to this blog. - * + * * @return integer the number of inbound links */ - public function getInboundLinks() + public function getInboundLinks() { return (int) $this->_inboundLinks; } - + } diff --git a/libs/Zend/Service/Technorati/CosmosResult.php b/libs/Zend/Service/Technorati/CosmosResult.php index f23ebda..89e58f6 100644 --- a/libs/Zend/Service/Technorati/CosmosResult.php +++ b/libs/Zend/Service/Technorati/CosmosResult.php @@ -17,21 +17,21 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CosmosResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: CosmosResult.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_Result +/** + * @see Zend_Service_Technorati_Result */ require_once 'Zend/Service/Technorati/Result.php'; /** - * Represents a single Technorati Cosmos query result object. - * It is never returned as a standalone object, + * Represents a single Technorati Cosmos query result object. + * It is never returned as a standalone object, * but it always belongs to a valid Zend_Service_Technorati_CosmosResultSet object. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -42,7 +42,7 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul { /** * Technorati weblog object that links queried URL. - * + * * @var Zend_Service_Technorati_Weblog * @access protected */ @@ -50,7 +50,7 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul /** * The nearest permalink tracked for queried URL. - * + * * @var Zend_Uri_Http * @access protected */ @@ -58,7 +58,7 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul /** * The excerpt of the blog/page linking queried URL. - * + * * @var string * @access protected */ @@ -66,7 +66,7 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul /** * The the datetime the link was created. - * + * * @var Zend_Date * @access protected */ @@ -74,7 +74,7 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul /** * The URL of the specific link target page - * + * * @var Zend_Uri_Http * @access protected */ @@ -96,7 +96,7 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul // weblog object field $this->_parseWeblog(); - + // filter fields $this->_nearestPermalink = Zend_Service_Technorati_Utils::normalizeUriHttp($this->_nearestPermalink); $this->_linkUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($this->_linkUrl); @@ -105,7 +105,7 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul /** * Returns the weblog object that links queried URL. - * + * * @return Zend_Service_Technorati_Weblog */ public function getWeblog() { @@ -114,7 +114,7 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul /** * Returns the nearest permalink tracked for queried URL. - * + * * @return Zend_Uri_Http */ public function getNearestPermalink() { @@ -123,30 +123,30 @@ class Zend_Service_Technorati_CosmosResult extends Zend_Service_Technorati_Resul /** * Returns the excerpt of the blog/page linking queried URL. - * + * * @return string */ public function getExcerpt() { return $this->_excerpt; } - + /** * Returns the datetime the link was created. - * + * * @return Zend_Date */ public function getLinkCreated() { return $this->_linkCreated; } - + /** * If queried URL is a valid blog, * returns the URL of the specific link target page. - * + * * @return Zend_Uri_Http */ public function getLinkUrl() { return $this->_linkUrl; } - + } diff --git a/libs/Zend/Service/Technorati/CosmosResultSet.php b/libs/Zend/Service/Technorati/CosmosResultSet.php index 045bac9..d5fc429 100644 --- a/libs/Zend/Service/Technorati/CosmosResultSet.php +++ b/libs/Zend/Service/Technorati/CosmosResultSet.php @@ -17,19 +17,19 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CosmosResultSet.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: CosmosResultSet.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_ResultSet +/** + * @see Zend_Service_Technorati_ResultSet */ require_once 'Zend/Service/Technorati/ResultSet.php'; /** * Represents a Technorati Cosmos query result set. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -98,7 +98,7 @@ class Zend_Service_Technorati_CosmosResultSet extends Zend_Service_Technorati_Re $result = $this->_xpath->query('/tapi/document/result/url/text()'); if ($result->length == 1) { try { - // fetched URL often doens't include schema + // fetched URL often doens't include schema // and this issue causes the following line to fail $this->_url = Zend_Service_Technorati_Utils::normalizeUriHttp($result->item(0)->data); } catch(Zend_Service_Technorati_Exception $e) { @@ -124,7 +124,7 @@ class Zend_Service_Technorati_CosmosResultSet extends Zend_Service_Technorati_Re /** * Returns the weblog URL. - * + * * @return Zend_Uri_Http */ public function getUrl() { @@ -133,7 +133,7 @@ class Zend_Service_Technorati_CosmosResultSet extends Zend_Service_Technorati_Re /** * Returns the weblog. - * + * * @return Zend_Service_Technorati_Weblog */ public function getWeblog() { @@ -142,20 +142,20 @@ class Zend_Service_Technorati_CosmosResultSet extends Zend_Service_Technorati_Re /** * Returns number of unique blogs linking this blog. - * + * * @return integer the number of inbound blogs */ - public function getInboundBlogs() + public function getInboundBlogs() { return $this->_inboundBlogs; } /** * Returns number of incoming links to this blog. - * + * * @return integer the number of inbound links */ - public function getInboundLinks() + public function getInboundLinks() { return $this->_inboundLinks; } diff --git a/libs/Zend/Service/Technorati/DailyCountsResult.php b/libs/Zend/Service/Technorati/DailyCountsResult.php index 8739bfc..7b9d4a2 100644 --- a/libs/Zend/Service/Technorati/DailyCountsResult.php +++ b/libs/Zend/Service/Technorati/DailyCountsResult.php @@ -17,21 +17,21 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DailyCountsResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: DailyCountsResult.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_Result +/** + * @see Zend_Service_Technorati_Result */ require_once 'Zend/Service/Technorati/Result.php'; /** - * Represents a single Technorati DailyCounts query result object. - * It is never returned as a standalone object, + * Represents a single Technorati DailyCounts query result object. + * It is never returned as a standalone object, * but it always belongs to a valid Zend_Service_Technorati_DailyCountsResultSet object. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -42,20 +42,20 @@ class Zend_Service_Technorati_DailyCountsResult extends Zend_Service_Technorati_ { /** * Date of count. - * + * * @var Zend_Date * @access protected */ protected $_date; - + /** * Number of posts containing query on given date. - * + * * @var int * @access protected */ protected $_count; - + /** * Constructs a new object object from DOM Document. @@ -67,7 +67,7 @@ class Zend_Service_Technorati_DailyCountsResult extends Zend_Service_Technorati_ $this->_fields = array( '_date' => 'date', '_count' => 'count'); parent::__construct($dom); - + // filter fields $this->_date = new Zend_Date(strtotime($this->_date)); $this->_count = (int) $this->_count; @@ -75,16 +75,16 @@ class Zend_Service_Technorati_DailyCountsResult extends Zend_Service_Technorati_ /** * Returns the date of count. - * + * * @return Zend_Date */ public function getDate() { return $this->_date; } - + /** * Returns the number of posts containing query on given date. - * + * * @return int */ public function getCount() { diff --git a/libs/Zend/Service/Technorati/DailyCountsResultSet.php b/libs/Zend/Service/Technorati/DailyCountsResultSet.php index 10c6fa3..d10b2d4 100644 --- a/libs/Zend/Service/Technorati/DailyCountsResultSet.php +++ b/libs/Zend/Service/Technorati/DailyCountsResultSet.php @@ -17,17 +17,17 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DailyCountsResultSet.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: DailyCountsResultSet.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** +/** * @see Zend_Date */ require_once 'Zend/Date.php'; -/** - * @see Zend_Service_Technorati_ResultSet +/** + * @see Zend_Service_Technorati_ResultSet */ require_once 'Zend/Service/Technorati/ResultSet.php'; @@ -39,7 +39,7 @@ require_once 'Zend/Service/Technorati/Utils.php'; /** * Represents a Technorati Tag query result set. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -58,7 +58,7 @@ class Zend_Service_Technorati_DailyCountsResultSet extends Zend_Service_Technora /** * Number of days for which counts provided. - * + * * @var Zend_Service_Technorati_Weblog * @access protected */ @@ -73,7 +73,7 @@ class Zend_Service_Technorati_DailyCountsResultSet extends Zend_Service_Technora public function __construct(DomDocument $dom, $options = array()) { parent::__construct($dom, $options); - + // default locale prevent Zend_Date to fail // when script is executed via shell // Zend_Locale::setDefault('en'); @@ -93,7 +93,7 @@ class Zend_Service_Technorati_DailyCountsResultSet extends Zend_Service_Technora /** * Returns the search URL for given query. - * + * * @return Zend_Uri_Http */ public function getSearchUrl() { @@ -102,7 +102,7 @@ class Zend_Service_Technorati_DailyCountsResultSet extends Zend_Service_Technora /** * Returns the number of days for which counts provided. - * + * * @return int */ public function getDays() { diff --git a/libs/Zend/Service/Technorati/GetInfoResult.php b/libs/Zend/Service/Technorati/GetInfoResult.php index 40b8c21..3ba7a29 100644 --- a/libs/Zend/Service/Technorati/GetInfoResult.php +++ b/libs/Zend/Service/Technorati/GetInfoResult.php @@ -17,13 +17,13 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: GetInfoResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: GetInfoResult.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * Represents a single Technorati GetInfo query result object. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -84,7 +84,7 @@ class Zend_Service_Technorati_GetInfoResult /** * Returns the author associated with queried username. - * + * * @return Zend_Service_Technorati_Author */ public function getAuthor() { @@ -93,7 +93,7 @@ class Zend_Service_Technorati_GetInfoResult /** * Returns the collection of weblogs authored by queried username. - * + * * @return array of Zend_Service_Technorati_Weblog */ public function getWeblogs() { diff --git a/libs/Zend/Service/Technorati/KeyInfoResult.php b/libs/Zend/Service/Technorati/KeyInfoResult.php index 34698cd..ff26cc5 100644 --- a/libs/Zend/Service/Technorati/KeyInfoResult.php +++ b/libs/Zend/Service/Technorati/KeyInfoResult.php @@ -17,14 +17,14 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: KeyInfoResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: KeyInfoResult.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * Represents a single Technorati KeyInfo query result object. * It provides information about your Technorati API Key daily usage. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -56,7 +56,7 @@ class Zend_Service_Technorati_KeyInfoResult * @access protected */ protected $_maxQueries; - + /** * Constructs a new object from DOM Element. @@ -75,39 +75,39 @@ class Zend_Service_Technorati_KeyInfoResult $this->_maxQueries = (int) $xpath->query('/tapi/document/result/maxqueries/text()')->item(0)->data; $this->setApiKey($apiKey); } - - + + /** * Returns API Key string. - * + * * @return string API Key string */ public function getApiKey() { return $this->_apiKey; } - + /** * Returns the number of queries sent today. - * + * * @return int number of queries sent today */ public function getApiQueries() { return $this->_apiQueries; } - + /** * Returns Key's daily query limit. - * + * * @return int maximum number of available queries per day */ public function getMaxQueries() { return $this->_maxQueries; } - - + + /** * Sets API Key string. - * + * * @param string $apiKey the API Key * @return Zend_Service_Technorati_KeyInfoResult $this instance */ diff --git a/libs/Zend/Service/Technorati/Result.php b/libs/Zend/Service/Technorati/Result.php index c8c36e3..e745631 100644 --- a/libs/Zend/Service/Technorati/Result.php +++ b/libs/Zend/Service/Technorati/Result.php @@ -17,21 +17,21 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Result.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Result.php 18951 2009-11-12 16:26:19Z alexander $ */ /** - * Represents a single Technorati Search query result object. - * It is never returned as a standalone object, + * Represents a single Technorati Search query result object. + * It is never returned as a standalone object, * but it always belongs to a valid Zend_Service_Technorati_SearchResultSet object. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @abstract + * @abstract */ abstract class Zend_Service_Technorati_Result { @@ -71,7 +71,7 @@ abstract class Zend_Service_Technorati_Result { $this->_xpath = new DOMXPath($dom->ownerDocument); $this->_dom = $dom; - + // default fields for all search results $fields = array(); @@ -87,10 +87,10 @@ abstract class Zend_Service_Technorati_Result } } } - + /** * Parses weblog node and sets weblog object. - * + * * @return void */ protected function _parseWeblog() diff --git a/libs/Zend/Service/Technorati/SearchResult.php b/libs/Zend/Service/Technorati/SearchResult.php index bfa1ed6..70c0e1a 100644 --- a/libs/Zend/Service/Technorati/SearchResult.php +++ b/libs/Zend/Service/Technorati/SearchResult.php @@ -17,21 +17,21 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SearchResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: SearchResult.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_Result +/** + * @see Zend_Service_Technorati_Result */ require_once 'Zend/Service/Technorati/Result.php'; /** - * Represents a single Technorati Search query result object. - * It is never returned as a standalone object, + * Represents a single Technorati Search query result object. + * It is never returned as a standalone object, * but it always belongs to a valid Zend_Service_Technorati_SearchResultSet object. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -42,7 +42,7 @@ class Zend_Service_Technorati_SearchResult extends Zend_Service_Technorati_Resul { /** * Technorati weblog object corresponding to queried keyword. - * + * * @var Zend_Service_Technorati_Weblog * @access protected */ @@ -50,15 +50,15 @@ class Zend_Service_Technorati_SearchResult extends Zend_Service_Technorati_Resul /** * The title of the entry. - * + * * @var string * @access protected */ protected $_title; - + /** * The blurb from entry with search term highlighted. - * + * * @var string * @access protected */ @@ -66,7 +66,7 @@ class Zend_Service_Technorati_SearchResult extends Zend_Service_Technorati_Resul /** * The datetime the entry was created. - * + * * @var Zend_Date * @access protected */ @@ -74,12 +74,12 @@ class Zend_Service_Technorati_SearchResult extends Zend_Service_Technorati_Resul /** * The permalink of the blog entry. - * + * * @var Zend_Uri_Http * @access protected */ protected $_permalink; - + /** * Constructs a new object object from DOM Element. @@ -104,47 +104,47 @@ class Zend_Service_Technorati_SearchResult extends Zend_Service_Technorati_Resul /** * Returns the weblog object that links queried URL. - * + * * @return Zend_Service_Technorati_Weblog */ public function getWeblog() { return $this->_weblog; } - + /** * Returns the title of the entry. - * + * * @return string */ public function getTitle() { return $this->_title; } - + /** * Returns the blurb from entry with search term highlighted. - * + * * @return string */ public function getExcerpt() { return $this->_excerpt; } - + /** * Returns the datetime the entry was created. - * + * * @return Zend_Date */ public function getCreated() { return $this->_created; } - + /** * Returns the permalink of the blog entry. - * + * * @return Zend_Uri_Http */ public function getPermalink() { return $this->_permalink; } - + } diff --git a/libs/Zend/Service/Technorati/SearchResultSet.php b/libs/Zend/Service/Technorati/SearchResultSet.php index e51f666..b427e51 100644 --- a/libs/Zend/Service/Technorati/SearchResultSet.php +++ b/libs/Zend/Service/Technorati/SearchResultSet.php @@ -17,19 +17,19 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SearchResultSet.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: SearchResultSet.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_ResultSet +/** + * @see Zend_Service_Technorati_ResultSet */ require_once 'Zend/Service/Technorati/ResultSet.php'; /** * Represents a Technorati Search query result set. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -58,7 +58,7 @@ class Zend_Service_Technorati_SearchResultSet extends Zend_Service_Technorati_Re $result = $this->_xpath->query('/tapi/document/result/querycount/text()'); if ($result->length == 1) $this->_queryCount = (int) $result->item(0)->data; - + $this->_totalResultsReturned = (int) $this->_xpath->evaluate("count(/tapi/document/item)"); $this->_totalResultsAvailable = (int) $this->_queryCount; } diff --git a/libs/Zend/Service/Technorati/TagResult.php b/libs/Zend/Service/Technorati/TagResult.php index 39b86cb..82f0475 100644 --- a/libs/Zend/Service/Technorati/TagResult.php +++ b/libs/Zend/Service/Technorati/TagResult.php @@ -17,21 +17,21 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TagResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: TagResult.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_Result +/** + * @see Zend_Service_Technorati_Result */ require_once 'Zend/Service/Technorati/Result.php'; /** - * Represents a single Technorati Tag query result object. - * It is never returned as a standalone object, + * Represents a single Technorati Tag query result object. + * It is never returned as a standalone object, * but it always belongs to a valid Zend_Service_Technorati_TagResultSet object. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -42,7 +42,7 @@ class Zend_Service_Technorati_TagResult extends Zend_Service_Technorati_Result { /** * Technorati weblog object corresponding to queried keyword. - * + * * @var Zend_Service_Technorati_Weblog * @access protected */ @@ -50,15 +50,15 @@ class Zend_Service_Technorati_TagResult extends Zend_Service_Technorati_Result /** * The title of the entry. - * + * * @var string * @access protected */ protected $_title; - + /** * The blurb from entry with search term highlighted. - * + * * @var string * @access protected */ @@ -66,30 +66,30 @@ class Zend_Service_Technorati_TagResult extends Zend_Service_Technorati_Result /** * The datetime the entry was created. - * + * * @var Zend_Date * @access protected */ protected $_created; - + /** * The datetime the entry was updated. * Called 'postupdate' in original XML response, * it has been renamed to provide more coherence. - * + * * @var Zend_Date * @access protected */ protected $_updated; - + /** * The permalink of the blog entry. - * + * * @var Zend_Uri_Http * @access protected */ protected $_permalink; - + /** * Constructs a new object object from DOM Element. @@ -116,56 +116,56 @@ class Zend_Service_Technorati_TagResult extends Zend_Service_Technorati_Result /** * Returns the weblog object that links queried URL. - * + * * @return Zend_Service_Technorati_Weblog */ public function getWeblog() { return $this->_weblog; } - + /** * Returns the title of the entry. - * + * * @return string */ public function getTitle() { return $this->_title; } - + /** * Returns the blurb from entry with search term highlighted. - * + * * @return string */ public function getExcerpt() { return $this->_excerpt; } - + /** * Returns the datetime the entry was created. - * + * * @return Zend_Date */ public function getCreated() { return $this->_created; } - + /** * Returns the datetime the entry was updated. - * + * * @return Zend_Date */ public function getUpdated() { return $this->_updated; } - + /** * Returns the permalink of the blog entry. - * + * * @return Zend_Uri_Http */ public function getPermalink() { return $this->_permalink; } - + } diff --git a/libs/Zend/Service/Technorati/TagResultSet.php b/libs/Zend/Service/Technorati/TagResultSet.php index 2f6d00e..501644f 100644 --- a/libs/Zend/Service/Technorati/TagResultSet.php +++ b/libs/Zend/Service/Technorati/TagResultSet.php @@ -17,19 +17,19 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TagResultSet.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: TagResultSet.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_ResultSet +/** + * @see Zend_Service_Technorati_ResultSet */ require_once 'Zend/Service/Technorati/ResultSet.php'; /** * Represents a Technorati Tag query result set. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -78,7 +78,7 @@ class Zend_Service_Technorati_TagResultSet extends Zend_Service_Technorati_Resul /** * Returns the number of posts that match the tag. - * + * * @return int */ public function getPostsMatched() { @@ -87,7 +87,7 @@ class Zend_Service_Technorati_TagResultSet extends Zend_Service_Technorati_Resul /** * Returns the number of blogs that match the tag. - * + * * @return int */ public function getBlogsMatched() { diff --git a/libs/Zend/Service/Technorati/TagsResult.php b/libs/Zend/Service/Technorati/TagsResult.php index 426218e..8ea2ca5 100644 --- a/libs/Zend/Service/Technorati/TagsResult.php +++ b/libs/Zend/Service/Technorati/TagsResult.php @@ -17,21 +17,21 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TagsResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: TagsResult.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_Result +/** + * @see Zend_Service_Technorati_Result */ require_once 'Zend/Service/Technorati/Result.php'; /** - * Represents a single Technorati TopTags or BlogPostTags query result object. - * It is never returned as a standalone object, + * Represents a single Technorati TopTags or BlogPostTags query result object. + * It is never returned as a standalone object, * but it always belongs to a valid Zend_Service_Technorati_TagsResultSet object. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -42,20 +42,20 @@ class Zend_Service_Technorati_TagsResult extends Zend_Service_Technorati_Result { /** * Name of the tag. - * + * * @var string * @access protected */ protected $_tag; - + /** * Number of posts containing this tag. - * + * * @var int * @access protected */ protected $_posts; - + /** * Constructs a new object object from DOM Document. @@ -67,7 +67,7 @@ class Zend_Service_Technorati_TagsResult extends Zend_Service_Technorati_Result $this->_fields = array( '_tag' => 'tag', '_posts' => 'posts'); parent::__construct($dom); - + // filter fields $this->_tag = (string) $this->_tag; $this->_posts = (int) $this->_posts; @@ -75,16 +75,16 @@ class Zend_Service_Technorati_TagsResult extends Zend_Service_Technorati_Result /** * Returns the tag name. - * + * * @return string */ public function getTag() { return $this->_tag; } - + /** * Returns the number of posts. - * + * * @return int */ public function getPosts() { diff --git a/libs/Zend/Service/Technorati/TagsResultSet.php b/libs/Zend/Service/Technorati/TagsResultSet.php index dc5a705..17c9607 100644 --- a/libs/Zend/Service/Technorati/TagsResultSet.php +++ b/libs/Zend/Service/Technorati/TagsResultSet.php @@ -17,19 +17,19 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TagsResultSet.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: TagsResultSet.php 18951 2009-11-12 16:26:19Z alexander $ */ -/** - * @see Zend_Service_Technorati_ResultSet +/** + * @see Zend_Service_Technorati_ResultSet */ require_once 'Zend/Service/Technorati/ResultSet.php'; /** * Represents a Technorati TopTags or BlogPostTags queries result set. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati diff --git a/libs/Zend/Service/Technorati/Utils.php b/libs/Zend/Service/Technorati/Utils.php index fac6e20..d9606e0 100644 --- a/libs/Zend/Service/Technorati/Utils.php +++ b/libs/Zend/Service/Technorati/Utils.php @@ -17,7 +17,7 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Utils.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Utils.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -73,20 +73,20 @@ class Zend_Service_Technorati_Utils /** * @see Zend_Service_Technorati_Exception */ - require_once 'Zend/Service/Technorati/Exception.php'; + require_once 'Zend/Service/Technorati/Exception.php'; throw new Zend_Service_Technorati_Exception( "Invalid URL $uri, only HTTP(S) protocols can be used"); } - + return $uri; } /** * Parses, validates and returns a valid Zend_Date object * from given $input. - * + * * $input can be either a string, an integer or a Zend_Date object. * If $input is string or int, it will be provided to Zend_Date as it is. - * If $input is a Zend_Date object, the object instance will be returned. + * If $input is a Zend_Date object, the object instance will be returned. * * @param mixed|Zend_Date $input * @return null|Zend_Date @@ -103,12 +103,12 @@ class Zend_Service_Technorati_Utils * @see Zend_Locale */ require_once 'Zend/Locale.php'; - + // allow null as value and return valid Zend_Date objects if (($input === null) || ($input instanceof Zend_Date)) { return $input; } - + // due to a BC break as of ZF 1.5 it's not safe to use Zend_Date::isDate() here // see ZF-2524, ZF-2334 if (@strtotime($input) !== FALSE) { @@ -121,7 +121,7 @@ class Zend_Service_Technorati_Utils throw new Zend_Service_Technorati_Exception("'$input' is not a valid Date/Time"); } } - + /** * @todo public static function xpathQueryAndSet() {} */ diff --git a/libs/Zend/Service/Technorati/Weblog.php b/libs/Zend/Service/Technorati/Weblog.php index c0a5e88..7cb443e 100644 --- a/libs/Zend/Service/Technorati/Weblog.php +++ b/libs/Zend/Service/Technorati/Weblog.php @@ -17,7 +17,7 @@ * @subpackage Technorati * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Weblog.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Weblog.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -34,7 +34,7 @@ require_once 'Zend/Service/Technorati/Utils.php'; /** * Represents a Weblog object successful recognized by Technorati. - * + * * @category Zend * @package Zend_Service * @subpackage Technorati @@ -101,17 +101,17 @@ class Zend_Service_Technorati_Weblog /** * Technorati rank value for this weblog. - * + * * Note. This property has no official documentation. * * @var integer * @access protected */ protected $_rank; - + /** * Blog latitude coordinate. - * + * * Note. This property has no official documentation. * * @var float @@ -121,7 +121,7 @@ class Zend_Service_Technorati_Weblog /** * Blog longitude coordinate. - * + * * Note. This property has no official documentation. * * @var float @@ -131,7 +131,7 @@ class Zend_Service_Technorati_Weblog /** * Whether the author who claimed this weblog has a photo. - * + * * Note. This property has no official documentation. * * @var bool @@ -163,13 +163,13 @@ class Zend_Service_Technorati_Weblog $result = $xpath->query('./url/text()', $dom); if ($result->length == 1) $this->setUrl($result->item(0)->data); - + $result = $xpath->query('./inboundblogs/text()', $dom); if ($result->length == 1) $this->setInboundBlogs($result->item(0)->data); - + $result = $xpath->query('./inboundlinks/text()', $dom); if ($result->length == 1) $this->setInboundLinks($result->item(0)->data); - + $result = $xpath->query('./lastupdate/text()', $dom); if ($result->length == 1) $this->setLastUpdate($result->item(0)->data); @@ -177,10 +177,10 @@ class Zend_Service_Technorati_Weblog $result = $xpath->query('./rssurl/text()', $dom); if ($result->length == 1) $this->setRssUrl($result->item(0)->data); - + $result = $xpath->query('./atomurl/text()', $dom); if ($result->length == 1) $this->setAtomUrl($result->item(0)->data); - + $result = $xpath->query('./author', $dom); if ($result->length >= 1) { foreach ($result as $author) { @@ -190,11 +190,11 @@ class Zend_Service_Technorati_Weblog /** * The following are optional elements - * + * * I can't find any official documentation about the following properties * however they are included in response DTD and/or test responses. */ - + $result = $xpath->query('./rank/text()', $dom); if ($result->length == 1) $this->setRank($result->item(0)->data); @@ -207,134 +207,134 @@ class Zend_Service_Technorati_Weblog $result = $xpath->query('./hasphoto/text()', $dom); if ($result->length == 1) $this->setHasPhoto($result->item(0)->data); } - - + + /** * Returns weblog name. - * + * * @return string Weblog name */ - public function getName() + public function getName() { return $this->_name; } - + /** * Returns weblog URL. - * + * * @return null|Zend_Uri_Http object representing weblog base URL */ - public function getUrl() + public function getUrl() { return $this->_url; } - + /** * Returns number of unique blogs linking this blog. - * + * * @return integer the number of inbound blogs */ - public function getInboundBlogs() + public function getInboundBlogs() { return $this->_inboundBlogs; } - + /** * Returns number of incoming links to this blog. - * + * * @return integer the number of inbound links */ - public function getInboundLinks() + public function getInboundLinks() { return $this->_inboundLinks; } - + /** * Returns weblog Rss URL. - * + * * @return null|Zend_Uri_Http object representing the URL * of the RSS feed for given blog */ - public function getRssUrl() + public function getRssUrl() { return $this->_rssUrl; } - + /** * Returns weblog Atom URL. - * + * * @return null|Zend_Uri_Http object representing the URL * of the Atom feed for given blog */ - public function getAtomUrl() + public function getAtomUrl() { return $this->_atomUrl; } - + /** * Returns UNIX timestamp of the last weblog update. - * + * * @return integer UNIX timestamp of the last weblog update */ - public function getLastUpdate() + public function getLastUpdate() { return $this->_lastUpdate; } - + /** * Returns weblog rank value. - * + * * Note. This property is not documented. - * + * * @return integer weblog rank value */ - public function getRank() + public function getRank() { return $this->_rank; } - + /** * Returns weblog latitude coordinate. - * + * * Note. This property is not documented. - * + * * @return float weblog latitude coordinate */ public function getLat() { return $this->_lat; } - + /** * Returns weblog longitude coordinate. - * + * * Note. This property is not documented. - * + * * @return float weblog longitude coordinate */ - public function getLon() + public function getLon() { return $this->_lon; } - + /** * Returns whether the author who claimed this weblog has a photo. - * + * * Note. This property is not documented. - * + * * @return bool TRUE if the author who claimed this weblog has a photo, * FALSE otherwise. */ - public function hasPhoto() + public function hasPhoto() { return (bool) $this->_hasPhoto; } /** * Returns the array of weblog authors. - * + * * @return array of Zend_Service_Technorati_Author authors */ - public function getAuthors() + public function getAuthors() { return (array) $this->_authors; } @@ -342,11 +342,11 @@ class Zend_Service_Technorati_Weblog /** * Sets weblog name. - * + * * @param string $name * @return Zend_Service_Technorati_Weblog $this instance */ - public function setName($name) + public function setName($name) { $this->_name = (string) $name; return $this; @@ -354,37 +354,37 @@ class Zend_Service_Technorati_Weblog /** * Sets weblog URL. - * + * * @param string|Zend_Uri_Http $url * @return void * @throws Zend_Service_Technorati_Exception if $input is an invalid URI * (via Zend_Service_Technorati_Utils::normalizeUriHttp) */ - public function setUrl($url) + public function setUrl($url) { $this->_url = Zend_Service_Technorati_Utils::normalizeUriHttp($url); return $this; } - + /** * Sets number of inbound blogs. - * + * * @param integer $number * @return Zend_Service_Technorati_Weblog $this instance */ - public function setInboundBlogs($number) + public function setInboundBlogs($number) { $this->_inboundBlogs = (int) $number; return $this; } - + /** * Sets number of Iinbound links. - * + * * @param integer $number * @return Zend_Service_Technorati_Weblog $this instance */ - public function setInboundLinks($number) + public function setInboundLinks($number) { $this->_inboundLinks = (int) $number; return $this; @@ -392,13 +392,13 @@ class Zend_Service_Technorati_Weblog /** * Sets weblog Rss URL. - * + * * @param string|Zend_Uri_Http $url * @return Zend_Service_Technorati_Weblog $this instance * @throws Zend_Service_Technorati_Exception if $input is an invalid URI * (via Zend_Service_Technorati_Utils::normalizeUriHttp) */ - public function setRssUrl($url) + public function setRssUrl($url) { $this->_rssUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($url); return $this; @@ -406,81 +406,81 @@ class Zend_Service_Technorati_Weblog /** * Sets weblog Atom URL. - * + * * @param string|Zend_Uri_Http $url * @return Zend_Service_Technorati_Weblog $this instance * @throws Zend_Service_Technorati_Exception if $input is an invalid URI * (via Zend_Service_Technorati_Utils::normalizeUriHttp) */ - public function setAtomUrl($url) + public function setAtomUrl($url) { $this->_atomUrl = Zend_Service_Technorati_Utils::normalizeUriHttp($url); return $this; } - + /** * Sets weblog Last Update timestamp. - * - * $datetime can be any value supported by + * + * $datetime can be any value supported by * Zend_Service_Technorati_Utils::normalizeDate(). - * + * * @param mixed $datetime A string representing the last update date time * in a valid date time format * @return Zend_Service_Technorati_Weblog $this instance * @throws Zend_Service_Technorati_Exception */ - public function setLastUpdate($datetime) + public function setLastUpdate($datetime) { $this->_lastUpdate = Zend_Service_Technorati_Utils::normalizeDate($datetime); return $this; } - + /** * Sets weblog Rank. - * + * * @param integer $rank * @return Zend_Service_Technorati_Weblog $this instance */ - public function setRank($rank) + public function setRank($rank) { $this->_rank = (int) $rank; return $this; } - + /** * Sets weblog latitude coordinate. - * + * * @param float $coordinate * @return Zend_Service_Technorati_Weblog $this instance */ - public function setLat($coordinate) + public function setLat($coordinate) { $this->_lat = (float) $coordinate; return $this; } - + /** * Sets weblog longitude coordinate. - * + * * @param float $coordinate * @return Zend_Service_Technorati_Weblog $this instance */ - public function setLon($coordinate) + public function setLon($coordinate) { $this->_lon = (float) $coordinate; return $this; } - + /** * Sets hasPhoto property. - * + * * @param bool $hasPhoto * @return Zend_Service_Technorati_Weblog $this instance */ - public function setHasPhoto($hasPhoto) + public function setHasPhoto($hasPhoto) { $this->_hasPhoto = (bool) $hasPhoto; return $this; } - + } diff --git a/libs/Zend/Service/Twitter.php b/libs/Zend/Service/Twitter.php old mode 100755 new mode 100644 index 33bf911..2946588 --- a/libs/Zend/Service/Twitter.php +++ b/libs/Zend/Service/Twitter.php @@ -17,20 +17,16 @@ * @subpackage Twitter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Twitter.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Twitter.php 19096 2009-11-20 15:33:15Z sidhighwind $ */ - - /** * @see Zend_Rest_Client */ require_once 'Zend/Rest/Client.php'; - /** * @see Zend_Rest_Client_Result */ require_once 'Zend/Rest/Client/Result.php'; - /** * @category Zend * @package Zend_Service @@ -40,53 +36,57 @@ require_once 'Zend/Rest/Client/Result.php'; */ class Zend_Service_Twitter extends Zend_Rest_Client { + + /** + * 246 is the current limit for a status message, 140 characters are displayed + * initially, with the remainder linked from the web UI or client. The limit is + * applied to a html encoded UTF-8 string (i.e. entities are counted in the limit + * which may appear unusual but is a security measure). + * + * This should be reviewed in the future... + */ + const STATUS_MAX_CHARACTERS = 246; + /** * Whether or not authorization has been initialized for the current user. * @var bool */ protected $_authInitialized = false; - /** * @var Zend_Http_CookieJar */ protected $_cookieJar; - /** * Date format for 'since' strings * @var string */ protected $_dateFormat = 'D, d M Y H:i:s T'; - /** * Username * @var string */ protected $_username; - /** * Password * @var string */ protected $_password; - /** * Current method type (for method proxying) * @var string */ protected $_methodType; - /** * Types of API methods * @var array */ - protected $_methodTypes = array( - 'status', - 'user', - 'directMessage', - 'friendship', - 'account', - 'favorite' - ); + protected $_methodTypes = array('status', 'user', 'directMessage', 'friendship', 'account', 'favorite', 'block'); + + /** + * Local HTTP Client cloned from statically set client + * @var Zend_Http_Client + */ + protected $_localHttpClient = null; /** * Constructor @@ -95,14 +95,41 @@ class Zend_Service_Twitter extends Zend_Rest_Client * @param string $password * @return void */ - public function __construct($username, $password) + public function __construct($username = null, $password = null) { - $this->setUsername($username); - $this->setPassword($password); + $this->setLocalHttpClient(clone self::getHttpClient()); + if (is_array($username) && is_null($password)) { + if (isset($username['username']) && isset($username['password'])) { + $this->setUsername($username['username']); + $this->setPassword($username['password']); + } elseif (isset($username[0]) && isset($username[1])) { + $this->setUsername($username[0]); + $this->setPassword($username[1]); + } + } else if (!is_null($username)) { + $this->setUsername($username); + $this->setPassword($password); + } $this->setUri('http://twitter.com'); + $this->_localHttpClient->setHeaders('Accept-Charset', 'ISO-8859-1,utf-8'); + } - $client = self::getHttpClient(); - $client->setHeaders('Accept-Charset', 'ISO-8859-1,utf-8'); + /** + * Set local HTTP client as distinct from the static HTTP client + * as inherited from Zend_Rest_Client. + * + * @param Zend_Http_Client $client + * @return self + */ + public function setLocalHttpClient(Zend_Http_Client $client) + { + $this->_localHttpClient = $client; + return $this; + } + + public function getLocalHttpClient() + { + return $this->_localHttpClient; } /** @@ -164,7 +191,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client include_once 'Zend/Service/Twitter/Exception.php'; throw new Zend_Service_Twitter_Exception('Invalid method type "' . $type . '"'); } - $this->_methodType = $type; return $this; } @@ -183,7 +209,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client include_once 'Zend/Service/Twitter/Exception.php'; throw new Zend_Service_Twitter_Exception('Invalid method "' . $method . '"'); } - $test = $this->_methodType . ucfirst($method); if (!method_exists($this, $test)) { include_once 'Zend/Service/Twitter/Exception.php'; @@ -200,18 +225,15 @@ class Zend_Service_Twitter extends Zend_Rest_Client */ protected function _init() { - $client = self::getHttpClient(); - + $client = $this->_localHttpClient; $client->resetParameters(); - if (null == $this->_cookieJar) { $client->setCookieJar(); $this->_cookieJar = $client->getCookieJar(); } else { $client->setCookieJar($this->_cookieJar); } - - if (!$this->_authInitialized) { + if (!$this->_authInitialized && $this->getUsername() !== null) { $client->setAuth($this->getUsername(), $this->getPassword()); $this->_authInitialized = true; } @@ -221,6 +243,7 @@ class Zend_Service_Twitter extends Zend_Rest_Client * Set date header * * @param int|string $value + * @deprecated Not supported by Twitter since April 08, 2009 * @return void */ protected function _setDate($value) @@ -230,19 +253,20 @@ class Zend_Service_Twitter extends Zend_Rest_Client } else { $date = date($this->_dateFormat, strtotime($value)); } - self::getHttpClient()->setHeaders('If-Modified-Since', $date); + $this->_localHttpClient->setHeaders('If-Modified-Since', $date); } /** * Public Timeline status * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return Zend_Rest_Client_Result */ public function statusPublicTimeline() { $this->_init(); $path = '/statuses/public_timeline.xml'; - $response = $this->restGet($path); + $response = $this->_get($path); return new Zend_Rest_Client_Result($response->getBody()); } @@ -252,11 +276,11 @@ class Zend_Service_Twitter extends Zend_Rest_Client * $params may include one or more of the following keys * - id: ID of a friend whose timeline you wish to receive * - count: how many statuses to return - * - since: return results only after the date specified * - since_id: return results only after the specific tweet * - page: return page X of results * * @param array $params + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return void */ public function statusFriendsTimeline(array $params = array()) @@ -276,10 +300,7 @@ class Zend_Service_Twitter extends Zend_Rest_Client $_params['count'] = (int) $count; break; case 'since_id': - $_params['since_id'] = (int) $value; - break; - case 'since': - $this->_setDate($value); + $_params['since_id'] = $this->_validInteger($value); break; case 'page': $_params['page'] = (int) $value; @@ -288,8 +309,8 @@ class Zend_Service_Twitter extends Zend_Rest_Client break; } } - $path .= '.xml'; - $response = $this->restGet($path, $_params); + $path .= '.xml'; + $response = $this->_get($path, $_params); return new Zend_Rest_Client_Result($response->getBody()); } @@ -298,10 +319,14 @@ class Zend_Service_Twitter extends Zend_Rest_Client * * $params may include one or more of the following keys * - id: ID of a friend whose timeline you wish to receive - * - since: return results only after the date specified + * - since_id: return results only after the tweet id specified * - page: return page X of results * - count: how many statuses to return + * - max_id: returns only statuses with an ID less than or equal to the specified ID + * - user_id: specfies the ID of the user for whom to return the user_timeline + * - screen_name: specfies the screen name of the user for whom to return the user_timeline * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return Zend_Rest_Client_Result */ public function statusUserTimeline(array $params = array()) @@ -314,9 +339,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client case 'id': $path .= '/' . $value; break; - case 'since': - $this->_setDate($value); - break; case 'page': $_params['page'] = (int) $value; break; @@ -329,12 +351,24 @@ class Zend_Service_Twitter extends Zend_Rest_Client } $_params['count'] = $count; break; + case 'user_id': + $_params['user_id'] = $this->_validInteger($value); + break; + case 'screen_name': + $_params['screen_name'] = $this->_validateScreenName($value); + break; + case 'since_id': + $_params['since_id'] = $this->_validInteger($value); + break; + case 'max_id': + $_params['max_id'] = $this->_validInteger($value); + break; default: break; } } - $path .= '.xml'; - $response = $this->restGet($path, $_params); + $path .= '.xml'; + $response = $this->_get($path, $_params); return new Zend_Rest_Client_Result($response->getBody()); } @@ -342,13 +376,14 @@ class Zend_Service_Twitter extends Zend_Rest_Client * Show a single status * * @param int $id Id of status to show + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return Zend_Rest_Client_Result */ public function statusShow($id) { $this->_init(); - $path = '/statuses/show/' . $id . '.xml'; - $response = $this->restGet($path); + $path = '/statuses/show/' . $this->_validInteger($id) . '.xml'; + $response = $this->_get($path); return new Zend_Rest_Client_Result($response->getBody()); } @@ -358,31 +393,27 @@ class Zend_Service_Twitter extends Zend_Rest_Client * @param string $status * @param int $in_reply_to_status_id * @return Zend_Rest_Client_Result + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @throws Zend_Service_Twitter_Exception if message is too short or too long */ - public function statusUpdate($status, $in_reply_to_status_id = null) + public function statusUpdate($status, $inReplyToStatusId = null) { $this->_init(); $path = '/statuses/update.xml'; - $len = iconv_strlen($status, 'UTF-8'); - if ($len > 140) { + $len = iconv_strlen(htmlspecialchars($status, ENT_QUOTES, 'UTF-8'), 'UTF-8'); + if ($len > self::STATUS_MAX_CHARACTERS) { include_once 'Zend/Service/Twitter/Exception.php'; - throw new Zend_Service_Twitter_Exception('Status must be no more than 140 characters in length'); + throw new Zend_Service_Twitter_Exception('Status must be no more than ' . self::STATUS_MAX_CHARACTERS . ' characters in length'); } elseif (0 == $len) { include_once 'Zend/Service/Twitter/Exception.php'; throw new Zend_Service_Twitter_Exception('Status must contain at least one character'); } - - $data = array( - 'status' => $status - ); - - if(is_numeric($in_reply_to_status_id) && !empty($in_reply_to_status_id)) { - $data['in_reply_to_status_id'] = $in_reply_to_status_id; + $data = array('status' => $status); + if (is_numeric($inReplyToStatusId) && !empty($inReplyToStatusId)) { + $data['in_reply_to_status_id'] = $inReplyToStatusId; } - //$this->status = $status; - $response = $this->restPost($path, $data); + $response = $this->_post($path, $data); return new Zend_Rest_Client_Result($response->getBody()); } @@ -390,25 +421,21 @@ class Zend_Service_Twitter extends Zend_Rest_Client * Get status replies * * $params may include one or more of the following keys - * - since: return results only after the date specified * - since_id: return results only after the specified tweet id * - page: return page X of results * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return Zend_Rest_Client_Result */ public function statusReplies(array $params = array()) { $this->_init(); $path = '/statuses/replies.xml'; - $_params = array(); foreach ($params as $key => $value) { switch (strtolower($key)) { - case 'since': - $this->_setDate($value); - break; case 'since_id': - $_params['since_id'] = (int) $value; + $_params['since_id'] = $this->_validInteger($value); break; case 'page': $_params['page'] = (int) $value; @@ -417,8 +444,7 @@ class Zend_Service_Twitter extends Zend_Rest_Client break; } } - - $response = $this->restGet($path, $_params); + $response = $this->_get($path, $_params); return new Zend_Rest_Client_Result($response->getBody()); } @@ -426,14 +452,14 @@ class Zend_Service_Twitter extends Zend_Rest_Client * Destroy a status message * * @param int $id ID of status to destroy + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return Zend_Rest_Client_Result */ public function statusDestroy($id) { $this->_init(); - $path = '/statuses/destroy/' . $id . '.xml'; - - $response = $this->restPost($path); + $path = '/statuses/destroy/' . $this->_validInteger($id) . '.xml'; + $response = $this->_post($path); return new Zend_Rest_Client_Result($response->getBody()); } @@ -441,6 +467,7 @@ class Zend_Service_Twitter extends Zend_Rest_Client * User friends * * @param int|string $id Id or username of user for whom to fetch friends + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return Zend_Rest_Client_Result */ public function userFriends(array $params = array()) @@ -448,289 +475,7 @@ class Zend_Service_Twitter extends Zend_Rest_Client $this->_init(); $path = '/statuses/friends'; $_params = array(); - foreach ($params as $key => $value) { - switch (strtolower($key)) { - case 'id': - $path .= '/' . $value; - break; - case 'since': - $this->_setDate($value); - break; - case 'page': - $_params['page'] = (int) $value; - break; - default: - break; - } - } - $path .= '.xml'; - $response = $this->restGet($path, $_params); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * User Followers - * - * @param bool $lite If true, prevents inline inclusion of current status for followers; defaults to false - * @return Zend_Rest_Client_Result - */ - public function userFollowers($lite = false) - { - $this->_init(); - $path = '/statuses/followers.xml'; - if ($lite) { - $this->lite = 'true'; - } - - $response = $this->restGet($path); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Get featured users - * - * @return Zend_Rest_Client_Result - */ - public function userFeatured() - { - $this->_init(); - $path = '/statuses/featured.xml'; - - $response = $this->restGet($path); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Show extended information on a user - * - * @param int|string $id User ID or name - * @return Zend_Rest_Client_Result - */ - public function userShow($id) - { - $this->_init(); - $path = '/users/show/' . $id . '.xml'; - - $response = $this->restGet($path); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Retrieve direct messages for the current user - * - * $params may include one or more of the following keys - * - since: return results only after the date specified - * - since_id: return statuses only greater than the one specified - * - page: return page X of results - * - * @param array $params - * @return Zend_Rest_Client_Result - */ - public function directMessageMessages(array $params = array()) - { - $this->_init(); - $path = '/direct_messages.xml'; - $_params = array(); - foreach ($params as $key => $value) { - switch (strtolower($key)) { - case 'since': - $this->_setDate($value); - break; - case 'since_id': - $_params['since_id'] = (int) $value; - break; - case 'page': - $_params['page'] = (int) $value; - break; - default: - break; - } - } - $response = $this->restGet($path, $_params); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Retrieve list of direct messages sent by current user - * - * $params may include one or more of the following keys - * - since: return results only after the date specified - * - since_id: return statuses only greater than the one specified - * - page: return page X of results - * - * @param array $params - * @return Zend_Rest_Client_Result - */ - public function directMessageSent(array $params = array()) - { - $this->_init(); - $path = '/direct_messages/sent.xml'; - $_params = array(); - foreach ($params as $key => $value) { - switch (strtolower($key)) { - case 'since': - $this->_setDate($value); - break; - case 'since_id': - $_params['since_id'] = (int) $value; - break; - case 'page': - $_params['page'] = (int) $value; - break; - default: - break; - } - } - $response = $this->restGet($path, $_params); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Send a direct message to a user - * - * @param int|string $user User to whom to send message - * @param string $text Message to send to user - * @return Zend_Rest_Client_Result - * @throws Zend_Service_Twitter_Exception if message is too short or too long - */ - public function directMessageNew($user, $text) - { - $this->_init(); - $path = '/direct_messages/new.xml'; - - $len = iconv_strlen($text, 'UTF-8'); - if (0 == $len) { - throw new Zend_Service_Twitter_Exception('Direct message must contain at least one character'); - } elseif (140 < $len) { - throw new Zend_Service_Twitter_Exception('Direct message must contain no more than 140 characters'); - } - - $data = array( - 'user' => $user, - 'text' => $text, - ); - - $response = $this->restPost($path, $data); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Destroy a direct message - * - * @param int $id ID of message to destroy - * @return Zend_Rest_Client_Result - */ - public function directMessageDestroy($id) - { - $this->_init(); - $path = '/direct_messages/destroy/' . $id . '.xml'; - - $response = $this->restPost($path); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Create friendship - * - * @param int|string $id User ID or name of new friend - * @return Zend_Rest_Client_Result - */ - public function friendshipCreate($id) - { - $this->_init(); - $path = '/friendships/create/' . $id . '.xml'; - - $response = $this->restPost($path); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Destroy friendship - * - * @param int|string $id User ID or name of friend to remove - * @return Zend_Rest_Client_Result - */ - public function friendshipDestroy($id) - { - $this->_init(); - $path = '/friendships/destroy/' . $id . '.xml'; - - $response = $this->restPost($path); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Friendship exists - * - * @param int|string $id User ID or name of friend to see if they are your friend - * @return Zend_Rest_Client_result - */ - public function friendshipExists($id) - { - $this->_init(); - $path = '/friendships/exists.xml'; - - $data = array( - 'user_a' => $this->getUsername(), - 'user_b' => $id - ); - - $response = $this->restGet($path, $data); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Verify Account Credentials - * - * @return Zend_Rest_Client_Result - */ - public function accountVerifyCredentials() - { - $this->_init(); - $response = $this->restGet('/account/verify_credentials.xml'); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * End current session - * - * @return true - */ - public function accountEndSession() - { - $this->_init(); - $this->restGet('/account/end_session'); - return true; - } - - /** - * Returns the number of api requests you have left per hour. - * - * @return Zend_Rest_Client_Result - */ - public function accountRateLimitStatus() - { - $this->_init(); - $response = $this->restGet('/account/rate_limit_status.xml'); - return new Zend_Rest_Client_Result($response->getBody()); - } - - /** - * Fetch favorites - * - * $params may contain one or more of the following: - * - 'id': Id of a user for whom to fetch favorites - * - 'page': Retrieve a different page of resuls - * - * @param array $params - * @return Zend_Rest_Client_Result - */ - public function favoriteFavorites(array $params = array()) - { - $this->_init(); - $path = '/favorites'; - $_params = array(); foreach ($params as $key => $value) { switch (strtolower($key)) { case 'id': @@ -744,7 +489,276 @@ class Zend_Service_Twitter extends Zend_Rest_Client } } $path .= '.xml'; - $response = $this->restGet($path, $_params); + + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * User Followers + * + * @param bool $lite If true, prevents inline inclusion of current status for followers; defaults to false + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function userFollowers($lite = false) + { + $this->_init(); + $path = '/statuses/followers.xml'; + if ($lite) { + $this->lite = 'true'; + } + $response = $this->_get($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Get featured users + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function userFeatured() + { + $this->_init(); + $path = '/statuses/featured.xml'; + $response = $this->_get($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Show extended information on a user + * + * @param int|string $id User ID or name + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function userShow($id) + { + $this->_init(); + $path = '/users/show/' . $id . '.xml'; + $response = $this->_get($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Retrieve direct messages for the current user + * + * $params may include one or more of the following keys + * - since_id: return statuses only greater than the one specified + * - page: return page X of results + * + * @param array $params + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function directMessageMessages(array $params = array()) + { + $this->_init(); + $path = '/direct_messages.xml'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'since_id': + $_params['since_id'] = $this->_validInteger($value); + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Retrieve list of direct messages sent by current user + * + * $params may include one or more of the following keys + * - since_id: return statuses only greater than the one specified + * - page: return page X of results + * + * @param array $params + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function directMessageSent(array $params = array()) + { + $this->_init(); + $path = '/direct_messages/sent.xml'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'since_id': + $_params['since_id'] = $this->_validInteger($value); + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $response = $this->_get($path, $_params); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Send a direct message to a user + * + * @param int|string $user User to whom to send message + * @param string $text Message to send to user + * @return Zend_Rest_Client_Result + * @throws Zend_Service_Twitter_Exception if message is too short or too long + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + */ + public function directMessageNew($user, $text) + { + $this->_init(); + $path = '/direct_messages/new.xml'; + $len = iconv_strlen($text, 'UTF-8'); + if (0 == $len) { + throw new Zend_Service_Twitter_Exception('Direct message must contain at least one character'); + } elseif (140 < $len) { + throw new Zend_Service_Twitter_Exception('Direct message must contain no more than 140 characters'); + } + $data = array('user' => $user, 'text' => $text); + $response = $this->_post($path, $data); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Destroy a direct message + * + * @param int $id ID of message to destroy + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function directMessageDestroy($id) + { + $this->_init(); + $path = '/direct_messages/destroy/' . $this->_validInteger($id) . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Create friendship + * + * @param int|string $id User ID or name of new friend + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function friendshipCreate($id) + { + $this->_init(); + $path = '/friendships/create/' . $id . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Destroy friendship + * + * @param int|string $id User ID or name of friend to remove + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function friendshipDestroy($id) + { + $this->_init(); + $path = '/friendships/destroy/' . $id . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Friendship exists + * + * @param int|string $id User ID or name of friend to see if they are your friend + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_result + */ + public function friendshipExists($id) + { + $this->_init(); + $path = '/friendships/exists.xml'; + $data = array('user_a' => $this->getUsername(), 'user_b' => $id); + $response = $this->_get($path, $data); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Verify Account Credentials + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * + * @return Zend_Rest_Client_Result + */ + public function accountVerifyCredentials() + { + $this->_init(); + $response = $this->_get('/account/verify_credentials.xml'); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * End current session + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return true + */ + public function accountEndSession() + { + $this->_init(); + $this->_get('/account/end_session'); + return true; + } + + /** + * Returns the number of api requests you have left per hour. + * + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function accountRateLimitStatus() + { + $this->_init(); + $response = $this->_get('/account/rate_limit_status.xml'); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Fetch favorites + * + * $params may contain one or more of the following: + * - 'id': Id of a user for whom to fetch favorites + * - 'page': Retrieve a different page of resuls + * + * @param array $params + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return Zend_Rest_Client_Result + */ + public function favoriteFavorites(array $params = array()) + { + $this->_init(); + $path = '/favorites'; + $_params = array(); + foreach ($params as $key => $value) { + switch (strtolower($key)) { + case 'id': + $path .= '/' . $this->_validInteger($value); + break; + case 'page': + $_params['page'] = (int) $value; + break; + default: + break; + } + } + $path .= '.xml'; + $response = $this->_get($path, $_params); return new Zend_Rest_Client_Result($response->getBody()); } @@ -752,14 +766,14 @@ class Zend_Service_Twitter extends Zend_Rest_Client * Mark a status as a favorite * * @param int $id Status ID you want to mark as a favorite + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return Zend_Rest_Client_Result */ public function favoriteCreate($id) { $this->_init(); - $path = '/favorites/create/' . $id . '.xml'; - - $response = $this->restPost($path); + $path = '/favorites/create/' . $this->_validInteger($id) . '.xml'; + $response = $this->_post($path); return new Zend_Rest_Client_Result($response->getBody()); } @@ -767,14 +781,199 @@ class Zend_Service_Twitter extends Zend_Rest_Client * Remove a favorite * * @param int $id Status ID you want to de-list as a favorite + * @throws Zend_Http_Client_Exception if HTTP request fails or times out * @return Zend_Rest_Client_Result */ public function favoriteDestroy($id) { $this->_init(); - $path = '/favorites/destroy/' . $id . '.xml'; - - $response = $this->restPost($path); + $path = '/favorites/destroy/' . $this->_validInteger($id) . '.xml'; + $response = $this->_post($path); return new Zend_Rest_Client_Result($response->getBody()); } + + /** + * Blocks the user specified in the ID parameter as the authenticating user. + * Destroys a friendship to the blocked user if it exists. + * + * @param integer|string $id The ID or screen name of a user to block. + * @return Zend_Rest_Client_Result + */ + public function blockCreate($id) + { + $this->_init(); + $path = '/blocks/create/' . $id . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Un-blocks the user specified in the ID parameter for the authenticating user + * + * @param integer|string $id The ID or screen_name of the user to un-block. + * @return Zend_Rest_Client_Result + */ + public function blockDestroy($id) + { + $this->_init(); + $path = '/blocks/destroy/' . $id . '.xml'; + $response = $this->_post($path); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Returns if the authenticating user is blocking a target user. + * + * @param string|integer $id The ID or screen_name of the potentially blocked user. + * @param boolean $returnResult Instead of returning a boolean return the rest response from twitter + * @return Boolean|Zend_Rest_Client_Result + */ + public function blockExists($id, $returnResult = false) + { + $this->_init(); + $path = '/blocks/exists/' . $id . '.xml'; + $response = $this->_get($path); + + $cr = new Zend_Rest_Client_Result($response->getBody()); + + if ($returnResult === true) + return $cr; + + if (!empty($cr->request)) { + return false; + } + + return true; + } + + /** + * Returns an array of user objects that the authenticating user is blocking + * + * @param integer $page Optional. Specifies the page number of the results beginning at 1. A single page contains 20 ids. + * @param boolean $returnUserIds Optional. Returns only the userid's instead of the whole user object + * @return Zend_Rest_Client_Result + */ + public function blockBlocking($page = 1, $returnUserIds = false) + { + $this->_init(); + $path = '/blocks/blocking'; + if ($returnUserIds === true) { + $path .= '/ids'; + } + $path .= '.xml'; + $response = $this->_get($path, array('page' => $page)); + return new Zend_Rest_Client_Result($response->getBody()); + } + + /** + * Protected function to validate that the integer is valid or return a 0 + * @param $int + * @throws Zend_Http_Client_Exception if HTTP request fails or times out + * @return integer + */ + protected function _validInteger($int) + { + if (preg_match("/(\d+)/", $int)) { + return $int; + } + return 0; + } + + /** + * Validate a screen name using Twitter rules + * + * @param string $name + * @throws Zend_Service_Twitter_Exception + * @return string + */ + protected function _validateScreenName($name) + { + if (!preg_match('/^[a-zA-Z0-9_]{0,20}$/', $name)) { + require_once 'Zend/Service/Twitter/Exception.php'; + throw new Zend_Service_Twitter_Exception('Screen name, "' . $name . '" should only contain alphanumeric characters and' . ' underscores, and not exceed 15 characters.'); + } + return $name; + } + + /** + * Call a remote REST web service URI and return the Zend_Http_Response object + * + * @param string $path The path to append to the URI + * @throws Zend_Rest_Client_Exception + * @return void + */ + protected function _prepare($path) + { + // Get the URI object and configure it + if (!$this->_uri instanceof Zend_Uri_Http) { + require_once 'Zend/Rest/Client/Exception.php'; + throw new Zend_Rest_Client_Exception('URI object must be set before performing call'); + } + + $uri = $this->_uri->getUri(); + + if ($path[0] != '/' && $uri[strlen($uri) - 1] != '/') { + $path = '/' . $path; + } + + $this->_uri->setPath($path); + + /** + * Get the HTTP client and configure it for the endpoint URI. Do this each time + * because the Zend_Http_Client instance is shared among all Zend_Service_Abstract subclasses. + */ + $this->_localHttpClient->resetParameters()->setUri($this->_uri); + } + + /** + * Performs an HTTP GET request to the $path. + * + * @param string $path + * @param array $query Array of GET parameters + * @throws Zend_Http_Client_Exception + * @return Zend_Http_Response + */ + protected function _get($path, array $query = null) + { + $this->_prepare($path); + $this->_localHttpClient->setParameterGet($query); + return $this->_localHttpClient->request('GET'); + } + + /** + * Performs an HTTP POST request to $path. + * + * @param string $path + * @param mixed $data Raw data to send + * @throws Zend_Http_Client_Exception + * @return Zend_Http_Response + */ + protected function _post($path, $data = null) + { + $this->_prepare($path); + return $this->_performPost('POST', $data); + } + + /** + * Perform a POST or PUT + * + * Performs a POST or PUT request. Any data provided is set in the HTTP + * client. String data is pushed in as raw POST data; array or object data + * is pushed in as POST parameters. + * + * @param mixed $method + * @param mixed $data + * @return Zend_Http_Response + */ + protected function _performPost($method, $data = null) + { + $client = $this->_localHttpClient; + if (is_string($data)) { + $client->setRawData($data); + } elseif (is_array($data) || is_object($data)) { + $client->setParameterPost((array) $data); + } + return $client->request($method); + } + } diff --git a/libs/Zend/Service/Twitter/Exception.php b/libs/Zend/Service/Twitter/Exception.php old mode 100755 new mode 100644 diff --git a/libs/Zend/Service/Twitter/Search.php b/libs/Zend/Service/Twitter/Search.php index a1c93d6..320ac34 100644 --- a/libs/Zend/Service/Twitter/Search.php +++ b/libs/Zend/Service/Twitter/Search.php @@ -17,7 +17,7 @@ * @subpackage Twitter * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Search.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Search.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -116,6 +116,7 @@ class Zend_Service_Twitter_Search extends Zend_Http_Client /** * Get the current twitter trends. Currnetly only supports json as the return. * + * @throws Zend_Http_Client_Exception * @return array */ public function trends() @@ -127,6 +128,11 @@ class Zend_Service_Twitter_Search extends Zend_Http_Client return Zend_Json::decode($response->getBody()); } + /** + * Performs a Twitter search query. + * + * @throws Zend_Http_Client_Exception + */ public function search($query, array $params = array()) { @@ -141,7 +147,7 @@ class Zend_Service_Twitter_Search extends Zend_Http_Client switch($key) { case 'geocode': case 'lang': - case 'since_id': + case 'since_id': $_query[$key] = $param; break; case 'rpp': diff --git a/libs/Zend/Service/Yahoo.php b/libs/Zend/Service/Yahoo.php index b9dd3ca..86192ec 100644 --- a/libs/Zend/Service/Yahoo.php +++ b/libs/Zend/Service/Yahoo.php @@ -18,7 +18,7 @@ * @subpackage Yahoo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Yahoo.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: Yahoo.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -841,7 +841,7 @@ class Zend_Service_Yahoo 'cc_modifiable')); if (isset($options['region'])){ $this->_validateInArray('region', $options['region'], array('ar', 'au', 'at', 'br', 'ca', 'ct', 'dk', 'fi', - 'fr', 'de', 'in', 'id', 'it', 'my', 'mx', + 'fr', 'de', 'in', 'id', 'it', 'my', 'mx', 'nl', 'no', 'ph', 'ru', 'sg', 'es', 'se', 'ch', 'th', 'uk', 'us')); } diff --git a/libs/Zend/Service/Yahoo/VideoResult.php b/libs/Zend/Service/Yahoo/VideoResult.php index a73ec0a..ba2a6ac 100644 --- a/libs/Zend/Service/Yahoo/VideoResult.php +++ b/libs/Zend/Service/Yahoo/VideoResult.php @@ -18,7 +18,7 @@ * @subpackage Yahoo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: VideoResult.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: VideoResult.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -87,7 +87,7 @@ class Zend_Service_Yahoo_VideoResult extends Zend_Service_Yahoo_Result public $Duration; /** - * The number of audio channels in the video + * The number of audio channels in the video * * @var string */ diff --git a/libs/Zend/Service/Yahoo/WebResult.php b/libs/Zend/Service/Yahoo/WebResult.php index e759717..587e227 100644 --- a/libs/Zend/Service/Yahoo/WebResult.php +++ b/libs/Zend/Service/Yahoo/WebResult.php @@ -18,7 +18,7 @@ * @subpackage Yahoo * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: WebResult.php 16211 2009-06-21 19:23:55Z thomas $ + * @version $Id: WebResult.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -93,17 +93,17 @@ class Zend_Service_Yahoo_WebResult extends Zend_Service_Yahoo_Result $this->_xpath = new DOMXPath($result->ownerDocument); $this->_xpath->registerNamespace('yh', $this->_namespace); - + // check if the cache section exists $cacheUrl = $this->_xpath->query('./yh:Cache/yh:Url/text()', $result)->item(0); if ($cacheUrl instanceof DOMNode) { - $this->CacheUrl = $cacheUrl->data; + $this->CacheUrl = $cacheUrl->data; } $cacheSize = $this->_xpath->query('./yh:Cache/yh:Size/text()', $result)->item(0); if ($cacheSize instanceof DOMNode) { - $this->CacheSize = (int) $cacheSize->data; + $this->CacheSize = (int) $cacheSize->data; } } } diff --git a/libs/Zend/Session.php b/libs/Zend/Session.php index 5d2ee18..3eede14 100644 --- a/libs/Zend/Session.php +++ b/libs/Zend/Session.php @@ -17,7 +17,7 @@ * @package Zend_Session * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Session.php 16207 2009-06-21 19:17:51Z thomas $ + * @version $Id: Session.php 18951 2009-11-12 16:26:19Z alexander $ * @since Preview Release 0.2 */ @@ -62,7 +62,7 @@ class Zend_Session extends Zend_Session_Abstract * @var bool|bitset This could also be a combiniation of error codes to catch */ protected static $_throwStartupExceptions = true; - + /** * Check whether or not the session was started * @@ -244,14 +244,14 @@ class Zend_Session extends Zend_Session_Abstract foreach (self::$_localOptions as $localOptionName => $localOptionMemberName) { $options[$localOptionName] = self::${$localOptionMemberName}; } - + if ($optionName) { if (array_key_exists($optionName, $options)) { return $options[$optionName]; } return null; } - + return $options; } @@ -263,6 +263,8 @@ class Zend_Session extends Zend_Session_Abstract */ public static function setSaveHandler(Zend_Session_SaveHandler_Interface $saveHandler) { + self::$_saveHandler = $saveHandler; + if (self::$_unitTestEnabled) { return; } @@ -275,7 +277,6 @@ class Zend_Session extends Zend_Session_Abstract array(&$saveHandler, 'destroy'), array(&$saveHandler, 'gc') ); - self::$_saveHandler = $saveHandler; } @@ -465,23 +466,23 @@ class Zend_Session extends Zend_Session_Abstract * Hack to throw exceptions on start instead of php errors * @see http://framework.zend.com/issues/browse/ZF-1325 */ - + $errorLevel = (is_int(self::$_throwStartupExceptions)) ? self::$_throwStartupExceptions : E_ALL; - + /** @see Zend_Session_Exception */ if (!self::$_unitTestEnabled) { - + if (self::$_throwStartupExceptions) { require_once 'Zend/Session/Exception.php'; set_error_handler(array('Zend_Session_Exception', 'handleSessionStartError'), $errorLevel); } - + $startedCleanly = session_start(); - + if (self::$_throwStartupExceptions) { restore_error_handler(); } - + if (!$startedCleanly || Zend_Session_Exception::$sessionStartError != null) { if (self::$_throwStartupExceptions) { set_error_handler(array('Zend_Session_Exception', 'handleSilentWriteClose'), $errorLevel); diff --git a/libs/Zend/Session/Namespace.php b/libs/Zend/Session/Namespace.php index a18a66c..4e90b27 100644 --- a/libs/Zend/Session/Namespace.php +++ b/libs/Zend/Session/Namespace.php @@ -16,7 +16,7 @@ * @package Zend_Session * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Namespace.php 16210 2009-06-21 19:22:17Z thomas $ + * @version $Id: Namespace.php 19081 2009-11-20 11:18:02Z bate $ * @since Preview Release 0.2 */ @@ -84,11 +84,11 @@ class Zend_Session_Namespace extends Zend_Session_Abstract implements IteratorAg } return; } - + self::$_singleInstances = array(); return; } - + /** * __construct() - Returns an instance object bound to a particular, isolated section * of the session, identified by $namespace name (defaulting to 'Default'). @@ -514,4 +514,13 @@ class Zend_Session_Namespace extends Zend_Session_Abstract implements IteratorAg } } + /** + * Returns the namespace name + * + * @return string + */ + public function getNamespace() + { + return $this->_namespace; + } } diff --git a/libs/Zend/Session/SaveHandler/DbTable.php b/libs/Zend/Session/SaveHandler/DbTable.php index 84a7f73..14dae9b 100644 --- a/libs/Zend/Session/SaveHandler/DbTable.php +++ b/libs/Zend/Session/SaveHandler/DbTable.php @@ -17,7 +17,7 @@ * @package Zend_Session * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbTable.php 16933 2009-07-21 20:24:35Z matthew $ + * @version $Id: DbTable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -49,8 +49,8 @@ require_once 'Zend/Config.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Session_SaveHandler_DbTable - extends Zend_Db_Table_Abstract +class Zend_Session_SaveHandler_DbTable + extends Zend_Db_Table_Abstract implements Zend_Session_SaveHandler_Interface { const PRIMARY_ASSIGNMENT = 'primaryAssignment'; @@ -516,7 +516,7 @@ class Zend_Session_SaveHandler_DbTable */ protected function _getPrimary($id, $type = null) { - $this->_setupPrimaryKey(); + $this->_setupPrimaryKey(); if ($type === null) { $type = self::PRIMARY_TYPE_NUM; diff --git a/libs/Zend/Soap/Client.php b/libs/Zend/Soap/Client.php index 34a1406..08cf193 100644 --- a/libs/Zend/Soap/Client.php +++ b/libs/Zend/Soap/Client.php @@ -17,7 +17,7 @@ * @subpackage Client * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Client.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Client.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Soap_Server */ @@ -82,6 +82,7 @@ class Zend_Soap_Client protected $_stream_context = null; protected $_features = null; protected $_cache_wsdl = null; + protected $_user_agent = null; /** * WSDL used to access server @@ -256,6 +257,11 @@ class Zend_Soap_Client case 'cache_wsdl': $this->setWsdlCache($value); break; + case 'useragent': + case 'userAgent': + case 'user_agent': + $this->setUserAgent($value); + break; // Not used now // case 'connection_timeout': @@ -302,6 +308,7 @@ class Zend_Soap_Client $options['stream_context'] = $this->getStreamContext(); $options['cache_wsdl'] = $this->getWsdlCache(); $options['features'] = $this->getSoapFeatures(); + $options['user_agent'] = $this->getUserAgent(); foreach ($options as $key => $value) { if ($value == null) { @@ -850,6 +857,26 @@ class Zend_Soap_Client return $this->_cache_wsdl; } + /** + * Set the string to use in User-Agent header + * + * @param string $userAgent + * @return Zend_Soap_Client + */ + public function setUserAgent($userAgent) + { + $this->_user_agent = (string)$userAgent; + return $this; + } + + /** + * Get current string to use in User-Agent header + */ + public function getUserAgent() + { + return $this->_user_agent; + } + /** * Retrieve request XML * @@ -1010,13 +1037,13 @@ class Zend_Soap_Client */ public function addSoapInputHeader(SoapHeader $header, $permanent = false) { - if ($permanent) { - $this->_permanentSoapInputHeaders[] = $header; - } else { - $this->_soapInputHeaders[] = $header; - } + if ($permanent) { + $this->_permanentSoapInputHeaders[] = $header; + } else { + $this->_soapInputHeaders[] = $header; + } - return $this; + return $this; } /** @@ -1039,7 +1066,7 @@ class Zend_Soap_Client */ public function getLastSoapOutputHeaderObjects() { - return $this->_soapOutputHeaders; + return $this->_soapOutputHeaders; } /** diff --git a/libs/Zend/Soap/Client/DotNet.php b/libs/Zend/Soap/Client/DotNet.php index 7a594e8..11d8444 100644 --- a/libs/Zend/Soap/Client/DotNet.php +++ b/libs/Zend/Soap/Client/DotNet.php @@ -17,7 +17,7 @@ * @subpackage Client * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DotNet.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: DotNet.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Soap_Client */ @@ -65,15 +65,15 @@ class Zend_Soap_Client_DotNet extends Zend_Soap_Client */ protected function _preProcessArguments($arguments) { - if (count($arguments) > 1 || - (count($arguments) == 1 && !is_array(reset($arguments))) - ) { - require_once 'Zend/Soap/Client/Exception.php'; - throw new Zend_Soap_Client_Exception('.Net webservice arguments have to be grouped into array: array(\'a\' => $a, \'b\' => $b, ...).'); - } + if (count($arguments) > 1 || + (count($arguments) == 1 && !is_array(reset($arguments))) + ) { + require_once 'Zend/Soap/Client/Exception.php'; + throw new Zend_Soap_Client_Exception('.Net webservice arguments have to be grouped into array: array(\'a\' => $a, \'b\' => $b, ...).'); + } // Do nothing - return array($arguments); + return $arguments; } /** diff --git a/libs/Zend/Soap/Server.php b/libs/Zend/Soap/Server.php index 72f8fb3..477c533 100644 --- a/libs/Zend/Soap/Server.php +++ b/libs/Zend/Soap/Server.php @@ -33,7 +33,7 @@ require_once 'Zend/Server/Interface.php'; * @uses Zend_Server_Interface * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Server.php 16210 2009-06-21 19:22:17Z thomas $ + * @version $Id: Server.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Soap_Server implements Zend_Server_Interface { @@ -463,7 +463,7 @@ class Zend_Soap_Server implements Zend_Server_Interface /** * Return current SOAP Features options - * + * * @return int */ public function getSoapFeatures() diff --git a/libs/Zend/Soap/Server/Exception.php b/libs/Zend/Soap/Server/Exception.php index 8b381a4..0f0c4f9 100644 --- a/libs/Zend/Soap/Server/Exception.php +++ b/libs/Zend/Soap/Server/Exception.php @@ -17,7 +17,7 @@ * @subpackage Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - */ + */ /** Zend_Exception */ @@ -30,7 +30,7 @@ require_once 'Zend/Exception.php'; * @subpackage Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16210 2009-06-21 19:22:17Z thomas $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ class Zend_Soap_Server_Exception extends Zend_Exception {} diff --git a/libs/Zend/Soap/Wsdl.php b/libs/Zend/Soap/Wsdl.php index 0d997d4..5acffe0 100644 --- a/libs/Zend/Soap/Wsdl.php +++ b/libs/Zend/Soap/Wsdl.php @@ -16,7 +16,7 @@ * @package Zend_Soap * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Wsdl.php 16210 2009-06-21 19:22:17Z thomas $ + * @version $Id: Wsdl.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once "Zend/Soap/Wsdl/Strategy/Interface.php"; @@ -595,10 +595,10 @@ class Zend_Soap_Wsdl // delegates the detection of a complex type to the current strategy return $strategy->addComplexType($type); } - + /** * Parse an xsd:element represented as an array into a DOMElement. - * + * * @param array $element an xsd:element represented as an array * @return DOMElement parsed element */ @@ -608,7 +608,7 @@ class Zend_Soap_Wsdl require_once "Zend/Soap/Wsdl/Exception.php"; throw new Zend_Soap_Wsdl_Exception("The 'element' parameter needs to be an associative array."); } - + $elementXml = $this->_dom->createElement('xsd:element'); foreach ($element as $key => $value) { if (in_array($key, array('sequence', 'all', 'choice'))) { @@ -630,10 +630,10 @@ class Zend_Soap_Wsdl } return $elementXml; } - + /** * Add an xsd:element represented as an array to the schema. - * + * * Array keys represent attribute names and values their respective value. * The 'sequence', 'all' and 'choice' keys must have an array of elements as their value, * to add them to a nested complexType. @@ -645,7 +645,7 @@ class Zend_Soap_Wsdl * * * - * + * * @param array $element an xsd:element represented as an array * @return string xsd:element for the given element array */ diff --git a/libs/Zend/Soap/Wsdl/Strategy/AnyType.php b/libs/Zend/Soap/Wsdl/Strategy/AnyType.php index 5c01a6c..e255c80 100644 --- a/libs/Zend/Soap/Wsdl/Strategy/AnyType.php +++ b/libs/Zend/Soap/Wsdl/Strategy/AnyType.php @@ -17,7 +17,7 @@ * @subpackage Wsdl * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AnyType.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: AnyType.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once "Zend/Soap/Wsdl/Strategy/Interface.php"; @@ -31,7 +31,7 @@ class Zend_Soap_Wsdl_Strategy_AnyType implements Zend_Soap_Wsdl_Strategy_Interfa */ public function setContext(Zend_Soap_Wsdl $context) { - + } /** diff --git a/libs/Zend/Soap/Wsdl/Strategy/Interface.php b/libs/Zend/Soap/Wsdl/Strategy/Interface.php index 2b7d698..06b0ca9 100644 --- a/libs/Zend/Soap/Wsdl/Strategy/Interface.php +++ b/libs/Zend/Soap/Wsdl/Strategy/Interface.php @@ -17,7 +17,7 @@ * @subpackage Wsdl * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -25,7 +25,7 @@ interface Zend_Soap_Wsdl_Strategy_Interface { /** * Method accepts the current WSDL context file. - * + * * @param $context */ public function setContext(Zend_Soap_Wsdl $context); diff --git a/libs/Zend/Tag/Cloud.php b/libs/Zend/Tag/Cloud.php index e6d44c2..84e956d 100644 --- a/libs/Zend/Tag/Cloud.php +++ b/libs/Zend/Tag/Cloud.php @@ -17,7 +17,7 @@ * @subpackage Cloud * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Cloud.php 16209 2009-06-21 19:20:34Z thomas $ + * @version $Id: Cloud.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -86,7 +86,7 @@ class Zend_Tag_Cloud $this->setOptions($options); } } - + /** * Set options from Zend_Config * @@ -96,7 +96,7 @@ class Zend_Tag_Cloud public function setConfig(Zend_Config $config) { $this->setOptions($config->toArray()); - + return $this; } @@ -112,7 +112,7 @@ class Zend_Tag_Cloud $this->addPrefixPaths($options['prefixPath']); unset($options['prefixPath']); } - + foreach ($options as $key => $value) { if (in_array(strtolower($key), $this->_skipOptions)) { continue; @@ -143,7 +143,7 @@ class Zend_Tag_Cloud { // Validate and cleanup the tags $itemList = $this->getItemList(); - + foreach ($tags as $tag) { if ($tag instanceof Zend_Tag_Taggable) { $itemList[] = $tag; @@ -157,7 +157,7 @@ class Zend_Tag_Cloud return $this; } - + /** * Append a single tag to the cloud * @@ -168,17 +168,17 @@ class Zend_Tag_Cloud { $tags = $this->getItemList(); if ($tag instanceof Zend_Tag_Taggable) { - $tags[] = $tag; + $tags[] = $tag; } else if (is_array($tag)) { $tags[] = new Zend_Tag_Item($tag); } else { require_once 'Zend/Tag/Cloud/Exception.php'; throw new Zend_Tag_Cloud_Exception('Tag must be an instance of Zend_Tag_Taggable or an array'); } - + return $this; } - + /** * Set the item list * @@ -195,7 +195,7 @@ class Zend_Tag_Cloud * Retrieve the item list * * If item list is undefined, creates one. - * + * * @return Zend_Tag_ItemList */ public function getItemList() @@ -305,8 +305,8 @@ class Zend_Tag_Cloud /** * Set plugin loaders for use with decorators - * - * @param Zend_Loader_PluginLoader_Interface $loader + * + * @param Zend_Loader_PluginLoader_Interface $loader * @return Zend_Tag_Cloud */ public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader) @@ -314,7 +314,7 @@ class Zend_Tag_Cloud $this->_pluginLoader = $loader; return $this; } - + /** * Get the plugin loader for decorators * @@ -332,42 +332,42 @@ class Zend_Tag_Cloud return $this->_pluginLoader; } - + /** * Add many prefix paths at once - * - * @param array $paths + * + * @param array $paths * @return Zend_Tag_Cloud */ public function addPrefixPaths(array $paths) { if (isset($paths['prefix']) && isset($paths['path'])) { return $this->addPrefixPath($paths['prefix'], $paths['path']); - } - + } + foreach ($paths as $path) { if (!isset($path['prefix']) || !isset($path['path'])) { continue; } - + $this->addPrefixPath($path['prefix'], $path['path']); } - + return $this; } - + /** * Add prefix path for plugin loader * * @param string $prefix - * @param string $path + * @param string $path * @return Zend_Tag_Cloud */ - public function addPrefixPath($prefix, $path) + public function addPrefixPath($prefix, $path) { $loader = $this->getPluginLoader(); $loader->addPrefixPath($prefix, $path); - + return $this; } @@ -379,11 +379,11 @@ class Zend_Tag_Cloud public function render() { $tags = $this->getItemList(); - + if (count($tags) === 0) { return ''; } - + $tagsResult = $this->getTagDecorator()->render($tags); $cloudResult = $this->getCloudDecorator()->render($tagsResult); diff --git a/libs/Zend/Tag/Cloud/Decorator/HtmlCloud.php b/libs/Zend/Tag/Cloud/Decorator/HtmlCloud.php index 8f86742..7e90387 100644 --- a/libs/Zend/Tag/Cloud/Decorator/HtmlCloud.php +++ b/libs/Zend/Tag/Cloud/Decorator/HtmlCloud.php @@ -17,7 +17,7 @@ * @subpackage Cloud * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HtmlCloud.php 16357 2009-06-29 23:04:14Z dasprid $ + * @version $Id: HtmlCloud.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -44,14 +44,14 @@ class Zend_Tag_Cloud_Decorator_HtmlCloud extends Zend_Tag_Cloud_Decorator_Cloud protected $_htmlTags = array( 'ul' => array('class' => 'Zend_Tag_Cloud') ); - + /** * Separator for the single tags * * @var string */ protected $_separator = ' '; - + /** * Set the HTML tags surrounding all tags * @@ -61,19 +61,19 @@ class Zend_Tag_Cloud_Decorator_HtmlCloud extends Zend_Tag_Cloud_Decorator_Cloud public function setHtmlTags(array $htmlTags) { $this->_htmlTags = $htmlTags; - return $this; + return $this; } /** * Retrieve HTML tag map - * + * * @return array */ public function getHtmlTags() { return $this->_htmlTags; } - + /** * Set the separator between the single tags * @@ -88,14 +88,14 @@ class Zend_Tag_Cloud_Decorator_HtmlCloud extends Zend_Tag_Cloud_Decorator_Cloud /** * Get tag separator - * + * * @return string */ public function getSeparator() { return $this->_separator; } - + /** * Defined by Zend_Tag_Cloud_Decorator_Cloud * @@ -105,12 +105,12 @@ class Zend_Tag_Cloud_Decorator_HtmlCloud extends Zend_Tag_Cloud_Decorator_Cloud public function render(array $tags) { $cloudHtml = implode($this->getSeparator(), $tags); - + foreach ($this->getHtmlTags() as $key => $data) { if (is_array($data)) { $htmlTag = $key; $attributes = ''; - + foreach ($data as $param => $value) { $attributes .= ' ' . $param . '="' . htmlspecialchars($value) . '"'; } @@ -118,10 +118,10 @@ class Zend_Tag_Cloud_Decorator_HtmlCloud extends Zend_Tag_Cloud_Decorator_Cloud $htmlTag = $data; $attributes = ''; } - + $cloudHtml = sprintf('<%1$s%3$s>%2$s', $htmlTag, $cloudHtml, $attributes); } - + return $cloudHtml; } } diff --git a/libs/Zend/Tag/Cloud/Decorator/HtmlTag.php b/libs/Zend/Tag/Cloud/Decorator/HtmlTag.php index a3b0a9a..865523a 100644 --- a/libs/Zend/Tag/Cloud/Decorator/HtmlTag.php +++ b/libs/Zend/Tag/Cloud/Decorator/HtmlTag.php @@ -17,7 +17,7 @@ * @subpackage Cloud * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HtmlTag.php 16209 2009-06-21 19:20:34Z thomas $ + * @version $Id: HtmlTag.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,24 +39,24 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag /** * List of tags which get assigned to the inner element instead of * font-sizes. - * + * * @var array */ protected $_classList = null; - + /** * Unit for the fontsize * * @var string */ protected $_fontSizeUnit = 'px'; - + /** * Allowed fontsize units - * + * * @var array */ - protected $_alloweFontSizeUnits = array('em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc', '%'); + protected $_alloweFontSizeUnits = array('em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc', '%'); /** * List of HTML tags @@ -66,21 +66,21 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag protected $_htmlTags = array( 'li' ); - + /** * Maximum fontsize * * @var integer */ protected $_maxFontSize = 20; - + /** * Minimum fontsize * * @var integer */ protected $_minFontSize = 10; - + /** * Set a list of classes to use instead of fontsizes * @@ -94,9 +94,9 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag if (is_array($classList)) { if (count($classList) === 0) { require_once 'Zend/Tag/Cloud/Decorator/Exception.php'; - throw new Zend_Tag_Cloud_Decorator_Exception('Classlist is empty'); + throw new Zend_Tag_Cloud_Decorator_Exception('Classlist is empty'); } - + foreach ($classList as $class) { if (!is_string($class)) { require_once 'Zend/Tag/Cloud/Decorator/Exception.php'; @@ -104,14 +104,14 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag } } } - + $this->_classList = $classList; return $this; } /** * Get class list - * + * * @return array */ public function getClassList() @@ -121,9 +121,9 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag /** * Set the font size unit - * + * * Possible values are: em, ex, px, in, cm, mm, pt, pc and % - * + * * @param string $fontSizeUnit * @throws Zend_Tag_Cloud_Decorator_Exception When an invalid fontsize unit is specified * @return Zend_Tag_Cloud_Decorator_HtmlTag @@ -134,7 +134,7 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag require_once 'Zend/Tag/Cloud/Decorator/Exception.php'; throw new Zend_Tag_Cloud_Decorator_Exception('Invalid fontsize unit specified'); } - + $this->_fontSizeUnit = (string) $fontSizeUnit; $this->setClassList(null); return $this; @@ -142,7 +142,7 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag /** * Retrieve font size unit - * + * * @return string */ public function getFontSizeUnit() @@ -158,19 +158,19 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag public function setHtmlTags(array $htmlTags) { $this->_htmlTags = $htmlTags; - return $this; + return $this; } /** * Get HTML tags map - * + * * @return array */ public function getHtmlTags() { return $this->_htmlTags; } - + /** * Set maximum font size * @@ -184,15 +184,15 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag require_once 'Zend/Tag/Cloud/Decorator/Exception.php'; throw new Zend_Tag_Cloud_Decorator_Exception('Fontsize must be numeric'); } - - $this->_maxFontSize = (int) $maxFontSize; + + $this->_maxFontSize = (int) $maxFontSize; $this->setClassList(null); return $this; } - + /** * Retrieve maximum font size - * + * * @return int */ public function getMaxFontSize() @@ -213,7 +213,7 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag require_once 'Zend/Tag/Cloud/Decorator/Exception.php'; throw new Zend_Tag_Cloud_Decorator_Exception('Fontsize must be numeric'); } - + $this->_minFontSize = (int) $minFontSize; $this->setClassList(null); return $this; @@ -221,14 +221,14 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag /** * Retrieve minimum font size - * + * * @return int */ public function getMinFontSize() { return $this->_minFontSize; } - + /** * Defined by Zend_Tag_Cloud_Decorator_Tag * @@ -240,25 +240,25 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag if (null === ($weightValues = $this->getClassList())) { $weightValues = range($this->getMinFontSize(), $this->getMaxFontSize()); } - + $tags->spreadWeightValues($weightValues); - + $result = array(); - + foreach ($tags as $tag) { if (null === ($classList = $this->getClassList())) { $attribute = sprintf('style="font-size: %d%s;"', $tag->getParam('weightValue'), $this->getFontSizeUnit()); } else { $attribute = sprintf('class="%s"', htmlspecialchars($tag->getParam('weightValue'))); } - + $tagHtml = sprintf('%s', htmlSpecialChars($tag->getParam('url')), $attribute, $tag->getTitle()); - + foreach ($this->getHtmlTags() as $key => $data) { if (is_array($data)) { $htmlTag = $key; $attributes = ''; - + foreach ($data as $param => $value) { $attributes .= ' ' . $param . '="' . htmlspecialchars($value) . '"'; } @@ -266,13 +266,13 @@ class Zend_Tag_Cloud_Decorator_HtmlTag extends Zend_Tag_Cloud_Decorator_Tag $htmlTag = $data; $attributes = ''; } - + $tagHtml = sprintf('<%1$s%3$s>%2$s', $htmlTag, $tagHtml, $attributes); } - + $result[] = $tagHtml; } - + return $result; } } diff --git a/libs/Zend/Tag/Cloud/Decorator/Tag.php b/libs/Zend/Tag/Cloud/Decorator/Tag.php index 2cceab9..010f979 100644 --- a/libs/Zend/Tag/Cloud/Decorator/Tag.php +++ b/libs/Zend/Tag/Cloud/Decorator/Tag.php @@ -17,7 +17,7 @@ * @subpackage Cloud * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Tag.php 16209 2009-06-21 19:20:34Z thomas $ + * @version $Id: Tag.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -77,7 +77,7 @@ abstract class Zend_Tag_Cloud_Decorator_Tag return $this; } - + /** * Render a list of tags * diff --git a/libs/Zend/Tag/Item.php b/libs/Zend/Tag/Item.php index b68261d..7f39ad6 100644 --- a/libs/Zend/Tag/Item.php +++ b/libs/Zend/Tag/Item.php @@ -17,7 +17,7 @@ * @subpackage Item * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Item.php 16209 2009-06-21 19:20:34Z thomas $ + * @version $Id: Item.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -40,21 +40,21 @@ class Zend_Tag_Item implements Zend_Tag_Taggable * @var string */ protected $_title = null; - + /** * Weight of the tag * * @var float */ protected $_weight = null; - + /** * Custom parameters * * @var string */ protected $_params = array(); - + /** * Option keys to skip when calling setOptions() * @@ -86,18 +86,18 @@ class Zend_Tag_Item implements Zend_Tag_Taggable } $this->setOptions($options); - + if ($this->_title === null) { require_once 'Zend/Tag/Exception.php'; throw new Zend_Tag_Exception('Title was not set'); } - + if ($this->_weight === null) { require_once 'Zend/Tag/Exception.php'; throw new Zend_Tag_Exception('Weight was not set'); } } - + /** * Set options of the tag * @@ -119,7 +119,7 @@ class Zend_Tag_Item implements Zend_Tag_Taggable return $this; } - + /** * Defined by Zend_Tag_Taggable * @@ -143,11 +143,11 @@ class Zend_Tag_Item implements Zend_Tag_Taggable require_once 'Zend/Tag/Exception.php'; throw new Zend_Tag_Exception('Title must be a string'); } - + $this->_title = (string) $title; return $this; } - + /** * Defined by Zend_Tag_Taggable * @@ -157,7 +157,7 @@ class Zend_Tag_Item implements Zend_Tag_Taggable { return $this->_weight; } - + /** * Set the weight * @@ -171,11 +171,11 @@ class Zend_Tag_Item implements Zend_Tag_Taggable require_once 'Zend/Tag/Exception.php'; throw new Zend_Tag_Exception('Weight must be numeric'); } - + $this->_weight = (float) $weight; return $this; } - + /** * Set multiple params at once * @@ -187,10 +187,10 @@ class Zend_Tag_Item implements Zend_Tag_Taggable foreach ($params as $name => $value) { $this->setParam($name, $value); } - + return $this; } - + /** * Defined by Zend_Tag_Taggable * @@ -203,7 +203,7 @@ class Zend_Tag_Item implements Zend_Tag_Taggable $this->_params[$name] = $value; return $this; } - + /** * Defined by Zend_Tag_Taggable * diff --git a/libs/Zend/Tag/ItemList.php b/libs/Zend/Tag/ItemList.php index fb47663..f09c64d 100644 --- a/libs/Zend/Tag/ItemList.php +++ b/libs/Zend/Tag/ItemList.php @@ -17,7 +17,7 @@ * @subpackage ItemList * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ItemList.php 16209 2009-06-21 19:20:34Z thomas $ + * @version $Id: ItemList.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,7 +39,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess * @var array */ protected $_items = array(); - + /** * Count all items * @@ -49,7 +49,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess { return count($this->_items); } - + /** * Spread values in the items relative to their weight * @@ -64,10 +64,10 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess require_once 'Zend/Tag/Exception.php'; throw new Zend_Tag_Exception('Value list may not be empty'); } - + // Re-index the array $values = array_values($values); - + // If just a single value is supplied simply assign it to to all tags if (count($values) === 1) { foreach ($this->_items as $item) { @@ -77,30 +77,30 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess // Calculate min- and max-weight $minWeight = null; $maxWeight = null; - + foreach ($this->_items as $item) { if ($minWeight === null && $maxWeight === null) { $minWeight = $item->getWeight(); $maxWeight = $item->getWeight(); } else { $minWeight = min($minWeight, $item->getWeight()); - $maxWeight = max($maxWeight, $item->getWeight()); + $maxWeight = max($maxWeight, $item->getWeight()); } } - + // Calculate the thresholds $steps = count($values); $delta = ($maxWeight - $minWeight) / ($steps - 1); $thresholds = array(); - + for ($i = 0; $i < $steps; $i++) { $thresholds[$i] = floor(100 * log(($minWeight + $i * $delta) + 2)); } - - // Then assign the weight values + + // Then assign the weight values foreach ($this->_items as $item) { $threshold = floor(100 * log($item->getWeight() + 2)); - + for ($i = 0; $i < $steps; $i++) { if ($threshold <= $thresholds[$i]) { $item->setParam('weightValue', $values[$i]); @@ -110,7 +110,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess } } } - + /** * Seek to an absolute positio * @@ -122,17 +122,17 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess { $this->rewind(); $position = 0; - + while ($position < $index && $this->valid()) { $this->next(); $position++; } - + if (!$this->valid()) { throw new OutOfBoundsException('Invalid seek position'); - } + } } - + /** * Return the current element * @@ -142,7 +142,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess { return current($this->_items); } - + /** * Move forward to next element * @@ -152,7 +152,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess { return next($this->_items); } - + /** * Return the key of the current element * @@ -172,7 +172,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess { return ($this->current() !== false); } - + /** * Rewind the Iterator to the first element * @@ -182,7 +182,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess { reset($this->_items); } - + /** * Check if an offset exists * @@ -192,7 +192,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess public function offsetExists($offset) { return array_key_exists($offset, $this->_items); } - + /** * Get the value of an offset * @@ -202,7 +202,7 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess public function offsetGet($offset) { return $this->_items[$offset]; } - + /** * Append a new item * @@ -218,14 +218,14 @@ class Zend_Tag_ItemList implements Countable, SeekableIterator, ArrayAccess require_once 'Zend/Tag/Exception.php'; throw new Zend_Tag_Exception('Item must implement Zend_Tag_Taggable'); } - + if ($offset === null) { $this->_items[] = $item; } else { $this->_items[$offset] = $item; } } - + /** * Unset an item * diff --git a/libs/Zend/Tag/Taggable.php b/libs/Zend/Tag/Taggable.php index 93fcd48..7666682 100644 --- a/libs/Zend/Tag/Taggable.php +++ b/libs/Zend/Tag/Taggable.php @@ -17,7 +17,7 @@ * @subpackage Item * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Taggable.php 16209 2009-06-21 19:20:34Z thomas $ + * @version $Id: Taggable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -34,14 +34,14 @@ interface Zend_Tag_Taggable * @return string */ public function getTitle(); - + /** * Get the weight of the tag * * @return float */ public function getWeight(); - + /** * Set a parameter * @@ -49,7 +49,7 @@ interface Zend_Tag_Taggable * @param string $value */ public function setParam($name, $value); - + /** * Get a parameter * diff --git a/libs/Zend/Test/DbAdapter.php b/libs/Zend/Test/DbAdapter.php index 928c4cd..8586db1 100644 --- a/libs/Zend/Test/DbAdapter.php +++ b/libs/Zend/Test/DbAdapter.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbAdapter.php 16911 2009-07-21 11:54:03Z matthew $ + * @version $Id: DbAdapter.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,6 +30,11 @@ require_once "Zend/Db/Adapter/Abstract.php"; */ require_once "Zend/Test/DbStatement.php"; +/** + * @see Zend_Db_Profiler + */ +require_once 'Zend/Db/Profiler.php'; + /** * Testing Database Adapter which acts as a stack for SQL Results * @@ -71,7 +76,10 @@ class Zend_Test_DbAdapter extends Zend_Db_Adapter_Abstract * Empty constructor to make it parameterless. */ public function __construct() - { + { + $profiler = new Zend_Db_Profiler(); + $profiler->setEnabled(true); + $this->setProfiler($profiler); } /** @@ -88,7 +96,7 @@ class Zend_Test_DbAdapter extends Zend_Db_Adapter_Abstract /** * Append a new Insert Id to the {@see lastInsertId}. - * + * * @param int|string $id * @return Zend_Test_DbAdapter */ @@ -214,11 +222,20 @@ class Zend_Test_DbAdapter extends Zend_Db_Adapter_Abstract */ public function prepare($sql) { + $queryId = $this->getProfiler()->queryStart($sql); + if(count($this->_statementStack)) { - return array_pop($this->_statementStack); + $stmt = array_pop($this->_statementStack); } else { - return new Zend_Test_DbStatement(); + $stmt = new Zend_Test_DbStatement(); } + + if($this->getProfiler()->getEnabled() == true) { + $qp = $this->getProfiler()->getQueryProfile($queryId); + $stmt->setQueryProfile($qp); + } + + return $stmt; } /** @@ -257,7 +274,7 @@ class Zend_Test_DbAdapter extends Zend_Db_Adapter_Abstract */ protected function _commit() { - + return; } /** @@ -301,7 +318,7 @@ class Zend_Test_DbAdapter extends Zend_Db_Adapter_Abstract */ public function supportsParameters($type) { - return false; + return true; } /** diff --git a/libs/Zend/Test/DbStatement.php b/libs/Zend/Test/DbStatement.php index 9e4ebd9..05ac9ac 100644 --- a/libs/Zend/Test/DbStatement.php +++ b/libs/Zend/Test/DbStatement.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbStatement.php 16911 2009-07-21 11:54:03Z matthew $ + * @version $Id: DbStatement.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once "Zend/Db/Statement/Interface.php"; @@ -48,9 +48,14 @@ class Zend_Test_DbStatement implements Zend_Db_Statement_Interface */ protected $_rowCount = 0; + /** + * @var Zend_Db_Profiler_Query + */ + protected $_queryProfile = null; + /** * Create a Select statement which returns the given array of rows. - * + * * @param array $rows * @return Zend_Test_DbStatement */ @@ -65,7 +70,7 @@ class Zend_Test_DbStatement implements Zend_Db_Statement_Interface /** * Create an Insert Statement - * + * * @param int $affectedRows * @return Zend_Test_DbStatement */ @@ -109,6 +114,14 @@ class Zend_Test_DbStatement implements Zend_Db_Statement_Interface return $stmt; } + /** + * @param Zend_Db_Profiler_Query $qp + */ + public function setQueryProfile(Zend_Db_Profiler_Query $qp) + { + $this->_queryProfile = $qp; + } + /** * @param int $rowCount */ @@ -156,6 +169,9 @@ class Zend_Test_DbStatement implements Zend_Db_Statement_Interface */ public function bindParam($parameter, &$variable, $type = null, $length = null, $options = null) { + if($this->_queryProfile !== null) { + $this->_queryProfile->bindParam($parameter, $variable); + } return true; } @@ -229,6 +245,10 @@ class Zend_Test_DbStatement implements Zend_Db_Statement_Interface */ public function execute(array $params = array()) { + if($this->_queryProfile !== null) { + $this->_queryProfile->bindParams($params); + $this->_queryProfile->end(); + } return true; } diff --git a/libs/Zend/Test/PHPUnit/Constraint/DomQuery.php b/libs/Zend/Test/PHPUnit/Constraint/DomQuery.php index 60c339c..8155342 100644 --- a/libs/Zend/Test/PHPUnit/Constraint/DomQuery.php +++ b/libs/Zend/Test/PHPUnit/Constraint/DomQuery.php @@ -16,7 +16,7 @@ * @package Zend_Test * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DomQuery.php 16874 2009-07-20 12:46:00Z mikaelkael $ + * @version $Id: DomQuery.php 18234 2009-09-18 14:06:43Z sgehrig $ */ /** PHPUnit_Framework_Constraint */ @@ -390,10 +390,14 @@ class Zend_Test_PHPUnit_Constraint_DomQuery extends PHPUnit_Framework_Constraint */ protected function _getNodeContent(DOMNode $node) { - $doc = $node->ownerDocument; - $content = $doc->saveXML($node); - $tag = $node->nodeName; - $regex = '|]*>|'; - return preg_replace($regex, '', $content); + if ($node instanceof DOMAttr) { + return $node->value; + } else { + $doc = $node->ownerDocument; + $content = $doc->saveXML($node); + $tag = $node->nodeName; + $regex = '|]*>|'; + return preg_replace($regex, '', $content); + } } } diff --git a/libs/Zend/Test/PHPUnit/ControllerTestCase.php b/libs/Zend/Test/PHPUnit/ControllerTestCase.php index fd7a940..d601e3d 100644 --- a/libs/Zend/Test/PHPUnit/ControllerTestCase.php +++ b/libs/Zend/Test/PHPUnit/ControllerTestCase.php @@ -16,7 +16,7 @@ * @package Zend_Test * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ControllerTestCase.php 16874 2009-07-20 12:46:00Z mikaelkael $ + * @version $Id: ControllerTestCase.php 18605 2009-10-16 20:23:09Z matthew $ */ /** PHPUnit_Framework_TestCase */ @@ -141,7 +141,10 @@ abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_Te { $this->reset(); if (null !== $this->bootstrap) { - if (is_callable($this->bootstrap)) { + if ($this->bootstrap instanceof Zend_Application) { + $this->bootstrap->bootstrap(); + $this->_frontController = $this->bootstrap->getBootstrap()->getResource('frontcontroller'); + } elseif (is_callable($this->bootstrap)) { call_user_func($this->bootstrap); } elseif (is_string($this->bootstrap)) { require_once 'Zend/Loader.php'; @@ -242,6 +245,10 @@ abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_Te */ public function resetRequest() { + if ($this->_request instanceof Zend_Controller_Request_HttpTestCase) { + $this->_request->clearQuery() + ->clearPost(); + } $this->_request = null; return $this; } @@ -905,7 +912,10 @@ abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_Te { $this->_incrementAssertionCount(); if ($module != $this->request->getModuleName()) { - $msg = sprintf('Failed asserting last module used was "%s"', $module); + $msg = sprintf('Failed asserting last module used <"%s"> was "%s"', + $this->request->getModuleName(), + $module + ); if (!empty($message)) { $msg = $message . "\n" . $msg; } @@ -943,7 +953,10 @@ abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_Te { $this->_incrementAssertionCount(); if ($controller != $this->request->getControllerName()) { - $msg = sprintf('Failed asserting last controller used was "%s"', $controller); + $msg = sprintf('Failed asserting last controller used <"%s"> was "%s"', + $this->request->getControllerName(), + $controller + ); if (!empty($message)) { $msg = $message . "\n" . $msg; } @@ -962,7 +975,10 @@ abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_Te { $this->_incrementAssertionCount(); if ($controller == $this->request->getControllerName()) { - $msg = sprintf('Failed asserting last controller used was NOT "%s"', $controller); + $msg = sprintf('Failed asserting last controller used <"%s"> was NOT "%s"', + $this->request->getControllerName(), + $controller + ); if (!empty($message)) { $msg = $message . "\n" . $msg; } @@ -981,7 +997,7 @@ abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_Te { $this->_incrementAssertionCount(); if ($action != $this->request->getActionName()) { - $msg = sprintf('Failed asserting last action used was "%s"', $action); + $msg = sprintf('Failed asserting last action used <"%s"> was "%s"', $this->request->getActionName(), $action); if (!empty($message)) { $msg = $message . "\n" . $msg; } @@ -1000,7 +1016,7 @@ abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_Te { $this->_incrementAssertionCount(); if ($action == $this->request->getActionName()) { - $msg = sprintf('Failed asserting last action used was NOT "%s"', $action); + $msg = sprintf('Failed asserting last action used <"%s"> was NOT "%s"', $this->request->getActionName(), $action); if (!empty($message)) { $msg = $message . "\n" . $msg; } @@ -1020,7 +1036,10 @@ abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_Te $this->_incrementAssertionCount(); $router = $this->frontController->getRouter(); if ($route != $router->getCurrentRouteName()) { - $msg = sprintf('Failed asserting route matched was "%s"', $route); + $msg = sprintf('Failed asserting matched route was "%s", actual route is %s', + $route, + $router->getCurrentRouteName() + ); if (!empty($message)) { $msg = $message . "\n" . $msg; } diff --git a/libs/Zend/Test/PHPUnit/DatabaseTestCase.php b/libs/Zend/Test/PHPUnit/DatabaseTestCase.php index a3f5fbe..bb57874 100644 --- a/libs/Zend/Test/PHPUnit/DatabaseTestCase.php +++ b/libs/Zend/Test/PHPUnit/DatabaseTestCase.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DatabaseTestCase.php 16911 2009-07-21 11:54:03Z matthew $ + * @version $Id: DatabaseTestCase.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -76,7 +76,7 @@ abstract class Zend_Test_PHPUnit_DatabaseTestCase extends PHPUnit_Extensions_Dat /** * Convenience function to get access to the database connection. - * + * * @return Zend_Db_Adapter_Abstract */ protected function getAdapter() diff --git a/libs/Zend/Test/PHPUnit/Db/Connection.php b/libs/Zend/Test/PHPUnit/Db/Connection.php index b60cbcb..c87b2ce 100644 --- a/libs/Zend/Test/PHPUnit/Db/Connection.php +++ b/libs/Zend/Test/PHPUnit/Db/Connection.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Connection.php 16607 2009-07-09 21:51:46Z beberlei $ + * @version $Id: Connection.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -50,7 +50,7 @@ class Zend_Test_PHPUnit_Db_Connection extends PHPUnit_Extensions_Database_DB_Def { /** * Zend_Db_Adapter_Abstract - * + * * @var Zend_Db_Adapter_Abstract */ protected $_connection; @@ -71,7 +71,7 @@ class Zend_Test_PHPUnit_Db_Connection extends PHPUnit_Extensions_Database_DB_Def /** * Construct Connection based on Zend_Db_Adapter_Abstract - * + * * @param Zend_Db_Adapter_Abstract $db * @param string $schema */ diff --git a/libs/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php b/libs/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php index fd22753..714ec44 100644 --- a/libs/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php +++ b/libs/Zend/Test/PHPUnit/Db/DataSet/DbRowset.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbRowset.php 16607 2009-07-09 21:51:46Z beberlei $ + * @version $Id: DbRowset.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -41,7 +41,7 @@ class Zend_Test_PHPUnit_Db_DataSet_DbRowset extends PHPUnit_Extensions_Database_ { /** * Construct Table object from a Zend_Db_Table_Rowset - * + * * @param Zend_Db_Table_Rowset_Abstract $rowset * @param string $tableName */ diff --git a/libs/Zend/Test/PHPUnit/Db/DataSet/DbTable.php b/libs/Zend/Test/PHPUnit/Db/DataSet/DbTable.php index ccd459a..e353108 100644 --- a/libs/Zend/Test/PHPUnit/Db/DataSet/DbTable.php +++ b/libs/Zend/Test/PHPUnit/Db/DataSet/DbTable.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbTable.php 16670 2009-07-12 13:35:45Z beberlei $ + * @version $Id: DbTable.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -42,7 +42,7 @@ class Zend_Test_PHPUnit_Db_DataSet_DbTable extends PHPUnit_Extensions_Database_D { /** * Zend_Db_Table object - * + * * @var Zend_Db_Table_Abstract */ protected $_table = null; diff --git a/libs/Zend/Test/PHPUnit/Db/Exception.php b/libs/Zend/Test/PHPUnit/Db/Exception.php index 86166e1..ccb3554 100644 --- a/libs/Zend/Test/PHPUnit/Db/Exception.php +++ b/libs/Zend/Test/PHPUnit/Db/Exception.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16607 2009-07-09 21:51:46Z beberlei $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -37,5 +37,5 @@ require_once "Zend/Exception.php"; */ class Zend_Test_PHPUnit_Db_Exception extends Zend_Exception { - + } \ No newline at end of file diff --git a/libs/Zend/Test/PHPUnit/Db/Metadata/Generic.php b/libs/Zend/Test/PHPUnit/Db/Metadata/Generic.php index 56a7e0d..83231e8 100644 --- a/libs/Zend/Test/PHPUnit/Db/Metadata/Generic.php +++ b/libs/Zend/Test/PHPUnit/Db/Metadata/Generic.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Generic.php 16607 2009-07-09 21:51:46Z beberlei $ + * @version $Id: Generic.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -41,7 +41,7 @@ class Zend_Test_PHPUnit_Db_Metadata_Generic implements PHPUnit_Extensions_Databa { /** * Zend_Db Connection - * + * * @var Zend_Db_Adapter_Abstract */ protected $_connection; @@ -55,7 +55,7 @@ class Zend_Test_PHPUnit_Db_Metadata_Generic implements PHPUnit_Extensions_Databa /** * Cached Table metadata - * + * * @var array */ protected $_tableMetadata = array(); @@ -75,7 +75,7 @@ class Zend_Test_PHPUnit_Db_Metadata_Generic implements PHPUnit_Extensions_Databa /** * List Tables - * + * * @return array */ public function getTableNames() @@ -85,7 +85,7 @@ class Zend_Test_PHPUnit_Db_Metadata_Generic implements PHPUnit_Extensions_Databa /** * Get Table information - * + * * @param string $tableName * @return array */ diff --git a/libs/Zend/Test/PHPUnit/Db/Operation/Truncate.php b/libs/Zend/Test/PHPUnit/Db/Operation/Truncate.php index 05be935..2a0d6b5 100644 --- a/libs/Zend/Test/PHPUnit/Db/Operation/Truncate.php +++ b/libs/Zend/Test/PHPUnit/Db/Operation/Truncate.php @@ -17,7 +17,7 @@ * @subpackage PHPUnit * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Truncate.php 16607 2009-07-09 21:51:46Z beberlei $ + * @version $Id: Truncate.php 19106 2009-11-20 17:15:30Z beberlei $ */ require_once "PHPUnit/Extensions/Database/Operation/IDatabaseOperation.php"; @@ -58,10 +58,10 @@ class Zend_Test_PHPUnit_Db_Operation_Truncate implements PHPUnit_Extensions_Data throw new Zend_Test_PHPUnit_Db_Exception("Not a valid Zend_Test_PHPUnit_Db_Connection instance, ".get_class($connection)." given!"); } - foreach ($dataSet as $table) { + foreach ($dataSet->getReverseIterator() AS $table) { try { $tableName = $table->getTableMetaData()->getTableName(); - $this->truncate($connection->getConnection(), $tableName); + $this->_truncate($connection->getConnection(), $tableName); } catch (Exception $e) { throw new PHPUnit_Extensions_Database_Operation_Exception('TRUNCATE', 'TRUNCATE '.$tableName.'', array(), $table, $e->getMessage()); } @@ -70,29 +70,49 @@ class Zend_Test_PHPUnit_Db_Operation_Truncate implements PHPUnit_Extensions_Data /** * Truncate a given table. - * + * * @param Zend_Db_Adapter_Abstract $db * @param string $tableName * @return void */ - private function truncate(Zend_Db_Adapter_Abstract $db, $tableName) + protected function _truncate(Zend_Db_Adapter_Abstract $db, $tableName) { $tableName = $db->quoteIdentifier($tableName); if($db instanceof Zend_Db_Adapter_Pdo_Sqlite) { $db->query('DELETE FROM '.$tableName); } else if($db instanceof Zend_Db_Adapter_Db2) { - if(strstr(PHP_OS, "WIN")) { + /*if(strstr(PHP_OS, "WIN")) { $file = tempnam(sys_get_temp_dir(), "zendtestdbibm_"); file_put_contents($file, ""); $db->query('IMPORT FROM '.$file.' OF DEL REPLACE INTO '.$tableName); unlink($file); } else { $db->query('IMPORT FROM /dev/null OF DEL REPLACE INTO '.$tableName); - } - } else if($db instanceof Zend_Db_Adapter_Pdo_Mssql) { + }*/ + require_once "Zend/Exception.php"; + throw Zend_Exception("IBM Db2 TRUNCATE not supported."); + } else if($this->_isMssqlOrOracle($db)) { $db->query('TRUNCATE TABLE '.$tableName); + } else if($db instanceof Zend_Db_Adapter_Pdo_Pgsql) { + $db->query('TRUNCATE '.$tableName.' CASCADE'); } else { $db->query('TRUNCATE '.$tableName); } } + + /** + * Detect if an adapter is for Mssql or Oracle Databases. + * + * @param Zend_Db_Adapter_Abstract $db + * @return bool + */ + private function _isMssqlOrOracle($db) + { + return ( + $db instanceof Zend_Db_Adapter_Pdo_Mssql || + $db instanceof Zend_Db_Adapter_Sqlsrv || + $db instanceof Zend_Db_Adapter_Pdo_Oci || + $db instanceof Zend_Db_Adapter_Oracle + ); + } } \ No newline at end of file diff --git a/libs/Zend/Text/Figlet.php b/libs/Zend/Text/Figlet.php index 01a606f..ee1e7ab 100644 --- a/libs/Zend/Text/Figlet.php +++ b/libs/Zend/Text/Figlet.php @@ -16,7 +16,7 @@ * @package Zend_Text_Figlet * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Figlet.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Figlet.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -257,7 +257,7 @@ class Zend_Text_Figlet /** * Option keys to skip when calling setOptions() - * + * * @var array */ protected $_skipOptions = array( diff --git a/libs/Zend/Text/MultiByte.php b/libs/Zend/Text/MultiByte.php index 574b0e3..68c659a 100644 --- a/libs/Zend/Text/MultiByte.php +++ b/libs/Zend/Text/MultiByte.php @@ -16,7 +16,7 @@ * @package Zend_Text * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MultiByte.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: MultiByte.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -42,32 +42,32 @@ class Zend_Text_MultiByte public static function wordWrap($string, $width = 75, $break = "\n", $cut = false, $charset = 'UTF-8') { $result = array(); - + while (($stringLength = iconv_strlen($string, $charset)) > 0) { $subString = iconv_substr($string, 0, $width, $charset); - + if ($subString === $string) { $cutLength = null; } else { $nextChar = iconv_substr($string, $width, 1, $charset); - + if ($nextChar === ' ' || $nextChar === $break) { $afterNextChar = iconv_substr($string, $width + 1, 1, $charset); - + if ($afterNextChar === false) { - $subString .= $nextChar; + $subString .= $nextChar; } - + $cutLength = iconv_strlen($subString, $charset) + 1; } else { $spacePos = iconv_strrpos($subString, ' ', $charset); - + if ($spacePos !== false) { $subString = iconv_substr($subString, 0, $spacePos, $charset); $cutLength = $spacePos + 1; } else if ($cut === false) { $spacePos = iconv_strpos($string, ' ', 0, $charset); - + if ($spacePos !== false) { $subString = iconv_substr($string, 0, $spacePos, $charset); $cutLength = $spacePos + 1; @@ -77,7 +77,7 @@ class Zend_Text_MultiByte } } else { $breakPos = iconv_strpos($subString, $break, 0, $charset); - + if ($breakPos !== false) { $subString = iconv_substr($subString, 0, $breakPos, $charset); $cutLength = $breakPos + 1; @@ -88,16 +88,16 @@ class Zend_Text_MultiByte } } } - + $result[] = $subString; - + if ($cutLength !== null) { $string = iconv_substr($string, $cutLength, ($stringLength - $cutLength), $charset); } else { break; } } - + return implode($break, $result); } diff --git a/libs/Zend/Text/Table.php b/libs/Zend/Text/Table.php index dd976c8..f513035 100644 --- a/libs/Zend/Text/Table.php +++ b/libs/Zend/Text/Table.php @@ -16,7 +16,7 @@ * @package Zend_Text_Table * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Table.php 16209 2009-06-21 19:20:34Z thomas $ + * @version $Id: Table.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,7 +36,7 @@ class Zend_Text_Table const AUTO_SEPARATE_HEADER = 0x1; const AUTO_SEPARATE_FOOTER = 0x2; const AUTO_SEPARATE_ALL = 0x4; - + /** * Decorator used for the table borders * @@ -57,21 +57,21 @@ class Zend_Text_Table * @var array */ protected $_rows = array(); - + /** * Auto separation mode * * @var integer */ protected $_autoSeparate = self::AUTO_SEPARATE_ALL; - + /** * Padding for columns * * @var integer */ protected $_padding = 0; - + /** * Default column aligns for rows created by appendRow(array $data) * @@ -85,24 +85,24 @@ class Zend_Text_Table * @var string */ protected $_pluginLoader = null; - + /** * Charset which is used for input by default * * @var string */ protected static $_inputCharset = 'utf-8'; - + /** * Charset which is used internally * * @var string */ protected static $_outputCharset = 'utf-8'; - + /** * Option keys to skip when calling setOptions() - * + * * @var array */ protected $_skipOptions = array( @@ -110,7 +110,7 @@ class Zend_Text_Table 'config', 'defaultColumnAlign', ); - + /** * Create a basic table object * @@ -119,7 +119,7 @@ class Zend_Text_Table * @throws Zend_Text_Table_Exception When no columns widths were set */ public function __construct($options = null) - { + { // Set options if (is_array($options)) { $this->setOptions($options); @@ -133,7 +133,7 @@ class Zend_Text_Table require_once 'Zend/Text/Table/Exception.php'; throw new Zend_Text_Table_Exception('You must define the column widths'); } - + // If no decorator was given, use default unicode decorator if ($this->_decorator === null) { if (self::getOutputCharset() === 'utf-8') { @@ -143,7 +143,7 @@ class Zend_Text_Table } } } - + /** * Set options from array * @@ -162,7 +162,7 @@ class Zend_Text_Table $this->$method($value); } } - + return $this; } @@ -176,7 +176,7 @@ class Zend_Text_Table { return $this->setOptions($config->toArray()); } - + /** * Set column widths * @@ -191,7 +191,7 @@ class Zend_Text_Table require_once 'Zend/Text/Table/Exception.php'; throw new Zend_Text_Table_Exception('You must supply at least one column'); } - + foreach ($columnWidths as $columnNum => $columnWidth) { if (is_int($columnWidth) === false or $columnWidth < 1) { require_once 'Zend/Text/Table/Exception.php'; @@ -201,7 +201,7 @@ class Zend_Text_Table } $this->_columnWidths = $columnWidths; - + return $this; } @@ -216,7 +216,7 @@ class Zend_Text_Table $this->_autoSeparate = (int) $autoSeparate; return $this; } - + /** * Set decorator * @@ -231,10 +231,10 @@ class Zend_Text_Table $classname = $this->getPluginLoader()->load($decorator); $this->_decorator = new $classname; } - + return $this; } - + /** * Set the column padding * @@ -246,7 +246,7 @@ class Zend_Text_Table $this->_padding = max(0, (int) $padding); return $this; } - + /** * Get the plugin loader for decorators * @@ -257,25 +257,25 @@ class Zend_Text_Table if ($this->_pluginLoader === null) { $prefix = 'Zend_Text_Table_Decorator_'; $pathPrefix = 'Zend/Text/Table/Decorator/'; - + require_once 'Zend/Loader/PluginLoader.php'; $this->_pluginLoader = new Zend_Loader_PluginLoader(array($prefix => $pathPrefix)); } - + return $this->_pluginLoader; } - + /** - * Set default column align for rows created by appendRow(array $data) + * Set default column align for rows created by appendRow(array $data) * * @param integer $columnNum * @param string $align * @return Zend_Text_Table */ - public function setDefaultColumnAlign($columnNum, $align) + public function setDefaultColumnAlign($columnNum, $align) { $this->_defaultColumnAligns[$columnNum] = $align; - + return $this; } @@ -288,7 +288,7 @@ class Zend_Text_Table { self::$_inputCharset = strtolower($charset); } - + /** * Get the input charset for column contents * @@ -298,7 +298,7 @@ class Zend_Text_Table { return self::$_inputCharset; } - + /** * Set the output charset for column contents * @@ -308,7 +308,7 @@ class Zend_Text_Table { self::$_outputCharset = strtolower($charset); } - + /** * Get the output charset for column contents * @@ -318,7 +318,7 @@ class Zend_Text_Table { return self::$_outputCharset; } - + /** * Append a row to the table * @@ -333,15 +333,15 @@ class Zend_Text_Table require_once 'Zend/Text/Table/Exception.php'; throw new Zend_Text_Table_Exception('$row must be an array or instance of Zend_Text_Table_Row'); } - + if (is_array($row)) { if (count($row) > count($this->_columnWidths)) { require_once 'Zend/Text/Table/Exception.php'; throw new Zend_Text_Table_Exception('Row contains too many columns'); } - + require_once 'Zend/Text/Table/Row.php'; - + $data = $row; $row = new Zend_Text_Table_Row(); $colNum = 0; @@ -351,14 +351,14 @@ class Zend_Text_Table } else { $align = null; } - + $row->appendColumn(new Zend_Text_Table_Column($columnData, $align)); - $colNum++; + $colNum++; } } - + $this->_rows[] = $row; - + return $this; } @@ -422,31 +422,31 @@ class Zend_Text_Table } else { $drawSeparator = false; } - - if ($drawSeparator) { + + if ($drawSeparator) { $result .= $this->_decorator->getVerticalRight(); - + $currentUpperColumn = 0; $currentLowerColumn = 0; $currentUpperWidth = 0; $currentLowerWidth = 0; - + // Loop through all column widths foreach ($this->_columnWidths as $columnNum => $columnWidth) { // Add the horizontal line $result .= str_repeat($this->_decorator->getHorizontal(), $columnWidth); - + // If this is the last line, break out if (($columnNum + 1) === $totalNumColumns) { break; } - + // Else check, which connector style has to be used $connector = 0x0; $currentUpperWidth += $columnWidth; $currentLowerWidth += $columnWidth; - + if ($lastColumnWidths[$currentUpperColumn] === $currentUpperWidth) { $connector |= 0x1; $currentUpperColumn += 1; @@ -454,7 +454,7 @@ class Zend_Text_Table } else { $currentUpperWidth += 1; } - + if ($columnWidths[$currentLowerColumn] === $currentLowerWidth) { $connector |= 0x2; $currentLowerColumn += 1; @@ -462,30 +462,30 @@ class Zend_Text_Table } else { $currentLowerWidth += 1; } - + switch ($connector) { case 0x0: $result .= $this->_decorator->getHorizontal(); break; - + case 0x1: $result .= $this->_decorator->getHorizontalUp(); break; - + case 0x2: $result .= $this->_decorator->getHorizontalDown(); break; - + case 0x3: $result .= $this->_decorator->getCross(); break; - + default: // This can never happen, but the CS tells I have to have it ... break; } } - + $result .= $this->_decorator->getVerticalLeft() . "\n"; } } diff --git a/libs/Zend/Text/Table/Row.php b/libs/Zend/Text/Table/Row.php index e62258a..a31de14 100644 --- a/libs/Zend/Text/Table/Row.php +++ b/libs/Zend/Text/Table/Row.php @@ -16,7 +16,7 @@ * @package Zend_Text_Table * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Row.php 16209 2009-06-21 19:20:34Z thomas $ + * @version $Id: Row.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -47,7 +47,7 @@ class Zend_Text_Table_Row * Create a new column and append it to the row * * @param string $content - * @param array $options + * @param array $options * @return Zend_Text_Table_Row */ public function createColumn($content, array $options = null) @@ -55,20 +55,20 @@ class Zend_Text_Table_Row $align = null; $colSpan = null; $encoding = null; - + if ($options !== null) { extract($options, EXTR_IF_EXISTS); } - + require_once 'Zend/Text/Table/Column.php'; - + $column = new Zend_Text_Table_Column($content, $align, $colSpan, $encoding); - + $this->appendColumn($column); - + return $this; } - + /** * Append a column to the row * @@ -78,13 +78,13 @@ class Zend_Text_Table_Row public function appendColumn(Zend_Text_Table_Column $column) { $this->_columns[] = $column; - + return $this; } - + /** * Get a column by it's index - * + * * Returns null, when the index is out of range * * @param integer $index @@ -95,10 +95,10 @@ class Zend_Text_Table_Row if (!isset($this->_columns[$index])) { return null; } - + return $this->_columns[$index]; } - + /** * Get all columns of the row * @@ -131,7 +131,7 @@ class Zend_Text_Table_Row * @param array $columnWidths Width of all columns * @param Zend_Text_Table_Decorator_Interface $decorator Decorator for the row borders * @param integer $padding Padding for the columns - * @throws Zend_Text_Table_Exception When there are too many columns + * @throws Zend_Text_Table_Exception When there are too many columns * @return string */ public function render(array $columnWidths, @@ -147,7 +147,7 @@ class Zend_Text_Table_Row require_once 'Zend/Text/Table/Column.php'; $this->appendColumn(new Zend_Text_Table_Column(null, null, count($columnWidths))); } - + // First we have to render all columns, to get the maximum height $renderedColumns = array(); $maxHeight = 0; diff --git a/libs/Zend/Tool/Framework/Action/Base.php b/libs/Zend/Tool/Framework/Action/Base.php index cbb4cb1..c6a2172 100644 --- a/libs/Zend/Tool/Framework/Action/Base.php +++ b/libs/Zend/Tool/Framework/Action/Base.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Base.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Base.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,16 +31,16 @@ require_once 'Zend/Tool/Framework/Action/Interface.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Action_Base implements Zend_Tool_Framework_Action_Interface +class Zend_Tool_Framework_Action_Base implements Zend_Tool_Framework_Action_Interface { /** * @var string */ protected $_name = null; - + /** - * constructor - + * constructor - * * @param unknown_type $options */ @@ -53,7 +53,7 @@ class Zend_Tool_Framework_Action_Base implements Zend_Tool_Framework_Action_Inte // implement $options here in the future if this is needed } } - + /** * setName() * @@ -65,7 +65,7 @@ class Zend_Tool_Framework_Action_Base implements Zend_Tool_Framework_Action_Inte $this->_name = $name; return $this; } - + /** * getName() * @@ -78,7 +78,7 @@ class Zend_Tool_Framework_Action_Base implements Zend_Tool_Framework_Action_Inte } return $this->_name; } - + /** * _parseName - internal method to determine the name of an action when one is not explicity provided. * @@ -91,5 +91,5 @@ class Zend_Tool_Framework_Action_Base implements Zend_Tool_Framework_Action_Inte $actionName = substr($className, strrpos($className, '_')+1); return $actionName; } - + } diff --git a/libs/Zend/Tool/Framework/Action/Exception.php b/libs/Zend/Tool/Framework/Action/Exception.php index 843a1a2..1e17d8b 100644 --- a/libs/Zend/Tool/Framework/Action/Exception.php +++ b/libs/Zend/Tool/Framework/Action/Exception.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,5 +33,5 @@ require_once 'Zend/Tool/Framework/Exception.php'; */ class Zend_Tool_Framework_Action_Exception extends Zend_Tool_Framework_Exception { - + } diff --git a/libs/Zend/Tool/Framework/Action/Repository.php b/libs/Zend/Tool/Framework/Action/Repository.php index 8473619..92c93b0 100644 --- a/libs/Zend/Tool/Framework/Action/Repository.php +++ b/libs/Zend/Tool/Framework/Action/Repository.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Repository.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Repository.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once 'Zend/Tool/Framework/Registry/EnabledInterface.php'; @@ -28,20 +28,20 @@ require_once 'Zend/Tool/Framework/Registry/EnabledInterface.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Action_Repository +class Zend_Tool_Framework_Action_Repository implements Zend_Tool_Framework_Registry_EnabledInterface, IteratorAggregate, Countable { - + /** * @var Zend_Tool_Framework_Registry_Interface */ protected $_registry = null; - + /** * @var array */ protected $_actions = array(); - + /** * setRegistry() * @@ -51,7 +51,7 @@ class Zend_Tool_Framework_Action_Repository { $this->_registry = $registry; } - + /** * addAction() * @@ -66,10 +66,10 @@ class Zend_Tool_Framework_Action_Repository require_once 'Zend/Tool/Framework/Action/Exception.php'; throw new Zend_Tool_Framework_Action_Exception('An action name for the provided action could not be determined.'); } - + if (!$overrideExistingAction && array_key_exists(strtolower($actionName), $this->_actions)) { require_once 'Zend/Tool/Framework/Action/Exception.php'; - throw new Zend_Tool_Framework_Action_Exception('An action by the name ' . $actionName + throw new Zend_Tool_Framework_Action_Exception('An action by the name ' . $actionName . ' is already registered and $overrideExistingAction is set to false.'); } @@ -86,7 +86,7 @@ class Zend_Tool_Framework_Action_Repository { return null; } - + /** * getActions() - get all actions in the repository * @@ -111,7 +111,7 @@ class Zend_Tool_Framework_Action_Repository return $this->_actions[strtolower($actionName)]; } - + /** * count() required by the Countable interface * @@ -121,7 +121,7 @@ class Zend_Tool_Framework_Action_Repository { return count($this->_actions); } - + /** * getIterator() - get all actions, this supports the IteratorAggregate interface * diff --git a/libs/Zend/Tool/Framework/Client/Abstract.php b/libs/Zend/Tool/Framework/Client/Abstract.php index fe6163b..73aedcc 100644 --- a/libs/Zend/Tool/Framework/Client/Abstract.php +++ b/libs/Zend/Tool/Framework/Client/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -44,7 +44,7 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor * @var Zend_Tool_Framework_Registry */ protected $_registry = null; - + /** * @var callback|null */ @@ -54,19 +54,19 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor * @var bool */ protected $_isInitialized = false; - + /** * @var Zend_Log */ protected $_debugLogger = null; - + public function __construct($options = array()) { if ($options) { $this->setOptions($options); } } - + public function setOptions(Array $options) { foreach ($options as $optionName => $optionValue) { @@ -76,15 +76,15 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor } } } - + /** - * getName() - Return the client name which can be used to + * getName() - Return the client name which can be used to * query the manifest if need be. * * @return string The client name */ abstract public function getName(); - + /** * initialized() - This will initialize the client for use * @@ -95,15 +95,15 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor if ($this->_isInitialized) { return; } - - // this might look goofy, but this is setting up the + + // this might look goofy, but this is setting up the // registry for dependency injection into the client $registry = new Zend_Tool_Framework_Registry(); $registry->setClient($this); - + // NOTE: at this moment, $this->_registry should contain // the registry object - + // run any preInit $this->_preInit(); @@ -113,27 +113,27 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor require_once 'Zend/Log/Writer/Null.php'; $this->_debugLogger = new Zend_Log(new Zend_Log_Writer_Null()); } - + // let the loader load, then the repositories process whats been loaded $this->_registry->getLoader()->load(); - + // process the action repository $this->_registry->getActionRepository()->process(); - + // process the provider repository $this->_registry->getProviderRepository()->process(); - + // process the manifest repository $this->_registry->getManifestRepository()->process(); - + if ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface) { require_once 'Zend/Tool/Framework/Client/Interactive/InputHandler.php'; } - + if ($this instanceof Zend_Tool_Framework_Client_Interactive_OutputInterface) { $this->_registry->getResponse()->setContentCallback(array($this, 'handleInteractiveOutput')); } - + } @@ -160,7 +160,7 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor protected function _postDispatch() { } - + /** * setRegistry() - Required by the Zend_Tool_Framework_Registry_EnabledInterface * interface which ensures proper registry dependency resolution @@ -173,10 +173,10 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor $this->_registry = $registry; return $this; } - + /** * hasInteractiveInput() - Convienence method for determining if this - * client can handle interactive input, and thus be able to run the + * client can handle interactive input, and thus be able to run the * promptInteractiveInput * * @return bool @@ -185,21 +185,21 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor { return ($this instanceof Zend_Tool_Framework_Client_Interactive_InputInterface); } - + public function promptInteractiveInput($inputRequest) { if (!$this->hasInteractiveInput()) { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('promptInteractive() cannot be called on a non-interactive client.'); } - + $inputHandler = new Zend_Tool_Framework_Client_Interactive_InputHandler(); $inputHandler->setClient($this); $inputHandler->setInputRequest($inputRequest); return $inputHandler->handle(); } - + /** * This method should be called in order to "handle" a Tooling Client * request that has come to the client that has been implemented. @@ -207,7 +207,7 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor public function dispatch() { $this->initialize(); - + try { $this->_preDispatch(); @@ -234,51 +234,51 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor $this->_postDispatch(); } - + public function convertToClientNaming($string) { return $string; } - + public function convertFromClientNaming($string) { return $string; } - + protected function _handleDispatch() { // get the provider repository $providerRepository = $this->_registry->getProviderRepository(); - + $request = $this->_registry->getRequest(); - + // get the dispatchable provider signature $providerSignature = $providerRepository->getProviderSignature($request->getProviderName()); - + // get the actual provider $provider = $providerSignature->getProvider(); // ensure that we can pretend if this is a pretend request if ($request->isPretend() && (!$provider instanceof Zend_Tool_Framework_Provider_Pretendable)) { require_once 'Zend/Tool/Framework/Client/Exception.php'; - throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - provider does not support pretend'); + throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - provider does not support pretend'); } - + // get the action name $actionName = $this->_registry->getRequest()->getActionName(); if (!$actionableMethod = $providerSignature->getActionableMethodByActionName($actionName)) { require_once 'Zend/Tool/Framework/Client/Exception.php'; - throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - actionable method not found'); + throw new Zend_Tool_Framework_Client_Exception('Dispatcher error - actionable method not found'); } - + // get the actual method and param information $methodName = $actionableMethod['methodName']; $methodParameters = $actionableMethod['parameterInfo']; // get the provider params $requestParameters = $this->_registry->getRequest()->getProviderParameters(); - + // @todo This seems hackish, determine if there is a better way $callParameters = array(); foreach ($methodParameters as $methodParameterName => $methodParameterValue) { @@ -299,11 +299,11 @@ abstract class Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framewor $callParameters[] = (array_key_exists($methodParameterName, $requestParameters)) ? $requestParameters[$methodParameterName] : $methodParameterValue['default']; } } - + if (($specialtyName = $this->_registry->getRequest()->getSpecialtyName()) != '_Global') { $methodName .= $specialtyName; } - + if (method_exists($provider, $methodName)) { call_user_func_array(array($provider, $methodName), $callParameters); } elseif (method_exists($provider, $methodName . 'Action')) { diff --git a/libs/Zend/Tool/Framework/Client/Config.php b/libs/Zend/Tool/Framework/Client/Config.php index 97c4d51..4d66909 100644 --- a/libs/Zend/Tool/Framework/Client/Config.php +++ b/libs/Zend/Tool/Framework/Client/Config.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Config.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Config.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,21 +28,21 @@ */ class Zend_Tool_Framework_Client_Config { - + protected $_configFilepath = null; - + /** * @var Zend_Config */ protected $_config = null; - + public function __config($options = array()) { if ($options) { $this->setOptions($options); } } - + public function setOptions(Array $options) { foreach ($options as $optionName => $optionValue) { @@ -52,7 +52,7 @@ class Zend_Tool_Framework_Client_Config } } } - + public function setConfigFilepath($configFilepath) { if (!file_exists($configFilepath)) { @@ -61,9 +61,9 @@ class Zend_Tool_Framework_Client_Config } $this->_configFilepath = $configFilepath; - + $suffix = substr($configFilepath, -4); - + switch ($suffix) { case '.ini': require_once 'Zend/Config/Ini.php'; @@ -83,23 +83,23 @@ class Zend_Tool_Framework_Client_Config . $suffix . ' at location ' . $configFilepath ); } - + return $this; } - + public function getConfigFilepath() { return $this->_configFilepath; } - + public function get($name, $defaultValue) { return $this->_config->get($name, $defaultValue); } - + public function __get($name) { return $this->_config->{$name}; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Framework/Client/Console.php b/libs/Zend/Tool/Framework/Client/Console.php index 6abb61b..d40d454 100644 --- a/libs/Zend/Tool/Framework/Client/Console.php +++ b/libs/Zend/Tool/Framework/Client/Console.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Console.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: Console.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -52,40 +52,40 @@ require_once 'Zend/Tool/Framework/Client/Response/ContentDecorator/Separator.php /** * Zend_Tool_Framework_Client_Console - the CLI Client implementation for Zend_Tool_Framework - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Client_Console +class Zend_Tool_Framework_Client_Console extends Zend_Tool_Framework_Client_Abstract implements Zend_Tool_Framework_Client_Interactive_InputInterface, - Zend_Tool_Framework_Client_Interactive_OutputInterface + Zend_Tool_Framework_Client_Interactive_OutputInterface { /** * @var array */ protected $_configOptions = null; - + /** * @var array */ protected $_storageOptions = null; - + /** * @var Zend_Filter_Word_CamelCaseToDash */ protected $_filterToClientNaming = null; - + /** * @var Zend_Filter_Word_DashToCamelCase */ protected $_filterFromClientNaming = null; - + /** - * main() - This is typically called from zf.php. This method is a + * main() - This is typically called from zf.php. This method is a * self contained main() function. * */ @@ -101,13 +101,13 @@ class Zend_Tool_Framework_Client_Console $this->_configOptions = $configOptions; return $this; } - + public function setStorageOptions($storageOptions) { $this->_storageOptions = $storageOptions; return $this; } - + /** * getName() - return the name of the client, in this case 'console' * @@ -117,7 +117,7 @@ class Zend_Tool_Framework_Client_Console { return 'console'; } - + /** * _init() - Tasks processed before the constructor, generally setting up objects to use * @@ -125,25 +125,25 @@ class Zend_Tool_Framework_Client_Console protected function _preInit() { $config = $this->_registry->getConfig(); - + if ($this->_configOptions != null) { $config->setOptions($this->_configOptions); } - + $storage = $this->_registry->getStorage(); - + if ($this->_storageOptions != null && isset($this->_storageOptions['directory'])) { require_once 'Zend/Tool/Framework/Client/Storage/Directory.php'; $storage->setAdapter( new Zend_Tool_Framework_Client_Storage_Directory($this->_storageOptions['directory']) ); } - + // support the changing of the current working directory, necessary for some providers if (isset($_ENV['ZEND_TOOL_CURRENT_WORKING_DIRECTORY'])) { chdir($_ENV['ZEND_TOOL_CURRENT_WORKING_DIRECTORY']); } - + // support setting the loader from the environment if (isset($_ENV['ZEND_TOOL_FRAMEWORK_LOADER_CLASS'])) { if (class_exists($_ENV['ZEND_TOOL_FRAMEWORK_LOADER_CLASS']) @@ -163,7 +163,7 @@ class Zend_Tool_Framework_Client_Console protected function _preDispatch() { $response = $this->_registry->getResponse(); - + if (function_exists('posix_isatty')) { require_once 'Zend/Tool/Framework/Client/Console/ResponseDecorator/Colorizer.php'; $response->addContentDecorator(new Zend_Tool_Framework_Client_Console_ResponseDecorator_Colorizer()); @@ -171,12 +171,12 @@ class Zend_Tool_Framework_Client_Console $response->addContentDecorator(new Zend_Tool_Framework_Client_Response_ContentDecorator_Separator()) ->setDefaultDecoratorOptions(array('separator' => true)); - + $optParser = new Zend_Tool_Framework_Client_Console_ArgumentParser(); $optParser->setArguments($_SERVER['argv']) ->setRegistry($this->_registry) ->parse(); - + return; } @@ -188,7 +188,7 @@ class Zend_Tool_Framework_Client_Console { $request = $this->_registry->getRequest(); $response = $this->_registry->getResponse(); - + if ($response->isException()) { require_once 'Zend/Tool/Framework/Client/Console/HelpSystem.php'; $helpSystem = new Zend_Tool_Framework_Client_Console_HelpSystem(); @@ -199,17 +199,17 @@ class Zend_Tool_Framework_Client_Console $request->getActionName() ); } - + echo PHP_EOL; return; } /** * handleInteractiveInputRequest() is required by the Interactive InputInterface - * + * * * @param Zend_Tool_Framework_Client_Interactive_InputRequest $inputRequest - * @return string + * @return string */ public function handleInteractiveInputRequest(Zend_Tool_Framework_Client_Interactive_InputRequest $inputRequest) { @@ -217,10 +217,10 @@ class Zend_Tool_Framework_Client_Console $inputContent = fgets(STDIN); return rtrim($inputContent); // remove the return from the end of the string } - + /** * handleInteractiveOutput() is required by the Interactive OutputInterface - * + * * This allows us to display output immediately from providers, rather * than displaying it after the provider is done. * @@ -230,9 +230,9 @@ class Zend_Tool_Framework_Client_Console { echo $output; } - + /** - * getMissingParameterPromptString() + * getMissingParameterPromptString() * * @param Zend_Tool_Framework_Provider_Interface $provider * @param Zend_Tool_Framework_Action_Interface $actionInterface @@ -244,14 +244,14 @@ class Zend_Tool_Framework_Client_Console return 'Please provide a value for $' . $missingParameterName; } - + /** * convertToClientNaming() - * + * * Convert words to client specific naming, in this case is lower, dash separated * * Filters are lazy-loaded. - * + * * @param string $string * @return string */ @@ -264,20 +264,20 @@ class Zend_Tool_Framework_Client_Console $filter = new Zend_Filter(); $filter->addFilter(new Zend_Filter_Word_CamelCaseToDash()); $filter->addFilter(new Zend_Filter_StringToLower()); - + $this->_filterToClientNaming = $filter; } - + return $this->_filterToClientNaming->filter($string); } - + /** * convertFromClientNaming() * * Convert words from client specific naming to code naming - camelcased - * + * * Filters are lazy-loaded. - * + * * @param string $string * @return string */ @@ -287,7 +287,7 @@ class Zend_Tool_Framework_Client_Console require_once 'Zend/Filter/Word/DashToCamelCase.php'; $this->_filterFromClientNaming = new Zend_Filter_Word_DashToCamelCase(); } - + return $this->_filterFromClientNaming->filter($string); } diff --git a/libs/Zend/Tool/Framework/Client/Console/ArgumentParser.php b/libs/Zend/Tool/Framework/Client/Console/ArgumentParser.php index c9a1848..9c99a52 100644 --- a/libs/Zend/Tool/Framework/Client/Console/ArgumentParser.php +++ b/libs/Zend/Tool/Framework/Client/Console/ArgumentParser.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ArgumentParser.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ArgumentParser.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,9 +31,9 @@ require_once 'Zend/Console/Getopt.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Framework_Registry_EnabledInterface +class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Framework_Registry_EnabledInterface { - + /** * @var Zend_Tool_Framework_Registry_Interface */ @@ -63,8 +63,8 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra protected $_helpKnownAction = false; protected $_helpKnownProvider = false; protected $_helpKnownSpecialty = false; - - + + /** * setArguments * @@ -76,7 +76,7 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra $this->_argumentsOriginal = $this->_argumentsWorking = $arguments; return $this; } - + /** * setRegistry() * @@ -87,14 +87,14 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra { // get the client registry $this->_registry = $registry; - + // set manifest repository, request, response for easy access $this->_manifestRepository = $this->_registry->getManifestRepository(); $this->_request = $this->_registry->getRequest(); $this->_response = $this->_registry->getResponse(); return $this; } - + /** * Parse() - This method does the work of parsing the arguments into the enpooint request, * this will also (during help operations) fill the response in with information as needed @@ -108,10 +108,10 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('The client registry must have both a request and response registered.'); } - + // setup the help options $helpResponseOptions = array(); - + // check to see if the first cli arg is the script name if ($this->_argumentsWorking[0] == $_SERVER['SCRIPT_NAME' ]) { array_shift($this->_argumentsWorking); @@ -128,7 +128,7 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra // ensure there are arguments left if (count($this->_argumentsWorking) == 0) { $this->_request->setDispatchable(false); // at this point request is not dispatchable - + // check to see if this was a help request if ($this->_help) { $this->_createHelpResponse(); @@ -149,17 +149,17 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra if ($this->_helpKnownAction) { $helpResponseOptions = array_merge( - $helpResponseOptions, + $helpResponseOptions, array('actionName' => $this->_request->getActionName()) ); } - + /* @TODO Action Parameter Requirements */ // make sure there are more "words" on the command line if (count($this->_argumentsWorking) == 0) { $this->_request->setDispatchable(false); // at this point request is not dispatchable - + // check to see if this is a help request if ($this->_help) { $this->_createHelpResponse($helpResponseOptions); @@ -169,7 +169,7 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra return; } - + // process the provider part of the command line try { $this->_parseProviderPart(); @@ -178,21 +178,21 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra $this->_createHelpResponse(array('error' => $exception->getMessage())); return; } - + if ($this->_helpKnownProvider) { $helpResponseOptions = array_merge( - $helpResponseOptions, + $helpResponseOptions, array('providerName' => $this->_request->getProviderName()) ); } if ($this->_helpKnownSpecialty) { $helpResponseOptions = array_merge( - $helpResponseOptions, + $helpResponseOptions, array('specialtyName' => $this->_request->getSpecialtyName()) ); } - + // if there are arguments on the command line, lets process them as provider options if (count($this->_argumentsWorking) != 0) { $this->_parseProviderOptionsPart(); @@ -234,7 +234,7 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra $getoptOptions['pretend|p'] = 'PRETEND'; $getoptOptions['debug|d'] = 'DEBUG'; $getoptParser = new Zend_Console_Getopt($getoptOptions, $this->_argumentsWorking, array('parseAll' => false)); - + // @todo catch any exceptions here $getoptParser->parse(); @@ -247,7 +247,7 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra $this->_request->setVerbose(true); } else { $property = '_'.$option; - $this->{$property} = true; + $this->{$property} = true; } } @@ -313,7 +313,7 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra $this->_help = true; return; } - + // get the cli provider names from the manifest $providerMetadata = $this->_manifestRepository->getMetadata(array( 'type' => 'Tool', @@ -331,15 +331,15 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra $this->_helpKnownProvider = true; $this->_request->setProviderName($providerMetadata->getProviderName()); - + if ($consoleSpecialtyName == '?') { $this->_help = true; return; } - + $providerSpecialtyMetadata = $this->_manifestRepository->getMetadata(array( - 'type' => 'Tool', - 'name' => 'specialtyName', + 'type' => 'Tool', + 'name' => 'specialtyName', 'value' => $consoleSpecialtyName, 'providerName' => $providerMetadata->getProviderName(), 'clientName' => 'console' @@ -368,7 +368,7 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra $this->_help = true; return; } - + $searchParams = array( 'type' => 'Tool', 'providerName' => $this->_request->getProviderName(), @@ -399,10 +399,10 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra // process ParameterInfo into array for command line option matching if ($parameterInfo['type'] == 'string' || $parameterInfo['type'] == 'bool') { - $optionConfig .= $paramNameShortValues[$parameterNameLong] + $optionConfig .= $paramNameShortValues[$parameterNameLong] . (($parameterInfo['optional']) ? '-' : '=') . 's'; } elseif (in_array($parameterInfo['type'], array('int', 'integer', 'float'))) { - $optionConfig .= $paramNameShortValues[$parameterNameLong] + $optionConfig .= $paramNameShortValues[$parameterNameLong] . (($parameterInfo['optional']) ? '-' : '=') . 'i'; } else { $optionConfig .= $paramNameShortValues[$parameterNameLong] . '-s'; @@ -467,7 +467,7 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra $this->_metadataProviderOptionsLong = $actionableMethodLongParamsMetadata; $this->_metadataProviderOptionsShort = $actionableMethodShortParamsMetadata; */ - + $this->_argumentsWorking = $getoptParser->getRemainingArgs(); return; @@ -483,11 +483,11 @@ class Zend_Tool_Framework_Client_Console_ArgumentParser implements Zend_Tool_Fra require_once 'Zend/Tool/Framework/Client/Console/HelpSystem.php'; $helpSystem = new Zend_Tool_Framework_Client_Console_HelpSystem(); $helpSystem->setRegistry($this->_registry); - + if (isset($options['error'])) { $helpSystem->respondWithErrorMessage($options['error']); } - + if (isset($options['actionName']) && isset($options['providerName'])) { $helpSystem->respondWithSpecialtyAndParamHelp($options['providerName'], $options['actionName']); } elseif (isset($options['actionName'])) { diff --git a/libs/Zend/Tool/Framework/Client/Console/HelpSystem.php b/libs/Zend/Tool/Framework/Client/Console/HelpSystem.php index f7c4116..8eeaa7c 100644 --- a/libs/Zend/Tool/Framework/Client/Console/HelpSystem.php +++ b/libs/Zend/Tool/Framework/Client/Console/HelpSystem.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HelpSystem.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HelpSystem.php 18305 2009-09-19 16:31:16Z beberlei $ */ /** @@ -297,7 +297,9 @@ class Zend_Tool_Framework_Client_Console_HelpSystem 'clientName' => 'console' )); - $this->_respondWithCommand($providerMetadata, $actionMetadata, $specialtyMetadata, $actionableSpecialtyLongMetadata); + if($actionableSpecialtyLongMetadata) { + $this->_respondWithCommand($providerMetadata, $actionMetadata, $specialtyMetadata, $actionableSpecialtyLongMetadata); + } } } diff --git a/libs/Zend/Tool/Framework/Client/Console/Manifest.php b/libs/Zend/Tool/Framework/Client/Console/Manifest.php index 5215d04..8310b18 100644 --- a/libs/Zend/Tool/Framework/Client/Console/Manifest.php +++ b/libs/Zend/Tool/Framework/Client/Console/Manifest.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Manifest.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Manifest.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -58,7 +58,7 @@ require_once 'Zend/Tool/Framework/Registry/EnabledInterface.php'; * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Tool_Framework_Client_Console_Manifest - implements Zend_Tool_Framework_Registry_EnabledInterface, + implements Zend_Tool_Framework_Registry_EnabledInterface, Zend_Tool_Framework_Manifest_MetadataManifestable { @@ -66,7 +66,7 @@ class Zend_Tool_Framework_Client_Console_Manifest * @var Zend_Tool_Framework_Registry_Interface */ protected $_registry = null; - + /** * setRegistry() - Required for the Zend_Tool_Framework_Registry_EnabledInterface interface * @@ -78,12 +78,12 @@ class Zend_Tool_Framework_Client_Console_Manifest $this->_registry = $registry; return $this; } - + /** * getMetadata() is required by the Manifest Interface. - * + * * These are the following metadatas that will be setup: - * + * * actionName * - metadata for actions * - value will be a dashed name for the action named in 'actionName' @@ -102,17 +102,17 @@ class Zend_Tool_Framework_Client_Console_Manifest public function getMetadata() { $metadatas = array(); - + // setup the camelCase to dashed filter to use since cli expects dashed named $ccToDashedFilter = new Zend_Filter(); $ccToDashedFilter ->addFilter(new Zend_Filter_Word_CamelCaseToDash()) ->addFilter(new Zend_Filter_StringToLower()); - + // get the registry to get the action and provider repository $actionRepository = $this->_registry->getActionRepository(); $providerRepository = $this->_registry->getProviderRepository(); - + // loop through all actions and create a metadata for each foreach ($actionRepository->getActions() as $action) { // each action metadata will be called @@ -140,7 +140,7 @@ class Zend_Tool_Framework_Client_Console_Manifest // create the metadatas for the per provider specialites in providerSpecaltyNames foreach ($providerSignature->getSpecialties() as $specialty) { - + $metadatas[] = new Zend_Tool_Framework_Metadata_Tool(array( 'name' => 'specialtyName', 'value' => $ccToDashedFilter->filter($specialty), @@ -149,25 +149,25 @@ class Zend_Tool_Framework_Client_Console_Manifest 'providerName' => $providerSignature->getName(), 'specialtyName' => $specialty, 'clientReference' => $this->_registry->getClient() - )); - + )); + } // $actionableMethod is keyed by the methodName (but not used) foreach ($providerSignature->getActionableMethods() as $actionableMethodData) { - + $methodLongParams = array(); $methodShortParams = array(); - + // $actionableMethodData get both the long and short names foreach ($actionableMethodData['parameterInfo'] as $parameterInfoData) { - + // filter to dashed $methodLongParams[$parameterInfoData['name']] = $ccToDashedFilter->filter($parameterInfoData['name']); - + // simply lower the character, (its only 1 char after all) $methodShortParams[$parameterInfoData['name']] = strtolower($parameterInfoData['name'][0]); - + } // create metadata for the long name cliActionableMethodLongParameters @@ -181,7 +181,7 @@ class Zend_Tool_Framework_Client_Console_Manifest 'reference' => &$actionableMethodData, 'clientReference' => $this->_registry->getClient() )); - + // create metadata for the short name cliActionableMethodShortParameters $metadatas[] = new Zend_Tool_Framework_Metadata_Tool(array( 'name' => 'actionableMethodShortParams', @@ -197,13 +197,13 @@ class Zend_Tool_Framework_Client_Console_Manifest } } - + return $metadatas; } - + public function getIndex() { return 10000; } - + } diff --git a/libs/Zend/Tool/Framework/Client/Interactive/InputHandler.php b/libs/Zend/Tool/Framework/Client/Interactive/InputHandler.php index f03696e..1fc47b9 100644 --- a/libs/Zend/Tool/Framework/Client/Interactive/InputHandler.php +++ b/libs/Zend/Tool/Framework/Client/Interactive/InputHandler.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: InputHandler.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: InputHandler.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,20 +27,20 @@ */ class Zend_Tool_Framework_Client_Interactive_InputHandler { - + /** * @var Zend_Tool_Framework_Client_Interactive_InputInterface */ protected $_client = null; - + protected $_inputRequest = null; - + public function setClient(Zend_Tool_Framework_Client_Interactive_InputInterface $client) { $this->_client = $client; return $this; } - + public function setInputRequest($inputRequest) { if (is_string($inputRequest)) { @@ -50,25 +50,25 @@ class Zend_Tool_Framework_Client_Interactive_InputHandler require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('promptInteractive() requires either a string or an instance of Zend_Tool_Framework_Client_Interactive_InputRequest.'); } - + $this->_inputRequest = $inputRequest; return $this; } - + public function handle() { $inputResponse = $this->_client->handleInteractiveInputRequest($this->_inputRequest); - + if (is_string($inputResponse)) { require_once 'Zend/Tool/Framework/Client/Interactive/InputResponse.php'; - $inputResponse = new Zend_Tool_Framework_Client_Interactive_InputResponse($inputResponse); + $inputResponse = new Zend_Tool_Framework_Client_Interactive_InputResponse($inputResponse); } elseif (!$inputResponse instanceof Zend_Tool_Framework_Client_Interactive_InputResponse) { require_once 'Zend/Tool/Framework/Client/Exception.php'; throw new Zend_Tool_Framework_Client_Exception('The registered $_interactiveCallback for the client must either return a string or an instance of Zend_Tool_Framework_Client_Interactive_InputResponse.'); } - + return $inputResponse; } - - + + } diff --git a/libs/Zend/Tool/Framework/Client/Interactive/InputInterface.php b/libs/Zend/Tool/Framework/Client/Interactive/InputInterface.php index ef0c8db..3cb2a95 100644 --- a/libs/Zend/Tool/Framework/Client/Interactive/InputInterface.php +++ b/libs/Zend/Tool/Framework/Client/Interactive/InputInterface.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: InputInterface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: InputInterface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,7 +27,7 @@ */ interface Zend_Tool_Framework_Client_Interactive_InputInterface { - + /** * Handle Interactive Input Request * @@ -35,7 +35,7 @@ interface Zend_Tool_Framework_Client_Interactive_InputInterface * @return Zend_Tool_Framework_Client_Interactive_InputResponse|string */ public function handleInteractiveInputRequest(Zend_Tool_Framework_Client_Interactive_InputRequest $inputRequest); - + public function getMissingParameterPromptString(Zend_Tool_Framework_Provider_Interface $provider, Zend_Tool_Framework_Action_Interface $actionInterface, $missingParameterName); - + } diff --git a/libs/Zend/Tool/Framework/Client/Interactive/InputRequest.php b/libs/Zend/Tool/Framework/Client/Interactive/InputRequest.php index e0760d2..679df50 100644 --- a/libs/Zend/Tool/Framework/Client/Interactive/InputRequest.php +++ b/libs/Zend/Tool/Framework/Client/Interactive/InputRequest.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: InputRequest.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: InputRequest.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,20 +28,20 @@ class Zend_Tool_Framework_Client_Interactive_InputRequest { protected $_content = null; - + public function __construct($content = null) { if ($content) { $this->setContent($content); } } - + public function setContent($content) { $this->_content = $content; return $this; } - + public function getContent() { return $this->_content; diff --git a/libs/Zend/Tool/Framework/Client/Interactive/InputResponse.php b/libs/Zend/Tool/Framework/Client/Interactive/InputResponse.php index 4a6a39a..f0f63b5 100644 --- a/libs/Zend/Tool/Framework/Client/Interactive/InputResponse.php +++ b/libs/Zend/Tool/Framework/Client/Interactive/InputResponse.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: InputResponse.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: InputResponse.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,26 +27,26 @@ */ class Zend_Tool_Framework_Client_Interactive_InputResponse { - + protected $_content = null; - + public function __construct($content = null) { if ($content) { $this->setContent($content); } } - + public function setContent($content) { $this->_content = $content; return $this; } - + public function getContent() { return $this->_content; } - - + + } diff --git a/libs/Zend/Tool/Framework/Client/Interactive/OutputInterface.php b/libs/Zend/Tool/Framework/Client/Interactive/OutputInterface.php index b9d9216..01a489a 100644 --- a/libs/Zend/Tool/Framework/Client/Interactive/OutputInterface.php +++ b/libs/Zend/Tool/Framework/Client/Interactive/OutputInterface.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: OutputInterface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: OutputInterface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,7 +27,7 @@ */ interface Zend_Tool_Framework_Client_Interactive_OutputInterface { - + public function handleInteractiveOutput($string); - + } diff --git a/libs/Zend/Tool/Framework/Client/Request.php b/libs/Zend/Tool/Framework/Client/Request.php index a276c2b..d92a43a 100644 --- a/libs/Zend/Tool/Framework/Client/Request.php +++ b/libs/Zend/Tool/Framework/Client/Request.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Request.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Request.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,47 +28,47 @@ */ class Zend_Tool_Framework_Client_Request { - + /** * @var string */ protected $_providerName = null; - + /** * @var string */ protected $_specialtyName = null; - + /** * @var string */ protected $_actionName = null; - + /** * @var array */ protected $_actionParameters = array(); - + /** * @var array */ protected $_providerParameters = array(); - + /** * @var bool */ protected $_isPretend = false; - + /** * @var bool */ protected $_isDebug = false; - + /** * @var bool */ protected $_isVerbose = false; - + /** * @var bool */ @@ -85,7 +85,7 @@ class Zend_Tool_Framework_Client_Request $this->_providerName = $providerName; return $this; } - + /** * getProviderName() * @@ -95,7 +95,7 @@ class Zend_Tool_Framework_Client_Request { return $this->_providerName; } - + /** * setSpecialtyName() * @@ -107,17 +107,17 @@ class Zend_Tool_Framework_Client_Request $this->_specialtyName = $specialtyName; return $this; } - + /** * getSpecialtyName() - * + * * @return string */ public function getSpecialtyName() { return $this->_specialtyName; } - + /** * setActionName() * @@ -126,10 +126,10 @@ class Zend_Tool_Framework_Client_Request */ public function setActionName($actionName) { - $this->_actionName = $actionName; + $this->_actionName = $actionName; return $this; } - + /** * getActionName() * @@ -139,7 +139,7 @@ class Zend_Tool_Framework_Client_Request { return $this->_actionName; } - + /** * setActionParameter() * @@ -152,7 +152,7 @@ class Zend_Tool_Framework_Client_Request $this->_actionParameters[$parameterName] = $parameterValue; return $this; } - + /** * getActionParameters() * @@ -162,7 +162,7 @@ class Zend_Tool_Framework_Client_Request { return $this->_actionParameters; } - + /** * getActionParameter() * @@ -173,7 +173,7 @@ class Zend_Tool_Framework_Client_Request { return (isset($this->_actionParameters[$parameterName])) ? $this->_actionParameters[$parameterName] : null; } - + /** * setProviderParameter() * @@ -186,7 +186,7 @@ class Zend_Tool_Framework_Client_Request $this->_providerParameters[$parameterName] = $parameterValue; return $this; } - + /** * getProviderParameters() * @@ -196,7 +196,7 @@ class Zend_Tool_Framework_Client_Request { return $this->_providerParameters; } - + /** * getProviderParameter() * @@ -207,7 +207,7 @@ class Zend_Tool_Framework_Client_Request { return (isset($this->_providerParameters[$parameterName])) ? $this->_providerParameters[$parameterName] : null; } - + /** * setPretend() * @@ -219,7 +219,7 @@ class Zend_Tool_Framework_Client_Request $this->_isPretend = (bool) $pretend; return $this; } - + /** * isPretend() - Whether or not this is a pretend request * @@ -229,7 +229,7 @@ class Zend_Tool_Framework_Client_Request { return $this->_isPretend; } - + /** * setDebug() * @@ -241,7 +241,7 @@ class Zend_Tool_Framework_Client_Request $this->_isDebug = (bool) $debug; return $this; } - + /** * isDebug() - Whether or not this is a debug enabled request * @@ -251,7 +251,7 @@ class Zend_Tool_Framework_Client_Request { return $this->_isDebug; } - + /** * setVerbose() * @@ -263,7 +263,7 @@ class Zend_Tool_Framework_Client_Request $this->_isVerbose = (bool) $verbose; return $this; } - + /** * isVerbose() - Whether or not this is a verbose enabled request * @@ -273,7 +273,7 @@ class Zend_Tool_Framework_Client_Request { return $this->_isVerbose; } - + /** * setDispatchable() * @@ -285,7 +285,7 @@ class Zend_Tool_Framework_Client_Request $this->_isDispatchable = (bool) $dispatchable; return $this; } - + /** * isDispatchable() Is this request Dispatchable? * @@ -295,5 +295,5 @@ class Zend_Tool_Framework_Client_Request { return $this->_isDispatchable; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Framework/Client/Response.php b/libs/Zend/Tool/Framework/Client/Response.php index 5fee587..f5b3587 100644 --- a/libs/Zend/Tool/Framework/Client/Response.php +++ b/libs/Zend/Tool/Framework/Client/Response.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Response.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Response.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,22 +32,22 @@ class Zend_Tool_Framework_Client_Response * @var callback|null */ protected $_callback = null; - + /** * @var array */ protected $_content = array(); - + /** * @var Zend_Tool_Framework_Exception */ protected $_exception = null; - + /** * @var null|array */ protected $_decorators = null; - + /** * @var array */ @@ -68,7 +68,7 @@ class Zend_Tool_Framework_Client_Response $this->_callback = $callback; return $this; } - + /** * setContent() * @@ -78,7 +78,7 @@ class Zend_Tool_Framework_Client_Response public function setContent($content, Array $decoratorOptions = array()) { $this->_applyDecorators($content, $decoratorOptions); - + $this->_content = array(); $this->appendContent($content); return $this; @@ -93,7 +93,7 @@ class Zend_Tool_Framework_Client_Response public function appendContent($content, Array $decoratorOptions = array()) { $content = $this->_applyDecorators($content, $decoratorOptions); - + if ($this->_callback !== null) { call_user_func($this->_callback, $content); } @@ -119,7 +119,7 @@ class Zend_Tool_Framework_Client_Response $this->_defaultDecoratorOptions = array_merge($this->_defaultDecoratorOptions, $decoratorOptions); return $this; } - + /** * getContent() * @@ -174,7 +174,7 @@ class Zend_Tool_Framework_Client_Response $this->_decorators[$decoratorName] = $contentDecorator; return $this; } - + /** * getContentDecorators() * @@ -184,7 +184,7 @@ class Zend_Tool_Framework_Client_Response { return $this->_decorators; } - + /** * __toString() to cast to a string * @@ -194,7 +194,7 @@ class Zend_Tool_Framework_Client_Response { return (string) implode('', $this->_content); } - + /** * _applyDecorators() apply a group of decorators * @@ -205,9 +205,9 @@ class Zend_Tool_Framework_Client_Response protected function _applyDecorators($content, Array $decoratorOptions) { $options = array_merge($this->_defaultDecoratorOptions, $decoratorOptions); - + $options = array_change_key_case($options, CASE_LOWER); - + if ($options) { foreach ($this->_decorators as $decoratorName => $decorator) { if (array_key_exists($decoratorName, $options)) { @@ -215,9 +215,9 @@ class Zend_Tool_Framework_Client_Response } } } - + return $content; - + } } diff --git a/libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php b/libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php index 2ba833d..7993bbc 100644 --- a/libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php +++ b/libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,9 +27,9 @@ */ interface Zend_Tool_Framework_Client_Response_ContentDecorator_Interface { - + public function getName(); public function decorate($content, $decoratorValue); - + } diff --git a/libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Separator.php b/libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Separator.php index 668739e..44bbb00 100644 --- a/libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Separator.php +++ b/libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Separator.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Separator.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Separator.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,15 +31,15 @@ require_once 'Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Client_Response_ContentDecorator_Separator - implements Zend_Tool_Framework_Client_Response_ContentDecorator_Interface +class Zend_Tool_Framework_Client_Response_ContentDecorator_Separator + implements Zend_Tool_Framework_Client_Response_ContentDecorator_Interface { - + /** * @var string */ protected $_separator = PHP_EOL; - + /** * getName() - name of the decorator * @@ -61,7 +61,7 @@ class Zend_Tool_Framework_Client_Response_ContentDecorator_Separator $this->_separator = $separator; return $this; } - + /** * getSeparator() * @@ -71,23 +71,23 @@ class Zend_Tool_Framework_Client_Response_ContentDecorator_Separator { return $this->_separator; } - + public function decorate($content, $decoratorValue) { $run = 1; if (is_bool($decoratorValue) && $decoratorValue === false) { return $content; } - + if (is_int($decoratorValue)) { $run = $decoratorValue; } - + for ($i = 0; $i < $run; $i++) { $content .= $this->_separator; } - + return $content; } - + } diff --git a/libs/Zend/Tool/Framework/Client/Storage.php b/libs/Zend/Tool/Framework/Client/Storage.php index 78c9196..fa51203 100644 --- a/libs/Zend/Tool/Framework/Client/Storage.php +++ b/libs/Zend/Tool/Framework/Client/Storage.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Storage.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: Storage.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,19 +33,19 @@ require_once 'Zend/Tool/Framework/Client/Storage/AdapterInterface.php'; */ class Zend_Tool_Framework_Client_Storage { - + /** * @var Zend_Tool_Framework_Client_Storage_AdapterInterface */ protected $_adapter = null; - + public function __construct($options = array()) { if (isset($options['adapter'])) { $this->setAdapter($options['adapter']); } } - + public function setAdapter($adapter) { if (is_string($adapter)) { @@ -55,29 +55,29 @@ class Zend_Tool_Framework_Client_Storage } $this->_adapter = $adapter; } - + public function isEnabled() { return ($this->_adapter instanceof Zend_Tool_Framework_Client_Storage_AdapterInterface); } - + public function put($name, $value) { if (!$this->_adapter) { return false; } - + $this->_adapter->put($name, $value); - + return $this; } - + public function get($name, $defaultValue = false) { if (!$this->_adapter) { return false; } - + if ($this->_adapter->has($name)) { return $this->_adapter->get($name); } else { @@ -85,33 +85,33 @@ class Zend_Tool_Framework_Client_Storage } } - + public function has($name) { if (!$this->_adapter) { return false; } - + return $this->_adapter->has($name); } - + public function remove($name) { if (!$this->_adapter) { return false; } - + $this->_adapter->remove($name); - + return $this; } - + public function getStreamUri($name) { if (!$this->_adapter) { return false; } - + return $this->_adapter->getStreamUri($name); } } diff --git a/libs/Zend/Tool/Framework/Client/Storage/AdapterInterface.php b/libs/Zend/Tool/Framework/Client/Storage/AdapterInterface.php index 7e4e6c4..d2b4426 100644 --- a/libs/Zend/Tool/Framework/Client/Storage/AdapterInterface.php +++ b/libs/Zend/Tool/Framework/Client/Storage/AdapterInterface.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: AdapterInterface.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: AdapterInterface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,15 +28,15 @@ */ interface Zend_Tool_Framework_Client_Storage_AdapterInterface { - + public function put($name, $value); - + public function get($name); - + public function has($name); - + public function remove($name); - + public function getStreamUri($name); - + } diff --git a/libs/Zend/Tool/Framework/Client/Storage/Directory.php b/libs/Zend/Tool/Framework/Client/Storage/Directory.php index 19ecdf1..ee29cf2 100644 --- a/libs/Zend/Tool/Framework/Client/Storage/Directory.php +++ b/libs/Zend/Tool/Framework/Client/Storage/Directory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Directory.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: Directory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,11 +32,11 @@ require_once 'Zend/Tool/Framework/Client/Storage/AdapterInterface.php'; * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Tool_Framework_Client_Storage_Directory - implements Zend_Tool_Framework_Client_Storage_AdapterInterface + implements Zend_Tool_Framework_Client_Storage_AdapterInterface { - + protected $_directoryPath = null; - + public function __construct($directoryPath) { if (!file_exists($directoryPath)) { @@ -44,30 +44,30 @@ class Zend_Tool_Framework_Client_Storage_Directory } $this->_directoryPath = $directoryPath; } - + public function put($name, $value) { return file_put_contents($this->_directoryPath . DIRECTORY_SEPARATOR . $name, $value); } - + public function get($name) { return file_get_contents($this->_directoryPath . DIRECTORY_SEPARATOR . $name); } - + public function has($name) { return file_exists($this->_directoryPath . DIRECTORY_SEPARATOR . $name); } - + public function remove($name) { return unlink($this->_directoryPath . DIRECTORY_SEPARATOR . $name); } - + public function getStreamUri($name) { return $this->_directoryPath . DIRECTORY_SEPARATOR . $name; } - + } diff --git a/libs/Zend/Tool/Framework/Exception.php b/libs/Zend/Tool/Framework/Exception.php index 9b93914..26a6142 100644 --- a/libs/Zend/Tool/Framework/Exception.php +++ b/libs/Zend/Tool/Framework/Exception.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,6 +31,6 @@ require_once 'Zend/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Exception extends Zend_Exception +class Zend_Tool_Framework_Exception extends Zend_Exception { } \ No newline at end of file diff --git a/libs/Zend/Tool/Framework/Loader/Abstract.php b/libs/Zend/Tool/Framework/Loader/Abstract.php index 7398d48..d4a4cc9 100644 --- a/libs/Zend/Tool/Framework/Loader/Abstract.php +++ b/libs/Zend/Tool/Framework/Loader/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 19145 2009-11-20 22:08:36Z beberlei $ */ /** @@ -37,17 +37,17 @@ abstract class Zend_Tool_Framework_Loader_Abstract implements Zend_Tool_Framewor * @var Zend_Tool_Framework_Repository_Interface */ protected $_registry = null; - + /** * @var array */ private $_retrievedFiles = array(); - + /** * @var array */ private $_loadedClasses = array(); - + /** * _getFiles * @@ -67,7 +67,7 @@ abstract class Zend_Tool_Framework_Loader_Abstract implements Zend_Tool_Framewor $this->_registry = $registry; return $this; } - + /** * load() - called by the client initialize routine to load files * @@ -76,14 +76,18 @@ abstract class Zend_Tool_Framework_Loader_Abstract implements Zend_Tool_Framewor { $this->_retrievedFiles = $this->getRetrievedFiles(); $this->_loadedClasses = array(); - + $manifestRegistry = $this->_registry->getManifestRepository(); $providerRegistry = $this->_registry->getProviderRepository(); - + $loadedClasses = array(); - + // loop through files and find the classes declared by loading the file foreach ($this->_retrievedFiles as $file) { + if(is_dir($file)) { + continue; + } + $classesLoadedBefore = get_declared_classes(); $oldLevel = error_reporting(E_ALL | ~E_STRICT); // remove strict so that other packages wont throw warnings // should we lint the files here? i think so @@ -92,32 +96,32 @@ abstract class Zend_Tool_Framework_Loader_Abstract implements Zend_Tool_Framewor $classesLoadedAfter = get_declared_classes(); $loadedClasses = array_merge($loadedClasses, array_diff($classesLoadedAfter, $classesLoadedBefore)); } - - // loop through the loaded classes and ensure that + + // loop through the loaded classes and ensure that foreach ($loadedClasses as $loadedClass) { - + // reflect class to see if its something we want to load $reflectionClass = new ReflectionClass($loadedClass); - if ($reflectionClass->implementsInterface('Zend_Tool_Framework_Manifest_Interface') - && !$reflectionClass->isAbstract()) + if ($reflectionClass->implementsInterface('Zend_Tool_Framework_Manifest_Interface') + && !$reflectionClass->isAbstract()) { $manifestRegistry->addManifest($reflectionClass->newInstance()); $this->_loadedClasses[] = $loadedClass; } - - if ($reflectionClass->implementsInterface('Zend_Tool_Framework_Provider_Interface') + + if ($reflectionClass->implementsInterface('Zend_Tool_Framework_Provider_Interface') && !$reflectionClass->isAbstract() - && !$providerRegistry->hasProvider($reflectionClass->getName(), false)) + && !$providerRegistry->hasProvider($reflectionClass->getName(), false)) { $providerRegistry->addProvider($reflectionClass->newInstance()); $this->_loadedClasses[] = $loadedClass; } } - + return $this->_loadedClasses; } - + /** * getRetrievedFiles() * @@ -128,10 +132,10 @@ abstract class Zend_Tool_Framework_Loader_Abstract implements Zend_Tool_Framewor if ($this->_retrievedFiles == null) { $this->_retrievedFiles = $this->_getFiles(); } - + return $this->_retrievedFiles; } - + /** * getLoadedClasses() * @@ -142,5 +146,5 @@ abstract class Zend_Tool_Framework_Loader_Abstract implements Zend_Tool_Framewor return $this->_loadedClasses; } - + } diff --git a/libs/Zend/Tool/Framework/Loader/IncludePathLoader.php b/libs/Zend/Tool/Framework/Loader/IncludePathLoader.php index 19ea17e..cb80eae 100644 --- a/libs/Zend/Tool/Framework/Loader/IncludePathLoader.php +++ b/libs/Zend/Tool/Framework/Loader/IncludePathLoader.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: IncludePathLoader.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: IncludePathLoader.php 19145 2009-11-20 22:08:36Z beberlei $ */ /** @@ -36,9 +36,9 @@ require_once 'Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterat * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Loader_IncludePathLoader extends Zend_Tool_Framework_Loader_Abstract +class Zend_Tool_Framework_Loader_IncludePathLoader extends Zend_Tool_Framework_Loader_Abstract { - + /** * _getFiles() * @@ -52,19 +52,19 @@ class Zend_Tool_Framework_Loader_IncludePathLoader extends Zend_Tool_Framework_L $relativeItems = array(); $files = array(); $isZendTraversed = false; - + foreach ($paths as $path) { // default patterns to use $filterDenyDirectoryPattern = '.*(/|\\\\).svn'; $filterAcceptFilePattern = '.*(?:Manifest|Provider)\.php$'; - + if (!file_exists($path) || $path[0] == '.') { continue; } - + $realIncludePath = realpath($path); - + // ensure that we only traverse a single version of Zend Framework on all include paths if (file_exists($realIncludePath . '/Zend/Tool/Framework/Loader/IncludePathLoader.php')) { if ($isZendTraversed === false) { @@ -74,10 +74,10 @@ class Zend_Tool_Framework_Loader_IncludePathLoader extends Zend_Tool_Framework_L $filterDenyDirectoryPattern = '.*((/|\\\\).svn|' . preg_quote($realIncludePath . DIRECTORY_SEPARATOR) . 'Zend)'; } } - + // create recursive directory iterator $rdi = new RecursiveDirectoryIterator($path); - + // pass in the RecursiveDirectoryIterator & the patterns $filter = new Zend_Tool_Framework_Loader_IncludePathLoader_RecursiveFilterIterator( $rdi, @@ -87,18 +87,22 @@ class Zend_Tool_Framework_Loader_IncludePathLoader extends Zend_Tool_Framework_L // build the rii with the filter $iterator = new RecursiveIteratorIterator($filter); - + // iterate over the accepted items foreach ($iterator as $item) { - + $file = (string)$item; + if($this->_fileIsBlacklisted($file)) { + continue; + } + // ensure that the same named file from separate include_paths is not loaded $relativeItem = preg_replace('#^' . preg_quote($realIncludePath . DIRECTORY_SEPARATOR, '#') . '#', '', $item->getRealPath()); - + // no links allowed here for now if ($item->isLink()) { continue; } - + // no items that are relavitely the same are allowed if (in_array($relativeItem, $relativeItems)) { continue; @@ -111,5 +115,24 @@ class Zend_Tool_Framework_Loader_IncludePathLoader extends Zend_Tool_Framework_L return $files; } - + + /** + * + * @param string $file + * @return bool + */ + protected function _fileIsBlacklisted($file) + { + $blacklist = array( + "PHPUnit".DIRECTORY_SEPARATOR."Framework", + "Zend".DIRECTORY_SEPARATOR."OpenId".DIRECTORY_SEPARATOR."Provider" + ); + + foreach($blacklist AS $blacklitedPattern) { + if(strpos($file, $blacklitedPattern) !== false) { + return true; + } + } + return false; + } } diff --git a/libs/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php b/libs/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php index 34f897c..d31fb41 100644 --- a/libs/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php +++ b/libs/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: RecursiveFilterIterator.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: RecursiveFilterIterator.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,7 +31,7 @@ class Zend_Tool_Framework_Loader_IncludePathLoader_RecursiveFilterIterator exten protected $_denyDirectoryPattern = null; protected $_acceptFilePattern = null; - + /** * constructor * @@ -45,7 +45,7 @@ class Zend_Tool_Framework_Loader_IncludePathLoader_RecursiveFilterIterator exten $this->_acceptFilePattern = $acceptFilePattern; parent::__construct($iterator); } - + /** * accept() - Which iterable items to accept or deny, required by FilterInterface * @@ -57,11 +57,11 @@ class Zend_Tool_Framework_Loader_IncludePathLoader_RecursiveFilterIterator exten $currentNodeRealPath = $currentNode->getRealPath(); // if the current node is a directory AND doesn't match the denyDirectory pattern, accept - if ($currentNode->isDir() + if ($currentNode->isDir() && !preg_match('#' . $this->_denyDirectoryPattern . '#', $currentNodeRealPath)) { return true; } - + // if the file matches the accept file pattern, accept $acceptable = (preg_match('#' . $this->_acceptFilePattern . '#', $currentNodeRealPath)) ? true : false; return $acceptable; @@ -79,13 +79,13 @@ class Zend_Tool_Framework_Loader_IncludePathLoader_RecursiveFilterIterator exten if (empty($this->ref)) { $this->ref = new ReflectionClass($this); } - + return $this->ref->newInstance( $this->getInnerIterator()->getChildren(), $this->_denyDirectoryPattern, $this->_acceptFilePattern ); } - + } diff --git a/libs/Zend/Tool/Framework/Manifest/ActionManifestable.php b/libs/Zend/Tool/Framework/Manifest/ActionManifestable.php index 722e198..0eea332 100644 --- a/libs/Zend/Tool/Framework/Manifest/ActionManifestable.php +++ b/libs/Zend/Tool/Framework/Manifest/ActionManifestable.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ActionManifestable.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ActionManifestable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,12 +36,12 @@ interface Zend_Tool_Framework_Manifest_ActionManifestable extends Zend_Tool_Fram /** * getActions() - * + * * Should either return a single action, or an array * of actions - * + * * @return array|Zend_Tool_Framework_Action_Interface */ public function getActions(); - + } diff --git a/libs/Zend/Tool/Framework/Manifest/Exception.php b/libs/Zend/Tool/Framework/Manifest/Exception.php index 9024ebf..eca5ddc 100644 --- a/libs/Zend/Tool/Framework/Manifest/Exception.php +++ b/libs/Zend/Tool/Framework/Manifest/Exception.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,5 +33,5 @@ require_once 'Zend/Tool/Framework/Exception.php'; */ class Zend_Tool_Framework_Manifest_Exception extends Zend_Tool_Framework_Exception { - + } diff --git a/libs/Zend/Tool/Framework/Manifest/Indexable.php b/libs/Zend/Tool/Framework/Manifest/Indexable.php index eef9a3b..daccb94 100644 --- a/libs/Zend/Tool/Framework/Manifest/Indexable.php +++ b/libs/Zend/Tool/Framework/Manifest/Indexable.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Indexable.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Indexable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,12 +31,12 @@ interface Zend_Tool_Framework_Manifest_Indexable extends Zend_Tool_Framework_Man /** * getActions() - * + * * Should either return a single action, or an array * of actions - * + * * @return array|Zend_Tool_Framework_Action_Interface */ public function getIndex(); - + } diff --git a/libs/Zend/Tool/Framework/Manifest/Interface.php b/libs/Zend/Tool/Framework/Manifest/Interface.php index ee00b1a..c1b0c48 100644 --- a/libs/Zend/Tool/Framework/Manifest/Interface.php +++ b/libs/Zend/Tool/Framework/Manifest/Interface.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,56 +27,56 @@ */ interface Zend_Tool_Framework_Manifest_Interface { - + /** * The following methods are completely optional, and any combination of them * can be used as part of a manifest. The manifest repository will process * the return values of these actions as specfied in the following method docblocks. - * + * * Since these actions are - * + * */ - + /** * getMetadata() - * + * * Should either return a single metadata object or an array * of metadata objects - * + * * @return array|Zend_Tool_Framework_Manifest_Metadata ** public function getMetadata(); **/ - - - + + + /** * getActions() - * + * * Should either return a single action, or an array * of actions - * + * * @return array|Zend_Tool_Framework_Action_Interface ** - + public function getActions(); **/ - - - + + + /** * getProviders() - * + * * Should either return a single provider or an array * of providers - * + * ** - + public function getProviders(); **/ - + } diff --git a/libs/Zend/Tool/Framework/Manifest/MetadataManifestable.php b/libs/Zend/Tool/Framework/Manifest/MetadataManifestable.php index 38e1a1a..5a01726 100644 --- a/libs/Zend/Tool/Framework/Manifest/MetadataManifestable.php +++ b/libs/Zend/Tool/Framework/Manifest/MetadataManifestable.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MetadataManifestable.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: MetadataManifestable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,12 +36,12 @@ interface Zend_Tool_Framework_Manifest_MetadataManifestable extends Zend_Tool_Fr /** * getMetadata() - * + * * Should either return a single metadata object or an array * of metadata objects - * + * * @return array|Zend_Tool_Framework_Manifest_Metadata - */ + */ public function getMetadata(); - + } diff --git a/libs/Zend/Tool/Framework/Manifest/ProviderManifestable.php b/libs/Zend/Tool/Framework/Manifest/ProviderManifestable.php index b1d5a8e..b603c3b 100644 --- a/libs/Zend/Tool/Framework/Manifest/ProviderManifestable.php +++ b/libs/Zend/Tool/Framework/Manifest/ProviderManifestable.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProviderManifestable.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ProviderManifestable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,12 +36,12 @@ interface Zend_Tool_Framework_Manifest_ProviderManifestable extends Zend_Tool_Fr /** * getProviders() - * + * * Should either return a single provider or an array * of providers - * + * * @return array|string|Zend_Tool_Framework_Provider_Interface */ public function getProviders(); - + } diff --git a/libs/Zend/Tool/Framework/Manifest/Repository.php b/libs/Zend/Tool/Framework/Manifest/Repository.php index c200114..0439672 100644 --- a/libs/Zend/Tool/Framework/Manifest/Repository.php +++ b/libs/Zend/Tool/Framework/Manifest/Repository.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Repository.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Repository.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,7 +39,7 @@ class Zend_Tool_Framework_Manifest_Repository * @var Zend_Tool_Framework_Provider_Registry_Interface */ protected $_registry = null; - + /** * @var array */ @@ -61,7 +61,7 @@ class Zend_Tool_Framework_Manifest_Repository $this->_registry = $registry; return $this; } - + /** * addManifest() - Add a manifest for later processing * @@ -70,14 +70,14 @@ class Zend_Tool_Framework_Manifest_Repository */ public function addManifest(Zend_Tool_Framework_Manifest_Interface $manifest) { - // we need to get an index number so that manifests with + // we need to get an index number so that manifests with // higher indexes have priority over others $index = count($this->_manifests); if ($manifest instanceof Zend_Tool_Framework_Registry_EnabledInterface) { $manifest->setRegistry($this->_registry); } - + // if the manifest supplies a getIndex() method, use it if ($manifest instanceof Zend_Tool_Framework_Manifest_Indexable) { $index = $manifest->getIndex(); @@ -86,7 +86,7 @@ class Zend_Tool_Framework_Manifest_Repository // get the required objects from the framework registry $actionRepository = $this->_registry->getActionRepository(); $providerRepository = $this->_registry->getProviderRepository(); - + // load providers if interface supports that method if ($manifest instanceof Zend_Tool_Framework_Manifest_ProviderManifestable) { $providers = $manifest->getProviders(); @@ -98,7 +98,7 @@ class Zend_Tool_Framework_Manifest_Repository if (!$provider instanceof Zend_Tool_Framework_Provider_Interface) { require_once 'Zend/Tool/Framework/Manifest/Exception.php'; throw new Zend_Tool_Framework_Manifest_Exception( - 'A provider provided by the ' . get_class($manifest) + 'A provider provided by the ' . get_class($manifest) . ' does not implement Zend_Tool_Framework_Provider_Interface' ); } @@ -127,7 +127,7 @@ class Zend_Tool_Framework_Manifest_Repository // should we detect collisions here? does it even matter? $this->_manifests[$index] = $manifest; ksort($this->_manifests); - + return $this; } @@ -140,7 +140,7 @@ class Zend_Tool_Framework_Manifest_Repository { return $this->_manifests; } - + /** * addMetadata() - add a metadata peice by peice * @@ -152,10 +152,10 @@ class Zend_Tool_Framework_Manifest_Repository $this->_metadatas[] = $metadata; return $this; } - + /** * process() - Process is expected to be called at the end of client construction time. - * By this time, the loader has run and loaded any found manifests into the repository + * By this time, the loader has run and loaded any found manifests into the repository * for loading * * @return Zend_Tool_Framework_Manifest_Repository @@ -189,13 +189,13 @@ class Zend_Tool_Framework_Manifest_Repository /** * getMetadatas() - This is the main search function for the repository. - * + * * @example This will retrieve all metadata that matches the following criteria * $manifestRepo->getMetadatas(array( * 'providerName' => 'Version', * 'actionName' => 'show' * )); - * + * * @param array $searchProperties * @param bool $includeNonExistentProperties * @return Zend_Tool_Framework_Manifest_Metadata[] @@ -204,7 +204,7 @@ class Zend_Tool_Framework_Manifest_Repository { $returnMetadatas = array(); - + // loop through the metadatas so that we can search each individual one foreach ($this->_metadatas as $metadata) { @@ -233,7 +233,7 @@ class Zend_Tool_Framework_Manifest_Repository return $returnMetadatas; } - + /** * getMetadata() - This will proxy to getMetadatas(), but will only return a single metadata. This method * should be used in situations where the search criteria is known to only find a single metadata object @@ -276,7 +276,7 @@ class Zend_Tool_Framework_Manifest_Repository return $string; } - + /** * count() - required by the Countable Interface * @@ -286,7 +286,7 @@ class Zend_Tool_Framework_Manifest_Repository { return count($this->_metadatas); } - + /** * getIterator() - required by the IteratorAggregate interface * diff --git a/libs/Zend/Tool/Framework/Metadata/Basic.php b/libs/Zend/Tool/Framework/Metadata/Basic.php index dec74bf..a1f69c4 100644 --- a/libs/Zend/Tool/Framework/Metadata/Basic.php +++ b/libs/Zend/Tool/Framework/Metadata/Basic.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Basic.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Basic.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,14 +33,14 @@ require_once 'Zend/Tool/Framework/Metadata/Interface.php'; */ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata_Interface { - + /**#@+ * Search constants */ const ATTRIBUTES_ALL = 'attributesAll'; const ATTRIBUTES_NO_PARENT = 'attributesParent'; /**#@-*/ - + /**#@+ * @var string */ @@ -48,7 +48,7 @@ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata protected $_name = null; protected $_value = null; /**#@-*/ - + /** * @var mixed */ @@ -65,9 +65,9 @@ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata $this->setOptions($options); } } - + /** - * setOptions() - standard issue implementation, this will set any + * setOptions() - standard issue implementation, this will set any * options that are supported via a set method. * * @param array $options @@ -81,23 +81,23 @@ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata $this->{$setMethod}($optionValue); } } - + return $this; } /** * getType() - * + * * @return string */ public function getType() { return $this->_type; } - + /** * setType() - * + * * @param string $type * @return Zend_Tool_Framework_Metadata_Basic */ @@ -109,17 +109,17 @@ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata /** * getName() - * + * * @return string */ public function getName() { return $this->_name; } - + /** * setName() - * + * * @param string $name * @return Zend_Tool_Framework_Metadata_Basic */ @@ -128,20 +128,20 @@ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata $this->_name = $name; return $this; } - + /** - * getValue() - * + * getValue() + * * @return mixed */ public function getValue() { return $this->_value; } - + /** * setValue() - * + * * @param unknown_type $Value * @return Zend_Tool_Framework_Metadata_Basic */ @@ -162,7 +162,7 @@ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata $this->_reference = $reference; return $this; } - + /** * getReference() * @@ -172,7 +172,7 @@ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata { return $this->_reference; } - + /** * getAttributes() - this will retrieve any attributes of this object that exist as properties * This is most useful for printing metadata. @@ -183,34 +183,34 @@ class Zend_Tool_Framework_Metadata_Basic implements Zend_Tool_Framework_Metadata public function getAttributes($type = self::ATTRIBUTES_ALL, $stringRepresentationOfNonScalars = false) { $thisReflection = new ReflectionObject($this); - + $metadataPairValues = array(); foreach (get_object_vars($this) as $varName => $varValue) { if ($type == self::ATTRIBUTES_NO_PARENT && ($thisReflection->getProperty($varName)->getDeclaringClass()->getName() == 'Zend_Tool_Framework_Metadata_Basic')) { continue; } - + if ($stringRepresentationOfNonScalars) { - + if (is_object($varValue)) { $varValue = '(object)'; } - + if (is_null($varValue)) { $varValue = '(null)'; } - + } - + $metadataPairValues[ltrim($varName, '_')] = $varValue; } - + return $metadataPairValues; } - + /** - * __toString() - string representation of this object + * __toString() - string representation of this object * * @return string */ diff --git a/libs/Zend/Tool/Framework/Metadata/Dynamic.php b/libs/Zend/Tool/Framework/Metadata/Dynamic.php index 80bf461..895efb9 100644 --- a/libs/Zend/Tool/Framework/Metadata/Dynamic.php +++ b/libs/Zend/Tool/Framework/Metadata/Dynamic.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Dynamic.php 17517 2009-08-10 13:52:31Z ralph $ + * @version $Id: Dynamic.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,39 +33,39 @@ require_once 'Zend/Tool/Framework/Metadata/Interface.php'; */ class Zend_Tool_Framework_Metadata_Dynamic implements Zend_Tool_Framework_Metadata_Interface { - + /** * @var string */ protected $_type = 'Dynamic'; - + /** * @var string */ protected $_name = null; - + /** * @var string */ protected $_value = null; - + /** * @var array */ protected $_dynamicAttributes = array(); - + /** * getType() - * + * * The type of metadata this describes - * + * * @return string */ public function getType() { return $this->_type; } - + /** * getName() * @@ -77,10 +77,10 @@ class Zend_Tool_Framework_Metadata_Dynamic implements Zend_Tool_Framework_Metada { return $this->_name; } - + /** * getValue() - * + * * Metadata Value * * @return string @@ -89,11 +89,11 @@ class Zend_Tool_Framework_Metadata_Dynamic implements Zend_Tool_Framework_Metada { return $this->_value; } - - + + /** * __isset() - * + * * Check if an attrbute is set * * @param string $name @@ -103,7 +103,7 @@ class Zend_Tool_Framework_Metadata_Dynamic implements Zend_Tool_Framework_Metada { return isset($this->_dynamicAttributes[$name]); } - + /** * __unset() * @@ -115,7 +115,7 @@ class Zend_Tool_Framework_Metadata_Dynamic implements Zend_Tool_Framework_Metada unset($this->_dynamicAttributes[$name]); return; } - + /** * __get() - Get a property via property call $metadata->foo * @@ -133,7 +133,7 @@ class Zend_Tool_Framework_Metadata_Dynamic implements Zend_Tool_Framework_Metada throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this metadata.'); } } - + /** * __set() - Set a property via the magic set $metadata->foo = 'foo' * @@ -147,8 +147,8 @@ class Zend_Tool_Framework_Metadata_Dynamic implements Zend_Tool_Framework_Metada return; } else { require_once 'Zend/Tool/Framework/Registry/Exception.php'; - throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this registry.'); + throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this registry.'); } } - + } diff --git a/libs/Zend/Tool/Framework/Metadata/Interface.php b/libs/Zend/Tool/Framework/Metadata/Interface.php index 3b4a571..564d6fe 100644 --- a/libs/Zend/Tool/Framework/Metadata/Interface.php +++ b/libs/Zend/Tool/Framework/Metadata/Interface.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,25 +28,25 @@ */ interface Zend_Tool_Framework_Metadata_Interface { - + /** * getType() - * + * * The type of metadata this describes * */ public function getType(); - + /** * getName() * */ public function getName(); - + /** * getValue() * */ public function getValue(); - + } diff --git a/libs/Zend/Tool/Framework/Metadata/Tool.php b/libs/Zend/Tool/Framework/Metadata/Tool.php index 95994bd..dff0d7c 100644 --- a/libs/Zend/Tool/Framework/Metadata/Tool.php +++ b/libs/Zend/Tool/Framework/Metadata/Tool.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Tool.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Tool.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,12 +33,12 @@ require_once 'Zend/Tool/Framework/Metadata/Basic.php'; */ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Basic { - + /** * @var string */ protected $_type = 'Tool'; - + /**#@+ * @var string */ @@ -47,7 +47,7 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas protected $_providerName = null; protected $_specialtyName = null; /**#@-*/ - + /**#@+ * @var string */ @@ -61,12 +61,12 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas $this->_clientName = $clientName; return $this; } - + public function getClientName() { return $this->_clientName; } - + /** * setActionName() * @@ -88,7 +88,7 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas { return $this->_actionName; } - + /** * setProviderName() * @@ -144,7 +144,7 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas $this->_clientReference = $client; return $this; } - + /** * getClientReference() * @@ -154,7 +154,7 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas { return $this->_clientReference; } - + /** * setActionReference() * @@ -166,7 +166,7 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas $this->_actionReference = $action; return $this; } - + /** * getActionReference() * @@ -176,7 +176,7 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas { return $this->_actionReference; } - + /** * setProviderReference() * @@ -188,7 +188,7 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas $this->_providerReference = $provider; return $this; } - + /** * getProviderReference() * @@ -198,7 +198,7 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas { return $this->_providerReference; } - + /** * __toString() cast to string * @@ -207,11 +207,11 @@ class Zend_Tool_Framework_Metadata_Tool extends Zend_Tool_Framework_Metadata_Bas public function __toString() { $string = parent::__toString(); - $string .= ' (ProviderName: ' . $this->_providerName - . ', ActionName: ' . $this->_actionName - . ', SpecialtyName: ' . $this->_specialtyName + $string .= ' (ProviderName: ' . $this->_providerName + . ', ActionName: ' . $this->_actionName + . ', SpecialtyName: ' . $this->_specialtyName . ')'; - + return $string; } diff --git a/libs/Zend/Tool/Framework/Provider/Abstract.php b/libs/Zend/Tool/Framework/Provider/Abstract.php index 508d318..aa43cae 100644 --- a/libs/Zend/Tool/Framework/Provider/Abstract.php +++ b/libs/Zend/Tool/Framework/Provider/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,25 +33,25 @@ require_once 'Zend/Tool/Framework/Registry/EnabledInterface.php'; /** * This is a convenience class. - * + * * At current it will return the request and response from the client registry * as they are the more common things that will be needed by providers * - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -abstract class Zend_Tool_Framework_Provider_Abstract +abstract class Zend_Tool_Framework_Provider_Abstract implements Zend_Tool_Framework_Provider_Interface, Zend_Tool_Framework_Registry_EnabledInterface { - + /** * @var Zend_Tool_Framework_Registry_Interface */ protected $_registry = null; - + /** * setRegistry() - required by Zend_Tool_Framework_Registry_EnabledInterface * @@ -63,6 +63,6 @@ abstract class Zend_Tool_Framework_Provider_Abstract $this->_registry = $registry; return $this; } - - + + } diff --git a/libs/Zend/Tool/Framework/Provider/Exception.php b/libs/Zend/Tool/Framework/Provider/Exception.php index 0df191b..f41c2c1 100644 --- a/libs/Zend/Tool/Framework/Provider/Exception.php +++ b/libs/Zend/Tool/Framework/Provider/Exception.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -31,7 +31,7 @@ require_once 'Zend/Tool/Framework/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Provider_Exception extends Zend_Tool_Framework_Exception +class Zend_Tool_Framework_Provider_Exception extends Zend_Tool_Framework_Exception { - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Framework/Provider/Interactable.php b/libs/Zend/Tool/Framework/Provider/Interactable.php index 0d38458..e1e8a54 100644 --- a/libs/Zend/Tool/Framework/Provider/Interactable.php +++ b/libs/Zend/Tool/Framework/Provider/Interactable.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interactable.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interactable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -26,5 +26,5 @@ * @license http://framework.zend.com/license/new-bsd New BSD License */ interface Zend_Tool_Framework_Provider_Interactable -{ +{ } diff --git a/libs/Zend/Tool/Framework/Provider/Repository.php b/libs/Zend/Tool/Framework/Provider/Repository.php index 4374122..149212d 100644 --- a/libs/Zend/Tool/Framework/Provider/Repository.php +++ b/libs/Zend/Tool/Framework/Provider/Repository.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Repository.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: Repository.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,25 +36,25 @@ require_once 'Zend/Tool/Framework/Registry/EnabledInterface.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Provider_Repository +class Zend_Tool_Framework_Provider_Repository implements Zend_Tool_Framework_Registry_EnabledInterface, IteratorAggregate, Countable { - + /** * @var Zend_Tool_Framework_Registry */ protected $_registry = null; - + /** * @var bool */ protected $_processOnAdd = false; - + /** * @var Zend_Tool_Framework_Provider_Interface[] */ protected $_unprocessedProviders = array(); - + /** * @var Zend_Tool_Framework_Provider_Signature[] */ @@ -64,7 +64,7 @@ class Zend_Tool_Framework_Provider_Repository * @var array Array of Zend_Tool_Framework_Provider_Inteface */ protected $_providers = array(); - + /** * setRegistry() * @@ -76,7 +76,7 @@ class Zend_Tool_Framework_Provider_Repository $this->_registry = $registry; return $this; } - + /** * Set the ProcessOnAdd flag * @@ -88,7 +88,7 @@ class Zend_Tool_Framework_Provider_Repository $this->_processOnAdd = (bool) $processOnAdd; return $this; } - + /** * Add a provider to the repository for processing * @@ -100,30 +100,30 @@ class Zend_Tool_Framework_Provider_Repository if ($provider instanceof Zend_Tool_Framework_Registry_EnabledInterface) { $provider->setRegistry($this->_registry); } - + if (method_exists($provider, 'getName')) { $providerName = $provider->getName(); } else { $providerName = $this->_parseName($provider); } - + // if a provider by the given name already exist, and its not set as overwritable, throw exception - if (!$overwriteExistingProvider && - (array_key_exists($providerName, $this->_unprocessedProviders) - || array_key_exists($providerName, $this->_providers))) + if (!$overwriteExistingProvider && + (array_key_exists($providerName, $this->_unprocessedProviders) + || array_key_exists($providerName, $this->_providers))) { require_once 'Zend/Tool/Framework/Provider/Exception.php'; - throw new Zend_Tool_Framework_Provider_Exception('A provider by the name ' . $providerName + throw new Zend_Tool_Framework_Provider_Exception('A provider by the name ' . $providerName . ' is already registered and $overrideExistingProvider is set to false.'); } - + $this->_unprocessedProviders[$providerName] = $provider; - + // if process has already been called, process immediately. if ($this->_processOnAdd) { $this->process(); } - + return $this; } @@ -134,7 +134,7 @@ class Zend_Tool_Framework_Provider_Repository } else { $targetProviderClassName = (string) $providerOrClassName; } - + if (!$processedOnly) { foreach ($this->_unprocessedProviders as $unprocessedProvider) { if (get_class($unprocessedProvider) == $targetProviderClassName) { @@ -142,16 +142,16 @@ class Zend_Tool_Framework_Provider_Repository } } } - + foreach ($this->_providers as $processedProvider) { if (get_class($processedProvider) == $targetProviderClassName) { return true; } } - + return false; } - + /** * Process all of the unprocessed providers * @@ -164,24 +164,24 @@ class Zend_Tool_Framework_Provider_Repository // create a signature for the provided provider $providerSignature = new Zend_Tool_Framework_Provider_Signature($provider); - + if ($providerSignature instanceof Zend_Tool_Framework_Registry_EnabledInterface) { $providerSignature->setRegistry($this->_registry); } - + $providerSignature->process(); - + // ensure the name is lowercased for easier searching $providerName = strtolower($providerName); - + // add to the appropraite place $this->_providerSignatures[$providerName] = $providerSignature; $this->_providers[$providerName] = $providerSignature->getProvider(); - + // remove from unprocessed array unset($this->_unprocessedProviders[$providerName]); } - + } /** @@ -203,7 +203,7 @@ class Zend_Tool_Framework_Provider_Repository { return $this->_providerSignatures; } - + /** * getProvider() * @@ -235,7 +235,7 @@ class Zend_Tool_Framework_Provider_Repository { return count($this->_providers); } - + /** * getIterator() - Required by the IteratorAggregate Interface * @@ -245,7 +245,7 @@ class Zend_Tool_Framework_Provider_Repository { return new ArrayIterator($this->getProviders()); } - + /** * _parseName - internal method to determine the name of an action when one is not explicity provided. * diff --git a/libs/Zend/Tool/Framework/Provider/Signature.php b/libs/Zend/Tool/Framework/Provider/Signature.php index 09bbfaf..129562e 100644 --- a/libs/Zend/Tool/Framework/Provider/Signature.php +++ b/libs/Zend/Tool/Framework/Provider/Signature.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Signature.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Signature.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,9 +36,9 @@ require_once 'Zend/Tool/Framework/Registry/EnabledInterface.php'; require_once 'Zend/Tool/Framework/Action/Base.php'; /** - * The purpose of Zend_Tool_Framework_Provider_Signature is to derive + * The purpose of Zend_Tool_Framework_Provider_Signature is to derive * callable signatures from the provided provider. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -51,27 +51,27 @@ class Zend_Tool_Framework_Provider_Signature implements Zend_Tool_Framework_Regi * @var Zend_Tool_Framework_Registry */ protected $_registry = null; - + /** * @var Zend_Tool_Framework_Provider_Interface */ protected $_provider = null; - + /** * @var string */ protected $_name = null; - + /** * @var array */ protected $_specialties = array(); - + /** * @var array */ protected $_actionableMethods = array(); - + /** * @var unknown_type */ @@ -86,7 +86,7 @@ class Zend_Tool_Framework_Provider_Signature implements Zend_Tool_Framework_Regi * @var bool */ protected $_isProcessed = false; - + /** * Constructor * @@ -109,16 +109,16 @@ class Zend_Tool_Framework_Provider_Signature implements Zend_Tool_Framework_Regi $this->_registry = $registry; return $this; } - + public function process() { if ($this->_isProcessed) { return; } - + $this->_process(); } - + /** * getName() of the provider * @@ -148,7 +148,7 @@ class Zend_Tool_Framework_Provider_Signature implements Zend_Tool_Framework_Regi { return $this->_providerReflection; } - + /** * getSpecialities() * @@ -161,14 +161,14 @@ class Zend_Tool_Framework_Provider_Signature implements Zend_Tool_Framework_Regi /** * getActions() - * + * * @return array Array of Actions */ public function getActions() { return $this->_actions; } - + /** * getActionableMethods() * @@ -180,7 +180,7 @@ class Zend_Tool_Framework_Provider_Signature implements Zend_Tool_Framework_Regi } /** - * getActionableMethod() - Get an actionable method by name, this will return an array of + * getActionableMethod() - Get an actionable method by name, this will return an array of * useful information about what can be exectued on this provider * * @param string $methodName @@ -191,12 +191,12 @@ class Zend_Tool_Framework_Provider_Signature implements Zend_Tool_Framework_Regi if (isset($this->_actionableMethods[$methodName])) { return $this->_actionableMethods[$methodName]; } - + return false; } - + /** - * getActionableMethodByActionName() - Get an actionable method by its action name, this + * getActionableMethodByActionName() - Get an actionable method by its action name, this * will return an array of useful information about what can be exectued on this provider * * @param string $actionName @@ -296,21 +296,21 @@ class Zend_Tool_Framework_Provider_Signature implements Zend_Tool_Framework_Regi * the following will determine what methods are actually actionable * public, non-static, non-underscore prefixed, classes that dont * contain the name " - */ - if (!$method->getDeclaringClass()->isInstantiable() - || !$method->isPublic() - || $methodName[0] == '_' + */ + if (!$method->getDeclaringClass()->isInstantiable() + || !$method->isPublic() + || $methodName[0] == '_' || $method->isStatic() || in_array($methodName, array('getContextClasses', 'getName')) // other protected public methods will nee to go here ) { continue; } - + /** * check to see if the method was a required method by a Zend_Tool_* interface */ foreach ($method->getDeclaringClass()->getInterfaces() as $methodDeclaringClassInterface) { - if (strpos($methodDeclaringClassInterface->getName(), 'Zend_Tool_') === 0 + if (strpos($methodDeclaringClassInterface->getName(), 'Zend_Tool_') === 0 && $methodDeclaringClassInterface->hasMethod($methodName)) { continue 2; } diff --git a/libs/Zend/Tool/Framework/Registry.php b/libs/Zend/Tool/Framework/Registry.php index f304506..eb16072 100644 --- a/libs/Zend/Tool/Framework/Registry.php +++ b/libs/Zend/Tool/Framework/Registry.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Registry.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: Registry.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -37,47 +37,47 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter * @var Zend_Tool_Framework_Loader_Abstract */ protected $_loader = null; - + /** * @var Zend_Tool_Framework_Client_Abstract */ protected $_client = null; - + /** * @var Zend_Tool_Framework_Client_Config */ protected $_config = null; - + /** * @var Zend_Tool_Framework_Client_Storage */ protected $_storage = null; - + /** * @var Zend_Tool_Framework_Action_Repository */ protected $_actionRepository = null; - + /** * @var Zend_Tool_Framework_Provider_Repository */ protected $_providerRepository = null; - + /** * @var Zend_Tool_Framework_Manifest_Repository */ protected $_manifestRepository = null; - + /** * @var Zend_Tool_Framework_Client_Request */ protected $_request = null; - + /** * @var Zend_Tool_Framework_Client_Response */ protected $_response = null; - + /** * reset() - Reset all internal properties * @@ -91,12 +91,12 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter unset($this->_request); unset($this->_response); } - + // public function __construct() // { -// // no instantiation from outside +// // no instantiation from outside // } - + /** * Enter description here... * @@ -111,7 +111,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter } return $this; } - + /** * getClient() return the client in the registry * @@ -121,9 +121,9 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter { return $this->_client; } - + /** - * setConfig() + * setConfig() * * @param Zend_Tool_Framework_Client_Config $config * @return Zend_Tool_Framework_Registry @@ -133,7 +133,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter $this->_config = $config; return $this; } - + /** * getConfig() * @@ -145,12 +145,12 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Client/Config.php'; $this->setConfig(new Zend_Tool_Framework_Client_Config()); } - + return $this->_config; } - + /** - * setStorage() + * setStorage() * * @param Zend_Tool_Framework_Client_Storage $storage * @return Zend_Tool_Framework_Registry @@ -160,7 +160,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter $this->_storage = $storage; return $this; } - + /** * getConfig() * @@ -172,12 +172,12 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Client/Storage.php'; $this->setStorage(new Zend_Tool_Framework_Client_Storage()); } - + return $this->_storage; } - + /** - * setLoader() + * setLoader() * * @param Zend_Tool_Framework_Loader_Abstract $loader * @return Zend_Tool_Framework_Registry @@ -190,7 +190,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter } return $this; } - + /** * getLoader() * @@ -202,10 +202,10 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Loader/IncludePathLoader.php'; $this->setLoader(new Zend_Tool_Framework_Loader_IncludePathLoader()); } - + return $this->_loader; } - + /** * setActionRepository() * @@ -220,7 +220,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter } return $this; } - + /** * getActionRepository() * @@ -232,10 +232,10 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Action/Repository.php'; $this->setActionRepository(new Zend_Tool_Framework_Action_Repository()); } - + return $this->_actionRepository; } - + /** * setProviderRepository() * @@ -250,7 +250,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter } return $this; } - + /** * getProviderRepository() * @@ -262,10 +262,10 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Provider/Repository.php'; $this->setProviderRepository(new Zend_Tool_Framework_Provider_Repository()); } - + return $this->_providerRepository; } - + /** * setManifestRepository() * @@ -280,7 +280,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter } return $this; } - + /** * getManifestRepository() * @@ -292,10 +292,10 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Manifest/Repository.php'; $this->setManifestRepository(new Zend_Tool_Framework_Manifest_Repository()); } - + return $this->_manifestRepository; } - + /** * setRequest() * @@ -307,7 +307,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter $this->_request = $request; return $this; } - + /** * getRequest() * @@ -319,10 +319,10 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Client/Request.php'; $this->setRequest(new Zend_Tool_Framework_Client_Request()); } - + return $this->_request; } - + /** * setResponse() * @@ -346,10 +346,10 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Client/Response.php'; $this->setResponse(new Zend_Tool_Framework_Client_Response()); } - + return $this->_response; } - + /** * __get() - Get a property via property call $registry->foo * @@ -365,7 +365,7 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this registry.'); } } - + /** * __set() - Set a property via the magic set $registry->foo = 'foo' * @@ -379,10 +379,10 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter return; } else { require_once 'Zend/Tool/Framework/Registry/Exception.php'; - throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this registry.'); + throw new Zend_Tool_Framework_Registry_Exception('Property ' . $name . ' was not located in this registry.'); } } - + /** * isObjectRegistryEnablable() - Check whether an object is registry enablable * @@ -395,10 +395,10 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Registry/Exception.php'; throw new Zend_Tool_Framework_Registry_Exception('isObjectRegistryEnablable() expects an object.'); } - + return ($object instanceof Zend_Tool_Framework_Registry_EnabledInterface); } - + /** * enableRegistryOnObject() - make an object registry enabled * @@ -411,9 +411,9 @@ class Zend_Tool_Framework_Registry implements Zend_Tool_Framework_Registry_Inter require_once 'Zend/Tool/Framework/Registry/Exception.php'; throw new Zend_Tool_Framework_Registry_Exception('Object provided is not registry enablable, check first with Zend_Tool_Framework_Registry::isObjectRegistryEnablable()'); } - + $object->setRegistry($this); return $this; } - + } diff --git a/libs/Zend/Tool/Framework/Registry/EnabledInterface.php b/libs/Zend/Tool/Framework/Registry/EnabledInterface.php index d59c90c..052a825 100644 --- a/libs/Zend/Tool/Framework/Registry/EnabledInterface.php +++ b/libs/Zend/Tool/Framework/Registry/EnabledInterface.php @@ -17,16 +17,16 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: EnabledInterface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: EnabledInterface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * This is a convenience class. - * + * * At current it will return the request and response from the client registry * as they are the more common things that will be needed by providers * - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -34,7 +34,7 @@ */ interface Zend_Tool_Framework_Registry_EnabledInterface { - + public function setRegistry(Zend_Tool_Framework_Registry_Interface $registry); - + } diff --git a/libs/Zend/Tool/Framework/Registry/Exception.php b/libs/Zend/Tool/Framework/Registry/Exception.php index ac168c8..feeed5c 100644 --- a/libs/Zend/Tool/Framework/Registry/Exception.php +++ b/libs/Zend/Tool/Framework/Registry/Exception.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once 'Zend/Tool/Framework/Exception.php'; @@ -27,7 +27,7 @@ require_once 'Zend/Tool/Framework/Exception.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_Registry_Exception extends Zend_Tool_Framework_Exception +class Zend_Tool_Framework_Registry_Exception extends Zend_Tool_Framework_Exception { - + } diff --git a/libs/Zend/Tool/Framework/Registry/Interface.php b/libs/Zend/Tool/Framework/Registry/Interface.php index 51e76b1..8707660 100644 --- a/libs/Zend/Tool/Framework/Registry/Interface.php +++ b/libs/Zend/Tool/Framework/Registry/Interface.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,7 +27,7 @@ */ interface Zend_Tool_Framework_Registry_Interface { - + /** * setClient() @@ -36,29 +36,29 @@ interface Zend_Tool_Framework_Registry_Interface * @return Zend_Tool_Framework_Registry */ public function setClient(Zend_Tool_Framework_Client_Abstract $client); - + /** * getClient() return the client in the registry * * @return Zend_Tool_Framework_Client_Abstract */ public function getClient(); - + /** - * setLoader() + * setLoader() * * @param Zend_Tool_Framework_Loader_Abstract $loader * @return Zend_Tool_Framework_Registry */ public function setLoader(Zend_Tool_Framework_Loader_Abstract $loader); - + /** * getLoader() * * @return Zend_Tool_Framework_Loader_Abstract */ public function getLoader(); - + /** * setActionRepository() * @@ -66,14 +66,14 @@ interface Zend_Tool_Framework_Registry_Interface * @return Zend_Tool_Framework_Registry */ public function setActionRepository(Zend_Tool_Framework_Action_Repository $actionRepository); - + /** * getActionRepository() * * @return Zend_Tool_Framework_Action_Repository */ public function getActionRepository(); - + /** * setProviderRepository() * @@ -81,14 +81,14 @@ interface Zend_Tool_Framework_Registry_Interface * @return Zend_Tool_Framework_Registry */ public function setProviderRepository(Zend_Tool_Framework_Provider_Repository $providerRepository); - + /** * getProviderRepository() * * @return Zend_Tool_Framework_Provider_Repository */ public function getProviderRepository(); - + /** * setManifestRepository() * @@ -96,14 +96,14 @@ interface Zend_Tool_Framework_Registry_Interface * @return Zend_Tool_Framework_Registry */ public function setManifestRepository(Zend_Tool_Framework_Manifest_Repository $manifestRepository); - + /** * getManifestRepository() * * @return Zend_Tool_Framework_Manifest_Repository */ public function getManifestRepository(); - + /** * setRequest() * @@ -111,14 +111,14 @@ interface Zend_Tool_Framework_Registry_Interface * @return Zend_Tool_Framework_Registry */ public function setRequest(Zend_Tool_Framework_Client_Request $request); - + /** * getRequest() * * @return Zend_Tool_Framework_Client_Request */ public function getRequest(); - + /** * setResponse() * @@ -133,5 +133,5 @@ interface Zend_Tool_Framework_Registry_Interface * @return Zend_Tool_Framework_Client_Response */ public function getResponse(); - + } diff --git a/libs/Zend/Tool/Framework/System/Action/Create.php b/libs/Zend/Tool/Framework/System/Action/Create.php index 375e186..901adcf 100644 --- a/libs/Zend/Tool/Framework/System/Action/Create.php +++ b/libs/Zend/Tool/Framework/System/Action/Create.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Create.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Create.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,11 +28,11 @@ require_once 'Zend/Tool/Framework/Action/Base.php'; /** * This is a convenience class. - * + * * At current it will return the request and response from the client registry * as they are the more common things that will be needed by providers * - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -40,5 +40,5 @@ require_once 'Zend/Tool/Framework/Action/Base.php'; */ class Zend_Tool_Framework_System_Action_Create extends Zend_Tool_Framework_Action_Base { - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Framework/System/Action/Delete.php b/libs/Zend/Tool/Framework/System/Action/Delete.php index c0c0e5f..5476b60 100644 --- a/libs/Zend/Tool/Framework/System/Action/Delete.php +++ b/libs/Zend/Tool/Framework/System/Action/Delete.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Delete.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Delete.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,11 +28,11 @@ require_once 'Zend/Tool/Framework/Action/Base.php'; /** * This is a convenience class. - * + * * At current it will return the request and response from the client registry * as they are the more common things that will be needed by providers * - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -40,5 +40,5 @@ require_once 'Zend/Tool/Framework/Action/Base.php'; */ class Zend_Tool_Framework_System_Action_Delete extends Zend_Tool_Framework_Action_Base { - + } diff --git a/libs/Zend/Tool/Framework/System/Manifest.php b/libs/Zend/Tool/Framework/System/Manifest.php index 7229374..66c8f09 100644 --- a/libs/Zend/Tool/Framework/System/Manifest.php +++ b/libs/Zend/Tool/Framework/System/Manifest.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Manifest.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Manifest.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once 'Zend/Tool/Framework/Manifest/ProviderManifestable.php'; @@ -34,7 +34,7 @@ require_once 'Zend/Tool/Framework/System/Action/Delete.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_System_Manifest +class Zend_Tool_Framework_System_Manifest implements Zend_Tool_Framework_Manifest_ProviderManifestable, Zend_Tool_Framework_Manifest_ActionManifestable { diff --git a/libs/Zend/Tool/Framework/System/Provider/Manifest.php b/libs/Zend/Tool/Framework/System/Provider/Manifest.php index e5986c7..3b441b7 100644 --- a/libs/Zend/Tool/Framework/System/Provider/Manifest.php +++ b/libs/Zend/Tool/Framework/System/Provider/Manifest.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Manifest.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Manifest.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -36,32 +36,32 @@ require_once 'Zend/Tool/Framework/Provider/Interface.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_System_Provider_Manifest +class Zend_Tool_Framework_System_Provider_Manifest implements Zend_Tool_Framework_Provider_Interface, Zend_Tool_Framework_Registry_EnabledInterface { - + public function setRegistry(Zend_Tool_Framework_Registry_Interface $registry) { $this->_registry = $registry; } - + public function getName() { return 'Manifest'; } - + public function show() { - + $manifestRepository = $this->_registry->getManifestRepository(); $response = $this->_registry->getResponse(); - + $metadataTree = array(); - + $longestAttrNameLen = 50; - + foreach ($manifestRepository as $metadata) { - + $metadataType = $metadata->getType(); $metadataName = $metadata->getName(); $metadataAttrs = $metadata->getAttributes('attributesParent'); @@ -69,33 +69,33 @@ class Zend_Tool_Framework_System_Provider_Manifest if (!$metadataAttrs) { $metadataAttrs = '(None)'; } else { - $metadataAttrs = urldecode(http_build_query($metadataAttrs, null, ', ')); + $metadataAttrs = urldecode(http_build_query($metadataAttrs, null, ', ')); } - + if (!array_key_exists($metadataType, $metadataTree)) { $metadataTree[$metadataType] = array(); } - + if (!array_key_exists($metadataName, $metadataTree[$metadataType])) { $metadataTree[$metadataType][$metadataName] = array(); } - + if (!array_key_exists($metadataAttrs, $metadataTree[$metadataType][$metadataName])) { $metadataTree[$metadataType][$metadataName][$metadataAttrs] = array(); } - + $longestAttrNameLen = (strlen($metadataAttrs) > $longestAttrNameLen) ? strlen($metadataAttrs) : $longestAttrNameLen; - + $metadataValue = $metadata->getValue(); if (is_array($metadataValue) && count($metadataValue) > 0) { $metadataValue = urldecode(http_build_query($metadataValue, null, ', ')); } elseif (is_array($metadataValue)) { $metadataValue = '(empty array)'; } - + $metadataTree[$metadataType][$metadataName][$metadataAttrs][] = $metadataValue; } - + foreach ($metadataTree as $metadataType => $metadatasByName) { $response->appendContent($metadataType); foreach ($metadatasByName as $metadataName => $metadatasByAttributes) { @@ -109,6 +109,6 @@ class Zend_Tool_Framework_System_Provider_Manifest } } } - + } } diff --git a/libs/Zend/Tool/Framework/System/Provider/Version.php b/libs/Zend/Tool/Framework/System/Provider/Version.php index 88a8345..d27a0ff 100644 --- a/libs/Zend/Tool/Framework/System/Provider/Version.php +++ b/libs/Zend/Tool/Framework/System/Provider/Version.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Version.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Version.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once 'Zend/Tool/Framework/Registry.php'; @@ -31,7 +31,7 @@ require_once 'Zend/Version.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Framework_System_Provider_Version +class Zend_Tool_Framework_System_Provider_Version implements Zend_Tool_Framework_Provider_Interface, Zend_Tool_Framework_Registry_EnabledInterface { @@ -39,7 +39,7 @@ class Zend_Tool_Framework_System_Provider_Version * @var Zend_Tool_Framework_Registry_Interface */ protected $_registry = null; - + const MODE_MAJOR = 'major'; const MODE_MINOR = 'minor'; const MODE_MINI = 'mini'; @@ -51,7 +51,7 @@ class Zend_Tool_Framework_System_Provider_Version $this->_registry = $registry; return $this; } - + /** * Show Action * diff --git a/libs/Zend/Tool/Project/Context/Content/Engine.php b/libs/Zend/Tool/Project/Context/Content/Engine.php index 3565816..c7a66b2 100644 --- a/libs/Zend/Tool/Project/Context/Content/Engine.php +++ b/libs/Zend/Tool/Project/Context/Content/Engine.php @@ -35,7 +35,7 @@ require_once 'Zend/Tool/Project/Context/Content/Engine/Phtml.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -47,17 +47,17 @@ class Zend_Tool_Project_Context_Content_Engine * @var Zend_Tool_Framework_Client_Storage */ protected $_storage = null; - + /** * @var string */ protected $_keyInStorage = 'project/content'; - + /** * @var array */ protected $_engines = array(); - + /** * __construct() * @@ -71,7 +71,7 @@ class Zend_Tool_Project_Context_Content_Engine new Zend_Tool_Project_Context_Content_Engine_Phtml($storage, $this->_keyInStorage), ); } - + /** * getContent() * @@ -83,24 +83,24 @@ class Zend_Tool_Project_Context_Content_Engine public function getContent(Zend_Tool_Project_Context_Interface $context, $methodName, $parameters) { $content = null; - + foreach ($this->_engines as $engine) { if ($engine->hasContent($context, $methodName, $parameters)) { $content = $engine->getContent($context, $methodName, $parameters); - + if ($content != null) { break; } - + } - + } - + if ($content == null) { return false; } - + return $content; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Content/Engine/CodeGenerator.php b/libs/Zend/Tool/Project/Context/Content/Engine/CodeGenerator.php index 2c1610c..cd4f731 100644 --- a/libs/Zend/Tool/Project/Context/Content/Engine/CodeGenerator.php +++ b/libs/Zend/Tool/Project/Context/Content/Engine/CodeGenerator.php @@ -25,7 +25,7 @@ * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -37,12 +37,12 @@ class Zend_Tool_Project_Context_Content_Engine_CodeGenerator * @var Zend_Tool_Framework_Client_Storage */ protected $_storage = null; - + /** * @var string */ protected $_contentPrefix = null; - + /** * __construct() * @@ -54,7 +54,7 @@ class Zend_Tool_Project_Context_Content_Engine_CodeGenerator $this->_storage = $storage; $this->_contentPrefix = $contentPrefix; } - + /** * hasContent() * @@ -66,7 +66,7 @@ class Zend_Tool_Project_Context_Content_Engine_CodeGenerator { return $this->_storage->has($this->_contentPrefix . '/' . $context->getName() . '/' . $method . '.php'); } - + /** * getContent() * @@ -78,21 +78,21 @@ class Zend_Tool_Project_Context_Content_Engine_CodeGenerator public function getContent(Zend_Tool_Project_Context_Interface $context, $method, $parameters) { $streamUri = $this->_storage->getStreamUri($this->_contentPrefix . '/' . $context->getName() . '/' . $method . '.php'); - + if (method_exists($context, 'getCodeGenerator')) { $codeGenerator = $context->getCodeGenerator(); } else { $codeGenerator = new Zend_CodeGenerator_Php_File(); } - + $codeGenerator = include $streamUri; - + if (!$codeGenerator instanceof Zend_CodeGenerator_Abstract) { throw new Zend_Tool_Project_Exception('Custom file at ' . $streamUri . ' did not return the $codeGenerator object.'); } - + return $codeGenerator->generate(); } - - + + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Content/Engine/Phtml.php b/libs/Zend/Tool/Project/Context/Content/Engine/Phtml.php index df03d91..62dbf52 100644 --- a/libs/Zend/Tool/Project/Context/Content/Engine/Phtml.php +++ b/libs/Zend/Tool/Project/Context/Content/Engine/Phtml.php @@ -25,7 +25,7 @@ * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -33,17 +33,17 @@ */ class Zend_Tool_Project_Context_Content_Engine_Phtml { - + /** * @var Zend_Tool_Framework_Client_Storage */ protected $_storage = null; - + /** * @var string */ protected $_contentPrefix = null; - + /** * __construct() * @@ -55,7 +55,7 @@ class Zend_Tool_Project_Context_Content_Engine_Phtml $this->_storage = $storage; $this->_contentPrefix = $contentPrefix; } - + /** * hasContext() * @@ -67,7 +67,7 @@ class Zend_Tool_Project_Context_Content_Engine_Phtml { return $this->_storage->has($this->_contentPrefix . '/' . $context . '/' . $method . '.phtml'); } - + /** * getContent() * @@ -78,12 +78,12 @@ class Zend_Tool_Project_Context_Content_Engine_Phtml public function getContent(Zend_Tool_Project_Context_Interface $context, $method, $parameters) { $streamUri = $this->_storage->getStreamUri($this->_contentPrefix . '/' . $context->getName() . '/' . $method . '.phtml'); - + ob_start(); include $streamUri; $content = ob_get_clean(); - + return $content; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Exception.php b/libs/Zend/Tool/Project/Context/Exception.php index 9529e7c..85d715c 100644 --- a/libs/Zend/Tool/Project/Context/Exception.php +++ b/libs/Zend/Tool/Project/Context/Exception.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once 'Zend/Tool/Project/Exception.php'; @@ -29,5 +29,5 @@ require_once 'Zend/Tool/Project/Exception.php'; */ class Zend_Tool_Project_Context_Exception extends Zend_Tool_Project_Exception { - + } diff --git a/libs/Zend/Tool/Project/Context/Filesystem/Abstract.php b/libs/Zend/Tool/Project/Context/Filesystem/Abstract.php index ee0f1f5..c5a7923 100644 --- a/libs/Zend/Tool/Project/Context/Filesystem/Abstract.php +++ b/libs/Zend/Tool/Project/Context/Filesystem/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,30 +30,30 @@ require_once 'Zend/Tool/Project/Context/Interface.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Tool_Project_Context_Interface -{ - +abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Tool_Project_Context_Interface +{ + /** * @var Zend_Tool_Project_Profile_Resource */ protected $_resource = null; - + /** * @var string */ protected $_baseDirectory = null; - + /** * @var string */ protected $_filesystemName = null; - + /** * init() * @@ -65,7 +65,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Too $this->_baseDirectory = $parentBaseDirectory; return $this; } - + /** * setResource() * @@ -77,7 +77,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Too $this->_resource = $resource; return $this; } - + /** * setBaseDirectory() * @@ -89,7 +89,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Too $this->_baseDirectory = rtrim(str_replace('\\', '/', $baseDirectory), '/'); return $this; } - + /** * getBaseDirectory() * @@ -99,7 +99,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Too { return $this->_baseDirectory; } - + /** * setFilesystemName() * @@ -111,7 +111,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Too $this->_filesystemName = $filesystemName; return $this; } - + /** * getFilesystemName() * @@ -121,7 +121,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Too { return $this->_filesystemName; } - + /** * getPath() * @@ -135,7 +135,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Too } return $path; } - + /** * exists() * @@ -145,21 +145,21 @@ abstract class Zend_Tool_Project_Context_Filesystem_Abstract implements Zend_Too { return file_exists($this->getPath()); } - + /** * create() * * Create this resource/context - * + * */ abstract public function create(); /** * delete() - * + * * Delete this resouce/context * */ abstract public function delete(); - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Filesystem/Directory.php b/libs/Zend/Tool/Project/Context/Filesystem/Directory.php index 670e501..1e2650a 100644 --- a/libs/Zend/Tool/Project/Context/Filesystem/Directory.php +++ b/libs/Zend/Tool/Project/Context/Filesystem/Directory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Directory.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: Directory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,15 +30,15 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Abstract.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -abstract class Zend_Tool_Project_Context_Filesystem_Directory extends Zend_Tool_Project_Context_Filesystem_Abstract +abstract class Zend_Tool_Project_Context_Filesystem_Directory extends Zend_Tool_Project_Context_Filesystem_Abstract { - + /** * create() * @@ -53,7 +53,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_Directory extends Zend_Tool_ $parentResource->create(); } } - + if (!file_exists($this->getPath())) { mkdir($this->getPath()); } @@ -70,8 +70,8 @@ abstract class Zend_Tool_Project_Context_Filesystem_Directory extends Zend_Tool_ { $this->_resource->setDeleted(true); rmdir($this->getPath()); - + return $this; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Filesystem/File.php b/libs/Zend/Tool/Project/Context/Filesystem/File.php index 1ee0bb5..ddd49dc 100644 --- a/libs/Zend/Tool/Project/Context/Filesystem/File.php +++ b/libs/Zend/Tool/Project/Context/Filesystem/File.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: File.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: File.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,15 +30,15 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Abstract.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -abstract class Zend_Tool_Project_Context_Filesystem_File extends Zend_Tool_Project_Context_Filesystem_Abstract +abstract class Zend_Tool_Project_Context_Filesystem_File extends Zend_Tool_Project_Context_Filesystem_Abstract { - + /** * init() * @@ -50,7 +50,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_File extends Zend_Tool_Proje parent::init(); return $this; } - + /** * setResource() * @@ -77,16 +77,16 @@ abstract class Zend_Tool_Project_Context_Filesystem_File extends Zend_Tool_Proje $parentResource->create(); } } - - + + if (file_exists($this->getPath())) { // @todo propt user to determine if its ok to overwrite file } - + file_put_contents($this->getPath(), $this->getContents()); return $this; } - + /** * delete() * @@ -98,7 +98,7 @@ abstract class Zend_Tool_Project_Context_Filesystem_File extends Zend_Tool_Proje $this->_resource->setDeleted(true); return $this; } - + /** * getContents() * @@ -108,5 +108,5 @@ abstract class Zend_Tool_Project_Context_Filesystem_File extends Zend_Tool_Proje { return null; } - + } diff --git a/libs/Zend/Tool/Project/Context/Interface.php b/libs/Zend/Tool/Project/Context/Interface.php index fe3501e..64cff1c 100644 --- a/libs/Zend/Tool/Project/Context/Interface.php +++ b/libs/Zend/Tool/Project/Context/Interface.php @@ -16,12 +16,12 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * Interface for contexts - * + * * setResource() is an optional method that if the context supports * will be set with the resource at construction time * @@ -32,7 +32,7 @@ */ interface Zend_Tool_Project_Context_Interface { - + public function getName(); - + } diff --git a/libs/Zend/Tool/Project/Context/Repository.php b/libs/Zend/Tool/Project/Context/Repository.php index d7155e1..4c072e4 100644 --- a/libs/Zend/Tool/Project/Context/Repository.php +++ b/libs/Zend/Tool/Project/Context/Repository.php @@ -16,7 +16,7 @@ * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Repository.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Repository.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once 'Zend/Tool/Project/Context/System/Interface.php'; @@ -31,13 +31,13 @@ require_once 'Zend/Tool/Project/Context/System/NotOverwritable.php'; */ class Zend_Tool_Project_Context_Repository implements Countable { - + protected static $_instance = null; protected static $_isInitialized = false; - + protected $_shortContextNames = array(); protected $_contexts = array(); - + /** * Enter description here... * @@ -48,16 +48,16 @@ class Zend_Tool_Project_Context_Repository implements Countable if (self::$_instance == null) { self::$_instance = new self(); } - + return self::$_instance; } - + public static function resetInstance() { self::$_instance = null; self::$_isInitialized = false; } - + protected function __construct() { if (self::$_isInitialized == false) { @@ -67,7 +67,7 @@ class Zend_Tool_Project_Context_Repository implements Countable self::$_isInitialized = true; } } - + public function addContextsFromDirectory($directory, $prefix) { $prefix = trim($prefix, '_') . '_'; @@ -79,8 +79,8 @@ class Zend_Tool_Project_Context_Repository implements Countable $this->addContextClass($class); } } - - + + public function addContextClass($contextClass) { if (!class_exists($contextClass)) { @@ -90,7 +90,7 @@ class Zend_Tool_Project_Context_Repository implements Countable $context = new $contextClass(); return $this->addContext($context); } - + /** * Enter description here... * @@ -102,16 +102,16 @@ class Zend_Tool_Project_Context_Repository implements Countable $isSystem = ($context instanceof Zend_Tool_Project_Context_System_Interface); $isTopLevel = ($context instanceof Zend_Tool_Project_Context_System_TopLevelRestrictable); $isOverwritable = !($context instanceof Zend_Tool_Project_Context_System_NotOverwritable); - + $index = (count($this->_contexts)) ? max(array_keys($this->_contexts)) + 1 : 1; - + $normalName = $this->_normalizeName($context->getName()); - + if (isset($this->_shortContextNames[$normalName]) && ($this->_contexts[$this->_shortContextNames[$normalName]]['isOverwritable'] === false) ) { require_once 'Zend/Tool/Project/Context/Exception.php'; throw new Zend_Tool_Project_Context_Exception('Context ' . $context->getName() . ' is not overwriteable.'); } - + $this->_shortContextNames[$normalName] = $index; $this->_contexts[$index] = array( 'isTopLevel' => $isTopLevel, @@ -120,38 +120,38 @@ class Zend_Tool_Project_Context_Repository implements Countable 'normalName' => $normalName, 'context' => $context ); - + return $this; } - + public function getContext($name) - { + { if (!$this->hasContext($name)) { require_once 'Zend/Tool/Project/Context/Exception.php'; throw new Zend_Tool_Project_Context_Exception('Context by name ' . $name . ' does not exist in the registry.'); } - + $name = $this->_normalizeName($name); return clone $this->_contexts[$this->_shortContextNames[$name]]['context']; } - + public function hasContext($name) { $name = $this->_normalizeName($name); return (isset($this->_shortContextNames[$name]) ? true : false); } - + public function isSystemContext($name) { if (!$this->hasContext($name)) { return false; } - + $name = $this->_normalizeName($name); $index = $this->_shortContextNames[$name]; return $this->_contexts[$index]['isSystemContext']; } - + public function isTopLevelContext($name) { if (!$this->hasContext($name)) { @@ -161,7 +161,7 @@ class Zend_Tool_Project_Context_Repository implements Countable $index = $this->_shortContextNames[$name]; return $this->_contexts[$index]['isTopLevel']; } - + public function isOverwritableContext($name) { if (!$this->hasContext($name)) { @@ -171,15 +171,15 @@ class Zend_Tool_Project_Context_Repository implements Countable $index = $this->_shortContextNames[$name]; return $this->_contexts[$index]['isOverwritable']; } - + public function count() { return count($this->_contexts); } - + protected function _normalizeName($name) { return strtolower($name); } - + } diff --git a/libs/Zend/Tool/Project/Context/System/Interface.php b/libs/Zend/Tool/Project/Context/System/Interface.php index 7d0394f..4014c57 100644 --- a/libs/Zend/Tool/Project/Context/System/Interface.php +++ b/libs/Zend/Tool/Project/Context/System/Interface.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -25,7 +25,7 @@ * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) diff --git a/libs/Zend/Tool/Project/Context/System/NotOverwritable.php b/libs/Zend/Tool/Project/Context/System/NotOverwritable.php index 026701b..e797467 100644 --- a/libs/Zend/Tool/Project/Context/System/NotOverwritable.php +++ b/libs/Zend/Tool/Project/Context/System/NotOverwritable.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: NotOverwritable.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: NotOverwritable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -25,7 +25,7 @@ * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) diff --git a/libs/Zend/Tool/Project/Context/System/ProjectDirectory.php b/libs/Zend/Tool/Project/Context/System/ProjectDirectory.php index e7e0902..5d87400 100644 --- a/libs/Zend/Tool/Project/Context/System/ProjectDirectory.php +++ b/libs/Zend/Tool/Project/Context/System/ProjectDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProjectDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ProjectDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -45,24 +45,24 @@ require_once 'Zend/Tool/Project/Context/System/NotOverwritable.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_System_ProjectDirectory +class Zend_Tool_Project_Context_System_ProjectDirectory extends Zend_Tool_Project_Context_Filesystem_Directory implements Zend_Tool_Project_Context_System_Interface, Zend_Tool_Project_Context_System_NotOverwritable, - Zend_Tool_Project_Context_System_TopLevelRestrictable + Zend_Tool_Project_Context_System_TopLevelRestrictable { - + /** * @var string */ protected $_filesystemName = null; - + /** * getName() * @@ -72,7 +72,7 @@ class Zend_Tool_Project_Context_System_ProjectDirectory { return 'ProjectDirectory'; } - + /** * init() * @@ -82,22 +82,22 @@ class Zend_Tool_Project_Context_System_ProjectDirectory { // get base path from attributes (would be in path attribute) $projectDirectory = $this->_resource->getAttribute('path'); - + // if not, get from profile if ($projectDirectory == null) { $projectDirectory = $this->_resource->getProfile()->getAttribute('projectDirectory'); } - + // if not, exception. if ($projectDirectory == null) { require_once 'Zend/Tool/Project/Exception.php'; throw new Zend_Tool_Project_Exception('projectDirectory cannot find the directory for this project.'); } - + $this->_baseDirectory = rtrim($projectDirectory, '\\/'); return $this; } - + /** * create() * @@ -120,9 +120,9 @@ class Zend_Tool_Project_Context_System_ProjectDirectory } */ } - + parent::create(); return $this; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/System/ProjectProfileFile.php b/libs/Zend/Tool/Project/Context/System/ProjectProfileFile.php index 9e23829..a292131 100644 --- a/libs/Zend/Tool/Project/Context/System/ProjectProfileFile.php +++ b/libs/Zend/Tool/Project/Context/System/ProjectProfileFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProjectProfileFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ProjectProfileFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -45,13 +45,13 @@ require_once 'Zend/Tool/Project/Profile/FileParser/Xml.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_System_ProjectProfileFile +class Zend_Tool_Project_Context_System_ProjectProfileFile extends Zend_Tool_Project_Context_Filesystem_File implements Zend_Tool_Project_Context_System_Interface, Zend_Tool_Project_Context_System_NotOverwritable @@ -61,12 +61,12 @@ class Zend_Tool_Project_Context_System_ProjectProfileFile * @var string */ protected $_filesystemName = '.zfproject.xml'; - + /** * @var Zend_Tool_Project_Profile */ protected $_profile = null; - + /** * getName() * @@ -76,7 +76,7 @@ class Zend_Tool_Project_Context_System_ProjectProfileFile { return 'ProjectProfileFile'; } - + /** * setProfile() * @@ -88,10 +88,10 @@ class Zend_Tool_Project_Context_System_ProjectProfileFile $this->_profile = $profile; return $this; } - + /** - * save() - * + * save() + * * Proxy to create * * @return Zend_Tool_Project_Context_System_ProjectProfileFile @@ -101,7 +101,7 @@ class Zend_Tool_Project_Context_System_ProjectProfileFile parent::create(); return $this; } - + /** * getContents() * @@ -114,5 +114,5 @@ class Zend_Tool_Project_Context_System_ProjectProfileFile $xml = $parser->serialize($profile); return $xml; } - + } diff --git a/libs/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php b/libs/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php index bee57e3..6f556d7 100644 --- a/libs/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php +++ b/libs/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProjectProvidersDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ProjectProvidersDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -40,23 +40,23 @@ require_once 'Zend/Tool/Project/Context/System/NotOverwritable.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_System_ProjectProvidersDirectory +class Zend_Tool_Project_Context_System_ProjectProvidersDirectory extends Zend_Tool_Project_Context_Filesystem_Directory implements Zend_Tool_Project_Context_System_Interface, Zend_Tool_Project_Context_System_NotOverwritable { - + /** * @var string */ protected $_filesystemName = 'providers'; - + /** * getName() * @@ -66,7 +66,7 @@ class Zend_Tool_Project_Context_System_ProjectProvidersDirectory { return 'ProjectProvidersDirectory'; } - + /** * init() * @@ -75,7 +75,7 @@ class Zend_Tool_Project_Context_System_ProjectProvidersDirectory public function init() { parent::init(); - + if (file_exists($this->getPath())) { foreach (new DirectoryIterator($this->getPath()) as $item) { @@ -83,15 +83,15 @@ class Zend_Tool_Project_Context_System_ProjectProvidersDirectory $loadableFiles[] = $item->getPathname(); } } - + if ($loadableFiles) { - + // @todo process and add the files to the system for usage. - + } } - + return $this; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/System/TopLevelRestrictable.php b/libs/Zend/Tool/Project/Context/System/TopLevelRestrictable.php index 85ca0ca..bba9051 100644 --- a/libs/Zend/Tool/Project/Context/System/TopLevelRestrictable.php +++ b/libs/Zend/Tool/Project/Context/System/TopLevelRestrictable.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TopLevelRestrictable.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TopLevelRestrictable.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -25,7 +25,7 @@ * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -33,5 +33,5 @@ */ interface Zend_Tool_Project_Context_System_TopLevelRestrictable { - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ActionMethod.php b/libs/Zend/Tool/Project/Context/Zf/ActionMethod.php index 0238795..c52f0f6 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ActionMethod.php +++ b/libs/Zend/Tool/Project/Context/Zf/ActionMethod.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ActionMethod.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ActionMethod.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,25 +35,25 @@ require_once 'Zend/Reflection/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Context_Interface +class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Context_Interface { - + /** * @var Zend_Tool_Project_Profile_Resource */ protected $_resource = null; - + /** * @var Zend_Tool_Project_Profile_Resource */ protected $_controllerResource = null; - + /** * @var string */ @@ -63,7 +63,7 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con * @var string */ protected $_actionName = null; - + /** * init() * @@ -72,7 +72,7 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con public function init() { $this->_actionName = $this->_resource->getAttribute('actionName'); - + $this->_resource->setAppendable(false); $this->_controllerResource = $this->_resource->getParentResource(); if (!$this->_controllerResource->getContext() instanceof Zend_Tool_Project_Context_Zf_ControllerFile) { @@ -81,9 +81,9 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con } // make the ControllerFile node appendable so we can tack on the actionMethod. $this->_resource->getParentResource()->setAppendable(true); - + $this->_controllerPath = $this->_controllerResource->getContext()->getPath(); - + /* * This code block is now commented, its doing to much for init() * @@ -92,10 +92,10 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con throw new Zend_Tool_Project_Context_Exception('An action named ' . $this->_actionName . 'Action already exists in this controller'); } */ - + return $this; } - + /** * getPersistentAttributes * @@ -107,7 +107,7 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con 'actionName' => $this->getActionName() ); } - + /** * getName() * @@ -117,7 +117,7 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con { return 'ActionMethod'; } - + /** * setResource() * @@ -129,7 +129,7 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con $this->_resource = $resource; return $this; } - + /** * setActionName() * @@ -141,7 +141,7 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con $this->_actionName = $actionName; return $this; } - + /** * getActionName() * @@ -151,7 +151,7 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con { return $this->_actionName; } - + /** * create() * @@ -162,13 +162,13 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con if (self::createActionMethod($this->_controllerPath, $this->_actionName) === false) { require_once 'Zend/Tool/Project/Context/Exception.php'; throw new Zend_Tool_Project_Context_Exception( - 'Could not create action within controller ' . $this->_controllerPath + 'Could not create action within controller ' . $this->_controllerPath . ' with action name ' . $this->_actionName ); } return $this; } - + /** * delete() * @@ -179,7 +179,7 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con // @todo do this return $this; } - + /** * createAcionMethod() * @@ -193,17 +193,17 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con if (!file_exists($controllerPath)) { return false; } - + $controllerCodeGenFile = Zend_CodeGenerator_Php_File::fromReflectedFileName($controllerPath, true, true); $controllerCodeGenFile->getClass()->setMethod(array( 'name' => $actionName . 'Action', 'body' => $body )); - + file_put_contents($controllerPath, $controllerCodeGenFile->generate()); return true; } - + /** * hasActionMethod() * @@ -216,9 +216,9 @@ class Zend_Tool_Project_Context_Zf_ActionMethod implements Zend_Tool_Project_Con if (!file_exists($controllerPath)) { return false; } - + $controllerCodeGenFile = Zend_CodeGenerator_Php_File::fromReflectedFileName($controllerPath, true, true); return $controllerCodeGenFile->getClass()->hasMethod($actionName . 'Action'); } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/ApisDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ApisDirectory.php index 829d61e..5ba4a18 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ApisDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ApisDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ApisDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ApisDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ApisDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_ApisDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'apis'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ApisDirectory extends Zend_Tool_Project_Conte { return 'ApisDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ApplicationConfigFile.php b/libs/Zend/Tool/Project/Context/Zf/ApplicationConfigFile.php index f562e64..0d380d4 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ApplicationConfigFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/ApplicationConfigFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ApplicationConfigFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ApplicationConfigFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_ApplicationConfigFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_filesystemName = 'application.ini'; - + /** * getName() * @@ -53,7 +53,7 @@ class Zend_Tool_Project_Context_Zf_ApplicationConfigFile extends Zend_Tool_Proje { return 'ApplicationConfigFile'; } - + /** * init() * @@ -65,7 +65,7 @@ class Zend_Tool_Project_Context_Zf_ApplicationConfigFile extends Zend_Tool_Proje parent::init(); return $this; } - + /** * getPersistentAttributes() * @@ -75,7 +75,7 @@ class Zend_Tool_Project_Context_Zf_ApplicationConfigFile extends Zend_Tool_Proje { return array('type' => $this->_type); } - + /** * getContents() * @@ -104,5 +104,5 @@ phpSettings.display_errors = 1 EOS; return $contents; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ApplicationDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ApplicationDirectory.php index 33d1a71..2a9a7e8 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ApplicationDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ApplicationDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ApplicationDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ApplicationDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ApplicationDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_ApplicationDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + protected $_filesystemName = 'application'; - + public function getName() { return 'ApplicationDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/BootstrapFile.php b/libs/Zend/Tool/Project/Context/Zf/BootstrapFile.php index 19ce3bd..474c440 100644 --- a/libs/Zend/Tool/Project/Context/Zf/BootstrapFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/BootstrapFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: BootstrapFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: BootstrapFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,23 +32,23 @@ require_once 'Zend/Application.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_BootstrapFile extends Zend_Tool_Project_Context_Filesystem_File +class Zend_Tool_Project_Context_Zf_BootstrapFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_filesystemName = 'Bootstrap.php'; - + protected $_applicationInstance = null; protected $_bootstrapInstance = null; - + /** * getName() * @@ -58,30 +58,30 @@ class Zend_Tool_Project_Context_Zf_BootstrapFile extends Zend_Tool_Project_Conte { return 'BootstrapFile'; } - + public function init() { parent::init(); - + $applicationConfigFile = $this->_resource->getProfile()->search('ApplicationConfigFile'); $applicationDirectory = $this->_resource->getProfile()->search('ApplicationDirectory'); - + if (($applicationConfigFile === false) || ($applicationDirectory === false)) { throw new Exception('To use the BootstrapFile context, your project requires the use of both the "ApplicationConfigFile" and "ApplicationDirectory" contexts.'); } - + if ($applicationConfigFile->getContext()->exists()) { define('APPLICATION_PATH', $applicationDirectory->getPath()); $applicationOptions = array(); $applicationOptions['config'] = $applicationConfigFile->getPath(); - + $this->_applicationInstance = new Zend_Application( 'development', $applicationOptions ); } } - + /** * getContents() * @@ -97,7 +97,7 @@ class Zend_Tool_Project_Context_Zf_BootstrapFile extends Zend_Tool_Project_Conte )), ) )); - + return $codeGenFile->generate(); } } diff --git a/libs/Zend/Tool/Project/Context/Zf/CacheDirectory.php b/libs/Zend/Tool/Project/Context/Zf/CacheDirectory.php index 46b6cb0..0d11816 100644 --- a/libs/Zend/Tool/Project/Context/Zf/CacheDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/CacheDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: CacheDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: CacheDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_CacheDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_CacheDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'cache'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_CacheDirectory extends Zend_Tool_Project_Cont { return 'CacheDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/ConfigFile.php b/libs/Zend/Tool/Project/Context/Zf/ConfigFile.php index 067d152..5344233 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ConfigFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/ConfigFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ConfigFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ConfigFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ConfigFile extends Zend_Tool_Project_Context_Filesystem_File +class Zend_Tool_Project_Context_Zf_ConfigFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_filesystemName = 'bootstrap.php'; - + /** * getName() * @@ -53,7 +53,7 @@ class Zend_Tool_Project_Context_Zf_ConfigFile extends Zend_Tool_Project_Context_ { return 'ConfigFile'; } - + /** * getContents() * @@ -63,5 +63,5 @@ class Zend_Tool_Project_Context_Zf_ConfigFile extends Zend_Tool_Project_Context_ { return ''; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ConfigsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ConfigsDirectory.php index eaf54de..c58db4a 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ConfigsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ConfigsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ConfigsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ConfigsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ConfigsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_ConfigsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'configs'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ConfigsDirectory extends Zend_Tool_Project_Co { return 'ConfigsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ControllerFile.php b/libs/Zend/Tool/Project/Context/Zf/ControllerFile.php index 17fff11..aa05c08 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ControllerFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/ControllerFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ControllerFile.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: ControllerFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -40,25 +40,25 @@ require_once 'Zend/Filter/Word/DashToCamelCase.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Context_Filesystem_File +class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_controllerName = 'index'; - + /** * @var string */ protected $_filesystemName = 'controllerName'; - + /** * init() * @@ -71,7 +71,7 @@ class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Cont parent::init(); return $this; } - + /** * getPersistentAttributes * @@ -83,7 +83,7 @@ class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Cont 'controllerName' => $this->getControllerName() ); } - + /** * getName() * @@ -93,7 +93,7 @@ class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Cont { return 'ControllerFile'; } - + /** * getControllerName() * @@ -103,7 +103,7 @@ class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Cont { return $this->_controllerName; } - + /** * getContents() * @@ -113,9 +113,9 @@ class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Cont { $filter = new Zend_Filter_Word_DashToCamelCase(); - + $className = $filter->filter($this->_controllerName) . 'Controller'; - + $codeGenFile = new Zend_CodeGenerator_Php_File(array( 'fileName' => $this->getPath(), 'classes' => array( @@ -131,10 +131,10 @@ class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Cont )) ) )); - + if ($className == 'ErrorController') { - + $codeGenFile = new Zend_CodeGenerator_Php_File(array( 'fileName' => $this->getPath(), 'classes' => array( @@ -147,7 +147,7 @@ class Zend_Tool_Project_Context_Zf_ControllerFile extends Zend_Tool_Project_Cont 'body' => <<_getParam('error_handler'); -switch (\$errors->type) { +switch (\$errors->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: @@ -156,7 +156,7 @@ switch (\$errors->type) { \$this->view->message = 'Page not found'; break; default: - // application error + // application error \$this->getResponse()->setHttpResponseCode(500); \$this->view->message = 'Application error'; break; @@ -172,12 +172,12 @@ EOS )); } - + // store the generator into the registry so that the addAction command can use the same object later Zend_CodeGenerator_Php_File::registerFileCodeGenerator($codeGenFile); // REQUIRES filename to be set return $codeGenFile->generate(); } - + /** * addAction() * @@ -189,7 +189,7 @@ EOS $class->setMethod(array('name' => $actionName . 'Action', 'body' => ' // action body here')); file_put_contents($this->getPath(), $codeGenFile->generate()); } - + /** * getCodeGenerator() * @@ -202,5 +202,5 @@ EOS $class = array_shift($codeGenFileClasses); return $class; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ControllersDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ControllersDirectory.php index b45883a..37fa90a 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ControllersDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ControllersDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ControllersDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ControllersDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; */ class Zend_Tool_Project_Context_Zf_ControllersDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'controllers'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ControllersDirectory extends Zend_Tool_Projec { return 'ControllersDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/DataDirectory.php b/libs/Zend/Tool/Project/Context/Zf/DataDirectory.php index fd3ec58..fec78a9 100644 --- a/libs/Zend/Tool/Project/Context/Zf/DataDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/DataDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DataDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: DataDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_DataDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_DataDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'data'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_DataDirectory extends Zend_Tool_Project_Conte { return 'DataDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/DbTableDirectory.php b/libs/Zend/Tool/Project/Context/Zf/DbTableDirectory.php index 0f62659..a5894de 100644 --- a/libs/Zend/Tool/Project/Context/Zf/DbTableDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/DbTableDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbTableDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: DbTableDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -43,7 +43,7 @@ class Zend_Tool_Project_Context_Zf_DbTableDirectory extends Zend_Tool_Project_Co * @var string */ protected $_filesystemName = 'DbTable'; - + /** * getName() * diff --git a/libs/Zend/Tool/Project/Context/Zf/DbTableFile.php b/libs/Zend/Tool/Project/Context/Zf/DbTableFile.php index 9a22967..53c391a 100644 --- a/libs/Zend/Tool/Project/Context/Zf/DbTableFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/DbTableFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: DbTableFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: DbTableFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,7 +38,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_DbTableFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * getName() * @@ -48,7 +48,7 @@ class Zend_Tool_Project_Context_Zf_DbTableFile extends Zend_Tool_Project_Context { return 'DbTableFile'; } - + /* protected $_dbTableName; @@ -68,5 +68,5 @@ class Zend_Tool_Project_Context_Zf_DbTableFile extends Zend_Tool_Project_Context return $this->_dbTableName; } */ - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/FormFile.php b/libs/Zend/Tool/Project/Context/Zf/FormFile.php index 6817efc..349a65b 100644 --- a/libs/Zend/Tool/Project/Context/Zf/FormFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/FormFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: FormFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,7 +38,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_FormFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * getName() * @@ -48,5 +48,5 @@ class Zend_Tool_Project_Context_Zf_FormFile extends Zend_Tool_Project_Context_Fi { return 'FormFile'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/FormsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/FormsDirectory.php index bc540f3..43b04e8 100644 --- a/libs/Zend/Tool/Project/Context/Zf/FormsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/FormsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: FormsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -43,7 +43,7 @@ class Zend_Tool_Project_Context_Zf_FormsDirectory extends Zend_Tool_Project_Cont * @var string */ protected $_filesystemName = 'forms'; - + /** * getName() * diff --git a/libs/Zend/Tool/Project/Context/Zf/HtaccessFile.php b/libs/Zend/Tool/Project/Context/Zf/HtaccessFile.php index d0756d1..f850dc9 100644 --- a/libs/Zend/Tool/Project/Context/Zf/HtaccessFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/HtaccessFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HtaccessFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HtaccessFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_HtaccessFile extends Zend_Tool_Project_Context_Filesystem_File +class Zend_Tool_Project_Context_Zf_HtaccessFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_filesystemName = '.htaccess'; - + /** * getName() * @@ -53,7 +53,7 @@ class Zend_Tool_Project_Context_Zf_HtaccessFile extends Zend_Tool_Project_Contex { return 'HtaccessFile'; } - + /** * getContents() * @@ -74,5 +74,5 @@ RewriteRule ^.*$ index.php [NC,L] EOS; return $output; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/LayoutsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/LayoutsDirectory.php index 2377944..0f3af2e 100644 --- a/libs/Zend/Tool/Project/Context/Zf/LayoutsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/LayoutsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: LayoutsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: LayoutsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_LayoutsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_LayoutsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'layouts'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_LayoutsDirectory extends Zend_Tool_Project_Co { return 'LayoutsDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/LibraryDirectory.php b/libs/Zend/Tool/Project/Context/Zf/LibraryDirectory.php index 4f5b07c..ced431e 100644 --- a/libs/Zend/Tool/Project/Context/Zf/LibraryDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/LibraryDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: LibraryDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: LibraryDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,28 +30,28 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_LibraryDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_LibraryDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'library'; - + /** * getName() - * + * * @return string */ public function getName() { return 'LibraryDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/LocalesDirectory.php b/libs/Zend/Tool/Project/Context/Zf/LocalesDirectory.php index dae70cc..4f72f56 100644 --- a/libs/Zend/Tool/Project/Context/Zf/LocalesDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/LocalesDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: LocalesDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: LocalesDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_LocalesDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_LocalesDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'locales'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_LocalesDirectory extends Zend_Tool_Project_Co { return 'LocalesDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/LogsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/LogsDirectory.php index e3747cd..1685138 100644 --- a/libs/Zend/Tool/Project/Context/Zf/LogsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/LogsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: LogsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: LogsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_LogsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_LogsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'logs'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_LogsDirectory extends Zend_Tool_Project_Conte { return 'LogsDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/ModelFile.php b/libs/Zend/Tool/Project/Context/Zf/ModelFile.php index 5200c51..bf53993 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ModelFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/ModelFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ModelFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ModelFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,7 +38,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_ModelFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * getName() * @@ -48,5 +48,5 @@ class Zend_Tool_Project_Context_Zf_ModelFile extends Zend_Tool_Project_Context_F { return 'ModelFile'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/ModelsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ModelsDirectory.php index 935a74e..2655426 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ModelsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ModelsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ModelsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ModelsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ModelsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_ModelsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'models'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ModelsDirectory extends Zend_Tool_Project_Con { return 'ModelsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ModuleDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ModuleDirectory.php index 84728a4..3aa3590 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ModuleDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ModuleDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ModuleDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ModuleDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,25 +30,25 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ModuleDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_ModuleDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_moduleName = null; - + /** * @var string */ protected $_filesystemName = 'moduleDirectory'; - + /** * init() * @@ -60,7 +60,7 @@ class Zend_Tool_Project_Context_Zf_ModuleDirectory extends Zend_Tool_Project_Con parent::init(); return $this; } - + /** * getName() * @@ -70,7 +70,7 @@ class Zend_Tool_Project_Context_Zf_ModuleDirectory extends Zend_Tool_Project_Con { return 'ModuleDirectory'; } - + /** * getPersistentAttributes * @@ -82,7 +82,7 @@ class Zend_Tool_Project_Context_Zf_ModuleDirectory extends Zend_Tool_Project_Con 'moduleName' => $this->getModuleName() ); } - + /** * getModuleName() * @@ -92,6 +92,6 @@ class Zend_Tool_Project_Context_Zf_ModuleDirectory extends Zend_Tool_Project_Con { return $this->_moduleName; } - - + + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ModulesDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ModulesDirectory.php index 60fcfee..eac069d 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ModulesDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ModulesDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ModulesDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ModulesDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ModulesDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_ModulesDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'modules'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ModulesDirectory extends Zend_Tool_Project_Co { return 'ModulesDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ProjectProviderFile.php b/libs/Zend/Tool/Project/Context/Zf/ProjectProviderFile.php index ab07d81..f7ef0b0 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ProjectProviderFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/ProjectProviderFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ProjectProviderFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ProjectProviderFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,25 +35,25 @@ require_once 'Zend/CodeGenerator/Php/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project_Context_Filesystem_File +class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_projectProviderName = null; - + /** * @var array */ protected $_actionNames = array(); - + /** * init() * @@ -61,11 +61,11 @@ class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project */ public function init() { - + $this->_projectProviderName = $this->_resource->getAttribute('projectProviderName'); $this->_actionNames = $this->_resource->getAttribute('actionNames'); $this->_filesystemName = ucfirst($this->_projectProviderName) . 'Provider.php'; - + if (strpos($this->_actionNames, ',')) { $this->_actionNames = explode(',', $this->_actionNames); } else { @@ -75,7 +75,7 @@ class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project parent::init(); return $this; } - + /** * getPersistentAttributes() * @@ -88,7 +88,7 @@ class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project 'actionNames' => implode(',', $this->_actionNames) ); } - + /** * getName() * @@ -98,7 +98,7 @@ class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project { return 'ProjectProviderFile'; } - + /** * getProjectProviderName() * @@ -118,14 +118,14 @@ class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project { $filter = new Zend_Filter_Word_DashToCamelCase(); - + $className = $filter->filter($this->_projectProviderName) . 'Provider'; - + $class = new Zend_CodeGenerator_Php_Class(array( 'name' => $className, 'extendedClass' => 'Zend_Tool_Project_Provider_Abstract' )); - + $methods = array(); foreach ($this->_actionNames as $actionName) { $methods[] = new Zend_CodeGenerator_Php_Method(array( @@ -133,11 +133,11 @@ class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project 'body' => ' /** @todo Implementation */' )); } - + if ($methods) { $class->setMethods($methods); } - + $codeGenFile = new Zend_CodeGenerator_Php_File(array( 'requiredFiles' => array( 'Zend/Tool/Project/Provider/Abstract.php', @@ -145,8 +145,8 @@ class Zend_Tool_Project_Context_Zf_ProjectProviderFile extends Zend_Tool_Project ), 'classes' => array($class) )); - + return $codeGenFile->generate(); } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/PublicDirectory.php b/libs/Zend/Tool/Project/Context/Zf/PublicDirectory.php index 596233f..879397a 100644 --- a/libs/Zend/Tool/Project/Context/Zf/PublicDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/PublicDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PublicDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: PublicDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; */ class Zend_Tool_Project_Context_Zf_PublicDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'public'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_PublicDirectory extends Zend_Tool_Project_Con { return 'PublicDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/PublicImagesDirectory.php b/libs/Zend/Tool/Project/Context/Zf/PublicImagesDirectory.php index f62e680..f915641 100644 --- a/libs/Zend/Tool/Project/Context/Zf/PublicImagesDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/PublicImagesDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PublicImagesDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: PublicImagesDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_PublicImagesDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_PublicImagesDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'images'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_PublicImagesDirectory extends Zend_Tool_Proje { return 'PublicImagesDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/PublicIndexFile.php b/libs/Zend/Tool/Project/Context/Zf/PublicIndexFile.php index 035c296..943e2e2 100644 --- a/libs/Zend/Tool/Project/Context/Zf/PublicIndexFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/PublicIndexFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PublicIndexFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: PublicIndexFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_PublicIndexFile extends Zend_Tool_Project_Context_Filesystem_File +class Zend_Tool_Project_Context_Zf_PublicIndexFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_filesystemName = 'index.php'; - + /** * getName() * @@ -53,7 +53,7 @@ class Zend_Tool_Project_Context_Zf_PublicIndexFile extends Zend_Tool_Project_Con { return 'PublicIndexFile'; } - + /** * getContents() * @@ -78,11 +78,11 @@ set_include_path(implode(PATH_SEPARATOR, array( ))); /** Zend_Application */ -require_once 'Zend/Application.php'; +require_once 'Zend/Application.php'; // Create application, bootstrap, and run \$application = new Zend_Application( - APPLICATION_ENV, + APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); \$application->bootstrap() @@ -91,5 +91,5 @@ EOS )); return $codeGenerator->generate(); } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php index 3e71909..fbd3fac 100644 --- a/libs/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PublicScriptsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: PublicScriptsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_PublicScriptsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_PublicScriptsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'js'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_PublicScriptsDirectory extends Zend_Tool_Proj { return 'PublicScriptsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/PublicStylesheetsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/PublicStylesheetsDirectory.php index 87bc934..7fb6ea2 100644 --- a/libs/Zend/Tool/Project/Context/Zf/PublicStylesheetsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/PublicStylesheetsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PublicStylesheetsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: PublicStylesheetsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_PublicStylesheetsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_PublicStylesheetsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'styles'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_PublicStylesheetsDirectory extends Zend_Tool_ { return 'PublicStylesheetsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/SearchIndexesDirectory.php b/libs/Zend/Tool/Project/Context/Zf/SearchIndexesDirectory.php index ce3c3d3..c9422ce 100644 --- a/libs/Zend/Tool/Project/Context/Zf/SearchIndexesDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/SearchIndexesDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SearchIndexesDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SearchIndexesDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_SearchIndexesDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_SearchIndexesDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'search-indexes'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_SearchIndexesDirectory extends Zend_Tool_Proj { return 'SearchIndexesDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/SessionsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/SessionsDirectory.php index 6bb09fa..72dea68 100644 --- a/libs/Zend/Tool/Project/Context/Zf/SessionsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/SessionsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SessionsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SessionsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_SessionsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_SessionsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'sessions'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_SessionsDirectory extends Zend_Tool_Project_C { return 'SessionsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TemporaryDirectory.php b/libs/Zend/Tool/Project/Context/Zf/TemporaryDirectory.php index 0a2542b..12ec5d6 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TemporaryDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/TemporaryDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TemporaryDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TemporaryDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_TemporaryDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_TemporaryDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'temp'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_TemporaryDirectory extends Zend_Tool_Project_ { return 'TemporaryDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TestApplicationBootstrapFile.php b/libs/Zend/Tool/Project/Context/Zf/TestApplicationBootstrapFile.php index 52c344f..e19d86d 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestApplicationBootstrapFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestApplicationBootstrapFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestApplicationBootstrapFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestApplicationBootstrapFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_TestApplicationBootstrapFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_filesystemName = 'bootstrap.php'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_TestApplicationBootstrapFile extends Zend_Too { return 'TestApplicationBootstrapFile'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerDirectory.php b/libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerDirectory.php index 19cd3e5..da1104a 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestApplicationControllerDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestApplicationControllerDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_TestApplicationControllerDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_TestApplicationControllerDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'controllers'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_TestApplicationControllerDirectory extends Ze { return 'TestApplicationControllerDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerFile.php b/libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerFile.php index 398ffff..dd119e3 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestApplicationControllerFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestApplicationControllerFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_TestApplicationControllerFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_forControllerName = ''; - + /** * getName() * @@ -53,7 +53,7 @@ class Zend_Tool_Project_Context_Zf_TestApplicationControllerFile extends Zend_To { return 'TestApplicationControllerFile'; } - + /** * init() * @@ -66,7 +66,7 @@ class Zend_Tool_Project_Context_Zf_TestApplicationControllerFile extends Zend_To parent::init(); return $this; } - + /** * getContents() * @@ -76,9 +76,9 @@ class Zend_Tool_Project_Context_Zf_TestApplicationControllerFile extends Zend_To { $filter = new Zend_Filter_Word_DashToCamelCase(); - + $className = $filter->filter($this->_forControllerName) . 'ControllerTest'; - + $codeGenFile = new Zend_CodeGenerator_Php_File(array( 'requiredFiles' => array( 'PHPUnit/Framework/TestCase.php' @@ -103,5 +103,5 @@ class Zend_Tool_Project_Context_Zf_TestApplicationControllerFile extends Zend_To return $codeGenFile->generate(); } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php b/libs/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php index 1a4b77f..528f2a4 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestApplicationDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestApplicationDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_TestApplicationDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_TestApplicationDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'application'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_TestApplicationDirectory extends Zend_Tool_Pr { return 'TestApplicationDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TestLibraryBootstrapFile.php b/libs/Zend/Tool/Project/Context/Zf/TestLibraryBootstrapFile.php index 9c2596e..0917f3a 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestLibraryBootstrapFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestLibraryBootstrapFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestLibraryBootstrapFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestLibraryBootstrapFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_TestLibraryBootstrapFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_filesystemName = 'bootstrap.php'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_TestLibraryBootstrapFile extends Zend_Tool_Pr { return 'TestLibraryBootstrapFile'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TestLibraryDirectory.php b/libs/Zend/Tool/Project/Context/Zf/TestLibraryDirectory.php index 782c1db..6d72292 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestLibraryDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestLibraryDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestLibraryDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestLibraryDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,15 +30,15 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_TestLibraryDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_TestLibraryDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_TestLibraryDirectory extends Zend_Tool_Projec { return 'TestLibraryDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TestLibraryFile.php b/libs/Zend/Tool/Project/Context/Zf/TestLibraryFile.php index 1580d01..1711ebf 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestLibraryFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestLibraryFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestLibraryFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestLibraryFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_TestLibraryFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_forClassName = ''; - + /** * getName() * @@ -53,7 +53,7 @@ class Zend_Tool_Project_Context_Zf_TestLibraryFile extends Zend_Tool_Project_Con { return 'TestLibraryFile'; } - + /** * init() * @@ -66,7 +66,7 @@ class Zend_Tool_Project_Context_Zf_TestLibraryFile extends Zend_Tool_Project_Con parent::init(); return $this; } - + /** * getContents() * @@ -76,9 +76,9 @@ class Zend_Tool_Project_Context_Zf_TestLibraryFile extends Zend_Tool_Project_Con { $filter = new Zend_Filter_Word_DashToCamelCase(); - + $className = $filter->filter($this->_forClassName) . 'Test'; - + $codeGenFile = new Zend_CodeGenerator_Php_File(array( 'requiredFiles' => array( 'PHPUnit/Framework/TestCase.php' @@ -103,5 +103,5 @@ class Zend_Tool_Project_Context_Zf_TestLibraryFile extends Zend_Tool_Project_Con return $codeGenFile->generate(); } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php b/libs/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php index 4f569c1..4b2307d 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestLibraryNamespaceDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestLibraryNamespaceDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_TestLibraryNamespaceDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_TestLibraryNamespaceDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_namespaceName = ''; - + /** * @var string */ @@ -58,7 +58,7 @@ class Zend_Tool_Project_Context_Zf_TestLibraryNamespaceDirectory extends Zend_To { return 'TestLibraryNamespaceDirectory'; } - + /** * init() * @@ -71,7 +71,7 @@ class Zend_Tool_Project_Context_Zf_TestLibraryNamespaceDirectory extends Zend_To parent::init(); return $this; } - + /** * getPersistentAttributes() * @@ -80,9 +80,9 @@ class Zend_Tool_Project_Context_Zf_TestLibraryNamespaceDirectory extends Zend_To public function getPersistentAttributes() { $attributes = array(); - $attributes['namespaceName'] = $this->_namespaceName; - + $attributes['namespaceName'] = $this->_namespaceName; + return $attributes; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php b/libs/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php index 7bf4709..e4488ac 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestPHPUnitConfigFile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestPHPUnitConfigFile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/File.php'; */ class Zend_Tool_Project_Context_Zf_TestPHPUnitConfigFile extends Zend_Tool_Project_Context_Filesystem_File { - + /** * @var string */ protected $_filesystemName = 'phpunit.xml'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_TestPHPUnitConfigFile extends Zend_Tool_Proje { return 'TestPHPUnitConfigFile'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/TestsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/TestsDirectory.php index 52a000b..854f4bd 100644 --- a/libs/Zend/Tool/Project/Context/Zf/TestsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/TestsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TestsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TestsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_TestsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_TestsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'tests'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_TestsDirectory extends Zend_Tool_Project_Cont { return 'TestsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/UploadsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/UploadsDirectory.php index a315d23..f44535b 100644 --- a/libs/Zend/Tool/Project/Context/Zf/UploadsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/UploadsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: UploadsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: UploadsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_UploadsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_UploadsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'uploads'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_UploadsDirectory extends Zend_Tool_Project_Co { return 'UploadsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ViewControllerScriptsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ViewControllerScriptsDirectory.php index 02f3c44..25205dd 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ViewControllerScriptsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ViewControllerScriptsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ViewControllerScriptsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ViewControllerScriptsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,7 +38,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; */ class Zend_Tool_Project_Context_Zf_ViewControllerScriptsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ @@ -48,7 +48,7 @@ class Zend_Tool_Project_Context_Zf_ViewControllerScriptsDirectory extends Zend_T * @var name */ protected $_forControllerName = null; - + /** * init() * @@ -61,7 +61,7 @@ class Zend_Tool_Project_Context_Zf_ViewControllerScriptsDirectory extends Zend_T parent::init(); return $this; } - + /** * getPersistentAttributes() * @@ -73,7 +73,7 @@ class Zend_Tool_Project_Context_Zf_ViewControllerScriptsDirectory extends Zend_T 'forControllerName' => $this->_forControllerName ); } - + /** * getName() * @@ -83,5 +83,5 @@ class Zend_Tool_Project_Context_Zf_ViewControllerScriptsDirectory extends Zend_T { return 'ViewControllerScriptsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php index c8e62cf..9d7d7cd 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ViewFiltersDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ViewFiltersDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; */ class Zend_Tool_Project_Context_Zf_ViewFiltersDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'filters'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ViewFiltersDirectory extends Zend_Tool_Projec { return 'ViewFiltersDirectory'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Context/Zf/ViewHelpersDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ViewHelpersDirectory.php index c9aba69..393e154 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ViewHelpersDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ViewHelpersDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ViewHelpersDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ViewHelpersDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; */ class Zend_Tool_Project_Context_Zf_ViewHelpersDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'helpers'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ViewHelpersDirectory extends Zend_Tool_Projec { return 'ViewHelpersDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php index 9c31c47..adfc346 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ViewScriptsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ViewScriptsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; */ class Zend_Tool_Project_Context_Zf_ViewScriptsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'scripts'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ViewScriptsDirectory extends Zend_Tool_Projec { return 'ViewScriptsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ViewsDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ViewsDirectory.php index 8190d5c..1763f9d 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ViewsDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ViewsDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ViewsDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ViewsDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,7 +30,7 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -38,12 +38,12 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; */ class Zend_Tool_Project_Context_Zf_ViewsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'views'; - + /** * getName() * @@ -53,5 +53,5 @@ class Zend_Tool_Project_Context_Zf_ViewsDirectory extends Zend_Tool_Project_Cont { return 'ViewsDirectory'; } - + } diff --git a/libs/Zend/Tool/Project/Context/Zf/ZfStandardLibraryDirectory.php b/libs/Zend/Tool/Project/Context/Zf/ZfStandardLibraryDirectory.php index 7241b2d..d09a2d4 100644 --- a/libs/Zend/Tool/Project/Context/Zf/ZfStandardLibraryDirectory.php +++ b/libs/Zend/Tool/Project/Context/Zf/ZfStandardLibraryDirectory.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ZfStandardLibraryDirectory.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ZfStandardLibraryDirectory.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -30,20 +30,20 @@ require_once 'Zend/Tool/Project/Context/Filesystem/Directory.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Context_Zf_ZfStandardLibraryDirectory extends Zend_Tool_Project_Context_Filesystem_Directory +class Zend_Tool_Project_Context_Zf_ZfStandardLibraryDirectory extends Zend_Tool_Project_Context_Filesystem_Directory { - + /** * @var string */ protected $_filesystemName = 'Zend'; - + /** * getName() * @@ -53,7 +53,7 @@ class Zend_Tool_Project_Context_Zf_ZfStandardLibraryDirectory extends Zend_Tool_ { return 'ZfStandardLibraryDirectory'; } - + /** * create() * @@ -69,17 +69,17 @@ class Zend_Tool_Project_Context_Zf_ZfStandardLibraryDirectory extends Zend_Tool_ if (strpos($relativePath, DIRECTORY_SEPARATOR . '.') !== false) { continue; } - + if ($file->isDir()) { mkdir($this->getBaseDirectory() . DIRECTORY_SEPARATOR . $this->getFilesystemName() . $relativePath); } else { copy($file->getPathname(), $this->getBaseDirectory() . DIRECTORY_SEPARATOR . $this->getFilesystemName() . $relativePath); } - + } } } - + /** * _getZfPath() * @@ -88,17 +88,17 @@ class Zend_Tool_Project_Context_Zf_ZfStandardLibraryDirectory extends Zend_Tool_ protected function _getZfPath() { foreach (explode(PATH_SEPARATOR, get_include_path()) as $includePath) { - + if (!file_exists($includePath) || $includePath[0] == '.') { continue; } - + if (realpath($checkedPath = rtrim($includePath, '\\/') . '/Zend/Loader.php') !== false && file_exists($checkedPath)) { return dirname($checkedPath); } } - + return false; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Exception.php b/libs/Zend/Tool/Project/Exception.php index d4e8d31..2dd2fc1 100644 --- a/libs/Zend/Tool/Project/Exception.php +++ b/libs/Zend/Tool/Project/Exception.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,5 +33,5 @@ require_once 'Zend/Exception.php'; */ class Zend_Tool_Project_Exception extends Zend_Exception { - + } diff --git a/libs/Zend/Tool/Project/Profile.php b/libs/Zend/Tool/Project/Profile.php index 9d9da41..15dc1b3 100644 --- a/libs/Zend/Tool/Project/Profile.php +++ b/libs/Zend/Tool/Project/Profile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Profile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Profile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,7 +35,7 @@ require_once 'Zend/Tool/Project/Profile/Resource/Container.php'; * * A profile is a hierarchical set of resources that keep track of * items within a specific project. - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -96,7 +96,7 @@ class Zend_Tool_Project_Profile extends Zend_Tool_Project_Profile_Resource_Conta } /** - * loadFromData() - Load a profile from data provided by the + * loadFromData() - Load a profile from data provided by the * 'profilData' attribute * */ @@ -114,8 +114,8 @@ class Zend_Tool_Project_Profile extends Zend_Tool_Project_Profile_Resource_Conta } /** - * isLoadableFromFile() - can a profile be loaded from a file - * + * isLoadableFromFile() - can a profile be loaded from a file + * * wether or not a profile can be loaded from the * file in attribute 'projectProfileFile', or from a file named * '.zfproject.xml' inside a directory in key 'projectDirectory' @@ -145,7 +145,7 @@ class Zend_Tool_Project_Profile extends Zend_Tool_Project_Profile_Resource_Conta /** * loadFromFile() - Load data from file - * + * * this attempts to load a project profile file from a variety of locations depending * on what information the user provided vie $options or attributes, specifically the * 'projectDirectory' or 'projectProfileFile' @@ -188,7 +188,7 @@ class Zend_Tool_Project_Profile extends Zend_Tool_Project_Profile_Resource_Conta * * This will store the profile in memory to a place on disk determined by the attributes * available, specifically if the key 'projectProfileFile' is available - * + * */ public function storeToFile() { @@ -209,7 +209,7 @@ class Zend_Tool_Project_Profile extends Zend_Tool_Project_Profile_Resource_Conta } /** - * storeToData() - create a string representation of the profile in memory + * storeToData() - create a string representation of the profile in memory * * @return string */ @@ -219,7 +219,7 @@ class Zend_Tool_Project_Profile extends Zend_Tool_Project_Profile_Resource_Conta $xml = $parser->serialize($this); return $xml; } - + /** * __toString() - cast this profile to string to be able to view it. * diff --git a/libs/Zend/Tool/Project/Profile/Exception.php b/libs/Zend/Tool/Project/Profile/Exception.php index 89679ab..bfc3fbd 100644 --- a/libs/Zend/Tool/Project/Profile/Exception.php +++ b/libs/Zend/Tool/Project/Profile/Exception.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,5 +33,5 @@ require_once 'Zend/Tool/Project/Exception.php'; */ class Zend_Tool_Project_Profile_Exception extends Zend_Tool_Project_Exception { - + } diff --git a/libs/Zend/Tool/Project/Profile/FileParser/Interface.php b/libs/Zend/Tool/Project/Profile/FileParser/Interface.php index 5fe1336..aa7b232 100644 --- a/libs/Zend/Tool/Project/Profile/FileParser/Interface.php +++ b/libs/Zend/Tool/Project/Profile/FileParser/Interface.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,21 +28,21 @@ */ interface Zend_Tool_Project_Profile_FileParser_Interface { - + /** * serialize() - * + * * This method should take a profile and return a string * representation of it. - * + * * @param Zend_Tool_Project_Profile $profile * @return string */ public function serialize(Zend_Tool_Project_Profile $profile); - + /** * unserialize() - * + * * This method should be able to take string data an create a * struture in the provided $profile * @@ -50,5 +50,5 @@ interface Zend_Tool_Project_Profile_FileParser_Interface * @param Zend_Tool_Project_Profile $profile */ public function unserialize($data, Zend_Tool_Project_Profile $profile); - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Profile/FileParser/Xml.php b/libs/Zend/Tool/Project/Profile/FileParser/Xml.php index ac4a085..21e0ca2 100644 --- a/libs/Zend/Tool/Project/Profile/FileParser/Xml.php +++ b/libs/Zend/Tool/Project/Profile/FileParser/Xml.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Xml.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Xml.php 18951 2009-11-12 16:26:19Z alexander $ */ require_once 'Zend/Tool/Project/Profile/FileParser/Interface.php'; @@ -33,12 +33,12 @@ require_once 'Zend/Tool/Project/Profile/Resource.php'; */ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Profile_FileParser_Interface { - + /** * @var Zend_Tool_Project_Profile */ protected $_profile = null; - + /** * @var Zend_Tool_Project_Context_Repository */ @@ -52,10 +52,10 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof { $this->_contextRepository = Zend_Tool_Project_Context_Repository::getInstance(); } - + /** * serialize() - * + * * create an xml string from the provided profile * * @param Zend_Tool_Project_Profile $profile @@ -65,27 +65,27 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof { $profile = clone $profile; - + $this->_profile = $profile; $xmlElement = new SimpleXMLElement(''); - self::_serializeRecurser($profile, $xmlElement); - + self::_serializeRecurser($profile, $xmlElement); + $doc = new DOMDocument('1.0'); $doc->formatOutput = true; $domnode = dom_import_simplexml($xmlElement); $domnode = $doc->importNode($domnode, true); $domnode = $doc->appendChild($domnode); - + return $doc->saveXML(); } - + /** - * unserialize() - * + * unserialize() + * * Create a structure in the object $profile from the structure specficied * in the xml string provided - * + * * @param string xml data * @param Zend_Tool_Project_Profile The profile to use as the top node * @return Zend_Tool_Project_Profile @@ -97,25 +97,25 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof } $this->_profile = $profile; - + $xmlDataIterator = new SimpleXMLIterator($data); if ($xmlDataIterator->getName() != 'projectProfile') { throw new Exception('Profiles must start with a projectProfile node'); } - + $this->_unserializeRecurser($xmlDataIterator); - + $this->_lazyLoadContexts(); - + return $this->_profile; - + } /** * _serializeRecurser() - * + * * This method will be used to traverse the depths of the structure * when *serializing* an xml structure into a string * @@ -128,16 +128,16 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof //if ($resources instanceof Zend_Tool_Project_Profile_Resource) { // $resources = clone $resources; //} - + foreach ($resources as $resource) { - + if ($resource->isDeleted()) { continue; } - + $resourceName = $resource->getContext()->getName(); $resourceName[0] = strtolower($resourceName[0]); - + $newNode = $xmlNode->addChild($resourceName); //$reflectionClass = new ReflectionClass($resource->getContext()); @@ -145,7 +145,7 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof if ($resource->isEnabled() == false) { $newNode->addAttribute('enabled', 'false'); } - + foreach ($resource->getPersistentAttributes() as $paramName => $paramValue) { $newNode->addAttribute($paramName, $paramValue); } @@ -153,15 +153,15 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof if ($resource->hasChildren()) { self::_serializeRecurser($resource, $newNode); } - + } } - - + + /** * _unserializeRecurser() - * + * * This method will be used to traverse the depths of the structure * as needed to *unserialize* the profile from an xmlIterator * @@ -170,9 +170,9 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof */ protected function _unserializeRecurser(SimpleXMLIterator $xmlIterator, Zend_Tool_Project_Profile_Resource $resource = null) { - + foreach ($xmlIterator as $resourceName => $resourceData) { - + $contextName = $resourceName; $subResource = new Zend_Tool_Project_Profile_Resource($contextName); $subResource->setProfile($this->_profile); @@ -184,7 +184,7 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof } $subResource->setAttributes($attributes); } - + if ($resource) { $resource->append($subResource, false); } else { @@ -194,23 +194,23 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof if ($this->_contextRepository->isOverwritableContext($contextName) == false) { $subResource->initializeContext(); } - + if ($xmlIterator->hasChildren()) { self::_unserializeRecurser($xmlIterator->getChildren(), $subResource); } } } - + /** * _lazyLoadContexts() * * This method will call initializeContext on the resources in a profile * @todo determine if this method belongs inside the profile - * + * */ protected function _lazyLoadContexts() { - + foreach ($this->_profile as $topResource) { $rii = new RecursiveIteratorIterator($topResource, RecursiveIteratorIterator::SELF_FIRST); foreach ($rii as $resource) { @@ -219,5 +219,5 @@ class Zend_Tool_Project_Profile_FileParser_Xml implements Zend_Tool_Project_Prof } } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Profile/Iterator/ContextFilter.php b/libs/Zend/Tool/Project/Profile/Iterator/ContextFilter.php index 30311a3..f1f67cd 100644 --- a/libs/Zend/Tool/Project/Profile/Iterator/ContextFilter.php +++ b/libs/Zend/Tool/Project/Profile/Iterator/ContextFilter.php @@ -17,12 +17,12 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ContextFilter.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ContextFilter.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * This class is an iterator that will iterate only over enabled resources - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -30,32 +30,32 @@ */ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIterator { - + /** - * @var array + * @var array */ protected $_acceptTypes = array(); - + /** - * @var array + * @var array */ protected $_denyTypes = array(); - + /** - * @var array + * @var array */ protected $_acceptNames = array(); - + /** - * @var array + * @var array */ protected $_denyNames = array(); - + /** - * @var array + * @var array */ protected $_rawOptions = array(); - + /** * __construct() * @@ -70,7 +70,7 @@ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIt $this->setOptions($options); } } - + /** * setOptions() * @@ -87,7 +87,7 @@ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIt } } } - + /** * setAcceptTypes() * @@ -99,11 +99,11 @@ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIt if (!is_array($acceptTypes)) { $acceptTypes = array($acceptTypes); } - + $this->_acceptTypes = $acceptTypes; return $this; } - + /** * setDenyTypes() * @@ -115,11 +115,11 @@ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIt if (!is_array($denyTypes)) { $denyTypes = array($denyTypes); } - + $this->_denyTypes = $denyTypes; return $this; } - + /** * setAcceptNames() * @@ -131,11 +131,11 @@ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIt if (!is_array($acceptNames)) { $acceptNames = array($acceptNames); } - + $this->_acceptNames = $acceptNames; return $this; } - + /** * setDenyNames() * @@ -147,11 +147,11 @@ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIt if (!is_array($denyNames)) { $denyNames = array($denyNames); } - + $this->_denyNames = $denyNames; return $this; } - + /** * accept() is required by teh RecursiveFilterIterator * @@ -160,33 +160,33 @@ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIt public function accept() { $currentItem = $this->current(); - + if (in_array($currentItem->getName(), $this->_acceptNames)) { return true; } elseif (in_array($currentItem->getName(), $this->_denyNames)) { return false; } - + foreach ($this->_acceptTypes as $acceptType) { if ($currentItem->getContent() instanceof $acceptType) { return true; } } - + foreach ($this->_denyTypes as $denyType) { if ($currentItem->getContext() instanceof $denyType) { return false; } } - + return true; } - + /** * getChildren() - * + * * This is here due to a bug/design issue in PHP - * @link + * @link * * @return unknown */ @@ -199,5 +199,5 @@ class Zend_Tool_Project_Profile_Iterator_ContextFilter extends RecursiveFilterIt return $this->ref->newInstance($this->getInnerIterator()->getChildren(), $this->_rawOptions); } - + } diff --git a/libs/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php b/libs/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php index aa24803..79df49a 100644 --- a/libs/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php +++ b/libs/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php @@ -17,12 +17,12 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: EnabledResourceFilter.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: EnabledResourceFilter.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * This class is an iterator that will iterate only over enabled resources - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -30,7 +30,7 @@ */ class Zend_Tool_Project_Profile_Iterator_EnabledResourceFilter extends RecursiveFilterIterator { - + /** * accept() is required by teh RecursiveFilterIterator * diff --git a/libs/Zend/Tool/Project/Profile/Resource.php b/libs/Zend/Tool/Project/Profile/Resource.php index cd6f8da..f55f18d 100644 --- a/libs/Zend/Tool/Project/Profile/Resource.php +++ b/libs/Zend/Tool/Project/Profile/Resource.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Resource.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Resource.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -32,7 +32,7 @@ require_once 'Zend/Tool/Project/Context/Repository.php'; /** * This class is an iterator that will iterate only over enabled resources - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -40,12 +40,12 @@ require_once 'Zend/Tool/Project/Context/Repository.php'; */ class Zend_Tool_Project_Profile_Resource extends Zend_Tool_Project_Profile_Resource_Container { - + /** * @var Zend_Tool_Project_Profile */ protected $_profile = null; - + /** * @var Zend_Tool_Project_Profile_Resource */ @@ -107,7 +107,7 @@ class Zend_Tool_Project_Profile_Resource extends Zend_Tool_Project_Profile_Resou /** * getName() - Get the resource name - * + * * Name is derived from the context name * * @return string @@ -164,7 +164,7 @@ class Zend_Tool_Project_Profile_Resource extends Zend_Tool_Project_Profile_Resou * * @param bool $enabled * @return Zend_Tool_Project_Profile_Resource - */ + */ public function setEnabled($enabled = true) { // convert fuzzy types to bool @@ -203,7 +203,7 @@ class Zend_Tool_Project_Profile_Resource extends Zend_Tool_Project_Profile_Resou { return $this->_deleted; } - + /** * initializeContext() * @@ -217,15 +217,15 @@ class Zend_Tool_Project_Profile_Resource extends Zend_Tool_Project_Profile_Resou if (is_string($this->_context)) { $this->_context = Zend_Tool_Project_Context_Repository::getInstance()->getContext($this->_context); } - + if (method_exists($this->_context, 'setResource')) { $this->_context->setResource($this); } - + if (method_exists($this->_context, 'init')) { $this->_context->init(); } - + $this->_isContextInitialized = true; return $this; } diff --git a/libs/Zend/Tool/Project/Profile/Resource/Container.php b/libs/Zend/Tool/Project/Profile/Resource/Container.php index db5b2e9..305c24d 100644 --- a/libs/Zend/Tool/Project/Profile/Resource/Container.php +++ b/libs/Zend/Tool/Project/Profile/Resource/Container.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Container.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Container.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,7 +27,7 @@ require_once 'Zend/Tool/Project/Profile/Resource/SearchConstraints.php'; /** * This class is an iterator that will iterate only over enabled resources - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -35,12 +35,12 @@ require_once 'Zend/Tool/Project/Profile/Resource/SearchConstraints.php'; */ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, Countable { - + /** * @var array */ protected $_subResources = array(); - + /** * @var int */ @@ -54,9 +54,9 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, /** * Finder method to be able to find resources by context name * and attributes. Example usage: - * + * * - * + * * * * @param Zend_Tool_Project_Profile_Resource_SearchConstraints|string|array $searchParameters @@ -67,42 +67,42 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, if (!$matchSearchConstraints instanceof Zend_Tool_Project_Profile_Resource_SearchConstraints) { $matchSearchConstraints = new Zend_Tool_Project_Profile_Resource_SearchConstraints($matchSearchConstraints); } - + $this->rewind(); - + /** * @todo This should be re-written with better support for a filter iterator, its the way to go */ - + if ($nonMatchSearchConstraints) { $filterIterator = new Zend_Tool_Project_Profile_Iterator_ContextFilter($this, array('denyNames' => $nonMatchSearchConstraints)); $riIterator = new RecursiveIteratorIterator($filterIterator, RecursiveIteratorIterator::SELF_FIRST); } else { $riIterator = new RecursiveIteratorIterator($this, RecursiveIteratorIterator::SELF_FIRST); } - + $foundResource = false; $currentConstraint = $matchSearchConstraints->getConstraint(); $foundDepth = 0; - + foreach ($riIterator as $currentResource) { - + // if current depth is less than found depth, end if ($riIterator->getDepth() < $foundDepth) { break; } - + if (strtolower($currentResource->getName()) == strtolower($currentConstraint->name)) { $paramsMatch = true; - + // @todo check to ensure params match (perhaps) if (count($currentConstraint->params) > 0) { $currentResourceAttributes = $currentResource->getAttributes(); if (!is_array($currentConstraint->params)) { require_once 'Zend/Tool/Project/Profile/Exception.php'; - throw new Zend_Tool_Project_Profile_Exception('Search parameter specifics must be in the form of an array for key "' - . $currentConstraint->name .'"'); + throw new Zend_Tool_Project_Profile_Exception('Search parameter specifics must be in the form of an array for key "' + . $currentConstraint->name .'"'); } foreach ($currentConstraint->params as $paramName => $paramValue) { if (!isset($currentResourceAttributes[$paramName]) || $currentResourceAttributes[$paramName] != $paramValue) { @@ -111,10 +111,10 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, } } } - + if ($paramsMatch) { $foundDepth = $riIterator->getDepth(); - + if (($currentConstraint = $matchSearchConstraints->getConstraint()) == null) { $foundResource = $currentResource; break; @@ -122,12 +122,12 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, } } - + } - + return $foundResource; } - + /** * createResourceAt() * @@ -146,13 +146,13 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, } else { $parentResource = $appendResourceOrSearchConstraints; } - + return $parentResource->createResource($context, $attributes); } - + /** * createResource() - * + * * Method to create a resource with a given context with specific attributes * * @param string $context @@ -167,25 +167,25 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, $context = $contextRegistry->getContext($context); } else { require_once 'Zend/Tool/Project/Profile/Exception.php'; - throw new Zend_Tool_Project_Profile_Exception('Context by name ' . $context . ' was not found in the context registry.'); + throw new Zend_Tool_Project_Profile_Exception('Context by name ' . $context . ' was not found in the context registry.'); } } elseif (!$context instanceof Zend_Tool_Project_Context_Interface) { require_once 'Zend/Tool/Project/Profile/Exception.php'; - throw new Zend_Tool_Project_Profile_Exception('Context must be of type string or Zend_Tool_Project_Context_Interface.'); + throw new Zend_Tool_Project_Profile_Exception('Context must be of type string or Zend_Tool_Project_Context_Interface.'); } - + $newResource = new Zend_Tool_Project_Profile_Resource($context); - + if ($attributes) { $newResource->setAttributes($attributes); } - + /** * Interesting logic here: - * + * * First set the parentResource (this will also be done inside append). This will allow * the initialization routine to change the appendability of the parent resource. This - * is important to allow specific resources to be appendable by very specific sub-resources. + * is important to allow specific resources to be appendable by very specific sub-resources. */ $newResource->setParentResource($this); $newResource->initializeContext(); @@ -193,10 +193,10 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, return $newResource; } - + /** * setAttributes() - * + * * persist the attributes if the resource will accept them * * @param array $attributes @@ -224,7 +224,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return $this->_attributes; } - + /** * setAttribute() * @@ -237,7 +237,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, $this->_attributes[$name] = $value; return $this; } - + /** * getAttribute() * @@ -260,7 +260,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, $this->_appendable = (bool) $appendable; return $this; } - + /** * isAppendable() * @@ -270,7 +270,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return $this->_appendable; } - + /** * setParentResource() * @@ -282,7 +282,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, $this->_parentResource = $parentResource; return $this; } - + /** * getParentResource() * @@ -292,7 +292,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return $this->_parentResource; } - + /** * append() * @@ -306,10 +306,10 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, } array_push($this->_subResources, $resource); $resource->setParentResource($this); - + return $this; } - + /** * current() - required by RecursiveIterator * @@ -319,7 +319,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return current($this->_subResources); } - + /** * key() - required by RecursiveIterator * @@ -329,7 +329,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return key($this->_subResources); } - + /** * next() - required by RecursiveIterator * @@ -339,7 +339,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return next($this->_subResources); } - + /** * rewind() - required by RecursiveIterator * @@ -349,7 +349,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return reset($this->_subResources); } - + /** * valid() - - required by RecursiveIterator * @@ -359,7 +359,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return (bool) $this->current(); } - + /** * hasChildren() * @@ -369,7 +369,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return (count($this->_subResources > 0)) ? true : false; } - + /** * getChildren() * @@ -379,7 +379,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return $this->current(); } - + /** * count() * @@ -389,7 +389,7 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, { return count($this->_subResources); } - + /** * __clone() * @@ -401,5 +401,5 @@ class Zend_Tool_Project_Profile_Resource_Container implements RecursiveIterator, $this->_subResources[$index] = clone $resource; } } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Profile/Resource/SearchConstraints.php b/libs/Zend/Tool/Project/Profile/Resource/SearchConstraints.php index 407c732..7c98cfd 100644 --- a/libs/Zend/Tool/Project/Profile/Resource/SearchConstraints.php +++ b/libs/Zend/Tool/Project/Profile/Resource/SearchConstraints.php @@ -17,12 +17,12 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: SearchConstraints.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: SearchConstraints.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * This class is an iterator that will iterate only over enabled resources - * + * * @category Zend * @package Zend_Tool * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) @@ -30,12 +30,12 @@ */ class Zend_Tool_Project_Profile_Resource_SearchConstraints { - + /** * @var array */ protected $_constraints = array(); - + /** * __construct() * @@ -49,7 +49,7 @@ class Zend_Tool_Project_Profile_Resource_SearchConstraints $this->setOptions($options); } } - + /** * setOptions() * @@ -68,7 +68,7 @@ class Zend_Tool_Project_Profile_Resource_SearchConstraints return $this; } - + /** * addConstraint() * @@ -84,13 +84,13 @@ class Zend_Tool_Project_Profile_Resource_SearchConstraints $name = $constraint['name']; $params = $constraint['params']; } - + $constraint = $this->_makeConstraint($name, $params); - + array_push($this->_constraints, $constraint); return $this; } - + /** * getConstraint() * @@ -113,5 +113,5 @@ class Zend_Tool_Project_Profile_Resource_SearchConstraints $value = array('name' => $name, 'params' => $params); return new ArrayObject($value, ArrayObject::ARRAY_AS_PROPS); } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Provider/Abstract.php b/libs/Zend/Tool/Project/Provider/Abstract.php index f4f5bc4..281b956 100644 --- a/libs/Zend/Tool/Project/Provider/Abstract.php +++ b/libs/Zend/Tool/Project/Provider/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 17795 2009-08-24 19:04:01Z ralph $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -120,32 +120,32 @@ abstract class Zend_Tool_Project_Provider_Abstract extends Zend_Tool_Framework_P } $profile = new Zend_Tool_Project_Profile(); - + $parentDirectoriesArray = explode(DIRECTORY_SEPARATOR, ltrim($projectDirectory, DIRECTORY_SEPARATOR)); while ($parentDirectoriesArray) { $projectDirectoryAssembled = implode(DIRECTORY_SEPARATOR, $parentDirectoriesArray); - + if (DIRECTORY_SEPARATOR !== "\\") { $projectDirectoryAssembled = DIRECTORY_SEPARATOR . $projectDirectoryAssembled; } - + $profile->setAttribute('projectDirectory', $projectDirectoryAssembled); if ($profile->isLoadableFromFile()) { chdir($projectDirectoryAssembled); - + $profile->loadFromFile(); $this->_loadedProfile = $profile; break; } - + // break after first run if we are not to check upper directories if ($searchParentDirectories == false) { break; } - + array_pop($parentDirectoriesArray); } - + if ($this->_loadedProfile == null) { if ($loadProfileFlag == self::NO_PROFILE_THROW_EXCEPTION) { throw new Zend_Tool_Project_Provider_Exception('A project profile was not found.'); @@ -207,11 +207,11 @@ abstract class Zend_Tool_Project_Provider_Abstract extends Zend_Tool_Framework_P protected function _getContentForContext(Zend_Tool_Project_Context_Interface $context, $methodName, $parameters) { - $storage = $this->_registry->getStorage(); + $storage = $this->_registry->getStorage(); if (!$storage->isEnabled()) { return false; } - + if (!class_exists('Zend_Tool_Project_Context_Content_Engine')) { require_once 'Zend/Tool/Project/Context/Content/Engine.php'; } @@ -219,7 +219,7 @@ abstract class Zend_Tool_Project_Provider_Abstract extends Zend_Tool_Framework_P $engine = new Zend_Tool_Project_Context_Content_Engine($storage); return $engine->getContent($context, $methodName, $parameters); } - + /** * _loadContextClassesIntoRegistry() - This is called by the constructor * so that child providers can provide a list of contexts to load into the diff --git a/libs/Zend/Tool/Project/Provider/Exception.php b/libs/Zend/Tool/Project/Provider/Exception.php index 573a9c5..c19904e 100644 --- a/libs/Zend/Tool/Project/Provider/Exception.php +++ b/libs/Zend/Tool/Project/Provider/Exception.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exception.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exception.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,5 +33,5 @@ require_once 'Zend/Tool/Project/Exception.php'; */ class Zend_Tool_Project_Provider_Exception extends Zend_Tool_Project_Exception { - + } diff --git a/libs/Zend/Tool/Project/Provider/Form.php b/libs/Zend/Tool/Project/Provider/Form.php index aa8bb3c..e77159b 100644 --- a/libs/Zend/Tool/Project/Provider/Form.php +++ b/libs/Zend/Tool/Project/Provider/Form.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Form.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Form.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,11 +28,11 @@ */ class Zend_Tool_Project_Provider_Form extends Zend_Tool_Project_Provider_Abstract { - + public function create($name) { echo '@todo - create form'; } - + } \ No newline at end of file diff --git a/libs/Zend/Tool/Project/Provider/Manifest.php b/libs/Zend/Tool/Project/Provider/Manifest.php index 38745a8..38976eb 100644 --- a/libs/Zend/Tool/Project/Provider/Manifest.php +++ b/libs/Zend/Tool/Project/Provider/Manifest.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Manifest.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Manifest.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -66,10 +66,10 @@ require_once 'Zend/Tool/Project/Provider/ProjectProvider.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Provider_Manifest implements +class Zend_Tool_Project_Provider_Manifest implements Zend_Tool_Framework_Manifest_ProviderManifestable { - + /** * getProviders() * diff --git a/libs/Zend/Tool/Project/Provider/Model.php b/libs/Zend/Tool/Project/Provider/Model.php index 835cbec..52c613d 100644 --- a/libs/Zend/Tool/Project/Provider/Model.php +++ b/libs/Zend/Tool/Project/Provider/Model.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Model.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Model.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -28,7 +28,7 @@ */ class Zend_Tool_Project_Provider_Model extends Zend_Tool_Project_Provider_Abstract { - + /** * create() * @@ -38,6 +38,6 @@ class Zend_Tool_Project_Provider_Model extends Zend_Tool_Project_Provider_Abstra { echo '@todo - create model'; } - + } diff --git a/libs/Zend/Tool/Project/Provider/Module.php b/libs/Zend/Tool/Project/Provider/Module.php index 73d08a6..e99179e 100644 --- a/libs/Zend/Tool/Project/Provider/Module.php +++ b/libs/Zend/Tool/Project/Provider/Module.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Module.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Module.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -46,7 +46,7 @@ require_once 'Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_Tool_Project_Provider_Module +class Zend_Tool_Project_Provider_Module extends Zend_Tool_Project_Provider_Abstract implements Zend_Tool_Framework_Provider_Pretendable { @@ -58,45 +58,45 @@ class Zend_Tool_Project_Provider_Module if ($targetModuleResource == null) { $targetModuleResource = $profile->search('applicationDirectory'); $targetModuleEnabledResources = array( - 'ControllersDirectory', 'ModelsDirectory', 'ViewsDirectory', + 'ControllersDirectory', 'ModelsDirectory', 'ViewsDirectory', 'ViewScriptsDirectory', 'ViewHelpersDirectory', 'ViewFiltersDirectory' ); } - + // find the actual modules directory we will use to house our module $modulesDirectory = $profile->search('modulesDirectory'); - + // if there is a module directory already, except if ($modulesDirectory->search(array('moduleDirectory' => array('moduleName' => $moduleName)))) { throw new Zend_Tool_Project_Provider_Exception('A module named "' . $moduleName . '" already exists.'); } - + // create the module directory $moduleDirectory = $modulesDirectory->createResource('moduleDirectory', array('moduleName' => $moduleName)); - + // create a context filter so that we can pull out only what we need from the module skeleton $moduleContextFilterIterator = new Zend_Tool_Project_Profile_Iterator_ContextFilter( - $targetModuleResource, + $targetModuleResource, array( 'denyNames' => array('ModulesDirectory', 'ViewControllerScriptsDirectory'), 'denyType' => 'Zend_Tool_Project_Context_Filesystem_File' ) ); - + // the iterator for the module skeleton $targetIterator = new RecursiveIteratorIterator($moduleContextFilterIterator, RecursiveIteratorIterator::SELF_FIRST); - + // initialize some loop state information $currentDepth = 0; $parentResources = array(); $currentResource = $moduleDirectory; - + // loop through the target module skeleton foreach ($targetIterator as $targetSubResource) { - + $depthDifference = $targetIterator->getDepth() - $currentDepth; $currentDepth = $targetIterator->getDepth(); - + if ($depthDifference === 1) { // if we went down into a child, make note array_push($parentResources, $currentResource); @@ -114,7 +114,7 @@ class Zend_Tool_Project_Provider_Module // get parameters for the newly created module resource $params = $targetSubResource->getAttributes(); $currentChildResource = $currentResource->createResource($targetSubResource->getName(), $params); - + // based of the provided list (Currently up top), enable specific resources if (isset($targetModuleEnabledResources)) { $currentChildResource->setEnabled(in_array($targetSubResource->getName(), $targetModuleEnabledResources)); @@ -123,10 +123,10 @@ class Zend_Tool_Project_Provider_Module } } - + return $moduleDirectory; } - + /** * create() * @@ -135,11 +135,11 @@ class Zend_Tool_Project_Provider_Module public function create($name) //, $moduleProfile = null) { $this->_loadProfile(self::NO_PROFILE_THROW_EXCEPTION); - + $resources = self::createResources($this->_loadedProfile, $name); - + $response = $this->_registry->getResponse(); - + if ($this->_registry->getRequest()->isPretend()) { $response->appendContent('I would create the following module and artifacts:'); foreach (new RecursiveIteratorIterator($resources, RecursiveIteratorIterator::SELF_FIRST) as $resource) { @@ -154,12 +154,12 @@ class Zend_Tool_Project_Provider_Module $response->appendContent($resource->getContext()->getPath()); $resource->create(); } - + // store changes to the profile $this->_storeProfile(); } - + } - + } diff --git a/libs/Zend/Tool/Project/Provider/Profile.php b/libs/Zend/Tool/Project/Provider/Profile.php index d14a65f..078d61f 100644 --- a/libs/Zend/Tool/Project/Provider/Profile.php +++ b/libs/Zend/Tool/Project/Provider/Profile.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Profile.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Profile.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -33,7 +33,7 @@ require_once 'Zend/Tool/Project/Provider/Abstract.php'; */ class Zend_Tool_Project_Provider_Profile extends Zend_Tool_Project_Provider_Abstract { - + /** * show() * diff --git a/libs/Zend/Tool/Project/Provider/Project.php b/libs/Zend/Tool/Project/Provider/Project.php index c22bba6..16bbd99 100644 --- a/libs/Zend/Tool/Project/Provider/Project.php +++ b/libs/Zend/Tool/Project/Provider/Project.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Project.php 16972 2009-07-22 18:44:24Z ralph $ + * @version $Id: Project.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -35,7 +35,7 @@ class Zend_Tool_Project_Provider_Project extends Zend_Tool_Project_Provider_Abst { protected $_specialties = array('Info'); - + /** * create() * @@ -65,39 +65,39 @@ class Zend_Tool_Project_Provider_Project extends Zend_Tool_Project_Provider_Abst } $profileData = null; - + if ($fileOfProfile != null && file_exists($fileOfProfile)) { $profileData = file_get_contents($fileOfProfile); } - + $storage = $this->_registry->getStorage(); if ($profileData == '' && $nameOfProfile != null && $storage->isEnabled()) { $profileData = $storage->get('project/profiles/' . $nameOfProfile . '.xml'); } - + if ($profileData == '') { $profileData = $this->_getDefaultProfile(); } - + $newProfile = new Zend_Tool_Project_Profile(array( 'projectDirectory' => $path, 'profileData' => $profileData )); $newProfile->loadFromData(); - + $this->_registry->getResponse()->appendContent('Creating project at ' . $path); foreach ($newProfile->getIterator() as $resource) { $resource->create(); } } - + public function show() { $this->_registry->getResponse()->appendContent('You probably meant to run "show project.info".', array('color' => 'yellow')); } - + public function showInfo() { $profile = $this->_loadProfile(self::NO_PROFILE_RETURN_FALSE); diff --git a/libs/Zend/Tool/Project/Provider/Test.php b/libs/Zend/Tool/Project/Provider/Test.php index 4232cf2..e63ea10 100644 --- a/libs/Zend/Tool/Project/Provider/Test.php +++ b/libs/Zend/Tool/Project/Provider/Test.php @@ -17,7 +17,7 @@ * @subpackage Framework * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Test.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Test.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,9 +38,9 @@ require_once 'Zend/Tool/Project/Provider/Exception.php'; */ class Zend_Tool_Project_Provider_Test extends Zend_Tool_Project_Provider_Abstract { - + protected $_specialties = array('Application', 'Library'); - + /** * isTestingEnabled() * @@ -51,10 +51,10 @@ class Zend_Tool_Project_Provider_Test extends Zend_Tool_Project_Provider_Abstrac { $profileSearchParams = array('testsDirectory'); $testsDirectory = $profile->search($profileSearchParams); - + return $testsDirectory->isEnabled(); } - + /** * createApplicationResource() * @@ -69,28 +69,28 @@ class Zend_Tool_Project_Provider_Test extends Zend_Tool_Project_Provider_Abstrac if (!is_string($controllerName)) { throw new Zend_Tool_Project_Provider_Exception('Zend_Tool_Project_Provider_View::createApplicationResource() expects \"controllerName\" is the name of a controller resource to create.'); } - + if (!is_string($actionName)) { throw new Zend_Tool_Project_Provider_Exception('Zend_Tool_Project_Provider_View::createApplicationResource() expects \"actionName\" is the name of a controller resource to create.'); } - + $testsDirectoryResource = $profile->search('testsDirectory'); - + if (($testAppDirectoryResource = $testsDirectoryResource->search('testApplicationDirectory')) === false) { $testAppDirectoryResource = $testsDirectoryResource->createResource('testApplicationDirectory'); } - + if ($moduleName) { //@todo $moduleName $moduleName = ''; } - + if (($testAppControllerDirectoryResource = $testAppDirectoryResource->search('testApplicationControllerDirectory')) === false) { $testAppControllerDirectoryResource = $testAppDirectoryResource->createResource('testApplicationControllerDirectory'); } - + $testAppControllerFileResource = $testAppControllerDirectoryResource->createResource('testApplicationControllerFile', array('forControllerName' => $controllerName)); - + return $testAppControllerFileResource; } @@ -104,46 +104,46 @@ class Zend_Tool_Project_Provider_Test extends Zend_Tool_Project_Provider_Abstrac public static function createLibraryResource(Zend_Tool_Project_Profile $profile, $libraryClassName) { $testLibraryDirectoryResource = $profile->search(array('TestsDirectory', 'TestLibraryDirectory')); - - + + $fsParts = explode('_', $libraryClassName); - + $currentDirectoryResource = $testLibraryDirectoryResource; - + while ($nameOrNamespacePart = array_shift($fsParts)) { if (count($fsParts) > 0) { - + if (($libraryDirectoryResource = $currentDirectoryResource->search(array('TestLibraryNamespaceDirectory' => array('namespaceName' => $nameOrNamespacePart)))) === false) { $currentDirectoryResource = $currentDirectoryResource->createResource('TestLibraryNamespaceDirectory', array('namespaceName' => $nameOrNamespacePart)); } else { $currentDirectoryResource = $libraryDirectoryResource; } - + } else { - + if (($libraryFileResource = $currentDirectoryResource->search(array('TestLibraryFile' => array('forClassName' => $libraryClassName)))) === false) { $libraryFileResource = $currentDirectoryResource->createResource('TestLibraryFile', array('forClassName' => $libraryClassName)); } - + } - + } - + return $libraryFileResource; } - + public function enable() { - + } - + public function disable() { - + } - + /** * create() * @@ -152,15 +152,15 @@ class Zend_Tool_Project_Provider_Test extends Zend_Tool_Project_Provider_Abstrac public function create($libraryClassName) { $profile = $this->_loadProfile(); - + if (!self::isTestingEnabled($profile)) { $this->_registry->getResponse()->appendContent('Testing is not enabled for this project.'); } - + $testLibraryResource = self::createLibraryResource($profile, $libraryClassName); - + $response = $this->_registry->getResponse(); - + if ($this->_registry->getRequest()->isPretend()) { $response->appendContent('Would create a library stub in location ' . $testLibraryResource->getContext()->getPath()); } else { @@ -168,7 +168,7 @@ class Zend_Tool_Project_Provider_Test extends Zend_Tool_Project_Provider_Abstrac $testLibraryResource->create(); $this->_storeProfile(); } - + } - + } diff --git a/libs/Zend/Uri.php b/libs/Zend/Uri.php index abbe5a2..fedf434 100644 --- a/libs/Zend/Uri.php +++ b/libs/Zend/Uri.php @@ -16,7 +16,7 @@ * @package Zend_Uri * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Uri.php 16207 2009-06-21 19:17:51Z thomas $ + * @version $Id: Uri.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -44,7 +44,7 @@ abstract class Zend_Uri static protected $_config = array( 'allow_unwise' => false ); - + /** * Return a string representation of this URI. * @@ -157,7 +157,7 @@ abstract class Zend_Uri self::$_config[$k] = $v; } } - + /** * Zend_Uri and its subclasses cannot be instantiated directly. * Use Zend_Uri::factory() to return a new Zend_Uri object. diff --git a/libs/Zend/Validate/Abstract.php b/libs/Zend/Validate/Abstract.php index 0d0abbd..3107360 100644 --- a/libs/Zend/Validate/Abstract.php +++ b/libs/Zend/Validate/Abstract.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16223 2009-06-21 20:04:53Z thomas $ + * @version $Id: Abstract.php 18688 2009-10-25 16:08:24Z thomas $ */ /** @@ -142,12 +142,17 @@ abstract class Zend_Validate_Abstract implements Zend_Validate_Interface { if ($messageKey === null) { $keys = array_keys($this->_messageTemplates); - $messageKey = current($keys); + foreach($keys as $key) { + $this->setMessage($messageString, $key); + } + return $this; } + if (!isset($this->_messageTemplates[$messageKey])) { require_once 'Zend/Validate/Exception.php'; throw new Zend_Validate_Exception("No message template exists for key '$messageKey'"); } + $this->_messageTemplates[$messageKey] = $messageString; return $this; } diff --git a/libs/Zend/Validate/Db/Abstract.php b/libs/Zend/Validate/Db/Abstract.php index e5103ff..de5a863 100644 --- a/libs/Zend/Validate/Db/Abstract.php +++ b/libs/Zend/Validate/Db/Abstract.php @@ -1,5 +1,5 @@ - 'No record matching %value% was found', - self::ERROR_RECORD_FOUND => 'A record matching %value% was found'); + */ + protected $_messageTemplates = array(self::ERROR_NO_RECORD_FOUND => 'No record matching %value% was found', + self::ERROR_RECORD_FOUND => 'A record matching %value% was found'); /** * @var string - */ + */ protected $_schema = null; - + /** * @var string - */ - protected $_table = ''; - + */ + protected $_table = ''; + /** * @var string - */ - protected $_field = ''; - + */ + protected $_field = ''; + /** * @var mixed - */ - protected $_exclude = null; - + */ + protected $_exclude = null; + /** * Database adapter to use. If null isValid() will use Zend_Db::getInstance instead * * @var unknown_type - */ - protected $_adapter = null; - + */ + protected $_adapter = null; + /** - * Provides basic configuration for use with Zend_Validate_Db Validators + * Provides basic configuration for use with Zend_Validate_Db Validators * Setting $exclude allows a single record to be excluded from matching. * Exclude can either be a String containing a where clause, or an array with `field` and `value` keys - * to define the where clause added to the sql. - * A database adapter may optionally be supplied to avoid using the registered default adapter. - * + * to define the where clause added to the sql. + * A database adapter may optionally be supplied to avoid using the registered default adapter. + * * @param string||array $table The database table to validate against, or array with table and schema keys * @param string $field The field to check for a match * @param string||array $exclude An optional where clause or field/value pair to exclude from the query * @param Zend_Db_Adapter_Abstract $adapter An optional database adapter to use. - */ - public function __construct($table, $field, $exclude = null, Zend_Db_Adapter_Abstract $adapter = null) - { - if ($adapter !== null) { - $this->_adapter = $adapter; - } - $this->_exclude = $exclude; - $this->_field = (string) $field; - + */ + public function __construct($table, $field, $exclude = null, Zend_Db_Adapter_Abstract $adapter = null) + { + if ($adapter !== null) { + $this->_adapter = $adapter; + } + $this->_exclude = $exclude; + $this->_field = (string) $field; + if (is_array($table)) { $this->_table = (isset($table['table'])) ? $table['table'] : ''; - $this->_schema = (isset($table['schema'])) ? $table['schema'] : null; + $this->_schema = (isset($table['schema'])) ? $table['schema'] : null; } else { - $this->_table = (string) $table; + $this->_table = (string) $table; } - } - + } + /** * Run query and returns matches, or null if no matches are found. * * @param String $value * @return Array when matches are found. - */ - protected function _query($value) - { + */ + protected function _query($value) + { /** * Check for an adapter being defined. if not, fetch the default adapter. - */ + */ if ($this->_adapter === null) { $this->_adapter = Zend_Db_Table_Abstract::getDefaultAdapter(); if (null === $this->_adapter) { @@ -125,24 +125,24 @@ abstract class Zend_Validate_Db_Abstract extends Zend_Validate_Abstract /** * Build select object - */ + */ $select = new Zend_Db_Select($this->_adapter); $select->from($this->_table, array($this->_field), $this->_schema) - ->where($this->_adapter->quoteIdentifier($this->_field).' = ?', $value); - if ($this->_exclude !== null) { - if (is_array($this->_exclude)) { - $select->where($this->_adapter->quoteIdentifier($this->_exclude['field']).' != ?', $this->_exclude['value']); - } else { - $select->where($this->_exclude); - } - } - $select->limit(1); - + ->where($this->_adapter->quoteIdentifier($this->_field).' = ?', $value); + if ($this->_exclude !== null) { + if (is_array($this->_exclude)) { + $select->where($this->_adapter->quoteIdentifier($this->_exclude['field']).' != ?', $this->_exclude['value']); + } else { + $select->where($this->_exclude); + } + } + $select->limit(1); + /** * Run query - */ - $result = $this->_adapter->fetchRow($select, array(), Zend_Db::FETCH_ASSOC); - - return $result; - } + */ + $result = $this->_adapter->fetchRow($select, array(), Zend_Db::FETCH_ASSOC); + + return $result; + } } diff --git a/libs/Zend/Validate/Db/RecordExists.php b/libs/Zend/Validate/Db/RecordExists.php index 2d753e4..22f39bc 100644 --- a/libs/Zend/Validate/Db/RecordExists.php +++ b/libs/Zend/Validate/Db/RecordExists.php @@ -1,5 +1,5 @@ _setValue($value); - - $result = $this->_query($value); - if (!$result) { - $valid = false; - $this->_error(self::ERROR_NO_RECORD_FOUND); - } - - return $valid; - } + */ +class Zend_Validate_Db_RecordExists extends Zend_Validate_Db_Abstract +{ + public function isValid($value) + { + $valid = true; + $this->_setValue($value); + + $result = $this->_query($value); + if (!$result) { + $valid = false; + $this->_error(self::ERROR_NO_RECORD_FOUND); + } + + return $valid; + } } diff --git a/libs/Zend/Validate/File/Count.php b/libs/Zend/Validate/File/Count.php index d49801b..f2dfac7 100644 --- a/libs/Zend/Validate/File/Count.php +++ b/libs/Zend/Validate/File/Count.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Count.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Count.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -100,8 +100,7 @@ class Zend_Validate_File_Count extends Zend_Validate_Abstract * 'min': Minimum filecount * 'max': Maximum filecount * - * @param integer|array $options Options for the adapter - * @param integer $max (Deprecated) Maximum value (implies $options is the minimum) + * @param integer|array|Zend_Config $options Options for the adapter * @return void */ public function __construct($options) @@ -116,7 +115,8 @@ class Zend_Validate_File_Count extends Zend_Validate_Abstract } if (1 < func_num_args()) { - trigger_error('Multiple arguments are deprecated in favor of an array of named arguments', E_USER_NOTICE); +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple arguments are deprecated in favor of an array of named arguments', E_USER_NOTICE); $options['min'] = func_get_arg(0); $options['max'] = func_get_arg(1); } diff --git a/libs/Zend/Validate/File/Crc32.php b/libs/Zend/Validate/File/Crc32.php index 2bcfe6e..fd46d81 100644 --- a/libs/Zend/Validate/File/Crc32.php +++ b/libs/Zend/Validate/File/Crc32.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Crc32.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Crc32.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -60,7 +60,7 @@ class Zend_Validate_File_Crc32 extends Zend_Validate_File_Hash /** * Sets validator options * - * @param string|array $options + * @param string|array|Zend_Config $options * @return void */ public function __construct($options) diff --git a/libs/Zend/Validate/File/ExcludeMimeType.php b/libs/Zend/Validate/File/ExcludeMimeType.php index 4c71a69..4984b79 100644 --- a/libs/Zend/Validate/File/ExcludeMimeType.php +++ b/libs/Zend/Validate/File/ExcludeMimeType.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ExcludeMimeType.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ExcludeMimeType.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -51,20 +51,38 @@ class Zend_Validate_File_ExcludeMimeType extends Zend_Validate_File_MimeType */ public function isValid($value, $file = null) { + if ($file === null) { + $file = array( + 'type' => null, + 'name' => $value + ); + } + // Is file readable ? require_once 'Zend/Loader.php'; if (!Zend_Loader::isReadable($value)) { return $this->_throw($file, self::NOT_READABLE); } - if ($file !== null) { - if (class_exists('finfo', false) && defined('MAGIC')) { - $mime = new finfo(FILEINFO_MIME); - $this->_type = $mime->file($value); - unset($mime); - } elseif (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { - $this->_type = mime_content_type($value); + $mimefile = $this->getMagicFile(); + if (class_exists('finfo', false)) { + $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME; + if (!empty($mimefile)) { + $mime = new finfo($const, $mimefile); } else { + $mime = new finfo($const); + } + + if ($mime !== false) { + $this->_type = $mime->file($value); + } + unset($mime); + } + + if (empty($this->_type)) { + if (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { + $this->_type = mime_content_type($value); + } elseif ($this->_headerCheck) { $this->_type = $file['type']; } } diff --git a/libs/Zend/Validate/File/Exists.php b/libs/Zend/Validate/File/Exists.php index f58cd23..835b4c2 100644 --- a/libs/Zend/Validate/File/Exists.php +++ b/libs/Zend/Validate/File/Exists.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Exists.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Exists.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -62,7 +62,7 @@ class Zend_Validate_File_Exists extends Zend_Validate_Abstract /** * Sets validator options * - * @param string|array $directory + * @param string|array|Zend_Config $directory * @return void */ public function __construct($directory = array()) diff --git a/libs/Zend/Validate/File/Extension.php b/libs/Zend/Validate/File/Extension.php index f200559..58ab0b2 100644 --- a/libs/Zend/Validate/File/Extension.php +++ b/libs/Zend/Validate/File/Extension.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Extension.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Extension.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -71,8 +71,7 @@ class Zend_Validate_File_Extension extends Zend_Validate_Abstract /** * Sets validator options * - * @param string|array $extension - * @param boolean $case If true validation is done case sensitive + * @param string|array|Zend_Config $options * @return void */ public function __construct($options) @@ -82,7 +81,8 @@ class Zend_Validate_File_Extension extends Zend_Validate_Abstract } if (1 < func_num_args()) { - trigger_error('Multiple arguments to constructor are deprecated in favor of options array', E_USER_NOTICE); +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple arguments to constructor are deprecated in favor of options array', E_USER_NOTICE); $case = func_get_arg(1); $this->setCase($case); } diff --git a/libs/Zend/Validate/File/FilesSize.php b/libs/Zend/Validate/File/FilesSize.php index 3dbb28f..167304b 100644 --- a/libs/Zend/Validate/File/FilesSize.php +++ b/libs/Zend/Validate/File/FilesSize.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FilesSize.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: FilesSize.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -63,9 +63,7 @@ class Zend_Validate_File_FilesSize extends Zend_Validate_File_Size * Min limits the used diskspace for all files, when used with max=null it is the maximum filesize * It also accepts an array with the keys 'min' and 'max' * - * @param integer|array $min Minimum diskspace for all files - * @param integer $max Maximum diskspace for all files (deprecated) - * @param boolean $bytestring Use bytestring or real size ? (deprecated) + * @param integer|array|Zend_Config $options Options for this validator * @return void */ public function __construct($options) @@ -73,16 +71,18 @@ class Zend_Validate_File_FilesSize extends Zend_Validate_File_Size $this->_files = array(); $this->_setSize(0); + if ($options instanceof Zend_Config) { + $options = $options->toArray(); + } elseif (is_scalar($options)) { + $options = array('max' => $options); + } elseif (!is_array($options)) { + require_once 'Zend/Validate/Exception.php'; + throw new Zend_Validate_Exception('Invalid options to validator provided'); + } + if (1 < func_num_args()) { - trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); - if ($options instanceof Zend_Config) { - $options = $options->toArray(); - } elseif (is_scalar($options)) { - $options = array('min' => $options); - } elseif (!is_array($options)) { - require_once 'Zend/Validate/Exception.php'; - throw new Zend_Validate_Exception('Invalid options to validator provided'); - } +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); $argv = func_get_args(); array_shift($argv); diff --git a/libs/Zend/Validate/File/Hash.php b/libs/Zend/Validate/File/Hash.php index c876777..d2e8c2c 100644 --- a/libs/Zend/Validate/File/Hash.php +++ b/libs/Zend/Validate/File/Hash.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Hash.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Hash.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -75,7 +75,8 @@ class Zend_Validate_File_Hash extends Zend_Validate_Abstract } if (1 < func_num_args()) { - trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); $options['algorithm'] = func_get_arg(1); } diff --git a/libs/Zend/Validate/File/ImageSize.php b/libs/Zend/Validate/File/ImageSize.php index 70d8453..c01ec97 100644 --- a/libs/Zend/Validate/File/ImageSize.php +++ b/libs/Zend/Validate/File/ImageSize.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: ImageSize.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: ImageSize.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -124,15 +124,11 @@ class Zend_Validate_File_ImageSize extends Zend_Validate_Abstract */ public function __construct($options) { - $minwidth = 0; - $minheight = 0; - $maxwidth = null; - $maxheight = null; - if ($options instanceof Zend_Config) { $options = $options->toArray(); } elseif (1 < func_num_args()) { - trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); if (!is_array($options)) { $options = array('minwidth' => $options); } diff --git a/libs/Zend/Validate/File/IsCompressed.php b/libs/Zend/Validate/File/IsCompressed.php index be1e529..3254d57 100644 --- a/libs/Zend/Validate/File/IsCompressed.php +++ b/libs/Zend/Validate/File/IsCompressed.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: IsCompressed.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: IsCompressed.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -53,12 +53,14 @@ class Zend_Validate_File_IsCompressed extends Zend_Validate_File_MimeType /** * Sets validator options * - * @param string|array $compression + * @param string|array|Zend_Config $compression * @return void */ public function __construct($mimetype = array()) { - if (empty($mimetype)) { + if ($mimetype instanceof Zend_Config) { + $mimetype = $mimetype->toArray(); + } else if (empty($mimetype)) { $mimetype = array( 'application/x-tar', 'application/x-cpio', @@ -81,53 +83,4 @@ class Zend_Validate_File_IsCompressed extends Zend_Validate_File_MimeType $this->setMimeType($mimetype); } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the file is compression with the set compression types - * - * @param string $value Real file to check for compression - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - // Is file readable ? - require_once 'Zend/Loader.php'; - if (!Zend_Loader::isReadable($value)) { - return $this->_throw($file, self::NOT_READABLE); - } - - if ($file !== null) { - if (class_exists('finfo', false) && defined('MAGIC')) { - $mime = new finfo(FILEINFO_MIME); - $this->_type = $mime->file($value); - unset($mime); - } elseif (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { - $this->_type = mime_content_type($value); - } else { - $this->_type = $file['type']; - } - } - - if (empty($this->_type)) { - return $this->_throw($file, self::NOT_DETECTED); - } - - $compressions = $this->getMimeType(true); - if (in_array($this->_type, $compressions)) { - return true; - } - - $types = explode('/', $this->_type); - $types = array_merge($types, explode('-', $this->_type)); - foreach ($compressions as $mime) { - if (in_array($mime, $types)) { - return true; - } - } - - return $this->_throw($file, self::FALSE_TYPE); - } } diff --git a/libs/Zend/Validate/File/IsImage.php b/libs/Zend/Validate/File/IsImage.php index acbe2f1..3904af1 100644 --- a/libs/Zend/Validate/File/IsImage.php +++ b/libs/Zend/Validate/File/IsImage.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: IsImage.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: IsImage.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -53,12 +53,14 @@ class Zend_Validate_File_IsImage extends Zend_Validate_File_MimeType /** * Sets validator options * - * @param string|array $mimetype + * @param string|array|Zend_Config $mimetype * @return void */ public function __construct($mimetype = array()) { - if (empty($mimetype)) { + if ($mimetype instanceof Zend_Config) { + $mimetype = $mimetype->toArray(); + } else if (empty($mimetype)) { $mimetype = array( 'image/x-quicktime', 'image/jp2', @@ -85,53 +87,4 @@ class Zend_Validate_File_IsImage extends Zend_Validate_File_MimeType $this->setMimeType($mimetype); } - - /** - * Defined by Zend_Validate_Interface - * - * Returns true if and only if the file is compression with the set compression types - * - * @param string $value Real file to check for compression - * @param array $file File data from Zend_File_Transfer - * @return boolean - */ - public function isValid($value, $file = null) - { - // Is file readable ? - require_once 'Zend/Loader.php'; - if (!Zend_Loader::isReadable($value)) { - return $this->_throw($file, self::NOT_READABLE); - } - - if ($file !== null) { - if (class_exists('finfo', false) && defined('MAGIC')) { - $mime = new finfo(FILEINFO_MIME); - $this->_type = $mime->file($value); - unset($mime); - } elseif (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { - $this->_type = mime_content_type($value); - } else { - $this->_type = $file['type']; - } - } - - if (empty($this->_type)) { - return $this->_throw($file, self::NOT_DETECTED); - } - - $compressions = $this->getMimeType(true); - if (in_array($this->_type, $compressions)) { - return true; - } - - $types = explode('/', $this->_type); - $types = array_merge($types, explode('-', $this->_type)); - foreach($compressions as $mime) { - if (in_array($mime, $types)) { - return true; - } - } - - return $this->_throw($file, self::FALSE_TYPE); - } } diff --git a/libs/Zend/Validate/File/MimeType.php b/libs/Zend/Validate/File/MimeType.php index 5086de0..2bf372c 100644 --- a/libs/Zend/Validate/File/MimeType.php +++ b/libs/Zend/Validate/File/MimeType.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: MimeType.php 17203 2009-07-27 19:37:18Z thomas $ + * @version $Id: MimeType.php 18513 2009-10-12 16:17:35Z matthew $ */ /** @@ -79,6 +79,29 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract */ protected $_magicfile; + /** + * If no $_ENV['MAGIC'] is set, try and autodiscover it based on common locations + * @var array + */ + protected $_magicFiles = array( + '/usr/share/misc/magic', + '/usr/share/misc/magic.mime', + '/usr/share/misc/magic.mgc', + '/usr/share/mime/magic', + '/usr/share/mime/magic.mime', + '/usr/share/mime/magic.mgc', + '/usr/share/file/magic', + '/usr/share/file/magic.mime', + '/usr/share/file/magic.mgc', + ); + + /** + * Option to allow header check + * + * @var boolean + */ + protected $_headerCheck = false; + /** * Sets validator options * @@ -102,16 +125,28 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract $this->setMagicFile($mimetype['magicfile']); } + if (isset($mimetype['headerCheck'])) { + $this->enableHeaderCheck(true); + } + $this->setMimeType($mimetype); } /** - * Returna the actual set magicfile + * Returns the actual set magicfile * * @return string */ public function getMagicFile() { + if (null === $this->_magicfile && empty($_ENV['MAGIC'])) { + foreach ($this->_magicFiles as $file) { + if (file_exists($file)) { + $this->setMagicFile($file); + break; + } + } + } return $this->_magicfile; } @@ -136,6 +171,29 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract return $this; } + /** + * Returns the Header Check option + * + * @return boolean + */ + public function getHeaderCheck() + { + return $this->_headerCheck; + } + + /** + * Defines if the http header should be used + * Note that this is unsave and therefor the default value is false + * + * @param boolean $checkHeader + * @return Zend_Validate_File_MimeType Provides fluid interface + */ + public function enableHeaderCheck($headerCheck = true) + { + $this->_headerCheck = (boolean) $headerCheck; + return $this; + } + /** * Returns the set mimetypes * @@ -220,35 +278,39 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract */ public function isValid($value, $file = null) { + if ($file === null) { + $file = array( + 'type' => null, + 'name' => $value + ); + } + // Is file readable ? require_once 'Zend/Loader.php'; if (!Zend_Loader::isReadable($value)) { return $this->_throw($file, self::NOT_READABLE); } - if ($file !== null) { - $mimefile = $this->getMagicFile(); - if (class_exists('finfo', false)) { - $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME; - if (!empty($mimefile)) { - $mime = new finfo($const, $mimefile); - } else { - $mime = new finfo($const); - } - - if ($mime !== false) { - $this->_type = $mime->file($value); - } - - unset($mime); + $mimefile = $this->getMagicFile(); + if (class_exists('finfo', false)) { + $const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME; + if (!empty($mimefile)) { + $mime = new finfo($const, $mimefile); + } else { + $mime = new finfo($const); } - if (empty($this->_type)) { - if (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { - $this->_type = mime_content_type($value); - } else { - $this->_type = $file['type']; - } + if ($mime !== false) { + $this->_type = $mime->file($value); + } + unset($mime); + } + + if (empty($this->_type)) { + if (function_exists('mime_content_type') && ini_get('mime_magic.magicfile')) { + $this->_type = mime_content_type($value); + } elseif ($this->_headerCheck) { + $this->_type = $file['type']; } } @@ -281,10 +343,7 @@ class Zend_Validate_File_MimeType extends Zend_Validate_Abstract */ protected function _throw($file, $errorType) { - if ($file !== null) { - $this->_value = $file['name']; - } - + $this->_value = $file['name']; $this->_error($errorType); return false; } diff --git a/libs/Zend/Validate/File/Size.php b/libs/Zend/Validate/File/Size.php index 44cc246..4c41178 100644 --- a/libs/Zend/Validate/File/Size.php +++ b/libs/Zend/Validate/File/Size.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Size.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Size.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -112,7 +112,8 @@ class Zend_Validate_File_Size extends Zend_Validate_Abstract } if (1 < func_num_args()) { - trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); +// @todo: Preperation for 2.0... needs to be cleared with the dev-team +// trigger_error('Multiple constructor options are deprecated in favor of a single options array', E_USER_NOTICE); $argv = func_get_args(); array_shift($argv); $options['max'] = array_shift($argv); diff --git a/libs/Zend/Validate/File/Upload.php b/libs/Zend/Validate/File/Upload.php index 8c68252..fd1bdfe 100644 --- a/libs/Zend/Validate/File/Upload.php +++ b/libs/Zend/Validate/File/Upload.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Upload.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Upload.php 18148 2009-09-16 19:27:43Z thomas $ */ /** @@ -78,11 +78,15 @@ class Zend_Validate_File_Upload extends Zend_Validate_Abstract * If no files are given the $_FILES array will be used automatically. * NOTE: This validator will only work with HTTP POST uploads! * - * @param array $files Array of files in syntax of Zend_File_Transfer + * @param array|Zend_Config $files Array of files in syntax of Zend_File_Transfer * @return void */ public function __construct($files = array()) { + if ($files instanceof Zend_Config) { + $files = $files->toArray(); + } + $this->setFiles($files); } diff --git a/libs/Zend/Validate/NotEmpty.php b/libs/Zend/Validate/NotEmpty.php index 2d09913..304cf4f 100644 --- a/libs/Zend/Validate/NotEmpty.php +++ b/libs/Zend/Validate/NotEmpty.php @@ -16,7 +16,7 @@ * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: NotEmpty.php 17680 2009-08-19 20:02:26Z thomas $ + * @version $Id: NotEmpty.php 18186 2009-09-17 18:57:00Z matthew $ */ /** @@ -53,8 +53,8 @@ class Zend_Validate_NotEmpty extends Zend_Validate_Abstract */ public function isValid($value) { - if (!is_string($value) && !is_int($value) && !is_float($value) && !is_bool($value) && - !is_array($value)) { + if (!is_null($value) && !is_string($value) && !is_int($value) && !is_float($value) && + !is_bool($value) && !is_array($value)) { $this->_error(self::INVALID); return false; } @@ -66,6 +66,8 @@ class Zend_Validate_NotEmpty extends Zend_Validate_Abstract ) { $this->_error(self::IS_EMPTY); return false; + } elseif (is_int($value) && (0 === $value)) { + return true; } elseif (!is_string($value) && empty($value)) { $this->_error(self::IS_EMPTY); return false; diff --git a/libs/Zend/Version.php b/libs/Zend/Version.php index 7b89b63..aa67c70 100644 --- a/libs/Zend/Version.php +++ b/libs/Zend/Version.php @@ -16,7 +16,7 @@ * @package Zend_Version * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Version.php 17799 2009-08-24 20:30:08Z alexander $ + * @version $Id: Version.php 19195 2009-11-23 16:24:58Z matthew $ */ /** @@ -32,7 +32,7 @@ final class Zend_Version /** * Zend Framework version identification - see compareVersion() */ - const VERSION = '1.9.2'; + const VERSION = '1.9.6'; /** * Compare the specified Zend Framework version string $version @@ -46,6 +46,8 @@ final class Zend_Version */ public static function compareVersion($version) { - return version_compare($version, self::VERSION); + $version = strtolower($version); + $version = preg_replace('/(\d)pr(\d?)/', '$1a$2', $version); + return version_compare($version, strtolower(self::VERSION)); } } diff --git a/libs/Zend/View.php b/libs/Zend/View.php index 4c9021e..3dfc52f 100644 --- a/libs/Zend/View.php +++ b/libs/Zend/View.php @@ -16,7 +16,7 @@ * @package Zend_View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: View.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: View.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -52,8 +52,8 @@ class Zend_View extends Zend_View_Abstract * Constructor * * Register Zend_View_Stream stream wrapper if short tags are disabled. - * - * @param array $config + * + * @param array $config * @return void */ public function __construct($config = array()) @@ -75,8 +75,8 @@ class Zend_View extends Zend_View_Abstract /** * Set flag indicating if stream wrapper should be used if short_open_tag is off - * - * @param bool $flag + * + * @param bool $flag * @return Zend_View */ public function setUseStreamWrapper($flag) @@ -87,7 +87,7 @@ class Zend_View extends Zend_View_Abstract /** * Should the stream wrapper be used if short_open_tag is off? - * + * * @return bool */ public function useStreamWrapper() diff --git a/libs/Zend/View/Abstract.php b/libs/Zend/View/Abstract.php index 4541786..250b49d 100644 --- a/libs/Zend/View/Abstract.php +++ b/libs/Zend/View/Abstract.php @@ -16,7 +16,7 @@ * @package Zend_View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Abstract.php 19117 2009-11-20 17:44:14Z matthew $ */ /** Zend_Loader */ @@ -139,8 +139,6 @@ abstract class Zend_View_Abstract implements Zend_View_Interface */ private $_strictVars = false; - private $_log; - /** * Constructor. * @@ -710,8 +708,8 @@ abstract class Zend_View_Abstract implements Zend_View_Interface /** * Set LFI protection flag - * - * @param bool $flag + * + * @param bool $flag * @return Zend_View_Abstract */ public function setLfiProtection($flag) @@ -722,7 +720,7 @@ abstract class Zend_View_Abstract implements Zend_View_Interface /** * Return status of LFI protection flag - * + * * @return bool */ public function isLfiProtectionOn() diff --git a/libs/Zend/View/Helper/Abstract.php b/libs/Zend/View/Helper/Abstract.php index e108c83..454c428 100644 --- a/libs/Zend/View/Helper/Abstract.php +++ b/libs/Zend/View/Helper/Abstract.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Abstract.php 16222 2009-06-21 19:55:20Z thomas $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -40,7 +40,7 @@ abstract class Zend_View_Helper_Abstract implements Zend_View_Helper_Interface * @var Zend_View_Interface */ public $view = null; - + /** * Set the View object * diff --git a/libs/Zend/View/Helper/Action.php b/libs/Zend/View/Helper/Action.php index b6de45c..1772d45 100644 --- a/libs/Zend/View/Helper/Action.php +++ b/libs/Zend/View/Helper/Action.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Action.php 16222 2009-06-21 19:55:20Z thomas $ + * @version $Id: Action.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -31,7 +31,7 @@ require_once 'Zend/View/Helper/Abstract.php'; * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_View_Helper_Action extends Zend_View_Helper_Abstract +class Zend_View_Helper_Action extends Zend_View_Helper_Abstract { /** * @var string @@ -52,25 +52,25 @@ class Zend_View_Helper_Action extends Zend_View_Helper_Abstract * @var Zend_Controller_Response_Abstract */ public $response; - + /** * Constructor * * Grab local copies of various MVC objects - * + * * @return void */ public function __construct() { - $front = Zend_Controller_Front::getInstance(); + $front = Zend_Controller_Front::getInstance(); $modules = $front->getControllerDirectory(); if (empty($modules)) { require_once 'Zend/View/Exception.php'; throw new Zend_View_Exception('Action helper depends on valid front controller instance'); } - $request = $front->getRequest(); - $response = $front->getResponse(); + $request = $front->getRequest(); + $response = $front->getResponse(); if (empty($request) || empty($response)) { require_once 'Zend/View/Exception.php'; @@ -79,73 +79,73 @@ class Zend_View_Helper_Action extends Zend_View_Helper_Abstract $this->request = clone $request; $this->response = clone $response; - $this->dispatcher = clone $front->getDispatcher(); + $this->dispatcher = clone $front->getDispatcher(); $this->defaultModule = $front->getDefaultModule(); } /** * Reset object states - * + * * @return void */ - public function resetObjects() - { - $params = $this->request->getUserParams(); - foreach (array_keys($params) as $key) { - $this->request->setParam($key, null); - } - + public function resetObjects() + { + $params = $this->request->getUserParams(); + foreach (array_keys($params) as $key) { + $this->request->setParam($key, null); + } + $this->response->clearBody(); - $this->response->clearHeaders() - ->clearRawHeaders(); + $this->response->clearHeaders() + ->clearRawHeaders(); } /** * Retrieve rendered contents of a controller action * * If the action results in a forward or redirect, returns empty string. - * - * @param string $action - * @param string $controller + * + * @param string $action + * @param string $controller * @param string $module Defaults to default module - * @param array $params + * @param array $params * @return string */ public function action($action, $controller, $module = null, array $params = array()) { - $this->resetObjects(); - if (null === $module) { - $module = $this->defaultModule; - } + $this->resetObjects(); + if (null === $module) { + $module = $this->defaultModule; + } // clone the view object to prevent over-writing of view variables $viewRendererObj = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); - Zend_Controller_Action_HelperBroker::addHelper(clone $viewRendererObj); - - $this->request->setParams($params) - ->setModuleName($module) - ->setControllerName($controller) - ->setActionName($action) - ->setDispatched(true); - - $this->dispatcher->dispatch($this->request, $this->response); - + Zend_Controller_Action_HelperBroker::addHelper(clone $viewRendererObj); + + $this->request->setParams($params) + ->setModuleName($module) + ->setControllerName($controller) + ->setActionName($action) + ->setDispatched(true); + + $this->dispatcher->dispatch($this->request, $this->response); + // reset the viewRenderer object to it's original state Zend_Controller_Action_HelperBroker::addHelper($viewRendererObj); - - if (!$this->request->isDispatched() - || $this->response->isRedirect()) - { - // forwards and redirects render nothing - return ''; - } - + + if (!$this->request->isDispatched() + || $this->response->isRedirect()) + { + // forwards and redirects render nothing + return ''; + } + $return = $this->response->getBody(); - $this->resetObjects(); + $this->resetObjects(); return $return; } - + /** * Clone the current View * diff --git a/libs/Zend/View/Helper/Fieldset.php b/libs/Zend/View/Helper/Fieldset.php index 9ac6416..00248ae 100644 --- a/libs/Zend/View/Helper/Fieldset.php +++ b/libs/Zend/View/Helper/Fieldset.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Fieldset.php 16222 2009-06-21 19:55:20Z thomas $ + * @version $Id: Fieldset.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -51,7 +51,7 @@ class Zend_View_Helper_Fieldset extends Zend_View_Helper_FormElement if (isset($attribs['legend'])) { $legendString = trim($attribs['legend']); if (!empty($legendString)) { - $legend = '' + $legend = '' . (($escape) ? $this->view->escape($legendString) : $legendString) . '' . PHP_EOL; } diff --git a/libs/Zend/View/Helper/FormCheckbox.php b/libs/Zend/View/Helper/FormCheckbox.php index adfa354..75d8fdb 100644 --- a/libs/Zend/View/Helper/FormCheckbox.php +++ b/libs/Zend/View/Helper/FormCheckbox.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormCheckbox.php 17716 2009-08-21 15:08:31Z matthew $ + * @version $Id: FormCheckbox.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -89,7 +89,7 @@ class Zend_View_Helper_FormCheckbox extends Zend_View_Helper_FormElement // build the element $xhtml = ''; - if (!strstr($name, '[]')) { + if (!$disable && !strstr($name, '[]')) { $xhtml = $this->_hidden($name, $checkedOptions['uncheckedValue']); } $xhtml .= '_htmlAttribs($attribs) + . $this->_htmlAttribs($attribs) . $endTag; return $xhtml; diff --git a/libs/Zend/View/Helper/FormImage.php b/libs/Zend/View/Helper/FormImage.php index 5b4ef12..67ccc95 100644 --- a/libs/Zend/View/Helper/FormImage.php +++ b/libs/Zend/View/Helper/FormImage.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormImage.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: FormImage.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -79,7 +79,7 @@ class Zend_View_Helper_FormImage extends Zend_View_Helper_FormElement if ($disable) { $disabled = ' disabled="disabled"'; } - + // XHTML or HTML end tag? $endTag = ' />'; if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { @@ -93,7 +93,7 @@ class Zend_View_Helper_FormImage extends Zend_View_Helper_FormElement . $src . $value . $disabled - . $this->_htmlAttribs($attribs) + . $this->_htmlAttribs($attribs) . $endTag; return $xhtml; diff --git a/libs/Zend/View/Helper/FormLabel.php b/libs/Zend/View/Helper/FormLabel.php index 3bfc1de..dc83aa7 100644 --- a/libs/Zend/View/Helper/FormLabel.php +++ b/libs/Zend/View/Helper/FormLabel.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormLabel.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: FormLabel.php 19128 2009-11-20 19:19:29Z matthew $ */ /** Zend_View_Helper_FormElement **/ @@ -50,17 +50,23 @@ class Zend_View_Helper_FormLabel extends Zend_View_Helper_FormElement // build the element if ($disable) { // disabled; display nothing - $xhtml = ''; - } else { - $value = ($escape) ? $this->view->escape($value) : $value; - - // enabled; display label - $xhtml = '_htmlAttribs($attribs) - . '>' . $value . ''; + return ''; } + $value = ($escape) ? $this->view->escape($value) : $value; + $for = (empty($attribs['disableFor']) || !$attribs['disableFor']) + ? ' for="' . $this->view->escape($id) . '"' + : ''; + if (array_key_exists('disableFor', $attribs)) { + unset($attribs['disableFor']); + } + + // enabled; display label + $xhtml = '_htmlAttribs($attribs) + . '>' . $value . ''; + return $xhtml; } } diff --git a/libs/Zend/View/Helper/FormPassword.php b/libs/Zend/View/Helper/FormPassword.php index cd01941..9c21abc 100644 --- a/libs/Zend/View/Helper/FormPassword.php +++ b/libs/Zend/View/Helper/FormPassword.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormPassword.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: FormPassword.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -73,7 +73,7 @@ class Zend_View_Helper_FormPassword extends Zend_View_Helper_FormElement } unset($attribs['renderPassword']); } - + // XHTML or HTML end tag? $endTag = ' />'; if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { diff --git a/libs/Zend/View/Helper/FormSelect.php b/libs/Zend/View/Helper/FormSelect.php index cc8820f..5ff73bc 100644 --- a/libs/Zend/View/Helper/FormSelect.php +++ b/libs/Zend/View/Helper/FormSelect.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormSelect.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: FormSelect.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -67,7 +67,7 @@ class Zend_View_Helper_FormSelect extends Zend_View_Helper_FormElement $info = $this->_getInfo($name, $value, $attribs, $options, $listsep); extract($info); // name, id, value, attribs, options, listsep, disable - // force $value to array so we can compare multiple values to multiple + // force $value to array so we can compare multiple values to multiple // options; also ensure it's a string for comparison purposes. $value = array_map('strval', (array) $value); @@ -94,7 +94,7 @@ class Zend_View_Helper_FormSelect extends Zend_View_Helper_FormElement $multiple = ''; } unset($attribs['multiple']); - } + } // now start building the XHTML. $disabled = ''; diff --git a/libs/Zend/View/Helper/FormSubmit.php b/libs/Zend/View/Helper/FormSubmit.php index f8376e3..f1765a5 100644 --- a/libs/Zend/View/Helper/FormSubmit.php +++ b/libs/Zend/View/Helper/FormSubmit.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormSubmit.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: FormSubmit.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -76,7 +76,7 @@ class Zend_View_Helper_FormSubmit extends Zend_View_Helper_FormElement . ' id="' . $this->view->escape($id) . '"' . ' value="' . $this->view->escape($value) . '"' . $disabled - . $this->_htmlAttribs($attribs) + . $this->_htmlAttribs($attribs) . $endTag; return $xhtml; diff --git a/libs/Zend/View/Helper/FormText.php b/libs/Zend/View/Helper/FormText.php index 1ec4b25..b4c59f0 100644 --- a/libs/Zend/View/Helper/FormText.php +++ b/libs/Zend/View/Helper/FormText.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: FormText.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: FormText.php 18951 2009-11-12 16:26:19Z alexander $ */ @@ -64,7 +64,7 @@ class Zend_View_Helper_FormText extends Zend_View_Helper_FormElement // disabled $disabled = ' disabled="disabled"'; } - + // XHTML or HTML end tag? $endTag = ' />'; if (($this->view instanceof Zend_View_Abstract) && !$this->view->doctype()->isXhtml()) { diff --git a/libs/Zend/View/Helper/HeadStyle.php b/libs/Zend/View/Helper/HeadStyle.php index ee1242f..356acfc 100644 --- a/libs/Zend/View/Helper/HeadStyle.php +++ b/libs/Zend/View/Helper/HeadStyle.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: HeadStyle.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HeadStyle.php 18572 2009-10-16 13:37:08Z sgehrig $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -324,6 +324,7 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ $media_types = explode(',', $value); $value = ''; foreach($media_types as $type) { + $type = trim($type); if (!in_array($type, $this->_mediaTypes)) { continue; } diff --git a/libs/Zend/View/Helper/HeadTitle.php b/libs/Zend/View/Helper/HeadTitle.php index 5099e6f..ec16e78 100644 --- a/libs/Zend/View/Helper/HeadTitle.php +++ b/libs/Zend/View/Helper/HeadTitle.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: HeadTitle.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HeadTitle.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -63,7 +63,8 @@ class Zend_View_Helper_HeadTitle extends Zend_View_Helper_Placeholder_Container_ */ public function headTitle($title = null, $setType = Zend_View_Helper_Placeholder_Container_Abstract::APPEND) { - if ($title) { + $title = (string) $title; + if ($title !== '') { if ($setType == Zend_View_Helper_Placeholder_Container_Abstract::SET) { $this->set($title); } elseif ($setType == Zend_View_Helper_Placeholder_Container_Abstract::PREPEND) { diff --git a/libs/Zend/View/Helper/HtmlElement.php b/libs/Zend/View/Helper/HtmlElement.php index 54b899d..9f19c38 100644 --- a/libs/Zend/View/Helper/HtmlElement.php +++ b/libs/Zend/View/Helper/HtmlElement.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HtmlElement.php 16222 2009-06-21 19:55:20Z thomas $ + * @version $Id: HtmlElement.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -115,15 +115,15 @@ abstract class Zend_View_Helper_HtmlElement extends Zend_View_Helper_Abstract } else { $xhtml .= " $key=\"$val\""; } - + } return $xhtml; } /** * Normalize an ID - * - * @param string $value + * + * @param string $value * @return string */ protected function _normalizeId($value) diff --git a/libs/Zend/View/Helper/HtmlFlash.php b/libs/Zend/View/Helper/HtmlFlash.php index 2c94d3c..a4e0a6a 100644 --- a/libs/Zend/View/Helper/HtmlFlash.php +++ b/libs/Zend/View/Helper/HtmlFlash.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HtmlFlash.php 16222 2009-06-21 19:55:20Z thomas $ + * @version $Id: HtmlFlash.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,7 +39,7 @@ class Zend_View_Helper_HtmlFlash extends Zend_View_Helper_HtmlObject * */ const TYPE = 'application/x-shockwave-flash'; - + /** * Output a flash movie object tag * diff --git a/libs/Zend/View/Helper/InlineScript.php b/libs/Zend/View/Helper/InlineScript.php index b304f1d..12d13bd 100644 --- a/libs/Zend/View/Helper/InlineScript.php +++ b/libs/Zend/View/Helper/InlineScript.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: InlineScript.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: InlineScript.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -24,7 +24,7 @@ require_once 'Zend/View/Helper/HeadScript.php'; /** - * Helper for setting and retrieving script elements for inclusion in HTML body + * Helper for setting and retrieving script elements for inclusion in HTML body * section * * @uses Zend_View_Helper_Head_Script @@ -44,7 +44,7 @@ class Zend_View_Helper_InlineScript extends Zend_View_Helper_HeadScript /** * Return InlineScript object * - * Returns InlineScript helper object; optionally, allows specifying a + * Returns InlineScript helper object; optionally, allows specifying a * script or script file to include. * * @param string $mode Script or file diff --git a/libs/Zend/View/Helper/Interface.php b/libs/Zend/View/Helper/Interface.php index d34d137..2c4026f 100644 --- a/libs/Zend/View/Helper/Interface.php +++ b/libs/Zend/View/Helper/Interface.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16222 2009-06-21 19:55:20Z thomas $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -39,7 +39,7 @@ interface Zend_View_Helper_Interface /** * Strategy pattern: helper method to invoke - * + * * @return mixed */ public function direct(); diff --git a/libs/Zend/View/Helper/Navigation/Helper.php b/libs/Zend/View/Helper/Navigation/Helper.php index 5cdfb66..829984d 100644 --- a/libs/Zend/View/Helper/Navigation/Helper.php +++ b/libs/Zend/View/Helper/Navigation/Helper.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Helper.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Helper.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -126,7 +126,7 @@ interface Zend_View_Helper_Navigation_Helper * @return bool whether ACL should be used */ public function getUseAcl(); - + /** * Return renderInvisible flag * diff --git a/libs/Zend/View/Helper/PaginationControl.php b/libs/Zend/View/Helper/PaginationControl.php index 859fbc9..2c3b477 100644 --- a/libs/Zend/View/Helper/PaginationControl.php +++ b/libs/Zend/View/Helper/PaginationControl.php @@ -16,7 +16,7 @@ * @package Zend_View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: PaginationControl.php 16222 2009-06-21 19:55:20Z thomas $ + * @version $Id: PaginationControl.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -29,7 +29,7 @@ class Zend_View_Helper_PaginationControl { /** * View instance - * + * * @var Zend_View_Instance */ public $view = null; @@ -62,7 +62,7 @@ class Zend_View_Helper_PaginationControl { self::$_defaultViewPartial = $partial; } - + /** * Gets the default view partial * @@ -75,7 +75,7 @@ class Zend_View_Helper_PaginationControl /** * Render the provided pages. This checks if $view->paginator is set and, - * if so, uses that. Also, if no scrolling style or partial are specified, + * if so, uses that. Also, if no scrolling style or partial are specified, * the defaults will be used (if set). * * @param Zend_Paginator (Optional) $paginator @@ -99,7 +99,7 @@ class Zend_View_Helper_PaginationControl throw new Zend_View_Exception('No paginator instance provided or incorrect type'); } } - + if ($partial === null) { if (self::$_defaultViewPartial === null) { /** @@ -109,12 +109,12 @@ class Zend_View_Helper_PaginationControl throw new Zend_View_Exception('No view partial provided and no default set'); } - + $partial = self::$_defaultViewPartial; } $pages = get_object_vars($paginator->getPages($scrollingStyle)); - + if ($params !== null) { $pages = array_merge($pages, (array) $params); } @@ -132,10 +132,10 @@ class Zend_View_Helper_PaginationControl if ($partial[1] !== null) { return $this->view->partial($partial[0], $partial[1], $pages); } - + $partial = $partial[0]; } - + return $this->view->partial($partial, $pages); } } \ No newline at end of file diff --git a/libs/Zend/View/Helper/Placeholder.php b/libs/Zend/View/Helper/Placeholder.php index 2390147..3b9127b 100644 --- a/libs/Zend/View/Helper/Placeholder.php +++ b/libs/Zend/View/Helper/Placeholder.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Placeholder.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Placeholder.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -36,14 +36,14 @@ require_once 'Zend/View/Helper/Abstract.php'; * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - */ + */ class Zend_View_Helper_Placeholder extends Zend_View_Helper_Abstract -{ +{ /** * Placeholder items * @var array - */ - protected $_items = array(); + */ + protected $_items = array(); /** * @var Zend_View_Helper_Placeholder_Registry @@ -54,30 +54,30 @@ class Zend_View_Helper_Placeholder extends Zend_View_Helper_Abstract * Constructor * * Retrieve container registry from Zend_Registry, or create new one and register it. - * + * * @return void */ public function __construct() { $this->_registry = Zend_View_Helper_Placeholder_Registry::getRegistry(); } - - + + /** * Placeholder helper - * - * @param string $name + * + * @param string $name * @return Zend_View_Helper_Placeholder_Container_Abstract - */ - public function placeholder($name) - { - $name = (string) $name; + */ + public function placeholder($name) + { + $name = (string) $name; return $this->_registry->getContainer($name); - } + } /** * Retrieve the registry - * + * * @return Zend_View_Helper_Placeholder_Registry */ public function getRegistry() diff --git a/libs/Zend/View/Helper/Placeholder/Container.php b/libs/Zend/View/Helper/Placeholder/Container.php index d2cd1fb..03193f6 100644 --- a/libs/Zend/View/Helper/Placeholder/Container.php +++ b/libs/Zend/View/Helper/Placeholder/Container.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Container.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Container.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -30,7 +30,7 @@ require_once 'Zend/View/Helper/Placeholder/Container/Abstract.php'; * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - */ + */ class Zend_View_Helper_Placeholder_Container extends Zend_View_Helper_Placeholder_Container_Abstract -{ +{ } diff --git a/libs/Zend/View/Helper/Placeholder/Container/Abstract.php b/libs/Zend/View/Helper/Placeholder/Container/Abstract.php index 8b41d08..b453338 100644 --- a/libs/Zend/View/Helper/Placeholder/Container/Abstract.php +++ b/libs/Zend/View/Helper/Placeholder/Container/Abstract.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Abstract.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Abstract.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -71,7 +71,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje * @var string */ protected $_indent = ''; - + /** * Whether or not we're already capturing for this given container * @var bool @@ -89,7 +89,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje * @var string */ protected $_captureKey; - + /** * Constructor - This is needed so that we can attach a class member as the ArrayObject container * @@ -99,7 +99,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje { parent::__construct(array(), parent::ARRAY_AS_PROPS); } - + /** * Set a single value * @@ -113,8 +113,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje /** * Prepend a value to the top of the container - * - * @param mixed $value + * + * @param mixed $value * @return void */ public function prepend($value) @@ -236,8 +236,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje /** * Retrieve whitespace representation of $indent - * - * @param int|string $indent + * + * @param int|string $indent * @return string */ public function getWhitespace($indent) @@ -248,7 +248,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje return (string) $indent; } - + /** * Start capturing content to push into placeholder * @@ -305,10 +305,10 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje case self::APPEND: default: if (null !== $key) { - if (empty($this[$key])) { - $this[$key] = $data; - } else { - $this[$key] .= $data; + if (empty($this[$key])) { + $this[$key] = $data; + } else { + $this[$key] .= $data; } } else { $this[$this->nextIndex()] = $data; @@ -319,7 +319,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje /** * Get keys - * + * * @return array */ public function getKeys() @@ -343,7 +343,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje return $nextIndex = max($keys) + 1; } - + /** * Render the placeholder * @@ -351,12 +351,12 @@ abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObje */ public function toString($indent = null) { - $indent = ($indent !== null) - ? $this->getWhitespace($indent) + $indent = ($indent !== null) + ? $this->getWhitespace($indent) : $this->getIndent(); - + $items = $this->getArrayCopy(); - $return = $indent + $return = $indent . $this->getPrefix() . implode($this->getSeparator(), $items) . $this->getPostfix(); diff --git a/libs/Zend/View/Helper/Placeholder/Container/Standalone.php b/libs/Zend/View/Helper/Placeholder/Container/Standalone.php index 5dee476..17edc91 100644 --- a/libs/Zend/View/Helper/Placeholder/Container/Standalone.php +++ b/libs/Zend/View/Helper/Placeholder/Container/Standalone.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Standalone.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Standalone.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -33,9 +33,9 @@ require_once 'Zend/View/Helper/Abstract.php'; * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - */ + */ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_View_Helper_Abstract implements IteratorAggregate, Countable, ArrayAccess -{ +{ /** * @var Zend_View_Helper_Placeholder_Container_Abstract */ @@ -61,7 +61,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Constructor - * + * * @return void */ public function __construct() @@ -72,7 +72,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Retrieve registry - * + * * @return Zend_View_Helper_Placeholder_Registry */ public function getRegistry() @@ -81,9 +81,9 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi } /** - * Set registry object - * - * @param Zend_View_Helper_Placeholder_Registry $registry + * Set registry object + * + * @param Zend_View_Helper_Placeholder_Registry $registry * @return Zend_View_Helper_Placeholder_Container_Standalone */ public function setRegistry(Zend_View_Helper_Placeholder_Registry $registry) @@ -94,7 +94,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Set whether or not auto escaping should be used - * + * * @param bool $autoEscape whether or not to auto escape output * @return Zend_View_Helper_Placeholder_Container_Standalone */ @@ -103,7 +103,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi $this->_autoEscape = ($autoEscape) ? true : false; return $this; } - + /** * Return whether autoEscaping is enabled or disabled * @@ -116,8 +116,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Escape a string - * - * @param string $string + * + * @param string $string * @return string */ protected function _escape($string) @@ -131,8 +131,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Set container on which to operate - * - * @param Zend_View_Helper_Placeholder_Container_Abstract $container + * + * @param Zend_View_Helper_Placeholder_Container_Abstract $container * @return Zend_View_Helper_Placeholder_Container_Standalone */ public function setContainer(Zend_View_Helper_Placeholder_Container_Abstract $container) @@ -143,7 +143,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Retrieve placeholder container - * + * * @return Zend_View_Helper_Placeholder_Container_Abstract */ public function getContainer() @@ -153,9 +153,9 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Overloading: set property value - * - * @param string $key - * @param mixed $value + * + * @param string $key + * @param mixed $value * @return void */ public function __set($key, $value) @@ -166,8 +166,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Overloading: retrieve property - * - * @param string $key + * + * @param string $key * @return mixed */ public function __get($key) @@ -182,8 +182,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Overloading: check if property is set - * - * @param string $key + * + * @param string $key * @return bool */ public function __isset($key) @@ -194,8 +194,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Overloading: unset property - * - * @param string $key + * + * @param string $key * @return void */ public function __unset($key) @@ -210,9 +210,9 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi * Overload * * Proxy to container methods - * - * @param string $method - * @param array $args + * + * @param string $method + * @param array $args * @return mixed */ public function __call($method, $args) @@ -233,7 +233,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * String representation - * + * * @return string */ public function toString() @@ -243,7 +243,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Cast to string representation - * + * * @return string */ public function __toString() @@ -253,7 +253,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * Countable - * + * * @return int */ public function count() @@ -264,8 +264,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * ArrayAccess: offsetExists - * - * @param string|int $offset + * + * @param string|int $offset * @return bool */ public function offsetExists($offset) @@ -275,8 +275,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * ArrayAccess: offsetGet - * - * @param string|int $offset + * + * @param string|int $offset * @return mixed */ public function offsetGet($offset) @@ -286,9 +286,9 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * ArrayAccess: offsetSet - * - * @param string|int $offset - * @param mixed $value + * + * @param string|int $offset + * @param mixed $value * @return void */ public function offsetSet($offset, $value) @@ -298,8 +298,8 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * ArrayAccess: offsetUnset - * - * @param string|int $offset + * + * @param string|int $offset * @return void */ public function offsetUnset($offset) @@ -309,7 +309,7 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi /** * IteratorAggregate: get Iterator - * + * * @return Iterator */ public function getIterator() diff --git a/libs/Zend/View/Helper/Placeholder/Registry.php b/libs/Zend/View/Helper/Placeholder/Registry.php index e87a9da..017560d 100644 --- a/libs/Zend/View/Helper/Placeholder/Registry.php +++ b/libs/Zend/View/Helper/Placeholder/Registry.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Registry.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Registry.php 18951 2009-11-12 16:26:19Z alexander $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -36,7 +36,7 @@ require_once 'Zend/View/Helper/Placeholder/Container.php'; * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - */ + */ class Zend_View_Helper_Placeholder_Registry { /** @@ -59,7 +59,7 @@ class Zend_View_Helper_Placeholder_Registry /** * Retrieve or create registry instnace - * + * * @return void */ public static function getRegistry() @@ -75,10 +75,10 @@ class Zend_View_Helper_Placeholder_Registry } /** - * createContainer - * - * @param string $key - * @param array $value + * createContainer + * + * @param string $key + * @param array $value * @return Zend_View_Helper_Placeholder_Container_Abstract */ public function createContainer($key, array $value = array()) @@ -91,8 +91,8 @@ class Zend_View_Helper_Placeholder_Registry /** * Retrieve a placeholder container - * - * @param string $key + * + * @param string $key * @return Zend_View_Helper_Placeholder_Container_Abstract */ public function getContainer($key) @@ -109,8 +109,8 @@ class Zend_View_Helper_Placeholder_Registry /** * Does a particular container exist? - * - * @param string $key + * + * @param string $key * @return bool */ public function containerExists($key) @@ -122,9 +122,9 @@ class Zend_View_Helper_Placeholder_Registry /** * Set the container for an item in the registry - * - * @param string $key - * @param Zend_View_Placeholder_Container_Abstract $container + * + * @param string $key + * @param Zend_View_Placeholder_Container_Abstract $container * @return Zend_View_Placeholder_Registry */ public function setContainer($key, Zend_View_Helper_Placeholder_Container_Abstract $container) @@ -136,8 +136,8 @@ class Zend_View_Helper_Placeholder_Registry /** * Delete a container - * - * @param string $key + * + * @param string $key * @return bool */ public function deleteContainer($key) @@ -153,8 +153,8 @@ class Zend_View_Helper_Placeholder_Registry /** * Set the container class to use - * - * @param string $name + * + * @param string $name * @return Zend_View_Helper_Placeholder_Registry */ public function setContainerClass($name) @@ -176,7 +176,7 @@ class Zend_View_Helper_Placeholder_Registry /** * Retrieve the container class - * + * * @return string */ public function getContainerClass() diff --git a/libs/Zend/View/Helper/RenderToPlaceholder.php b/libs/Zend/View/Helper/RenderToPlaceholder.php index 0248c5d..32cd52f 100644 --- a/libs/Zend/View/Helper/RenderToPlaceholder.php +++ b/libs/Zend/View/Helper/RenderToPlaceholder.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: RenderToPlaceholder.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: RenderToPlaceholder.php 18209 2009-09-17 22:36:12Z padraic $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -24,7 +24,8 @@ require_once 'Zend/View/Helper/Abstract.php'; /** - * Helper for making easy links and getting urls that depend on the routes and router + * Renders a template and stores the rendered output as a placeholder + * variable for later use. * * @package Zend_View * @subpackage Helper @@ -35,6 +36,14 @@ require_once 'Zend/View/Helper/Abstract.php'; class Zend_View_Helper_RenderToPlaceholder extends Zend_View_Helper_Abstract { + /** + * Renders a template and stores the rendered output as a placeholder + * variable for later use. + * + * @param $script The template script to render + * @param $placeholder The placeholder variable name in which to store the rendered output + * @return void + */ public function renderToPlaceholder($script, $placeholder) { $this->view->placeholder($placeholder)->captureStart(); diff --git a/libs/Zend/View/Helper/Translate.php b/libs/Zend/View/Helper/Translate.php index f674e43..83e90d2 100644 --- a/libs/Zend/View/Helper/Translate.php +++ b/libs/Zend/View/Helper/Translate.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Translate.php 16222 2009-06-21 19:55:20Z thomas $ + * @version $Id: Translate.php 19122 2009-11-20 18:06:37Z matthew $ */ /** Zend_Locale */ @@ -50,7 +50,7 @@ class Zend_View_Helper_Translate extends Zend_View_Helper_Abstract */ public function __construct($translate = null) { - if (empty($translate) === false) { + if ($translate !== null) { $this->setTranslator($translate); } } @@ -132,7 +132,7 @@ class Zend_View_Helper_Translate extends Zend_View_Helper_Abstract { if ($this->_translator === null) { require_once 'Zend/Registry.php'; - if (Zend_Registry::isRegistered('Zend_Translate') === true) { + if (Zend_Registry::isRegistered('Zend_Translate')) { $this->setTranslator(Zend_Registry::get('Zend_Translate')); } } diff --git a/libs/Zend/View/Stream.php b/libs/Zend/View/Stream.php index 99625a0..4dc112d 100644 --- a/libs/Zend/View/Stream.php +++ b/libs/Zend/View/Stream.php @@ -16,20 +16,20 @@ * @package Zend_View * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Stream.php 16541 2009-07-07 06:59:03Z bkarwin $ + * @version $Id: Stream.php 18951 2009-11-12 16:26:19Z alexander $ */ /** - * Stream wrapper to convert markup of mostly-PHP templates into PHP prior to + * Stream wrapper to convert markup of mostly-PHP templates into PHP prior to * include(). - * + * * Based in large part on the example at * http://www.php.net/manual/en/function.stream-wrapper-register.php - * + * * As well as the example provided at: * http://mikenaberezny.com/2006/02/19/symphony-templates-ruby-erb/ - * written by - * Mike Naberezny (@link http://mikenaberezny.com) + * written by + * Mike Naberezny (@link http://mikenaberezny.com) * Paul M. Jones (@link http://paul-m-jones.com) * * @category Zend @@ -37,7 +37,7 @@ * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ -class Zend_View_Stream +class Zend_View_Stream { /** * Current stream position. @@ -59,16 +59,16 @@ class Zend_View_Stream * @var array */ protected $_stat; - + /** * Opens the script file and converts markup. */ - public function stream_open($path, $mode, $options, &$opened_path) + public function stream_open($path, $mode, $options, &$opened_path) { // get the view script source $path = str_replace('zend.view://', '', $path); $this->_data = file_get_contents($path); - + /** * If reading the file failed, update our local stat store * to reflect the real stat of the file, then return on failure @@ -80,14 +80,14 @@ class Zend_View_Stream /** * Convert to long-form and to - * + * */ $this->_data = preg_replace('/\<\?\=/', "_data); $this->_data = preg_replace('/<\?(?!xml|php)/s', '_data); - + /** - * file_get_contents() won't update PHP's stat cache, so we grab a stat - * of the file to prevent additional reads should the script be + * file_get_contents() won't update PHP's stat cache, so we grab a stat + * of the file to prevent additional reads should the script be * requested again, which will make include() happy. */ $this->_stat = stat($path); @@ -97,7 +97,7 @@ class Zend_View_Stream /** * Included so that __FILE__ returns the appropriate info - * + * * @return array */ public function url_stat() @@ -108,45 +108,45 @@ class Zend_View_Stream /** * Reads from the stream. */ - public function stream_read($count) + public function stream_read($count) { $ret = substr($this->_data, $this->_pos, $count); $this->_pos += strlen($ret); return $ret; } - + /** * Tells the current position in the stream. */ - public function stream_tell() + public function stream_tell() { return $this->_pos; } - + /** * Tells if we are at the end of the stream. */ - public function stream_eof() + public function stream_eof() { return $this->_pos >= strlen($this->_data); } - + /** * Stream statistics. */ - public function stream_stat() + public function stream_stat() { return $this->_stat; } - + /** * Seek to a specific point in the stream. */ - public function stream_seek($offset, $whence) + public function stream_seek($offset, $whence) { switch ($whence) { case SEEK_SET: diff --git a/libs/Zend/Wildfire/Channel/HttpHeaders.php b/libs/Zend/Wildfire/Channel/HttpHeaders.php index ea6b895..3adc4aa 100644 --- a/libs/Zend/Wildfire/Channel/HttpHeaders.php +++ b/libs/Zend/Wildfire/Channel/HttpHeaders.php @@ -17,7 +17,7 @@ * @subpackage Channel * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: HttpHeaders.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: HttpHeaders.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Wildfire_Channel_Interface */ @@ -235,10 +235,10 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract * * The channel is ready as long as the request and response objects are initialized, * can send headers and the FirePHP header exists in the User-Agent. - * + * * If the header does not exist in the User-Agent, no appropriate client * is making this request and the messages should not be sent. - * + * * A timing issue arises when messages are logged before the request/response * objects are initialized. In this case we do not yet know if the client * will be able to accept the messages. If we consequently indicate that @@ -246,18 +246,18 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract * most cases not the intended behaviour. The intent is to send them at the * end of the request when the request/response objects will be available * for sure. - * + * * If the request/response objects are not yet initialized we assume if messages are * logged, the client will be able to receive them. As soon as the request/response * objects are availoable and a message is logged this assumption is challenged. * If the client cannot accept the messages any further messages are dropped * and messages sent prior are kept but discarded when the channel is finally * flushed at the end of the request. - * + * * When the channel is flushed the $forceCheckRequest option is used to force * a check of the request/response objects. This is the last verification to ensure * messages are only sent when the client can accept them. - * + * * @param boolean $forceCheckRequest OPTIONAL Set to TRUE if the request must be checked * @return boolean Returns TRUE if channel is ready. */ @@ -270,7 +270,7 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract return true; } - return ($this->getResponse()->canSendHeaders() + return ($this->getResponse()->canSendHeaders() && preg_match_all( '/\s?FirePHP\/([\.|\d]*)\s?/si', $this->getRequest()->getHeader('User-Agent'), diff --git a/libs/Zend/Wildfire/Channel/Interface.php b/libs/Zend/Wildfire/Channel/Interface.php index 1c3343f..4f2874e 100644 --- a/libs/Zend/Wildfire/Channel/Interface.php +++ b/libs/Zend/Wildfire/Channel/Interface.php @@ -11,12 +11,12 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Wildfire * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -27,12 +27,12 @@ */ interface Zend_Wildfire_Channel_Interface { - + /** * Determine if channel is ready. - * + * * @return boolean Returns TRUE if channel is ready. */ public function isReady(); - + } diff --git a/libs/Zend/Wildfire/Plugin/FirePhp/Message.php b/libs/Zend/Wildfire/Plugin/FirePhp/Message.php index 2e90560..a907cbf 100644 --- a/libs/Zend/Wildfire/Plugin/FirePhp/Message.php +++ b/libs/Zend/Wildfire/Plugin/FirePhp/Message.php @@ -17,14 +17,14 @@ * @subpackage Plugin * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Message.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Message.php 18951 2009-11-12 16:26:19Z alexander $ */ /** * A message envelope that can be passed to Zend_Wildfire_Plugin_FirePhp to be * logged to Firebug instead of a variable. - * + * * @category Zend * @package Zend_Wildfire * @subpackage Plugin @@ -38,19 +38,19 @@ class Zend_Wildfire_Plugin_FirePhp_Message * @var string */ protected $_style = null; - + /** * The label of the message * @var string */ protected $_label = null; - + /** * The message value * @var mixed */ protected $_message = null; - + /** * Flag indicating if message buffering is enabled * @var boolean @@ -62,7 +62,7 @@ class Zend_Wildfire_Plugin_FirePhp_Message * @var boolean */ protected $_destroy = false; - + /** * Random unique ID used to identify message in comparison operations * @var string @@ -80,7 +80,7 @@ class Zend_Wildfire_Plugin_FirePhp_Message /** * Creates a new message with the given style and message - * + * * @param string $style Style of the message. * @param mixed $message The message * @return void @@ -91,10 +91,10 @@ class Zend_Wildfire_Plugin_FirePhp_Message $this->_message = $message; $this->_ruid = md5(microtime().mt_rand()); } - + /** * Set the label of the message - * + * * @param string $label The label to be set * @return void */ @@ -102,23 +102,23 @@ class Zend_Wildfire_Plugin_FirePhp_Message { $this->_label = $label; } - + /** * Get the label of the message - * + * * @return string The label of the message */ public function getLabel() { return $this->_label; } - + /** * Enable or disable message buffering - * + * * If a message is buffered it can be updated for the duration of the * request and is only flushed at the end of the request. - * + * * @param boolean $buffered TRUE to enable buffering FALSE otherwise * @return boolean Returns previous buffering value */ @@ -131,17 +131,17 @@ class Zend_Wildfire_Plugin_FirePhp_Message /** * Determine if buffering is enabled or disabled - * - * @return boolean Returns TRUE if buffering is enabled, FALSE otherwise. + * + * @return boolean Returns TRUE if buffering is enabled, FALSE otherwise. */ public function getBuffered() { return $this->_buffered; } - + /** * Destroy the message to prevent delivery - * + * * @param boolean $destroy TRUE to destroy FALSE otherwise * @return boolean Returns previous destroy value */ @@ -151,11 +151,11 @@ class Zend_Wildfire_Plugin_FirePhp_Message $this->_destroy = $destroy; return $previous; } - + /** * Determine if message should be destroyed - * - * @return boolean Returns TRUE if message should be destroyed, FALSE otherwise. + * + * @return boolean Returns TRUE if message should be destroyed, FALSE otherwise. */ public function getDestroy() { @@ -164,7 +164,7 @@ class Zend_Wildfire_Plugin_FirePhp_Message /** * Set the style of the message - * + * * @return void */ public function setStyle($style) @@ -174,7 +174,7 @@ class Zend_Wildfire_Plugin_FirePhp_Message /** * Get the style of the message - * + * * @return string The style of the message */ public function getStyle() @@ -184,7 +184,7 @@ class Zend_Wildfire_Plugin_FirePhp_Message /** * Set the actual message to be sent in its final format. - * + * * @return void */ public function setMessage($message) @@ -194,17 +194,17 @@ class Zend_Wildfire_Plugin_FirePhp_Message /** * Get the actual message to be sent in its final format. - * + * * @return mixed Returns the message to be sent. */ public function getMessage() { return $this->_message; } - + /** * Set a single option - * + * * @param string $key The name of the option * @param mixed $value The value of the option * @return mixed The previous value of the option @@ -221,7 +221,7 @@ class Zend_Wildfire_Plugin_FirePhp_Message /** * Retrieve a single option - * + * * @param string $key The name of the option * @return mixed The value of the option */ @@ -235,12 +235,12 @@ class Zend_Wildfire_Plugin_FirePhp_Message /** * Retrieve all options - * + * * @return array All options */ public function getOptions() { return $this->_options; - } + } } diff --git a/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php b/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php index 61339c2..3d791c5 100644 --- a/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php +++ b/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php @@ -17,7 +17,7 @@ * @subpackage Plugin * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: TableMessage.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: TableMessage.php 18951 2009-11-12 16:26:19Z alexander $ */ /** Zend_Wildfire_Plugin_FirePhp */ @@ -29,7 +29,7 @@ require_once 'Zend/Wildfire/Plugin/FirePhp/Message.php'; /** * A message envelope that can be updated for the duration of the requet before * it gets flushed at the end of the request. - * + * * @category Zend * @package Zend_Wildfire * @subpackage Plugin @@ -43,16 +43,16 @@ class Zend_Wildfire_Plugin_FirePhp_TableMessage extends Zend_Wildfire_Plugin_Fir * @var array */ protected $_header = null; - + /** * The rows of the table * $var array - */ + */ protected $_rows = array(); - + /** * Constructor - * + * * @param string $label The label of the table */ function __construct($label) @@ -60,10 +60,10 @@ class Zend_Wildfire_Plugin_FirePhp_TableMessage extends Zend_Wildfire_Plugin_Fir parent::__construct(Zend_Wildfire_Plugin_FirePhp::TABLE, null); $this->setLabel($label); } - + /** * Set the table header - * + * * @param array $header The header columns * @return void */ @@ -71,10 +71,10 @@ class Zend_Wildfire_Plugin_FirePhp_TableMessage extends Zend_Wildfire_Plugin_Fir { $this->_header = $header; } - + /** * Append a row to the end of the table. - * + * * @param array $row An array of column values representing a row. * @return void */ @@ -82,10 +82,10 @@ class Zend_Wildfire_Plugin_FirePhp_TableMessage extends Zend_Wildfire_Plugin_Fir { $this->_rows[] = $row; } - + /** * Get the actual message to be sent in its final format. - * + * * @return mixed Returns the message to be sent. */ public function getMessage() @@ -107,12 +107,12 @@ class Zend_Wildfire_Plugin_FirePhp_TableMessage extends Zend_Wildfire_Plugin_Fir public function getRowAt($index) { $count = $this->getRowCount(); - + if($index < 0 || $index > $count-1) { require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Row index('.$index.') out of bounds('.$count.')!'); } - + return $this->_rows[$index]; } @@ -126,12 +126,12 @@ class Zend_Wildfire_Plugin_FirePhp_TableMessage extends Zend_Wildfire_Plugin_Fir public function setRowAt($index, $row) { $count = $this->getRowCount(); - + if($index < 0 || $index > $count-1) { require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Row index('.$index.') out of bounds('.$count.')!'); } - + $this->_rows[$index] = $row; } @@ -154,7 +154,7 @@ class Zend_Wildfire_Plugin_FirePhp_TableMessage extends Zend_Wildfire_Plugin_Fir public function getLastRow() { $count = $this->getRowCount(); - + if($count==0) { require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Cannot get last row as no rows exist!'); diff --git a/libs/Zend/Wildfire/Plugin/Interface.php b/libs/Zend/Wildfire/Plugin/Interface.php index 82d3240..ae8791f 100644 --- a/libs/Zend/Wildfire/Plugin/Interface.php +++ b/libs/Zend/Wildfire/Plugin/Interface.php @@ -11,13 +11,13 @@ * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. - * + * * @category Zend * @package Zend_Wildfire * @subpackage Plugin * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Interface.php 16971 2009-07-22 18:05:45Z mikaelkael $ + * @version $Id: Interface.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -29,20 +29,20 @@ */ interface Zend_Wildfire_Plugin_Interface { - + /** * Flush any buffered data. - * + * * @param string $protocolUri The URI of the protocol that should be flushed to * @return void */ public function flushMessages($protocolUri); - + /** * Get the unique indentifier for this plugin. - * + * * @return string Returns the URI of the plugin. */ public function getUri(); - + } diff --git a/libs/Zend/XmlRpc/Request/Http.php b/libs/Zend/XmlRpc/Request/Http.php index a1a6946..3b54498 100644 --- a/libs/Zend/XmlRpc/Request/Http.php +++ b/libs/Zend/XmlRpc/Request/Http.php @@ -34,7 +34,7 @@ require_once 'Zend/XmlRpc/Request.php'; * @package Zend_XmlRpc * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Http.php 16208 2009-06-21 19:19:26Z thomas $ + * @version $Id: Http.php 18443 2009-09-30 13:35:47Z lars $ */ class Zend_XmlRpc_Request_Http extends Zend_XmlRpc_Request { @@ -61,18 +61,13 @@ class Zend_XmlRpc_Request_Http extends Zend_XmlRpc_Request */ public function __construct() { - $fh = fopen('php://input', 'r'); - if (!$fh) { - $this->_fault = new Zend_XmlRpc_Server_Exception(630); + $xml = @file_get_contents('php://input'); + if (!$xml) { + require_once 'Zend/XmlRpc/Fault.php'; + $this->_fault = new Zend_XmlRpc_Fault(630); return; } - $xml = ''; - while (!feof($fh)) { - $xml .= fgets($fh); - } - fclose($fh); - $this->_xml = $xml; $this->loadXml($xml); diff --git a/libs/Zend/XmlRpc/Server/System.php b/libs/Zend/XmlRpc/Server/System.php index 000ef42..f8e91ac 100644 --- a/libs/Zend/XmlRpc/Server/System.php +++ b/libs/Zend/XmlRpc/Server/System.php @@ -17,7 +17,7 @@ * @subpackage Server * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: System.php 17803 2009-08-24 21:22:58Z matthew $ + * @version $Id: System.php 18951 2009-11-12 16:26:19Z alexander $ */ /** @@ -38,8 +38,8 @@ class Zend_XmlRpc_Server_System /** * Constructor - * - * @param Zend_XmlRpc_Server $server + * + * @param Zend_XmlRpc_Server $server * @return void */ public function __construct(Zend_XmlRpc_Server $server) @@ -137,7 +137,7 @@ class Zend_XmlRpc_Server_System $request->setMethod($method['methodName']); $request->setParams($method['params']); $response = $this->_server->handle($request); - if ($response instanceof Zend_XmlRpc_Fault + if ($response instanceof Zend_XmlRpc_Fault || $response->isFault() ) { $fault = $response; diff --git a/libs/Zend/XmlRpc/Value.php b/libs/Zend/XmlRpc/Value.php index a360eb7..e325d53 100644 --- a/libs/Zend/XmlRpc/Value.php +++ b/libs/Zend/XmlRpc/Value.php @@ -17,7 +17,7 @@ * @subpackage Value * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Value.php 17786 2009-08-23 22:26:33Z lars $ + * @version $Id: Value.php 18443 2009-09-30 13:35:47Z lars $ */ /** @@ -73,16 +73,19 @@ abstract class Zend_XmlRpc_Value /** * All the XML-RPC native types */ - const XMLRPC_TYPE_I4 = 'i4'; - const XMLRPC_TYPE_INTEGER = 'int'; - const XMLRPC_TYPE_DOUBLE = 'double'; - const XMLRPC_TYPE_BOOLEAN = 'boolean'; - const XMLRPC_TYPE_STRING = 'string'; - const XMLRPC_TYPE_DATETIME = 'dateTime.iso8601'; - const XMLRPC_TYPE_BASE64 = 'base64'; - const XMLRPC_TYPE_ARRAY = 'array'; - const XMLRPC_TYPE_STRUCT = 'struct'; - const XMLRPC_TYPE_NIL = 'nil'; + const XMLRPC_TYPE_I4 = 'i4'; + const XMLRPC_TYPE_INTEGER = 'int'; + const XMLRPC_TYPE_I8 = 'i8'; + const XMLRPC_TYPE_APACHEI8 = 'ex:i8'; + const XMLRPC_TYPE_DOUBLE = 'double'; + const XMLRPC_TYPE_BOOLEAN = 'boolean'; + const XMLRPC_TYPE_STRING = 'string'; + const XMLRPC_TYPE_DATETIME = 'dateTime.iso8601'; + const XMLRPC_TYPE_BASE64 = 'base64'; + const XMLRPC_TYPE_ARRAY = 'array'; + const XMLRPC_TYPE_STRUCT = 'struct'; + const XMLRPC_TYPE_NIL = 'nil'; + const XMLRPC_TYPE_APACHENIL = 'ex:nil'; /** @@ -127,6 +130,10 @@ abstract class Zend_XmlRpc_Value return $this->_as_dom; } + /** + * @param DOMDocument $dom + * @return mixed + */ protected function _stripXmlDeclaration(DOMDocument $dom) { return preg_replace('/<\?xml version="1.0"( encoding="[^\"]*")?\?>\n/u', '', $dom->saveXML()); @@ -162,30 +169,47 @@ abstract class Zend_XmlRpc_Value case self::XMLRPC_TYPE_I4: // fall through to the next case case self::XMLRPC_TYPE_INTEGER: + require_once 'Zend/XmlRpc/Value/Integer.php'; return new Zend_XmlRpc_Value_Integer($value); + case self::XMLRPC_TYPE_I8: + // fall through to the next case + case self::XMLRPC_TYPE_APACHEI8: + require_once 'Zend/XmlRpc/Value/BigInteger.php'; + return new Zend_XmlRpc_Value_BigInteger($value); + case self::XMLRPC_TYPE_DOUBLE: + require_once 'Zend/XmlRpc/Value/Double.php'; return new Zend_XmlRpc_Value_Double($value); case self::XMLRPC_TYPE_BOOLEAN: + require_once 'Zend/XmlRpc/Value/Boolean.php'; return new Zend_XmlRpc_Value_Boolean($value); case self::XMLRPC_TYPE_STRING: + require_once 'Zend/XmlRpc/Value/String.php'; return new Zend_XmlRpc_Value_String($value); case self::XMLRPC_TYPE_BASE64: + require_once 'Zend/XmlRpc/Value/Base64.php'; return new Zend_XmlRpc_Value_Base64($value); case self::XMLRPC_TYPE_NIL: + // fall through to the next case + case self::XMLRPC_TYPE_APACHENIL: + require_once 'Zend/XmlRpc/Value/Nil.php'; return new Zend_XmlRpc_Value_Nil(); case self::XMLRPC_TYPE_DATETIME: + require_once 'Zend/XmlRpc/Value/DateTime.php'; return new Zend_XmlRpc_Value_DateTime($value); case self::XMLRPC_TYPE_ARRAY: + require_once 'Zend/XmlRpc/Value/Array.php'; return new Zend_XmlRpc_Value_Array($value); case self::XMLRPC_TYPE_STRUCT: + require_once 'Zend/XmlRpc/Value/Struct.php'; return new Zend_XmlRpc_Value_Struct($value); default: @@ -231,6 +255,10 @@ abstract class Zend_XmlRpc_Value require_once 'Zend/XmlRpc/Value/Integer.php'; return new Zend_XmlRpc_Value_Integer($value); + case 'i8': + require_once 'Zend/XmlRpc/Value/BigInteger.php'; + return new Zend_XmlRpc_Value_BigInteger($value); + case 'double': require_once 'Zend/XmlRpc/Value/Double.php'; return new Zend_XmlRpc_Value_Double($value); @@ -267,7 +295,7 @@ abstract class Zend_XmlRpc_Value { if (!$xml instanceof SimpleXMLElement) { try { - $xml = @new SimpleXMLElement($xml); + $xml = new SimpleXMLElement($xml); } catch (Exception $e) { // The given string is not a valid XML require_once 'Zend/XmlRpc/Value/Exception.php'; @@ -275,8 +303,22 @@ abstract class Zend_XmlRpc_Value } } - // Get the key (tag name) and value from the simple xml object and convert the value to an XML-RPC native value + $type = null; + $value = null; list($type, $value) = each($xml); + + if (!$type and $value === null) { + $namespaces = array('ex' => 'http://ws.apache.org/xmlrpc/namespaces/extensions'); + foreach ($namespaces as $namespaceName => $namespaceUri) { + $namespaceXml = $xml->children($namespaceUri); + list($type, $value) = each($namespaceXml); + if ($type !== null) { + $type = $namespaceName . ':' . $type; + break; + } + } + } + if (!$type) { // If no type was specified, the default is string $type = self::XMLRPC_TYPE_STRING; } @@ -287,30 +329,40 @@ abstract class Zend_XmlRpc_Value // Fall through to the next case case self::XMLRPC_TYPE_INTEGER: require_once 'Zend/XmlRpc/Value/Integer.php'; - $xmlrpc_val = new Zend_XmlRpc_Value_Integer($value); + $xmlrpcValue = new Zend_XmlRpc_Value_Integer($value); + break; + case self::XMLRPC_TYPE_APACHEI8: + // Fall through to the next case + case self::XMLRPC_TYPE_I8: + require_once 'Zend/XmlRpc/Value/BigInteger.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_BigInteger($value); break; case self::XMLRPC_TYPE_DOUBLE: require_once 'Zend/XmlRpc/Value/Double.php'; - $xmlrpc_val = new Zend_XmlRpc_Value_Double($value); + $xmlrpcValue = new Zend_XmlRpc_Value_Double($value); break; case self::XMLRPC_TYPE_BOOLEAN: require_once 'Zend/XmlRpc/Value/Boolean.php'; - $xmlrpc_val = new Zend_XmlRpc_Value_Boolean($value); + $xmlrpcValue = new Zend_XmlRpc_Value_Boolean($value); break; case self::XMLRPC_TYPE_STRING: require_once 'Zend/XmlRpc/Value/String.php'; - $xmlrpc_val = new Zend_XmlRpc_Value_String($value); + $xmlrpcValue = new Zend_XmlRpc_Value_String($value); break; case self::XMLRPC_TYPE_DATETIME: // The value should already be in a iso8601 format require_once 'Zend/XmlRpc/Value/DateTime.php'; - $xmlrpc_val = new Zend_XmlRpc_Value_DateTime($value); + $xmlrpcValue = new Zend_XmlRpc_Value_DateTime($value); break; case self::XMLRPC_TYPE_BASE64: // The value should already be base64 encoded require_once 'Zend/XmlRpc/Value/Base64.php'; - $xmlrpc_val = new Zend_XmlRpc_Value_Base64($value ,true); + $xmlrpcValue = new Zend_XmlRpc_Value_Base64($value, true); break; - case self::XMLRPC_TYPE_NIL: // The value should always be NULL - $xmlrpc_val = new Zend_XmlRpc_Value_Nil(); + case self::XMLRPC_TYPE_NIL: + // Fall through to the next case + case self::XMLRPC_TYPE_APACHENIL: + // The value should always be NULL + require_once 'Zend/XmlRpc/Value/Nil.php'; + $xmlrpcValue = new Zend_XmlRpc_Value_Nil(); break; case self::XMLRPC_TYPE_ARRAY: // PHP 5.2.4 introduced a regression in how empty($xml->value) @@ -334,7 +386,7 @@ abstract class Zend_XmlRpc_Value $values[] = self::_xmlStringToNativeXmlRpc($element); } require_once 'Zend/XmlRpc/Value/Array.php'; - $xmlrpc_val = new Zend_XmlRpc_Value_Array($values); + $xmlrpcValue = new Zend_XmlRpc_Value_Array($values); break; case self::XMLRPC_TYPE_STRUCT: $values = array(); @@ -350,19 +402,22 @@ abstract class Zend_XmlRpc_Value $values[(string)$member->name] = self::_xmlStringToNativeXmlRpc($member->value); } require_once 'Zend/XmlRpc/Value/Struct.php'; - $xmlrpc_val = new Zend_XmlRpc_Value_Struct($values); + $xmlrpcValue = new Zend_XmlRpc_Value_Struct($values); break; default: require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('Value type \''. $type .'\' parsed from the XML string is not a known XML-RPC native type'); break; } - $xmlrpc_val->_setXML($xml->asXML()); + $xmlrpcValue->_setXML($xml->asXML()); - return $xmlrpc_val; + return $xmlrpcValue; } - + /** + * @param $xml + * @return void + */ private function _setXML($xml) { $this->_as_xml = $xml; diff --git a/libs/Zend/XmlRpc/Value/Base64.php b/libs/Zend/XmlRpc/Value/Base64.php index c4df743..25aa316 100644 --- a/libs/Zend/XmlRpc/Value/Base64.php +++ b/libs/Zend/XmlRpc/Value/Base64.php @@ -17,7 +17,7 @@ * @subpackage Value * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Base64.php 16208 2009-06-21 19:19:26Z thomas $ + * @version $Id: Base64.php 18443 2009-09-30 13:35:47Z lars $ */ @@ -68,7 +68,7 @@ class Zend_XmlRpc_Value_Base64 extends Zend_XmlRpc_Value_Scalar /** * Return the XML code representing the base64-encoded value - * + * * @return string */ public function saveXML() diff --git a/libs/Zend/XmlRpc/Value/BigInteger.php b/libs/Zend/XmlRpc/Value/BigInteger.php new file mode 100644 index 0000000..2d7f9ae --- /dev/null +++ b/libs/Zend/XmlRpc/Value/BigInteger.php @@ -0,0 +1,65 @@ +_integer = new Zend_Crypt_Math_BigInteger(); + $this->_value = $this->_integer->init($this->_value); + + $this->_type = self::XMLRPC_TYPE_I8; + } + + /** + * Return bigint value object + * + * @return Zend_Crypt_Math_BigInteger + */ + public function getValue() + { + return $this->_integer; + } +} diff --git a/libs/Zend/XmlRpc/Value/Double.php b/libs/Zend/XmlRpc/Value/Double.php index 5501d24..df2ff68 100644 --- a/libs/Zend/XmlRpc/Value/Double.php +++ b/libs/Zend/XmlRpc/Value/Double.php @@ -17,7 +17,7 @@ * @subpackage Value * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Double.php 16208 2009-06-21 19:19:26Z thomas $ + * @version $Id: Double.php 17922 2009-08-31 13:54:04Z lars $ */ @@ -45,7 +45,9 @@ class Zend_XmlRpc_Value_Double extends Zend_XmlRpc_Value_Scalar public function __construct($value) { $this->_type = self::XMLRPC_TYPE_DOUBLE; - $this->_value = sprintf('%f',(float)$value); // Make sure this value is float (double) and without the scientific notation + $precision = (int)ini_get('precision'); + $formatString = '%1.' . $precision . 'f'; + $this->_value = sprintf($formatString, (float)$value); } /** @@ -57,6 +59,4 @@ class Zend_XmlRpc_Value_Double extends Zend_XmlRpc_Value_Scalar { return (float)$this->_value; } - } - diff --git a/libs/Zend/XmlRpc/Value/Integer.php b/libs/Zend/XmlRpc/Value/Integer.php index ccabf94..be5285d 100644 --- a/libs/Zend/XmlRpc/Value/Integer.php +++ b/libs/Zend/XmlRpc/Value/Integer.php @@ -17,7 +17,7 @@ * @subpackage Value * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Integer.php 17759 2009-08-22 21:26:21Z lars $ + * @version $Id: Integer.php 18443 2009-09-30 13:35:47Z lars $ */ @@ -62,6 +62,4 @@ class Zend_XmlRpc_Value_Integer extends Zend_XmlRpc_Value_Scalar { return $this->_value; } - } - diff --git a/libs/Zend/XmlRpc/Value/Scalar.php b/libs/Zend/XmlRpc/Value/Scalar.php index 4bdc23c..4db3851 100644 --- a/libs/Zend/XmlRpc/Value/Scalar.php +++ b/libs/Zend/XmlRpc/Value/Scalar.php @@ -17,7 +17,7 @@ * @subpackage Value * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Scalar.php 16208 2009-06-21 19:19:26Z thomas $ + * @version $Id: Scalar.php 18443 2009-09-30 13:35:47Z lars $ */ @@ -57,4 +57,3 @@ abstract class Zend_XmlRpc_Value_Scalar extends Zend_XmlRpc_Value return $this->_as_xml; } } - diff --git a/libs/htmlpurifier/CREDITS b/libs/htmlpurifier/CREDITS old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/INSTALL b/libs/htmlpurifier/INSTALL old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/LICENSE b/libs/htmlpurifier/LICENSE old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/NEWS b/libs/htmlpurifier/NEWS old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier.auto.php b/libs/htmlpurifier/library/HTMLPurifier.auto.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier.autoload.php b/libs/htmlpurifier/library/HTMLPurifier.autoload.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier.func.php b/libs/htmlpurifier/library/HTMLPurifier.func.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier.includes.php b/libs/htmlpurifier/library/HTMLPurifier.includes.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier.kses.php b/libs/htmlpurifier/library/HTMLPurifier.kses.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier.path.php b/libs/htmlpurifier/library/HTMLPurifier.path.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier.php b/libs/htmlpurifier/library/HTMLPurifier.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier.safe-includes.php b/libs/htmlpurifier/library/HTMLPurifier.safe-includes.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrCollections.php b/libs/htmlpurifier/library/HTMLPurifier/AttrCollections.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php b/libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrTypes.php b/libs/htmlpurifier/library/HTMLPurifier/AttrTypes.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/AttrValidator.php b/libs/htmlpurifier/library/HTMLPurifier/AttrValidator.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Bootstrap.php b/libs/htmlpurifier/library/HTMLPurifier/Bootstrap.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/CSSDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/CSSDefinition.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ChildDef.php b/libs/htmlpurifier/library/HTMLPurifier/ChildDef.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php b/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php b/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php b/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php b/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php b/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php b/libs/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php b/libs/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Config.php b/libs/htmlpurifier/library/HTMLPurifier/Config.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Namespace.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Namespace.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.PurifierLinkifyDocURL.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.PurifierLinkifyDocURL.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.txt old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ContentSets.php b/libs/htmlpurifier/library/HTMLPurifier/ContentSets.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Context.php b/libs/htmlpurifier/library/HTMLPurifier/Context.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Definition.php b/libs/htmlpurifier/library/HTMLPurifier/Definition.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Doctype.php b/libs/htmlpurifier/library/HTMLPurifier/Doctype.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php b/libs/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ElementDef.php b/libs/htmlpurifier/library/HTMLPurifier/ElementDef.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Encoder.php b/libs/htmlpurifier/library/HTMLPurifier/Encoder.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/EntityLookup.php b/libs/htmlpurifier/library/HTMLPurifier/EntityLookup.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser b/libs/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/EntityParser.php b/libs/htmlpurifier/library/HTMLPurifier/EntityParser.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ErrorCollector.php b/libs/htmlpurifier/library/HTMLPurifier/ErrorCollector.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ErrorStruct.php b/libs/htmlpurifier/library/HTMLPurifier/ErrorStruct.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Exception.php b/libs/htmlpurifier/library/HTMLPurifier/Exception.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Filter.php b/libs/htmlpurifier/library/HTMLPurifier/Filter.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/libs/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php b/libs/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Generator.php b/libs/htmlpurifier/library/HTMLPurifier/Generator.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/IDAccumulator.php b/libs/htmlpurifier/library/HTMLPurifier/IDAccumulator.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector.php b/libs/htmlpurifier/library/HTMLPurifier/Injector.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language.php b/libs/htmlpurifier/library/HTMLPurifier/Language.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php b/libs/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php b/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php b/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en.php b/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/LanguageFactory.php b/libs/htmlpurifier/library/HTMLPurifier/LanguageFactory.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Length.php b/libs/htmlpurifier/library/HTMLPurifier/Length.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Lexer.php b/libs/htmlpurifier/library/HTMLPurifier/Lexer.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php b/libs/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php b/libs/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Lexer/PEARSax3.php b/libs/htmlpurifier/library/HTMLPurifier/Lexer/PEARSax3.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php b/libs/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/PercentEncoder.php b/libs/htmlpurifier/library/HTMLPurifier/PercentEncoder.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer.php b/libs/htmlpurifier/library/HTMLPurifier/Printer.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/PropertyList.php b/libs/htmlpurifier/library/HTMLPurifier/PropertyList.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php b/libs/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/Core.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/Core.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/StringHash.php b/libs/htmlpurifier/library/HTMLPurifier/StringHash.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/StringHashParser.php b/libs/htmlpurifier/library/HTMLPurifier/StringHashParser.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/TagTransform.php b/libs/htmlpurifier/library/HTMLPurifier/TagTransform.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php b/libs/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php b/libs/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token.php b/libs/htmlpurifier/library/HTMLPurifier/Token.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/Comment.php b/libs/htmlpurifier/library/HTMLPurifier/Token/Comment.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/Empty.php b/libs/htmlpurifier/library/HTMLPurifier/Token/Empty.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/End.php b/libs/htmlpurifier/library/HTMLPurifier/Token/End.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/Start.php b/libs/htmlpurifier/library/HTMLPurifier/Token/Start.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/Tag.php b/libs/htmlpurifier/library/HTMLPurifier/Token/Tag.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/Text.php b/libs/htmlpurifier/library/HTMLPurifier/Token/Text.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/TokenFactory.php b/libs/htmlpurifier/library/HTMLPurifier/TokenFactory.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URI.php b/libs/htmlpurifier/library/HTMLPurifier/URI.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/URIDefinition.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIParser.php b/libs/htmlpurifier/library/HTMLPurifier/URIParser.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/http.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/http.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/https.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/https.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/news.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/news.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php b/libs/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/UnitConverter.php b/libs/htmlpurifier/library/HTMLPurifier/UnitConverter.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/VarParser.php b/libs/htmlpurifier/library/HTMLPurifier/VarParser.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php b/libs/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/VarParser/Native.php b/libs/htmlpurifier/library/HTMLPurifier/VarParser/Native.php old mode 100755 new mode 100644 diff --git a/libs/htmlpurifier/library/HTMLPurifier/VarParserException.php b/libs/htmlpurifier/library/HTMLPurifier/VarParserException.php old mode 100755 new mode 100644 diff --git a/libs/jpgraph/CHANGELOG-2.3.3.txt b/libs/jpgraph/CHANGELOG-2.3.3.txt deleted file mode 100644 index 8b6cd99..0000000 --- a/libs/jpgraph/CHANGELOG-2.3.3.txt +++ /dev/null @@ -1,77 +0,0 @@ -**************************************************************** -CHANGELOG 2.3.0 to 2.3.3 -**************************************************************** - -Requested new features: -======================= -CR#450 - Add option to specify window target for CSIM -CR#453 - Add additional style option for plot lines -CR#464 - Automatically adjust label precision -CR#465 - Add option for vertical text in graphic tables -CR#000 - Added flags for Bangladesh and Republic of Serbia -CR#000 - Added Example combgraphex1.php to 2.x tree - -Reported Defect fixes: -====================== -PR#250 - Off by one - rounding error for filled gradients -PR#445 - Example code: Image::SetAntiAliasing() expects boolean -PR#448 - Workaround for bug in PHP 4.4.7 (Affects Pie) -PR#449 - Adding text to rotated graphs gets wrong angle for box -PR#454 - Localized error message can only be shown once -PR#455 - Startangle is ignored if only one slice in a Pie is !=0 -PR#456 - German locale problem with punctuation -PR#457 - Array with non-consequtive indexes are not handled as - URL argument for CSIM -PR#458 - Add additional error check for accumulated line plot -PR#459 - UPCA with first digit != 0 will be encoded wrongly -PR#461 - Windroses does not handle title correctly -PR#463 - Wrong handling of small slices -PR#466 - Further wrong handling of small slices in Pie -PR#000 - Typo in jpgraph_table.php ',' instead of ';' -PR#000 - Initialize output parameters to headers_sent() method call - -Performance enhancements: -========================= -* Remove one uneccessary call to StrokeDataVal for markers - on linegraphs -* Modified Wu-algorithm for better handling of start-end points -* Refactored Image class and added error check for use of - anti-alias together with dashed styled lines - -**************************************************************** -CHANGELOG 2.2.0 to 2.3.0 -**************************************************************** -Requested new features: -======================= -CR#443 - Add support for russian LED characters -CR#431 - Make it possible to add an alternate text to linear barcodes -CR#427 - Feature request to add trademark symbol to SymChar class -CR#433 - Make it possible to add images to tables without constrains -CR#450 - Add option to specify window target for CSIM - -Reported Defect fixes: -====================== -PR#430 - Wrong scope for protected variable in PHP5 version of PDF417 -PR#432 - Unquoted % sign in error message 22001 -PR#438 - v2.x does not handle line weight==0 properly -PR#441 - Wrong HTML for circle CSIM in v2.x -PR#442 - Fixed possible undefined sval for CSIM when no alt titles are given -PR#444 - Divide by zero in certain date scale ranges -PR#445 - Example code: Image::SetAntiAliasing() expects boolean -PR#250 - Off by one - rounding error for filled gradients -PR#448 - Workaround for bug imagefilledarc() (Affects Pie) -PR#449 - Adding text to rotated graphs gets wrong angle for box -PR#451 - Various code cleanup for 2.x branch - -Additional code fixes: -====================== -* Make minimum automatic margin smaller -* Added support for XPM image format -* Add error check to see if imageantialias() GD function exists -* Added flags for Bangladesh and Republic of Serbia -* Wrong unicode value for TM -* Corrected wrong error message and uninitialized variable -* Potential divide by zero case for tick positioning -* Removed deprecated call to AdjBackgroundImage() in Example -* Updated CSIM examples to not include the filename in the StrokeCSIM() call -* Added Example combgraphex1.php to 2.x tree diff --git a/libs/jpgraph/QPL.txt b/libs/jpgraph/QPL.txt deleted file mode 100644 index 66986cb..0000000 --- a/libs/jpgraph/QPL.txt +++ /dev/null @@ -1,119 +0,0 @@ -THE Q PUBLIC LICENSE version 1.0 - -Copyright (C) 1999 Trolltech AS, Norway. - Everyone is permitted to copy and - distribute this license document. - -The intent of this license is to establish freedom to share and change -the software regulated by this license under the open source model. - -This license applies to any software containing a notice placed by the -copyright holder saying that it may be distributed under the terms of -the Q Public License version 1.0. Such software is herein referred to -as the Software. This license covers modification and distribution of -the Software, use of third-party application programs based on the -Software, and development of free software which uses the Software. - - -Granted Rights - -1. You are granted the non-exclusive rights set forth in this license - provided you agree to and comply with any and all conditions in - this license. Whole or partial distribution of the Software, or - software items that link with the Software, in any form signifies - acceptance of this license. - - -2. You may copy and distribute the Software in unmodified form - provided that the entire package, including - but not restricted to - - copyright, trademark notices and disclaimers, as released by the - initial developer of the Software, is distributed. - - -3. You may make modifications to the Software and distribute your - modifications, in a form that is separate from the Software, such - as patches. The following restrictions apply to modifications: - - a. Modifications must not alter or remove any copyright notices in the - Software. - - b. When modifications to the Software are released under this license, - a non-exclusive royalty-free right is granted to the initial developer - of the Software to distribute your modification in future versions of - the Software provided such versions remain available under these terms - in addition to any other license(s) of the initial developer. - - -4. You may distribute machine-executable forms of the Software or - machine-executable forms of modified versions of the Software, - provided that you meet these restrictions: - - a. You must include this license document in the distribution. - - b. You must ensure that all recipients of the machine-executable forms - are also able to receive the complete machine-readable source code to - the distributed Software, including all modifications, without any - charge beyond the costs of data transfer, and place prominent notices - in the distribution explaining this. - - c. You must ensure that all modifications included in the - machine-executable forms are available under the terms of this - license. - - -5. You may use the original or modified versions of the Software to - compile, link and run application programs legally developed by you - or by others. - - -6. You may develop application programs, reusable components and other - software items that link with the original or modified versions of - the Software. These items, when distributed, are subject to the - following requirements: - - - - a. You must ensure that all recipients of machine-executable forms of - these items are also able to receive and use the complete - machine-readable source code to the items without any charge beyond - the costs of data transfer. - - - b. You must explicitly license all recipients of your items to use and - re-distribute original and modified versions of the items in both - machine-executable and source code forms. The recipients must be able - to do so without any charges whatsoever, and they must be able to - re-distribute to anyone they choose. - - - c. If the items are not available to the general public, and the - initial developer of the Software requests a copy of the items, then - you must supply one. - - -Limitations of Liability - -In no event shall the initial developers or copyright holders be -liable for any damages whatsoever, including - but not restricted to - -lost revenue or profits or other direct, indirect, special, incidental -or consequential damages, even if they have been advised of the -possibility of such damages, except to the extent invariable law, if -any, provides otherwise. - - -No Warranty - -The Software and this license document are provided AS IS with NO -WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - -Choice of Law - -This license is governed by the Laws of Norway. Disputes shall be -settled by Oslo City Court. - - - - - diff --git a/libs/jpgraph/README b/libs/jpgraph/README index 3bdae3e..963cc5c 100644 --- a/libs/jpgraph/README +++ b/libs/jpgraph/README @@ -1,82 +1,28 @@ -README FOR JPGRAPH -================== +README FOR JPGRAPH 3.0.x +======================== This package contains JpGraph, an Object Oriented PHP5 Graph Plotting library. -The library is Copyright (C) 2001-2008 Aditus Consulting and +The library is Copyright (C) 2001-2009 Aditus Consulting and released under dual license QPL 1.0 for open source and educational use and JpGraph Professional License for commercial use. Please see full license details at http://www.aditus.nu/jpgraph/ * -------------------------------------------------------------------- -* PHP4 IS NOT SUPPORTED IN THIS 2.x SERIE +* PHP4 IS NOT SUPPORTED in the 2.x or 3.x series * -------------------------------------------------------------------- - -* -------------------------------------------------------------------- -* Note: Due to a bug in PHP5 make sure that the compatibility mode for -* PHP4 is disabled by setting (in php.ini) -* -* zend.ze1_compatibility_mode = Off -* -------------------------------------------------------------------- - - -Included files --------------- -README This file -QPL.txt QPL 1.0 Licensee - -/src - Changelog Changelog - jpg-config.inc.php Configuration setup for JpGraph - jpgraph.php Base library - jpgraph_log.php Extension: logarithmic scales - jpgraph_line.php Extension: line plots - jpgraph_bar.php Extension: bar plots - jpgraph_date.php Extension: date scale - jpgraph_flags.php Extension: Country flags - jpgraph_error.php Extension: error plots - jpgraph_scatter.php Extension: scatter/impulse plots - jpgraph_radar.php Extension: radar plots - jpgraph_pie.php Extension: pie plots - jpgraph_canvas.php Extension: drawing canvas - jpgraph_canvtools.php Extension: utility classes for working with canvas - jpgraph_pie3d.php Extension: 3D pie plots - jpgraph_gantt.php Extension: Gantt chart - jpgraph_regstat.php Extension: Statistics and cubic splines. - jpgraph_stock.php Extension: Stock and box plots. - jpgraph_gradient.php Extension: Color gradient class - jpgraph_gb2312.php Extension: Chinese GB2312 to Unicode translation - jpgraph_imgtrans.php Extension: Basic image transformation - jpgraph_flags.php Extension: Country flags - jpgraph_iconplot.php Extension: Use image icons in plots - jpgraph_polar.php Extension: Polar plots - jpgraph_plotband.php Extension: Plotbands in graphs - jpgraph_plotmark.inc.php Extension: Using plotmarks in graphs - jpgraph_mgraph.php Extension: Multi graph extension - jpgraph_utils.inc.php Extension: Various non-mandatory utility classes - imgdata_*.inc Extension: Encoded images for plot marks - flags*.dat Image data: Pre-compiled data for country flags. - -/src/Examples A directory with example sripts. - Run testsuit.php to get a list of all - files and you can easily click on a file to - see the code and the resulting image. -/docs Directory with all documentation -/docs/index.html Documentation portal - - Requirements: ------------- Miminum: * PHP 5.1.0 or higher -* GD 2.28 or higher +* GD 2.0.28 or higher Note: Earlier versions might work but is unsupported. Recommended: -* PHP 5.1.2 -* PHP Builtin GD library +* PHP >= 5.2.0 +* PHP Built-in GD library Installation ------------ @@ -104,9 +50,9 @@ Installation 3. Check that all rest of the DEFINE in jpg-config.inc is setup to your preference. The default should be fine - for most users. (See also Note 3. below) - -4. Read (really!) the FAQ on http://www.aditus.nu/jpgraph/jpg_faq.php. + for most users. + +4. Read the chapters on installation in the manual. Documentation @@ -116,37 +62,10 @@ library. The portal page for all the documentation is /docs/index.html -Troubleshooting ---------------- -1. If an empty page is returned back when running an example check - the following - - i) Make sure output_buffer is disabled in php.ini - ii) Increase the maximum memory allowed by PHP (in php.ini) to at least - 32MB - iii) Enable all error messages and notices in php.ini (error_reporting = E_ALL) - - Then try running the example again. Most likely an error message will - now be shown that will give further information on what is wrong. - For further clarifiction on the casues for the error messages see - the FAQ section on the WEB site. - -1. If you are running IIS and Win2k and get the error "Can't find - font' when trying to use TTF fonts then try to change you paths - to UNIX style, i.e. "/usr/local/fonts/ttf/". Remember that the - path is absolute and not relative to the htdocs catalogue. Some - versions of GD for Windows also need you to set the environment - variable GDFONTPATH for GD to find the fonts. - -2. If you are using the cache please make sure that you have - set the permissions correctly for the cache directory so that - Apache/PHP can write to that directory. - -3. Some windows installations seems to have a problem with a PHP - script ending in a newline (This newline seems to be sent to the - browser and will cause a Header already sent error). - If you have this problem try remove all trailing newlines in the - jpgraph* files +Bug reports and suggestions +--------------------------- +Should be reported using the the issue tracker at +http://www.aditus.nu/bugtraq diff --git a/libs/jpgraph/VERSION b/libs/jpgraph/VERSION index d423229..9f7e321 100644 --- a/libs/jpgraph/VERSION +++ b/libs/jpgraph/VERSION @@ -1 +1 @@ -Revision: r1006, Exported: 2008-06-15 10:16 +Version: v3.0.4, Build: r1875, Exported: Tue, 29 Sep 2009 at 17:44 (UTC+2), w0940.2 diff --git a/libs/jpgraph/contour_dev/findpolygon.php b/libs/jpgraph/contour_dev/findpolygon.php new file mode 100644 index 0000000..4d10528 --- /dev/null +++ b/libs/jpgraph/contour_dev/findpolygon.php @@ -0,0 +1,798 @@ +contourCoord[0]); ++$i) { + // echo '('.$this->contourCoord[0][$i][0][0].','.$this->contourCoord[0][$i][0][1].') -> '. + // '('.$this->contourCoord[0][$i][1][0].','.$this->contourCoord[0][$i][1][1].")\n"; + // } + // + + $c=0; + $p[$c] = array(0.6,1, 1,0.5, 2,0.5, 3,0.5, 3.5,1, 3.5,2, 3,2.5, 2,2.5, 1,2.5, 0.5,2, 0.6,1); + $c++; + $p[$c] = array(6,0.5, 5.5,1, 5.5,2, 6,2.5); + + $this->nbrContours = $c+1; + + for ($c = 0 ; $c < count($p) ; $c++) { + $n=count($p[$c]); + + $this->contourCoord[$c][0] = array(array($p[$c][0],$p[$c][1]),array($p[$c][2],$p[$c][3])); + $k=1; + for ($i = 0; $i < ($n-4)/2; $i++, $k++) { + $this->contourCoord[$c][$k] = array($this->contourCoord[$c][$k-1][1], array($p[$c][2*$k+2],$p[$c][2*$k+1+2])); + } + + // Swap edges order at random + $n = count($this->contourCoord[$c]); + for($i=0; $i < floor($n/2); ++$i) { + $swap1 = rand(0,$n-1); + $t = $this->contourCoord[$c][$swap1]; + while( $swap1 == ($swap2 = rand(0,$n-1)) ) + ; + $this->contourCoord[$c][$swap1] = $this->contourCoord[$c][$swap2]; + $this->contourCoord[$c][$swap2] = $t; + } + + // Swap vector direction on 1/3 of the edges + for ($i = 0 ; $i < floor(count($this->contourCoord[$c])/3) ; $i++) { + $e = rand(0, count($this->contourCoord[$c])-1); + $edge = $this->contourCoord[$c][$e]; + $v1 = $edge[0]; $v2 = $edge[1]; + $this->contourCoord[$c][$e][0] = $v2; + $this->contourCoord[$c][$e][1] = $v1; + } + } + + $pp = array(); + for($j=0; $j < count($p); ++$j ) { + for( $i=0; $i < count($p[$j])/2; ++$i ) { + $pp[$j][$i] = array($p[$j][2*$i],$p[$j][2*$i+1]); + } + } + return $pp; + } + + function p_edges($v) { + for ($i = 0 ; $i < count($v) ; $i++) { + echo "(".$v[$i][0][0].",".$v[$i][0][1].") -> (".$v[$i][1][0].",".$v[$i][1][1].")\n"; + } + echo "\n"; + } + + function CompareCyclic($a,$b,$forward=true) { + + // We assume disjoint vertices and if last==first this just means + // that the polygon is closed. For this comparison it must be unique + // elements + if( $a[count($a)-1] == $a[0] ) { + array_pop($a); + } + if( $b[count($b)-1] == $b[0] ) { + array_pop($b); + } + + $n1 = count($a); $n2 = count($b); + if( $n1 != $n2 ) + return false; + + $i=0; + while( ($i < $n2) && ($a[0] != $b[$i]) ) + ++$i; + + if( $i >= $n2 ) + return false; + + $j=0; + if( $forward ) { + while( ($j < $n1) && ($a[$j] == $b[$i]) ) { + $i = ($i + 1) % $n2; + ++$j; + } + } + else { + while( ($j < $n1) && ($a[$j] == $b[$i]) ) { + --$i; + if( $i < 0 ) { + $i = $n2-1; + } + ++$j; + } + } + return $j >= $n1; + } + + function dbg($s) { + // echo $s."\n"; + } + + function IsVerticeOnBorder($x1,$y1) { + // Check if the vertice lies on any of the four border + if( $x1==$this->scale[0] || $x1==$this->scale[1] ) { + return true; + } + if( $y1==$this->scale[2] || $y1==$this->scale[3] ) { + return true; + } + return false; + } + + function FindPolygons($debug=false) { + + $pol = 0; + for ($c = 0; $c < $this->nbrContours; $c++) { + + $this->dbg("\n** Searching polygon chain $c ... "); + $this->dbg("------------------------------------------\n"); + + $edges = $this->contourCoord[$c]; + while( count($edges) > 0 ) { + + $edge = array_shift($edges); + list($x1,$y1) = $edge[0]; + list($x2,$y2) = $edge[1]; + $polygons[$pol]=array( + array($x1,$y1),array($x2,$y2) + ); + + $this->dbg("Searching on second vertice."); + + $found=false; + if( ! $this->IsVerticeOnBorder($x2,$y2) ) { + do { + + $this->dbg(" --Searching on edge: ($x1,$y1)->($x2,$y2)"); + + $found=false; + $nn = count($edges); + for( $i=0; $i < $nn && !$found; ++$i ) { + $edge = $edges[$i]; + if( $found = ($x2==$edge[0][0] && $y2==$edge[0][1]) ) { + $polygons[$pol][] = array($edge[1][0],$edge[1][1]); + $x1 = $x2; $y1 = $y2; + $x2 = $edge[1][0]; $y2 = $edge[1][1]; + } + elseif( $found = ($x2==$edge[1][0] && $y2==$edge[1][1]) ) { + $polygons[$pol][] = array($edge[0][0],$edge[0][1]); + $x1 = $x2; $y1 = $y2; + $x2 = $edge[0][0]; $y2 = $edge[0][1]; + } + if( $found ) { + $this->dbg(" --Found next edge: [i=$i], (%,%) -> ($x2,$y2)"); + unset($edges[$i]); + $edges = array_values($edges); + } + } + + } while( $found ); + } + + if( !$found && count($edges)>0 ) { + $this->dbg("Searching on first vertice."); + list($x1,$y1) = $polygons[$pol][0]; + list($x2,$y2) = $polygons[$pol][1]; + + if( ! $this->IsVerticeOnBorder($x1,$y1) ) { + do { + + $this->dbg(" --Searching on edge: ($x1,$y1)->($x2,$y2)"); + + $found=false; + $nn = count($edges); + for( $i=0; $i < $nn && !$found; ++$i ) { + $edge = $edges[$i]; + if( $found = ($x1==$edge[0][0] && $y1==$edge[0][1]) ) { + array_unshift($polygons[$pol],array($edge[1][0],$edge[1][1])); + $x2 = $x1; $y2 = $y1; + $x1 = $edge[1][0]; $y1 = $edge[1][1]; + } + elseif( $found = ($x1==$edge[1][0] && $y1==$edge[1][1]) ) { + array_unshift($polygons[$pol],array($edge[0][0],$edge[0][1])); + $x2 = $x1; $y2 = $y1; + $x1 = $edge[0][0]; $y1 = $edge[0][1]; + } + if( $found ) { + $this->dbg(" --Found next edge: [i=$i], ($x1,$y1) -> (%,%)"); + unset($edges[$i]); + $edges = array_values($edges); + } + } + + } while( $found ); + } + + } + + $pol++; + } + } + + return $polygons; + } + +} +define('HORIZ_EDGE',0); +define('VERT_EDGE',1); + +class FillGridRect { + private $edges,$dataPoints,$colors,$isoBars; + private $invert=false; + + function __construct(&$edges,&$dataPoints,$isoBars,$colors) { + $this->edges = $edges; + $this->dataPoints = $dataPoints; + $this->colors = $colors; + $this->isoBars = $isoBars; + } + + function GetIsobarColor($val) { + for ($i = 0 ; $i < count($this->isoBars) ; $i++) { + if( $val <= $this->isoBars[$i] ) { + return $this->colors[$i]; + } + } + return $this->colors[$i]; // The color for all values above the highest isobar + } + + function GetIsobarVal($a,$b) { + // Get the isobar that is between the values a and b + // If there are more isobars then return the one with lowest index + if( $b < $a ) { + $t=$a; $a=$b; $b=$t; + } + $i = 0 ; + $n = count($this->isoBars); + while( $i < $n && $this->isoBars[$i] < $a ) { + ++$i; + } + if( $i >= $n ) + die("Internal error. Cannot find isobar values for ($a,$b)"); + return $this->isoBars[$i]; + } + + function getCrossingCoord($aRow,$aCol,$aEdgeDir,$aIsobarVal) { + // In order to avoid numerical problem when two vertices are very close + // we have to check and avoid dividing by close to zero denumerator. + if( $aEdgeDir == HORIZ_EDGE ) { + $d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow][$aCol+1]); + if( $d > 0.001 ) { + $xcoord = $aCol + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d; + } + else { + $xcoord = $aCol; + } + $ycoord = $aRow; + } + else { + $d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow+1][$aCol]); + if( $d > 0.001 ) { + $ycoord = $aRow + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d; + } + else { + $ycoord = $aRow; + } + $xcoord = $aCol; + } + if( $this->invert ) { + $ycoord = $this->nbrRows-1 - $ycoord; + } + return array($xcoord,$ycoord); + } + + function Fill(ContCanvas $canvas) { + + $nx_vertices = count($this->dataPoints[0]); + $ny_vertices = count($this->dataPoints); + + // Loop through all squares in the grid + for($col=0; $col < $nx_vertices-1; ++$col) { + for($row=0; $row < $ny_vertices-1; ++$row) { + + $n = 0;$quad_edges=array(); + if ( $this->edges[VERT_EDGE][$row][$col] ) $quad_edges[$n++] = array($row, $col, VERT_EDGE); + if ( $this->edges[VERT_EDGE][$row][$col+1] ) $quad_edges[$n++] = array($row, $col+1,VERT_EDGE); + if ( $this->edges[HORIZ_EDGE][$row][$col] ) $quad_edges[$n++] = array($row, $col, HORIZ_EDGE); + if ( $this->edges[HORIZ_EDGE][$row+1][$col] ) $quad_edges[$n++] = array($row+1,$col, HORIZ_EDGE); + + if( $n == 0 ) { + // Easy, fill the entire quadrant with one color since we have no crossings + // Select the top left datapoint as representing this quadrant + // color for this quadrant + $color = $this->GetIsobarColor($this->dataPoints[$row][$col]); + $polygon = array($col,$row,$col,$row+1,$col+1,$row+1,$col+1,$row,$col,$row); + $canvas->FilledPolygon($polygon,$color); + + } elseif( $n==2 ) { + + // There is one isobar edge crossing this quadrant. In order to fill we need to + // find out the orientation of the two areas this edge is separating in order to + // construct the two polygons that define the two areas to be filled + // There are six possible variants + // 0) North-South + // 1) West-East + // 2) West-North + // 3) East-North + // 4) West-South + // 5) East-South + $type=-1; + if( $this->edges[HORIZ_EDGE][$row][$col] ) { + if( $this->edges[HORIZ_EDGE][$row+1][$col] ) $type=0; // North-South + elseif( $this->edges[VERT_EDGE][$row][$col] ) $type=2; + elseif( $this->edges[VERT_EDGE][$row][$col+1] ) $type=3; + } + elseif( $this->edges[HORIZ_EDGE][$row+1][$col] ) { + if( $this->edges[VERT_EDGE][$row][$col] ) $type=4; + elseif( $this->edges[VERT_EDGE][$row][$col+1] ) $type=5; + } + else { + $type=1; + } + if( $type==-1 ) { + die('Internal error: n=2 but no edges in the quadrant was find to determine type.'); + } + + switch( $type ) { + case 0: //North-South + + // North vertice + $v1 = $this->dataPoints[$row][$col]; + $v2 = $this->dataPoints[$row][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x1,$y1) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue); + + // South vertice + $v1 = $this->dataPoints[$row+1][$col]; + $v2 = $this->dataPoints[$row+1][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue); + + $polygon = array($col,$row,$x1,$y1,$x2,$y2,$col,$row+1,$col,$row); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1)); + + $polygon = array($col+1,$row,$x1,$y1,$x2,$y2,$col+1,$row+1,$col+1,$row); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2)); + + break; + + case 1: // West-East + + // West vertice + $v1 = $this->dataPoints[$row][$col]; + $v2 = $this->dataPoints[$row+1][$col]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue); + + // East vertice + $v1 = $this->dataPoints[$row][$col+1]; + $v2 = $this->dataPoints[$row+1][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x2,$y2) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue); + + $polygon = array($col,$row,$x1,$y1,$x2,$y2,$col+1,$row,$col,$row); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1)); + + $polygon = array($col,$row+1,$x1,$y1,$x2,$y2,$col+1,$row+1,$col,$row+1); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2)); + break; + + case 2: // West-North + + // West vertice + $v1 = $this->dataPoints[$row][$col]; + $v2 = $this->dataPoints[$row+1][$col]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue); + + // North vertice + $v1 = $this->dataPoints[$row][$col]; + $v2 = $this->dataPoints[$row][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x2,$y2) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue); + + $polygon = array($col,$row,$x1,$y1,$x2,$y2,$col,$row); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1)); + + $polygon = array($x1,$y1,$x2,$y2,$col+1,$row,$col+1,$row+1,$col,$row+1,$x1,$y1); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2)); + + break; + + case 3: // East-North + + // if( $row==3 && $col==1 && $n==2 ) { + // echo " ** East-North
"; + // } + + + // East vertice + $v1 = $this->dataPoints[$row][$col+1]; + $v2 = $this->dataPoints[$row+1][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x1,$y1) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue); + // + // if( $row==3 && $col==1 && $n==2 ) { + // echo " ** E_val($v1,$v2), isobar=$isobarValue
"; + // echo " ** E($x1,$y1)
"; + // } + + + // North vertice + $v1 = $this->dataPoints[$row][$col]; + $v2 = $this->dataPoints[$row][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x2,$y2) = $this->getCrossingCoord($row, $col,HORIZ_EDGE, $isobarValue); + + // if( $row==3 && $col==1 && $n==2 ) { + // echo " ** N_val($v1,$v2), isobar=$isobarValue
"; + // echo " ** N($x2,$y2)
"; + // } + // if( $row==3 && $col==1 && $n==2 ) + // $canvas->Line($x1,$y1,$x2,$y2,'blue'); + + $polygon = array($x1,$y1,$x2,$y2,$col+1,$row,$x1,$y1); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2)); + + $polygon = array($col,$row,$x2,$y2,$x1,$y1,$col+1,$row+1,$col,$row+1,$col,$row); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1)); + + break; + + case 4: // West-South + + // West vertice + $v1 = $this->dataPoints[$row][$col]; + $v2 = $this->dataPoints[$row+1][$col]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x1,$y1) = $this->getCrossingCoord($row, $col,VERT_EDGE, $isobarValue); + + // South vertice + $v1 = $this->dataPoints[$row+1][$col]; + $v2 = $this->dataPoints[$row+1][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue); + + $polygon = array($col,$row+1,$x1,$y1,$x2,$y2,$col,$row+1); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1)); + + $polygon = array($x1,$y1,$x2,$y2,$col+1,$row+1,$col+1,$row,$col,$row,$x1,$y1); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2)); + + break; + + case 5: // East-South + + // + // if( $row==1 && $col==1 && $n==2 ) { + // echo " ** Sout-East
"; + // } + + // East vertice + $v1 = $this->dataPoints[$row][$col+1]; + $v2 = $this->dataPoints[$row+1][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x1,$y1) = $this->getCrossingCoord($row, $col+1,VERT_EDGE, $isobarValue); + + // if( $row==1 && $col==1 && $n==2 ) { + // echo " ** E_val($v1,$v2), isobar=$isobarValue
"; + // echo " ** E($x1,$y1)
"; + // } + + // South vertice + $v1 = $this->dataPoints[$row+1][$col]; + $v2 = $this->dataPoints[$row+1][$col+1]; + $isobarValue = $this->GetIsobarVal($v1, $v2); + list($x2,$y2) = $this->getCrossingCoord($row+1, $col,HORIZ_EDGE, $isobarValue); + + // if( $row==1 && $col==1 && $n==2 ) { + // echo " ** S_val($v1,$v2), isobar=$isobarValue
"; + // echo " ** S($x2,$y2)
"; + // } + + $polygon = array($col+1,$row+1,$x1,$y1,$x2,$y2,$col+1,$row+1); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v2)); + + $polygon = array($x1,$y1,$x2,$y2,$col,$row+1,$col,$row,$col+1,$row,$x1,$y1); + $canvas->FilledPolygon($polygon,$this->GetIsobarColor($v1)); + + break; + + } + + } + + } + } + + } +} + + +class ContCanvas { + public $g; + public $shape,$scale; + function __construct($xmax=6,$ymax=6,$width=400,$height=400) { + + $this->g = new CanvasGraph($width,$height); + $this->scale = new CanvasScale($this->g, 0, $xmax, 0, $ymax); + $this->shape = new Shape($this->g, $this->scale); + + //$this->g->SetFrame(true); + $this->g->SetMargin(5,5,5,5); + $this->g->SetMarginColor('white@1'); + $this->g->InitFrame(); + + + $this->shape->SetColor('gray'); + for( $col=1; $col<$xmax; ++$col ) { + $this->shape->Line($col, 0, $col, $ymax); + } + for( $row=1; $row<$ymax; ++$row ) { + $this->shape->Line(0, $row, $xmax, $row); + } + } + + function SetDatapoints($datapoints) { + $ny=count($datapoints); + $nx=count($datapoints[0]); + $t = new Text(); + $t->SetFont(FF_ARIAL,FS_NORMAL,8); + for( $x=0; $x < $nx; ++$x ) { + for( $y=0; $y < $ny; ++$y ) { + list($x1,$y1) = $this->scale->Translate($x,$y); + + if( $datapoints[$y][$x] > 0 ) + $t->SetColor('blue'); + else + $t->SetColor('black'); + $t->SetFont(FF_ARIAL,FS_BOLD,8); + $t->Set($datapoints[$y][$x]); + $t->Stroke($this->g->img,$x1,$y1); + + $t->SetColor('gray'); + $t->SetFont(FF_ARIAL,FS_NORMAL,8); + $t->Set("($y,$x)"); + $t->Stroke($this->g->img,$x1+10,$y1); + + } + } + } + + function DrawLinePolygons($p,$color='red') { + $this->shape->SetColor($color); + for ($i = 0 ; $i < count($p) ; $i++) { + $x1 = $p[$i][0][0]; $y1 = $p[$i][0][1]; + for ($j = 1 ; $j < count($p[$i]) ; $j++) { + $x2=$p[$i][$j][0]; $y2 = $p[$i][$j][1]; + $this->shape->Line($x1, $y1, $x2, $y2); + $x1=$x2; $y1=$y2; + } + } + } + + function Line($x1,$y1,$x2,$y2,$color='red') { + $this->shape->SetColor($color); + $this->shape->Line($x1, $y1, $x2, $y2); + } + function Polygon($p,$color='blue') { + $this->shape->SetColor($color); + $this->shape->Polygon($p); + } + + function FilledPolygon($p,$color='lightblue') { + $this->shape->SetColor($color); + $this->shape->FilledPolygon($p); + } + + function Point($x,$y,$color) { + list($x1,$y1) = $this->scale->Translate($x, $y); + $this->shape->SetColor($color); + $this->g->img->Point($x1,$y1); + } + + function Stroke() { + $this->g->Stroke(); + } + +} + + +class PixelFill { + + private $edges,$dataPoints,$colors,$isoBars; + + function __construct(&$edges,&$dataPoints,$isoBars,$colors) { + $this->edges = $edges; + $this->dataPoints = $dataPoints; + $this->colors = $colors; + $this->isoBars = $isoBars; + } + + function GetIsobarColor($val) { + for ($i = 0 ; $i < count($this->isoBars) ; $i++) { + if( $val <= $this->isoBars[$i] ) { + return $this->colors[$i]; + } + } + return $this->colors[$i]; // The color for all values above the highest isobar + } + + function Fill(ContCanvas $canvas) { + + $nx_vertices = count($this->dataPoints[0]); + $ny_vertices = count($this->dataPoints); + + // Loop through all squares in the grid + for($col=0; $col < $nx_vertices-1; ++$col) { + for($row=0; $row < $ny_vertices-1; ++$row) { + + $v=array( + $this->dataPoints[$row][$col], + $this->dataPoints[$row][$col+1], + $this->dataPoints[$row+1][$col+1], + $this->dataPoints[$row+1][$col], + ); + + list($x1,$y1) = $canvas->scale->Translate($col, $row); + list($x2,$y2) = $canvas->scale->Translate($col+1, $row+1); + + for( $x=$x1; $x < $x2; ++$x ) { + for( $y=$y1; $y < $y2; ++$y ) { + + $v1 = $v[0] + ($v[1]-$v[0])*($x-$x1)/($x2-$x1); + $v2 = $v[3] + ($v[2]-$v[3])*($x-$x1)/($x2-$x1); + $val = $v1 + ($v2-$v1)*($y-$y1)/($y2-$y1); + + if( $row==2 && $col==2 ) { + //echo " ($val ($x,$y)) (".$v[0].",".$v[1].",".$v[2].",".$v[3].")
"; + } + $color = $this->GetIsobarColor($val); + $canvas->g->img->SetColor($color); + $canvas->g->img->Point($x, $y); + } + } + } + } + + } + +} + +$edges=array(array(),array(),array()); +$datapoints=array(); +for($col=0; $col<6; $col++) { + for($row=0; $row<6; $row++) { + $datapoints[$row][$col]=0; + $edges[VERT_EDGE][$row][$col] = false; + $edges[HORIZ_EDGE][$row][$col] = false; + } +} + +$datapoints[1][2] = 2; +$datapoints[2][1] = 1; +$datapoints[2][2] = 7; +$datapoints[2][3] = 2; +$datapoints[3][1] = 2; +$datapoints[3][2] = 17; +$datapoints[3][3] = 4; +$datapoints[4][2] = 3; + +$datapoints[1][4] = 12; + +$edges[VERT_EDGE][1][2] = true; +$edges[VERT_EDGE][3][2] = true; + +$edges[HORIZ_EDGE][2][1] = true; +$edges[HORIZ_EDGE][2][2] = true; +$edges[HORIZ_EDGE][3][1] = true; +$edges[HORIZ_EDGE][3][2] = true; + + + +$isobars = array(5,10,15); +$colors = array('lightgray','lightblue','lightred','red'); + +$engine = new PixelFill($edges, $datapoints, $isobars, $colors); +$canvas = new ContCanvas(); +$engine->Fill($canvas); +$canvas->SetDatapoints($datapoints); +$canvas->Stroke(); +die(); + + +//$tst = new Findpolygon(); +//$p1 = $tst->SetupTestData(); +// +//$canvas = new ContCanvas(); +//for ($i = 0 ; $i < count($tst->contourCoord); $i++) { +// $canvas->DrawLinePolygons($tst->contourCoord[$i]); +//} +// +//$p2 = $tst->FindPolygons(); +//for ($i = 0 ; $i < count($p2) ; $i++) { +// $canvas->FilledPolygon($tst->flattenEdges($p2[$i])); +//} +// +//for ($i = 0 ; $i < count($p2) ; $i++) { +// $canvas->Polygon($tst->flattenEdges($p2[$i])); +//} +// +//$canvas->Stroke(); +//die(); + + +//for( $trial = 0; $trial < 1; ++$trial ) { +// echo "\nTest $trial:\n"; +// echo "========================================\n"; +// $tst = new Findpolygon(); +// $p1 = $tst->SetupTestData(); +// +// // for ($i = 0 ; $i < count($p1) ; $i++) { +// // echo "Test polygon $i:\n"; +// // echo "---------------------\n"; +// // $tst->p_edges($tst->contourCoord[$i]); +// // echo "\n"; +// // } +// // +// $p2 = $tst->FindPolygons(); +// $npol = count($p2); +// //echo "\n** Found $npol separate polygon chains.\n\n"; +// +// for( $i=0; $i<$npol; ++$i ) { +// +// $res_forward = $tst->CompareCyclic($p1[$i], $p2[$i],true); +// $res_backward = $tst->CompareCyclic($p1[$i], $p2[$i],false); +// if( $res_backward || $res_forward ) { +// // if( $res_forward ) +// // echo "Forward matches!\n"; +// // else +// // echo "Backward matches!\n"; +// } +// else { +// echo "********** NO MATCH!!.\n\n"; +// echo "\nBefore find:\n"; +// for ($j = 0 ; $j < count($p1[$i]) ; $j++) { +// echo "(".$p1[$i][$j][0].','.$p1[$i][$j][1]."), "; +// } +// echo "\n"; +// +// echo "\nAfter find:\n"; +// for ($j = 0 ; $j < count($p2[$i]) ; $j++) { +// echo "(".$p2[$i][$j][0].','.$p2[$i][$j][1]."), "; +// } +// echo "\n"; +// } +// +// } +//} +// +//echo "\n\nAll tests ready.\n\n"; +// + + +?> diff --git a/libs/jpgraph/contour_dev/tri-quad.php b/libs/jpgraph/contour_dev/tri-quad.php new file mode 100644 index 0000000..7281f8e --- /dev/null +++ b/libs/jpgraph/contour_dev/tri-quad.php @@ -0,0 +1,790 @@ +g = new CanvasGraph($width,$height); + $this->scale = new CanvasScale($this->g, 0, $xmax, 0, $ymax); + $this->shape = new Shape($this->g, $this->scale); + + //$this->g->SetFrame(true); + $this->g->SetMargin(2,2,2,2); + $this->g->SetMarginColor('white@1'); + $this->g->InitFrame(); + } + + function StrokeGrid() { + list($xmin,$xmax,$ymin,$ymax) = $this->scale->Get(); + $this->shape->SetColor('gray'); + for( $col=1; $col<$xmax; ++$col ) { + $this->shape->Line($col, 0, $col, $ymax); + } + for( $row=1; $row<$ymax; ++$row ) { + $this->shape->Line(0, $row, $xmax, $row); + } + } + + function SetDatapoints($datapoints) { + $ny=count($datapoints); + $nx=count($datapoints[0]); + $t = new Text(); + $t->SetFont(FF_ARIAL,FS_NORMAL,8); + for( $x=0; $x < $nx; ++$x ) { + for( $y=0; $y < $ny; ++$y ) { + list($x1,$y1) = $this->scale->Translate($x,$y); + + if( $datapoints[$y][$x] > 0 ) + $t->SetColor('blue'); + else + $t->SetColor('black'); + $t->SetFont(FF_ARIAL,FS_BOLD,8); + $t->Set($datapoints[$y][$x]); + $t->Stroke($this->g->img,$x1,$y1); + + $t->SetColor('gray'); + $t->SetFont(FF_ARIAL,FS_NORMAL,8); + $t->Set("($y,$x)"); + $t->Stroke($this->g->img,$x1+10,$y1); + + } + } + } + + function DrawLinePolygons($p,$color='red') { + $this->shape->SetColor($color); + for ($i = 0 ; $i < count($p) ; $i++) { + $x1 = $p[$i][0][0]; $y1 = $p[$i][0][1]; + for ($j = 1 ; $j < count($p[$i]) ; $j++) { + $x2=$p[$i][$j][0]; $y2 = $p[$i][$j][1]; + $this->shape->Line($x1, $y1, $x2, $y2); + $x1=$x2; $y1=$y2; + } + } + } + + function Line($x1,$y1,$x2,$y2,$color='red') { + $this->shape->SetColor($color); + $this->shape->Line($x1, $y1, $x2, $y2); + } + function Polygon($p,$color='blue') { + $this->shape->SetColor($color); + $this->shape->Polygon($p); + } + + function FilledPolygon($p,$color='lightblue') { + $this->shape->SetColor($color); + $this->shape->FilledPolygon($p); + } + + function Point($x,$y,$color) { + list($x1,$y1) = $this->scale->Translate($x, $y); + $this->shape->SetColor($color); + $this->g->img->Point($x1,$y1); + } + + function Stroke() { + $this->g->Stroke(); + } + +} + +// Calculate the area for a simple polygon. This will not work for +// non-simple polygons, i.e. self crossing. +function polygonArea($aX, $aY) { + $n = count($aX); + $area = 0 ; + $j = 0 ; + for ($i=0; $i < $n; $i++) { + $j++; + if ( $j == $n) { + $j=0; + } + $area += ($aX[i]+$aX[j])*($aY[i]-$aY[j]); + } + return area*.5; +} + +class SingleTestTriangle { + const contval=5; + static $maxdepth=2; + static $cnt=0; + static $t; + public $g; + public $shape,$scale; + public $cont = array(2,4,5); + public $contcolors = array('yellow','purple','seagreen','green','lightblue','blue','teal','orange','red','darkred','brown'); + public $dofill=false; + public $showtriangulation=false,$triangulation_color="lightgray"; + public $showannotation=false; + public $contlinecolor='black',$showcontlines=true; + private $labels = array(), $showlabels=false; + private $labelColor='black',$labelFF=FF_ARIAL,$labelFS=FS_BOLD,$labelFSize=9; + + function __construct($width,$height,$nx,$ny) { + $xmax=$nx+0.1;$ymax=$ny+0.1; + $this->g = new CanvasGraph($width,$height); + $this->scale = new CanvasScale($this->g, -0.1, $xmax, -0.1, $ymax); + $this->shape = new Shape($this->g, $this->scale); + + //$this->g->SetFrame(true); + $this->g->SetMargin(2,2,2,2); + $this->g->SetMarginColor('white@1'); + //$this->g->InitFrame(); + + self::$t = new Text(); + self::$t->SetColor('black'); + self::$t->SetFont(FF_ARIAL,FS_BOLD,9); + self::$t->SetAlign('center','center'); + } + + function getPlotSize() { + return array($this->g->img->width,$this->g->img->height); + } + + function SetContours($c) { + $this->cont = $c; + } + + function ShowLabels($aFlg=true) { + $this->showlabels = $aFlg; + } + + function ShowLines($aFlg=true) { + $this->showcontlines=$aFlg; + } + + function SetFilled($f=true) { + $this->dofill = $f; + } + + function ShowTriangulation($f=true) { + $this->showtriangulation = $f; + } + + function Stroke() { + $this->g->Stroke(); + } + + function FillPolygon($color,&$p) { + self::$cnt++; + if( $this->dofill ) { + $this->shape->SetColor($color); + $this->shape->FilledPolygon($p); + } + if( $this->showtriangulation ) { + $this->shape->SetColor($this->triangulation_color); + $this->shape->Polygon($p); + } + } + + function GetNextHigherContourIdx($val) { + for( $i=0; $i < count($this->cont); ++$i ) { + if( $val < $this->cont[$i] ) return $i; + } + return count($this->cont); + } + + function GetContVal($v1) { + for( $i=0; $i < count($this->cont); ++$i ) { + if( $this->cont[$i] > $v1 ) { + return $this->cont[$i]; + } + } + die('No contour value is larger or equal than : '.$v1); + } + + function GetColor($v) { + return $this->contcolors[$this->GetNextHigherContourIdx($v)]; + } + + function storeAnnotation($x1,$y1,$v1,$angle) { + $this->labels[$this->GetNextHigherContourIdx($v1)][] = array($x1,$y1,$v1,$angle); + } + + function labelProx($x1,$y1,$v1) { + + list($w,$h) = $this->getPlotSize(); + + + if( $x1 < 20 || $x1 > $w-20 ) + return true; + + if( $y1 < 20 || $y1 > $h-20 ) + return true; + + if( !isset ($this->labels[$this->GetNextHigherContourIdx($v1)]) ) { + return false; + } + $p = $this->labels[$this->GetNextHigherContourIdx($v1)]; + $n = count($p); + $d = 999999; + for ($i = 0 ; $i < $n ; $i++) { + $xp = $p[$i][0]; + $yp = $p[$i][1]; + $d = min($d, ($x1-$xp)*($x1-$xp) + ($y1-$yp)*($y1-$yp)); + } + + $limit = $w*$h/9; + $limit = max(min($limit,20000),3500); + if( $d < $limit ) return true; + else return false; + } + + function putLabel($x1,$y1,$x2,$y2,$v1) { + + $angle = 0; + if( $x2 - $x1 != 0 ) { + $grad = ($y2-$y1)/($x2-$x1); + $angle = -(atan($grad) * 180/M_PI); + self::$t->SetAngle($angle); + } + + $x = $this->scale->TranslateX($x1); + $y = $this->scale->TranslateY($y1); + if( !$this->labelProx($x, $y, $v1) ) { + $this->storeAnnotation($x, $y, $v1, $angle); + } + } + + function strokeLabels() { + $t = new Text(); + $t->SetColor($this->labelColor); + $t->SetFont($this->labelFF,$this->labelFS,$this->labelFSize); + $t->SetAlign('center','center'); + + foreach ($this->labels as $cont_idx => $pos) { + if( $cont_idx >= 10 ) return; + foreach ($pos as $idx => $coord) { + $t->Set( sprintf("%.1f",$coord[2]) ); + $t->SetAngle($coord[3]); + $t->Stroke($this->g->img,$coord[0],$coord[1]); + } + } + } + + function annotate($x1,$y1,$x2,$y2,$x1p,$y1p,$v1,$v2,$v1p) { + if( !$this->showannotation ) return; + /* + $this->g->img->SetColor('green'); + $this->g->img->FilledCircle($this->scale->TranslateX($x1),$this->scale->TranslateY($y1), 4); + $this->g->img->FilledCircle($this->scale->TranslateX($x2),$this->scale->TranslateY($y2), 4); + + $this->g->img->SetColor('red'); + $this->g->img->FilledCircle($this->scale->TranslateX($x1p),$this->scale->TranslateY($y1p), 4); +*/ + //self::$t->Set(sprintf("%.1f",$v1,$this->VC($v1))); + //self::$t->Stroke($this->g->img,$this->scale->TranslateX($x1),$this->scale->TranslateY($y1)); + //self::$t->Set(sprintf("%.1f",$v2,$this->VC($v2))); + //self::$t->Stroke($this->g->img,$this->scale->TranslateX($x2),$this->scale->TranslateY($y2)); + + $x = $this->scale->TranslateX($x1p); + $y = $this->scale->TranslateY($y1p); + if( !$this->labelProx($x, $y, $v1p) ) { + $this->storeAnnotation($x, $y, $v1p); + self::$t->Set(sprintf("%.1f",$v1p,$this->VC($v1p))); + self::$t->Stroke($this->g->img,$x,$y); + } + } + + function Pertubate(&$v1,&$v2,&$v3,&$v4) { + $pert = 0.9999; + $n = count($this->cont); + for($i=0; $i < $n; ++$i) { + if( $v1==$this->cont[$i] ) { + $v1 *= $pert; + break; + } + } + for($i=0; $i < $n; ++$i) { + if( $v2==$this->cont[$i] ) { + $v2 *= $pert; + break; + } + } + for($i=0; $i < $n; ++$i) { + if( $v3==$this->cont[$i] ) { + $v3 *= $pert; + break; + } + } + for($i=0; $i < $n; ++$i) { + if( $v4==$this->cont[$i] ) { + $v4 *= $pert; + break; + } + } + } + + function interp2($x1,$y1,$x2,$y2,$v1,$v2) { + $cv = $this->GetContVal(min($v1,$v2)); + $alpha = ($v1-$cv)/($v1-$v2); + $x1p = $x1*(1-$alpha) + $x2*$alpha; + $y1p = $y1*(1-$alpha) + $y2*$alpha; + $v1p = $v1 + $alpha*($v2-$v1); + return array($x1p,$y1p,$v1p); + } + + function RectFill($v1,$v2,$v3,$v4,$x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4,$depth) { + if( $depth >= self::$maxdepth ) { + // Abort and just appoximate the color of this area + // with the average of the three values + $color = $this->GetColor(($v1+$v2+$v3+$v4)/4); + $p = array($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $x1, $y1); + $this->FillPolygon($color,$p) ; + } + else { + + $this->Pertubate($v1,$v2,$v3,$v4); + + $fcnt = 0 ; + $vv1 = $this->GetNextHigherContourIdx($v1); + $vv2 = $this->GetNextHigherContourIdx($v2); + $vv3 = $this->GetNextHigherContourIdx($v3); + $vv4 = $this->GetNextHigherContourIdx($v4); + $eps = 0.0001; + + if( $vv1 == $vv2 && $vv2 == $vv3 && $vv3 == $vv4 ) { + $color = $this->GetColor($v1); + $p = array($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $x1, $y1); + $this->FillPolygon($color,$p) ; + } + else { + + $dv1 = abs($vv1-$vv2); + $dv2 = abs($vv2-$vv3); + $dv3 = abs($vv3-$vv4); + $dv4 = abs($vv1-$vv4); + + if( $dv1 == 1 ) { + list($x1p,$y1p,$v1p) = $this->interp2($x1,$y1,$x2,$y2,$v1,$v2); + $fcnt++; + } + + if( $dv2 == 1 ) { + list($x2p,$y2p,$v2p) = $this->interp2($x2,$y2,$x3,$y3,$v2,$v3); + $fcnt++; + } + + if( $dv3 == 1 ) { + list($x3p,$y3p,$v3p) = $this->interp2($x3,$y3,$x4,$y4,$v3,$v4); + $fcnt++; + } + + if( $dv4 == 1 ) { + list($x4p,$y4p,$v4p) = $this->interp2($x4,$y4,$x1,$y1,$v4,$v1); + $fcnt++; + } + + $totdv = $dv1 + $dv2 + $dv3 + $dv4 ; + + if( ($fcnt == 2 && $totdv==2) || ($fcnt == 4 && $totdv==4) ) { + + if( $fcnt == 2 && $totdv==2 ) { + + if( $dv1 == 1 && $dv2 == 1) { + $color1 = $this->GetColor($v2); + $p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p); + $color2 = $this->GetColor($v4); + $p2 = array($x1,$y1,$x1p,$y1p,$x2p,$y2p,$x3,$y3,$x4,$y4,$x1,$y1); + + $color = $this->GetColor($v1p); + $p = array($x1p,$y1p,$x2p,$y2p); + $v = $v1p; + } + elseif( $dv1 == 1 && $dv3 == 1 ) { + $color1 = $this->GetColor($v2); + $p1 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x3p,$y3p,$x1p,$y1p); + $color2 = $this->GetColor($v4); + $p2 = array($x1,$y1,$x1p,$y1p,$x3p,$y3p,$x4,$y4,$x1,$y1); + + $color = $this->GetColor($v1p); + $p = array($x1p,$y1p,$x3p,$y3p); + $v = $v1p; + } + elseif( $dv1 == 1 && $dv4 == 1 ) { + $color1 = $this->GetColor($v1); + $p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1); + $color2 = $this->GetColor($v3); + $p2 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x4,$y4,$x4p,$y4p,$x1p,$y1p); + + $color = $this->GetColor($v1p); + $p = array($x1p,$y1p,$x4p,$y4p); + $v = $v1p; + } + elseif( $dv2 == 1 && $dv4 == 1 ) { + $color1 = $this->GetColor($v1); + $p1 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x4p,$y4p,$x1,$y1); + $color2 = $this->GetColor($v3); + $p2 = array($x4p,$y4p,$x2p,$y2p,$x3,$y3,$x4,$y4,$x4p,$y4p); + + $color = $this->GetColor($v2p); + $p = array($x2p,$y2p,$x4p,$y4p); + $v = $v2p; + } + elseif( $dv2 == 1 && $dv3 == 1 ) { + $color1 = $this->GetColor($v1); + $p1 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x1,$y1); + $color2 = $this->GetColor($v3); + $p2 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p); + + $color = $this->GetColor($v2p); + $p = array($x2p,$y2p,$x3p,$y3p); + $v = $v2p; + } + elseif( $dv3 == 1 && $dv4 == 1 ) { + $color1 = $this->GetColor($v1); + $p1 = array($x1,$y1,$x2,$y2,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1); + $color2 = $this->GetColor($v4); + $p2 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p); + + $color = $this->GetColor($v4p); + $p = array($x4p,$y4p,$x3p,$y3p); + $v = $v4p; + } + + $this->FillPolygon($color1,$p1); + $this->FillPolygon($color2,$p2); + + if( $this->showcontlines ) { + if( $this->dofill ) { + $this->shape->SetColor($this->contlinecolor); + } + else { + $this->shape->SetColor($color); + } + $this->shape->Line($p[0],$p[1],$p[2],$p[3]); + } + if( $this->showlabels ) { + $this->putLabel( ($p[0]+$p[2])/2, ($p[1]+$p[3])/2, $p[2],$p[3] , $v); + } + } + elseif( $fcnt == 4 && $totdv==4 ) { + $vc = ($v1+$v2+$v3+$v4)/4; + + if( $v1p == $v2p && $v2p == $v3p && $v3p == $v4p ) { + // Four edge crossings (saddle point) of the same contour + // so we first need to + // find out how the saddle is crossing "/" or "\" + + if( $this->GetNextHigherContourIdx($vc) == $this->GetNextHigherContourIdx($v1) ) { + // "\" + $color1 = $this->GetColor($v1); + $p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1); + + $color2 = $this->GetColor($v2); + $p2 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x4p,$y4p,$x1p,$y1p); + + $color3 = $color1; + $p3 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p); + + $colorl1 = $this->GetColor($v1p); + $pl1 = array($x1p,$y1p,$x4p,$y4p); + $colorl2 = $this->GetColor($v2p); + $pl2 = array($x2p,$y2p,$x3p,$y3p); + $vl1 = $v1p; $vl2 = $v2p; + + } + else { + // "/" + $color1 = $this->GetColor($v2); + $p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p); + + $color2 = $this->GetColor($v3); + $p2 = array($x1p,$y1p,$x2p,$y2p,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1,$x1p,$y1p); + + $color3 = $color1; + $p3 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p); + + $colorl1 = $this->GetColor($v1p); + $pl1 = array($x1p,$y1p,$x2p,$y2p); + $colorl2 = $this->GetColor($v4p); + $pl2 = array($x4p,$y4p,$x3p,$y3p); + $vl1 = $v1p; $vl2 = $v4p; + } + } + else { + // There are two different contours crossing so we need to find + // out which belongs to which + if( $v1p == $v2p ) { + // "/" + $color1 = $this->GetColor($v2); + $p1 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p); + + $color2 = $this->GetColor($v3); + $p2 = array($x1p,$y1p,$x2p,$y2p,$x3,$y3,$x3p,$y3p,$x4p,$y4p,$x1,$y1,$x1p,$y1p); + + $color3 = $this->GetColor($v4); + $p3 = array($x4p,$y4p,$x3p,$y3p,$x4,$y4,$x4p,$y4p); + + $colorl1 = $this->GetColor($v1p); + $pl1 = array($x1p,$y1p,$x2p,$y2p); + $colorl2 = $this->GetColor($v4p); + $pl2 = array($x4p,$y4p,$x3p,$y3p); + $vl1 = $v1p; $vl2 = $v4p; + } + else { //( $v1p == $v4p ) + // "\" + $color1 = $this->GetColor($v1); + $p1 = array($x1,$y1,$x1p,$y1p,$x4p,$y4p,$x1,$y1); + + $color2 = $this->GetColor($v2); + $p2 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x4,$y4,$x4p,$y4p,$x1p,$y1p); + + $color3 = $this->GetColor($v3); + $p3 = array($x2p,$y2p,$x3,$y3,$x3p,$y3p,$x2p,$y2p); + + $colorl1 = $this->GetColor($v1p); + $pl1 = array($x1p,$y1p,$x4p,$y4p); + $colorl2 = $this->GetColor($v2p); + $pl2 = array($x2p,$y2p,$x3p,$y3p); + $vl1 = $v1p; $vl2 = $v2p; + } + } + $this->FillPolygon($color1,$p1); + $this->FillPolygon($color2,$p2); + $this->FillPolygon($color3,$p3); + + if( $this->showcontlines ) { + if( $this->dofill ) { + $this->shape->SetColor($this->contlinecolor); + $this->shape->Line($pl1[0],$pl1[1],$pl1[2],$pl1[3]); + $this->shape->Line($pl2[0],$pl2[1],$pl2[2],$pl2[3]); + } + else { + $this->shape->SetColor($colorl1); + $this->shape->Line($pl1[0],$pl1[1],$pl1[2],$pl1[3]); + $this->shape->SetColor($colorl2); + $this->shape->Line($pl2[0],$pl2[1],$pl2[2],$pl2[3]); + } + } + if( $this->showlabels ) { + $this->putLabel( ($pl1[0]+$pl1[2])/2, ($pl1[1]+$pl1[3])/2, $pl1[2], $pl1[3], $vl1); + $this->putLabel( ($pl2[0]+$pl2[2])/2, ($pl2[1]+$pl2[3])/2, $pl2[2], $pl2[3],$vl2); + } + } + } + else { + $vc = ($v1+$v2+$v3+$v4)/4; + $xc = ($x1+$x4)/2; + $yc = ($y1+$y2)/2; + + // Top left + $this->RectFill(($v1+$v2)/2, $v2, ($v2+$v3)/2, $vc, + $x1,$yc, $x2,$y2, $xc,$y2, $xc,$yc, $depth+1); + // Top right + $this->RectFill($vc, ($v2+$v3)/2, $v3, ($v3+$v4)/2, + $xc,$yc, $xc,$y2, $x3,$y3, $x3,$yc, $depth+1); + + // Bottom left + $this->RectFill($v1, ($v1+$v2)/2, $vc, ($v1+$v4)/2, + $x1,$y1, $x1,$yc, $xc,$yc, $xc,$y4, $depth+1); + + // Bottom right + $this->RectFill(($v1+$v4)/2, $vc, ($v3+$v4)/2, $v4, + $xc,$y1, $xc,$yc, $x3,$yc, $x4,$y4, $depth+1); + + } + } + } + } + + function TriFill($v1,$v2,$v3,$x1,$y1,$x2,$y2,$x3,$y3,$depth) { + if( $depth >= self::$maxdepth ) { + // Abort and just appoximate the color of this area + // with the average of the three values + $color = $this->GetColor(($v1+$v2+$v3)/3); + $p = array($x1, $y1, $x2, $y2, $x3, $y3, $x1, $y1); + $this->FillPolygon($color,$p) ; + } + else { + // In order to avoid some real unpleasentness in case a vertice is exactly + // the same value as a contour we pertuberate them so that we do not end up + // in udefined situation. This will only affect the calculations and not the + // visual appearance + + $dummy=0; + $this->Pertubate($v1,$v2,$v3,$dummy); + + $fcnt = 0 ; + $vv1 = $this->GetNextHigherContourIdx($v1); + $vv2 = $this->GetNextHigherContourIdx($v2); + $vv3 = $this->GetNextHigherContourIdx($v3); + $eps = 0.0001; + + if( $vv1 == $vv2 && $vv2 == $vv3 ) { + $color = $this->GetColor($v1); + $p = array($x1, $y1, $x2, $y2, $x3, $y3, $x1, $y1); + $this->FillPolygon($color,$p) ; + } + else { + $dv1 = abs($vv1-$vv2); + $dv2 = abs($vv2-$vv3); + $dv3 = abs($vv1-$vv3); + + if( $dv1 == 1 ) { + list($x1p,$y1p,$v1p) = $this->interp2($x1,$y1,$x2,$y2,$v1,$v2); + $fcnt++; + } + else { + $x1p = ($x1+$x2)/2; + $y1p = ($y1+$y2)/2; + $v1p = ($v1+$v2)/2; + } + + if( $dv2 == 1 ) { + list($x2p,$y2p,$v2p) = $this->interp2($x2,$y2,$x3,$y3,$v2,$v3); + $fcnt++; + } + else { + $x2p = ($x2+$x3)/2; + $y2p = ($y2+$y3)/2; + $v2p = ($v2+$v3)/2; + } + + if( $dv3 == 1 ) { + list($x3p,$y3p,$v3p) = $this->interp2($x3,$y3,$x1,$y1,$v3,$v1); + $fcnt++; + } + else { + $x3p = ($x3+$x1)/2; + $y3p = ($y3+$y1)/2; + $v3p = ($v3+$v1)/2; + } + + if( $fcnt == 2 && + ((abs($v1p-$v2p) < $eps && $dv1 ==1 && $dv2==1 ) || + (abs($v1p-$v3p) < $eps && $dv1 ==1 && $dv3==1 ) || + (abs($v2p-$v3p) < $eps && $dv2 ==1 && $dv3==1 )) ) { + + // This means that the contour line crosses exactly two sides + // and that the values of each vertice is such that only this + // contour line will cross this section. + // We can now be smart. The cotour line will simply divide the + // area in two polygons that we can fill and then return. There is no + // need to recurse. + + // First find out which two sides the contour is crossing + if( abs($v1p-$v2p) < $eps ) { + $p4 = array($x1,$y1,$x1p,$y1p,$x2p,$y2p,$x3,$y3,$x1,$y1); + $color4 = $this->GetColor($v1); + + $p3 = array($x1p,$y1p,$x2,$y2,$x2p,$y2p,$x1p,$y1p); + $color3 = $this->GetColor($v2); + + $p = array($x1p,$y1p,$x2p,$y2p); + $color = $this->GetColor($v1p); + $v = $v1p; + } + elseif( abs($v1p-$v3p) < $eps ) { + $p4 = array($x1p,$y1p,$x2,$y2,$x3,$y3,$x3p,$y3p,$x1p,$y1p); + $color4 = $this->GetColor($v2); + + $p3 = array($x1,$y1,$x1p,$y1p,$x3p,$y3p,$x1,$y1); + $color3 = $this->GetColor($v1); + + $p = array($x1p,$y1p,$x3p,$y3p); + $color = $this->GetColor($v1p); + $v = $v1p; + } + else { + $p4 = array($x1,$y1,$x2,$y2,$x2p,$y2p,$x3p,$y3p,$x1,$y1); + $color4 = $this->GetColor($v2); + + $p3 = array($x3p,$y3p,$x2p,$y2p,$x3,$y3,$x3p,$y3p); + $color3 = $this->GetColor($v3); + + $p = array($x3p,$y3p,$x2p,$y2p); + $color = $this->GetColor($v3p); + $v = $v3p; + } + $this->FillPolygon($color4,$p4); + $this->FillPolygon($color3,$p3); + + if( $this->showcontlines ) { + if( $this->dofill ) { + $this->shape->SetColor($this->contlinecolor); + } + else { + $this->shape->SetColor($color); + } + $this->shape->Line($p[0],$p[1],$p[2],$p[3]); + } + if( $this->showlabels ) { + $this->putLabel( ($p[0]+$p[2])/2, ($p[1]+$p[3])/2, $p[2], $p[3], $v); + } + } + else { + $this->TriFill($v1, $v1p, $v3p, $x1, $y1, $x1p, $y1p, $x3p, $y3p, $depth+1); + $this->TriFill($v1p, $v2, $v2p, $x1p, $y1p, $x2, $y2, $x2p, $y2p, $depth+1); + $this->TriFill($v3p, $v1p, $v2p, $x3p, $y3p, $x1p, $y1p, $x2p, $y2p, $depth+1); + $this->TriFill($v3p, $v2p, $v3, $x3p, $y3p, $x2p, $y2p, $x3, $y3, $depth+1); + } + } + } + } + + function Fill($v1,$v2,$v3,$maxdepth) { + $x1=0; $y1=1; + $x2=1; $y2=0; + $x3=1; $y3=1; + self::$maxdepth = $maxdepth; + $this->TriFill($v1, $v2, $v3, $x1, $y1, $x2, $y2, $x3, $y3, 0); + } + + function Fillmesh($meshdata,$maxdepth,$method='tri') { + $nx = count($meshdata[0]); + $ny = count($meshdata); + self::$maxdepth = $maxdepth; + for( $x=0; $x < $nx-1; ++$x ) { + for( $y=0; $y < $ny-1; ++$y ) { + $v1 = $meshdata[$y][$x]; + $v2 = $meshdata[$y][$x+1]; + $v3 = $meshdata[$y+1][$x+1]; + $v4 = $meshdata[$y+1][$x]; + + if( $method == 'tri' ) { + // Fill upper and lower triangle + $this->TriFill($v4, $v1, $v2, $x, $y+1, $x, $y, $x+1, $y, 0); + $this->TriFill($v4, $v2, $v3, $x, $y+1, $x+1, $y, $x+1, $y+1, 0); + } + else { + $this->RectFill($v4, $v1, $v2, $v3, $x, $y+1, $x, $y, $x+1, $y, $x+1, $y+1, 0); + } + } + } + if( $this->showlabels ) { + $this->strokeLabels(); + } + } +} + +$meshdata = array( + array (12,12,10,10), + array (10,10,8,14), + array (7,7,13,17), + array (4,5,8,12), + array (10,8,7,8)); + +$tt = new SingleTestTriangle(400,400,count($meshdata[0])-1,count($meshdata)-1); +$tt->SetContours(array(4.7, 6.0, 7.2, 8.6, 9.9, 11.2, 12.5, 13.8, 15.1, 16.4)); +$tt->SetFilled(true); + +//$tt->ShowTriangulation(true); +$tt->ShowLines(true); + +//$tt->ShowLabels(true); +$tt->Fillmesh($meshdata, 8, 'rect'); + +//$tt->Fill(4.0,3.0,7.0, 4); +//$tt->Fill(7,4,1,5); +//$tt->Fill(1,7,4,5); + +$tt->Stroke(); + +?> diff --git a/libs/jpgraph/flag_mapping b/libs/jpgraph/flag_mapping new file mode 100644 index 0000000..7f9c3c5 --- /dev/null +++ b/libs/jpgraph/flag_mapping @@ -0,0 +1,237 @@ +class JpCountryFlags { + +$iCountryFlags = array( + 'Afghanistan' => 'afgh.gif', + 'Republic of Angola' => 'agla.gif', + 'Republic of Albania' => 'alba.gif', + 'Alderney' => 'alde.gif', + 'Democratic and Popular Republic of Algeria' => 'alge.gif', + 'Territory of American Samoa' => 'amsa.gif', + 'Principality of Andorra' => 'andr.gif', + 'British Overseas Territory of Anguilla' => 'angu.gif', + 'Antarctica' => 'anta.gif', + 'Argentine Republic' => 'arge.gif', + 'League of Arab States' => 'arle.gif', + 'Republic of Armenia' => 'arme.gif', + 'Aruba' => 'arub.gif', + 'Commonwealth of Australia' => 'astl.gif', + 'Republic of Austria' => 'aust.gif', + 'Azerbaijani Republic' => 'azer.gif', + 'British Antarctic Territory' => 'bant.gif', + 'Kingdom of Belgium' => 'belg.gif', + 'British Overseas Territory of Bermuda' => 'berm.gif', + 'Commonwealth of the Bahamas' => 'bhms.gif', + 'Kingdom of Bahrain' => 'bhrn.gif', + 'Republic of Belarus' => 'blru.gif', + 'Republic of Bolivia' => 'blva.gif', + 'Belize' => 'blze.gif', + 'Republic of Benin' => 'bnin.gif', + 'Republic of Botswana' => 'bots.gif', + 'Federative Republic of Brazil' => 'braz.gif', + 'Barbados' => 'brbd.gif', + 'British Indian Ocean Territory' => 'brin.gif', + 'Brunei Darussalam' => 'brun.gif', + 'Republic of Burkina' => 'bufa.gif', + 'Republic of Bulgaria' => 'bulg.gif', + 'Republic of Burundi' => 'buru.gif', + 'Overseas Territory of the British Virgin Islands' => 'bvis.gif', + 'Central African Republic' => 'cafr.gif', + 'Kingdom of Cambodia' => 'camb.gif', + 'Republic of Cameroon' => 'came.gif', + 'Dominion of Canada' => 'cana.gif', + 'Caribbean Community' => 'cari.gif', + 'Republic of Cape Verde' => 'cave.gif', + 'Republic of Chad' => 'chad.gif', + 'Republic of Chile' => 'chil.gif', + 'Territory of Christmas Island' => 'chms.gif', + 'Commonwealth of Independent States' => 'cins.gif', + 'Cook Islands' => 'ckis.gif', + 'Republic of Colombia' => 'clmb.gif', + 'Territory of Cocos Islands' => 'cois.gif', + 'Commonwealth' => 'comn.gif', + 'Union of the Comoros' => 'como.gif', + 'Republic of the Congo' => 'cong.gif', + 'Republic of Costa Rica' => 'corc.gif', + 'Republic of Croatia' => 'croa.gif', + 'Republic of Cuba' => 'cuba.gif', + 'British Overseas Territory of the Cayman Islands' => 'cyis.gif', + 'Republic of Cyprus' => 'cypr.gif', + 'The Czech Republic' => 'czec.gif', + 'Kingdom of Denmark' => 'denm.gif', + 'Republic of Djibouti' => 'djib.gif', + 'Commonwealth of Dominica' => 'domn.gif', + 'Dominican Republic' => 'dore.gif', + 'Republic of Ecuador' => 'ecua.gif', + 'Arab Republic of Egypt' => 'egyp.gif', + 'Republic of El Salvador' => 'elsa.gif', + 'England' => 'engl.gif', + 'Republic of Equatorial Guinea' => 'eqgu.gif', + 'State of Eritrea' => 'erit.gif', + 'Republic of Estonia' => 'estn.gif', + 'Ethiopia' => 'ethp.gif', + 'European Union' => 'euun.gif', + 'British Overseas Territory of the Falkland Islands' => 'fais.gif', + 'International Federation of Vexillological Associations' => 'fiav.gif', + 'Republic of Fiji' => 'fiji.gif', + 'Republic of Finland' => 'finl.gif', + 'Territory of French Polynesia' => 'fpol.gif', + 'French Republic' => 'fran.gif', + 'Overseas Department of French Guiana' => 'frgu.gif', + 'Gabonese Republic' => 'gabn.gif', + 'Republic of the Gambia' => 'gamb.gif', + 'Republic of Georgia' => 'geor.gif', + 'Federal Republic of Germany' => 'germ.gif', + 'Republic of Ghana' => 'ghan.gif', + 'Gibraltar' => 'gibr.gif', + 'Hellenic Republic' => 'grec.gif', + 'State of Grenada' => 'gren.gif', + 'Overseas Department of Guadeloupe' => 'guad.gif', + 'Territory of Guam' => 'guam.gif', + 'Republic of Guatemala' => 'guat.gif', + 'The Bailiwick of Guernsey' => 'guer.gif', + 'Republic of Guinea' => 'guin.gif', + 'Republic of Haiti' => 'hait.gif', + 'Hong Kong Special Administrative Region' => 'hokn.gif', + 'Republic of Honduras' => 'hond.gif', + 'Republic of Hungary' => 'hung.gif', + 'Republic of Iceland' => 'icel.gif', + 'International Committee of the Red Cross' => 'icrc.gif', + 'Republic of India' => 'inda.gif', + 'Republic of Indonesia' => 'indn.gif', + 'Republic of Iraq' => 'iraq.gif', + 'Republic of Ireland' => 'irel.gif', + 'Organization of the Islamic Conference' => 'isco.gif', + 'Isle of Man' => 'isma.gif', + 'State of Israel' => 'isra.gif', + 'Italian Republic' => 'ital.gif', + 'Jamaica' => 'jama.gif', + 'Japan' => 'japa.gif', + 'The Bailiwick of Jersey' => 'jers.gif', + 'Hashemite Kingdom of Jordan' => 'jord.gif', + 'Republic of Kazakhstan' => 'kazk.gif', + 'Republic of Kenya' => 'keny.gif', + 'Republic of Kiribati' => 'kirb.gif', + 'State of Kuwait' => 'kuwa.gif', + 'Kyrgyz Republic' => 'kyrg.gif', + 'Republic of Latvia' => 'latv.gif', + 'Lebanese Republic' => 'leba.gif', + 'Kingdom of Lesotho' => 'lest.gif', + 'Republic of Liberia' => 'libe.gif', + 'Principality of Liechtenstein' => 'liec.gif', + 'Republic of Lithuania' => 'lith.gif', + 'Grand Duchy of Luxembourg' => 'luxe.gif', + 'Macao Special Administrative Region' => 'maca.gif', + 'Republic of Macedonia' => 'mace.gif', + 'Republic of Madagascar' => 'mada.gif', + 'Republic of the Marshall Islands' => 'mais.gif', + 'Republic of Maldives' => 'mald.gif', + 'Republic of Mali' => 'mali.gif', + 'Federation of Malaysia' => 'mals018.gif', + 'Republic of Malta' => 'malt.gif', + 'Republic of Malawi' => 'malw.gif', + 'Overseas Department of Martinique' => 'mart.gif', + 'Islamic Republic of Mauritania' => 'maur.gif', + 'Territorial Collectivity of Mayotte' => 'mayt.gif', + 'United Mexican States' => 'mexc.gif', + 'Federated States of Micronesia' => 'micr.gif', + 'Midway Islands' => 'miis.gif', + 'Republic of Moldova' => 'mold.gif', + 'Principality of Monaco' => 'mona.gif', + 'Republic of Mongolia' => 'mong.gif', + 'British Overseas Territory of Montserrat' => 'mont.gif', + 'Kingdom of Morocco' => 'morc.gif', + 'Republic of Mozambique' => 'moza.gif', + 'Republic of Mauritius' => 'mrts.gif', + 'Union of Myanmar' => 'myan.gif', + 'Republic of Namibia' => 'namb.gif', + 'North Atlantic Treaty Organization' => 'nato.gif', + 'Republic of Nauru' => 'naur.gif', + 'Turkish Republic of Northern Cyprus' => 'ncyp.gif', + 'Netherlands Antilles' => 'nean.gif', + 'Kingdom of Nepal' => 'nepa.gif', + 'Kingdom of the Netherlands' => 'neth.gif', + 'Territory of Norfolk Island' => 'nfis.gif', + 'Federal Republic of Nigeria' => 'ngra.gif', + 'Republic of Nicaragua' => 'nica.gif', + 'Republic of Niger' => 'nigr.gif', + 'Niue' => 'niue.gif', + 'Commonwealth of the Northern Mariana Islands' => 'nmar.gif', + 'Province of Northern Ireland' => 'noir.gif', + 'Nordic Council' => 'nord.gif', + 'Kingdom of Norway' => 'norw.gif', + 'Territory of New Caledonia and Dependencies' => 'nwca.gif', + 'New Zealand' => 'nwze.gif', + 'Organization of American States' => 'oast.gif', + 'Organization of African Unity' => 'oaun.gif', + 'International Olympic Committee' => 'olym.gif', + 'Sultanate of Oman' => 'oman.gif', + 'Organization of Petroleum Exporting Countries' => 'opec.gif', + 'Islamic Republic of Pakistan' => 'paks.gif', + 'Republic of Palau' => 'pala.gif', + 'Independent State of Papua New Guinea' => 'pang.gif', + 'Republic of Paraguay' => 'para.gif', + 'Republic of the Philippines' => 'phil.gif', + 'British Overseas Territory of the Pitcairn Islands' => 'piis.gif', + 'Republic of Poland' => 'pola.gif', + 'Republic of Portugal' => 'port.gif', + 'Commonwealth of Puerto Rico' => 'purc.gif', + 'State of Qatar' => 'qata.gif', + 'Russian Federation' => 'russ.gif', + 'Republic of Rwanda' => 'rwan.gif', + 'Kingdom of Saudi Arabia' => 'saar.gif', + 'Republic of San Marino' => 'sama.gif', + 'Nordic Sami Conference' => 'sami.gif', + 'Sark' => 'sark.gif', + 'Scotland' => 'scot.gif', + 'Principality of Seborga' => 'sebo.gif', + 'Republic of Sierra Leone' => 'sile.gif', + 'Republic of Singapore' => 'sing.gif', + 'Republic of Korea' => 'skor.gif', + 'Republic of Slovenia' => 'slva.gif', + 'Somali Republic' => 'smla.gif', + 'Republic of Somaliland' => 'smld.gif', + 'Republic of South Africa' => 'soaf.gif', + 'Solomon Islands' => 'sois.gif', + 'Kingdom of Spain' => 'span.gif', + 'Secretariat of the Pacific Community' => 'spco.gif', + 'Democratic Socialist Republic of Sri Lanka' => 'srla.gif', + 'Saint Lucia' => 'stlu.gif', + 'Republic of the Sudan' => 'suda.gif', + 'Republic of Suriname' => 'surn.gif', + 'Slovak Republic' => 'svka.gif', + 'Kingdom of Sweden' => 'swdn.gif', + 'Swiss Confederation' => 'swit.gif', + 'Syrian Arab Republic' => 'syra.gif', + 'Kingdom of Swaziland' => 'szld.gif', + 'Republic of China' => 'taiw.gif', + 'Republic of Tajikistan' => 'tajk.gif', + 'United Republic of Tanzania' => 'tanz.gif', + 'Kingdom of Thailand' => 'thal.gif', + 'Autonomous Region of Tibet' => 'tibe.gif', + 'Turkmenistan' => 'tkst.gif', + 'Togolese Republic' => 'togo.gif', + 'Tokelau' => 'toke.gif', + 'Kingdom of Tonga' => 'tong.gif', + 'Tristan da Cunha' => 'trdc.gif', + 'Tromelin' => 'tris.gif', + 'Republic of Tunisia' => 'tuns.gif', + 'Republic of Turkey' => 'turk.gif', + 'Tuvalu' => 'tuva.gif', + 'United Arab Emirates' => 'uaem.gif', + 'Republic of Uganda' => 'ugan.gif', + 'Ukraine' => 'ukrn.gif', + 'United Kingdom of Great Britain' => 'unkg.gif', + 'United Nations' => 'unna.gif', + 'United States of America' => 'unst.gif', + 'Oriental Republic of Uruguay' => 'urgy.gif', + 'Virgin Islands of the United States' => 'usvs.gif', + 'Republic of Uzbekistan' => 'uzbk.gif', + 'State of the Vatican City' => 'vacy.gif', + 'Republic of Vanuatu' => 'vant.gif', + 'Bolivarian Republic of Venezuela' => 'venz.gif', + 'Republic of Yemen' => 'yemn.gif', + 'Democratic Republic of Congo' => 'zare.gif', + 'Republic of Zimbabwe' => 'zbwe.gif' +) ; + + diff --git a/libs/jpgraph/gd_image.inc.php b/libs/jpgraph/gd_image.inc.php index f8b4b01..d300a18 100644 --- a/libs/jpgraph/gd_image.inc.php +++ b/libs/jpgraph/gd_image.inc.php @@ -1,19 +1,37 @@ CreateImgCanvas($aWidth,$aHeight); - if( $aSetAutoMargin ) - $this->SetAutoMargin(); + function __construct($aWidth=0,$aHeight=0,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) { + $this->CreateImgCanvas($aWidth,$aHeight); - if( !$this->SetImgFormat($aFormat) ) { - JpGraphError::RaiseL(25081,$aFormat);//("JpGraph: Selected graphic format is either not supported or unknown [$aFormat]"); - } - $this->ttf = new TTF(); - $this->langconv = new LanguageConv(); + if( $aSetAutoMargin ) { + $this->SetAutoMargin(); + } + + if( !$this->SetImgFormat($aFormat) ) { + JpGraphError::RaiseL(25081,$aFormat);//("JpGraph: Selected graphic format is either not supported or unknown [$aFormat]"); + } + $this->ttf = new TTF(); + $this->langconv = new LanguageConv(); } // Enable interlacing in images function SetInterlace($aFlg=true) { - $this->iInterlace=$aFlg; + $this->iInterlace=$aFlg; } // Should we use anti-aliasing. Note: This really slows down graphics! function SetAntiAliasing($aFlg=true) { - $this->use_anti_aliasing = $aFlg; - if( function_exists('imageantialias') ) { - imageantialias($this->img,$aFlg); - } - else { - JpGraphError::RaiseL(25128);//('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.') - } + $this->use_anti_aliasing = $aFlg; + if( function_exists('imageantialias') ) { + imageantialias($this->img,$aFlg); + } + else { + JpGraphError::RaiseL(25128);//('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.') + } + } + + function GetAntiAliasing() { + return $this->use_anti_aliasing ; } function CreateRawCanvas($aWidth=0,$aHeight=0) { - if( $aWidth <= 1 || $aHeight <= 1 ) { - JpGraphError::RaiseL(25082,$aWidth,$aHeight);//("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)"); - } + if( $aWidth <= 1 || $aHeight <= 1 ) { + JpGraphError::RaiseL(25082,$aWidth,$aHeight);//("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)"); + } - if( USE_TRUECOLOR ) { - $this->img = @imagecreatetruecolor($aWidth, $aHeight); - if( $this->img < 1 ) { - JpGraphError::RaiseL(25126); - //die("Can't create truecolor image. Check that you really have GD2 library installed."); - } - $this->SetAlphaBlending(); - } else { - $this->img = @imagecreate($aWidth, $aHeight); - if( $this->img < 1 ) { - JpGraphError::RaiseL(25126); - //die("JpGraph Error: Can't create image. Check that you really have the GD library installed."); - } - } + $this->img = @imagecreatetruecolor($aWidth, $aHeight); + if( $this->img < 1 ) { + JpGraphError::RaiseL(25126); + //die("Can't create truecolor image. Check that you really have GD2 library installed."); + } + $this->SetAlphaBlending(); - if( $this->iInterlace ) { - imageinterlace($this->img,1); - } - if( $this->rgb != null ) - $this->rgb->img = $this->img ; - else - $this->rgb = new RGB($this->img); + if( $this->iInterlace ) { + imageinterlace($this->img,1); + } + if( $this->rgb != null ) { + $this->rgb->img = $this->img ; + } + else { + $this->rgb = new RGB($this->img); + } } function CloneCanvasH() { - $oldimage = $this->img; - $this->CreateRawCanvas($this->width,$this->height); - imagecopy($this->img,$oldimage,0,0,0,0,$this->width,$this->height); - return $oldimage; + $oldimage = $this->img; + $this->CreateRawCanvas($this->width,$this->height); + imagecopy($this->img,$oldimage,0,0,0,0,$this->width,$this->height); + return $oldimage; } - + function CreateImgCanvas($aWidth=0,$aHeight=0) { - $old = array($this->img,$this->width,$this->height); - - $aWidth = round($aWidth); - $aHeight = round($aHeight); + $old = array($this->img,$this->width,$this->height); - $this->width=$aWidth; - $this->height=$aHeight; + $aWidth = round($aWidth); + $aHeight = round($aHeight); - - if( $aWidth==0 || $aHeight==0 ) { - // We will set the final size later. - // Note: The size must be specified before any other - // img routines that stroke anything are called. - $this->img = null; - $this->rgb = null; - return $old; - } - - $this->CreateRawCanvas($aWidth,$aHeight); - // Set canvas color (will also be the background color for a - // a pallett image - $this->SetColor($this->canvascolor); - $this->FilledRectangle(0,0,$aWidth,$aHeight); + $this->width=$aWidth; + $this->height=$aHeight; - return $old ; + + if( $aWidth==0 || $aHeight==0 ) { + // We will set the final size later. + // Note: The size must be specified before any other + // img routines that stroke anything are called. + $this->img = null; + $this->rgb = null; + return $old; + } + + $this->CreateRawCanvas($aWidth,$aHeight); + // Set canvas color (will also be the background color for a + // a pallett image + $this->SetColor($this->canvascolor); + $this->FilledRectangle(0,0,$aWidth-1,$aHeight-1); + + return $old ; } function CopyCanvasH($aToHdl,$aFromHdl,$aToX,$aToY,$aFromX,$aFromY,$aWidth,$aHeight,$aw=-1,$ah=-1) { - if( $aw === -1 ) { - $aw = $aWidth; - $ah = $aHeight; - $f = 'imagecopyresized'; - } - else { - $f = 'imagecopyresampled'; - } - $f($aToHdl,$aFromHdl,$aToX,$aToY,$aFromX,$aFromY, $aWidth,$aHeight,$aw,$ah); + if( $aw === -1 ) { + $aw = $aWidth; + $ah = $aHeight; + $f = 'imagecopyresized'; + } + else { + $f = 'imagecopyresampled'; + } + $f($aToHdl,$aFromHdl,$aToX,$aToY,$aFromX,$aFromY, $aWidth,$aHeight,$aw,$ah); } function Copy($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1) { - $this->CopyCanvasH($this->img,$fromImg,$toX,$toY,$fromX,$fromY, - $toWidth,$toHeight,$fromWidth,$fromHeight); + $this->CopyCanvasH($this->img,$fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight); } function CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1,$aMix=100) { - if( $aMix == 100 ) { - $this->CopyCanvasH($this->img,$fromImg, - $toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight); - } - else { - if( ($fromWidth != -1 && ($fromWidth != $toWidth)) || - ($fromHeight != -1 && ($fromHeight != $fromHeight)) ) { - // Create a new canvas that will hold the re-scaled original from image - if( $toWidth <= 1 || $toHeight <= 1 ) { - JpGraphError::RaiseL(25083);//('Illegal image size when copying image. Size for copied to image is 1 pixel or less.'); - } - if( USE_TRUECOLOR ) { - $tmpimg = @imagecreatetruecolor($toWidth, $toHeight); - } else { - $tmpimg = @imagecreate($toWidth, $toHeight); - } - if( $tmpimg < 1 ) { - JpGraphError::RaiseL(25084);//('Failed to create temporary GD canvas. Out of memory ?'); - } - $this->CopyCanvasH($tmpimg,$fromImg,0,0,0,0, - $toWidth,$toHeight,$fromWidth,$fromHeight); - $fromImg = $tmpimg; - } - imagecopymerge($this->img,$fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$aMix); - } + if( $aMix == 100 ) { + $this->CopyCanvasH($this->img,$fromImg, + $toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight); + } + else { + if( ($fromWidth != -1 && ($fromWidth != $toWidth)) || ($fromHeight != -1 && ($fromHeight != $fromHeight)) ) { + // Create a new canvas that will hold the re-scaled original from image + if( $toWidth <= 1 || $toHeight <= 1 ) { + JpGraphError::RaiseL(25083);//('Illegal image size when copying image. Size for copied to image is 1 pixel or less.'); + } + + $tmpimg = @imagecreatetruecolor($toWidth, $toHeight); + + if( $tmpimg < 1 ) { + JpGraphError::RaiseL(25084);//('Failed to create temporary GD canvas. Out of memory ?'); + } + $this->CopyCanvasH($tmpimg,$fromImg,0,0,0,0, + $toWidth,$toHeight,$fromWidth,$fromHeight); + $fromImg = $tmpimg; + } + imagecopymerge($this->img,$fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$aMix); + } } static function GetWidth($aImg=null) { - if( $aImg === null ) - $aImg = $this->img; - return imagesx($aImg); + if( $aImg === null ) { + $aImg = $this->img; + } + return imagesx($aImg); } static function GetHeight($aImg=null) { - if( $aImg === null ) - $aImg = $this->img; - return imagesy($aImg); + if( $aImg === null ) { + $aImg = $this->img; + } + return imagesy($aImg); } - + static function CreateFromString($aStr) { - $img = imagecreatefromstring($aStr); - if( $img === false ) { - JpGraphError::RaiseL(25085);//('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.'); - } - return $img; + $img = imagecreatefromstring($aStr); + if( $img === false ) { + JpGraphError::RaiseL(25085); + //('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.'); + } + return $img; } function SetCanvasH($aHdl) { - $this->img = $aHdl; - $this->rgb->img = $aHdl; + $this->img = $aHdl; + $this->rgb->img = $aHdl; } function SetCanvasColor($aColor) { - $this->canvascolor = $aColor ; + $this->canvascolor = $aColor ; } function SetAlphaBlending($aFlg=true) { - ImageAlphaBlending($this->img,$aFlg); + ImageAlphaBlending($this->img,$aFlg); } - - function SetAutoMargin() { - GLOBAL $gJpgBrandTiming; - $min_bm=5; - /* - if( $gJpgBrandTiming ) - $min_bm=15; - */ - $lm = min(40,$this->width/7); - $rm = min(20,$this->width/10); - $tm = max(5,$this->height/7); - $bm = max($min_bm,$this->height/7); - $this->SetMargin($lm,$rm,$tm,$bm); + function SetAutoMargin() { + $min_bm=5; + $lm = min(40,$this->width/7); + $rm = min(20,$this->width/10); + $tm = max(5,$this->height/7); + $bm = max($min_bm,$this->height/6); + $this->SetMargin($lm,$rm,$tm,$bm); } - //--------------- - // PUBLIC METHODS - - function SetFont($family,$style=FS_NORMAL,$size=10) { - $this->font_family=$family; - $this->font_style=$style; - $this->font_size=$size; - $this->font_file=''; - if( ($this->font_family==FF_FONT1 || $this->font_family==FF_FONT2) && $this->font_style==FS_BOLD ){ - ++$this->font_family; - } - if( $this->font_family > FF_FONT2+1 ) { // A TTF font so get the font file + // PUBLIC METHODS - // Check that this PHP has support for TTF fonts - if( !function_exists('imagettfbbox') ) { - JpGraphError::RaiseL(25087);//('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.'); - } - $this->font_file = $this->ttf->File($this->font_family,$this->font_style); - } + function SetFont($family,$style=FS_NORMAL,$size=10) { + $this->font_family=$family; + $this->font_style=$style; + $this->font_size=$size; + $this->font_file=''; + if( ($this->font_family==FF_FONT1 || $this->font_family==FF_FONT2) && $this->font_style==FS_BOLD ){ + ++$this->font_family; + } + if( $this->font_family > FF_FONT2+1 ) { // A TTF font so get the font file + + // Check that this PHP has support for TTF fonts + if( !function_exists('imagettfbbox') ) { + JpGraphError::RaiseL(25087);//('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.'); + } + $this->font_file = $this->ttf->File($this->font_family,$this->font_style); + } } // Get the specific height for a text string function GetTextHeight($txt="",$angle=0) { - $tmp = split("\n",$txt); - $n = count($tmp); - $m=0; - for($i=0; $i< $n; ++$i) - $m = max($m,strlen($tmp[$i])); + $tmp = preg_split('/\n/',$txt); + $n = count($tmp); + $m=0; + for($i=0; $i< $n; ++$i) { + $m = max($m,strlen($tmp[$i])); + } - if( $this->font_family <= FF_FONT2+1 ) { - if( $angle==0 ) { - $h = imagefontheight($this->font_family); - if( $h === false ) { - JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); - } + if( $this->font_family <= FF_FONT2+1 ) { + if( $angle==0 ) { + $h = imagefontheight($this->font_family); + if( $h === false ) { + JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); + } - return $n*$h; - } - else { - $w = @imagefontwidth($this->font_family); - if( $w === false ) { - JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); - } + return $n*$h; + } + else { + $w = @imagefontwidth($this->font_family); + if( $w === false ) { + JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); + } - return $m*$w; - } - } - else { - $bbox = $this->GetTTFBBox($txt,$angle); - return $bbox[1]-$bbox[5]; - } + return $m*$w; + } + } + else { + $bbox = $this->GetTTFBBox($txt,$angle); + return $bbox[1]-$bbox[5]+1; + } } - + // Estimate font height function GetFontHeight($angle=0) { - $txt = "XOMg"; - return $this->GetTextHeight($txt,$angle); + $txt = "XOMg"; + return $this->GetTextHeight($txt,$angle); } - + // Approximate font width with width of letter "O" function GetFontWidth($angle=0) { - $txt = 'O'; - return $this->GetTextWidth($txt,$angle); + $txt = 'O'; + return $this->GetTextWidth($txt,$angle); } - - // Get actual width of text in absolute pixels + + // Get actual width of text in absolute pixels. Note that the width is the + // texts projected with onto the x-axis. Call with angle=0 to get the true + // etxt width. function GetTextWidth($txt,$angle=0) { - $tmp = split("\n",$txt); - $n = count($tmp); - if( $this->font_family <= FF_FONT2+1 ) { + $tmp = preg_split('/\n/',$txt); + $n = count($tmp); + if( $this->font_family <= FF_FONT2+1 ) { - $m=0; - for($i=0; $i < $n; ++$i) { - $l=strlen($tmp[$i]); - if( $l > $m ) { - $m = $l; - } - } + $m=0; + for($i=0; $i < $n; ++$i) { + $l=strlen($tmp[$i]); + if( $l > $m ) { + $m = $l; + } + } - if( $angle==0 ) { - $w = @imagefontwidth($this->font_family); - if( $w === false ) { - JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); - } - return $m*$w; - } - else { - // 90 degrees internal so height becomes width - $h = @imagefontheight($this->font_family); - if( $h === false ) { - JpGraphError::RaiseL(25089);//('You have a misconfigured GD font support. The call to imagefontheight() fails.'); - } - return $n*$h; - } - } - else { - // For TTF fonts we must walk through a lines and find the - // widest one which we use as the width of the multi-line - // paragraph - $m=0; - for( $i=0; $i < $n; ++$i ) { - $bbox = $this->GetTTFBBox($tmp[$i],$angle); - $mm = $bbox[2] - $bbox[0]; - if( $mm > $m ) - $m = $mm; - } - return $m; - } + if( $angle==0 ) { + $w = @imagefontwidth($this->font_family); + if( $w === false ) { + JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.'); + } + return $m*$w; + } + else { + // 90 degrees internal so height becomes width + $h = @imagefontheight($this->font_family); + if( $h === false ) { + JpGraphError::RaiseL(25089);//('You have a misconfigured GD font support. The call to imagefontheight() fails.'); + } + return $n*$h; + } + } + else { + // For TTF fonts we must walk through a lines and find the + // widest one which we use as the width of the multi-line + // paragraph + $m=0; + for( $i=0; $i < $n; ++$i ) { + $bbox = $this->GetTTFBBox($tmp[$i],$angle); + $mm = $bbox[2] - $bbox[0]; + if( $mm > $m ) + $m = $mm; + } + return $m; + } } - + + // Draw text with a box around it function StrokeBoxedText($x,$y,$txt,$dir=0,$fcolor="white",$bcolor="black", - $shadowcolor=false,$paragraph_align="left", - $xmarg=6,$ymarg=4,$cornerradius=0,$dropwidth=3) { + $shadowcolor=false,$paragraph_align="left", + $xmarg=6,$ymarg=4,$cornerradius=0,$dropwidth=3) { - if( !is_numeric($dir) ) { - if( $dir=="h" ) $dir=0; - elseif( $dir=="v" ) $dir=90; - else JpGraphError::RaiseL(25090,$dir);//(" Unknown direction specified in call to StrokeBoxedText() [$dir]"); - } - - if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) { - $width=$this->GetTextWidth($txt,$dir) ; - $height=$this->GetTextHeight($txt,$dir) ; - } - else { - $width=$this->GetBBoxWidth($txt,$dir) ; - $height=$this->GetBBoxHeight($txt,$dir) ; - } + $oldx = $this->lastx; + $oldy = $this->lasty; - $height += 2*$ymarg; - $width += 2*$xmarg; + if( !is_numeric($dir) ) { + if( $dir=="h" ) $dir=0; + elseif( $dir=="v" ) $dir=90; + else JpGraphError::RaiseL(25090,$dir);//(" Unknown direction specified in call to StrokeBoxedText() [$dir]"); + } - if( $this->text_halign=="right" ) $x -= $width; - elseif( $this->text_halign=="center" ) $x -= $width/2; - if( $this->text_valign=="bottom" ) $y -= $height; - elseif( $this->text_valign=="center" ) $y -= $height/2; - - $olda = $this->SetAngle(0); + if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) { + $width=$this->GetTextWidth($txt,$dir) ; + $height=$this->GetTextHeight($txt,$dir) ; + } + else { + $width=$this->GetBBoxWidth($txt,$dir) ; + $height=$this->GetBBoxHeight($txt,$dir) ; + } - if( $shadowcolor ) { - $this->PushColor($shadowcolor); - $this->FilledRoundedRectangle($x-$xmarg+$dropwidth,$y-$ymarg+$dropwidth, - $x+$width+$dropwidth,$y+$height-$ymarg+$dropwidth, - $cornerradius); - $this->PopColor(); - $this->PushColor($fcolor); - $this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg, - $x+$width,$y+$height-$ymarg, - $cornerradius); - $this->PopColor(); - $this->PushColor($bcolor); - $this->RoundedRectangle($x-$xmarg,$y-$ymarg, - $x+$width,$y+$height-$ymarg,$cornerradius); - $this->PopColor(); - } - else { - if( $fcolor ) { - $oc=$this->current_color; - $this->SetColor($fcolor); - $this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius); - $this->current_color=$oc; - } - if( $bcolor ) { - $oc=$this->current_color; - $this->SetColor($bcolor); - $this->RoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius); - $this->current_color=$oc; - } - } - - $h=$this->text_halign; - $v=$this->text_valign; - $this->SetTextAlign("left","top"); - $this->StrokeText($x, $y, $txt, $dir, $paragraph_align); - $bb = array($x-$xmarg,$y+$height-$ymarg,$x+$width,$y+$height-$ymarg, - $x+$width,$y-$ymarg,$x-$xmarg,$y-$ymarg); - $this->SetTextAlign($h,$v); + $height += 2*$ymarg; + $width += 2*$xmarg; - $this->SetAngle($olda); + if( $this->text_halign=="right" ) $x -= $width; + elseif( $this->text_halign=="center" ) $x -= $width/2; - return $bb; + if( $this->text_valign=="bottom" ) $y -= $height; + elseif( $this->text_valign=="center" ) $y -= $height/2; + + $olda = $this->SetAngle(0); + + if( $shadowcolor ) { + $this->PushColor($shadowcolor); + $this->FilledRoundedRectangle($x-$xmarg+$dropwidth,$y-$ymarg+$dropwidth, + $x+$width+$dropwidth,$y+$height-$ymarg+$dropwidth, + $cornerradius); + $this->PopColor(); + $this->PushColor($fcolor); + $this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg, + $x+$width,$y+$height-$ymarg, + $cornerradius); + $this->PopColor(); + $this->PushColor($bcolor); + $this->RoundedRectangle($x-$xmarg,$y-$ymarg, + $x+$width,$y+$height-$ymarg,$cornerradius); + $this->PopColor(); + } + else { + if( $fcolor ) { + $oc=$this->current_color; + $this->SetColor($fcolor); + $this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius); + $this->current_color=$oc; + } + if( $bcolor ) { + $oc=$this->current_color; + $this->SetColor($bcolor); + $this->RoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius); + $this->current_color=$oc; + } + } + + $h=$this->text_halign; + $v=$this->text_valign; + $this->SetTextAlign("left","top"); + + $debug=false; + $this->StrokeText($x, $y, $txt, $dir, $paragraph_align,$debug); + + $bb = array($x-$xmarg,$y+$height-$ymarg,$x+$width,$y+$height-$ymarg, + $x+$width,$y-$ymarg,$x-$xmarg,$y-$ymarg); + $this->SetTextAlign($h,$v); + + $this->SetAngle($olda); + $this->lastx = $oldx; + $this->lasty = $oldy; + + return $bb; } - // Set text alignment - function SetTextAlign($halign,$valign="bottom") { - $this->text_halign=$halign; - $this->text_valign=$valign; - } - + // Draw text with a box around it. This time the box will be rotated + // with the text. The previous method will just make a larger enough non-rotated + // box to hold the text inside. + function StrokeBoxedText2($x,$y,$txt,$dir=0,$fcolor="white",$bcolor="black", + $shadowcolor=false,$paragraph_align="left", + $xmarg=6,$ymarg=4,$cornerradius=0,$dropwidth=3) { - function _StrokeBuiltinFont($x,$y,$txt,$dir=0,$paragraph_align="left",&$aBoundingBox,$aDebug=false) { + // This version of boxed text will stroke a rotated box round the text + // thta will follow the angle of the text. + // This has two implications: + // 1) This methos will only support TTF fonts + // 2) The only two alignment that makes sense are centered or baselined - if( is_numeric($dir) && $dir!=90 && $dir!=0) - JpGraphError::RaiseL(25091);//(" Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead."); + if( $this->font_family <= FF_FONT2+1 ) { + JpGraphError::RaiseL(25131);//StrokeBoxedText2() Only support TTF fonts and not built in bitmap fonts + } - $h=$this->GetTextHeight($txt); - $fh=$this->GetFontHeight(); - $w=$this->GetTextWidth($txt); - - if( $this->text_halign=="right") - $x -= $dir==0 ? $w : $h; - elseif( $this->text_halign=="center" ) { - // For center we subtract 1 pixel since this makes the middle - // be prefectly in the middle - $x -= $dir==0 ? $w/2-1 : $h/2; - } - if( $this->text_valign=="top" ) - $y += $dir==0 ? $h : $w; - elseif( $this->text_valign=="center" ) - $y += $dir==0 ? $h/2 : $w/2; - - if( $dir==90 ) { - imagestringup($this->img,$this->font_family,$x,$y,$txt,$this->current_color); - $aBoundingBox = array(round($x),round($y),round($x),round($y-$w),round($x+$h),round($y-$w),round($x+$h),round($y)); - if( $aDebug ) { - // Draw bounding box - $this->PushColor('green'); - $this->Polygon($aBoundingBox,true); - $this->PopColor(); - } - } - else { - if( ereg("\n",$txt) ) { - $tmp = split("\n",$txt); - for($i=0; $i < count($tmp); ++$i) { - $w1 = $this->GetTextWidth($tmp[$i]); - if( $paragraph_align=="left" ) { - imagestring($this->img,$this->font_family,$x,$y-$h+1+$i*$fh,$tmp[$i],$this->current_color); - } - elseif( $paragraph_align=="right" ) { - imagestring($this->img,$this->font_family,$x+($w-$w1), - $y-$h+1+$i*$fh,$tmp[$i],$this->current_color); - } - else { - imagestring($this->img,$this->font_family,$x+$w/2-$w1/2, - $y-$h+1+$i*$fh,$tmp[$i],$this->current_color); - } - } - } - else { - //Put the text - imagestring($this->img,$this->font_family,$x,$y-$h+1,$txt,$this->current_color); - } - if( $aDebug ) { - // Draw the bounding rectangle and the bounding box - $p1 = array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y)); - - // Draw bounding box - $this->PushColor('green'); - $this->Polygon($p1,true); - $this->PopColor(); + $oldx = $this->lastx; + $oldy = $this->lasty; + $dir = $this->NormAngle($dir); + + if( !is_numeric($dir) ) { + if( $dir=="h" ) $dir=0; + elseif( $dir=="v" ) $dir=90; + else JpGraphError::RaiseL(25090,$dir);//(" Unknown direction specified in call to StrokeBoxedText() [$dir]"); + } + + $width=$this->GetTextWidth($txt,0) + 2*$xmarg; + $height=$this->GetTextHeight($txt,0) + 2*$ymarg ; + $rect_width=$this->GetBBoxWidth($txt,$dir) ; + $rect_height=$this->GetBBoxHeight($txt,$dir) ; + + $baseline_offset = $this->bbox_cache[1]-1; + + if( $this->text_halign=="center" ) { + if( $dir >= 0 && $dir <= 90 ) { + + $x -= $rect_width/2; + $x += sin($dir*M_PI/180)*$height; + $y += $rect_height/2; + + } elseif( $dir >= 270 && $dir <= 360 ) { + + $x -= $rect_width/2; + $y -= $rect_height/2; + $y += cos($dir*M_PI/180)*$height; + + } elseif( $dir >= 90 && $dir <= 180 ) { + + $x += $rect_width/2; + $y += $rect_height/2; + $y += cos($dir*M_PI/180)*$height; } - $aBoundingBox=array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y)); - } + else { + // $dir > 180 && $dir < 270 + $x += $rect_width/2; + $x += sin($dir*M_PI/180)*$height; + $y -= $rect_height/2; + } + } + + // Rotate the box around this point + $this->SetCenter($x,$y); + $olda = $this->SetAngle(-$dir); + + // We need to use adjusted coordinats for the box to be able + // to draw the box below the baseline. This cannot be done before since + // the rotating point must be the original x,y since that is arounbf the + // point where the text will rotate and we cannot change this since + // that is where the GD/GreeType will rotate the text + + + // For smaller <14pt font we need to do some additional + // adjustments to make it look good + if( $this->font_size < 14 ) { + $x -= 2; + $y += 2; + } + else { + // $y += $baseline_offset; + } + + if( $shadowcolor ) { + $this->PushColor($shadowcolor); + $this->FilledRectangle($x-$xmarg+$dropwidth,$y+$ymarg+$dropwidth-$height, + $x+$width+$dropwidth,$y+$ymarg+$dropwidth); + //$cornerradius); + $this->PopColor(); + $this->PushColor($fcolor); + $this->FilledRectangle($x-$xmarg, $y+$ymarg-$height, + $x+$width, $y+$ymarg); + //$cornerradius); + $this->PopColor(); + $this->PushColor($bcolor); + $this->Rectangle($x-$xmarg,$y+$ymarg-$height, + $x+$width,$y+$ymarg); + //$cornerradius); + $this->PopColor(); + } + else { + if( $fcolor ) { + $oc=$this->current_color; + $this->SetColor($fcolor); + $this->FilledRectangle($x-$xmarg,$y+$ymarg-$height,$x+$width,$y+$ymarg);//,$cornerradius); + $this->current_color=$oc; + } + if( $bcolor ) { + $oc=$this->current_color; + $this->SetColor($bcolor); + $this->Rectangle($x-$xmarg,$y+$ymarg-$height,$x+$width,$y+$ymarg);//,$cornerradius); + $this->current_color=$oc; + } + } + + if( $this->font_size < 14 ) { + $x += 2; + $y -= 2; + } + else { + + // Restore the original y before we stroke the text + // $y -= $baseline_offset; + + } + + $this->SetCenter(0,0); + $this->SetAngle($olda); + + $h=$this->text_halign; + $v=$this->text_valign; + if( $this->text_halign == 'center') { + $this->SetTextAlign('center','basepoint'); + } + else { + $this->SetTextAlign('basepoint','basepoint'); + } + + $debug=false; + $this->StrokeText($x, $y, $txt, $dir, $paragraph_align,$debug); + + $bb = array($x-$xmarg, $y+$height-$ymarg, + $x+$width, $y+$height-$ymarg, + $x+$width, $y-$ymarg, + $x-$xmarg, $y-$ymarg); + + $this->SetTextAlign($h,$v); + $this->SetAngle($olda); + + $this->lastx = $oldx; + $this->lasty = $oldy; + + return $bb; + } + + // Set text alignment + function SetTextAlign($halign,$valign="bottom") { + $this->text_halign=$halign; + $this->text_valign=$valign; + } + + function _StrokeBuiltinFont($x,$y,$txt,$dir,$paragraph_align,&$aBoundingBox,$aDebug=false) { + + if( is_numeric($dir) && $dir!=90 && $dir!=0) + JpGraphError::RaiseL(25091);//(" Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead."); + + $h=$this->GetTextHeight($txt); + $fh=$this->GetFontHeight(); + $w=$this->GetTextWidth($txt); + + if( $this->text_halign=="right") { + $x -= $dir==0 ? $w : $h; + } + elseif( $this->text_halign=="center" ) { + // For center we subtract 1 pixel since this makes the middle + // be prefectly in the middle + $x -= $dir==0 ? $w/2-1 : $h/2; + } + if( $this->text_valign=="top" ) { + $y += $dir==0 ? $h : $w; + } + elseif( $this->text_valign=="center" ) { + $y += $dir==0 ? $h/2 : $w/2; + } + + if( $dir==90 ) { + imagestringup($this->img,$this->font_family,$x,$y,$txt,$this->current_color); + $aBoundingBox = array(round($x),round($y),round($x),round($y-$w),round($x+$h),round($y-$w),round($x+$h),round($y)); + if( $aDebug ) { + // Draw bounding box + $this->PushColor('green'); + $this->Polygon($aBoundingBox,true); + $this->PopColor(); + } + } + else { + if( preg_match('/\n/',$txt) ) { + $tmp = preg_split('/\n/',$txt); + for($i=0; $i < count($tmp); ++$i) { + $w1 = $this->GetTextWidth($tmp[$i]); + if( $paragraph_align=="left" ) { + imagestring($this->img,$this->font_family,$x,$y-$h+1+$i*$fh,$tmp[$i],$this->current_color); + } + elseif( $paragraph_align=="right" ) { + imagestring($this->img,$this->font_family,$x+($w-$w1),$y-$h+1+$i*$fh,$tmp[$i],$this->current_color); + } + else { + imagestring($this->img,$this->font_family,$x+$w/2-$w1/2,$y-$h+1+$i*$fh,$tmp[$i],$this->current_color); + } + } + } + else { + //Put the text + imagestring($this->img,$this->font_family,$x,$y-$h+1,$txt,$this->current_color); + } + if( $aDebug ) { + // Draw the bounding rectangle and the bounding box + $p1 = array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y)); + + // Draw bounding box + $this->PushColor('green'); + $this->Polygon($p1,true); + $this->PopColor(); + + } + $aBoundingBox=array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y)); + } } function AddTxtCR($aTxt) { - // If the user has just specified a '\n' - // instead of '\n\t' we have to add '\r' since - // the width will be too muchy otherwise since when - // we print we stroke the individually lines by hand. - $e = explode("\n",$aTxt); - $n = count($e); - for($i=0; $i<$n; ++$i) { - $e[$i]=str_replace("\r","",$e[$i]); - } - return implode("\n\r",$e); + // If the user has just specified a '\n' + // instead of '\n\t' we have to add '\r' since + // the width will be too muchy otherwise since when + // we print we stroke the individually lines by hand. + $e = explode("\n",$aTxt); + $n = count($e); + for($i=0; $i<$n; ++$i) { + $e[$i]=str_replace("\r","",$e[$i]); + } + return implode("\n\r",$e); } + function NormAngle($a) { + // Normalize angle in degrees + // Normalize angle to be between 0-360 + while( $a > 360 ) + $a -= 360; + while( $a < -360 ) + $a += 360; + if( $a < 0 ) + $a = 360 + $a; + return $a; + } + + function imagettfbbox_fixed($size, $angle, $fontfile, $text) { + + + if( ! USE_LIBRARY_IMAGETTFBBOX ) { + + $bbox = @imagettfbbox($size, $angle, $fontfile, $text); + if( $bbox === false ) { + JpGraphError::RaiseL(25092,$this->font_file); + //("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library."); + } + $this->bbox_cache = $bbox; + return $bbox; + } + + // The built in imagettfbbox is buggy for angles != 0 so + // we calculate this manually by getting the bounding box at + // angle = 0 and then rotate the bounding box manually + $bbox = @imagettfbbox($size, 0, $fontfile, $text); + if( $bbox === false ) { + JpGraphError::RaiseL(25092,$this->font_file); + //("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library."); + } + + $angle = $this->NormAngle($angle); + + $a = $angle*M_PI/180; + $ca = cos($a); + $sa = sin($a); + $ret = array(); + + // We always add 1 pixel to the left since the left edge of the bounding + // box is sometimes coinciding with the first pixel of the text + //$bbox[0] -= 1; + //$bbox[6] -= 1; + + // For roatated text we need to add extra width for rotated + // text since the kerning and stroking of the TTF is not the same as for + // text at a 0 degree angle + + if( $angle > 0.001 && abs($angle-360) > 0.001 ) { + $h = abs($bbox[7]-$bbox[1]); + $w = abs($bbox[2]-$bbox[0]); + + $bbox[0] -= 2; + $bbox[6] -= 2; + // The width is underestimated so compensate for that + $bbox[2] += round($w*0.06); + $bbox[4] += round($w*0.06); + + // and we also need to compensate with increased height + $bbox[5] -= round($h*0.1); + $bbox[7] -= round($h*0.1); + + if( $angle > 90 ) { + // For angles > 90 we also need to extend the height further down + // by the baseline since that is also one more problem + $bbox[1] += round($h*0.15); + $bbox[3] += round($h*0.15); + + // and also make it slighty less height + $bbox[7] += round($h*0.05); + $bbox[5] += round($h*0.05); + + // And we need to move the box slightly top the rright (from a tetx perspective) + $bbox[0] += round($w*0.02); + $bbox[6] += round($w*0.02); + + if( $angle > 180 ) { + // And we need to move the box slightly to the left (from a text perspective) + $bbox[0] -= round($w*0.02); + $bbox[6] -= round($w*0.02); + $bbox[2] -= round($w*0.02); + $bbox[4] -= round($w*0.02); + + } + + } + for($i = 0; $i < 7; $i += 2) { + $ret[$i] = round($bbox[$i] * $ca + $bbox[$i+1] * $sa); + $ret[$i+1] = round($bbox[$i+1] * $ca - $bbox[$i] * $sa); + } + $this->bbox_cache = $ret; + return $ret; + } + else { + $this->bbox_cache = $bbox; + return $bbox; + } + } + + // Deprecated function GetTTFBBox($aTxt,$aAngle=0) { - $bbox = @ImageTTFBBox($this->font_size,$aAngle,$this->font_file,$aTxt); - if( $bbox === false ) { - JpGraphError::RaiseL(25092,$this->font_file); -//("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library."); - } - return $bbox; + $bbox = $this->imagettfbbox_fixed($this->font_size,$aAngle,$this->font_file,$aTxt); + return $bbox; } function GetBBoxTTF($aTxt,$aAngle=0) { - // Normalize the bounding box to become a minimum - // enscribing rectangle + // Normalize the bounding box to become a minimum + // enscribing rectangle - $aTxt = $this->AddTxtCR($aTxt); + $aTxt = $this->AddTxtCR($aTxt); - if( !is_readable($this->font_file) ) { - JpGraphError::RaiseL(25093,$this->font_file); -//('Can not read font file ('.$this->font_file.') in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.'); - } - $bbox = $this->GetTTFBBox($aTxt,$aAngle); + if( !is_readable($this->font_file) ) { + JpGraphError::RaiseL(25093,$this->font_file); + //('Can not read font file ('.$this->font_file.') in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.'); + } + $bbox = $this->imagettfbbox_fixed($this->font_size,$aAngle,$this->font_file,$aTxt); - if( $aAngle==0 ) - return $bbox; - if( $aAngle >= 0 ) { - if( $aAngle <= 90 ) { //<=0 - $bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1], - $bbox[2],$bbox[5],$bbox[6],$bbox[5]); - } - elseif( $aAngle <= 180 ) { //<= 2 - $bbox = array($bbox[4],$bbox[7],$bbox[0],$bbox[7], - $bbox[0],$bbox[3],$bbox[4],$bbox[3]); - } - elseif( $aAngle <= 270 ) { //<= 3 - $bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5], - $bbox[6],$bbox[1],$bbox[2],$bbox[1]); - } - else { - $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], - $bbox[4],$bbox[7],$bbox[0],$bbox[7]); - } - } - elseif( $aAngle < 0 ) { - if( $aAngle <= -270 ) { // <= -3 - $bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1], - $bbox[2],$bbox[5],$bbox[6],$bbox[5]); - } - elseif( $aAngle <= -180 ) { // <= -2 - $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], - $bbox[4],$bbox[7],$bbox[0],$bbox[7]); - } - elseif( $aAngle <= -90 ) { // <= -1 - $bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5], - $bbox[6],$bbox[1],$bbox[2],$bbox[1]); - } - else { - $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], - $bbox[4],$bbox[7],$bbox[0],$bbox[7]); - } - } - return $bbox; + if( $aAngle==0 ) return $bbox; + + if( $aAngle >= 0 ) { + if( $aAngle <= 90 ) { //<=0 + $bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1], + $bbox[2],$bbox[5],$bbox[6],$bbox[5]); + } + elseif( $aAngle <= 180 ) { //<= 2 + $bbox = array($bbox[4],$bbox[7],$bbox[0],$bbox[7], + $bbox[0],$bbox[3],$bbox[4],$bbox[3]); + } + elseif( $aAngle <= 270 ) { //<= 3 + $bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5], + $bbox[6],$bbox[1],$bbox[2],$bbox[1]); + } + else { + $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + } + } + elseif( $aAngle < 0 ) { + if( $aAngle <= -270 ) { // <= -3 + $bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1], + $bbox[2],$bbox[5],$bbox[6],$bbox[5]); + } + elseif( $aAngle <= -180 ) { // <= -2 + $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + } + elseif( $aAngle <= -90 ) { // <= -1 + $bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5], + $bbox[6],$bbox[1],$bbox[2],$bbox[1]); + } + else { + $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + } + } + return $bbox; } function GetBBoxHeight($aTxt,$aAngle=0) { - $box = $this->GetBBoxTTF($aTxt,$aAngle); - return $box[1]-$box[7]+1; + $box = $this->GetBBoxTTF($aTxt,$aAngle); + return abs($box[7]-$box[1]); } function GetBBoxWidth($aTxt,$aAngle=0) { - $box = $this->GetBBoxTTF($aTxt,$aAngle); - return $box[2]-$box[0]+1; + $box = $this->GetBBoxTTF($aTxt,$aAngle); + return $box[2]-$box[0]+1; } - function _StrokeTTF($x,$y,$txt,$dir=0,$paragraph_align="left",&$aBoundingBox,$debug=false) { - // Setupo default inter line margin for paragraphs to - // 25% of the font height. - $ConstLineSpacing = 0.25 ; + function _StrokeTTF($x,$y,$txt,$dir,$paragraph_align,&$aBoundingBox,$debug=false) { - // Remember the anchor point before adjustment - if( $debug ) { - $ox=$x; - $oy=$y; - } + // Setupo default inter line margin for paragraphs to + // 25% of the font height. + $ConstLineSpacing = 0.25 ; - if( !ereg("\n",$txt) || ($dir>0 && ereg("\n",$txt)) ) { - // Format a single line + // Remember the anchor point before adjustment + if( $debug ) { + $ox=$x; + $oy=$y; + } - $txt = $this->AddTxtCR($txt); + if( !preg_match('/\n/',$txt) || ($dir>0 && preg_match('/\n/',$txt)) ) { + // Format a single line - $bbox=$this->GetBBoxTTF($txt,$dir); - - // Align x,y ot lower left corner of bbox - $x -= $bbox[0]; - $y -= $bbox[1]; + $txt = $this->AddTxtCR($txt); + $bbox=$this->GetBBoxTTF($txt,$dir); + $width = $this->GetBBoxWidth($txt,$dir); + $height = $this->GetBBoxHeight($txt,$dir); - // Note to self: "topanchor" is deprecated after we changed the - // bopunding box stuff. - if( $this->text_halign=="right" || $this->text_halign=="topanchor" ) - $x -= $bbox[2]-$bbox[0]; - elseif( $this->text_halign=="center" ) $x -= ($bbox[2]-$bbox[0])/2; - - if( $this->text_valign=="top" ) $y += abs($bbox[5])+$bbox[1]; - elseif( $this->text_valign=="center" ) $y -= ($bbox[5]-$bbox[1])/2; + // The special alignment "basepoint" is mostly used internally + // in the library. This will put the abchor positoin at the left + // basepoint of the tetx. This is the default anchor point for + // TTF text. - ImageTTFText ($this->img, $this->font_size, $dir, $x, $y, - $this->current_color,$this->font_file,$txt); + if( $this->text_valign != 'basepoint' ) { + // Align x,y ot lower left corner of bbox + $x -= $bbox[0]; + $y -= $bbox[1]; - // Calculate and return the co-ordinates for the bounding box - $box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$txt); - $p1 = array(); + // Note to self: "topanchor" is deprecated after we changed the + // bopunding box stuff. + if( $this->text_halign=='right' || $this->text_halign=='topanchor' ) { + $x -= $width; + } + elseif( $this->text_halign=='center' ) { + $x -= $width/2; + } + if( $this->text_valign=='top' ) { + $y += $height; + } + elseif( $this->text_valign=='center' ) { + $y += $height/2; + } + } + ImageTTFText ($this->img, $this->font_size, $dir, $x, $y, + $this->current_color,$this->font_file,$txt); + // Calculate and return the co-ordinates for the bounding box + $box = $this->imagettfbbox_fixed($this->font_size,$dir,$this->font_file,$txt); + $p1 = array(); - for($i=0; $i < 4; ++$i) { - $p1[] = round($box[$i*2]+$x); - $p1[] = round($box[$i*2+1]+$y); - } - $aBoundingBox = $p1; - - // Debugging code to highlight the bonding box and bounding rectangle - // For text at 0 degrees the bounding box and bounding rectangle are the - // same - if( $debug ) { - // Draw the bounding rectangle and the bounding box - $box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$txt); - $p = array(); - $p1 = array(); - for($i=0; $i < 4; ++$i) { - $p[] = $bbox[$i*2]+$x; - $p[] = $bbox[$i*2+1]+$y; - $p1[] = $box[$i*2]+$x; - $p1[] = $box[$i*2+1]+$y; - } - - // Draw bounding box - $this->PushColor('green'); - $this->Polygon($p1,true); - $this->PopColor(); - - // Draw bounding rectangle - $this->PushColor('darkgreen'); - $this->Polygon($p,true); - $this->PopColor(); - - // Draw a cross at the anchor point - $this->PushColor('red'); - $this->Line($ox-15,$oy,$ox+15,$oy); - $this->Line($ox,$oy-15,$ox,$oy+15); - $this->PopColor(); + for($i=0; $i < 4; ++$i) { + $p1[] = round($box[$i*2]+$x); + $p1[] = round($box[$i*2+1]+$y); } - } - else { - // Format a text paragraph - $fh=$this->GetFontHeight(); + $aBoundingBox = $p1; - // Line margin is 25% of font height - $linemargin=round($fh*$ConstLineSpacing); - $fh += $linemargin; - $w=$this->GetTextWidth($txt); + // Debugging code to highlight the bonding box and bounding rectangle + // For text at 0 degrees the bounding box and bounding rectangle are the + // same + if( $debug ) { + // Draw the bounding rectangle and the bounding box - $y -= $linemargin/2; - $tmp = split("\n",$txt); - $nl = count($tmp); - $h = $nl * $fh; + $p = array(); + $p1 = array(); - if( $this->text_halign=="right") - $x -= $dir==0 ? $w : $h; - elseif( $this->text_halign=="center" ) { - $x -= $dir==0 ? $w/2 : $h/2; - } - - if( $this->text_valign=="top" ) - $y += $dir==0 ? $h : $w; - elseif( $this->text_valign=="center" ) - $y += $dir==0 ? $h/2 : $w/2; + for($i=0; $i < 4; ++$i) { + $p[] = $bbox[$i*2]+$x ; + $p[] = $bbox[$i*2+1]+$y; + $p1[] = $box[$i*2]+$x ; + $p1[] = $box[$i*2+1]+$y ; + } - // Here comes a tricky bit. - // Since we have to give the position for the string at the - // baseline this means thaht text will move slightly up - // and down depending on any of it's character descend below - // the baseline, for example a 'g'. To adjust the Y-position - // we therefore adjust the text with the baseline Y-offset - // as used for the current font and size. This will keep the - // baseline at a fixed positoned disregarding the actual - // characters in the string. - $standardbox = $this->GetTTFBBox('Gg',$dir); - $yadj = $standardbox[1]; - $xadj = $standardbox[0]; - $aBoundingBox = array(); - for($i=0; $i < $nl; ++$i) { - $wl = $this->GetTextWidth($tmp[$i]); - $bbox = $this->GetTTFBBox($tmp[$i],$dir); - if( $paragraph_align=="left" ) { - $xl = $x; - } - elseif( $paragraph_align=="right" ) { - $xl = $x + ($w-$wl); - } - else { - // Center - $xl = $x + $w/2 - $wl/2 ; - } + // Draw bounding box + $this->PushColor('green'); + $this->Polygon($p1,true); + $this->PopColor(); - $xl -= $bbox[0]; - $yl = $y - $yadj; - $xl = $xl - $xadj; - ImageTTFText ($this->img, $this->font_size, $dir, - $xl, $yl-($h-$fh)+$fh*$i, - $this->current_color,$this->font_file,$tmp[$i]); + // Draw bounding rectangle + $this->PushColor('darkgreen'); + $this->Polygon($p,true); + $this->PopColor(); - if( $debug ) { - // Draw the bounding rectangle around each line - $box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$tmp[$i]); - $p = array(); - for($j=0; $j < 4; ++$j) { - $p[] = $bbox[$j*2]+$xl; - $p[] = $bbox[$j*2+1]+$yl-($h-$fh)+$fh*$i; - } - - // Draw bounding rectangle - $this->PushColor('darkgreen'); - $this->Polygon($p,true); - $this->PopColor(); - } - } + // Draw a cross at the anchor point + $this->PushColor('red'); + $this->Line($ox-15,$oy,$ox+15,$oy); + $this->Line($ox,$oy-15,$ox,$oy+15); + $this->PopColor(); + } + } + else { + // Format a text paragraph + $fh=$this->GetFontHeight(); - // Get the bounding box - $bbox = $this->GetBBoxTTF($txt,$dir); - for($j=0; $j < 4; ++$j) { - $bbox[$j*2]+= round($x); - $bbox[$j*2+1]+= round($y - ($h-$fh) - $yadj); - } - $aBoundingBox = $bbox; + // Line margin is 25% of font height + $linemargin=round($fh*$ConstLineSpacing); + $fh += $linemargin; + $w=$this->GetTextWidth($txt); - if( $debug ) { - // Draw a cross at the anchor point - $this->PushColor('red'); - $this->Line($ox-25,$oy,$ox+25,$oy); - $this->Line($ox,$oy-25,$ox,$oy+25); - $this->PopColor(); - } + $y -= $linemargin/2; + $tmp = preg_split('/\n/',$txt); + $nl = count($tmp); + $h = $nl * $fh; - } + if( $this->text_halign=='right') { + $x -= $dir==0 ? $w : $h; + } + elseif( $this->text_halign=='center' ) { + $x -= $dir==0 ? $w/2 : $h/2; + } + + if( $this->text_valign=='top' ) { + $y += $dir==0 ? $h : $w; + } + elseif( $this->text_valign=='center' ) { + $y += $dir==0 ? $h/2 : $w/2; + } + + // Here comes a tricky bit. + // Since we have to give the position for the string at the + // baseline this means thaht text will move slightly up + // and down depending on any of it's character descend below + // the baseline, for example a 'g'. To adjust the Y-position + // we therefore adjust the text with the baseline Y-offset + // as used for the current font and size. This will keep the + // baseline at a fixed positoned disregarding the actual + // characters in the string. + $standardbox = $this->GetTTFBBox('Gg',$dir); + $yadj = $standardbox[1]; + $xadj = $standardbox[0]; + $aBoundingBox = array(); + for($i=0; $i < $nl; ++$i) { + $wl = $this->GetTextWidth($tmp[$i]); + $bbox = $this->GetTTFBBox($tmp[$i],$dir); + if( $paragraph_align=='left' ) { + $xl = $x; + } + elseif( $paragraph_align=='right' ) { + $xl = $x + ($w-$wl); + } + else { + // Center + $xl = $x + $w/2 - $wl/2 ; + } + + $xl -= $bbox[0]; + $yl = $y - $yadj; + $xl = $xl - $xadj; + ImageTTFText ($this->img, $this->font_size, $dir, + $xl, $yl-($h-$fh)+$fh*$i, + $this->current_color,$this->font_file,$tmp[$i]); + + if( $debug ) { + // Draw the bounding rectangle around each line + $box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$tmp[$i]); + $p = array(); + for($j=0; $j < 4; ++$j) { + $p[] = $bbox[$j*2]+$xl; + $p[] = $bbox[$j*2+1]+$yl-($h-$fh)+$fh*$i; + } + + // Draw bounding rectangle + $this->PushColor('darkgreen'); + $this->Polygon($p,true); + $this->PopColor(); + } + } + + // Get the bounding box + $bbox = $this->GetBBoxTTF($txt,$dir); + for($j=0; $j < 4; ++$j) { + $bbox[$j*2]+= round($x); + $bbox[$j*2+1]+= round($y - ($h-$fh) - $yadj); + } + $aBoundingBox = $bbox; + + if( $debug ) { + // Draw a cross at the anchor point + $this->PushColor('red'); + $this->Line($ox-25,$oy,$ox+25,$oy); + $this->Line($ox,$oy-25,$ox,$oy+25); + $this->PopColor(); + } + + } } - + function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) { - $x = round($x); - $y = round($y); + $x = round($x); + $y = round($y); - // Do special language encoding - $txt = $this->langconv->Convert($txt,$this->font_family); + // Do special language encoding + $txt = $this->langconv->Convert($txt,$this->font_family); - if( !is_numeric($dir) ) - JpGraphError::RaiseL(25094);//(" Direction for text most be given as an angle between 0 and 90."); - - if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) { - $this->_StrokeBuiltinFont($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug); - } - elseif($this->font_family >= _FIRST_FONT && $this->font_family <= _LAST_FONT) { - $this->_StrokeTTF($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug); - } - else - JpGraphError::RaiseL(25095);//(" Unknown font font family specification. "); - return $boundingbox; + if( !is_numeric($dir) ) { + JpGraphError::RaiseL(25094);//(" Direction for text most be given as an angle between 0 and 90."); + } + + if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) { + $this->_StrokeBuiltinFont($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug); + } + elseif( $this->font_family >= _FIRST_FONT && $this->font_family <= _LAST_FONT) { + $this->_StrokeTTF($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug); + } + else { + JpGraphError::RaiseL(25095);//(" Unknown font font family specification. "); + } + return $boundingbox; } - + function SetMargin($lm,$rm,$tm,$bm) { - $this->left_margin=$lm; - $this->right_margin=$rm; - $this->top_margin=$tm; - $this->bottom_margin=$bm; - $this->plotwidth=$this->width - $this->left_margin-$this->right_margin ; - $this->plotheight=$this->height - $this->top_margin-$this->bottom_margin ; - if( $this->width > 0 && $this->height > 0 ) { - if( $this->plotwidth < 0 || $this->plotheight < 0 ) - JpGraphError::raise("To small plot area. ($lm,$rm,$tm,$bm : $this->plotwidth x $this->plotheight). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins."); - } + $this->left_margin=$lm; + $this->right_margin=$rm; + $this->top_margin=$tm; + $this->bottom_margin=$bm; + $this->plotwidth=$this->width - $this->left_margin-$this->right_margin ; + $this->plotheight=$this->height - $this->top_margin-$this->bottom_margin ; + if( $this->width > 0 && $this->height > 0 ) { + if( $this->plotwidth < 0 || $this->plotheight < 0 ) { + JpGraphError::RaiseL(25130, $this->plotwidth, $this->plotheight); + //JpGraphError::raise("To small plot area. ($lm,$rm,$tm,$bm : $this->plotwidth x $this->plotheight). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins."); + } + } } function SetTransparent($color) { - imagecolortransparent ($this->img,$this->rgb->allocate($color)); + imagecolortransparent ($this->img,$this->rgb->allocate($color)); } - + function SetColor($color,$aAlpha=0) { - $this->current_color_name = $color; - $this->current_color=$this->rgb->allocate($color,$aAlpha); - if( $this->current_color == -1 ) { - $tc=imagecolorstotal($this->img); - JpGraphError::RaiseL(25096); -//("Can't allocate any more colors. Image has already allocated maximum of $tc colors. This might happen if you have anti-aliasing turned on together with a background image or perhaps gradient fill since this requires many, many colors. Try to turn off anti-aliasing. If there is still a problem try downgrading the quality of the background image to use a smaller pallete to leave some entries for your graphs. You should try to limit the number of colors in your background image to 64. If there is still problem set the constant DEFINE(\"USE_APPROX_COLORS\",true); in jpgraph.php This will use approximative colors when the palette is full. Unfortunately there is not much JpGraph can do about this since the palette size is a limitation of current graphic format and what the underlying GD library suppports."); - } - return $this->current_color; + $this->current_color_name = $color; + $this->current_color=$this->rgb->allocate($color,$aAlpha); + if( $this->current_color == -1 ) { + $tc=imagecolorstotal($this->img); + JpGraphError::RaiseL(25096); + //("Can't allocate any more colors. Image has already allocated maximum of $tc colors. This might happen if you have anti-aliasing turned on together with a background image or perhaps gradient fill since this requires many, many colors. Try to turn off anti-aliasing. If there is still a problem try downgrading the quality of the background image to use a smaller pallete to leave some entries for your graphs. You should try to limit the number of colors in your background image to 64. If there is still problem set the constant DEFINE(\"USE_APPROX_COLORS\",true); in jpgraph.php This will use approximative colors when the palette is full. Unfortunately there is not much JpGraph can do about this since the palette size is a limitation of current graphic format and what the underlying GD library suppports."); + } + return $this->current_color; } - + function PushColor($color) { - if( $color != "" ) { - $this->colorstack[$this->colorstackidx]=$this->current_color_name; - $this->colorstack[$this->colorstackidx+1]=$this->current_color; - $this->colorstackidx+=2; - $this->SetColor($color); - } - else { - JpGraphError::RaiseL(25097);//("Color specified as empty string in PushColor()."); - } + if( $color != "" ) { + $this->colorstack[$this->colorstackidx]=$this->current_color_name; + $this->colorstack[$this->colorstackidx+1]=$this->current_color; + $this->colorstackidx+=2; + $this->SetColor($color); + } + else { + JpGraphError::RaiseL(25097);//("Color specified as empty string in PushColor()."); + } } - + function PopColor() { - if($this->colorstackidx<1) - JpGraphError::RaiseL(25098);//(" Negative Color stack index. Unmatched call to PopColor()"); - $this->current_color=$this->colorstack[--$this->colorstackidx]; - $this->current_color_name=$this->colorstack[--$this->colorstackidx]; + if( $this->colorstackidx < 1 ) { + JpGraphError::RaiseL(25098);//(" Negative Color stack index. Unmatched call to PopColor()"); + } + $this->current_color=$this->colorstack[--$this->colorstackidx]; + $this->current_color_name=$this->colorstack[--$this->colorstackidx]; } - - + + function SetLineWeight($weight) { - imagesetthickness($this->img,$weight); - $this->line_weight = $weight; + $old = $this->line_weight; + imagesetthickness($this->img,$weight); + $this->line_weight = $weight; + return $old; } - + function SetStartPoint($x,$y) { - $this->lastx=round($x); - $this->lasty=round($y); + $this->lastx=round($x); + $this->lasty=round($y); } - + function Arc($cx,$cy,$w,$h,$s,$e) { - // GD Arc doesn't like negative angles - while( $s < 0) $s += 360; - while( $e < 0) $e += 360; - - imagearc($this->img,round($cx),round($cy),round($w),round($h), - $s,$e,$this->current_color); + // GD Arc doesn't like negative angles + while( $s < 0) $s += 360; + while( $e < 0) $e += 360; + imagearc($this->img,round($cx),round($cy),round($w),round($h),$s,$e,$this->current_color); } - + function FilledArc($xc,$yc,$w,$h,$s,$e,$style='') { - while( $s < 0 ) $s += 360; - while( $e < 0 ) $e += 360; - if( $style=='' ) - $style=IMG_ARC_PIE; - if( abs($s-$e) > 0.001 ) { - imagefilledarc($this->img,round($xc),round($yc),round($w),round($h), - round($s),round($e),$this->current_color,$style); - } + $s = round($s); + $e = round($e); + while( $s < 0 ) $s += 360; + while( $e < 0 ) $e += 360; + if( $style=='' ) + $style=IMG_ARC_PIE; + if( abs($s-$e) > 0 ) { + imagefilledarc($this->img,round($xc),round($yc),round($w),round($h),$s,$e,$this->current_color,$style); + } } function FilledCakeSlice($cx,$cy,$w,$h,$s,$e) { - $this->CakeSlice($cx,$cy,$w,$h,$s,$e,$this->current_color_name); + $this->CakeSlice($cx,$cy,$w,$h,$s,$e,$this->current_color_name); } function CakeSlice($xc,$yc,$w,$h,$s,$e,$fillcolor="",$arccolor="") { - $s = round($s); $e = round($e); - $w = round($w); $h = round($h); - $xc = round($xc); $yc = round($yc); - if( $s ==$e ) { - // A full circle. We draw this a plain circle - $this->PushColor($fillcolor); - imagefilledellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color); - $this->PopColor(); - $this->PushColor($arccolor); - imageellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color); - $this->Line($xc,$yc,cos($s*M_PI/180)*$w+$xc,$yc+sin($s*M_PI/180)*$h); - $this->PopColor(); - } - else { - $this->PushColor($fillcolor); - $this->FilledArc($xc,$yc,2*$w,2*$h,$s,$e); - $this->PopColor(); - if( $arccolor != "" ) { - $this->PushColor($arccolor); - // We add 2 pixels to make the Arc() better aligned with - // the filled arc. - imagefilledarc($this->img,$xc,$yc,2*$w,2*$h,$s,$e,$this->current_color,IMG_ARC_NOFILL | IMG_ARC_EDGED ) ; - $this->PopColor(); - } - } + $s = round($s); $e = round($e); + $w = round($w); $h = round($h); + $xc = round($xc); $yc = round($yc); + if( $s ==$e ) { + // A full circle. We draw this a plain circle + $this->PushColor($fillcolor); + imagefilledellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color); + $this->PopColor(); + $this->PushColor($arccolor); + imageellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color); + $this->Line($xc,$yc,cos($s*M_PI/180)*$w+$xc,$yc+sin($s*M_PI/180)*$h); + $this->PopColor(); + } + else { + $this->PushColor($fillcolor); + $this->FilledArc($xc,$yc,2*$w,2*$h,$s,$e); + $this->PopColor(); + if( $arccolor != "" ) { + $this->PushColor($arccolor); + // We add 2 pixels to make the Arc() better aligned with + // the filled arc. + imagefilledarc($this->img,$xc,$yc,2*$w,2*$h,$s,$e,$this->current_color,IMG_ARC_NOFILL | IMG_ARC_EDGED ) ; + $this->PopColor(); + } + } } function Ellipse($xc,$yc,$w,$h) { - $this->Arc($xc,$yc,$w,$h,0,360); + $this->Arc($xc,$yc,$w,$h,0,360); } - + function Circle($xc,$yc,$r) { - imageellipse($this->img,round($xc),round($yc),$r*2,$r*2,$this->current_color); + imageellipse($this->img,round($xc),round($yc),$r*2,$r*2,$this->current_color); } - + function FilledCircle($xc,$yc,$r) { - imagefilledellipse($this->img,round($xc),round($yc),2*$r,2*$r,$this->current_color); + imagefilledellipse($this->img,round($xc),round($yc),2*$r,2*$r,$this->current_color); } - + // Linear Color InterPolation function lip($f,$t,$p) { - $p = round($p,1); - $r = $f[0] + ($t[0]-$f[0])*$p; - $g = $f[1] + ($t[1]-$f[1])*$p; - $b = $f[2] + ($t[2]-$f[2])*$p; - return array($r,$g,$b); + $p = round($p,1); + $r = $f[0] + ($t[0]-$f[0])*$p; + $g = $f[1] + ($t[1]-$f[1])*$p; + $b = $f[2] + ($t[2]-$f[2])*$p; + return array($r,$g,$b); } // Set line style dashed, dotted etc function SetLineStyle($s) { - if( is_numeric($s) ) { - if( $s<1 || $s>4 ) - JpGraphError::RaiseL(25101,$s);//(" Illegal numeric argument to SetLineStyle(): ($s)"); - } - elseif( is_string($s) ) { - if( $s == "solid" ) $s=1; - elseif( $s == "dotted" ) $s=2; - elseif( $s == "dashed" ) $s=3; - elseif( $s == "longdashed" ) $s=4; - else JpGraphError::RaiseL(25102,$s);//(" Illegal string argument to SetLineStyle(): $s"); - } - else { - JpGraphError::RaiseL(25103,$s);//(" Illegal argument to SetLineStyle $s"); - } - $old = $this->line_style; - $this->line_style=$s; - return $old; + if( is_numeric($s) ) { + if( $s<1 || $s>4 ) { + JpGraphError::RaiseL(25101,$s);//(" Illegal numeric argument to SetLineStyle(): ($s)"); + } + } + elseif( is_string($s) ) { + if( $s == "solid" ) $s=1; + elseif( $s == "dotted" ) $s=2; + elseif( $s == "dashed" ) $s=3; + elseif( $s == "longdashed" ) $s=4; + else { + JpGraphError::RaiseL(25102,$s);//(" Illegal string argument to SetLineStyle(): $s"); + } + } + else { + JpGraphError::RaiseL(25103,$s);//(" Illegal argument to SetLineStyle $s"); + } + $old = $this->line_style; + $this->line_style=$s; + return $old; } - + // Same as Line but take the line_style into account function StyleLine($x1,$y1,$x2,$y2,$aStyle='') { - if( $this->line_weight <= 0 ) - return; + if( $this->line_weight <= 0 ) return; - if( $aStyle === '' ) { - $aStyle = $this->line_style; - } + if( $aStyle === '' ) { + $aStyle = $this->line_style; + } - // Add error check since dashed line will only work if anti-alias is disabled - // this is a limitation in GD + // Add error check since dashed line will only work if anti-alias is disabled + // this is a limitation in GD - switch( $aStyle ) { - case 1:// Solid - $this->Line($x1,$y1,$x2,$y2); - break; - case 2: // Dotted - $this->DashedLine($x1,$y1,$x2,$y2,2,6); - break; - case 3: // Dashed - $this->DashedLine($x1,$y1,$x2,$y2,5,9); - break; - case 4: // Longdashes - $this->DashedLine($x1,$y1,$x2,$y2,9,13); - break; - default: - JpGraphError::RaiseL(25104,$this->line_style);//(" Unknown line style: $this->line_style "); - break; - } + if( $aStyle == 1 ) { + // Solid style. We can handle anti-aliasing for this + $this->Line($x1,$y1,$x2,$y2); + } + else { + // Since the GD routines doesn't handle AA for styled line + // we have no option than to turn it off to get any lines at + // all if the weight > 1 + $oldaa = $this->GetAntiAliasing(); + if( $oldaa && $this->line_weight > 1 ) { + $this->SetAntiAliasing(false); + } + + switch( $aStyle ) { + case 2: // Dotted + $this->DashedLine($x1,$y1,$x2,$y2,2,6); + break; + case 3: // Dashed + $this->DashedLine($x1,$y1,$x2,$y2,5,9); + break; + case 4: // Longdashes + $this->DashedLine($x1,$y1,$x2,$y2,9,13); + break; + default: + JpGraphError::RaiseL(25104,$this->line_style);//(" Unknown line style: $this->line_style "); + break; + } + if( $oldaa ) { + $this->SetAntiAliasing(true); + } + } } - + function DashedLine($x1,$y1,$x2,$y2,$dash_length=1,$dash_space=4) { - if( $this->line_weight <= 0 ) - return; + if( $this->line_weight <= 0 ) return; - // Add error check to make sure anti-alias is not enabled. - // Dashed line does not work with anti-alias enabled. This - // is a limitation in GD. - if( $this->use_anti_aliasing ) { - JpGraphError::RaiseL(25129); // Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines. - } - + // Add error check to make sure anti-alias is not enabled. + // Dashed line does not work with anti-alias enabled. This + // is a limitation in GD. + if( $this->use_anti_aliasing ) { + JpGraphError::RaiseL(25129); // Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines. + } - $x1 = round($x1); - $x2 = round($x2); - $y1 = round($y1); - $y2 = round($y2); - $style = array_fill(0,$dash_length,$this->current_color); - $style = array_pad($style,$dash_space,IMG_COLOR_TRANSPARENT); - imagesetstyle($this->img, $style); - imageline($this->img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED); - $this->lastx=$x2; $this->lasty=$y2; - } + $x1 = round($x1); + $x2 = round($x2); + $y1 = round($y1); + $y2 = round($y2); + + $style = array_fill(0,$dash_length,$this->current_color); + $style = array_pad($style,$dash_space,IMG_COLOR_TRANSPARENT); + imagesetstyle($this->img, $style); + imageline($this->img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED); + $this->lastx = $x2; + $this->lasty = $y2; + } function Line($x1,$y1,$x2,$y2) { - if( $this->line_weight <= 0 ) - return; + if( $this->line_weight <= 0 ) return; - $x1 = round($x1); - $x2 = round($x2); - $y1 = round($y1); - $y2 = round($y2); + $x1 = round($x1); + $x2 = round($x2); + $y1 = round($y1); + $y2 = round($y2); - imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color); - $this->lastx=$x2; $this->lasty=$y2; + imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color); + $this->lastx=$x2; + $this->lasty=$y2; } function Polygon($p,$closed=FALSE,$fast=FALSE) { - if( $this->line_weight <= 0 ) - return; + if( $this->line_weight <= 0 ) return; - $n=count($p); - $oldx = $p[0]; - $oldy = $p[1]; - if( $fast ) { - for( $i=2; $i < $n; $i+=2 ) { - imageline($this->img,$oldx,$oldy,$p[$i],$p[$i+1],$this->current_color); - $oldx = $p[$i]; - $oldy = $p[$i+1]; - } - if( $closed ) { - imageline($this->img,$p[$n*2-2],$p[$n*2-1],$p[0],$p[1],$this->current_color); - } - } - else { - for( $i=2; $i < $n; $i+=2 ) { - $this->StyleLine($oldx,$oldy,$p[$i],$p[$i+1]); - $oldx = $p[$i]; - $oldy = $p[$i+1]; - } - if( $closed ) - $this->StyleLine($oldx,$oldy,$p[0],$p[1]); - } + $n=count($p); + $oldx = $p[0]; + $oldy = $p[1]; + if( $fast ) { + for( $i=2; $i < $n; $i+=2 ) { + imageline($this->img,$oldx,$oldy,$p[$i],$p[$i+1],$this->current_color); + $oldx = $p[$i]; + $oldy = $p[$i+1]; + } + if( $closed ) { + imageline($this->img,$p[$n*2-2],$p[$n*2-1],$p[0],$p[1],$this->current_color); + } + } + else { + for( $i=2; $i < $n; $i+=2 ) { + $this->StyleLine($oldx,$oldy,$p[$i],$p[$i+1]); + $oldx = $p[$i]; + $oldy = $p[$i+1]; + } + if( $closed ) { + $this->StyleLine($oldx,$oldy,$p[0],$p[1]); + } + } } - + function FilledPolygon($pts) { - $n=count($pts); - if( $n == 0 ) { - JpGraphError::RaiseL(25105);//('NULL data specified for a filled polygon. Check that your data is not NULL.'); - } - for($i=0; $i < $n; ++$i) - $pts[$i] = round($pts[$i]); - imagefilledpolygon($this->img,$pts,count($pts)/2,$this->current_color); + $n=count($pts); + if( $n == 0 ) { + JpGraphError::RaiseL(25105);//('NULL data specified for a filled polygon. Check that your data is not NULL.'); + } + for($i=0; $i < $n; ++$i) { + $pts[$i] = round($pts[$i]); + } + imagefilledpolygon($this->img,$pts,count($pts)/2,$this->current_color); } - + function Rectangle($xl,$yu,$xr,$yl) { - $this->Polygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl,$xl,$yu)); + $this->Polygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl,$xl,$yu)); } - + function FilledRectangle($xl,$yu,$xr,$yl) { - $this->FilledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl)); + $this->FilledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl)); } function FilledRectangle2($xl,$yu,$xr,$yl,$color1,$color2,$style=1) { - // Fill a rectangle with lines of two colors - if( $style===1 ) { - // Horizontal stripe - if( $yl < $yu ) { - $t = $yl; $yl=$yu; $yu=$t; - } - for( $y=$yu; $y <= $yl; ++$y) { - $this->SetColor($color1); - $this->Line($xl,$y,$xr,$y); - ++$y; - $this->SetColor($color2); - $this->Line($xl,$y,$xr,$y); - } - } - else { - if( $xl < $xl ) { - $t = $xl; $xl=$xr; $xr=$t; - } - for( $x=$xl; $x <= $xr; ++$x) { - $this->SetColor($color1); - $this->Line($x,$yu,$x,$yl); - ++$x; - $this->SetColor($color2); - $this->Line($x,$yu,$x,$yl); - } - } + // Fill a rectangle with lines of two colors + if( $style===1 ) { + // Horizontal stripe + if( $yl < $yu ) { + $t = $yl; $yl=$yu; $yu=$t; + } + for( $y=$yu; $y <= $yl; ++$y) { + $this->SetColor($color1); + $this->Line($xl,$y,$xr,$y); + ++$y; + $this->SetColor($color2); + $this->Line($xl,$y,$xr,$y); + } + } + else { + if( $xl < $xl ) { + $t = $xl; $xl=$xr; $xr=$t; + } + for( $x=$xl; $x <= $xr; ++$x) { + $this->SetColor($color1); + $this->Line($x,$yu,$x,$yl); + ++$x; + $this->SetColor($color2); + $this->Line($x,$yu,$x,$yl); + } + } } function ShadowRectangle($xl,$yu,$xr,$yl,$fcolor=false,$shadow_width=3,$shadow_color=array(102,102,102)) { - // This is complicated by the fact that we must also handle the case where + // This is complicated by the fact that we must also handle the case where // the reactangle has no fill color - $this->PushColor($shadow_color); - $this->FilledRectangle($xr-$shadow_width,$yu+$shadow_width,$xr,$yl-$shadow_width-1); - $this->FilledRectangle($xl+$shadow_width,$yl-$shadow_width,$xr,$yl); - //$this->FilledRectangle($xl+$shadow_width,$yu+$shadow_width,$xr,$yl); - $this->PopColor(); - if( $fcolor==false ) - $this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); - else { - $this->PushColor($fcolor); - $this->FilledRectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); - $this->PopColor(); - $this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); - } + $this->PushColor($shadow_color); + $this->FilledRectangle($xr-$shadow_width,$yu+$shadow_width,$xr,$yl-$shadow_width-1); + $this->FilledRectangle($xl+$shadow_width,$yl-$shadow_width,$xr,$yl); + //$this->FilledRectangle($xl+$shadow_width,$yu+$shadow_width,$xr,$yl); + $this->PopColor(); + if( $fcolor==false ) { + $this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); + } + else { + $this->PushColor($fcolor); + $this->FilledRectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); + $this->PopColor(); + $this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1); + } } function FilledRoundedRectangle($xt,$yt,$xr,$yl,$r=5) { - if( $r==0 ) { - $this->FilledRectangle($xt,$yt,$xr,$yl); - return; - } + if( $r==0 ) { + $this->FilledRectangle($xt,$yt,$xr,$yl); + return; + } - // To avoid overlapping fillings (which will look strange - // when alphablending is enabled) we have no choice but - // to fill the five distinct areas one by one. - - // Center square - $this->FilledRectangle($xt+$r,$yt+$r,$xr-$r,$yl-$r); - // Top band - $this->FilledRectangle($xt+$r,$yt,$xr-$r,$yt+$r-1); - // Bottom band - $this->FilledRectangle($xt+$r,$yl-$r+1,$xr-$r,$yl); - // Left band - $this->FilledRectangle($xt,$yt+$r+1,$xt+$r-1,$yl-$r); - // Right band - $this->FilledRectangle($xr-$r+1,$yt+$r,$xr,$yl-$r); + // To avoid overlapping fillings (which will look strange + // when alphablending is enabled) we have no choice but + // to fill the five distinct areas one by one. - // Topleft & Topright arc - $this->FilledArc($xt+$r,$yt+$r,$r*2,$r*2,180,270); - $this->FilledArc($xr-$r,$yt+$r,$r*2,$r*2,270,360); + // Center square + $this->FilledRectangle($xt+$r,$yt+$r,$xr-$r,$yl-$r); + // Top band + $this->FilledRectangle($xt+$r,$yt,$xr-$r,$yt+$r); + // Bottom band + $this->FilledRectangle($xt+$r,$yl-$r,$xr-$r,$yl); + // Left band + $this->FilledRectangle($xt,$yt+$r,$xt+$r,$yl-$r); + // Right band + $this->FilledRectangle($xr-$r,$yt+$r,$xr,$yl-$r); - // Bottomleft & Bottom right arc - $this->FilledArc($xt+$r,$yl-$r,$r*2,$r*2,90,180); - $this->FilledArc($xr-$r,$yl-$r,$r*2,$r*2,0,90); + // Topleft & Topright arc + $this->FilledArc($xt+$r,$yt+$r,$r*2,$r*2,180,270); + $this->FilledArc($xr-$r,$yt+$r,$r*2,$r*2,270,360); + + // Bottomleft & Bottom right arc + $this->FilledArc($xt+$r,$yl-$r,$r*2,$r*2,90,180); + $this->FilledArc($xr-$r,$yl-$r,$r*2,$r*2,0,90); } - function RoundedRectangle($xt,$yt,$xr,$yl,$r=5) { + function RoundedRectangle($xt,$yt,$xr,$yl,$r=5) { - if( $r==0 ) { - $this->Rectangle($xt,$yt,$xr,$yl); - return; - } + if( $r==0 ) { + $this->Rectangle($xt,$yt,$xr,$yl); + return; + } - // Top & Bottom line - $this->Line($xt+$r,$yt,$xr-$r,$yt); - $this->Line($xt+$r,$yl,$xr-$r,$yl); + // Top & Bottom line + $this->Line($xt+$r,$yt,$xr-$r,$yt); + $this->Line($xt+$r,$yl,$xr-$r,$yl); - // Left & Right line - $this->Line($xt,$yt+$r,$xt,$yl-$r); - $this->Line($xr,$yt+$r,$xr,$yl-$r); + // Left & Right line + $this->Line($xt,$yt+$r,$xt,$yl-$r); + $this->Line($xr,$yt+$r,$xr,$yl-$r); - // Topleft & Topright arc - $this->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); - $this->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); + // Topleft & Topright arc + $this->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); + $this->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); - // Bottomleft & Bottomright arc - $this->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); - $this->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); + // Bottomleft & Bottomright arc + $this->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); + $this->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); } function FilledBevel($x1,$y1,$x2,$y2,$depth=2,$color1='white@0.4',$color2='darkgray@0.4') { - $this->FilledRectangle($x1,$y1,$x2,$y2); - $this->Bevel($x1,$y1,$x2,$y2,$depth,$color1,$color2); + $this->FilledRectangle($x1,$y1,$x2,$y2); + $this->Bevel($x1,$y1,$x2,$y2,$depth,$color1,$color2); } function Bevel($x1,$y1,$x2,$y2,$depth=2,$color1='white@0.4',$color2='black@0.5') { - $this->PushColor($color1); - for( $i=0; $i < $depth; ++$i ) { - $this->Line($x1+$i,$y1+$i,$x1+$i,$y2-$i); - $this->Line($x1+$i,$y1+$i,$x2-$i,$y1+$i); - } - $this->PopColor(); - - $this->PushColor($color2); - for( $i=0; $i < $depth; ++$i ) { - $this->Line($x1+$i,$y2-$i,$x2-$i,$y2-$i); - $this->Line($x2-$i,$y1+$i,$x2-$i,$y2-$i-1); - } - $this->PopColor(); + $this->PushColor($color1); + for( $i=0; $i < $depth; ++$i ) { + $this->Line($x1+$i,$y1+$i,$x1+$i,$y2-$i); + $this->Line($x1+$i,$y1+$i,$x2-$i,$y1+$i); + } + $this->PopColor(); + + $this->PushColor($color2); + for( $i=0; $i < $depth; ++$i ) { + $this->Line($x1+$i,$y2-$i,$x2-$i,$y2-$i); + $this->Line($x2-$i,$y1+$i,$x2-$i,$y2-$i-1); + } + $this->PopColor(); } function StyleLineTo($x,$y) { - $this->StyleLine($this->lastx,$this->lasty,$x,$y); - $this->lastx=$x; - $this->lasty=$y; + $this->StyleLine($this->lastx,$this->lasty,$x,$y); + $this->lastx=$x; + $this->lasty=$y; } - + function LineTo($x,$y) { - $this->Line($this->lastx,$this->lasty,$x,$y); - $this->lastx=$x; - $this->lasty=$y; + $this->Line($this->lastx,$this->lasty,$x,$y); + $this->lastx=$x; + $this->lasty=$y; } - + function Point($x,$y) { - imagesetpixel($this->img,round($x),round($y),$this->current_color); + imagesetpixel($this->img,round($x),round($y),$this->current_color); } - + function Fill($x,$y) { - imagefill($this->img,round($x),round($y),$this->current_color); + imagefill($this->img,round($x),round($y),$this->current_color); } function FillToBorder($x,$y,$aBordColor) { - $bc = $this->rgb->allocate($aBordColor); - if( $bc == -1 ) { - JpGraphError::RaiseL(25106);//('Image::FillToBorder : Can not allocate more colors'); - } - imagefilltoborder($this->img,round($x),round($y),$bc,$this->current_color); + $bc = $this->rgb->allocate($aBordColor); + if( $bc == -1 ) { + JpGraphError::RaiseL(25106);//('Image::FillToBorder : Can not allocate more colors'); + } + imagefilltoborder($this->img,round($x),round($y),$bc,$this->current_color); } function SetExpired($aFlg=true) { - $this->expired = $aFlg; + $this->expired = $aFlg; } - + // Generate image header function Headers() { - - // In case we are running from the command line with the client version of - // PHP we can't send any headers. - $sapi = php_sapi_name(); - if( $sapi == 'cli' ) - return; - // These parameters are set by headers_sent() but they might cause - // an undefined variable error unless they are initilized - $file=''; - $lineno=''; - if( headers_sent($file,$lineno) ) { - $file=basename($file); - $t = new ErrMsgText(); - $msg = $t->Get(10,$file,$lineno); - die($msg); - } - - if ($this->expired) { - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); - header("Cache-Control: no-cache, must-revalidate"); - header("Pragma: no-cache"); - } - header("Content-type: image/$this->img_format"); + // In case we are running from the command line with the client version of + // PHP we can't send any headers. + $sapi = php_sapi_name(); + if( $sapi == 'cli' ) return; + + // These parameters are set by headers_sent() but they might cause + // an undefined variable error unless they are initilized + $file=''; + $lineno=''; + if( headers_sent($file,$lineno) ) { + $file=basename($file); + $t = new ErrMsgText(); + $msg = $t->Get(10,$file,$lineno); + die($msg); + } + + if ($this->expired) { + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); + header("Cache-Control: no-cache, must-revalidate"); + header("Pragma: no-cache"); + } + header("Content-type: image/$this->img_format"); } // Adjust image quality for formats that allow this function SetQuality($q) { - $this->quality = $q; + $this->quality = $q; } - + // Stream image to browser or to file function Stream($aFile="") { - $func="image".$this->img_format; - if( $this->img_format=="jpeg" && $this->quality != null ) { - $res = @$func($this->img,$aFile,$this->quality); - } - else { - if( $aFile != "" ) { - $res = @$func($this->img,$aFile); - if( !$res ) - JpGraphError::RaiseL(25107,$aFile);//("Can't write to file '$aFile'. Check that the process running PHP has enough permission."); - } - else { - $res = @$func($this->img); - if( !$res ) - JpGraphError::RaiseL(25108);//("Can't stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP."); - - } - } + $func="image".$this->img_format; + if( $this->img_format=="jpeg" && $this->quality != null ) { + $res = @$func($this->img,$aFile,$this->quality); + } + else { + if( $aFile != "" ) { + $res = @$func($this->img,$aFile); + if( !$res ) { + JpGraphError::RaiseL(25107,$aFile);//("Can't write to file '$aFile'. Check that the process running PHP has enough permission."); + } + } + else { + $res = @$func($this->img); + if( !$res ) { + JpGraphError::RaiseL(25108);//("Can't stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP."); + } + + } + } } - - // Clear resource tide up by image + + // Clear resources used by image (this is normally not used since all resources are/should be + // returned when the script terminates function Destroy() { - imagedestroy($this->img); + imagedestroy($this->img); } - + // Specify image format. Note depending on your installation // of PHP not all formats may be supported. - function SetImgFormat($aFormat,$aQuality=75) { - $this->quality = $aQuality; - $aFormat = strtolower($aFormat); - $tst = true; - $supported = imagetypes(); - if( $aFormat=="auto" ) { - if( $supported & IMG_PNG ) - $this->img_format="png"; - elseif( $supported & IMG_JPG ) - $this->img_format="jpeg"; - elseif( $supported & IMG_GIF ) - $this->img_format="gif"; - elseif( $supported & IMG_WBMP ) - $this->img_format="wbmp"; - elseif( $supported & IMG_XPM ) - $this->img_format="xpm"; - else - JpGraphError::RaiseL(25109);//("Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details."); - - return true; - } - else { - if( $aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif" ) { - if( $aFormat=="jpeg" && !($supported & IMG_JPG) ) - $tst=false; - elseif( $aFormat=="png" && !($supported & IMG_PNG) ) - $tst=false; - elseif( $aFormat=="gif" && !($supported & IMG_GIF) ) - $tst=false; - elseif( $aFormat=="wbmp" && !($supported & IMG_WBMP) ) - $tst=false; - elseif( $aFormat=="xpm" && !($supported & IMG_XPM) ) - $tst=false; - else { - $this->img_format=$aFormat; - return true; - } - } - else - $tst=false; - if( !$tst ) - JpGraphError::RaiseL(25110,$aFormat);//(" Your PHP installation does not support the chosen graphic format: $aFormat"); - } - } + function SetImgFormat($aFormat,$aQuality=75) { + $this->quality = $aQuality; + $aFormat = strtolower($aFormat); + $tst = true; + $supported = imagetypes(); + if( $aFormat=="auto" ) { + if( $supported & IMG_PNG ) $this->img_format="png"; + elseif( $supported & IMG_JPG ) $this->img_format="jpeg"; + elseif( $supported & IMG_GIF ) $this->img_format="gif"; + elseif( $supported & IMG_WBMP ) $this->img_format="wbmp"; + elseif( $supported & IMG_XPM ) $this->img_format="xpm"; + else { + JpGraphError::RaiseL(25109);//("Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details."); + } + return true; + } + else { + if( $aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif" ) { + if( $aFormat=="jpeg" && !($supported & IMG_JPG) ) $tst=false; + elseif( $aFormat=="png" && !($supported & IMG_PNG) ) $tst=false; + elseif( $aFormat=="gif" && !($supported & IMG_GIF) ) $tst=false; + elseif( $aFormat=="wbmp" && !($supported & IMG_WBMP) ) $tst=false; + elseif( $aFormat=="xpm" && !($supported & IMG_XPM) ) $tst=false; + else { + $this->img_format=$aFormat; + return true; + } + } + else { + $tst=false; + } + if( !$tst ) { + JpGraphError::RaiseL(25110,$aFormat);//(" Your PHP installation does not support the chosen graphic format: $aFormat"); + } + } + } } // CLASS //=================================================== @@ -1302,318 +1616,368 @@ class Image { //=================================================== class RotImage extends Image { public $a=0; - public $dx=0,$dy=0,$transx=0,$transy=0; + public $dx=0,$dy=0,$transx=0,$transy=0; private $m=array(); - - function RotImage($aWidth,$aHeight,$a=0,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) { - $this->Image($aWidth,$aHeight,$aFormat,$aSetAutoMargin); - $this->dx=$this->left_margin+$this->plotwidth/2; - $this->dy=$this->top_margin+$this->plotheight/2; - $this->SetAngle($a); + + function __construct($aWidth,$aHeight,$a=0,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) { + parent::__construct($aWidth,$aHeight,$aFormat,$aSetAutoMargin); + $this->dx=$this->left_margin+$this->plotwidth/2; + $this->dy=$this->top_margin+$this->plotheight/2; + $this->SetAngle($a); } - + function SetCenter($dx,$dy) { - $old_dx = $this->dx; - $old_dy = $this->dy; - $this->dx=$dx; - $this->dy=$dy; - $this->SetAngle($this->a); - return array($old_dx,$old_dy); + $old_dx = $this->dx; + $old_dy = $this->dy; + $this->dx=$dx; + $this->dy=$dy; + $this->SetAngle($this->a); + return array($old_dx,$old_dy); } - + function SetTranslation($dx,$dy) { - $old = array($this->transx,$this->transy); - $this->transx = $dx; - $this->transy = $dy; - return $old; + $old = array($this->transx,$this->transy); + $this->transx = $dx; + $this->transy = $dy; + return $old; } function UpdateRotMatrice() { - $a = $this->a; - $a *= M_PI/180; - $sa=sin($a); $ca=cos($a); - // Create the rotation matrix - $this->m[0][0] = $ca; - $this->m[0][1] = -$sa; - $this->m[0][2] = $this->dx*(1-$ca) + $sa*$this->dy ; - $this->m[1][0] = $sa; - $this->m[1][1] = $ca; - $this->m[1][2] = $this->dy*(1-$ca) - $sa*$this->dx ; + $a = $this->a; + $a *= M_PI/180; + $sa=sin($a); $ca=cos($a); + // Create the rotation matrix + $this->m[0][0] = $ca; + $this->m[0][1] = -$sa; + $this->m[0][2] = $this->dx*(1-$ca) + $sa*$this->dy ; + $this->m[1][0] = $sa; + $this->m[1][1] = $ca; + $this->m[1][2] = $this->dy*(1-$ca) - $sa*$this->dx ; } function SetAngle($a) { - $tmp = $this->a; - $this->a = $a; - $this->UpdateRotMatrice(); - return $tmp; + $tmp = $this->a; + $this->a = $a; + $this->UpdateRotMatrice(); + return $tmp; } function Circle($xc,$yc,$r) { - list($xc,$yc) = $this->Rotate($xc,$yc); - parent::Circle($xc,$yc,$r); + list($xc,$yc) = $this->Rotate($xc,$yc); + parent::Circle($xc,$yc,$r); } function FilledCircle($xc,$yc,$r) { - list($xc,$yc) = $this->Rotate($xc,$yc); - parent::FilledCircle($xc,$yc,$r); + list($xc,$yc) = $this->Rotate($xc,$yc); + parent::FilledCircle($xc,$yc,$r); } - + function Arc($xc,$yc,$w,$h,$s,$e) { - list($xc,$yc) = $this->Rotate($xc,$yc); - $s += $this->a; - $e += $this->a; - parent::Arc($xc,$yc,$w,$h,$s,$e); + list($xc,$yc) = $this->Rotate($xc,$yc); + $s += $this->a; + $e += $this->a; + parent::Arc($xc,$yc,$w,$h,$s,$e); } function FilledArc($xc,$yc,$w,$h,$s,$e,$style='') { - list($xc,$yc) = $this->Rotate($xc,$yc); - $s += $this->a; - $e += $this->a; - parent::FilledArc($xc,$yc,$w,$h,$s,$e); + list($xc,$yc) = $this->Rotate($xc,$yc); + $s += $this->a; + $e += $this->a; + parent::FilledArc($xc,$yc,$w,$h,$s,$e); } function SetMargin($lm,$rm,$tm,$bm) { - parent::SetMargin($lm,$rm,$tm,$bm); - $this->dx=$this->left_margin+$this->plotwidth/2; - $this->dy=$this->top_margin+$this->plotheight/2; - $this->UpdateRotMatrice(); + parent::SetMargin($lm,$rm,$tm,$bm); + $this->dx=$this->left_margin+$this->plotwidth/2; + $this->dy=$this->top_margin+$this->plotheight/2; + $this->UpdateRotMatrice(); } - + function Rotate($x,$y) { - // Optimization. Ignore rotation if Angle==0 || Angle==360 - if( $this->a == 0 || $this->a == 360 ) { - return array($x + $this->transx, $y + $this->transy ); - } - else { - $x1=round($this->m[0][0]*$x + $this->m[0][1]*$y,1) + $this->m[0][2] + $this->transx; - $y1=round($this->m[1][0]*$x + $this->m[1][1]*$y,1) + $this->m[1][2] + $this->transy; - return array($x1,$y1); - } + // Optimization. Ignore rotation if Angle==0 || Angle==360 + if( $this->a == 0 || $this->a == 360 ) { + return array($x + $this->transx, $y + $this->transy ); + } + else { + $x1=round($this->m[0][0]*$x + $this->m[0][1]*$y,1) + $this->m[0][2] + $this->transx; + $y1=round($this->m[1][0]*$x + $this->m[1][1]*$y,1) + $this->m[1][2] + $this->transy; + return array($x1,$y1); + } } - + function CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1,$aMix=100) { - list($toX,$toY) = $this->Rotate($toX,$toY); - parent::CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight,$aMix); + list($toX,$toY) = $this->Rotate($toX,$toY); + parent::CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight,$aMix); } function ArrRotate($pnts) { - $n = count($pnts)-1; - for($i=0; $i < $n; $i+=2) { - list ($x,$y) = $this->Rotate($pnts[$i],$pnts[$i+1]); - $pnts[$i] = $x; $pnts[$i+1] = $y; - } - return $pnts; + $n = count($pnts)-1; + for($i=0; $i < $n; $i+=2) { + list ($x,$y) = $this->Rotate($pnts[$i],$pnts[$i+1]); + $pnts[$i] = $x; $pnts[$i+1] = $y; + } + return $pnts; } function DashedLine($x1,$y1,$x2,$y2,$dash_length=1,$dash_space=4) { - list($x1,$y1) = $this->Rotate($x1,$y1); - list($x2,$y2) = $this->Rotate($x2,$y2); - parent::DashedLine($x1,$y1,$x2,$y2,$dash_length,$dash_space); + list($x1,$y1) = $this->Rotate($x1,$y1); + list($x2,$y2) = $this->Rotate($x2,$y2); + parent::DashedLine($x1,$y1,$x2,$y2,$dash_length,$dash_space); } - + function Line($x1,$y1,$x2,$y2) { - list($x1,$y1) = $this->Rotate($x1,$y1); - list($x2,$y2) = $this->Rotate($x2,$y2); - parent::Line($x1,$y1,$x2,$y2); + list($x1,$y1) = $this->Rotate($x1,$y1); + list($x2,$y2) = $this->Rotate($x2,$y2); + parent::Line($x1,$y1,$x2,$y2); } function Rectangle($x1,$y1,$x2,$y2) { - // Rectangle uses Line() so it will be rotated through that call - parent::Rectangle($x1,$y1,$x2,$y2); + // Rectangle uses Line() so it will be rotated through that call + parent::Rectangle($x1,$y1,$x2,$y2); } - + function FilledRectangle($x1,$y1,$x2,$y2) { - if( $y1==$y2 || $x1==$x2 ) - $this->Line($x1,$y1,$x2,$y2); - else - $this->FilledPolygon(array($x1,$y1,$x2,$y1,$x2,$y2,$x1,$y2)); + if( $y1==$y2 || $x1==$x2 ) + $this->Line($x1,$y1,$x2,$y2); + else + $this->FilledPolygon(array($x1,$y1,$x2,$y1,$x2,$y2,$x1,$y2)); } - + function Polygon($pnts,$closed=FALSE,$fast=FALSE) { - // Polygon uses Line() so it will be rotated through that call unless - // fast drawing routines are used in which case a rotate is needed - if( $fast ) { - parent::Polygon($this->ArrRotate($pnts)); - } - else - parent::Polygon($pnts,$closed,$fast); + // Polygon uses Line() so it will be rotated through that call unless + // fast drawing routines are used in which case a rotate is needed + if( $fast ) { + parent::Polygon($this->ArrRotate($pnts)); + } + else { + parent::Polygon($pnts,$closed,$fast); + } } - + function FilledPolygon($pnts) { - parent::FilledPolygon($this->ArrRotate($pnts)); + parent::FilledPolygon($this->ArrRotate($pnts)); } - + function Point($x,$y) { - list($xp,$yp) = $this->Rotate($x,$y); - parent::Point($xp,$yp); + list($xp,$yp) = $this->Rotate($x,$y); + parent::Point($xp,$yp); } - + function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) { - list($xp,$yp) = $this->Rotate($x,$y); - return parent::StrokeText($xp,$yp,$txt,$dir,$paragraph_align,$debug); + list($xp,$yp) = $this->Rotate($x,$y); + return parent::StrokeText($xp,$yp,$txt,$dir,$paragraph_align,$debug); } } -//=================================================== +//======================================================================= // CLASS ImgStreamCache -// Description: Handle caching of graphs to files -//=================================================== +// Description: Handle caching of graphs to files. All image output goes +// through this class +//======================================================================= class ImgStreamCache { - private $cache_dir, $img=null, $timeout=0; // Infinite timeout + private $cache_dir, $timeout=0; // Infinite timeout //--------------- // CONSTRUCTOR - function ImgStreamCache($aImg, $aCacheDir=CACHE_DIR) { - $this->img = $aImg; - $this->cache_dir = $aCacheDir; + function __construct($aCacheDir=CACHE_DIR) { + $this->cache_dir = $aCacheDir; } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS // Specify a timeout (in minutes) for the file. If the file is older then the // timeout value it will be overwritten with a newer version. // If timeout is set to 0 this is the same as infinite large timeout and if // timeout is set to -1 this is the same as infinite small timeout function SetTimeout($aTimeout) { - $this->timeout=$aTimeout; + $this->timeout=$aTimeout; } - + // Output image to browser and also write it to the cache function PutAndStream($aImage,$aCacheFileName,$aInline,$aStrokeFileName) { - // Some debugging code to brand the image with numbe of colors - // used - GLOBAL $gJpgBrandTiming; - if( $gJpgBrandTiming ) { - global $tim; - $t=$tim->Pop()/1000.0; - $c=$aImage->SetColor("black"); - $t=sprintf(BRAND_TIME_FORMAT,round($t,3)); - imagestring($this->img->img,2,5,$this->img->height-20,$t,$c); - } + // Check if we should always stroke the image to a file + if( _FORCE_IMGTOFILE ) { + $aStrokeFileName = _FORCE_IMGDIR.GenImgName(); + } - // Check if we should stroke the image to an arbitrary file - if( _FORCE_IMGTOFILE ) { - $aStrokeFileName = _FORCE_IMGDIR.GenImgName(); - } + if( $aStrokeFileName != '' ) { - if( $aStrokeFileName!="" ) { - if( $aStrokeFileName == "auto" ) - $aStrokeFileName = GenImgName(); - if( file_exists($aStrokeFileName) ) { - // Delete the old file - if( !@unlink($aStrokeFileName) ) - JpGraphError::RaiseL(25111,$aStrokeFileName);//(" Can't delete cached image $aStrokeFileName. Permission problem?"); - } - $aImage->Stream($aStrokeFileName); - return; - } + if( $aStrokeFileName == 'auto' ) { + $aStrokeFileName = GenImgName(); + } - if( $aCacheFileName != "" && USE_CACHE) { + if( file_exists($aStrokeFileName) ) { - $aCacheFileName = $this->cache_dir . $aCacheFileName; - if( file_exists($aCacheFileName) ) { - if( !$aInline ) { - // If we are generating image off-line (just writing to the cache) - // and the file exists and is still valid (no timeout) - // then do nothing, just return. - $diff=time()-filemtime($aCacheFileName); - if( $diff < 0 ) - JpGraphError::RaiseL(25112,$aCacheFileName);//(" Cached imagefile ($aCacheFileName) has file date in the future!!"); - if( $this->timeout>0 && ($diff <= $this->timeout*60) ) - return; - } - if( !@unlink($aCacheFileName) ) - JpGraphError::RaiseL(25113,$aStrokeFileName);//(" Can't delete cached image $aStrokeFileName. Permission problem?"); - $aImage->Stream($aCacheFileName); - } - else { - $this->MakeDirs(dirname($aCacheFileName)); - if( !is_writeable(dirname($aCacheFileName)) ) { - JpGraphError::RaiseL(25114,$aCacheFileName);//('PHP has not enough permissions to write to the cache file '.$aCacheFileName.'. Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.'); - } - $aImage->Stream($aCacheFileName); - } - - $res=true; - // Set group to specified - if( CACHE_FILE_GROUP != "" ) - $res = @chgrp($aCacheFileName,CACHE_FILE_GROUP); - if( CACHE_FILE_MOD != "" ) - $res = @chmod($aCacheFileName,CACHE_FILE_MOD); - if( !$res ) - JpGraphError::RaiseL(25115,$aStrokeFileName);//(" Can't set permission for cached image $aStrokeFileName. Permission problem?"); - - $aImage->Destroy(); - if( $aInline ) { - if ($fh = @fopen($aCacheFileName, "rb") ) { - $this->img->Headers(); - fpassthru($fh); - return; - } - else - JpGraphError::RaiseL(25116,$aFile);//(" Cant open file from cache [$aFile]"); - } - } - elseif( $aInline ) { - $this->img->Headers(); - $aImage->Stream(); - return; - } + // Wait for lock (to make sure no readers are trying to access the image) + $fd = fopen($aStrokeFileName,'w'); + $lock = flock($fd, LOCK_EX); + + // Since the image write routines only accepts a filename which must not + // exist we need to delete the old file first + if( !@unlink($aStrokeFileName) ) { + $lock = flock($fd, LOCK_UN); + JpGraphError::RaiseL(25111,$aStrokeFileName); + //(" Can't delete cached image $aStrokeFileName. Permission problem?"); + } + $aImage->Stream($aStrokeFileName); + $lock = flock($fd, LOCK_UN); + fclose($fd); + + } + else { + $aImage->Stream($aStrokeFileName); + } + + return; + } + + if( $aCacheFileName != '' && USE_CACHE) { + + $aCacheFileName = $this->cache_dir . $aCacheFileName; + if( file_exists($aCacheFileName) ) { + if( !$aInline ) { + // If we are generating image off-line (just writing to the cache) + // and the file exists and is still valid (no timeout) + // then do nothing, just return. + $diff=time()-filemtime($aCacheFileName); + if( $diff < 0 ) { + JpGraphError::RaiseL(25112,$aCacheFileName); + //(" Cached imagefile ($aCacheFileName) has file date in the future!!"); + } + if( $this->timeout>0 && ($diff <= $this->timeout*60) ) return; + } + + // Wait for lock (to make sure no readers are trying to access the image) + $fd = fopen($aCacheFileName,'w'); + $lock = flock($fd, LOCK_EX); + + if( !@unlink($aCacheFileName) ) { + $lock = flock($fd, LOCK_UN); + JpGraphError::RaiseL(25113,$aStrokeFileName); + //(" Can't delete cached image $aStrokeFileName. Permission problem?"); + } + $aImage->Stream($aCacheFileName); + $lock = flock($fd, LOCK_UN); + fclose($fd); + + } + else { + $this->MakeDirs(dirname($aCacheFileName)); + if( !is_writeable(dirname($aCacheFileName)) ) { + JpGraphError::RaiseL(25114,$aCacheFileName); + //('PHP has not enough permissions to write to the cache file '.$aCacheFileName.'. Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.'); + } + $aImage->Stream($aCacheFileName); + } + + $res=true; + // Set group to specified + if( CACHE_FILE_GROUP != '' ) { + $res = @chgrp($aCacheFileName,CACHE_FILE_GROUP); + } + if( CACHE_FILE_MOD != '' ) { + $res = @chmod($aCacheFileName,CACHE_FILE_MOD); + } + if( !$res ) { + JpGraphError::RaiseL(25115,$aStrokeFileName); + //(" Can't set permission for cached image $aStrokeFileName. Permission problem?"); + } + + $aImage->Destroy(); + if( $aInline ) { + if ($fh = @fopen($aCacheFileName, "rb") ) { + $aImage->Headers(); + fpassthru($fh); + return; + } + else { + JpGraphError::RaiseL(25116,$aFile);//(" Cant open file from cache [$aFile]"); + } + } + } + elseif( $aInline ) { + $aImage->Headers(); + $aImage->Stream(); + return; + } } - + + function IsValid($aCacheFileName) { + $aCacheFileName = $this->cache_dir.$aCacheFileName; + if ( USE_CACHE && file_exists($aCacheFileName) ) { + $diff=time()-filemtime($aCacheFileName); + if( $this->timeout>0 && ($diff > $this->timeout*60) ) { + return false; + } + else { + return true; + } + } + else { + return false; + } + } + + function StreamImgFile($aImage,$aCacheFileName) { + $aCacheFileName = $this->cache_dir.$aCacheFileName; + if ( $fh = @fopen($aCacheFileName, 'rb') ) { + $lock = flock($fh, LOCK_SH); + $aImage->Headers(); + fpassthru($fh); + $lock = flock($fh, LOCK_UN); + fclose($fh); + return true; + } + else { + JpGraphError::RaiseL(25117,$aCacheFileName);//(" Can't open cached image \"$aCacheFileName\" for reading."); + } + } + // Check if a given image is in cache and in that case // pass it directly on to web browser. Return false if the // image file doesn't exist or exists but is to old - function GetAndStream($aCacheFileName) { - $aCacheFileName = $this->cache_dir.$aCacheFileName; - if ( USE_CACHE && file_exists($aCacheFileName) && $this->timeout>=0 ) { - $diff=time()-filemtime($aCacheFileName); - if( $this->timeout>0 && ($diff > $this->timeout*60) ) { - return false; - } - else { - if ($fh = @fopen($aCacheFileName, "rb")) { - $this->img->Headers(); - fpassthru($fh); - return true; - } - else - JpGraphError::RaiseL(25117,$aCacheFileName);//(" Can't open cached image \"$aCacheFileName\" for reading."); - } - } - return false; + function GetAndStream($aImage,$aCacheFileName) { + if( $this->Isvalid($aCacheFileName) ) { + $this->StreamImgFile($aImage,$aCacheFileName); + } + else { + return false; + } } - + //--------------- - // PRIVATE METHODS + // PRIVATE METHODS // Create all necessary directories in a path function MakeDirs($aFile) { - $dirs = array(); - while ( !(file_exists($aFile)) ) { - $dirs[] = $aFile; - $aFile = dirname($aFile); - } - for ($i = sizeof($dirs)-1; $i>=0; $i--) { - if(! @mkdir($dirs[$i],0777) ) - JpGraphError::RaiseL(25118,$aFile);//(" Can't create directory $aFile. Make sure PHP has write permission to this directory."); - // We also specify mode here after we have changed group. - // This is necessary if Apache user doesn't belong the - // default group and hence can't specify group permission - // in the previous mkdir() call - if( CACHE_FILE_GROUP != "" ) { - $res=true; - $res =@chgrp($dirs[$i],CACHE_FILE_GROUP); - $res = @chmod($dirs[$i],0777); - if( !$res ) - JpGraphError::RaiseL(25119,$aFile);//(" Can't set permissions for $aFile. Permission problems?"); - } - } - return true; - } + $dirs = array(); + // In order to better work when open_basedir is enabled + // we do not create directories in the root path + while ( $aFile != '/' && !(file_exists($aFile)) ) { + $dirs[] = $aFile.'/'; + $aFile = dirname($aFile); + } + for ($i = sizeof($dirs)-1; $i>=0; $i--) { + if(! @mkdir($dirs[$i],0777) ) { + JpGraphError::RaiseL(25118,$aFile);//(" Can't create directory $aFile. Make sure PHP has write permission to this directory."); + } + // We also specify mode here after we have changed group. + // This is necessary if Apache user doesn't belong the + // default group and hence can't specify group permission + // in the previous mkdir() call + if( CACHE_FILE_GROUP != "" ) { + $res=true; + $res =@chgrp($dirs[$i],CACHE_FILE_GROUP); + $res = @chmod($dirs[$i],0777); + if( !$res ) { + JpGraphError::RaiseL(25119,$aFile);//(" Can't set permissions for $aFile. Permission problems?"); + } + } + } + return true; + } } // CLASS Cache - ?> diff --git a/libs/jpgraph/imgdata_balls.inc.php b/libs/jpgraph/imgdata_balls.inc.php index 9fe9fea..abc43d0 100644 --- a/libs/jpgraph/imgdata_balls.inc.php +++ b/libs/jpgraph/imgdata_balls.inc.php @@ -1,9 +1,9 @@ 'imgdata_large', - MARK_IMG_MBALL => 'imgdata_small', - MARK_IMG_SBALL => 'imgdata_xsmall', - MARK_IMG_BALL => 'imgdata_xsmall'); + MARK_IMG_MBALL => 'imgdata_small', + MARK_IMG_SBALL => 'imgdata_xsmall', + MARK_IMG_BALL => 'imgdata_xsmall'); protected $colors,$index,$maxidx; private $colors_1 = array('blue','lightblue','brown','darkgreen', - 'green','purple','red','gray','yellow','silver','gray'); + 'green','purple','red','gray','yellow','silver','gray'); private $index_1 = array('blue'=>9,'lightblue'=>1,'brown'=>6,'darkgreen'=>7, - 'green'=>8,'purple'=>4,'red'=>0,'gray'=>5,'silver'=>3,'yellow'=>2); + 'green'=>8,'purple'=>4,'red'=>0,'gray'=>5,'silver'=>3,'yellow'=>2); private $maxidx_1 = 9 ; private $colors_2 = array('blue','bluegreen','brown','cyan', - 'darkgray','greengray','gray','green', - 'greenblue','lightblue','lightred', - 'purple','red','white','yellow'); - - + 'darkgray','greengray','gray','green', + 'greenblue','lightblue','lightred', + 'purple','red','white','yellow'); + + private $index_2 = array('blue'=>9,'bluegreen'=>13,'brown'=>8,'cyan'=>12, - 'darkgray'=>5,'greengray'=>6,'gray'=>2,'green'=>10, - 'greenblue'=>3,'lightblue'=>1,'lightred'=>14, - 'purple'=>7,'red'=>0,'white'=>11,'yellow'=>4); - + 'darkgray'=>5,'greengray'=>6,'gray'=>2,'green'=>10, + 'greenblue'=>3,'lightblue'=>1,'lightred'=>14, + 'purple'=>7,'red'=>0,'white'=>11,'yellow'=>4); + private $maxidx_2 = 14 ; private $colors_3 = array('bluegreen','cyan','darkgray','greengray', - 'gray','graypurple','green','greenblue','lightblue', - 'lightred','navy','orange','purple','red','yellow'); - + 'gray','graypurple','green','greenblue','lightblue', + 'lightred','navy','orange','purple','red','yellow'); + private $index_3 = array('bluegreen'=>1,'cyan'=>11,'darkgray'=>14,'greengray'=>10, - 'gray'=>3,'graypurple'=>4,'green'=>9,'greenblue'=>7, - 'lightblue'=>13,'lightred'=>0,'navy'=>2,'orange'=>12, - 'purple'=>8,'red'=>5,'yellow'=>6); + 'gray'=>3,'graypurple'=>4,'green'=>9,'greenblue'=>7, + 'lightblue'=>13,'lightred'=>0,'navy'=>2,'orange'=>12, + 'purple'=>8,'red'=>5,'yellow'=>6); private $maxidx_3 = 14 ; protected $imgdata_large, $imgdata_small, $imgdata_xsmall ; function GetImg($aMark,$aIdx) { - switch( $aMark ) { - case MARK_IMG_SBALL: - case MARK_IMG_BALL: - $this->colors = $this->colors_3; - $this->index = $this->index_3 ; - $this->maxidx = $this->maxidx_3 ; - break; - case MARK_IMG_MBALL: - $this->colors = $this->colors_2; - $this->index = $this->index_2 ; - $this->maxidx = $this->maxidx_2 ; - break; - default: - $this->colors = $this->colors_1; - $this->index = $this->index_1 ; - $this->maxidx = $this->maxidx_1 ; - break; - } - return parent::GetImg($aMark,$aIdx); + switch( $aMark ) { + case MARK_IMG_SBALL: + case MARK_IMG_BALL: + $this->colors = $this->colors_3; + $this->index = $this->index_3 ; + $this->maxidx = $this->maxidx_3 ; + break; + case MARK_IMG_MBALL: + $this->colors = $this->colors_2; + $this->index = $this->index_2 ; + $this->maxidx = $this->maxidx_2 ; + break; + default: + $this->colors = $this->colors_1; + $this->index = $this->index_1 ; + $this->maxidx = $this->maxidx_1 ; + break; + } + return parent::GetImg($aMark,$aIdx); } - function ImgData_Balls() { + function __construct() { -//========================================================== -// File: bl_red.png -//========================================================== - $this->imgdata_large[0][0]= 1072 ; - $this->imgdata_large[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAByF'. - 'BMVEX/////////xsb/vb3/lIz/hIT/e3v/c3P/c2v/a2v/Y2P/'. - 'UlL/Skr/SkL/Qjn/MTH/MSn/KSn/ISH/IRj/GBj/GBD/EBD/EA'. - 'j/CAj/CAD/AAD3QkL3MTH3KSn3KSH3GBj3EBD3CAj3AAD1zMzv'. - 'QkLvISHvIRjvGBjvEBDvEAjvAADnUlLnSkrnMTnnKSnnIRjnGB'. - 'DnEBDnCAjnAADec3PeSkreISHeGBjeGBDeEAjWhITWa2vWUlLW'. - 'SkrWISnWGBjWEBDWEAjWCAjWAADOnp7Oa2vOGCHOGBjOGBDOEB'. - 'DOCAjOAADJrq7Gt7fGGBjGEBDGCAjGAADEpKS/v7+9QkK9GBC9'. - 'EBC9CAi9AAC1e3u1a2u1Skq1KSm1EBC1CAi1AACtEBCtCBCtCA'. - 'itAACngYGlCAilAACghIScOTmcCAicAACYgYGUGAiUCAiUAAiU'. - 'AACMKSmMEACMAACEa2uEGAiEAAB7GBh7CAB7AABzOTlzGBBzCA'. - 'BzAABrSkprOTlrGBhrAABjOTljAABaQkJaOTlaCABaAABSKSlS'. - 'GBhSAABKKSlKGBhKAABCGBhCCABCAAA5CAA5AAAxCAAxAAApCA'. - 'ApAAAhAAAYAACc9eRyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. - 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFD'. - 'UHLytKAAAB4UlEQVR4nGNgIAK4mGjrmNq6BmFIWMmISUpKSmk5'. - 'B8ZEokj4qoiLiQCBgqald3xaBpKMj6y4sLCQkJCIvIaFV0RaUR'. - 'lCSk5cWEiAn19ASN7QwisuraihHiajKyEixM/NwckjoKrvEACU'. - 'qumpg7pAUlREiJdNmZmLT9/cMzwps7Smc3I2WEpGUkxYkJuFiY'. - 'lTxszePzY1v7Shc2oX2D+K4iLCgjzsrOw8embuYUmZeTVtPVOn'. - 'gqSslYAOF+Ln4ZHWtXMPTcjMrWno7J82rRgoZWOsqaCgrqaqqm'. - 'fn5peQmlsK1DR52vRaoFSIs5GRoYG5ub27n19CYm5pdVPnxKnT'. - 'pjWDpLydnZwcHTz8QxMSEnJLgDL9U6dNnQ6Sio4PDAgICA+PTU'. - 'zNzSkph8hADIxKS46Pj0tKTc3MLSksqWrtmQySAjuDIT8rKy0r'. - 'Kz+vtLSmur6jb9JUIJgGdjxDQUVRUVFpaUVNQ1NrZ9+kKVOmTZ'. - 'k6vR0sldJUAwQNTU2dnX0TgOJTQLrSIYFY2dPW1NbW2TNxwtQp'. - 'U6ZMmjJt2rRGWNB3TO7vnzh5MsgSoB6gy7sREdY7bRrQEDAGOb'. - 'wXOQW0TJsOEpwClmxBTTbZ7UDVIPkp7dkYaYqhuLa5trYYUxwL'. - 'AADzm6uekAAcXAAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bl_red.png + //========================================================== + $this->imgdata_large[0][0]= 1072 ; + $this->imgdata_large[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAByF'. + 'BMVEX/////////xsb/vb3/lIz/hIT/e3v/c3P/c2v/a2v/Y2P/'. + 'UlL/Skr/SkL/Qjn/MTH/MSn/KSn/ISH/IRj/GBj/GBD/EBD/EA'. + 'j/CAj/CAD/AAD3QkL3MTH3KSn3KSH3GBj3EBD3CAj3AAD1zMzv'. + 'QkLvISHvIRjvGBjvEBDvEAjvAADnUlLnSkrnMTnnKSnnIRjnGB'. + 'DnEBDnCAjnAADec3PeSkreISHeGBjeGBDeEAjWhITWa2vWUlLW'. + 'SkrWISnWGBjWEBDWEAjWCAjWAADOnp7Oa2vOGCHOGBjOGBDOEB'. + 'DOCAjOAADJrq7Gt7fGGBjGEBDGCAjGAADEpKS/v7+9QkK9GBC9'. + 'EBC9CAi9AAC1e3u1a2u1Skq1KSm1EBC1CAi1AACtEBCtCBCtCA'. + 'itAACngYGlCAilAACghIScOTmcCAicAACYgYGUGAiUCAiUAAiU'. + 'AACMKSmMEACMAACEa2uEGAiEAAB7GBh7CAB7AABzOTlzGBBzCA'. + 'BzAABrSkprOTlrGBhrAABjOTljAABaQkJaOTlaCABaAABSKSlS'. + 'GBhSAABKKSlKGBhKAABCGBhCCABCAAA5CAA5AAAxCAAxAAApCA'. + 'ApAAAhAAAYAACc9eRyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFD'. + 'UHLytKAAAB4UlEQVR4nGNgIAK4mGjrmNq6BmFIWMmISUpKSmk5'. + 'B8ZEokj4qoiLiQCBgqald3xaBpKMj6y4sLCQkJCIvIaFV0RaUR'. + 'lCSk5cWEiAn19ASN7QwisuraihHiajKyEixM/NwckjoKrvEACU'. + 'qumpg7pAUlREiJdNmZmLT9/cMzwps7Smc3I2WEpGUkxYkJuFiY'. + 'lTxszePzY1v7Shc2oX2D+K4iLCgjzsrOw8embuYUmZeTVtPVOn'. + 'gqSslYAOF+Ln4ZHWtXMPTcjMrWno7J82rRgoZWOsqaCgrqaqqm'. + 'fn5peQmlsK1DR52vRaoFSIs5GRoYG5ub27n19CYm5pdVPnxKnT'. + 'pjWDpLydnZwcHTz8QxMSEnJLgDL9U6dNnQ6Sio4PDAgICA+PTU'. + 'zNzSkph8hADIxKS46Pj0tKTc3MLSksqWrtmQySAjuDIT8rKy0r'. + 'Kz+vtLSmur6jb9JUIJgGdjxDQUVRUVFpaUVNQ1NrZ9+kKVOmTZ'. + 'k6vR0sldJUAwQNTU2dnX0TgOJTQLrSIYFY2dPW1NbW2TNxwtQp'. + 'U6ZMmjJt2rRGWNB3TO7vnzh5MsgSoB6gy7sREdY7bRrQEDAGOb'. + 'wXOQW0TJsOEpwClmxBTTbZ7UDVIPkp7dkYaYqhuLa5trYYUxwL'. + 'AADzm6uekAAcXAAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bl_bluegreen.png -//========================================================== - $this->imgdata_large[1][0]= 1368 ; - $this->imgdata_large[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMMFi8hE9b2uAAABOVJREFUeNq9lk2sJFUVx3+3qv'. - 'tW95t57zFvhiFxmCFRUJRoNCQiJARMhiFx/Igxii5goTG6ZDAu'. - '/EhcSCIrTAgLEiKsJ8ywABNZEMJXEDYCukAmjgjzBkK/j35V1d'. - '333FtV97io97pfzwxfG86qcu/N+Z3zP+fcW/Apmfk4hx57+R/6'. - 'Rqmc9ykhsWjlsUngAA1fXIQ7b73pI/186IGHnn9dH/8frC8v4I'. - 'PiG53uaerR4GmKkv31mB8cyfjd946ZTwR66qVX9OTWIi8UKUv9'. - 'BOrZXpYZvFeiBvzI0fgSUSFKwbVG+Pl1V3HH0VvNR4KeeukV/f'. - 'PmMmdHhst76aXD64AbeVQ9bjNHaiGOC2o3wLrAb2/4LL/84ffn'. - 'fCdzkOdayKpLppBemrBsU5Y1Zdmm9LJdGU6E/t4M24Q26jRDRL'. - 'j3mdc49cSTekFsMzs5XuTsyLDUNSDQ25NwKOly9YIl22MYhJr/'. - 'uoDtBBoT0CxBRGYOAhibIaOCe//2MpfM6KHnX9cXipSlbkKWmS'. - 'nk9iv38J0jixw7vJfrTMYBOvhSoQHJBS09ANELloAGDxW8tfoW'. - 'J+5/UC8CPS0LU7r3SpYarr7M8rmFjMPLXT6/33L4si7Z2GCrQC'. - '+0ctlOaNs9DReV8vSLr85ndPLpZ/WNvHW+01kAVFBOGvJx0wYg'. - 'Sp47RIQ4Emwa8FGJXlDxSCFo5YlVgAo2hwPue/hRndboTV3EW2'. - 'Wp3k6wBp8q56QiWzecW6vwQfnPRkAWhFgILnq08jQ+R2nlUzzN'. - 'uES9Q7Vd+9fba7NmWJW61db2247qACmcjxXr45psYphsFGSLBu'. - 'kIajxqtjNwHkvAjQt0sg3crhPA2+fPz0CuyNFOghsGsr19mnFg'. - 'DGwrRm8UoAtNmQPQtRXDgdC4HImCFEKcCE0oieUWUYq2LtbiGp'. - 'mBQmppfIkjw45DK0QNNkvQ0jMBtPL0UnDRM1rN+cxKwzvOo2NP'. - 'tykR9a1kfpZNDLMG6QDYJqCTBvUe1+uxs+YKyPoGrTwY2HhvC4'. - 'CDWQd5d4xNApNQEEMgjgLdUCLBQ5cprL/trwNwKG2IUmDqDFd5'. - 'sr5BWrlxuSdLDFEFlqAzXGc4zFjupqh6uqYihpxJcEgp026l2w'. - '7wFUv7Z6AvrfRo/n0OYzPwIKE3HUKAJg2otMBiElnsF7wngis9'. - '3ZDjNnLi7huCWUZfueZKTu/M0V3HvmkOFDVxVKDG04ScejSgW5'. - 'V0q5JYFEghuDLHlTmToqDeGOCKIVtrW9hsdmXufEcNLPSXuPHa'. - 'a+bvuh9df5AH/v5PDFmbWQC3Mx+TVvfGVTRB2CodNgT2JBX003'. - 'aANZAYS/BxCv32TV/l2C03G7jgmfjGiT/qmeEmibEYm7XzAO2k'. - 'A+pbgHhBgydqu54YO5eRiLCy7yDvPP6Xqf+5Z+Lu277OYuOpiw'. - 'H15oBmlNOMcmK5RbP+PrEscGU+DSAxdg4CICIkxnLP8aNz63Og'. - 'H3/rdvOb795GVhuaYo0oBc3GGrEsUPVTwO6a7LYd+X51x3Hu/t'. - 'lP5tS65FN+6okn9U+n/sqb596dTvhOF+02myXTmkQNrOw7yD3H'. - 'j14E+UDQjp24/0E9/eKrbA4HH3aMK1b2ccvXvswjv//1J/s5ud'. - 'Due/hRPfP+OmfOrk7vrn7a48ihA3zh8CH+8Iuffiw/n4r9H1ZZ'. - '0zz7G56hAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bl_bluegreen.png + //========================================================== + $this->imgdata_large[1][0]= 1368 ; + $this->imgdata_large[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMMFi8hE9b2uAAABOVJREFUeNq9lk2sJFUVx3+3qv'. + 'tW95t57zFvhiFxmCFRUJRoNCQiJARMhiFx/Igxii5goTG6ZDAu'. + '/EhcSCIrTAgLEiKsJ8ywABNZEMJXEDYCukAmjgjzBkK/j35V1d'. + '333FtV97io97pfzwxfG86qcu/N+Z3zP+fcW/Apmfk4hx57+R/6'. + 'Rqmc9ykhsWjlsUngAA1fXIQ7b73pI/186IGHnn9dH/8frC8v4I'. + 'PiG53uaerR4GmKkv31mB8cyfjd946ZTwR66qVX9OTWIi8UKUv9'. + 'BOrZXpYZvFeiBvzI0fgSUSFKwbVG+Pl1V3HH0VvNR4KeeukV/f'. + 'PmMmdHhst76aXD64AbeVQ9bjNHaiGOC2o3wLrAb2/4LL/84ffn'. + 'fCdzkOdayKpLppBemrBsU5Y1Zdmm9LJdGU6E/t4M24Q26jRDRL'. + 'j3mdc49cSTekFsMzs5XuTsyLDUNSDQ25NwKOly9YIl22MYhJr/'. + 'uoDtBBoT0CxBRGYOAhibIaOCe//2MpfM6KHnX9cXipSlbkKWmS'. + 'nk9iv38J0jixw7vJfrTMYBOvhSoQHJBS09ANELloAGDxW8tfoW'. + 'J+5/UC8CPS0LU7r3SpYarr7M8rmFjMPLXT6/33L4si7Z2GCrQC'. + '+0ctlOaNs9DReV8vSLr85ndPLpZ/WNvHW+01kAVFBOGvJx0wYg'. + 'Sp47RIQ4Emwa8FGJXlDxSCFo5YlVgAo2hwPue/hRndboTV3EW2'. + 'Wp3k6wBp8q56QiWzecW6vwQfnPRkAWhFgILnq08jQ+R2nlUzzN'. + 'uES9Q7Vd+9fba7NmWJW61db2247qACmcjxXr45psYphsFGSLBu'. + 'kIajxqtjNwHkvAjQt0sg3crhPA2+fPz0CuyNFOghsGsr19mnFg'. + 'DGwrRm8UoAtNmQPQtRXDgdC4HImCFEKcCE0oieUWUYq2LtbiGp'. + 'mBQmppfIkjw45DK0QNNkvQ0jMBtPL0UnDRM1rN+cxKwzvOo2NP'. + 'tykR9a1kfpZNDLMG6QDYJqCTBvUe1+uxs+YKyPoGrTwY2HhvC4'. + 'CDWQd5d4xNApNQEEMgjgLdUCLBQ5cprL/trwNwKG2IUmDqDFd5'. + 'sr5BWrlxuSdLDFEFlqAzXGc4zFjupqh6uqYihpxJcEgp026l2w'. + '7wFUv7Z6AvrfRo/n0OYzPwIKE3HUKAJg2otMBiElnsF7wngis9'. + '3ZDjNnLi7huCWUZfueZKTu/M0V3HvmkOFDVxVKDG04ScejSgW5'. + 'V0q5JYFEghuDLHlTmToqDeGOCKIVtrW9hsdmXufEcNLPSXuPHa'. + 'a+bvuh9df5AH/v5PDFmbWQC3Mx+TVvfGVTRB2CodNgT2JBX003'. + 'aANZAYS/BxCv32TV/l2C03G7jgmfjGiT/qmeEmibEYm7XzAO2k'. + 'A+pbgHhBgydqu54YO5eRiLCy7yDvPP6Xqf+5Z+Lu277OYuOpiw'. + 'H15oBmlNOMcmK5RbP+PrEscGU+DSAxdg4CICIkxnLP8aNz63Og'. + 'H3/rdvOb795GVhuaYo0oBc3GGrEsUPVTwO6a7LYd+X51x3Hu/t'. + 'lP5tS65FN+6okn9U+n/sqb596dTvhOF+02myXTmkQNrOw7yD3H'. + 'j14E+UDQjp24/0E9/eKrbA4HH3aMK1b2ccvXvswjv//1J/s5ud'. + 'Due/hRPfP+OmfOrk7vrn7a48ihA3zh8CH+8Iuffiw/n4r9H1ZZ'. + '0zz7G56hAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bl_yellow.png -//========================================================== - $this->imgdata_large[2][0]= 1101 ; - $this->imgdata_large[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. - 'BMVEX//////////+///+f//9b//8b//73//7X//63//6X//5T/'. - '/4z//4T//3P//2v//1r//0r//0L//zH//yn//yH//xj//xD//w'. - 'j//wD/90L/9zn/9zH/9xj/9xD/9wj/9wD39yn37zn37zH37yH3'. - '7xD37wj37wDv70Lv50rv50Lv5znv5yHv5xjv5wjv5wDn51Ln5x'. - 'Dn3jHn3iHn3hjn3hDn3gje3oze3nPe3lLe1oze1nPe1lLe1ine'. - '1iHe1hje1hDe1gje1gDW1qXW1mvWzqXWzkLWzhjWzhDWzgjWzg'. - 'DOzrXOzq3OzpzOzgDOxkrOxinOxhjOxhDOxgjOxgDGxqXGxnvG'. - 'xmvGvRjGvRDGvQjGvQDFxbnAvr6/v7+9vaW9vZS9vQi9vQC9tR'. - 'C9tQi9tQC7u7W1tZS1tXu1tTG1tQi1rRC1rQi1rQCtrYytrSGt'. - 'rQitrQCtpYStpSGtpQitpQClpYSlpXulpQClnBClnAilnACcnG'. - 'ucnAicnACclAiclACUlFqUlCmUlAiUlACUjFKUjAiUjACMjFKM'. - 'jEqMjACMhACEhACEewB7ezF7exB7ewB7cwBzcylzcwBzaxBzaw'. - 'BraxhrawhrawBrYxBrYwBjYwBjWgBaWgBaUgCXBwRMAAAAAXRS'. - 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. - 'LdfvwAAAAHdElNRQfTAwkRFBKiJZ4hAAAB7ElEQVR4nI3S+1vS'. - 'UBgHcB67WJmIMWAVdDHEDLBC6Go0slj3Ft0m9RRBWQEmFZFDEM'. - 'Qgt0EMFBY7p/+198hj1kM/9N1+++x73rOd6XT/kStnTx4fPzd9'. - 'uwfOjFhomj7smAhwj/6Cm2O0xUwy6g7cCL99uCW3jtBmE7lsdr'. - 'fvejgpzP7uEDFRRoqy2k8xQPnypo2BUMP6waF9Vpf3ciiSzErL'. - 'XTkPc0zDe3bsHDAcc00yoVgqL3UWN2iENpspff+2vn6D0+NnZ9'. - '6lC5K6RuSqBTZn1O/a3rd7v/MSez+WyIpVFX8GuuCA9SjD4N6B'. - 'oRNTfo5PCAVR0fBXoIuOQzab1XjwwNHx00GOj8/nKtV1DdeArk'. - '24R+0ul9PjmbrHPYl+EipyU0OoQSjg8/m83kl/MMhx0fjCkqio'. - 'SMOE7t4JMAzDsizH81AqSdW2hroLPg4/CEF4PhKNx98vlevrbY'. - 'QQXgV6kXwVfjkTiSXmhYVcSa7DIE1DOENe7GM6lUym0l+EXKks'. - 'K20VAeH2M0JvVgrZfL5Qqkiy0lRVaMBd7H7EZUmsiJJcrTdVja'. - 'wGpdbTLj3/3qwrUOjAfGgg4LnNA5tdQx14Hm00QFBm65hfNzAm'. - '+yIFhFtzuj+z2MI/MQn6Uez5pz4Ua41G7VumB/6RX4zMr1TKBr'. - 'SXAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bl_yellow.png + //========================================================== + $this->imgdata_large[2][0]= 1101 ; + $this->imgdata_large[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. + 'BMVEX//////////+///+f//9b//8b//73//7X//63//6X//5T/'. + '/4z//4T//3P//2v//1r//0r//0L//zH//yn//yH//xj//xD//w'. + 'j//wD/90L/9zn/9zH/9xj/9xD/9wj/9wD39yn37zn37zH37yH3'. + '7xD37wj37wDv70Lv50rv50Lv5znv5yHv5xjv5wjv5wDn51Ln5x'. + 'Dn3jHn3iHn3hjn3hDn3gje3oze3nPe3lLe1oze1nPe1lLe1ine'. + '1iHe1hje1hDe1gje1gDW1qXW1mvWzqXWzkLWzhjWzhDWzgjWzg'. + 'DOzrXOzq3OzpzOzgDOxkrOxinOxhjOxhDOxgjOxgDGxqXGxnvG'. + 'xmvGvRjGvRDGvQjGvQDFxbnAvr6/v7+9vaW9vZS9vQi9vQC9tR'. + 'C9tQi9tQC7u7W1tZS1tXu1tTG1tQi1rRC1rQi1rQCtrYytrSGt'. + 'rQitrQCtpYStpSGtpQitpQClpYSlpXulpQClnBClnAilnACcnG'. + 'ucnAicnACclAiclACUlFqUlCmUlAiUlACUjFKUjAiUjACMjFKM'. + 'jEqMjACMhACEhACEewB7ezF7exB7ewB7cwBzcylzcwBzaxBzaw'. + 'BraxhrawhrawBrYxBrYwBjYwBjWgBaWgBaUgCXBwRMAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwkRFBKiJZ4hAAAB7ElEQVR4nI3S+1vS'. + 'UBgHcB67WJmIMWAVdDHEDLBC6Go0slj3Ft0m9RRBWQEmFZFDEM'. + 'Qgt0EMFBY7p/+198hj1kM/9N1+++x73rOd6XT/kStnTx4fPzd9'. + 'uwfOjFhomj7smAhwj/6Cm2O0xUwy6g7cCL99uCW3jtBmE7lsdr'. + 'fvejgpzP7uEDFRRoqy2k8xQPnypo2BUMP6waF9Vpf3ciiSzErL'. + 'XTkPc0zDe3bsHDAcc00yoVgqL3UWN2iENpspff+2vn6D0+NnZ9'. + '6lC5K6RuSqBTZn1O/a3rd7v/MSez+WyIpVFX8GuuCA9SjD4N6B'. + 'oRNTfo5PCAVR0fBXoIuOQzab1XjwwNHx00GOj8/nKtV1DdeArk'. + '24R+0ul9PjmbrHPYl+EipyU0OoQSjg8/m83kl/MMhx0fjCkqio'. + 'SMOE7t4JMAzDsizH81AqSdW2hroLPg4/CEF4PhKNx98vlevrbY'. + 'QQXgV6kXwVfjkTiSXmhYVcSa7DIE1DOENe7GM6lUym0l+EXKks'. + 'K20VAeH2M0JvVgrZfL5Qqkiy0lRVaMBd7H7EZUmsiJJcrTdVja'. + 'wGpdbTLj3/3qwrUOjAfGgg4LnNA5tdQx14Hm00QFBm65hfNzAm'. + '+yIFhFtzuj+z2MI/MQn6Uez5pz4Ua41G7VumB/6RX4zMr1TKBr'. + 'SXAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bl_silver.png -//========================================================== - $this->imgdata_large[3][0]= 1481 ; - $this->imgdata_large[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAADAF'. - 'BMVEUAAADOzs7Gxsa9vb21tbXOxsbOzsbGzsb3///O1ta1vb2c'. - 'paVSWlpKWlpSY2ve5+97hIze7/9aY2vO5/9zhJRaa3tSY3PGzt'. - 'aMlJxrc3tja3NKUlpCSlK1vcZze4RSWmPW5/+Upb3G3v9zhJxS'. - 'Y3t7jKVaa4TO3veltc6ElK1re5Rjc4ycpbV7hJRaY3M5QlLn7/'. - '/Gzt6lrb2EjJzO3v9ja3vG1ve9zu+1xueltdacrc6UpcaMnL1C'. - 'SlqElLV7jK1zhKVre5zW3u/O1ue1vc6ttcaMlKVze4xrc4RSWm'. - 'tKUmPG1v+9zve1xu+tveeltd6crdbe5/+9xt6cpb17hJxaY3s5'. - 'QlrW3vfO1u/Gzue1vdattc6lrcaUnLWMlK2EjKVze5Rrc4xja4'. - 'RSWnNKUmtCSmO9xuecpcZ7hKVaY4TW3v/O1vfGzu+1vd6ttdal'. - 'rc69xu+UnL2MlLWEjK1ze5xrc5R7hK1ja4zO1v+1veettd6lrd'. - 'aMlL3Gzv/39//W1t7Gxs61tb29vcatrbWlpa2cnKWUlJyEhIx7'. - 'e4TW1ufGxta1tcZSUlqcnK3W1u+UlKW9vda1tc57e4ytrcalpb'. - '1ra3vOzu9jY3OUlK29vd6MjKWEhJxaWmtSUmNzc4xKSlpjY3tK'. - 'SmNCQlqUjJzOxs7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAD///9fnkWVAAAAAnRSTlP/AOW3'. - 'MEoAAAABYktHRP+lB/LFAAAACXBIWXMAAABFAAAARQBP+QatAA'. - 'AB/klEQVR42mNgxAsYqCdd3+lcb4hLmj8wMMvEu8DCMqYbU9op'. - 'UEFB2MTb26eyysomFl06XEEhUCHLpAKo2z/fujikEUVaXUFBMB'. - 'BouLePuV+VVWGRciIXknSEsImCQd3//xwmPr65llaFcSFJHkjS'. - '3iYmWUDZ//8NfCr989NjNUMSUyTg0jneSiaCINn/gmlVQM12qg'. - 'lJnp5waTMTE5NAkCyHWZW/lXWNfUlikmdYK0zax7siS4EDKJtd'. - 'mQeU1XRwLBdLkRGASucWmGVnZ4dnhZvn5lmm29iVOWpnJqcuko'. - 'JKR1Wm5eTkRKYF5eblp9sU2ZeUJiV7zbfVg0pH56UFBQXNjIqK'. - 'jgkujItX1koKTVmYajsdKu2qETVhwgSXiUDZ2Bn9xqUeoZ5e0t'. - 'LzYYZ3B092ndjtOnmKTmycW1s7SHa+l5dtB8zlccE6RlN0dGbM'. - 'mDVbd5KupNBcL6+F82XgHouLj5vRP2PWLGNdd4+ppnxe8tJec6'. - 'XnNsKkm0uVQ5RDRHQTPTym68nPlZbvkfYCexsa5rpJ2qXa5Umm'. - 'ocmec3m8vHjmSs+fgxyhC5JDQ8WSPT2lvbzm8vDIe0nbtiBLN8'. - '8BigNdu1B6Lsje+fPbUFMLi5TMfGmvHi/puUAv23q2YCTFNqH5'. - 'MvPnSwPh3HasCbm3XUpv+nS5VtrkEkwAANSTpGHdye9PAAAASn'. - 'RFWHRzaWduYXR1cmUANGJkODkyYmE4MWZhNTk4MTIyNDJjNjUx'. - 'NzZhY2UxMDAzOGFhZjdhZWIyNzliNTM2ZGFmZDlkM2RiNDU3Zm'. - 'NlNT9CliMAAAAASUVORK5CYII=' ; + //========================================================== + // File: bl_silver.png + //========================================================== + $this->imgdata_large[3][0]= 1481 ; + $this->imgdata_large[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAADAF'. + 'BMVEUAAADOzs7Gxsa9vb21tbXOxsbOzsbGzsb3///O1ta1vb2c'. + 'paVSWlpKWlpSY2ve5+97hIze7/9aY2vO5/9zhJRaa3tSY3PGzt'. + 'aMlJxrc3tja3NKUlpCSlK1vcZze4RSWmPW5/+Upb3G3v9zhJxS'. + 'Y3t7jKVaa4TO3veltc6ElK1re5Rjc4ycpbV7hJRaY3M5QlLn7/'. + '/Gzt6lrb2EjJzO3v9ja3vG1ve9zu+1xueltdacrc6UpcaMnL1C'. + 'SlqElLV7jK1zhKVre5zW3u/O1ue1vc6ttcaMlKVze4xrc4RSWm'. + 'tKUmPG1v+9zve1xu+tveeltd6crdbe5/+9xt6cpb17hJxaY3s5'. + 'QlrW3vfO1u/Gzue1vdattc6lrcaUnLWMlK2EjKVze5Rrc4xja4'. + 'RSWnNKUmtCSmO9xuecpcZ7hKVaY4TW3v/O1vfGzu+1vd6ttdal'. + 'rc69xu+UnL2MlLWEjK1ze5xrc5R7hK1ja4zO1v+1veettd6lrd'. + 'aMlL3Gzv/39//W1t7Gxs61tb29vcatrbWlpa2cnKWUlJyEhIx7'. + 'e4TW1ufGxta1tcZSUlqcnK3W1u+UlKW9vda1tc57e4ytrcalpb'. + '1ra3vOzu9jY3OUlK29vd6MjKWEhJxaWmtSUmNzc4xKSlpjY3tK'. + 'SmNCQlqUjJzOxs7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAD///9fnkWVAAAAAnRSTlP/AOW3'. + 'MEoAAAABYktHRP+lB/LFAAAACXBIWXMAAABFAAAARQBP+QatAA'. + 'AB/klEQVR42mNgxAsYqCdd3+lcb4hLmj8wMMvEu8DCMqYbU9op'. + 'UEFB2MTb26eyysomFl06XEEhUCHLpAKo2z/fujikEUVaXUFBMB'. + 'BouLePuV+VVWGRciIXknSEsImCQd3//xwmPr65llaFcSFJHkjS'. + '3iYmWUDZ//8NfCr989NjNUMSUyTg0jneSiaCINn/gmlVQM12qg'. + 'lJnp5waTMTE5NAkCyHWZW/lXWNfUlikmdYK0zax7siS4EDKJtd'. + 'mQeU1XRwLBdLkRGASucWmGVnZ4dnhZvn5lmm29iVOWpnJqcuko'. + 'JKR1Wm5eTkRKYF5eblp9sU2ZeUJiV7zbfVg0pH56UFBQXNjIqK'. + 'jgkujItX1koKTVmYajsdKu2qETVhwgSXiUDZ2Bn9xqUeoZ5e0t'. + 'LzYYZ3B092ndjtOnmKTmycW1s7SHa+l5dtB8zlccE6RlN0dGbM'. + 'mDVbd5KupNBcL6+F82XgHouLj5vRP2PWLGNdd4+ppnxe8tJec6'. + 'XnNsKkm0uVQ5RDRHQTPTym68nPlZbvkfYCexsa5rpJ2qXa5Umm'. + 'ocmec3m8vHjmSs+fgxyhC5JDQ8WSPT2lvbzm8vDIe0nbtiBLN8'. + '8BigNdu1B6Lsje+fPbUFMLi5TMfGmvHi/puUAv23q2YCTFNqH5'. + 'MvPnSwPh3HasCbm3XUpv+nS5VtrkEkwAANSTpGHdye9PAAAASn'. + 'RFWHRzaWduYXR1cmUANGJkODkyYmE4MWZhNTk4MTIyNDJjNjUx'. + 'NzZhY2UxMDAzOGFhZjdhZWIyNzliNTM2ZGFmZDlkM2RiNDU3Zm'. + 'NlNT9CliMAAAAASUVORK5CYII=' ; -//========================================================== -// File: bl_purple.png -//========================================================== - $this->imgdata_large[4][0]= 1149 ; - $this->imgdata_large[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACAV'. - 'BMVEX/////////7///5///1v//xv//rf//pf//lP//jP//hP//'. - 'c///a///Wv//Wvf/Uv//Sv//Qv//Qvf/Off/Mf//Kf//If//If'. - 'f/GP//GPf/EP//EPf/CP//CPf/CO//AP//APf3Oe/3Kff3Ke/3'. - 'Ie/3GO/3EO/3AO/vSu/vSufvOefvMefvIefvGOfvEOfvCOfvAO'. - 'fnUufnSufnMd7nId7nGN7nGNbnEN7nCN7nAN7ejN7ejNbec97e'. - 'c9beUtbeQtbeIdbeGNbeENbeCNbeANbWpdbWa9bWQs7WGM7WEM'. - '7WCM7WAM7Otc7Orc7OnM7OSsbOIb3OGMbOEMbOCMbOAM7OAMbG'. - 'pcbGnMbGe8bGa8bGKbXGEL3GCL3GAL3FucXBu73AvsC/v7+9pb'. - '29Ka29GLW9ELW9CLW9AL29ALW5rrm1lLW1e7W1MbW1GKW1EK21'. - 'CLW1CK21AK2tjK2thKWtMaWtIaWtGJytCK2tCKWtAK2tAKWlhK'. - 'Wle6WlEJylCJylAKWlAJyca5ycGJScEJScCJScAJycAJSUWpSU'. - 'UoyUKZSUEIyUCIyUAJSUAIyMUoyMSoyMIYSMEISMCISMAIyMAI'. - 'SECHuEAISEAHt7MXt7EHt7CHt7AHt7AHNzKXNzEGtzAHNzAGtr'. - 'GGtrEGNrCGtrAGtrAGNjCFpjAGNjAFpaAFpaAFIpZn4bAAAAAX'. - 'RSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsS'. - 'AdLdfvwAAAAHdElNRQfTAwkRFB0ymoOwAAAB9UlEQVR4nGNgIA'. - 'K42hhqGtm5+WFIWClKycvLK6gbuARGoEj4aMjLSElISUir6Tt7'. - 'x+aEIWR8leQlwEBSTc/CK7awLguuR0lGQkJMVFRUTFJVzwko1d'. - 'oFk9OQl5IQE+Dh5hVR0TV3CkkvbJgyASJjDZIR5GBl5eRX0TH1'. - 'DEqrbJ2ypBEspSgvJSXKw8bMxMavbOLoGZNf1TZlybw4oIyfLN'. - 'BxotxsLEzsQiaOHkFpBQ2905esrAZK2SpIAaUEuDm5+LTNPAKj'. - 'C+pbps1evrIDKGWnLictKSkuLKyoZQyUya9o7Z2+YMXKGUApew'. - 'M9PTVdXR0TEwf3wOjUirruafOXL18xFyjl72Kpb25qaurg4REU'. - 'EFVe2zJ5zpLlK1aCpbydnZ2dnDwDA6NTopLLeiZNXbB8BcTAyP'. - 'TQ0JDg4KCY1NS83JKmiVOBepYvX9UPlAovzEiPSU/LLyior2vq'. - 'mjZr3vLlIF01IC+XVhUWFlZW1Lc290ycOGfxohVATSsXx4Oksn'. - 'vaWlsb2tq6J0+bM2/RohVA81asbIcEYueU3t7JU6ZNnwNyGkhm'. - '+cp5CRCppJnzZ8+ZM3/JUogECBbBIixr8Yqly8FCy8F6ltUgoj'. - 'lz7sqVK2ByK+cVMSCDxoUrwWDVysXt8WhJKqG4Y8bcuTP6qrGk'. - 'QwwAABiMu7T4HMi4AAAAAElFTkSuQmCC' ; + //========================================================== + // File: bl_purple.png + //========================================================== + $this->imgdata_large[4][0]= 1149 ; + $this->imgdata_large[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACAV'. + 'BMVEX/////////7///5///1v//xv//rf//pf//lP//jP//hP//'. + 'c///a///Wv//Wvf/Uv//Sv//Qv//Qvf/Off/Mf//Kf//If//If'. + 'f/GP//GPf/EP//EPf/CP//CPf/CO//AP//APf3Oe/3Kff3Ke/3'. + 'Ie/3GO/3EO/3AO/vSu/vSufvOefvMefvIefvGOfvEOfvCOfvAO'. + 'fnUufnSufnMd7nId7nGN7nGNbnEN7nCN7nAN7ejN7ejNbec97e'. + 'c9beUtbeQtbeIdbeGNbeENbeCNbeANbWpdbWa9bWQs7WGM7WEM'. + '7WCM7WAM7Otc7Orc7OnM7OSsbOIb3OGMbOEMbOCMbOAM7OAMbG'. + 'pcbGnMbGe8bGa8bGKbXGEL3GCL3GAL3FucXBu73AvsC/v7+9pb'. + '29Ka29GLW9ELW9CLW9AL29ALW5rrm1lLW1e7W1MbW1GKW1EK21'. + 'CLW1CK21AK2tjK2thKWtMaWtIaWtGJytCK2tCKWtAK2tAKWlhK'. + 'Wle6WlEJylCJylAKWlAJyca5ycGJScEJScCJScAJycAJSUWpSU'. + 'UoyUKZSUEIyUCIyUAJSUAIyMUoyMSoyMIYSMEISMCISMAIyMAI'. + 'SECHuEAISEAHt7MXt7EHt7CHt7AHt7AHNzKXNzEGtzAHNzAGtr'. + 'GGtrEGNrCGtrAGtrAGNjCFpjAGNjAFpaAFpaAFIpZn4bAAAAAX'. + 'RSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsS'. + 'AdLdfvwAAAAHdElNRQfTAwkRFB0ymoOwAAAB9UlEQVR4nGNgIA'. + 'K42hhqGtm5+WFIWClKycvLK6gbuARGoEj4aMjLSElISUir6Tt7'. + 'x+aEIWR8leQlwEBSTc/CK7awLguuR0lGQkJMVFRUTFJVzwko1d'. + 'oFk9OQl5IQE+Dh5hVR0TV3CkkvbJgyASJjDZIR5GBl5eRX0TH1'. + 'DEqrbJ2ypBEspSgvJSXKw8bMxMavbOLoGZNf1TZlybw4oIyfLN'. + 'BxotxsLEzsQiaOHkFpBQ2905esrAZK2SpIAaUEuDm5+LTNPAKj'. + 'C+pbps1evrIDKGWnLictKSkuLKyoZQyUya9o7Z2+YMXKGUApew'. + 'M9PTVdXR0TEwf3wOjUirruafOXL18xFyjl72Kpb25qaurg4REU'. + 'EFVe2zJ5zpLlK1aCpbydnZ2dnDwDA6NTopLLeiZNXbB8BcTAyP'. + 'TQ0JDg4KCY1NS83JKmiVOBepYvX9UPlAovzEiPSU/LLyior2vq'. + 'mjZr3vLlIF01IC+XVhUWFlZW1Lc290ycOGfxohVATSsXx4Oksn'. + 'vaWlsb2tq6J0+bM2/RohVA81asbIcEYueU3t7JU6ZNnwNyGkhm'. + '+cp5CRCppJnzZ8+ZM3/JUogECBbBIixr8Yqly8FCy8F6ltUgoj'. + 'lz7sqVK2ByK+cVMSCDxoUrwWDVysXt8WhJKqG4Y8bcuTP6qrGk'. + 'QwwAABiMu7T4HMi4AAAAAElFTkSuQmCC' ; -//========================================================== -// File: bl_gray.png -//========================================================== - $this->imgdata_large[5][0]= 905 ; - $this->imgdata_large[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAABO1'. - 'BMVEX////////3///39/fv7+/e5+fW3t7Wzs7WxsbG1tbGzsbG'. - 'xsbDxMS/v7++wMC+v7+9zsa9xsa9vb29tbW9ra29pa24uLi1xs'. - 'a1vb21tbWxtrattbWmpqalra2cra2cpaWcnJycjIyUpaWUnJyU'. - 'lJSUjIyMnJyMnJSMlJSMlIyMjJSMjIyElJSElIyEjIyEhIR7jI'. - 'x7hIR7hHt7e3t7e3N7e2tzhIRze3tze3Nzc3Nre3trc3Nrc2tr'. - 'a2tjc3Njc2tja3Nja2tjY2NjWlpaa2taY2taY2NaY1paWlpaUl'. - 'JSY2NSY1pSWlpSWlJSUlJSUkpKWlpKWlJKUlpKUlJKUkpKSkpK'. - 'SkJCUlJCUkJCSkpCSkJCQkI5Sko5QkI5Qjk5OUI5OTkxQkIxOT'. - 'kxMTkxMTEpMTEhMTEhKSkYISEpy7AFAAAAAXRSTlMAQObYZgAA'. - 'AAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdE'. - 'lNRQfTAwkRFQfW40uLAAABx0lEQVR4nI3SbXfSMBQA4NV3nce5'. - 'TecAHUywRMHSgFuBCFsQUqwBS1OsWQh0GTj//y8wZUzdwQ/efM'. - 'tzcm/uuXdj4z9ic/PR9k4qk1qDnf0X2/uZzKt8GaRvSubg4LVp'. - 'mkWzCGAT/i3Zsm2XNQHLsm2n2937LaaNnGoJFAEo27B50qN0ay'. - 'Wg26lXsw8fP8nmzcJb2CbsnF5JmmCE8ncN404KvLfsYwd7/MdV'. - 'Pdgl/VbKMIzbuwVgVZw2JlSKJTVJ3609vWUY957lgAUd1KNcqr'. - 'yWnOcOPn8q7d5/8PywAqsOOiVDrn42NFk+HQ7dVuXNYeFdBTpN'. - 'nY5JdZl8xI5Y+HXYaTVqEDp1hAnRohZM03EUjMdhn5wghOoNnD'. - 'wSK7KiiDPqEtz+iD4ctdyAifNYzUnScBSxwPd6GLfRURW7Ay5i'. - 'pS5bmrY8348C5vvUI+TLiIVSJrVA0heK/GDkJxYMRoyfCSmk4s'. - 'uWc3yic/oBo4yF374LGQs5Xw0GyQljI8bYmEsxVUoKxa6HMpAT'. - 'vgyhU2mR8uU1pXmsa8ezqb6U4mwWF/5MeY8uLtQ0nmmQ8UWYvb'. - 'EcJaYWar7QhztrO5Wr4Q4hDbAG/4hfTAF2iCiWrCEAAAAASUVO'. - 'RK5CYII=' ; + //========================================================== + // File: bl_gray.png + //========================================================== + $this->imgdata_large[5][0]= 905 ; + $this->imgdata_large[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAABO1'. + 'BMVEX////////3///39/fv7+/e5+fW3t7Wzs7WxsbG1tbGzsbG'. + 'xsbDxMS/v7++wMC+v7+9zsa9xsa9vb29tbW9ra29pa24uLi1xs'. + 'a1vb21tbWxtrattbWmpqalra2cra2cpaWcnJycjIyUpaWUnJyU'. + 'lJSUjIyMnJyMnJSMlJSMlIyMjJSMjIyElJSElIyEjIyEhIR7jI'. + 'x7hIR7hHt7e3t7e3N7e2tzhIRze3tze3Nzc3Nre3trc3Nrc2tr'. + 'a2tjc3Njc2tja3Nja2tjY2NjWlpaa2taY2taY2NaY1paWlpaUl'. + 'JSY2NSY1pSWlpSWlJSUlJSUkpKWlpKWlJKUlpKUlJKUkpKSkpK'. + 'SkJCUlJCUkJCSkpCSkJCQkI5Sko5QkI5Qjk5OUI5OTkxQkIxOT'. + 'kxMTkxMTEpMTEhMTEhKSkYISEpy7AFAAAAAXRSTlMAQObYZgAA'. + 'AAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdE'. + 'lNRQfTAwkRFQfW40uLAAABx0lEQVR4nI3SbXfSMBQA4NV3nce5'. + 'TecAHUywRMHSgFuBCFsQUqwBS1OsWQh0GTj//y8wZUzdwQ/efM'. + 'tzcm/uuXdj4z9ic/PR9k4qk1qDnf0X2/uZzKt8GaRvSubg4LVp'. + 'mkWzCGAT/i3Zsm2XNQHLsm2n2937LaaNnGoJFAEo27B50qN0ay'. + 'Wg26lXsw8fP8nmzcJb2CbsnF5JmmCE8ncN404KvLfsYwd7/MdV'. + 'Pdgl/VbKMIzbuwVgVZw2JlSKJTVJ3609vWUY957lgAUd1KNcqr'. + 'yWnOcOPn8q7d5/8PywAqsOOiVDrn42NFk+HQ7dVuXNYeFdBTpN'. + 'nY5JdZl8xI5Y+HXYaTVqEDp1hAnRohZM03EUjMdhn5wghOoNnD'. + 'wSK7KiiDPqEtz+iD4ctdyAifNYzUnScBSxwPd6GLfRURW7Ay5i'. + 'pS5bmrY8348C5vvUI+TLiIVSJrVA0heK/GDkJxYMRoyfCSmk4s'. + 'uWc3yic/oBo4yF374LGQs5Xw0GyQljI8bYmEsxVUoKxa6HMpAT'. + 'vgyhU2mR8uU1pXmsa8ezqb6U4mwWF/5MeY8uLtQ0nmmQ8UWYvb'. + 'EcJaYWar7QhztrO5Wr4Q4hDbAG/4hfTAF2iCiWrCEAAAAASUVO'. + 'RK5CYII=' ; -//========================================================== -// File: bl_brown.png -//========================================================== - $this->imgdata_large[6][0]= 1053 ; - $this->imgdata_large[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABoV'. - 'BMVEX////Gzs7GvbXGrZTGpXu9nHO1nHO1nIy9taXGxs7GtaXO'. - 'nHPGlFrGjEq9hEq1hEqte0Klczmcazmce1KtnIzGxsbGvb3OlF'. - 'LOlFq9hFKte0qcc0KUYzGEWimMc1K9ta3OnGvOnGPWnGO9jFq9'. - 'jFKlc0KUazmMYzl7UilzUjGtpZzGxr3GnGPWpWvepXO1hFJ7Wj'. - 'FrSiFjUjG1ra3GnHPvxpT/5733zpythFKUa0KEYzlzUilaOSF7'. - 'Wjm9jErvvYz/99b///f/78bnrYS1hFqle0p7UjFrSiljQiFCMR'. - 'iMhHO9lGvGjFLWnGv/3q3////erXuthEqlc0paQiFKMRhSQin/'. - '1qX/997//++cc0pjSilaQilKORhCKRiclIy9pYzGlGPntYT33q'. - '3vvZSEWjlSOSE5KRB7c2O1lHutczmthFqte1JrWkqtjGtCKRBa'. - 'SjmljGuca0KMYzGMaznOztaclISUYzmEWjFKOSF7a1qEYzFaSi'. - 'GUjISEa0pKOSm9vb2llIxaQhg5IQiEc2tzY0paORilnJy1raVS'. - 'OSljUkJjWkKTpvQWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. - 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkREiei'. - 'zP2EAAAB9UlEQVR4nGWS/VfSUBjHL5QluhhBxtwyWcCus5Blpm'. - 'wDC4ONaWXCyBi7RMZmpQ2Bypm9W/byV3cHHo/W88s95/s5z/d5'. - 'uwCcCh/4L3zAf+bs0NC588On9QAYGSUuBINk6GI4cmnsBLk8Go'. - '1SFEGMkzRzZeLq5JE8FvDHouw1lqXiCZJOcnCKnx4AcP0GBqmZ'. - 'mRgRT9MMB4Wbs7cGSXNRik3dnp9fiMUzNCNKgpzN9bsaWaQo9s'. - '7dfH7pXiFTZCBU1JK27LmtBO8TDx7mV1eXHqXXyiIUFLWiVzHx'. - 'BxcJIvV4/cn6wkqmWOOwmVE3UQOAp6HxRKL5bGPj+VwhUhalFq'. - '8alm5vAt+LlySZTsebzcKrraIIW4JqZC3N3ga+1+EQTZKZta1M'. - 'pCZCSeDViqVrThsEdsLJZLJYLpZrHVGScrKBvTQNtQHY6XIM02'. - 'E6Ik7odRW1Dzy3N28n3kGuB3tQagm7UMBFXI/sATAs7L5vdbEs'. - '8Lycm923NB0j5wMe6KOsKIIyxcuqauxbrmlqyEWfPmPy5assY1'. - 'U1SvWKZWom9nK/HfQ3+v2HYZSMStayTNN0PYKqg11P1nWsWq7u'. - '4gJeY8g9PLrddNXRdW8Iryv86I3ja/9s26gvukhDdvUQnIjlKr'. - 'IdZCNH+3Xw779qbG63f//ZOzb6C4+ofdbzERrSAAAAAElFTkSu'. - 'QmCC' ; + //========================================================== + // File: bl_brown.png + //========================================================== + $this->imgdata_large[6][0]= 1053 ; + $this->imgdata_large[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABoV'. + 'BMVEX////Gzs7GvbXGrZTGpXu9nHO1nHO1nIy9taXGxs7GtaXO'. + 'nHPGlFrGjEq9hEq1hEqte0Klczmcazmce1KtnIzGxsbGvb3OlF'. + 'LOlFq9hFKte0qcc0KUYzGEWimMc1K9ta3OnGvOnGPWnGO9jFq9'. + 'jFKlc0KUazmMYzl7UilzUjGtpZzGxr3GnGPWpWvepXO1hFJ7Wj'. + 'FrSiFjUjG1ra3GnHPvxpT/5733zpythFKUa0KEYzlzUilaOSF7'. + 'Wjm9jErvvYz/99b///f/78bnrYS1hFqle0p7UjFrSiljQiFCMR'. + 'iMhHO9lGvGjFLWnGv/3q3////erXuthEqlc0paQiFKMRhSQin/'. + '1qX/997//++cc0pjSilaQilKORhCKRiclIy9pYzGlGPntYT33q'. + '3vvZSEWjlSOSE5KRB7c2O1lHutczmthFqte1JrWkqtjGtCKRBa'. + 'SjmljGuca0KMYzGMaznOztaclISUYzmEWjFKOSF7a1qEYzFaSi'. + 'GUjISEa0pKOSm9vb2llIxaQhg5IQiEc2tzY0paORilnJy1raVS'. + 'OSljUkJjWkKTpvQWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkREiei'. + 'zP2EAAAB9UlEQVR4nGWS/VfSUBjHL5QluhhBxtwyWcCus5Blpm'. + 'wDC4ONaWXCyBi7RMZmpQ2Bypm9W/byV3cHHo/W88s95/s5z/d5'. + 'uwCcCh/4L3zAf+bs0NC588On9QAYGSUuBINk6GI4cmnsBLk8Go'. + '1SFEGMkzRzZeLq5JE8FvDHouw1lqXiCZJOcnCKnx4AcP0GBqmZ'. + 'mRgRT9MMB4Wbs7cGSXNRik3dnp9fiMUzNCNKgpzN9bsaWaQo9s'. + '7dfH7pXiFTZCBU1JK27LmtBO8TDx7mV1eXHqXXyiIUFLWiVzHx'. + 'BxcJIvV4/cn6wkqmWOOwmVE3UQOAp6HxRKL5bGPj+VwhUhalFq'. + '8alm5vAt+LlySZTsebzcKrraIIW4JqZC3N3ga+1+EQTZKZta1M'. + 'pCZCSeDViqVrThsEdsLJZLJYLpZrHVGScrKBvTQNtQHY6XIM02'. + 'E6Ik7odRW1Dzy3N28n3kGuB3tQagm7UMBFXI/sATAs7L5vdbEs'. + '8Lycm923NB0j5wMe6KOsKIIyxcuqauxbrmlqyEWfPmPy5assY1'. + 'U1SvWKZWom9nK/HfQ3+v2HYZSMStayTNN0PYKqg11P1nWsWq7u'. + '4gJeY8g9PLrddNXRdW8Iryv86I3ja/9s26gvukhDdvUQnIjlKr'. + 'IdZCNH+3Xw779qbG63f//ZOzb6C4+ofdbzERrSAAAAAElFTkSu'. + 'QmCC' ; -//========================================================== -// File: bl_darkgreen.png -//========================================================== - $this->imgdata_large[7][0]= 1113 ; - $this->imgdata_large[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. - 'BMVEX////////3///v///n/+/e99bW/+/W99bO786/v7++vr69'. - '/96999a7wb24vbu1/9a1zqW1u7itxrWosq6l772l1qWlxrWlxq'. - '2lva2cxpSU562U3q2UxqWUvaWUpZyM77WM57WMvYyMtZyMrZyM'. - 'pZSMnJSEvZyEtYyErZSElIx7zpR7xpx7xpR7vZR7jIRz1pRzxp'. - 'RzjIRrzpRrzoxrxoxrtYRrrYxrrXtrpYRrhHNjzoxjxoxjxoRj'. - 'vYRjtYRjrXtjpXtjlGNje2tazoxazoRaxoxaxoRavYRatYRatX'. - 'tarXtapXNanHNajFpae2tSzoRSxoRSvXtStXtSrXtSrXNSpXNS'. - 'nHNSnGtSlGtSlGNSjGtSjGNKvXtKtXNKrXNKpWtKnGtKlGNKjG'. - 'NKhGNKhFJKc1pKa1JCrWtCpWtCnGtClGNCjGNCjFpChFpCe1JC'. - 'a1JCY1I5pWs5nGM5lGM5jFo5hFo5e1o5c0o5WkoxjFoxhFoxhF'. - 'Ixe1Ixc1Ixc0oxa0ophFIpe0opc0opa0opa0IpY0IpWkIpWjkp'. - 'UkIpUjkhc0oha0IhY0IhWjkhWjEhUjkhUjEhSjEhSikhQjEhQi'. - 'kYWjkYSjEYSikYQjEYQikQSikQQikQQiEQOSExf8saAAAAAXRS'. - 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. - 'LdfvwAAAAHdElNRQfTAwkRFCaDkWqUAAAB+ElEQVR4nI3S+1vS'. - 'UBgHcGZlPV0ks/vFrmQWFimJjiwiYUJWjFBWFhClyZCy5hLrwA'. - 'x2EIwJC1w7zf2vnU0re+iHvs9++7x7zznvORbLf+TA6ct9fYMX'. - 'jrfAUYefpp+/iM1ykxf/lmuhUZ/PTwXC8dml5Wcd23o5H5Mk6b'. - '5NUU8icXbhS67rNzn9JDnguOEYGQtEEtwC+Crs3RJ76P5A/znr'. - 'vsNX7wQnEiwHCtK7TTkW8rvdZ9uJtvZTLkxpHhSrP66bNEj7/P'. - '3WNoLYeeSWQQCIpe9lQw7RNEU5rDsIYtcJ14Nocg7kRUlBNkxn'. - 'YmGKcp7cv3vPwR7XOJPmc0VYU3Sv0e9NOBAYG7Hbz/cMjTMveZ'. - 'CHkqxuTBv0PhYJB4N3XR6PJ5rMAPMnpGUxDX1IxSeMTEaZp1OZ'. - 'nGAIQiYtsalUIhFlmGTy3sO3AizJCKn6DKYryxzHsWyaneMzr6'. - 'cWxRVZVlFTe4SpE3zm+U/4+whyiwJcWVMQNr3XONirVWAklxcE'. - 'EdbqchPhjhVzGpeqhUKhWBQhLElr9fo3pDaQPrw5xOl1CGG1JE'. - 'k1uYEBIVkrb02+o6RItfq6rBhbw/tuINT96766KhuqYpY3UFPF'. - 'BbY/19yZ1XF1U0UNBa9T7rZsz80K0jWk6bpWGW55UzbvTHZ+3t'. - 'vbAv/IT+K1uCmhIrKJAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bl_darkgreen.png + //========================================================== + $this->imgdata_large[7][0]= 1113 ; + $this->imgdata_large[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. + 'BMVEX////////3///v///n/+/e99bW/+/W99bO786/v7++vr69'. + '/96999a7wb24vbu1/9a1zqW1u7itxrWosq6l772l1qWlxrWlxq'. + '2lva2cxpSU562U3q2UxqWUvaWUpZyM77WM57WMvYyMtZyMrZyM'. + 'pZSMnJSEvZyEtYyErZSElIx7zpR7xpx7xpR7vZR7jIRz1pRzxp'. + 'RzjIRrzpRrzoxrxoxrtYRrrYxrrXtrpYRrhHNjzoxjxoxjxoRj'. + 'vYRjtYRjrXtjpXtjlGNje2tazoxazoRaxoxaxoRavYRatYRatX'. + 'tarXtapXNanHNajFpae2tSzoRSxoRSvXtStXtSrXtSrXNSpXNS'. + 'nHNSnGtSlGtSlGNSjGtSjGNKvXtKtXNKrXNKpWtKnGtKlGNKjG'. + 'NKhGNKhFJKc1pKa1JCrWtCpWtCnGtClGNCjGNCjFpChFpCe1JC'. + 'a1JCY1I5pWs5nGM5lGM5jFo5hFo5e1o5c0o5WkoxjFoxhFoxhF'. + 'Ixe1Ixc1Ixc0oxa0ophFIpe0opc0opa0opa0IpY0IpWkIpWjkp'. + 'UkIpUjkhc0oha0IhY0IhWjkhWjEhUjkhUjEhSjEhSikhQjEhQi'. + 'kYWjkYSjEYSikYQjEYQikQSikQQikQQiEQOSExf8saAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwkRFCaDkWqUAAAB+ElEQVR4nI3S+1vS'. + 'UBgHcGZlPV0ks/vFrmQWFimJjiwiYUJWjFBWFhClyZCy5hLrwA'. + 'x2EIwJC1w7zf2vnU0re+iHvs9++7x7zznvORbLf+TA6ct9fYMX'. + 'jrfAUYefpp+/iM1ykxf/lmuhUZ/PTwXC8dml5Wcd23o5H5Mk6b'. + '5NUU8icXbhS67rNzn9JDnguOEYGQtEEtwC+Crs3RJ76P5A/znr'. + 'vsNX7wQnEiwHCtK7TTkW8rvdZ9uJtvZTLkxpHhSrP66bNEj7/P'. + '3WNoLYeeSWQQCIpe9lQw7RNEU5rDsIYtcJ14Nocg7kRUlBNkxn'. + 'YmGKcp7cv3vPwR7XOJPmc0VYU3Sv0e9NOBAYG7Hbz/cMjTMveZ'. + 'CHkqxuTBv0PhYJB4N3XR6PJ5rMAPMnpGUxDX1IxSeMTEaZp1OZ'. + 'nGAIQiYtsalUIhFlmGTy3sO3AizJCKn6DKYryxzHsWyaneMzr6'. + 'cWxRVZVlFTe4SpE3zm+U/4+whyiwJcWVMQNr3XONirVWAklxcE'. + 'EdbqchPhjhVzGpeqhUKhWBQhLElr9fo3pDaQPrw5xOl1CGG1JE'. + 'k1uYEBIVkrb02+o6RItfq6rBhbw/tuINT96766KhuqYpY3UFPF'. + 'BbY/19yZ1XF1U0UNBa9T7rZsz80K0jWk6bpWGW55UzbvTHZ+3t'. + 'vbAv/IT+K1uCmhIrKJAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bl_green.png -//========================================================== - $this->imgdata_large[8][0]= 1484 ; - $this->imgdata_large[8][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMMFjM4kcoDJQAABVlJREFUeNq9ll2MJFUVx3/11V'. - 'Vd/TE9vU0v4zLDwJIF16jBqLAPhsRXEiDqg0QTJiQSjcSNvCzw'. - 'sBEDDxizhvAAxBgf1oR9QF9NiE9ESFZkQyZB5WtddmdnZ3qqqr'. - 'uqbt367Cofqu3ZZpWVaDzJfbkf53//55z/PVdZXV3l/2H6f7Lp'. - '5VdOV/4Nb+GmHpUeA7AdBNxc3kafNb73jRPK9Xwon8ToxVefqU'. - 'b91wibH5EkCQBCizFihTSviHUHR0hWws9xe3wvJ7/7nPKpgX5y'. - '9oFqt3eOgWniRBoAbUBGGqZUibSYaeoT2B5bnkdaSA6793Cv/S'. - 'QPPbihXBfo5VdOV+8dfgnvwAU62YH5fCZ12sDujFkwyegCqTrB'. - 'iUOKTOJKj8jr88jS8zy6cXwBTP048nuHX0I0nDlIp7RpTG7kM0'. - 'sdyAYsTVukUuWGhlWHMq0ITL92lnUp9R1Obz/GmTNnqn9bDD8/'. - '+0D1oX0O0zQZZDYCsK2j3Gl9jQqDfHiei8GfiKVLlsZkJaBAN1'. - '0i6PgwUbB0GxG5/PrtE/xLRr959Znqw9452oVNI+jiJhnr1pe4'. - 'k29zB1/nFr5Kj7tpt1YYhJ0FJ7nUYbcJQBgahN2MzeCP/OipR6'. - 'prgN6Qr6ELFQFUWoRpNVjlKwxZB8DCpE+PtfEKqV1cUzxpVudu'. - 'GTBHA5Y1g99e+dUio9O/P1Vpq+/WE5GGjDSMoAtAQjrf3C52IP'. - 'QxpY4WK2hpReka9Gfrhqgz0bACRoCWjDh56kQ1z9FeuUUQxVhK'. - 'B92sD1VahM+bAJgcoJhGjP/6Ln8rAgDiRCVRKiIzxMkkodBJ85'. - 'im1IlEHbE4k1xyNveL4YP8HarmGJIOpqyjeQmfNHmTvnqZTWBt'. - 'vIJXpPwlukJSuSTKGK3pEwtJmiX00ZlInTyNscImO6XBITvH1c'. - '8vVt2OucdKvIyeKRTNCivsEMgcpg6taYs30nfq0Gqg6hOSSFJ4'. - 'BSnJPht0IqEjWmOGocEI6F0J94F0qaL6BntTF0MtUfweKQKAPU'. - 'Wwp4OcVnQAmVb0p9DLOzjEhEKnGRmoRc7EzRGlwA6NujAKG4yP'. - '6Sjwc4aVznZ7DK0xXdkDoJf0kGmFBniFBOBGcZSCCSKd0IwN0k'. - 'IS+QZWCGVZex4BnUxya3+Zt9iugQbcRFpIAtuHvAZulPUdLhUJ'. - 'RqegI3WcqaSXddlT3idsWMSRRGkEtNwmyTifAwyBo7LP+11J0e'. - '7tM7pZOYblHkBLcqZ5LcYtw6Wbd4CM3SpE9foYZsIHoqDKCrbz'. - 'mLSQtPwmuhXgtBLs0GBdbXOhFGB7WBKO2F8GXt9/VO97Ya3atF'. - '7nUHnwGjGGQqcPxFEdFqURkEidiZszAERoYIsGju1hq21kWee3'. - 'bw15+8WpsvAy3K1+i3JkkhZyPpxxjjPOsfOYiZ+TFhLPzQnHOU'. - 'tpzGB2dgA4tscIkKIx19Cxg/fPL7vQJu47eXt1VvsDK8pwPueZ'. - 'PuZoQMOqhRoJHSs0kKLBWjvjYinmeQGw1TaX1RFdfZ3LMzYLjA'. - 'C++dkn6AaH2Nobk6cxEzdnuG0TdC8zvdJkN0hqkFkO/jwL0fxa'. - 'so8sBcuFzQ+/+MRC+BeAHnpwQzn++ee5KT9Eshuy46dcKAXm32'. - '0uzPQhS4GttkH2GQID2Wc0Y4LtAbDxhZ/x5A+e/uTG9+jGceXH'. - '9/ySnnIXnUzOxXe1038mW3ZynNmam4yYWkO+f9cv+Oljz16/lV'. - '9tDz/9nerc1hm8ZEScSRK7VvtYl1i1dklsOKyvc+zg/bzw1O8+'. - '/efkajt56kR1ydlEJBc5H46xzbrJ3dY9wrB7hGcff+6/+279L+'. - '0fHxyiE8XMLl4AAAAASUVORK5CYII=' ; + //========================================================== + // File: bl_green.png + //========================================================== + $this->imgdata_large[8][0]= 1484 ; + $this->imgdata_large[8][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMMFjM4kcoDJQAABVlJREFUeNq9ll2MJFUVx3/11V'. + 'Vd/TE9vU0v4zLDwJIF16jBqLAPhsRXEiDqg0QTJiQSjcSNvCzw'. + 'sBEDDxizhvAAxBgf1oR9QF9NiE9ESFZkQyZB5WtddmdnZ3qqqr'. + 'uqbt367Cofqu3ZZpWVaDzJfbkf53//55z/PVdZXV3l/2H6f7Lp'. + '5VdOV/4Nb+GmHpUeA7AdBNxc3kafNb73jRPK9Xwon8ToxVefqU'. + 'b91wibH5EkCQBCizFihTSviHUHR0hWws9xe3wvJ7/7nPKpgX5y'. + '9oFqt3eOgWniRBoAbUBGGqZUibSYaeoT2B5bnkdaSA6793Cv/S'. + 'QPPbihXBfo5VdOV+8dfgnvwAU62YH5fCZ12sDujFkwyegCqTrB'. + 'iUOKTOJKj8jr88jS8zy6cXwBTP048nuHX0I0nDlIp7RpTG7kM0'. + 'sdyAYsTVukUuWGhlWHMq0ITL92lnUp9R1Obz/GmTNnqn9bDD8/'. + '+0D1oX0O0zQZZDYCsK2j3Gl9jQqDfHiei8GfiKVLlsZkJaBAN1'. + '0i6PgwUbB0GxG5/PrtE/xLRr959Znqw9452oVNI+jiJhnr1pe4'. + 'k29zB1/nFr5Kj7tpt1YYhJ0FJ7nUYbcJQBgahN2MzeCP/OipR6'. + 'prgN6Qr6ELFQFUWoRpNVjlKwxZB8DCpE+PtfEKqV1cUzxpVudu'. + 'GTBHA5Y1g99e+dUio9O/P1Vpq+/WE5GGjDSMoAtAQjrf3C52IP'. + 'QxpY4WK2hpReka9Gfrhqgz0bACRoCWjDh56kQ1z9FeuUUQxVhK'. + 'B92sD1VahM+bAJgcoJhGjP/6Ln8rAgDiRCVRKiIzxMkkodBJ85'. + 'im1IlEHbE4k1xyNveL4YP8HarmGJIOpqyjeQmfNHmTvnqZTWBt'. + 'vIJXpPwlukJSuSTKGK3pEwtJmiX00ZlInTyNscImO6XBITvH1c'. + '8vVt2OucdKvIyeKRTNCivsEMgcpg6taYs30nfq0Gqg6hOSSFJ4'. + 'BSnJPht0IqEjWmOGocEI6F0J94F0qaL6BntTF0MtUfweKQKAPU'. + 'Wwp4OcVnQAmVb0p9DLOzjEhEKnGRmoRc7EzRGlwA6NujAKG4yP'. + '6Sjwc4aVznZ7DK0xXdkDoJf0kGmFBniFBOBGcZSCCSKd0IwN0k'. + 'IS+QZWCGVZex4BnUxya3+Zt9iugQbcRFpIAtuHvAZulPUdLhUJ'. + 'RqegI3WcqaSXddlT3idsWMSRRGkEtNwmyTifAwyBo7LP+11J0e'. + '7tM7pZOYblHkBLcqZ5LcYtw6Wbd4CM3SpE9foYZsIHoqDKCrbz'. + 'mLSQtPwmuhXgtBLs0GBdbXOhFGB7WBKO2F8GXt9/VO97Ya3atF'. + '7nUHnwGjGGQqcPxFEdFqURkEidiZszAERoYIsGju1hq21kWee3'. + 'bw15+8WpsvAy3K1+i3JkkhZyPpxxjjPOsfOYiZ+TFhLPzQnHOU'. + 'tpzGB2dgA4tscIkKIx19Cxg/fPL7vQJu47eXt1VvsDK8pwPueZ'. + 'PuZoQMOqhRoJHSs0kKLBWjvjYinmeQGw1TaX1RFdfZ3LMzYLjA'. + 'C++dkn6AaH2Nobk6cxEzdnuG0TdC8zvdJkN0hqkFkO/jwL0fxa'. + 'so8sBcuFzQ+/+MRC+BeAHnpwQzn++ee5KT9Eshuy46dcKAXm32'. + '0uzPQhS4GttkH2GQID2Wc0Y4LtAbDxhZ/x5A+e/uTG9+jGceXH'. + '9/ySnnIXnUzOxXe1038mW3ZynNmam4yYWkO+f9cv+Oljz16/lV'. + '9tDz/9nerc1hm8ZEScSRK7VvtYl1i1dklsOKyvc+zg/bzw1O8+'. + '/efkajt56kR1ydlEJBc5H46xzbrJ3dY9wrB7hGcff+6/+279L+'. + '0fHxyiE8XMLl4AAAAASUVORK5CYII=' ; -//========================================================== -// File: bl_blue.png -//========================================================== - $this->imgdata_large[9][0]= 1169 ; - $this->imgdata_large[9][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACEF'. - 'BMVEX/////////7//35//v1v/exv/Wvf/Wrf/Wpf/Orf+/v7+9'. - 'tc69jP+9hP+5ucW1tc6tlP+rq7Wlpdalpcalpb2cnM6cnMacc/'. - '+cWv+UlLWUjN6UjK2Uc/+Ma/+MUv+EhKWEa/+EQvd7e8Z7e7V7'. - 'e6V7c957Wv9za9Zza8ZzSv9ra5xrSv9rOf9rMe9jUudjQv9jOe'. - '9aWpRaUt5aUpRaSu9aSudSUoxSSs5SSoxSMf9KQtZKOfdKMedK'. - 'Kf9KKe9CKf9CKb1CKa1CIfdCIedCId45MXs5Kfc5If85Iec5Id'. - 'Y5GP8xMbUxMXsxKc4xKZQxIf8xGP8xGO8xGN4xGNYxGL0xGK0p'. - 'KXMpIYwpGP8pGO8pGOcpGNYpGM4pEP8pEPcpEOcpEN4pENYpEM'. - 'YpEL0hGKUhEP8hEPchEO8hEOchEN4hENYhEM4hEMYhELUhCP8h'. - 'CO8hCN4YGJwYGGsYEL0YEK0YEHMYCN4YCM4YCMYYCL0YCKUYAP'. - '8QEJQQEIwQEHsQEGsQCM4QCLUQCK0QCKUQCJwQCJQQCIwQCHMQ'. - 'CGsQAP8QAPcQAO8QAOcQAN4QANYQAM4QAMYQAL0QALUQAKUQAJ'. - 'QQAIQICGsICGMIAO8IANYIAL0IALUIAK0IAKUIAJwIAJQIAIwI'. - 'AIQIAHsIAHMIAGsIAGMAAN4AAMYAAK0AAJQAAIwAAIQAAHMAAG'. - 'sAAGMAAFrR1dDlAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFRPMOZ'. - '/2AAAB+klEQVR4nGNgIAIIqeqZmBqpi2JISNml5lVXV3d198Yo'. - 'oUjwm1SnxsbGRsSm5ZfNXO4tjCTjVh0ABhFx6QV9E1Y0S8JkuN'. - '3yAgLc7W3t/QPi4jPKJ8ye1yoIlTKpjvVy15eVUbN0i4zKLJ8w'. - 'ae6qcKgLqmMj3PUFWFl5NJ0CExLLJzbNW7BWCyxlXR0ba6/Axs'. - 'zELmfnkRBT0QiSKgXJCOflxUbYy3KyMHEoOrtEZ1c2TZ6/cMl6'. - 'eaCUamdsbIC7tjgPr4SBS3BMMVDTwkXr1hsDpYy6UmMj/O0tdX'. - 'QNbDxjknJLWqYsXLx0vStQynxGflpkZGCgs7Onp29SbtNkoMy6'. - 'pevCgFJWy3oyMuKjgoKCPWNCvEuqWhcsWrJ06XqQlPnMvrKyrM'. - 'TomJjkZAfHlNa2qdOWrlu63gcopbG8v7+hvLwip7g4JdSxsLZu'. - '8dKlS9ettwBKic2eNXHChIkTG5tKqgpr2uo6loLAehWQx0LnzJ'. - '49p6mpeXLLlNq6RUvqly6dvnR9Bx9ISnnlvLmT582bMr9t4aL2'. - '+vrp60GaDCGB6Ld6wfwFCxYCJZYsXQ+SmL6+FBryInVrFi1atH'. - 'jJkqVQsH6pNCzCJNvXrQW6CmQJREYFEc2CYevXrwMLAyXXl0oz'. - 'IAOt0vVQUGSIkabkDV3DwlzNVDAksAAAfUbNQRCwr88AAAAASU'. - 'VORK5CYII=' ; + //========================================================== + // File: bl_blue.png + //========================================================== + $this->imgdata_large[9][0]= 1169 ; + $this->imgdata_large[9][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACEF'. + 'BMVEX/////////7//35//v1v/exv/Wvf/Wrf/Wpf/Orf+/v7+9'. + 'tc69jP+9hP+5ucW1tc6tlP+rq7Wlpdalpcalpb2cnM6cnMacc/'. + '+cWv+UlLWUjN6UjK2Uc/+Ma/+MUv+EhKWEa/+EQvd7e8Z7e7V7'. + 'e6V7c957Wv9za9Zza8ZzSv9ra5xrSv9rOf9rMe9jUudjQv9jOe'. + '9aWpRaUt5aUpRaSu9aSudSUoxSSs5SSoxSMf9KQtZKOfdKMedK'. + 'Kf9KKe9CKf9CKb1CKa1CIfdCIedCId45MXs5Kfc5If85Iec5Id'. + 'Y5GP8xMbUxMXsxKc4xKZQxIf8xGP8xGO8xGN4xGNYxGL0xGK0p'. + 'KXMpIYwpGP8pGO8pGOcpGNYpGM4pEP8pEPcpEOcpEN4pENYpEM'. + 'YpEL0hGKUhEP8hEPchEO8hEOchEN4hENYhEM4hEMYhELUhCP8h'. + 'CO8hCN4YGJwYGGsYEL0YEK0YEHMYCN4YCM4YCMYYCL0YCKUYAP'. + '8QEJQQEIwQEHsQEGsQCM4QCLUQCK0QCKUQCJwQCJQQCIwQCHMQ'. + 'CGsQAP8QAPcQAO8QAOcQAN4QANYQAM4QAMYQAL0QALUQAKUQAJ'. + 'QQAIQICGsICGMIAO8IANYIAL0IALUIAK0IAKUIAJwIAJQIAIwI'. + 'AIQIAHsIAHMIAGsIAGMAAN4AAMYAAK0AAJQAAIwAAIQAAHMAAG'. + 'sAAGMAAFrR1dDlAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFRPMOZ'. + '/2AAAB+klEQVR4nGNgIAIIqeqZmBqpi2JISNml5lVXV3d198Yo'. + 'oUjwm1SnxsbGRsSm5ZfNXO4tjCTjVh0ABhFx6QV9E1Y0S8JkuN'. + '3yAgLc7W3t/QPi4jPKJ8ye1yoIlTKpjvVy15eVUbN0i4zKLJ8w'. + 'ae6qcKgLqmMj3PUFWFl5NJ0CExLLJzbNW7BWCyxlXR0ba6/Axs'. + 'zELmfnkRBT0QiSKgXJCOflxUbYy3KyMHEoOrtEZ1c2TZ6/cMl6'. + 'eaCUamdsbIC7tjgPr4SBS3BMMVDTwkXr1hsDpYy6UmMj/O0tdX'. + 'QNbDxjknJLWqYsXLx0vStQynxGflpkZGCgs7Onp29SbtNkoMy6'. + 'pevCgFJWy3oyMuKjgoKCPWNCvEuqWhcsWrJ06XqQlPnMvrKyrM'. + 'TomJjkZAfHlNa2qdOWrlu63gcopbG8v7+hvLwip7g4JdSxsLZu'. + '8dKlS9ettwBKic2eNXHChIkTG5tKqgpr2uo6loLAehWQx0LnzJ'. + '49p6mpeXLLlNq6RUvqly6dvnR9Bx9ISnnlvLmT582bMr9t4aL2'. + '+vrp60GaDCGB6Ld6wfwFCxYCJZYsXQ+SmL6+FBryInVrFi1atH'. + 'jJkqVQsH6pNCzCJNvXrQW6CmQJREYFEc2CYevXrwMLAyXXl0oz'. + 'IAOt0vVQUGSIkabkDV3DwlzNVDAksAAAfUbNQRCwr88AAAAASU'. + 'VORK5CYII=' ; -//========================================================== -// File: bs_red.png -//========================================================== - $this->imgdata_small[0][0]= 437 ; - $this->imgdata_small[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. - 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. - 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. - 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. - 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. - 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGDNEMgOYAAAAm0'. - 'lEQVR4nI3Q3RKCIBAFYGZMy9RKzX7MVUAUlQTe/+kS0K49d3wD'. - '7JlFaG+CvIR3FvzPXgpLatxevVVS+Jzv0BDGk/UJwOkQ1ph2g/'. - 'Ct5ACX4wNT1o/zzUoJUFUGBiGfVnDTYGJgmrWy8iKEtp0Bpd2d'. - 'jLGu56MB7f4JOOfDJAwoNwslk/jOUi+Jts6RVNrC1hkhPy50Ef'. - 'u79/ADQMQSGQ8bBywAAAAASUVORK5CYII=' ; + //========================================================== + // File: bs_red.png + //========================================================== + $this->imgdata_small[0][0]= 437 ; + $this->imgdata_small[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. + 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. + 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. + 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. + 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. + 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGDNEMgOYAAAAm0'. + 'lEQVR4nI3Q3RKCIBAFYGZMy9RKzX7MVUAUlQTe/+kS0K49d3wD'. + '7JlFaG+CvIR3FvzPXgpLatxevVVS+Jzv0BDGk/UJwOkQ1ph2g/'. + 'Ct5ACX4wNT1o/zzUoJUFUGBiGfVnDTYGJgmrWy8iKEtp0Bpd2d'. + 'jLGu56MB7f4JOOfDJAwoNwslk/jOUi+Jts6RVNrC1hkhPy50Ef'. + 'u79/ADQMQSGQ8bBywAAAAASUVORK5CYII=' ; -//========================================================== -// File: bs_lightblue.png -//========================================================== - $this->imgdata_small[1][0]= 657 ; - $this->imgdata_small[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABVl'. - 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. - 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. - '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. - 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. - 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. - 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. - 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. - 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. - 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. - 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. - 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGTok'. - '9Yp9AAAAtElEQVR4nGNgIBaw8wkpKghzwvksPAKiUsraprYiLF'. - 'ARXkE2JiZ1PXMHXzGIAIekOFBE08TGLTCOCyzCLyvDxsZqZOnk'. - 'E56kAhaRV9NQUjW2tPcMjs9wBYsY6Oobmlk7egRGpxZmgkW0zC'. - '2s7Jy9giKT8gohaiQcnVzc/UNjkrMLCyHmcHr7BYREJKTlFxbm'. - 'QOxiEIuKTUzJKgQCaZibpdOzQfwCOZibGRi4dcJyw3S4iQ4HAL'. - 'qvIlIAMH7YAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bs_lightblue.png + //========================================================== + $this->imgdata_small[1][0]= 657 ; + $this->imgdata_small[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABVl'. + 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. + 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. + '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. + 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. + 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. + 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. + 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. + 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. + 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. + 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGTok'. + '9Yp9AAAAtElEQVR4nGNgIBaw8wkpKghzwvksPAKiUsraprYiLF'. + 'ARXkE2JiZ1PXMHXzGIAIekOFBE08TGLTCOCyzCLyvDxsZqZOnk'. + 'E56kAhaRV9NQUjW2tPcMjs9wBYsY6Oobmlk7egRGpxZmgkW0zC'. + '2s7Jy9giKT8gohaiQcnVzc/UNjkrMLCyHmcHr7BYREJKTlFxbm'. + 'QOxiEIuKTUzJKgQCaZibpdOzQfwCOZibGRi4dcJyw3S4iQ4HAL'. + 'qvIlIAMH7YAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bs_gray.png -//========================================================== - $this->imgdata_small[2][0]= 550 ; - $this->imgdata_small[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAMAAADH72RtAAABI1'. - 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. - 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. - 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. - 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. - 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. - 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. - '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. - 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. - 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIA'. - 'AAsSAdLdfvwAAAAHdElNRQfTAwkUGiIctEHoAAAAfElEQVR4nI'. - '2N2xKDIAwF+bZ2kAa8cNFosBD//yvKWGh9dN+yk9kjxH28R7ze'. - 'wzBOYSX6CaNB927Z9qZ66KTSNmBM7UU9Hx2c5qjmJaWCaV5j4t'. - 'o1ANr40sn5a+x4biElrqHgrXMeac/c1nEpFHG0LSFoo/jO/BeF'. - 'lJnFbT58ayUf0BpA8wAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bs_gray.png + //========================================================== + $this->imgdata_small[2][0]= 550 ; + $this->imgdata_small[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAMAAADH72RtAAABI1'. + 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. + 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. + 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. + 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. + 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. + 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. + '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. + 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. + 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIA'. + 'AAsSAdLdfvwAAAAHdElNRQfTAwkUGiIctEHoAAAAfElEQVR4nI'. + '2N2xKDIAwF+bZ2kAa8cNFosBD//yvKWGh9dN+yk9kjxH28R7ze'. + 'wzBOYSX6CaNB927Z9qZ66KTSNmBM7UU9Hx2c5qjmJaWCaV5j4t'. + 'o1ANr40sn5a+x4biElrqHgrXMeac/c1nEpFHG0LSFoo/jO/BeF'. + 'lJnFbT58ayUf0BpA8wAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bs_greenblue.png -//========================================================== - $this->imgdata_small[3][0]= 503 ; - $this->imgdata_small[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAxl'. - 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. - '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. - '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. - 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. - 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. - 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. - 'dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfT'. - 'AwkUGTIqLgJPAAAAqklEQVR4nI2QVxOCMBCEM6Mi2OiCvSslJB'. - 'CUoqjn//9TYgCfubf9Zu9uZxFqO+rscO7b6l/LljMZX29J2pNr'. - 'YjmX4ZaIEs2NeiWO19NNacl8rHAyD4LR6jjw6PMRdTjZE0JOiU'. - 'dDv2ALTlzRvSdCCfAHGCc7yRPSrAQRQOWxKc3C/IUjBlDdUcM8'. - '97vFGwBY9QsZGBc/A4DWZNbeXIPWZEZI0c2lqSute/gCO9MXGY'. - '4/IOkAAAAASUVORK5CYII=' ; + //========================================================== + // File: bs_greenblue.png + //========================================================== + $this->imgdata_small[3][0]= 503 ; + $this->imgdata_small[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAxl'. + 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. + '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. + '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. + 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. + 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. + 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. + 'dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfT'. + 'AwkUGTIqLgJPAAAAqklEQVR4nI2QVxOCMBCEM6Mi2OiCvSslJB'. + 'CUoqjn//9TYgCfubf9Zu9uZxFqO+rscO7b6l/LljMZX29J2pNr'. + 'YjmX4ZaIEs2NeiWO19NNacl8rHAyD4LR6jjw6PMRdTjZE0JOiU'. + 'dDv2ALTlzRvSdCCfAHGCc7yRPSrAQRQOWxKc3C/IUjBlDdUcM8'. + '97vFGwBY9QsZGBc/A4DWZNbeXIPWZEZI0c2lqSute/gCO9MXGY'. + '4/IOkAAAAASUVORK5CYII=' ; -//========================================================== -// File: bs_yellow.png -//========================================================== - $this->imgdata_small[4][0]= 507 ; - $this->imgdata_small[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAzF'. - 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. - 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. - 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. - 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. - 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. - '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. - 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAH'. - 'dElNRQfTAwkUGSDZl3MHAAAAqElEQVR4nI3QWRNDMBAA4My09E'. - 'IF1SME0VT1okXvM/3//6kEfbZv+81eswA0DfHxRpOV+M+zkDGG'. - 'rL63zCoJ2ef2RLZDIqNqYexyvFrY9ePkxGWdpvfzC7tEGtIRly'. - 'nqzboFKMlizAXbNnZyiFUKAy4bZ+B6W0lRaQDLmg4h/k7eFwDL'. - 'OWIky8qhXUBQ7gKGmsxpC+ah1TdriwByqG8GQNDNr6kLjf/wAx'. - 'KgEq+FpPbfAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bs_yellow.png + //========================================================== + $this->imgdata_small[4][0]= 507 ; + $this->imgdata_small[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAzF'. + 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. + 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. + 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. + 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. + 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. + '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. + 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAH'. + 'dElNRQfTAwkUGSDZl3MHAAAAqElEQVR4nI3QWRNDMBAA4My09E'. + 'IF1SME0VT1okXvM/3//6kEfbZv+81eswA0DfHxRpOV+M+zkDGG'. + 'rL63zCoJ2ef2RLZDIqNqYexyvFrY9ePkxGWdpvfzC7tEGtIRly'. + 'nqzboFKMlizAXbNnZyiFUKAy4bZ+B6W0lRaQDLmg4h/k7eFwDL'. + 'OWIky8qhXUBQ7gKGmsxpC+ah1TdriwByqG8GQNDNr6kLjf/wAx'. + 'KgEq+FpPbfAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bs_darkgray.png -//========================================================== - $this->imgdata_small[5][0]= 611 ; - $this->imgdata_small[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAABJl'. - 'BMVEX////////o8v/f6O7W4OnR3PXL1OTL0evEyLvCzePAwMC/'. - 'v7a8wsq7t7C1xum1vtS1q6GzopmyxeKsrsOqvNWoq7anvN+nsb'. - 'qhrcGgqbGfpq6cp7+bqMuVmJKRm7yPlKKMnL6FkKWFipOEkLSE'. - 'j6qEhoqAiaB+jqd8haF7hZR4iJt4g5l3hZl2gIt2cod1hJVzeY'. - 'VzboJvhp9sfJJsb41peY1pd5xpdoVod4xndI5lcHxka4BjcYVg'. - 'Z3BfboFbb4lbZnZbYntaZ4laZYVZV3JYYWpXX3JWWm5VX4RVW2'. - 'NUYX9SXHxPWn5OVFxNWWtNVXVMVWFKV3xHUGZGU3dGTldFSlxE'. - 'Sk9ESXBCRlNBS3k/SGs/RU4+R1k9R2U6RFU2PUg0PEQxNU0ECL'. - 'QWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAA'. - 'CxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGQmbJetrAAAAtklEQV'. - 'R4nGNgwAK4JZTNNOWlYDxhMT4ZDTOzQE1uMF9CiJWVU0LbxDlS'. - 'G8QVF+FnZ2KRNHAIiPUHaZGSlmZj5lH19A1KjLUA8lXU5MWllF'. - 'yjo30TYr2BfG19G11b37CEeN84H38gX1HbwTUkOjo+zjfG3hLI'. - 'l1exCvCNCwnxjfMz0gTyRdXNHXx9fUNCQu2MwU6SN3ZwD42LCH'. - 'W30IK4T8vUJSAkNMhDiwPqYiktXWN9JZj7UQAAjWEfhlG+kScA'. - 'AAAASUVORK5CYII=' ; + //========================================================== + // File: bs_darkgray.png + //========================================================== + $this->imgdata_small[5][0]= 611 ; + $this->imgdata_small[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAABJl'. + 'BMVEX////////o8v/f6O7W4OnR3PXL1OTL0evEyLvCzePAwMC/'. + 'v7a8wsq7t7C1xum1vtS1q6GzopmyxeKsrsOqvNWoq7anvN+nsb'. + 'qhrcGgqbGfpq6cp7+bqMuVmJKRm7yPlKKMnL6FkKWFipOEkLSE'. + 'j6qEhoqAiaB+jqd8haF7hZR4iJt4g5l3hZl2gIt2cod1hJVzeY'. + 'VzboJvhp9sfJJsb41peY1pd5xpdoVod4xndI5lcHxka4BjcYVg'. + 'Z3BfboFbb4lbZnZbYntaZ4laZYVZV3JYYWpXX3JWWm5VX4RVW2'. + 'NUYX9SXHxPWn5OVFxNWWtNVXVMVWFKV3xHUGZGU3dGTldFSlxE'. + 'Sk9ESXBCRlNBS3k/SGs/RU4+R1k9R2U6RFU2PUg0PEQxNU0ECL'. + 'QWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAA'. + 'CxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGQmbJetrAAAAtklEQV'. + 'R4nGNgwAK4JZTNNOWlYDxhMT4ZDTOzQE1uMF9CiJWVU0LbxDlS'. + 'G8QVF+FnZ2KRNHAIiPUHaZGSlmZj5lH19A1KjLUA8lXU5MWllF'. + 'yjo30TYr2BfG19G11b37CEeN84H38gX1HbwTUkOjo+zjfG3hLI'. + 'l1exCvCNCwnxjfMz0gTyRdXNHXx9fUNCQu2MwU6SN3ZwD42LCH'. + 'W30IK4T8vUJSAkNMhDiwPqYiktXWN9JZj7UQAAjWEfhlG+kScA'. + 'AAAASUVORK5CYII=' ; -//========================================================== -// File: bs_darkgreen.png -//========================================================== - $this->imgdata_small[6][0]= 666 ; - $this->imgdata_small[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABX1'. - 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. - 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. - 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. - 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. - '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. - 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. - 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. - 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. - 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. - 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAwkUGRjxlcuZAAAAtElEQVR4nGNgIBZw8osqqIpzw/msfI'. - 'IiUmr6lo6SbFARASEOJiYtQ2uXADmIAJeEGFBE18LBMySBBywi'. - 'LC/LwcFiZuvmH5WiAxZR0tRW1DC3dfYJS8zyAouYGBibWtm7+o'. - 'TEpZfkgEX0rG3snNx9Q2NSCksgaqRd3Ty8gyLiU/NKSiDmcPsF'. - 'BodHJ2UUlZTkQ+xikIlNSE7LLgECZagL2VQyc0H8YnV2uD94jS'. - 'ILIo14iQ4HALarJBNwbJVNAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bs_darkgreen.png + //========================================================== + $this->imgdata_small[6][0]= 666 ; + $this->imgdata_small[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABX1'. + 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. + 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. + 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. + 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. + '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. + 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. + 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. + 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. + 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. + 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAwkUGRjxlcuZAAAAtElEQVR4nGNgIBZw8osqqIpzw/msfI'. + 'IiUmr6lo6SbFARASEOJiYtQ2uXADmIAJeEGFBE18LBMySBBywi'. + 'LC/LwcFiZuvmH5WiAxZR0tRW1DC3dfYJS8zyAouYGBibWtm7+o'. + 'TEpZfkgEX0rG3snNx9Q2NSCksgaqRd3Ty8gyLiU/NKSiDmcPsF'. + 'BodHJ2UUlZTkQ+xikIlNSE7LLgECZagL2VQyc0H8YnV2uD94jS'. + 'ILIo14iQ4HALarJBNwbJVNAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bs_purple.png -//========================================================== - $this->imgdata_small[7][0]= 447 ; - $this->imgdata_small[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAnF'. - 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. - 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. - 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. - 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. - 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. - 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGS'. - 'o5QpoZAAAAnElEQVR4nI3Q2xJDMBAG4MyQokWrZz3oSkJISJH3'. - 'f7dK0Gv/Xb7J7vyzCK0NjtPsHuH/2wlhTE7LnTNLCO/TFQjjIp'. - 'hHAA6bY06LSqppMAY47x+04HXTba2kAFlmQKr+YuVDCGUG2k6/'. - 'rNwYK8rKwKCnPxHnVS0aA3rag4UQslUGhrlk0Kpv1+sx3tLZ6w'. - 'dtYemMkOsnz8R3V9/hB87DEu2Wos5+AAAAAElFTkSuQmCC' ; + //========================================================== + // File: bs_purple.png + //========================================================== + $this->imgdata_small[7][0]= 447 ; + $this->imgdata_small[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAnF'. + 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. + 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. + 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. + 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. + 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGS'. + 'o5QpoZAAAAnElEQVR4nI3Q2xJDMBAG4MyQokWrZz3oSkJISJH3'. + 'f7dK0Gv/Xb7J7vyzCK0NjtPsHuH/2wlhTE7LnTNLCO/TFQjjIp'. + 'hHAA6bY06LSqppMAY47x+04HXTba2kAFlmQKr+YuVDCGUG2k6/'. + 'rNwYK8rKwKCnPxHnVS0aA3rag4UQslUGhrlk0Kpv1+sx3tLZ6w'. + 'dtYemMkOsnz8R3V9/hB87DEu2Wos5+AAAAAElFTkSuQmCC' ; -//========================================================== -// File: bs_brown.png -//========================================================== - $this->imgdata_small[8][0]= 677 ; - $this->imgdata_small[8][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABaF'. - 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. - 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. - 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. - 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. - '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. - 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. - 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. - 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. - 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. - 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. - 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLd'. - 'fvwAAAAHdElNRQfTAwkUGho0tvl2AAAAtklEQVR4nGNgIBaoSg'. - 'mLKGpowfkGMty8AqJKpi4mRlAROR5ONg4JFUv3YHOIgDo/HwsT'. - 'q6yps29EsjZYREFIkJ2ZS9/OMzA20wEsIi8uKSZtaOPmH5WSFw'. - 'YW0VRW07Vw8vCLSMguLwCL6FlaObp6B0TGZxSXQ9TouHv6+IXG'. - 'JGYWlpdDzNEKCgmPjkvLKS0vL4LYxWAen5SelV8OBNZQFxrZ5h'. - 'aC+GX2MDczMBh7pZakehkTHQ4AA0Am/jsB5gkAAAAASUVORK5C'. - 'YII=' ; + //========================================================== + // File: bs_brown.png + //========================================================== + $this->imgdata_small[8][0]= 677 ; + $this->imgdata_small[8][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABaF'. + 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. + 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. + 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. + 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. + '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. + 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. + 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. + 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. + 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. + 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. + 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLd'. + 'fvwAAAAHdElNRQfTAwkUGho0tvl2AAAAtklEQVR4nGNgIBaoSg'. + 'mLKGpowfkGMty8AqJKpi4mRlAROR5ONg4JFUv3YHOIgDo/HwsT'. + 'q6yps29EsjZYREFIkJ2ZS9/OMzA20wEsIi8uKSZtaOPmH5WSFw'. + 'YW0VRW07Vw8vCLSMguLwCL6FlaObp6B0TGZxSXQ9TouHv6+IXG'. + 'JGYWlpdDzNEKCgmPjkvLKS0vL4LYxWAen5SelV8OBNZQFxrZ5h'. + 'aC+GX2MDczMBh7pZakehkTHQ4AA0Am/jsB5gkAAAAASUVORK5C'. + 'YII=' ; -//========================================================== -// File: bs_blue.png -//========================================================== - $this->imgdata_small[9][0]= 436 ; - $this->imgdata_small[9][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. - 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. - 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. - 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. - 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. - 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGhNNakHSAAAAmk'. - 'lEQVR4nI3P2xKCIBAGYGfM6SBWo1nauIqogaDA+z9dK9Lhrv47'. - 'vtl/2A2CfxNlJRRp9IETYGraJeEb7ocLNKznia8A7Db7umWDUG'. - 'sxAzhurxRHxok4KQGqCuEhlL45oU1D2w5BztY4KRhj/bCAsetM'. - '2uObjwvY8/oX50JItYDxSyZSTrO2mNhvGMbaWAevnbFIcpuTr7'. - 't+5AkyfBIKSJHdSQAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bs_blue.png + //========================================================== + $this->imgdata_small[9][0]= 436 ; + $this->imgdata_small[9][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. + 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. + 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. + 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. + 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. + 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGhNNakHSAAAAmk'. + 'lEQVR4nI3P2xKCIBAGYGfM6SBWo1nauIqogaDA+z9dK9Lhrv47'. + 'vtl/2A2CfxNlJRRp9IETYGraJeEb7ocLNKznia8A7Db7umWDUG'. + 'sxAzhurxRHxok4KQGqCuEhlL45oU1D2w5BztY4KRhj/bCAsetM'. + '2uObjwvY8/oX50JItYDxSyZSTrO2mNhvGMbaWAevnbFIcpuTr7'. + 't+5AkyfBIKSJHdSQAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bs_green.png -//========================================================== - $this->imgdata_small[10][0]= 452 ; - $this->imgdata_small[10][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAn1'. - 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. - '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. - 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. - '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. - 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. - 'AIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAw'. - 'kUGgW5vvSDAAAAnklEQVR4nI3QSxKCMAwA0M4gqCgoiiJ+kEAL'. - 'LQUq0PufzX7ENdnlJZNkgtDS2CYZvK6bf+7EoKLA9cH5SQzv6A'. - 'YloTywsAbYr44FrlgrXCMJwHl3xxVtuuFkJAPIcw2tGB9GcFli'. - 'oqEf5GTkSUhVMw2TtD0XSlnDOw3SznE5520vNEi7CwW9+Ayjyq'. - 'U/3+yPuq5gvhkhL0xlGnqL//AFf14UIh4mkEkAAAAASUVORK5C'. - 'YII=' ; + //========================================================== + // File: bs_green.png + //========================================================== + $this->imgdata_small[10][0]= 452 ; + $this->imgdata_small[10][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAn1'. + 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. + '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. + 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. + '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. + 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. + 'AIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAw'. + 'kUGgW5vvSDAAAAnklEQVR4nI3QSxKCMAwA0M4gqCgoiiJ+kEAL'. + 'LQUq0PufzX7ENdnlJZNkgtDS2CYZvK6bf+7EoKLA9cH5SQzv6A'. + 'YloTywsAbYr44FrlgrXCMJwHl3xxVtuuFkJAPIcw2tGB9GcFli'. + 'oqEf5GTkSUhVMw2TtD0XSlnDOw3SznE5520vNEi7CwW9+Ayjyq'. + 'U/3+yPuq5gvhkhL0xlGnqL//AFf14UIh4mkEkAAAAASUVORK5C'. + 'YII=' ; -//========================================================== -// File: bs_white.png -//========================================================== - $this->imgdata_small[11][0]= 480 ; - $this->imgdata_small[11][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFTsY/ewvBQAAAW1JREFUeJytkz2u4jAUhT/jic'. - 'gfBUKiZhE0bIKeVbCWrIKenp6eDiGlCEEEBArIxvzGU4xeZjLk'. - 'jWb05lRXuvbx+exr4bouX1Xjyw7Atz81F4uFBYjjGIDhcCjq1o'. - 'k6nN1uZwFerxfP55Msy1itVmRZBsB4PK6YveHkeW5d18XzPIIg'. - 'wPd9Wq0WnU6HMAxJkoQoiuynOIfDwUopkVIihKAoCgAcx6Hdbm'. - 'OMIU1T5vN55eBKEikljUYDIX6kFUKU9e8aDAZlmjcca+1b7TgO'. - '1+uVy+VS9nzfr8e53++VzdZaiqIgz3OMMWitOZ/PaK0JgqDeRC'. - 'mF53lIKYGfr3O73TDGoJQiTVO01nS73XqT4/FIs9kkCAIej0eZ'. - 'brPZEMcxSZKgtQZgMpmIWpN+vy+m06n1PK9yTx8Gy+WS/X5Pr9'. - 'er9GuHLYoiG4YhSilOpxPr9Zrtdlti/JriU5MPjUYjq7UuEWaz'. - '2d+P/b/qv/zi75oetJcv7QQXAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bs_white.png + //========================================================== + $this->imgdata_small[11][0]= 480 ; + $this->imgdata_small[11][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFTsY/ewvBQAAAW1JREFUeJytkz2u4jAUhT/jic'. + 'gfBUKiZhE0bIKeVbCWrIKenp6eDiGlCEEEBArIxvzGU4xeZjLk'. + 'jWb05lRXuvbx+exr4bouX1Xjyw7Atz81F4uFBYjjGIDhcCjq1o'. + 'k6nN1uZwFerxfP55Msy1itVmRZBsB4PK6YveHkeW5d18XzPIIg'. + 'wPd9Wq0WnU6HMAxJkoQoiuynOIfDwUopkVIihKAoCgAcx6Hdbm'. + 'OMIU1T5vN55eBKEikljUYDIX6kFUKU9e8aDAZlmjcca+1b7TgO'. + '1+uVy+VS9nzfr8e53++VzdZaiqIgz3OMMWitOZ/PaK0JgqDeRC'. + 'mF53lIKYGfr3O73TDGoJQiTVO01nS73XqT4/FIs9kkCAIej0eZ'. + 'brPZEMcxSZKgtQZgMpmIWpN+vy+m06n1PK9yTx8Gy+WS/X5Pr9'. + 'er9GuHLYoiG4YhSilOpxPr9Zrtdlti/JriU5MPjUYjq7UuEWaz'. + '2d+P/b/qv/zi75oetJcv7QQXAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bs_cyan.png -//========================================================== - $this->imgdata_small[12][0]= 633 ; - $this->imgdata_small[12][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABPl'. - 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. - '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. - 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. - '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. - 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. - '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. - '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. - 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. - 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwkUGQDi+VPPAAAAtElEQVR4nGNgIBawikipyIiy'. - 'wfksfJpGRkamNtr8LFARPiMFHmFDcztXfwGoFi0jLiZuZRtnry'. - 'BddrCIiJEGL6eklYO7X3iCOFhE2thESdHawdUnJDZFDiyiamZh'. - 'aevk5h0UlZSpBhaRtbN3dPHwDY5MSM+EqBFzc/f0DgiLTkjLzI'. - 'SYw6bjHxgaEZeckZmpD7GLQSAqJj4xNRMIBGFuFtRLA/ENhGBu'. - 'ZmDgkJBXl5fgIDocAAKcINaFePT4AAAAAElFTkSuQmCC' ; + //========================================================== + // File: bs_cyan.png + //========================================================== + $this->imgdata_small[12][0]= 633 ; + $this->imgdata_small[12][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABPl'. + 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. + '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. + 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. + '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. + 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. + '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. + '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. + 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. + 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwkUGQDi+VPPAAAAtElEQVR4nGNgIBawikipyIiy'. + 'wfksfJpGRkamNtr8LFARPiMFHmFDcztXfwGoFi0jLiZuZRtnry'. + 'BddrCIiJEGL6eklYO7X3iCOFhE2thESdHawdUnJDZFDiyiamZh'. + 'aevk5h0UlZSpBhaRtbN3dPHwDY5MSM+EqBFzc/f0DgiLTkjLzI'. + 'SYw6bjHxgaEZeckZmpD7GLQSAqJj4xNRMIBGFuFtRLA/ENhGBu'. + 'ZmDgkJBXl5fgIDocAAKcINaFePT4AAAAAElFTkSuQmCC' ; -//========================================================== -// File: bs_bluegreen.png -//========================================================== - $this->imgdata_small[13][0]= 493 ; - $this->imgdata_small[13][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAvV'. - 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. - 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. - '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. - 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. - '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. - 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. - 'AJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGxNUcXCT'. - 'AAAAqUlEQVR4nI2Q1xKCMBREM2NHLCCogAGCjd6SqLT8/2cZKT'. - '6zb3tm987OBWCsXoejp8rC35fi4+l6gXFZlD0Rz6fZ1tdDmKR9'. - 'RdOmkzmP7DDpilfX3SzvRgQ/Vr1uiZplfsCBiVf03RJd140wgj'. - 'kmNqMtuYXcxyYmNWJdRoYwzpM9qRvGujuCmSR7q7ARY00/MiWk'. - 'sCnjkobNEm1+HknDZgAqR0GKU43+wxdu2hYzbsHU6AAAAABJRU'. - '5ErkJggg==' ; + //========================================================== + // File: bs_bluegreen.png + //========================================================== + $this->imgdata_small[13][0]= 493 ; + $this->imgdata_small[13][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAvV'. + 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. + 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. + '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. + 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. + '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. + 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. + 'AJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGxNUcXCT'. + 'AAAAqUlEQVR4nI2Q1xKCMBREM2NHLCCogAGCjd6SqLT8/2cZKT'. + '6zb3tm987OBWCsXoejp8rC35fi4+l6gXFZlD0Rz6fZ1tdDmKR9'. + 'RdOmkzmP7DDpilfX3SzvRgQ/Vr1uiZplfsCBiVf03RJd140wgj'. + 'kmNqMtuYXcxyYmNWJdRoYwzpM9qRvGujuCmSR7q7ARY00/MiWk'. + 'sCnjkobNEm1+HknDZgAqR0GKU43+wxdu2hYzbsHU6AAAAABJRU'. + '5ErkJggg==' ; -//========================================================== -// File: bs_lightred.png -//========================================================== - $this->imgdata_small[14][0]= 532 ; - $this->imgdata_small[14][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAA3l'. - 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. - 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. - 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. - 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. - 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. - 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. - 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGjoP2Nm+AAAAr0'. - 'lEQVR4nGNgIBaYiOk62imYwPnMkiIyso76yhJSzFARMxkRNk49'. - 'a3t5OW6oFk1LVkYOfWUHKxUXiEYzLS12DnN3VXkjIRtFsIiSk5'. - '6evqGqhYGKugAfWMRa1FpD2UHeQEXQRlgALCJur+rgbCUNFOAS'. - 'hqjRkZe3MpBTcwEKCEPMMTGSs3Xz8OQHCnBBHckt6OJpIyAMBD'. - 'wwN/MYc4H4LK4wNzMwmGrzcvFqmxIdDgDiHRT6VVQkrAAAAABJ'. - 'RU5ErkJggg==' ; + //========================================================== + // File: bs_lightred.png + //========================================================== + $this->imgdata_small[14][0]= 532 ; + $this->imgdata_small[14][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAA3l'. + 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. + 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. + 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. + 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. + 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. + 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. + 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGjoP2Nm+AAAAr0'. + 'lEQVR4nGNgIBaYiOk62imYwPnMkiIyso76yhJSzFARMxkRNk49'. + 'a3t5OW6oFk1LVkYOfWUHKxUXiEYzLS12DnN3VXkjIRtFsIiSk5'. + '6evqGqhYGKugAfWMRa1FpD2UHeQEXQRlgALCJur+rgbCUNFOAS'. + 'hqjRkZe3MpBTcwEKCEPMMTGSs3Xz8OQHCnBBHckt6OJpIyAMBD'. + 'wwN/MYc4H4LK4wNzMwmGrzcvFqmxIdDgDiHRT6VVQkrAAAAABJ'. + 'RU5ErkJggg==' ; -//========================================================== -// File: bxs_lightred.png -//========================================================== - $this->imgdata_xsmall[0][0]= 432 ; - $this->imgdata_xsmall[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAA3l'. - 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. - 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. - 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. - 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. - 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. - 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. - 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKBOgGhWjAAAAS0'. - 'lEQVR4nGNgQAEmunYmEJaMCKe1vBxYzJKVQ9lKBSSupKdnaKGi'. - 'zgdkiqs6WKnYcIGYJnK2HvzCwmCNgi42wsLCECNMeXlNUY0HAL'. - 'DaB7Du8MiEAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bxs_lightred.png + //========================================================== + $this->imgdata_xsmall[0][0]= 432 ; + $this->imgdata_xsmall[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAA3l'. + 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. + 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. + 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. + 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. + 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. + 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. + 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKBOgGhWjAAAAS0'. + 'lEQVR4nGNgQAEmunYmEJaMCKe1vBxYzJKVQ9lKBSSupKdnaKGi'. + 'zgdkiqs6WKnYcIGYJnK2HvzCwmCNgi42wsLCECNMeXlNUY0HAL'. + 'DaB7Du8MiEAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bxs_bluegreen.png -//========================================================== - $this->imgdata_xsmall[1][0]= 397 ; - $this->imgdata_xsmall[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAvV'. - 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. - 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. - '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. - 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. - '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. - 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. - 'AJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKDVyF5Be'. - 'AAAASUlEQVR4nGNgQAFmYqJcEJaEOJ+UrD5YTJKFTZrfGCQuaq'. - 'glLWvMaQ5kqujo6hnbKIKYXPr68gp2dmCNJiZAlh3ECGsREWtU'. - '4wF1kwdpAHfnSwAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bxs_bluegreen.png + //========================================================== + $this->imgdata_xsmall[1][0]= 397 ; + $this->imgdata_xsmall[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAvV'. + 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. + 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. + '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. + 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. + '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. + 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. + 'AJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKDVyF5Be'. + 'AAAASUlEQVR4nGNgQAFmYqJcEJaEOJ+UrD5YTJKFTZrfGCQuaq'. + 'glLWvMaQ5kqujo6hnbKIKYXPr68gp2dmCNJiZAlh3ECGsREWtU'. + '4wF1kwdpAHfnSwAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bxs_navy.png -//========================================================== - $this->imgdata_xsmall[2][0]= 353 ; - $this->imgdata_xsmall[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. - 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. - 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. - 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. - 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. - 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJxXO4axZAAAAR0'. - 'lEQVR4nGNgQAGskhKsEJaslIi8ijpYTJaDU1FVAyQuKSujoKKh'. - 'LQ5kSigpqWro6oOYrOoaWroGBmCNWiCWAdQwUVFWVOMBOp4GCJ'. - 's5S60AAAAASUVORK5CYII=' ; + //========================================================== + // File: bxs_navy.png + //========================================================== + $this->imgdata_xsmall[2][0]= 353 ; + $this->imgdata_xsmall[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. + 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. + 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. + 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. + 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. + 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJxXO4axZAAAAR0'. + 'lEQVR4nGNgQAGskhKsEJaslIi8ijpYTJaDU1FVAyQuKSujoKKh'. + 'LQ5kSigpqWro6oOYrOoaWroGBmCNWiCWAdQwUVFWVOMBOp4GCJ'. + 's5S60AAAAASUVORK5CYII=' ; -//========================================================== -// File: bxs_gray.png -//========================================================== - $this->imgdata_xsmall[3][0]= 492 ; - $this->imgdata_xsmall[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABI1'. - 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. - 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. - 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. - 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. - 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. - 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. - '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. - 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. - 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEA'. - 'AAsRAX9kX5EAAAAHdElNRQfTAwkUKC74clmyAAAAQklEQVR4nG'. - 'NgQAVBYVCGt5dXYEQ0mOnp5h4QFgVmeri6+4dHxYMVeHoFRUTH'. - 'gTUFBIZBWAwMkZEx8bFQM2Lj0UwHANc/DV6yq/BiAAAAAElFTk'. - 'SuQmCC' ; + //========================================================== + // File: bxs_gray.png + //========================================================== + $this->imgdata_xsmall[3][0]= 492 ; + $this->imgdata_xsmall[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABI1'. + 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. + 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. + 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. + 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. + 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. + 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. + '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. + 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. + 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEA'. + 'AAsRAX9kX5EAAAAHdElNRQfTAwkUKC74clmyAAAAQklEQVR4nG'. + 'NgQAVBYVCGt5dXYEQ0mOnp5h4QFgVmeri6+4dHxYMVeHoFRUTH'. + 'gTUFBIZBWAwMkZEx8bFQM2Lj0UwHANc/DV6yq/BiAAAAAElFTk'. + 'SuQmCC' ; -//========================================================== -// File: bxs_graypurple.png -//========================================================== - $this->imgdata_xsmall[4][0]= 542 ; - $this->imgdata_xsmall[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABSl'. - 'BMVEX////////11P/MqdvKrNfAwMC+u7+9u7+4rr24lsi3rby3'. - 'lMe1rLq1o720q7i0oL20ksSzoryyqbaykMGxlb2wkL+vnbiujb'. - '2sjLuri7qpl7GoirWoibenmK2mla6mjLKmhrSllauki7CjhrCj'. - 'hLGihLChg6+ggq2fkqadkKOcfqqai6Gag6WYe6WXeqSWeaOTd6'. - 'CTd5+Rdp6RdZ6RdZ2Qg5eOc5qMcpiLcZeJb5WIbpOHbZKGbJGE'. - 'a4+CaY2AZ4t/Z4p/Zop/Zol+Zol7ZIZ6Y4V5YoR1ZH11X391Xn'. - '9zXX1yXXtxXHtvWnluWXhsV3VqVnNpVXJoVHFnU3BmUm9jUGth'. - 'VGdgTmheTGZcS2RcSmRaSWJYR19XRl5SQllRQlhQQVdPQFZOP1'. - 'VLPlFJO09IPE5IOk5FOEtEN0lDOEpDOElDNklCNkc/M0XhbrfD'. - 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. - 'EAAAsRAX9kX5EAAAAHdElNRQfTAwkUKCgREfyHAAAATUlEQVR4'. - 'nGNgQAEcIko8EBY3M5Ougy+IxSXMwmTsFsAHZMqrSRvZB0W7A5'. - 'k6FlYugXEZICaPr394Um4uSAFDRFRCbm4uxAihsDAhVOMBHT0L'. - 'hkeRpo8AAAAASUVORK5CYII=' ; + //========================================================== + // File: bxs_graypurple.png + //========================================================== + $this->imgdata_xsmall[4][0]= 542 ; + $this->imgdata_xsmall[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABSl'. + 'BMVEX////////11P/MqdvKrNfAwMC+u7+9u7+4rr24lsi3rby3'. + 'lMe1rLq1o720q7i0oL20ksSzoryyqbaykMGxlb2wkL+vnbiujb'. + '2sjLuri7qpl7GoirWoibenmK2mla6mjLKmhrSllauki7CjhrCj'. + 'hLGihLChg6+ggq2fkqadkKOcfqqai6Gag6WYe6WXeqSWeaOTd6'. + 'CTd5+Rdp6RdZ6RdZ2Qg5eOc5qMcpiLcZeJb5WIbpOHbZKGbJGE'. + 'a4+CaY2AZ4t/Z4p/Zop/Zol+Zol7ZIZ6Y4V5YoR1ZH11X391Xn'. + '9zXX1yXXtxXHtvWnluWXhsV3VqVnNpVXJoVHFnU3BmUm9jUGth'. + 'VGdgTmheTGZcS2RcSmRaSWJYR19XRl5SQllRQlhQQVdPQFZOP1'. + 'VLPlFJO09IPE5IOk5FOEtEN0lDOEpDOElDNklCNkc/M0XhbrfD'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. + 'EAAAsRAX9kX5EAAAAHdElNRQfTAwkUKCgREfyHAAAATUlEQVR4'. + 'nGNgQAEcIko8EBY3M5Ougy+IxSXMwmTsFsAHZMqrSRvZB0W7A5'. + 'k6FlYugXEZICaPr394Um4uSAFDRFRCbm4uxAihsDAhVOMBHT0L'. + 'hkeRpo8AAAAASUVORK5CYII=' ; -//========================================================== -// File: bxs_red.png -//========================================================== - $this->imgdata_xsmall[5][0]= 357 ; - $this->imgdata_xsmall[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. - 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. - 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. - 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. - 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. - 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIyjy5SVMAAAAS0'. - 'lEQVR4nGNgQAFsUpJsEJastIi8ijpYTJaDU0FVgxXIlJKVUVDR'. - '0BYHMiUUlVQ1dPVBTDZ1dS1dAwOQAgYtbSDLAGIEq6goK6rxAD'. - 'yXBg73lwGUAAAAAElFTkSuQmCC' ; + //========================================================== + // File: bxs_red.png + //========================================================== + $this->imgdata_xsmall[5][0]= 357 ; + $this->imgdata_xsmall[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. + 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. + 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. + 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. + 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. + 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIyjy5SVMAAAAS0'. + 'lEQVR4nGNgQAFsUpJsEJastIi8ijpYTJaDU0FVgxXIlJKVUVDR'. + '0BYHMiUUlVQ1dPVBTDZ1dS1dAwOQAgYtbSDLAGIEq6goK6rxAD'. + 'yXBg73lwGUAAAAAElFTkSuQmCC' ; -//========================================================== -// File: bxs_yellow.png -//========================================================== - $this->imgdata_xsmall[6][0]= 414 ; - $this->imgdata_xsmall[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAzF'. - 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. - 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. - 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. - 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. - 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. - '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. - 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAH'. - 'dElNRQfTAwkUIzoBXFQEAAAAS0lEQVR4nGNgQAFsDhJsEJaTo5'. - '2skj5YzMnSSk7ZwBzIlOSUklPiMxYHMnW4FXT5VNVBTDZeXiNV'. - 'QUGQAgYBYyBLEGIEq5gYK6rxAH4kBmHBaMQQAAAAAElFTkSuQm'. - 'CC' ; + //========================================================== + // File: bxs_yellow.png + //========================================================== + $this->imgdata_xsmall[6][0]= 414 ; + $this->imgdata_xsmall[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAzF'. + 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. + 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. + 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. + 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. + 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. + '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. + 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAH'. + 'dElNRQfTAwkUIzoBXFQEAAAAS0lEQVR4nGNgQAFsDhJsEJaTo5'. + '2skj5YzMnSSk7ZwBzIlOSUklPiMxYHMnW4FXT5VNVBTDZeXiNV'. + 'QUGQAgYBYyBLEGIEq5gYK6rxAH4kBmHBaMQQAAAAAElFTkSuQm'. + 'CC' ; -//========================================================== -// File: bxs_greenblue.png -//========================================================== - $this->imgdata_xsmall[7][0]= 410 ; - $this->imgdata_xsmall[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAxl'. - 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. - '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. - '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. - 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. - 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. - 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. - 'dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfT'. - 'AwkUJy5/6kV9AAAATUlEQVR4nGNgQAGCyuyCEJaGugKHviVYzF'. - 'hO3sxCWwDIVNLTM9PXtpEGMhW12Cy0DR1ATEFLSxZ7BweQAgYd'. - 'HUMHBweIEQKiogKoxgMAo/4H5AfSehsAAAAASUVORK5CYII=' ; + //========================================================== + // File: bxs_greenblue.png + //========================================================== + $this->imgdata_xsmall[7][0]= 410 ; + $this->imgdata_xsmall[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAxl'. + 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. + '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. + '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. + 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. + 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. + 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. + 'dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfT'. + 'AwkUJy5/6kV9AAAATUlEQVR4nGNgQAGCyuyCEJaGugKHviVYzF'. + 'hO3sxCWwDIVNLTM9PXtpEGMhW12Cy0DR1ATEFLSxZ7BweQAgYd'. + 'HUMHBweIEQKiogKoxgMAo/4H5AfSehsAAAAASUVORK5CYII=' ; -//========================================================== -// File: bxs_purple.png -//========================================================== - $this->imgdata_xsmall[8][0]= 364 ; - $this->imgdata_xsmall[8][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAnF'. - 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. - 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. - 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. - 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. - 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. - 'HUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIj'. - 'mBTjT/AAAASUlEQVR4nGNgQAGskhKsEJaCrJiSuhZYTEFASFlD'. - 'GyQuqSCnrK6tJwpkiquoamgbGIGYrFpaugbGxmCNunpAljHECB'. - 'ZBQRZU4wFSMAZsXeM71AAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bxs_purple.png + //========================================================== + $this->imgdata_xsmall[8][0]= 364 ; + $this->imgdata_xsmall[8][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAnF'. + 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. + 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. + 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. + 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. + 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIj'. + 'mBTjT/AAAASUlEQVR4nGNgQAGskhKsEJaCrJiSuhZYTEFASFlD'. + 'GyQuqSCnrK6tJwpkiquoamgbGIGYrFpaugbGxmCNunpAljHECB'. + 'ZBQRZU4wFSMAZsXeM71AAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bxs_green.png -//========================================================== - $this->imgdata_xsmall[9][0]= 370 ; - $this->imgdata_xsmall[9][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAn1'. - 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. - '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. - 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. - '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. - 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. - 'AIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAw'. - 'kUKBrZxq0HAAAATElEQVR4nGNgQAGccrIcEJaivISyhjaIxa7I'. - 'I6CiqcMKZMopKqho6OhLA5kyqmqaOobGICartraeoYkJSAGDnj'. - '6QZQIxgk1Skg3VeABlVgbItqEBUwAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bxs_green.png + //========================================================== + $this->imgdata_xsmall[9][0]= 370 ; + $this->imgdata_xsmall[9][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAn1'. + 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. + '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. + 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. + '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. + 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. + 'AIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAw'. + 'kUKBrZxq0HAAAATElEQVR4nGNgQAGccrIcEJaivISyhjaIxa7I'. + 'I6CiqcMKZMopKqho6OhLA5kyqmqaOobGICartraeoYkJSAGDnj'. + '6QZQIxgk1Skg3VeABlVgbItqEBUwAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bxs_darkgreen.png -//========================================================== - $this->imgdata_xsmall[10][0]= 563 ; - $this->imgdata_xsmall[10][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABX1'. - 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. - 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. - 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. - 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. - '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. - 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. - 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. - 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. - 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. - 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. - 'RQfTAwkUKCFozUQjAAAATUlEQVR4nGNgQAGcoqrcEJYQB5OhSw'. - 'CIxSXGwWThGcIDZCppK5o7hyV6AZl6NnbuoSmFICZ3YHB0RkkJ'. - 'SAFDbEJaSUkJxAjeyEheVOMBQj4MOEkWew4AAAAASUVORK5CYI'. - 'I=' ; + //========================================================== + // File: bxs_darkgreen.png + //========================================================== + $this->imgdata_xsmall[10][0]= 563 ; + $this->imgdata_xsmall[10][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABX1'. + 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. + 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. + 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. + 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. + '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. + 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. + 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. + 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. + 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. + 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. + 'RQfTAwkUKCFozUQjAAAATUlEQVR4nGNgQAGcoqrcEJYQB5OhSw'. + 'CIxSXGwWThGcIDZCppK5o7hyV6AZl6NnbuoSmFICZ3YHB0RkkJ'. + 'SAFDbEJaSUkJxAjeyEheVOMBQj4MOEkWew4AAAAASUVORK5CYI'. + 'I=' ; -//========================================================== -// File: bxs_cyan.png -//========================================================== - $this->imgdata_xsmall[11][0]= 530 ; - $this->imgdata_xsmall[11][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABPl'. - 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. - '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. - 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. - '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. - 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. - '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. - '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. - 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. - 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAA'. - 'AHdElNRQfTAwkUKQFKuFWqAAAATUlEQVR4nGNgQAGsUjJsEJaR'. - 'grC5qz9YzIiL28YriB3IlDZRsnYNiZUDMmXtHT2CE9JBTDb/wI'. - 'jkzEyQAoaomMTMzEyIERzy8hyoxgMAN2MLVPW0f4gAAAAASUVO'. - 'RK5CYII=' ; + //========================================================== + // File: bxs_cyan.png + //========================================================== + $this->imgdata_xsmall[11][0]= 530 ; + $this->imgdata_xsmall[11][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABPl'. + 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. + '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. + 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. + '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. + 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. + '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. + '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. + 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. + 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAA'. + 'AHdElNRQfTAwkUKQFKuFWqAAAATUlEQVR4nGNgQAGsUjJsEJaR'. + 'grC5qz9YzIiL28YriB3IlDZRsnYNiZUDMmXtHT2CE9JBTDb/wI'. + 'jkzEyQAoaomMTMzEyIERzy8hyoxgMAN2MLVPW0f4gAAAAASUVO'. + 'RK5CYII=' ; -//========================================================== -// File: bxs_orange.png -//========================================================== - $this->imgdata_xsmall[12][0]= 572 ; - $this->imgdata_xsmall[12][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABaF'. - 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. - 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. - 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. - 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. - '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. - 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. - 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. - 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. - 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. - 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. - 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9k'. - 'X5EAAAAHdElNRQfTAwkUJBSSy88MAAAATUlEQVR4nGNgQAGqwo'. - 'paEBYPJ4eKezCIpc7HwmrqG6ENZMpLihm6RaWEAZl6Vo7ekRnF'. - 'IKZWSHhcTnk5SAFDfFJWeXk5xAjj1FRjVOMBeFwNcWYSLjsAAA'. - 'AASUVORK5CYII=' ; + //========================================================== + // File: bxs_orange.png + //========================================================== + $this->imgdata_xsmall[12][0]= 572 ; + $this->imgdata_xsmall[12][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABaF'. + 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. + 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. + 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. + 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. + '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. + 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. + 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. + 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. + 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. + 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. + 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9k'. + 'X5EAAAAHdElNRQfTAwkUJBSSy88MAAAATUlEQVR4nGNgQAGqwo'. + 'paEBYPJ4eKezCIpc7HwmrqG6ENZMpLihm6RaWEAZl6Vo7ekRnF'. + 'IKZWSHhcTnk5SAFDfFJWeXk5xAjj1FRjVOMBeFwNcWYSLjsAAA'. + 'AASUVORK5CYII=' ; -//========================================================== -// File: bxs_lightblue.png -//========================================================== - $this->imgdata_xsmall[13][0]= 554 ; - $this->imgdata_xsmall[13][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABVl'. - 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. - 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. - '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. - 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. - 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. - 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. - 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. - 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. - 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. - 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. - 'gAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJziL'. - 'PvAsAAAATUlEQVR4nGNgQAHsQgqcEJYgG5Oegy+IxSHOxmTiFs'. - 'gFZMprKBnbB8e7AplaFlbOQUl5ICanX0BEWmEhSAFDVGxKYWEh'. - 'xAjusDBuVOMBJO8LrFHRAykAAAAASUVORK5CYII=' ; + //========================================================== + // File: bxs_lightblue.png + //========================================================== + $this->imgdata_xsmall[13][0]= 554 ; + $this->imgdata_xsmall[13][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABVl'. + 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. + 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. + '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. + 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. + 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. + 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. + 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. + 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. + 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. + 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJziL'. + 'PvAsAAAATUlEQVR4nGNgQAHsQgqcEJYgG5Oegy+IxSHOxmTiFs'. + 'gFZMprKBnbB8e7AplaFlbOQUl5ICanX0BEWmEhSAFDVGxKYWEh'. + 'xAjusDBuVOMBJO8LrFHRAykAAAAASUVORK5CYII=' ; -//========================================================== -// File: bxs_darkgray.png -//========================================================== - $this->imgdata_xsmall[14][0]= 574 ; - $this->imgdata_xsmall[14][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABm'. - 'JLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAB'. - 'iElEQVR42k3QPU8TYRwA8P//ebkXrgdIColXRAOEkJqbaExMut'. - 'DBhE1GNjYHPg+DG6ODiU6QOLjVxITBcFKBYCstlAC2Bz17fe76'. - 'vLD6+wg/1FpTRFR5lpaub/u1eGBGaAT4HneD4OlXx7avtDYUjT'. - 'HQabd2Ti8e3vVSKzxrtHS32wIpFVldno22Nqvvg2Bhl0gp/aNm'. - 'vJ3qqXAtLIva+ks1H0wqlSXi4+d6+OFTfRsAfHJx2d1od24rZP'. - 'xP2HzopINr1mkesX7ccojqif0v9crxWXODZTno3+dNGA7uWLsd'. - 'mUYU4fHJCViMG9umLBmM4L6fagZGg9QKfjZ+Qfy3C3G/B3mugF'. - 'IHHNcDf64E3KJALApk2p8CSolUUqLjFkyxOGMsTtFyJ+Wz57NQ'. - '8DghS4sLB0svioeZZo7nPhFoUKZDIVFbglkTTnl5/rC8snjAkJ'. - 'Bk/XV5LxHC/v7tR8jzTFPbg8LENK9WX0Vv31T2AEmCSmlKCCoh'. - 'ROnP1U1tPFYjJBRcbtzSf+GPsFTAQBq1n4AAAABKdEVYdHNpZ2'. - '5hdHVyZQBiYzYyMDIyNjgwYThjODMyMmUxNjk0NWUzZjljOGFh'. - 'N2VmZWFhMjA4OTE2ZjkwOTdhZWE1MzYyMjk0MWRkM2I5EqaPDA'. - 'AAAABJRU5ErkJggg==' ; + //========================================================== + // File: bxs_darkgray.png + //========================================================== + $this->imgdata_xsmall[14][0]= 574 ; + $this->imgdata_xsmall[14][1]= + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABm'. + 'JLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAB'. + 'iElEQVR42k3QPU8TYRwA8P//ebkXrgdIColXRAOEkJqbaExMut'. + 'DBhE1GNjYHPg+DG6ODiU6QOLjVxITBcFKBYCstlAC2Bz17fe76'. + 'vLD6+wg/1FpTRFR5lpaub/u1eGBGaAT4HneD4OlXx7avtDYUjT'. + 'HQabd2Ti8e3vVSKzxrtHS32wIpFVldno22Nqvvg2Bhl0gp/aNm'. + 'vJ3qqXAtLIva+ks1H0wqlSXi4+d6+OFTfRsAfHJx2d1od24rZP'. + 'xP2HzopINr1mkesX7ccojqif0v9crxWXODZTno3+dNGA7uWLsd'. + 'mUYU4fHJCViMG9umLBmM4L6fagZGg9QKfjZ+Qfy3C3G/B3mugF'. + 'IHHNcDf64E3KJALApk2p8CSolUUqLjFkyxOGMsTtFyJ+Wz57NQ'. + '8DghS4sLB0svioeZZo7nPhFoUKZDIVFbglkTTnl5/rC8snjAkJ'. + 'Bk/XV5LxHC/v7tR8jzTFPbg8LENK9WX0Vv31T2AEmCSmlKCCoh'. + 'ROnP1U1tPFYjJBRcbtzSf+GPsFTAQBq1n4AAAABKdEVYdHNpZ2'. + '5hdHVyZQBiYzYyMDIyNjgwYThjODMyMmUxNjk0NWUzZjljOGFh'. + 'N2VmZWFhMjA4OTE2ZjkwOTdhZWE1MzYyMjk0MWRkM2I5EqaPDA'. + 'AAAABJRU5ErkJggg==' ; } } diff --git a/libs/jpgraph/imgdata_bevels.inc.php b/libs/jpgraph/imgdata_bevels.inc.php index 47645e2..2cd545f 100644 --- a/libs/jpgraph/imgdata_bevels.inc.php +++ b/libs/jpgraph/imgdata_bevels.inc.php @@ -1,9 +1,9 @@ 'imgdata'); - + protected $colors = array('green','purple','orange','red','yellow'); protected $index = array('green'=>1,'purple'=>4,'orange'=>2,'red'=>0,'yellow'=>3); protected $maxidx = 4 ; protected $imgdata ; - function ImgData_Bevels() { -//========================================================== -// File: bullets_balls_red_013.png -//========================================================== - $this->imgdata[0][0]= 337 ; - $this->imgdata[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////////27t/f3+LFwcmNxMuxm62DmqKth1VpZmIWg6fv'. - 'HCa7K0BwMEytCjFnIyUlEBg9vhQvAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAxcBNhk+pYJVAAAAl0lEQVR4nE2Q2xLDIAgFHUWBKJf//9'. - 'oekmbafVDZARRbK/pYTKP9WNcNv64zzUdd9BjmrgnsVXRNSzO3'. - 'CJ5ahdhy0XKQkxld1kxb45j7dp0x2lBNOyVgQpMaoadX7Hs7zr'. - 'P1yKj47DKBnKaBKiSAkNss7O6PkMx6kIgYXISQJpcZCqdY6KR+'. - 'J1PkS5Xob/h7MNz8x6D3fz5DKQjpkZOBYAAAAABJRU5ErkJggg'. - '==' ; + function __construct() { + //========================================================== + // File: bullets_balls_red_013.png + //========================================================== + $this->imgdata[0][0]= 337 ; + $this->imgdata[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/f3+LFwcmNxMuxm62DmqKth1VpZmIWg6fv'. + 'HCa7K0BwMEytCjFnIyUlEBg9vhQvAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNhk+pYJVAAAAl0lEQVR4nE2Q2xLDIAgFHUWBKJf//9'. + 'oekmbafVDZARRbK/pYTKP9WNcNv64zzUdd9BjmrgnsVXRNSzO3'. + 'CJ5ahdhy0XKQkxld1kxb45j7dp0x2lBNOyVgQpMaoadX7Hs7zr'. + 'P1yKj47DKBnKaBKiSAkNss7O6PkMx6kIgYXISQJpcZCqdY6KR+'. + 'J1PkS5Xob/h7MNz8x6D3fz5DKQjpkZOBYAAAAABJRU5ErkJggg'. + '==' ; -//========================================================== -// File: bullets_balls_green_013.png -//========================================================== - $this->imgdata[1][0]= 344 ; - $this->imgdata[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////////27t/e3+K3vriUub/Dm18j4xc3ob10k0ItqQlU'. - 'e5JBmwpxY1ENaKBgUh0iHgwsSre9AAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAxcBNTfJXtxZAAAAnklEQVR4nE2QWY4EMQhDUVhSIRC4/2'. - 'kbaqLp9p+f2AxAayAzDfiK9znPORuvH0x8Ss9z6I9sHp6tcxE9'. - 'nLmWmebmt5F5p2AR0+C9AWpLBjXRaZsCAT3SqklVp0YkAWaGtd'. - 'c5Z41/STYpPzW7BjyiRrwkVmQto/Cw9tNEMvsgcekyCyFPboIu'. - 'IsuXiKffYB4NK4r/h6d4g9HPPwCR7i8+GscIiiaonUAAAAAASU'. - 'VORK5CYII=' ; + //========================================================== + // File: bullets_balls_green_013.png + //========================================================== + $this->imgdata[1][0]= 344 ; + $this->imgdata[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/e3+K3vriUub/Dm18j4xc3ob10k0ItqQlU'. + 'e5JBmwpxY1ENaKBgUh0iHgwsSre9AAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNTfJXtxZAAAAnklEQVR4nE2QWY4EMQhDUVhSIRC4/2'. + 'kbaqLp9p+f2AxAayAzDfiK9znPORuvH0x8Ss9z6I9sHp6tcxE9'. + 'nLmWmebmt5F5p2AR0+C9AWpLBjXRaZsCAT3SqklVp0YkAWaGtd'. + 'c5Z41/STYpPzW7BjyiRrwkVmQto/Cw9tNEMvsgcekyCyFPboIu'. + 'IsuXiKffYB4NK4r/h6d4g9HPPwCR7i8+GscIiiaonUAAAAAASU'. + 'VORK5CYII=' ; -//========================================================== -// File: bullets_balls_oy_035.png -//========================================================== - $this->imgdata[2][0]= 341 ; - $this->imgdata[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////////27t/f3+K5tbqNwcjnkjXjbxR2i5anfEoNkbis'. - 'PBxpU0sZbZejKgdqIRIlERIwYtkYAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAxcBNgK0wEu5AAAAm0lEQVR4nE3QVxIEIQgEUErAgTHA/U'. - '+7zbipf9RXgoGo0liMmX6RdSPLPtZM9F4LuuSIaZtZWffiU6Iz'. - 'Y8SOMF0NogBj30ioGRGLZgiPvce1TbIRz6oBQEbOFGK0rIoxrn'. - '5hDomMA1cfGRCaRVhjS3gkzheM+4HtnlkXcvdZhWG4qZawewe6'. - '9Jnz/TKLB/ML6HUepn//QczazuwFO/0Ivpolhi4AAAAASUVORK'. - '5CYII=' ; + //========================================================== + // File: bullets_balls_oy_035.png + //========================================================== + $this->imgdata[2][0]= 341 ; + $this->imgdata[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/f3+K5tbqNwcjnkjXjbxR2i5anfEoNkbis'. + 'PBxpU0sZbZejKgdqIRIlERIwYtkYAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNgK0wEu5AAAAm0lEQVR4nE3QVxIEIQgEUErAgTHA/U'. + '+7zbipf9RXgoGo0liMmX6RdSPLPtZM9F4LuuSIaZtZWffiU6Iz'. + 'Y8SOMF0NogBj30ioGRGLZgiPvce1TbIRz6oBQEbOFGK0rIoxrn'. + '5hDomMA1cfGRCaRVhjS3gkzheM+4HtnlkXcvdZhWG4qZawewe6'. + '9Jnz/TKLB/ML6HUepn//QczazuwFO/0Ivpolhi4AAAAASUVORK'. + '5CYII=' ; -//========================================================== -// File: bullets_balls_oy_036.png -//========================================================== - $this->imgdata[3][0]= 340 ; - $this->imgdata[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////////27t/e3+LO3hfYzz65ubiNwci6uQ12ipadgVGa'. - 'fwsNkbhnVkcaZ5dwSA8lFg7CEepmAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. - 'RQfTAxcCBySi1nevAAAAjElEQVR4nFXPWw7EIAgFUNMoCMhj/6'. - 'staKczc/2RkwjS2glQ+w3YytgXCXCZpRo8gJdGxZadJws13CUP'. - '4SZI4MYiUxypeiGGw1XShVBTNN9kLXP2GRrZPFvKgd7z/sqGGV'. - '7C7r7r3l09alYN3iA8Yn+ImdVrNoEeSRqJPAaHfhZzLYwXstdZ'. - 'rP3n2bvdAI4INwtihiwAAAAASUVORK5CYII=' ; + //========================================================== + // File: bullets_balls_oy_036.png + //========================================================== + $this->imgdata[3][0]= 340 ; + $this->imgdata[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/e3+LO3hfYzz65ubiNwci6uQ12ipadgVGa'. + 'fwsNkbhnVkcaZ5dwSA8lFg7CEepmAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. + 'RQfTAxcCBySi1nevAAAAjElEQVR4nFXPWw7EIAgFUNMoCMhj/6'. + 'staKczc/2RkwjS2glQ+w3YytgXCXCZpRo8gJdGxZadJws13CUP'. + '4SZI4MYiUxypeiGGw1XShVBTNN9kLXP2GRrZPFvKgd7z/sqGGV'. + '7C7r7r3l09alYN3iA8Yn+ImdVrNoEeSRqJPAaHfhZzLYwXstdZ'. + 'rP3n2bvdAI4INwtihiwAAAAASUVORK5CYII=' ; -//========================================================== -// File: bullets_balls_pp_019.png -//========================================================== - $this->imgdata[4][0]= 334 ; - $this->imgdata[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////+/v7i4eO/w8eHxcvKroNVormtfkjrMN2BeXQrepPc'. - 'Esy4IL+OFaR7F25LHF8mFRh5XXtUAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAxcBNgkjEpIxAAAAlElEQVR4nE2QAQ7FIAhDDTAVndL7n3'. - 'ZV/7JfEwMvFIWUlkTMVNInbVv5ZeJqG7Smh2QTBwJBpsdizAZP'. - '5NyW0awhK8kYodnZxS6ECvPRp2sI+y7PBv1mN02KH7h77QCJ8D'. - '4VvY5NUgEmCwj6ZMzHtJRgRSXwC1gfcqJJH0GBnSnK1kUQ72DY'. - 'CPBv+MCS/e0jib77eQAJxwiEWm7hFwAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bullets_balls_pp_019.png + //========================================================== + $this->imgdata[4][0]= 334 ; + $this->imgdata[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////+/v7i4eO/w8eHxcvKroNVormtfkjrMN2BeXQrepPc'. + 'Esy4IL+OFaR7F25LHF8mFRh5XXtUAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNgkjEpIxAAAAlElEQVR4nE2QAQ7FIAhDDTAVndL7n3'. + 'ZV/7JfEwMvFIWUlkTMVNInbVv5ZeJqG7Smh2QTBwJBpsdizAZP'. + '5NyW0awhK8kYodnZxS6ECvPRp2sI+y7PBv1mN02KH7h77QCJ8D'. + '4VvY5NUgEmCwj6ZMzHtJRgRSXwC1gfcqJJH0GBnSnK1kUQ72DY'. + 'CPBv+MCS/e0jib77eQAJxwiEWm7hFwAAAABJRU5ErkJggg==' ; } } diff --git a/libs/jpgraph/imgdata_diamonds.inc.php b/libs/jpgraph/imgdata_diamonds.inc.php index ef1322b..533cd47 100644 --- a/libs/jpgraph/imgdata_diamonds.inc.php +++ b/libs/jpgraph/imgdata_diamonds.inc.php @@ -1,9 +1,9 @@ 'imgdata'); - protected $colors = array('lightblue','darkblue','gray', - 'blue','pink','purple','red','yellow'); - protected $index = array('lightblue' =>7,'darkblue'=>2,'gray'=>6, - 'blue'=>4,'pink'=>1,'purple'=>5,'red'=>0,'yellow'=>3); + protected $colors = array('lightblue','darkblue','gray', + 'blue','pink','purple','red','yellow'); + protected $index = array('lightblue' =>7,'darkblue'=>2,'gray'=>6, + 'blue'=>4,'pink'=>1,'purple'=>5,'red'=>0,'yellow'=>3); protected $maxidx = 7 ; protected $imgdata ; - function ImgData_Diamonds() { -//========================================================== -// File: diam_red.png -//========================================================== - $this->imgdata[0][0]= 668 ; - $this->imgdata[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. - 'BMVEX///////+cAAD/AADOAABjAABrAADWGBjOCAj/CAj/GBj/'. - 'EBCcCAiMOTl7KSl7ISFzGBilGBjOEBBrCAjv5+eMQkK1QkKtMT'. - 'GtKSnWKSn/KSlzEBCcEBDexsb/tbXOe3ucWlqcUlKUSkr/e3vn'. - 'a2u9UlL/a2uEMTHeUlLeSkqtOTn/UlL/SkrWOTn/QkL/OTmlIS'. - 'H/MTH/ISH39/f/9/f35+fezs7/5+fvzs7WtbXOra3nvb3/zs7G'. - 'nJzvtbXGlJTepaW9jIy1hITWlJS1e3uta2ulY2P/lJTnhITne3'. - 'vGY2O9Wlr/c3PeY2O1Skr/Y2P/WlreQkLWISGlEBCglEUaAAAA'. - 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. - 'sSAdLdfvwAAAAHdElNRQfTAwsWEw5WI4qnAAABGUlEQVR4nHXQ'. - '1XLDMBAFUKUCM1NiO8zcpIxpp8z0//9SWY7b2LHv6EU6s1qtAN'. - 'iMBAojLPkigpJvogKC4pxDuQipjanlICXof1RQDkYEF21mKIfg'. - '/GGKtjAmOKt9oSyuCU7OhyiDCQnjowGfRnooCJIkiWJvv8NxnG'. - 'nyNAwFcekvZpPP3mu7Vrp8fOq8DYbTyjdnAvBj7Jbd7nP95urs'. - '+MC2D6unF+Cu0VJULQBAlsOQuueN3Hrp2nGUvqppemBZ0aU7Se'. - 'SXvYZFMKaLJn7MH3btJmZEMEmGSOreqy0SI/4ffo3uiUOYEACy'. - 'OFopmNWlP5uZd9uPWmUoxvK9ilO9NtBo6mS7KkZD0fOJYqgGBU'. - 'S/T7OKCAA9tfsFOicXcbxt29cAAAAASUVORK5CYII=' ; + function __construct() { + //========================================================== + // File: diam_red.png + //========================================================== + $this->imgdata[0][0]= 668 ; + $this->imgdata[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. + 'BMVEX///////+cAAD/AADOAABjAABrAADWGBjOCAj/CAj/GBj/'. + 'EBCcCAiMOTl7KSl7ISFzGBilGBjOEBBrCAjv5+eMQkK1QkKtMT'. + 'GtKSnWKSn/KSlzEBCcEBDexsb/tbXOe3ucWlqcUlKUSkr/e3vn'. + 'a2u9UlL/a2uEMTHeUlLeSkqtOTn/UlL/SkrWOTn/QkL/OTmlIS'. + 'H/MTH/ISH39/f/9/f35+fezs7/5+fvzs7WtbXOra3nvb3/zs7G'. + 'nJzvtbXGlJTepaW9jIy1hITWlJS1e3uta2ulY2P/lJTnhITne3'. + 'vGY2O9Wlr/c3PeY2O1Skr/Y2P/WlreQkLWISGlEBCglEUaAAAA'. + 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. + 'sSAdLdfvwAAAAHdElNRQfTAwsWEw5WI4qnAAABGUlEQVR4nHXQ'. + '1XLDMBAFUKUCM1NiO8zcpIxpp8z0//9SWY7b2LHv6EU6s1qtAN'. + 'iMBAojLPkigpJvogKC4pxDuQipjanlICXof1RQDkYEF21mKIfg'. + '/GGKtjAmOKt9oSyuCU7OhyiDCQnjowGfRnooCJIkiWJvv8NxnG'. + 'nyNAwFcekvZpPP3mu7Vrp8fOq8DYbTyjdnAvBj7Jbd7nP95urs'. + '+MC2D6unF+Cu0VJULQBAlsOQuueN3Hrp2nGUvqppemBZ0aU7Se'. + 'SXvYZFMKaLJn7MH3btJmZEMEmGSOreqy0SI/4ffo3uiUOYEACy'. + 'OFopmNWlP5uZd9uPWmUoxvK9ilO9NtBo6mS7KkZD0fOJYqgGBU'. + 'S/T7OKCAA9tfsFOicXcbxt29cAAAAASUVORK5CYII=' ; -//========================================================== -// File: diam_pink.png -//========================================================== - $this->imgdata[1][0]= 262 ; - $this->imgdata[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. - 'BMVEX///+AgID/M5n/Zpn/zMz/mZn1xELhAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwsWEi3tX8qUAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. - 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. - '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. - 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. - '==' ; + //========================================================== + // File: diam_pink.png + //========================================================== + $this->imgdata[1][0]= 262 ; + $this->imgdata[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgID/M5n/Zpn/zMz/mZn1xELhAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEi3tX8qUAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; -//========================================================== -// File: diam_blue.png -//========================================================== - $this->imgdata[2][0]= 662 ; - $this->imgdata[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA+V'. - 'BMVEX///+AgIAAAJwAAP8AAM4AAGMAAGsQEP8YGHMQEHMYGP8Q'. - 'EKUICJwICM5KSpQxMYQpKXsYGNYQEM4ICGsICP97e85aWpw5OY'. - 'xSUv85ObVCQt4xMa0pKa0hIaUpKf+9vd6EhLVra+dzc/9SUr1r'. - 'a/9aWt5SUt5CQrVaWv9KSv8hIXs5Of8xMf8pKdYhIdYYGKUhIf'. - '/Ozs739//v7/fn5+/v7//n5/fW1ufOzufOzu/W1v+trc69veel'. - 'pc6trd6UlMa9vf+MjL21tfe1tf+UlNZzc61ra6Wlpf+EhOeMjP'. - '9ra8ZSUpyEhP9CQoxKSrVCQv85Od4xMdYQENZnJhlWAAAAAXRS'. - 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. - 'LdfvwAAAAHdElNRQfTAwsWEx3Snct5AAABFklEQVR4nHXR5XbD'. - 'IBgGYM6AuHsaqbvOfeuknev9X8xISbplSd5/8JyXwwcA/I0AKm'. - 'PFchVBdvKNKggKQx2VIoRwMZihMiQE49YUlWBCcPL0hYq4ITh+'. - 'qKECUoLDZWqoQNA766F/mJHlHXblPJJNiyURhM5eU9cNw5BlmS'. - 'IrLOLxhzfotF7vwO2j3ez2ap/TmW4AIM7DoN9+tu+vLk6Pdg9O'. - '6ufXjfXLm6pxPACSJIpRFAa+/26DhuK6qjbiON40k0N3skjOvm'. - 'NijBmchF5mi+1jhQqDmWyIzPp1hUlrv8On5l+6mMm1tigFNyrt'. - '5R97g+FKKyGKkTNKesXPJTZXOFIrUoKiypcTQVHjK4g8H2dWEQ'. - 'B8bvUDLSQXSr41rmEAAAAASUVORK5CYII=' ; + //========================================================== + // File: diam_blue.png + //========================================================== + $this->imgdata[2][0]= 662 ; + $this->imgdata[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA+V'. + 'BMVEX///+AgIAAAJwAAP8AAM4AAGMAAGsQEP8YGHMQEHMYGP8Q'. + 'EKUICJwICM5KSpQxMYQpKXsYGNYQEM4ICGsICP97e85aWpw5OY'. + 'xSUv85ObVCQt4xMa0pKa0hIaUpKf+9vd6EhLVra+dzc/9SUr1r'. + 'a/9aWt5SUt5CQrVaWv9KSv8hIXs5Of8xMf8pKdYhIdYYGKUhIf'. + '/Ozs739//v7/fn5+/v7//n5/fW1ufOzufOzu/W1v+trc69veel'. + 'pc6trd6UlMa9vf+MjL21tfe1tf+UlNZzc61ra6Wlpf+EhOeMjP'. + '9ra8ZSUpyEhP9CQoxKSrVCQv85Od4xMdYQENZnJhlWAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwsWEx3Snct5AAABFklEQVR4nHXR5XbD'. + 'IBgGYM6AuHsaqbvOfeuknev9X8xISbplSd5/8JyXwwcA/I0AKm'. + 'PFchVBdvKNKggKQx2VIoRwMZihMiQE49YUlWBCcPL0hYq4ITh+'. + 'qKECUoLDZWqoQNA766F/mJHlHXblPJJNiyURhM5eU9cNw5BlmS'. + 'IrLOLxhzfotF7vwO2j3ez2ap/TmW4AIM7DoN9+tu+vLk6Pdg9O'. + '6ufXjfXLm6pxPACSJIpRFAa+/26DhuK6qjbiON40k0N3skjOvm'. + 'NijBmchF5mi+1jhQqDmWyIzPp1hUlrv8On5l+6mMm1tigFNyrt'. + '5R97g+FKKyGKkTNKesXPJTZXOFIrUoKiypcTQVHjK4g8H2dWEQ'. + 'B8bvUDLSQXSr41rmEAAAAASUVORK5CYII=' ; -//========================================================== -// File: diam_yellow.png -//========================================================== - $this->imgdata[3][0]= 262 ; - $this->imgdata[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. - 'BMVEX///+AgIBmMwCZZgD/zADMmQD/QLMZAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwsWEwcv/zIDAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. - 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. - '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. - 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. - '==' ; + //========================================================== + // File: diam_yellow.png + //========================================================== + $this->imgdata[3][0]= 262 ; + $this->imgdata[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgIBmMwCZZgD/zADMmQD/QLMZAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEwcv/zIDAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; -//========================================================== -// File: diam_lightblue.png -//========================================================== - $this->imgdata[4][0]= 671 ; - $this->imgdata[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/1'. - 'BMVEX///+AgIAAnP8A//8Azv8AY/8Aa/8I//8Y1v8Izv8Y//8Q'. - '//8InP8Qzv8Ypf85jP8he/8Yc/8Ia/8pe/8p//8p1v9Ctf8xrf'. - '8prf8QnP8Qc/9CjP+1//97//9r//9S//9K//9C//85//8x//8h'. - '//9r5/9K3v9S3v851v97zv9Svf85rf8hpf/G3v9SnP9anP9KlP'. - '8xhP/n7//v7+f3///n///O//+U//9z//9j//9a//975/9C3v8h'. - '1v+E5/+17/9j3v/O7//n9/+95/+l3v9jxv+U1v8Qpf9avf9Ktf'. - '+Uxv+11v97tf9rrf+cxv+Mvf9jpf+tzv+Etf/O3v/39/8Akkxr'. - 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. - 'IAAAsSAdLdfvwAAAAHdElNRQfTAwsWEiHk6Ya/AAABGUlEQVR4'. - 'nHXQ13KDMBAF0J2o0E01GHDvJa7p3em95/+/JQJMYjDc0Yt0Zr'. - 'VaAaxHgtxwbSGPkGQpOIeQ2ORxJiJmNWYZyAhZR0WcgQGhViU0'. - 'nEGoedDHGxgRapRPcRpXhOr7XZzCmLjaXk9IIjvkOEmSRLG62+'. - 'F5XlEElhA5sW21GvXj6mGlDBfnJ51lr9svnvEKwH1hu2QPbwd3'. - 'N9eXVzuL7/Hn29frdKaamgcgy67L3HFG9gDefV+dm5qme4YRXL'. - 'oVR374mRqUELZYosf84XAxISFRQuMh4rrH8YxGSP6HX6H97NNQ'. - 'KEAaR08qCeuSnx2a8zIPWqUowtKHSRK91rAw0elmVYQFVc8mhq'. - '7p5RD7Ps3IIwA9sfsFxFUX6eZ4Zh4AAAAASUVORK5CYII=' ; + //========================================================== + // File: diam_lightblue.png + //========================================================== + $this->imgdata[4][0]= 671 ; + $this->imgdata[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/1'. + 'BMVEX///+AgIAAnP8A//8Azv8AY/8Aa/8I//8Y1v8Izv8Y//8Q'. + '//8InP8Qzv8Ypf85jP8he/8Yc/8Ia/8pe/8p//8p1v9Ctf8xrf'. + '8prf8QnP8Qc/9CjP+1//97//9r//9S//9K//9C//85//8x//8h'. + '//9r5/9K3v9S3v851v97zv9Svf85rf8hpf/G3v9SnP9anP9KlP'. + '8xhP/n7//v7+f3///n///O//+U//9z//9j//9a//975/9C3v8h'. + '1v+E5/+17/9j3v/O7//n9/+95/+l3v9jxv+U1v8Qpf9avf9Ktf'. + '+Uxv+11v97tf9rrf+cxv+Mvf9jpf+tzv+Etf/O3v/39/8Akkxr'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. + 'IAAAsSAdLdfvwAAAAHdElNRQfTAwsWEiHk6Ya/AAABGUlEQVR4'. + 'nHXQ13KDMBAF0J2o0E01GHDvJa7p3em95/+/JQJMYjDc0Yt0Zr'. + 'VaAaxHgtxwbSGPkGQpOIeQ2ORxJiJmNWYZyAhZR0WcgQGhViU0'. + 'nEGoedDHGxgRapRPcRpXhOr7XZzCmLjaXk9IIjvkOEmSRLG62+'. + 'F5XlEElhA5sW21GvXj6mGlDBfnJ51lr9svnvEKwH1hu2QPbwd3'. + 'N9eXVzuL7/Hn29frdKaamgcgy67L3HFG9gDefV+dm5qme4YRXL'. + 'oVR374mRqUELZYosf84XAxISFRQuMh4rrH8YxGSP6HX6H97NNQ'. + 'KEAaR08qCeuSnx2a8zIPWqUowtKHSRK91rAw0elmVYQFVc8mhq'. + '7p5RD7Ps3IIwA9sfsFxFUX6eZ4Zh4AAAAASUVORK5CYII=' ; -//========================================================== -// File: diam_purple.png -//========================================================== - $this->imgdata[5][0]= 657 ; - $this->imgdata[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. - 'BMVEX///////8xAP/OAP+cAP9jAP9rAP+cCP85CP/OEP9SKf/O'. - 'CP9CEP9zGP9rCP+lGP/WOf/WIf9KIf9jOf+MQv+EMf97If9zEP'. - '+1Sv+lIf/ne//eUv/na//n5//Oxv/Wzv+chP9zUv97Wv9rQv9a'. - 'Mf9KGP/v5/+te/97Kf+9Y/+tOf+tKf+lEP/vtf/WMf/WKf/v7+'. - 'f39/+tnP+9rf9rSv9jQv9CGP+ljP+EY//Gtf+tlP+Ma/9zSv/e'. - 'zv+UUv+9lP+cWv+lY/+cUv+MOf+EKf+UQv/Opf/OhP/Ga/+1Qv'. - '/Oe/+9Uv/ntf/eWv/eSv/WGP/3zv/vlP/WEP//9/+pL4oHAAAA'. - 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. - 'sSAdLdfvwAAAAHdElNRQfTAwsWEjX+M1LCAAABDklEQVR4nHXQ'. - '1bLDIBAGYFqIEW+ksbr7cXd3ff93OUCamdOE/Mxw882yywLwPz'. - '+gNKotlRFUVnNUQlCxTMRFCKEdE+MgpJaEiIOU4DKaoSIygtb3'. - 'FBUQrm3xjPK4JvXjK0A5hFniYSBtIilQVYUm+X0KTVNiYah+2q'. - 'ulFb8nUbSovD2+TCavwXQWmnMA6ro+di+uR5cPzfPhVqPV3N1p'. - 'n3b3+rimAWAYhP3xnXd7P6oc9vadPsa1wYEs00dFQRAFehlX21'. - '25Sg9NOgwF5jeNTjVL9om0TjDc1lmeCKZ17nFPzhPtSRt6J06R'. - 'WKUoeG3MoXRa/wjLHGLodwZcotPqjsYngnWslRBZH91hWTbpD2'. - 'EdF1ECWW1SAAAAAElFTkSuQmCC' ; + //========================================================== + // File: diam_purple.png + //========================================================== + $this->imgdata[5][0]= 657 ; + $this->imgdata[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. + 'BMVEX///////8xAP/OAP+cAP9jAP9rAP+cCP85CP/OEP9SKf/O'. + 'CP9CEP9zGP9rCP+lGP/WOf/WIf9KIf9jOf+MQv+EMf97If9zEP'. + '+1Sv+lIf/ne//eUv/na//n5//Oxv/Wzv+chP9zUv97Wv9rQv9a'. + 'Mf9KGP/v5/+te/97Kf+9Y/+tOf+tKf+lEP/vtf/WMf/WKf/v7+'. + 'f39/+tnP+9rf9rSv9jQv9CGP+ljP+EY//Gtf+tlP+Ma/9zSv/e'. + 'zv+UUv+9lP+cWv+lY/+cUv+MOf+EKf+UQv/Opf/OhP/Ga/+1Qv'. + '/Oe/+9Uv/ntf/eWv/eSv/WGP/3zv/vlP/WEP//9/+pL4oHAAAA'. + 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. + 'sSAdLdfvwAAAAHdElNRQfTAwsWEjX+M1LCAAABDklEQVR4nHXQ'. + '1bLDIBAGYFqIEW+ksbr7cXd3ff93OUCamdOE/Mxw882yywLwPz'. + '+gNKotlRFUVnNUQlCxTMRFCKEdE+MgpJaEiIOU4DKaoSIygtb3'. + 'FBUQrm3xjPK4JvXjK0A5hFniYSBtIilQVYUm+X0KTVNiYah+2q'. + 'ulFb8nUbSovD2+TCavwXQWmnMA6ro+di+uR5cPzfPhVqPV3N1p'. + 'n3b3+rimAWAYhP3xnXd7P6oc9vadPsa1wYEs00dFQRAFehlX21'. + '25Sg9NOgwF5jeNTjVL9om0TjDc1lmeCKZ17nFPzhPtSRt6J06R'. + 'WKUoeG3MoXRa/wjLHGLodwZcotPqjsYngnWslRBZH91hWTbpD2'. + 'EdF1ECWW1SAAAAAElFTkSuQmCC' ; -//========================================================== -// File: diam_gray.png -//========================================================== - $this->imgdata[6][0]= 262 ; - $this->imgdata[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. - 'BMVEX//////wAzMzNmZmbMzMyZmZlq4Qo5AAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwsWExZFTxLxAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. - 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. - '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. - 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. - '==' ; + //========================================================== + // File: diam_gray.png + //========================================================== + $this->imgdata[6][0]= 262 ; + $this->imgdata[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX//////wAzMzNmZmbMzMyZmZlq4Qo5AAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWExZFTxLxAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; -//========================================================== -// File: diam_blgr.png -//========================================================== - $this->imgdata[7][0]= 262 ; - $this->imgdata[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. - 'BMVEX///+AgIBmzP9m///M//+Z//8hMmBVAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwsWEwCxm6egAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. - 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. - '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. - 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. - '==' ; + //========================================================== + // File: diam_blgr.png + //========================================================== + $this->imgdata[7][0]= 262 ; + $this->imgdata[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgIBmzP9m///M//+Z//8hMmBVAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEwCxm6egAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; } } diff --git a/libs/jpgraph/imgdata_pushpins.inc.php b/libs/jpgraph/imgdata_pushpins.inc.php index 909dd5b..53e0b15 100644 --- a/libs/jpgraph/imgdata_pushpins.inc.php +++ b/libs/jpgraph/imgdata_pushpins.inc.php @@ -1,9 +1,9 @@ 'imgdata_small', - MARK_IMG_SPUSHPIN => 'imgdata_small', - MARK_IMG_LPUSHPIN => 'imgdata_large'); + MARK_IMG_SPUSHPIN => 'imgdata_small', + MARK_IMG_LPUSHPIN => 'imgdata_large'); protected $colors = array('blue','green','orange','pink','red'); protected $index = array('red' => 0, 'orange' => 1, 'pink' => 2, 'blue' => 3, 'green' => 4 ) ; protected $maxidx = 4 ; protected $imgdata_large, $imgdata_small ; - function ImgData_PushPins() { + function __construct() { - // The anchor should be where the needle "hits" the paper - // (bottom left corner) - $this->anchor_x = 0; - $this->anchor_y = 1; + // The anchor should be where the needle "hits" the paper + // (bottom left corner) + $this->anchor_x = 0; + $this->anchor_y = 1; -//========================================================== -// File: ppl_red.png -//========================================================== - $this->imgdata_large[0][0]= 2490 ; - $this->imgdata_large[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMKBh4Ryh89CgAACUdJREFUeJy9mNtTFFcexz+/7p'. - '4Lw1wZJKDGCAwmDAqUySamcCq1ed6k9mn3UfMP7F+1T3nYqn2J'. - 'lZdoDEjpbq0KG8EBFBFBEJye6Zmenkv32Ydu5GYiUMmeqq6uqT'. - '6Xz3zP73aOcIKmAQkIFyD3N/jrBPwlKjLQEglVlJKyUjR3u7cc'. - 'WLoP3/4dvv03LNrQ8I6x1rFbDML9kOmHvh7IRHU9JKmUSG8vpF'. - 'IoXX/TV0AiEM5A5jT0noFMFMJHXUt/d5f9TUAbhtQ3cPFruDog'. - '8klHMnmO0dGYe/myOJGINEwTz3F2higFXgy8PpAkOC+h8hoaCt'. - '4ppHFcQAWSgOQlyI/p+lUjmRxWAwNJd3xca/f34yoFi4tgmjtD'. - 'NIFkJ4xcgBCgVqEBFJ9DqcZea/gNAAVEg7AOGYnHe9XoaJd3+X'. - 'LISSSwnz6lsbKCZ9sHh4UVdBkwdA6cPwNnIfJPmC3Ctgft3wwQ'. - 'QPkvTZJJnbExzfvsM2nMzVG7e5fG48d4lnXwTwEYCjJxuHQBog'. - 'BHUfKkgAIIhiGk06hTp/Dm5qS1uYlXLvtWd4gPgIiCrAEcVckT'. - 'Ab5p7TaYJrK1hQaEenrwSiVfQdc91P0kSp7Ii89D5ksY/kAkLy'. - 'IZXFdXkQjS1YUSEbdcRu168V6+HTUNIKJDRwdE+sBIQmP9Ld59'. - 'bEBA3of4F/D+uXb7rGaaCSmXI3pPj64PDaHCYfEqFVSjgWo2D2'. - '73XlJNQTgCyQykIuBWoNKEeh1aLXBPBCggGdBOgxZVSjoajVhH'. - 'o5HWlIpq4bCQSgm9vXhK4ZZKh5SUYygp4J1EQVUD9xlU18BJQD'. - 'bUbJ5T5XJStyxN9fSI099P3baxV1dRloW2h2ivx/yakg2ot6F1'. - 'EkCa4G1D+zVEq5ArKTWM42Q6HUczQV7U66w9e0ZpdRXlOIQ5vF'. - 'VHUXILKify4jiEzkOqC3peQMoBQymFlMt4Dx6wUSxSsm2UZXEK'. - 'P30QvOUt8/2Sd78CdWwFDTA+gsw3cOlPcPUD+CQB52oQ21RKXM'. - 'eRhGXhOg7VoKrx8KuS4ygZhVg3ZI8FGIfwR9BVgAtfwxdXdP3L'. - '86nUR91dXelNXTeWWy10paQHX602YAP1ADASAL7LJvFtMpOCc0'. - 'cG3FHuGlz6Gr4YEpnoTCbzsdHRbOzy5RCRiLRMk5rjyOtAimwA'. - 'U4U3SurBN/0wnAASBCVDIKpB4kiAB5Ub0/UvO9LpPAMDGfn005'. - 'AxPCzxep3Q6iqPLUseBoufCZRsAE6g5g5kKIDfKUj3wnpAG8QB'. - '/Z1OIqANQuI65AtwNScyYXR2XlAXL2YZHzcklRKWl5GVFXFtGx'. - 'MoAiV/EQaAGH6BUQNWgQpwFngv+Ca8KUAQEBcwgTJHyMV7679R'. - 'XS8YqdSI6u/PMD5ukMtJY3GR2uQkr5aXeWVZOEALmA8WsIAxfL'. - 'd0goVLAdCOd+/YpgqeVtBv4yiA++q/RKKXixe7GB8PSyoljcVF'. - 'yg8fyubyMpulEk2lyAIfAAvAC+B+oOQFoAt/+0rAejB/EzjNri'. - 'vvqNnCd64jxcE39V8spnP+vMbAgDSePKE2NcXm06dslMuUlcID'. - 'TuFvqwXMBU8N39bGgRR+ki0Dz4L5DSAe9NGD7zq+6kcN1L6H2b'. - 'ao5WWaQHllRTafPmWrVMJUimoAQrBYJFjQwre7B6A8YAi8LCgD'. - '5DVo6/hbb/iHK1KggvFeD3hHziQKEMuiNTNDbXGRTdtmw7Iwla'. - 'KGH0oqwbscLOoG46rAY6AOzRhY74PT6QuUKEN4PegXxd/yEDTT'. - 'YMWOk+oEaLkuFdNk0zTZwjfkavDUArXWgGXgFb4dEShXhfYqlI'. - 'ow3w9rg3B6ED60IOOA5oEYQBrcpG+mj9bg0VG8GMJhVDZLyzAo'. - 'VSq8rFYxXXefcjVgG9+uisDrXUCApoKSBcUHMBmHhfcgNwhtD3'. - 'q9IG6Lr15b4OUTmPwBJt8JqGuapp05o0mhoHnptLQfPsR+8IBK'. - 'uYyNH3yr+B77LHheA3tK1Ta+IrMeTL2C6Xl48TOsNWDDgAz7s5'. - '/r+krP/eddCsbj8fDQ4GBm9MqVvvRXX2VULBayRGRzaYn1SoWa'. - 'UjgB4PIB5QK4ZgBXBKaAHxQsrED1H7CRgCUPwgHZDqACmhWwXv'. - '2aDRqGYeRyufS169cvThQKV88PDuYbW1vJ5VRK+5euqxWlPMdX'. - 'SRqgreHbZGN3ijfKBXBTAeh2Fdwi2MofshP/dvKwCmKhp4m83Y'. - 'vj8Xg4l8tlCoXC0MTExMTFkZE/1m37wvLGRvKRacoD1209E7Fc'. - 'pZwYREOQqEJ4z3HskHLsz4AoXykPIBSN0t3dTTQafROoHdumXC'. - '4fjoMiog0ODiauX7+eLxQKV3O53ETdti88nJnJ3rl505ifmWm3'. - 'arWSodR8GNbycDoNHy5C5jFold1k8d+DyvELNwg93d18/vnn9P'. - 'X1oes6nufx/Plz7t+/fxhQKSWJRCI5NjaWHxkZKdj1+sjSwkJm'. - '+uZN/dZ337VqCwullGUVdZjsgIUC5LqhrUPvCugWuApeApPAzY'. - 'PKHWyaphGNRunt7WVwcBARwfM8Ojo6sCzrMKBhGLphGFEF2Wq1'. - '2jc7M5OZ/vHH0MPbt93awkJJmeZsC6ZaMK3DCwvWdNioQUb5B6'. - 'AdBR+9SzkAz/NwHIeXL18iIui6TjgcJplMMjY2th8wHo+Hh4aG'. - 'MsPDw6fddru7+Phxx51bt/RbN260qwsLpZhlFZsw9QJ+2Pbrga'. - 'oJG2FY2oKwuTtVEz9uV34NbqdtbW0xPT1NNBoF4MyZM1y5coWu'. - 'rq5dQBHRcrlc4tq1a/l8Pj9RMs38ndu3Ez//9JNXLRZNyuXZJk'. - 'xVYKoExQpsK/+IaAuYb7no8zjC/R+A4zisrq7u+53NZjl16tQ+'. - 'QIlEIslsNpuPRCJXZ2dnh2/duNFRW1oy07a96MKd575yxRqU1B'. - '5vPMpF5HHa1tYW9+7do7Ozc/eQpZTSQ6FQt1Lq8pMnT/5w7969'. - 'nuLcXE1rNufO9fRMhlKpOyvt9qPtVmvb25fFfvvWbrepVCqHwo'. - 'xaX19vff/996ZhGC8qlkW9Wt1Onz073fXxxz+6MB+9e9dUjuO+'. - '7ebq9wLdB9hoNCrr6+s/4wf3FCJW3fPmTZhXsNWCprjuW66Dfr'. - '928KAfBhJAEgiJSLuzs7OSTqctoFkqlZRt26j/I+L/AGjPTN4d'. - 'Nqn4AAAAAElFTkSuQmCC' ; + //========================================================== + // File: ppl_red.png + //========================================================== + $this->imgdata_large[0][0]= 2490 ; + $this->imgdata_large[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMKBh4Ryh89CgAACUdJREFUeJy9mNtTFFcexz+/7p'. + '4Lw1wZJKDGCAwmDAqUySamcCq1ed6k9mn3UfMP7F+1T3nYqn2J'. + 'lZdoDEjpbq0KG8EBFBFBEJye6Zmenkv32Ydu5GYiUMmeqq6uqT'. + '6Xz3zP73aOcIKmAQkIFyD3N/jrBPwlKjLQEglVlJKyUjR3u7cc'. + 'WLoP3/4dvv03LNrQ8I6x1rFbDML9kOmHvh7IRHU9JKmUSG8vpF'. + 'IoXX/TV0AiEM5A5jT0noFMFMJHXUt/d5f9TUAbhtQ3cPFruDog'. + '8klHMnmO0dGYe/myOJGINEwTz3F2higFXgy8PpAkOC+h8hoaCt'. + '4ppHFcQAWSgOQlyI/p+lUjmRxWAwNJd3xca/f34yoFi4tgmjtD'. + 'NIFkJ4xcgBCgVqEBFJ9DqcZea/gNAAVEg7AOGYnHe9XoaJd3+X'. + 'LISSSwnz6lsbKCZ9sHh4UVdBkwdA6cPwNnIfJPmC3Ctgft3wwQ'. + 'QPkvTZJJnbExzfvsM2nMzVG7e5fG48d4lnXwTwEYCjJxuHQBog'. + 'BHUfKkgAIIhiGk06hTp/Dm5qS1uYlXLvtWd4gPgIiCrAEcVckT'. + 'Ab5p7TaYJrK1hQaEenrwSiVfQdc91P0kSp7Ii89D5ksY/kAkLy'. + 'IZXFdXkQjS1YUSEbdcRu168V6+HTUNIKJDRwdE+sBIQmP9Ld59'. + 'bEBA3of4F/D+uXb7rGaaCSmXI3pPj64PDaHCYfEqFVSjgWo2D2'. + '73XlJNQTgCyQykIuBWoNKEeh1aLXBPBCggGdBOgxZVSjoajVhH'. + 'o5HWlIpq4bCQSgm9vXhK4ZZKh5SUYygp4J1EQVUD9xlU18BJQD'. + 'bUbJ5T5XJStyxN9fSI099P3baxV1dRloW2h2ivx/yakg2ot6F1'. + 'EkCa4G1D+zVEq5ArKTWM42Q6HUczQV7U66w9e0ZpdRXlOIQ5vF'. + 'VHUXILKify4jiEzkOqC3peQMoBQymFlMt4Dx6wUSxSsm2UZXEK'. + 'P30QvOUt8/2Sd78CdWwFDTA+gsw3cOlPcPUD+CQB52oQ21RKXM'. + 'eRhGXhOg7VoKrx8KuS4ygZhVg3ZI8FGIfwR9BVgAtfwxdXdP3L'. + '86nUR91dXelNXTeWWy10paQHX602YAP1ADASAL7LJvFtMpOCc0'. + 'cG3FHuGlz6Gr4YEpnoTCbzsdHRbOzy5RCRiLRMk5rjyOtAimwA'. + 'U4U3SurBN/0wnAASBCVDIKpB4kiAB5Ub0/UvO9LpPAMDGfn005'. + 'AxPCzxep3Q6iqPLUseBoufCZRsAE6g5g5kKIDfKUj3wnpAG8QB'. + '/Z1OIqANQuI65AtwNScyYXR2XlAXL2YZHzcklRKWl5GVFXFtGx'. + 'MoAiV/EQaAGH6BUQNWgQpwFngv+Ca8KUAQEBcwgTJHyMV7679R'. + 'XS8YqdSI6u/PMD5ukMtJY3GR2uQkr5aXeWVZOEALmA8WsIAxfL'. + 'd0goVLAdCOd+/YpgqeVtBv4yiA++q/RKKXixe7GB8PSyoljcVF'. + 'yg8fyubyMpulEk2lyAIfAAvAC+B+oOQFoAt/+0rAejB/EzjNri'. + 'vvqNnCd64jxcE39V8spnP+vMbAgDSePKE2NcXm06dslMuUlcID'. + 'TuFvqwXMBU8N39bGgRR+ki0Dz4L5DSAe9NGD7zq+6kcN1L6H2b'. + 'ao5WWaQHllRTafPmWrVMJUimoAQrBYJFjQwre7B6A8YAi8LCgD'. + '5DVo6/hbb/iHK1KggvFeD3hHziQKEMuiNTNDbXGRTdtmw7Iwla'. + 'KGH0oqwbscLOoG46rAY6AOzRhY74PT6QuUKEN4PegXxd/yEDTT'. + 'YMWOk+oEaLkuFdNk0zTZwjfkavDUArXWgGXgFb4dEShXhfYqlI'. + 'ow3w9rg3B6ED60IOOA5oEYQBrcpG+mj9bg0VG8GMJhVDZLyzAo'. + 'VSq8rFYxXXefcjVgG9+uisDrXUCApoKSBcUHMBmHhfcgNwhtD3'. + 'q9IG6Lr15b4OUTmPwBJt8JqGuapp05o0mhoHnptLQfPsR+8IBK'. + 'uYyNH3yr+B77LHheA3tK1Ta+IrMeTL2C6Xl48TOsNWDDgAz7s5'. + '/r+krP/eddCsbj8fDQ4GBm9MqVvvRXX2VULBayRGRzaYn1SoWa'. + 'UjgB4PIB5QK4ZgBXBKaAHxQsrED1H7CRgCUPwgHZDqACmhWwXv'. + '2aDRqGYeRyufS169cvThQKV88PDuYbW1vJ5VRK+5euqxWlPMdX'. + 'SRqgreHbZGN3ijfKBXBTAeh2Fdwi2MofshP/dvKwCmKhp4m83Y'. + 'vj8Xg4l8tlCoXC0MTExMTFkZE/1m37wvLGRvKRacoD1209E7Fc'. + 'pZwYREOQqEJ4z3HskHLsz4AoXykPIBSN0t3dTTQafROoHdumXC'. + '4fjoMiog0ODiauX7+eLxQKV3O53ETdti88nJnJ3rl505ifmWm3'. + 'arWSodR8GNbycDoNHy5C5jFold1k8d+DyvELNwg93d18/vnn9P'. + 'X1oes6nufx/Plz7t+/fxhQKSWJRCI5NjaWHxkZKdj1+sjSwkJm'. + '+uZN/dZ337VqCwullGUVdZjsgIUC5LqhrUPvCugWuApeApPAzY'. + 'PKHWyaphGNRunt7WVwcBARwfM8Ojo6sCzrMKBhGLphGFEF2Wq1'. + '2jc7M5OZ/vHH0MPbt93awkJJmeZsC6ZaMK3DCwvWdNioQUb5B6'. + 'AdBR+9SzkAz/NwHIeXL18iIui6TjgcJplMMjY2th8wHo+Hh4aG'. + 'MsPDw6fddru7+Phxx51bt/RbN260qwsLpZhlFZsw9QJ+2Pbrga'. + 'oJG2FY2oKwuTtVEz9uV34NbqdtbW0xPT1NNBoF4MyZM1y5coWu'. + 'rq5dQBHRcrlc4tq1a/l8Pj9RMs38ndu3Ez//9JNXLRZNyuXZJk'. + 'xVYKoExQpsK/+IaAuYb7no8zjC/R+A4zisrq7u+53NZjl16tQ+'. + 'QIlEIslsNpuPRCJXZ2dnh2/duNFRW1oy07a96MKd575yxRqU1B'. + '5vPMpF5HHa1tYW9+7do7Ozc/eQpZTSQ6FQt1Lq8pMnT/5w7969'. + 'nuLcXE1rNufO9fRMhlKpOyvt9qPtVmvb25fFfvvWbrepVCqHwo'. + 'xaX19vff/996ZhGC8qlkW9Wt1Onz073fXxxz+6MB+9e9dUjuO+'. + '7ebq9wLdB9hoNCrr6+s/4wf3FCJW3fPmTZhXsNWCprjuW66Dfr'. + '928KAfBhJAEgiJSLuzs7OSTqctoFkqlZRt26j/I+L/AGjPTN4d'. + 'Nqn4AAAAAElFTkSuQmCC' ; -//========================================================== -// File: ppl_orange.png -//========================================================== - $this->imgdata_large[1][0]= 2753 ; - $this->imgdata_large[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFQ0VCkHCzQAACk5JREFUeJytmGtzG0d2hp8zNw'. - 'AEcRdJ6EJK9FL0CqZUm9jWbkwq3vhDstl8dmLvz8rP2H8Q75ZT'. - 'pkRfpLgqsS6WIFEKGYkiSBCDO+banQ8DUpRWEkklXQUUqlCDfv'. - 'rp857pgfAOQ4AMOJdg4R/hX96Hf06bvDc5iT07i8yeg8ksiIAI'. - '4TBi/ds9/vivD/njapNHvRBfHXMu410AM+BUoVSF05NQsi1sO4'. - '8402AXwLQTuP31OAZO2aG0MEn14iSlnI1z3LnMk8IZYJyBwjIs'. - '/TWsVIWPJkvMFS4zMfMhUp5BsoCpAAEBLYKaMFGn00jBxnvu02'. - '35+JHmSJEnBpQEcPo38MmCxd/nS9Ry71Ga/g1W9a8gn0GsHkgA'. - '6DGjxkqb5CoO+YxF3A3p+jGjQUzoK+L/V0ADzFMwtSR8eLbAr8'. - 'uXOTf9NzhTc0geSLUQcYHgYEH786RMg0zWJHV2Aitv4x/HpHVS'. - 'QA2YBqTTGIUq5qkPMWaWkVwPnPtAA/BevmZcjxaaUtHh8pJJGu'. - 'DpCB9FvT7A7YT7S3p5vFMNzmWo/O0MSx/Ms3TqI8r59zFTfUQe'. - 'I7SBODE3tnfoIxYnNHligwik0zAzDdVpyKbA8sff5YAeMEwgkV'. - 'cufQeTJzZoCsaFLKXPTnNpoUTNsSgJmNoGsuNQjIDwYD2HlnZy'. - 'k++yxTKXZfKTU8zOpjhneeQYkorSmGERtIlICBKRbLX+y98YN3'. - 'ADcNIm+bJD4U3pPnmbEaRgYVRTGBkDSSsmxKfY7ZLuDJA4hdjl'. - 'JEgyBB2SJOvQ9RzTpNKoEwNq0CNFvOXR3/HxMgYVPObaz8kPmh'. - 'hkEWMatAfRONGGvLizyOE9P8KkpwhPDAgQKJQbELUD0oOIhbbH'. - 'JeVTmowxjAgZutB5AoOngA+2DdYrcTyOyYZP9+QpBvI29vwEhb'. - 'It042BVQgDy9KTMfkwQG1A9ACCLlgBBGUwxxoc52WDh2ATyEPp'. - '1hoaPvrEBh0Dq5an9OUsl/9hylk5b5c+mowLc4E2Jtw4Eoljyf'. - 'ogA/AGEAagNRjGyUxOmEycyVA5EWDBxrmUp3ytLIv/NJP69Goh'. - '+9mFydIvS5PZYkvH1oY/RFtKymlwBFQAgQd+kAA6qSQ8pvn2mp'. - 'SkJkuVFHPHBnQMrEt5Sl+e4/Lvp51PF1PF5Xy6WMvOWZXMom8z'. - 'OZTQ8+j5sbQiMEwopsCIwRtBGIJSCdzbTGo9NimkDcgdC7Bg49'. - 'TG5n4/nfr0Si77WdYp1YzyZEkWPdteaEnB7pPqBTxuIf/VgciE'. - 'SgasCPwh+GNIkaNNag1RiPge5pEhMQVjfoLcF+eoXSvbKxedwn'. - 'LKzC3KWbOi5/sW5a44/SHFUSgVA7SCzRG0AvA9mPOgFIETgu4n'. - 'Ww0wNQWFAqRSL6D2ZQYBdDrQ7R7jXiwgRcvIL02makuTmWtpM/'. - '+BlLMl5vuWzLVEuwH6oYnR1KS8kJINGXMM2YdfRlALoQoQQKeb'. - 'bDVwoMdxQMaLCwLo96HZTF5HbrEhmOftianfZisfzueKv7ZmrX'. - 'MsjhxKXZGBjzyeEHmSE3oWiggtyVGmE8DTIXTC5NxgAxOAGUM8'. - 'fun9mnSSLQ/CxNzOTgJ3LIMgoGwkKBiiMyaVviHVkdCO4FEKNv'. - 'LQzWBYHfITPa4UBVM0LR/WB7ARJsdDDTjA6deYFIFUOimJ3d0E'. - 'sNdLavYYgBpthqKcjiiJRO8K6CK0CsJTjfQAGaJtD9vQFAxNNQ'. - '1FB0yBAfA8gdMAIagLoCVAen0M00zMOTYShNDtoHs9CAIUoI4E'. - '1IBihCdNhsMhsj6NuV7BCC2IBpBqQaaFOENCCeiEsO1BO4RQgy'. - 'I5Hm4k4oIU9MrgZSAdBeTabZz+ODxKQRRBFBJo6IUc51anYRQo'. - 'dto+24FNxYCiaWKkQsj00KkO4gxRRkAngJ868M0u3OkkM+hxQA'. - 'cQ7YD7GO5XYSsPZybh/TCkFIYY+kWniTW4Q7jXgHvHMhiRpmuW'. - 'ca08GZkkZ/nY6TZMNhCnf2CuPoDVJvxpB+q9BHA8Ag1uH+oP4c'. - 'YEPCzDwmzSLquShHW/E0YRbG/BjZtw40hAy7aNzJlzRn75E6N0'. - 'qiwTzafI7kOU3gWrhzZC2iHcbsPqLlxvJnCt4KC1RYAL3I5hzY'. - 'Xv/huePYCtITQMKEnyB4KQvMURuJvw889HGSwUCs7CwkLpo6tX'. - 'Ty/+7nel6VLGDn/8N9m+eZuo1UP8iNhLau6b3RfmOsHBGTUYw9'. - 'WBNeDrGB4+h/4qNLKwTnLbHj9CJw/6GoIh9Jpvq0HHcayFhYXi'. - 'l3/4w9LK8vLKexfma3G/mb/3n1njTivS7tNQaaU1grQDjJ868D'. - 'Axx6vmxnBrY9C9IcSbSXbavNjb/S3eN6/0m1JcKBScixcvllZW'. - 'Vi6uLC8v12q1v/M8b/HxVjP//YYr32yE4dYWvShO0ogi14xwxq'. - 'F4rbnxZ3cMjtpvEEeMvwA0TdOYn5/PffHFF7Vr166tvPeLXyx7'. - 'nrd4+/btyg/frFo//Xgncnd67qCn78earQqcmYD3fSi1wPCTSV'. - '3gzqvm9uFOMl5nUAqFQn5paal26dKla57vf7D+6FHph9VV88af'. - 'vgq79bo70e3VT2l9A3hYg4UiRALVHTCHSZvYBm4A//6quf8zoG'. - '3bpuM4acMwKr1+//SDe/dK31+/bv90/Xrcq9fduNW6rbVeC+E7'. - 'gWdD2DKg4UEpBmPcm10RuScida31ntb62HAigoigDw6Gh0axWH'. - 'QWFhZKi4uLZ+I4PrVer2e+u37dXPvqq6hbr7tOp1NXWq89h6/b'. - '8FBB34WGBesdcPrj38lkMkGlUuml0+mu53nR3t4eo9HoSLhMJk'. - 'OlUiGdTuN5Hq7rvgA0TdO4cOFC7vPPP6/VarXldqdTu7m2lrv7'. - '7beq++BBO263b/tKrfWSXlbvwJ6CuAtDgTYiaBFMw6BSqfDxxx'. - '+rarWqGo0GN2/eZGtrC6XenAkRoVKpcPXqVWZmZmg0Gty6desF'. - 'oIhIOp3Ol8vlmmVZK3fv3Lm09uc/Zwbr653ccPgoNIzvnmn99Z'. - '7W9QG46lAaM5mM2l95GIYUi0VOnz7N7OwsWmsymQzyuse5Q8Mw'. - 'DNLpNDMzM5w/f/7A6AGgUkoajYa9urpayOXzUz/fvZutr68Pim'. - 'F4/2y1+n2o9Q/ru7uPesPhXnyo4A+vfHp6mmazybNnz9jZ2UFr'. - 'TbPZJAhe+8/aS0Mphed5NBoNABqNBqPR6MWBVWstvu/nnj9/Pv'. - 'vo0aPq5uZmPBgM/qcwPf39xV/9ajU1M3Nvq9PZaw8GoT50PjdN'. - 'k6mpKa5cucL58+eJ45j19XWePHnCzs4OnudhmiaWZRGGIVH05r'. - 'yEYYjrumxubrKxsfFyDQJ6NBp1Pc+7C4jWumBaVm+kVL2l1H2l'. - '1G6otS+H6V6z8u3tbVzXpdFooJRicXGRqakptre3uXXr1ltrcT'. - 'Qa8ezZszemWAE9rfUdYBOwtVLRbrPZ+48ff+wDvuu6Sr3MB4Dr'. - 'uty6desgfa1WC3iRyrNnz4pSSmezWUzTfGtYtNYcdvC/9sMlgP'. - 'n5N4cAAAAASUVORK5CYII=' ; + //========================================================== + // File: ppl_orange.png + //========================================================== + $this->imgdata_large[1][0]= 2753 ; + $this->imgdata_large[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQ0VCkHCzQAACk5JREFUeJytmGtzG0d2hp8zNw'. + 'AEcRdJ6EJK9FL0CqZUm9jWbkwq3vhDstl8dmLvz8rP2H8Q75ZT'. + 'pkRfpLgqsS6WIFEKGYkiSBCDO+banQ8DUpRWEkklXQUUqlCDfv'. + 'rp857pgfAOQ4AMOJdg4R/hX96Hf06bvDc5iT07i8yeg8ksiIAI'. + '4TBi/ds9/vivD/njapNHvRBfHXMu410AM+BUoVSF05NQsi1sO4'. + '8402AXwLQTuP31OAZO2aG0MEn14iSlnI1z3LnMk8IZYJyBwjIs'. + '/TWsVIWPJkvMFS4zMfMhUp5BsoCpAAEBLYKaMFGn00jBxnvu02'. + '35+JHmSJEnBpQEcPo38MmCxd/nS9Ry71Ga/g1W9a8gn0GsHkgA'. + '6DGjxkqb5CoO+YxF3A3p+jGjQUzoK+L/V0ADzFMwtSR8eLbAr8'. + 'uXOTf9NzhTc0geSLUQcYHgYEH786RMg0zWJHV2Aitv4x/HpHVS'. + 'QA2YBqTTGIUq5qkPMWaWkVwPnPtAA/BevmZcjxaaUtHh8pJJGu'. + 'DpCB9FvT7A7YT7S3p5vFMNzmWo/O0MSx/Ms3TqI8r59zFTfUQe'. + 'I7SBODE3tnfoIxYnNHligwik0zAzDdVpyKbA8sff5YAeMEwgkV'. + 'cufQeTJzZoCsaFLKXPTnNpoUTNsSgJmNoGsuNQjIDwYD2HlnZy'. + 'k++yxTKXZfKTU8zOpjhneeQYkorSmGERtIlICBKRbLX+y98YN3'. + 'ADcNIm+bJD4U3pPnmbEaRgYVRTGBkDSSsmxKfY7ZLuDJA4hdjl'. + 'JEgyBB2SJOvQ9RzTpNKoEwNq0CNFvOXR3/HxMgYVPObaz8kPmh'. + 'hkEWMatAfRONGGvLizyOE9P8KkpwhPDAgQKJQbELUD0oOIhbbH'. + 'JeVTmowxjAgZutB5AoOngA+2DdYrcTyOyYZP9+QpBvI29vwEhb'. + 'It042BVQgDy9KTMfkwQG1A9ACCLlgBBGUwxxoc52WDh2ATyEPp'. + '1hoaPvrEBh0Dq5an9OUsl/9hylk5b5c+mowLc4E2Jtw4Eoljyf'. + 'ogA/AGEAagNRjGyUxOmEycyVA5EWDBxrmUp3ytLIv/NJP69Goh'. + '+9mFydIvS5PZYkvH1oY/RFtKymlwBFQAgQd+kAA6qSQ8pvn2mp'. + 'SkJkuVFHPHBnQMrEt5Sl+e4/Lvp51PF1PF5Xy6WMvOWZXMom8z'. + 'OZTQ8+j5sbQiMEwopsCIwRtBGIJSCdzbTGo9NimkDcgdC7Bg49'. + 'TG5n4/nfr0Si77WdYp1YzyZEkWPdteaEnB7pPqBTxuIf/VgciE'. + 'SgasCPwh+GNIkaNNag1RiPge5pEhMQVjfoLcF+eoXSvbKxedwn'. + 'LKzC3KWbOi5/sW5a44/SHFUSgVA7SCzRG0AvA9mPOgFIETgu4n'. + 'Ww0wNQWFAqRSL6D2ZQYBdDrQ7R7jXiwgRcvIL02makuTmWtpM/'. + '+BlLMl5vuWzLVEuwH6oYnR1KS8kJINGXMM2YdfRlALoQoQQKeb'. + 'bDVwoMdxQMaLCwLo96HZTF5HbrEhmOftianfZisfzueKv7ZmrX'. + 'MsjhxKXZGBjzyeEHmSE3oWiggtyVGmE8DTIXTC5NxgAxOAGUM8'. + 'fun9mnSSLQ/CxNzOTgJ3LIMgoGwkKBiiMyaVviHVkdCO4FEKNv'. + 'LQzWBYHfITPa4UBVM0LR/WB7ARJsdDDTjA6deYFIFUOimJ3d0E'. + 'sNdLavYYgBpthqKcjiiJRO8K6CK0CsJTjfQAGaJtD9vQFAxNNQ'. + '1FB0yBAfA8gdMAIagLoCVAen0M00zMOTYShNDtoHs9CAIUoI4E'. + '1IBihCdNhsMhsj6NuV7BCC2IBpBqQaaFOENCCeiEsO1BO4RQgy'. + 'I5Hm4k4oIU9MrgZSAdBeTabZz+ODxKQRRBFBJo6IUc51anYRQo'. + 'dto+24FNxYCiaWKkQsj00KkO4gxRRkAngJ868M0u3OkkM+hxQA'. + 'cQ7YD7GO5XYSsPZybh/TCkFIYY+kWniTW4Q7jXgHvHMhiRpmuW'. + 'ca08GZkkZ/nY6TZMNhCnf2CuPoDVJvxpB+q9BHA8Ag1uH+oP4c'. + 'YEPCzDwmzSLquShHW/E0YRbG/BjZtw40hAy7aNzJlzRn75E6N0'. + 'qiwTzafI7kOU3gWrhzZC2iHcbsPqLlxvJnCt4KC1RYAL3I5hzY'. + 'Xv/huePYCtITQMKEnyB4KQvMURuJvw889HGSwUCs7CwkLpo6tX'. + 'Ty/+7nel6VLGDn/8N9m+eZuo1UP8iNhLau6b3RfmOsHBGTUYw9'. + 'WBNeDrGB4+h/4qNLKwTnLbHj9CJw/6GoIh9Jpvq0HHcayFhYXi'. + 'l3/4w9LK8vLKexfma3G/mb/3n1njTivS7tNQaaU1grQDjJ868D'. + 'Axx6vmxnBrY9C9IcSbSXbavNjb/S3eN6/0m1JcKBScixcvllZW'. + 'Vi6uLC8v12q1v/M8b/HxVjP//YYr32yE4dYWvShO0ogi14xwxq'. + 'F4rbnxZ3cMjtpvEEeMvwA0TdOYn5/PffHFF7Vr166tvPeLXyx7'. + 'nrd4+/btyg/frFo//Xgncnd67qCn78earQqcmYD3fSi1wPCTSV'. + '3gzqvm9uFOMl5nUAqFQn5paal26dKla57vf7D+6FHph9VV88af'. + 'vgq79bo70e3VT2l9A3hYg4UiRALVHTCHSZvYBm4A//6quf8zoG'. + '3bpuM4acMwKr1+//SDe/dK31+/bv90/Xrcq9fduNW6rbVeC+E7'. + 'gWdD2DKg4UEpBmPcm10RuScida31ntb62HAigoigDw6Gh0axWH'. + 'QWFhZKi4uLZ+I4PrVer2e+u37dXPvqq6hbr7tOp1NXWq89h6/b'. + '8FBB34WGBesdcPrj38lkMkGlUuml0+mu53nR3t4eo9HoSLhMJk'. + 'OlUiGdTuN5Hq7rvgA0TdO4cOFC7vPPP6/VarXldqdTu7m2lrv7'. + '7beq++BBO263b/tKrfWSXlbvwJ6CuAtDgTYiaBFMw6BSqfDxxx'. + '+rarWqGo0GN2/eZGtrC6XenAkRoVKpcPXqVWZmZmg0Gty6desF'. + 'oIhIOp3Ol8vlmmVZK3fv3Lm09uc/Zwbr653ccPgoNIzvnmn99Z'. + '7W9QG46lAaM5mM2l95GIYUi0VOnz7N7OwsWmsymQzyuse5Q8Mw'. + 'DNLpNDMzM5w/f/7A6AGgUkoajYa9urpayOXzUz/fvZutr68Pim'. + 'F4/2y1+n2o9Q/ru7uPesPhXnyo4A+vfHp6mmazybNnz9jZ2UFr'. + 'TbPZJAhe+8/aS0Mphed5NBoNABqNBqPR6MWBVWstvu/nnj9/Pv'. + 'vo0aPq5uZmPBgM/qcwPf39xV/9ajU1M3Nvq9PZaw8GoT50PjdN'. + 'k6mpKa5cucL58+eJ45j19XWePHnCzs4OnudhmiaWZRGGIVH05r'. + 'yEYYjrumxubrKxsfFyDQJ6NBp1Pc+7C4jWumBaVm+kVL2l1H2l'. + '1G6otS+H6V6z8u3tbVzXpdFooJRicXGRqakptre3uXXr1ltrcT'. + 'Qa8ezZszemWAE9rfUdYBOwtVLRbrPZ+48ff+wDvuu6Sr3MB4Dr'. + 'uty6desgfa1WC3iRyrNnz4pSSmezWUzTfGtYtNYcdvC/9sMlgP'. + 'n5N4cAAAAASUVORK5CYII=' ; -//========================================================== -// File: ppl_pink.png -//========================================================== - $this->imgdata_large[2][0]= 2779 ; - $this->imgdata_large[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFQolY9lkpgAACmhJREFUeJy9mOtzFNl5h5+3b9'. - 'Mz0kzPBWmEVtIiWYhIiC0HCDhB8lb8ISk7nzdZ5+/zJ/8BTmpT'. - '660CZLwG1pVFgBkgGIHECEaa+/T9nHzQCCQuRpCNz6mp6g893U'. - '8/c37ve3qEjxiC4OA4n/Lp/EUu/tsMM/+aEWduVBx7WhdkShcY'. - 'xUH2zo0Dwod/5N6vf8V//PoGdx8M8EOFPtK9jI8BdHCcMuVSmf'. - 'LxHLmSZdm2U8xIbmKETDGDZZnIy4dBbCynyGhphurEDBOlHFnn'. - 'qPcyPxTOwDCOccw7w5nlBRZWylI+ny/mZ6rL1dzUZ5/IWGZU3D'. - 'ZIOMQDDaJcHDVGWUbJBi9odVr0QoVSPzigIEaZ8vgSS/8wZU3/'. - 'k1fylipz5dLM2WlrZqHKaGCKbEbontq3KAKWQyZfZKTgYqc9Bp'. - '2I2PcJ4ogk/UEBQcwipbFZmT13vDBx8fhnE1Ofnp9yJopFyT3X'. - 'yANfks0QHSQMDaL37pOxMLIu2UyVkjVKLjyKSeuD8dAYCFkso1'. - 'gYMaeWJ40T56cl8yAi/O4FSa2P6kYczIDsgVpAqcDImZPMuAB1'. - 'dkLQtcc8a/bwox8IUHAxZVxGZMouSLVYwKuMkD5IxN+JSdsRJB'. - 'pexuTVgYYM6EoGmxkmg3/hEhNUMr/hd7dqbOzExMn/GRDAxWZc'. - 'j3I8HiXfMjF2FQowKw7pjoN6E/Llw/GBJj8qxVOMlX4ipxc/lY'. - 'kl2zBLkmrTcEzMkoNoRLVidLi/9g+Z3I+1xRHX5EcAihxnbPRv'. - 'OTU9kZSmpKPy9FTGrLimPZ1H+UiyGaF67w6n7E1DwMngFDxGvc'. - 'w70v0xZUby5IxjlIyMssUJrJwVWkXBdbXvSvwEibcSdKCAFI16'. - '4/sc0SRo9cGAGq1DwvQFzV6DVuBiV4zYnlEts6A2TSPcSiXoxo'. - 'QqJCEEFMbQ2b69o5qMiOOPqIMQkagu/aSL7waE8101WFShLjk9'. - 'yxgEvjRUiyYd+gwAjY2J9VpXfZ/JEXLhDp3OR6U4T97+hEnPwx'. - 'tv4HsRjy2tTQSFzQgDUnwSLBQRI+x1ZgcH87Vcv4SF19Kt0ezS'. - '1h9s0Ma25pgr/YJfnLnEysok0+ezjM6EBLldGqKIJYuDRhOQEJ'. - 'Oih8X9Q0xmcXNjlCofBJgn78wxVz7L2YWf8tPPz1hnfjbjzfxN'. - 'qVwutq2etZXUQSXikcXGIgUiUkJSDIQMJgYGJsaB3c7b1qQ4GZ'. - 'xSkdGZIwMeNLfK6uezMnvJK3pLxeVixfvMsyVjSNSO6IV9adPG'. - 'AArkEEz8oUkFmBjYGO80qfd6pCWIayD59wIKcsjcKqufn7JO/S'. - 'xfyi+5c24pey5rZ09mJRNkiDdT/tzbkBr3SYkpMYpgEaIJSYhI'. - 'kSOY1GhilAQk5ntDIojxCZ/kf87Pl85xbuWEnLiUy+cW3NNuJX'. - 'MmY5meKf6mT7wZS+THdOjxlG06tIlIOMZxchSxcFFEGAwAGGME'. - 'jwyZYSnWL3cXWiIUbUI6hO/vxXuFOV84ycmlBWthNeflTjuzTi'. - 'lzJmM5s46Ej0J63/ZoPmoy6PYxtYVNhmfs0mbAND1mmKVMBY1L'. - 'mxA1LN7WgXQbCApNhKJHRIM+DQbv7yQGhjnJ5NgFuXBuxpu5mD'. - 'udm3LPuY7pmZLUE6L1SIJaIPFuDAqyw9lnwDYv6NFHkWJh4ZDB'. - 'wCBFD3uMxsTAwcBAiElpE/KcPg36dIiOvpsRxDCyhmlP2YY9ZU'. - 'v8NMb/1id+FGO0DTztkSXLOONUqeITsMkW2zwnJEIDFhYGx+A1'. - 'kwK4mASkvKDPc3p0iYhRRwYUhZLUTyV6Eu0t4s1Y4kcx6W6KaM'. - 'EZThcXH59RRhGEgIAddnBwNEBKqqpUtWBIF22YDIhJsbEkJqFN'. - 'qLtERHs7GnUkwISEQAf0uj30bY39PzbiC6qrDu2cExJ69Nhhhz'. - '59UlIUipCQOnVi4sjG7ubJBy6um0C+he/0iDHQKIQERYyKFLqr'. - 'SI/W6kJCnvOcrWSLSquC1/Jw9Ks3R0FQKHr0uMc9bnCDGjX69A'. - 'H0XlcJkibN5jOe/alCZStHbjJL9lSMLkXExvCXRiDV6GZEeGeX'. - '3TvvBVQoEjfBL/v0rT75Th7VU5C8gktI6NLlMY+5yU3WWGODDf'. - 'r098tHpNFNH7/2lKdXXdz7efLzVaqJIBOCmK8AJUlI6g0aV+9y'. - '9+p7AR3bMQpTBWPy7yeN6fy0jNwewfpvC9Xe+3kFoUuXe9zj5n'. - 'BusEGHjh6GIAGawC2FWuvSvbbF1maFylZAsC1ISZADBiVNSJrP'. - 'eX73MY//skHP85z5+fnSxQsXj//4n39cmnPn7LbZlsajBmEnBL'. - '1nuEGDG9x4aa5Ldz+h0RCuBqwBv1Wo+7vs9r7n++0MmYeAM+zB'. - '+61EK1QUEnbbtN+9Bh3Hsebn54u//PdfLq9eWl2ZnZ1dSnaSwu'. - 'Pin40b9g3doKE0WoNIl65xj3v75njd3BBubQi6ExKmDWkMRKSl'. - 'tSbVKQcMao1Go5Ugb0+x53nOyZMnSysrKydXLq1cWlxa/McgCB'. - 'Yev3hU+GPrD3I5/q94k3pXYQY58q6B5Bs0HB//neaGx00gyWaz'. - 'VCoV7bquCoKAnZ0dfN/f03egLGj0m3XQNE1jdnY2/+WXXy6trq'. - '6uzP3oR5eCIFi4detW5feXL1vr679Let37zVB3/mQytjXJwmSB'. - 'wikHp9ShY0RESqObwPrr5oBERKhUKly4cIFqtUq9XufmzZtsbW'. - '2hXvuDwTTNtxZq8TyvsLy8vLS4uLgahOHphw8elL69fNlc++qr'. - 'uFOrNXPddm1cczVL5f5P+Lv5MuOJgTGxwYbZpZsCdeAq8M1Bcw'. - 'CGYeC6LtVqlRMnTjAyMkKn0yGXyx0N0LZt03Ec1zCMSrfXO37v'. - 'zp3S769csb+/ciXt1mrNdHf3ltZ6Lca8ZpJsduhtCdb2gEFJoQ'. - 'xADYHuHDS3f32lFEEQUK/XGRkZoVAocP78eZaXl9FaI/Jq25Uk'. - 'yWHAYrHozM/PlxYWFibTND32sFbLXrtyxVz76qukXas1M61WTW'. - 'm99gx+20TdN9jqtfjP7QzOwwYNp037Zd0DukDnIByA1pqdnR2+'. - '++472u02Z8+eZWJiAsMwDsEBRNGBzYJpmsaJEyfyX3zxxdLS0t'. - 'KlVqu1dP3q1cLta9ekU6u1dat1J9b6Sk9kraV1rYXegW7apDYw'. - 'kFY6fPc4MNTw88bwfZ/NzU2UUnieRxAEiAiGcXiXfcigiIjruo'. - 'VyubxkWdbK7fX1xWvffFMInjzBM82uMT5+p++6V1UUrSe7u03t'. - '+8lezlKt3gHyl0aSJDQaDa5fv876+vo+w6FzDq1BpZRsb2/bly'. - '9f9vL5/Njdu3fzG0+eMJHNxsfn532vXN5NPG/7abPZal6/Hvfe'. - 'kroPHfsm98f7AHW9Xo+//vrrlmVZm71+37QNw3JnZ9PK4uJGpV'. - 'pt4Dh+vLGhsrmcfv1iHzu01m89HjIdCon2fb8TBMHtvYeRUn50'. - '1Oj4vqp3Ok1f5LYSadfr9dQfDN642P/XeF2DA+SBAuA4jkOhUK'. - 'BQKESO43S11p3BYBDt7u4y+CtB/i/q7jp1GMiw2AAAAABJRU5E'. - 'rkJggg==' ; + //========================================================== + // File: ppl_pink.png + //========================================================== + $this->imgdata_large[2][0]= 2779 ; + $this->imgdata_large[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQolY9lkpgAACmhJREFUeJy9mOtzFNl5h5+3b9'. + 'Mz0kzPBWmEVtIiWYhIiC0HCDhB8lb8ISk7nzdZ5+/zJ/8BTmpT'. + '660CZLwG1pVFgBkgGIHECEaa+/T9nHzQCCQuRpCNz6mp6g893U'. + '8/c37ve3qEjxiC4OA4n/Lp/EUu/tsMM/+aEWduVBx7WhdkShcY'. + 'xUH2zo0Dwod/5N6vf8V//PoGdx8M8EOFPtK9jI8BdHCcMuVSmf'. + 'LxHLmSZdm2U8xIbmKETDGDZZnIy4dBbCynyGhphurEDBOlHFnn'. + 'qPcyPxTOwDCOccw7w5nlBRZWylI+ny/mZ6rL1dzUZ5/IWGZU3D'. + 'ZIOMQDDaJcHDVGWUbJBi9odVr0QoVSPzigIEaZ8vgSS/8wZU3/'. + 'k1fylipz5dLM2WlrZqHKaGCKbEbontq3KAKWQyZfZKTgYqc9Bp'. + '2I2PcJ4ogk/UEBQcwipbFZmT13vDBx8fhnE1Ofnp9yJopFyT3X'. + 'yANfks0QHSQMDaL37pOxMLIu2UyVkjVKLjyKSeuD8dAYCFkso1'. + 'gYMaeWJ40T56cl8yAi/O4FSa2P6kYczIDsgVpAqcDImZPMuAB1'. + 'dkLQtcc8a/bwox8IUHAxZVxGZMouSLVYwKuMkD5IxN+JSdsRJB'. + 'pexuTVgYYM6EoGmxkmg3/hEhNUMr/hd7dqbOzExMn/GRDAxWZc'. + 'j3I8HiXfMjF2FQowKw7pjoN6E/Llw/GBJj8qxVOMlX4ipxc/lY'. + 'kl2zBLkmrTcEzMkoNoRLVidLi/9g+Z3I+1xRHX5EcAihxnbPRv'. + 'OTU9kZSmpKPy9FTGrLimPZ1H+UiyGaF67w6n7E1DwMngFDxGvc'. + 'w70v0xZUby5IxjlIyMssUJrJwVWkXBdbXvSvwEibcSdKCAFI16'. + '4/sc0SRo9cGAGq1DwvQFzV6DVuBiV4zYnlEts6A2TSPcSiXoxo'. + 'QqJCEEFMbQ2b69o5qMiOOPqIMQkagu/aSL7waE8101WFShLjk9'. + 'yxgEvjRUiyYd+gwAjY2J9VpXfZ/JEXLhDp3OR6U4T97+hEnPwx'. + 'tv4HsRjy2tTQSFzQgDUnwSLBQRI+x1ZgcH87Vcv4SF19Kt0ezS'. + '1h9s0Ma25pgr/YJfnLnEysok0+ezjM6EBLldGqKIJYuDRhOQEJ'. + 'Oih8X9Q0xmcXNjlCofBJgn78wxVz7L2YWf8tPPz1hnfjbjzfxN'. + 'qVwutq2etZXUQSXikcXGIgUiUkJSDIQMJgYGJsaB3c7b1qQ4GZ'. + 'xSkdGZIwMeNLfK6uezMnvJK3pLxeVixfvMsyVjSNSO6IV9adPG'. + 'AArkEEz8oUkFmBjYGO80qfd6pCWIayD59wIKcsjcKqufn7JO/S'. + 'xfyi+5c24pey5rZ09mJRNkiDdT/tzbkBr3SYkpMYpgEaIJSYhI'. + 'kSOY1GhilAQk5ntDIojxCZ/kf87Pl85xbuWEnLiUy+cW3NNuJX'. + 'MmY5meKf6mT7wZS+THdOjxlG06tIlIOMZxchSxcFFEGAwAGGME'. + 'jwyZYSnWL3cXWiIUbUI6hO/vxXuFOV84ycmlBWthNeflTjuzTi'. + 'lzJmM5s46Ej0J63/ZoPmoy6PYxtYVNhmfs0mbAND1mmKVMBY1L'. + 'mxA1LN7WgXQbCApNhKJHRIM+DQbv7yQGhjnJ5NgFuXBuxpu5mD'. + 'udm3LPuY7pmZLUE6L1SIJaIPFuDAqyw9lnwDYv6NFHkWJh4ZDB'. + 'wCBFD3uMxsTAwcBAiElpE/KcPg36dIiOvpsRxDCyhmlP2YY9ZU'. + 'v8NMb/1id+FGO0DTztkSXLOONUqeITsMkW2zwnJEIDFhYGx+A1'. + 'kwK4mASkvKDPc3p0iYhRRwYUhZLUTyV6Eu0t4s1Y4kcx6W6KaM'. + 'EZThcXH59RRhGEgIAddnBwNEBKqqpUtWBIF22YDIhJsbEkJqFN'. + 'qLtERHs7GnUkwISEQAf0uj30bY39PzbiC6qrDu2cExJ69Nhhhz'. + '59UlIUipCQOnVi4sjG7ubJBy6um0C+he/0iDHQKIQERYyKFLqr'. + 'SI/W6kJCnvOcrWSLSquC1/Jw9Ks3R0FQKHr0uMc9bnCDGjX69A'. + 'H0XlcJkibN5jOe/alCZStHbjJL9lSMLkXExvCXRiDV6GZEeGeX'. + '3TvvBVQoEjfBL/v0rT75Th7VU5C8gktI6NLlMY+5yU3WWGODDf'. + 'r098tHpNFNH7/2lKdXXdz7efLzVaqJIBOCmK8AJUlI6g0aV+9y'. + '9+p7AR3bMQpTBWPy7yeN6fy0jNwewfpvC9Xe+3kFoUuXe9zj5n'. + 'BusEGHjh6GIAGawC2FWuvSvbbF1maFylZAsC1ISZADBiVNSJrP'. + 'eX73MY//skHP85z5+fnSxQsXj//4n39cmnPn7LbZlsajBmEnBL'. + '1nuEGDG9x4aa5Ldz+h0RCuBqwBv1Wo+7vs9r7n++0MmYeAM+zB'. + '+61EK1QUEnbbtN+9Bh3Hsebn54u//PdfLq9eWl2ZnZ1dSnaSwu'. + 'Pin40b9g3doKE0WoNIl65xj3v75njd3BBubQi6ExKmDWkMRKSl'. + 'tSbVKQcMao1Go5Ugb0+x53nOyZMnSysrKydXLq1cWlxa/McgCB'. + 'Yev3hU+GPrD3I5/q94k3pXYQY58q6B5Bs0HB//neaGx00gyWaz'. + 'VCoV7bquCoKAnZ0dfN/f03egLGj0m3XQNE1jdnY2/+WXXy6trq'. + '6uzP3oR5eCIFi4detW5feXL1vr679Let37zVB3/mQytjXJwmSB'. + 'wikHp9ShY0RESqObwPrr5oBERKhUKly4cIFqtUq9XufmzZtsbW'. + '2hXvuDwTTNtxZq8TyvsLy8vLS4uLgahOHphw8elL69fNlc++qr'. + 'uFOrNXPddm1cczVL5f5P+Lv5MuOJgTGxwYbZpZsCdeAq8M1Bcw'. + 'CGYeC6LtVqlRMnTjAyMkKn0yGXyx0N0LZt03Ec1zCMSrfXO37v'. + 'zp3S769csb+/ciXt1mrNdHf3ltZ6Lca8ZpJsduhtCdb2gEFJoQ'. + 'xADYHuHDS3f32lFEEQUK/XGRkZoVAocP78eZaXl9FaI/Jq25Uk'. + 'yWHAYrHozM/PlxYWFibTND32sFbLXrtyxVz76qukXas1M61WTW'. + 'm99gx+20TdN9jqtfjP7QzOwwYNp037Zd0DukDnIByA1pqdnR2+'. + '++472u02Z8+eZWJiAsMwDsEBRNGBzYJpmsaJEyfyX3zxxdLS0t'. + 'KlVqu1dP3q1cLta9ekU6u1dat1J9b6Sk9kraV1rYXegW7apDYw'. + 'kFY6fPc4MNTw88bwfZ/NzU2UUnieRxAEiAiGcXiXfcigiIjruo'. + 'VyubxkWdbK7fX1xWvffFMInjzBM82uMT5+p++6V1UUrSe7u03t'. + '+8lezlKt3gHyl0aSJDQaDa5fv876+vo+w6FzDq1BpZRsb2/bly'. + '9f9vL5/Njdu3fzG0+eMJHNxsfn532vXN5NPG/7abPZal6/Hvfe'. + 'kroPHfsm98f7AHW9Xo+//vrrlmVZm71+37QNw3JnZ9PK4uJGpV'. + 'pt4Dh+vLGhsrmcfv1iHzu01m89HjIdCon2fb8TBMHtvYeRUn50'. + '1Oj4vqp3Ok1f5LYSadfr9dQfDN642P/XeF2DA+SBAuA4jkOhUK'. + 'BQKESO43S11p3BYBDt7u4y+CtB/i/q7jp1GMiw2AAAAABJRU5E'. + 'rkJggg==' ; -//========================================================== -// File: ppl_blue.png -//========================================================== - $this->imgdata_large[3][0]= 2284 ; - $this->imgdata_large[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFRAiTZAL3gAACHlJREFUeJy9mGtv29YZgJ9zKF'. - 'F3y/Q9jh05tuQkarKgbYasde0UBdZgwNou/Vqga/sD9mP2B4a1'. - 'BbZ9atFPxb5sqOtmXbI19bqsluPYiR3HN90vFEWRZx/IJI5zqa'. - 'x0OwBBSgR5Hj7v+55zSEFXTUgIJyA9C6/9RsjMjAyFIxxJCDc7'. - 'iBqKgyZACGg3G2x9+xXf/fG33P3mC9qNKsp1O+1JdkEnQTdgIO'. - 'ttCSMUi8gj072MnugllAyB9G8rBGi6RsToJTF6iuRoFi1kHKZf'. - '7fB8Iggj0/Dy23D2dakNTR3JDsXPvzstxmZGRMER1EwHhQAEgE'. - 'CLhIkPD6InY9S3djGLJVBtQP1Qb4HDAyoJYQOOZkPx49nhTH9i'. - '7MUBGT7egxkJgd70wZS/CUkoZtA/fRoE1DZ2ACiv52ibReCp4e'. - '7CIEHomxDiuVdGTqUnf/ZeOjR8fpiVXZul5ZrY3bWwbdcLr/dA'. - 'AAIpAwQjUWIjQ+g9HZvswiCgBVF9/SI6OSLGzo0i+oLi6+Utbq'. - '+bKEftgwOE/0Ohocf66M+cBjo22U2RQLIHMhmYnvaOpR9S8bSU'. - 'UqCURGpRkuMZMm9cIvPGJZLj0yBjT2LprkiSkykx9cuXIhOnUs'. - 'm+QNC2XdG02ggBTcvFabsPWwTPpBAChSCgh4kYBpoeplWp47Qs'. - '7EYDt21xINzd5GCAxLExRl89Z+nHjpbKMmjbmkgfDzI0JEW53K'. - 'Jaa6NcAOEX8v52uJzsBlAS6u0hcnTIccPRqhWPCUcLD+s1EaUp'. - 'HCEhEMCyHNpt9SjgIU12A6iw6xb123vYhaaKjB9tlgMD5X+uBp'. - 'zdkpg6azA8EaNQtKlVba+Xez4eCntnJrsDdFsW5nYFpxlFN846'. - 'DXe8utkM4mhi+EgQmjYbS2WqexZKk6BpjwJ2YlK5VjeA3pNDiH'. - 'YjRWPzPE7tmBo8EWwGhkXx+z3uXL7D3rU97LIF8RBEAl6lK/Uo'. - '6JNM1rZ2aTcr3eUgIQOGTgbdwXMGyRejenLYTvQGbAdRuetSud'. - 'OivVuFZgtCEgICghICnZoMhmlVTPR49LCAEkQUhk/B7KXe0MWf'. - 'nxj8xVR/cDheK14WZmtVMJSBnlGoN6FmQq0FLfdwJgORKPHRo/'. - 'Snzx4G0F/FjJ4KiOdmjPCrrx8bffnMybMv9MQGNG3rzlVqtR1B'. - 'sh/CYXCD4Aag1oCW7ZnUOjSp6WFi/QNEB8Y7BfTNjZyCmUvJ0I'. - 'XXT47MTp98Ybon9VZCk8cVazfqlNargsY34G7ByAlIjkHd9CCr'. - 'LbBdiHViUgiECuDKYCdz8b2cywREdiYZOj8zNnLuzOTzx6ODp+'. - 'OaGaqwVzBFqz0Idhz2loE7YEwBLaAJLQcKbW8qjAcBF5Jh0AMP'. - 'IOHe6kxgtb3UMO2OxkF//ffK28nQqxfvm3szrtnDVa799Qb/+v'. - 'NtsbNSpm3tAv8B+w7Ub0FhAyoBcMPec9oK6raXk48ziQBXQcmC'. - 'pT3YqHa0mpEBkTR6wz/Jjo2cy04+fzwxdDquNfQKO7sFUbpu0c'. - 'wp3JoAYsA42Bbkl4GCryUNDEM7Avm6Z/CgSYBWG8pNuFuDu1Wo'. - 'tjoxKIJGeHIiM/jmK9NnX5ycuJQMtUcqXPvLDTa+qIie4hAJ1U'. - 'vdrmO2HaDfB931twJgAn1A4lGT96obPHPLBbhVgUoTHHWo9aAA'. - 'JVAKpyKEmQNzWRENAsL18ycKjAFN/9gCNvzLB/390MMmE7pnDi'. - 'Bvwt0K5Jv3O+0oB22nJ1Vvjb/UMhOpcKknqN1OiMB2DNHU2G5s'. - 'sVndpGJVcZXjX1IAlvw9PmhRQcOFPhsSDkiBrQR1G7brgs0a7D'. - 'ag3FK4rguqBXarI4Nt1SJv5gls7TEWtJDRBO2GwnIs8maevFnA'. - 'Gx6awLZvzeTBu4kFbLigijC47pscpx0xyDfkvtUEnlarCDtrUC'. - 't2HGIhvPHVdVwqjTIrxRU2a5uUrYoP0QZ2gMvACl7+3V/LuKDq'. - 'sJuDy597516+CEezIHXv7vcgXQu2l+Bvn8He9Y4AE4kgk5P9DE'. - 'R6aFdq5Et5Nit3yTf3m9sBcsAN3+D98c0Fit5JawE25r1zg1Fo'. - '5B8GFD7g+nVYnu8EUEop9XTa0N/9dUbqcphP/rDJzbUClVbpgR'. - 'y2fXM3fND95qj75J8AC6BWPINfVSBieK+x+6cS5UCzCLu3oFV9'. - 'GqCMx2NGOp2Znpv7aXZudsool3T5J/179sxVlHJ4kGPrP2COBX'. - '/7DmiApWCjxIMXpYNznYuXM+6TAKWUMppOZzLvv//ery5cuDCT'. - 'SqVS336bCwr1JfAPB9r+2KAFwJS+OcETzZHz/7v3etl6ipz77X'. - 'GAMh6PG+l0OjM3NzczOzs3k0pNnFlbW43+e/GKtMqrblSsF03V'. - 'WHcJA0PjIAzvg9JTze2H67g9DjAwOTmZ+uCDD96anZ2dnZiYmF'. - '5dW41++Lvfa1fnr7qllVK9103mXNTnJgPA+YugsvB3HTaEl+Qs'. - 'AZ/yeHPPDCiTyaRx5syZbGoilV1dW00szC9oV+avusuLy0Xd0X'. - 'MgFkDM+zkYBZEHV8f7wwKu84zmngQoNU0LaZoWUa4K31y5qX/8'. - '4cfyyvwVN5/L10NOKNeg8UmDxoKF5Vfj1xXAgD0JrgAcvBDfel'. - 'a4g4AykUgY6XR6emJiIru2ttZXq9S0K19eUcuLy8WQE8o5OAsN'. - 'Ggsmpl+NpoL1g9X4UBU+C9xDgEKIwNTUVOqdd955M9mbnJ3/cj'. - '6Vu5aTheXCQXNdVeMzAwJSCGEA2XKpnF1cXIzlFnOVhJPIKdR+'. - 'c88ctq4AlVKsrKzw0UcfKcC5uXqzXnNqSzb2pwLxOHP/l7Z/BN'. - 'eB01LKt4HTrusKvGr8jB+hGn8MQAkYQMrfw4Nq/MFPtf+rdvDb'. - 'k8QL+/5Z4Uepxm7bfwHuTAVUWpWaqAAAAABJRU5ErkJggg==' ; + //========================================================== + // File: ppl_blue.png + //========================================================== + $this->imgdata_large[3][0]= 2284 ; + $this->imgdata_large[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFRAiTZAL3gAACHlJREFUeJy9mGtv29YZgJ9zKF'. + 'F3y/Q9jh05tuQkarKgbYasde0UBdZgwNou/Vqga/sD9mP2B4a1'. + 'BbZ9atFPxb5sqOtmXbI19bqsluPYiR3HN90vFEWRZx/IJI5zqa'. + 'x0OwBBSgR5Hj7v+55zSEFXTUgIJyA9C6/9RsjMjAyFIxxJCDc7'. + 'iBqKgyZACGg3G2x9+xXf/fG33P3mC9qNKsp1O+1JdkEnQTdgIO'. + 'ttCSMUi8gj072MnugllAyB9G8rBGi6RsToJTF6iuRoFi1kHKZf'. + '7fB8Iggj0/Dy23D2dakNTR3JDsXPvzstxmZGRMER1EwHhQAEgE'. + 'CLhIkPD6InY9S3djGLJVBtQP1Qb4HDAyoJYQOOZkPx49nhTH9i'. + '7MUBGT7egxkJgd70wZS/CUkoZtA/fRoE1DZ2ACiv52ibReCp4e'. + '7CIEHomxDiuVdGTqUnf/ZeOjR8fpiVXZul5ZrY3bWwbdcLr/dA'. + 'AAIpAwQjUWIjQ+g9HZvswiCgBVF9/SI6OSLGzo0i+oLi6+Utbq'. + '+bKEftgwOE/0Ohocf66M+cBjo22U2RQLIHMhmYnvaOpR9S8bSU'. + 'UqCURGpRkuMZMm9cIvPGJZLj0yBjT2LprkiSkykx9cuXIhOnUs'. + 'm+QNC2XdG02ggBTcvFabsPWwTPpBAChSCgh4kYBpoeplWp47Qs'. + '7EYDt21xINzd5GCAxLExRl89Z+nHjpbKMmjbmkgfDzI0JEW53K'. + 'Jaa6NcAOEX8v52uJzsBlAS6u0hcnTIccPRqhWPCUcLD+s1EaUp'. + 'HCEhEMCyHNpt9SjgIU12A6iw6xb123vYhaaKjB9tlgMD5X+uBp'. + 'zdkpg6azA8EaNQtKlVba+Xez4eCntnJrsDdFsW5nYFpxlFN846'. + 'DXe8utkM4mhi+EgQmjYbS2WqexZKk6BpjwJ2YlK5VjeA3pNDiH'. + 'YjRWPzPE7tmBo8EWwGhkXx+z3uXL7D3rU97LIF8RBEAl6lK/Uo'. + '6JNM1rZ2aTcr3eUgIQOGTgbdwXMGyRejenLYTvQGbAdRuetSud'. + 'OivVuFZgtCEgICghICnZoMhmlVTPR49LCAEkQUhk/B7KXe0MWf'. + 'nxj8xVR/cDheK14WZmtVMJSBnlGoN6FmQq0FLfdwJgORKPHRo/'. + 'Snzx4G0F/FjJ4KiOdmjPCrrx8bffnMybMv9MQGNG3rzlVqtR1B'. + 'sh/CYXCD4Aag1oCW7ZnUOjSp6WFi/QNEB8Y7BfTNjZyCmUvJ0I'. + 'XXT47MTp98Ybon9VZCk8cVazfqlNargsY34G7ByAlIjkHd9CCr'. + 'LbBdiHViUgiECuDKYCdz8b2cywREdiYZOj8zNnLuzOTzx6ODp+'. + 'OaGaqwVzBFqz0Idhz2loE7YEwBLaAJLQcKbW8qjAcBF5Jh0AMP'. + 'IOHe6kxgtb3UMO2OxkF//ffK28nQqxfvm3szrtnDVa799Qb/+v'. + 'NtsbNSpm3tAv8B+w7Ub0FhAyoBcMPec9oK6raXk48ziQBXQcmC'. + 'pT3YqHa0mpEBkTR6wz/Jjo2cy04+fzwxdDquNfQKO7sFUbpu0c'. + 'wp3JoAYsA42Bbkl4GCryUNDEM7Avm6Z/CgSYBWG8pNuFuDu1Wo'. + 'tjoxKIJGeHIiM/jmK9NnX5ycuJQMtUcqXPvLDTa+qIie4hAJ1U'. + 'vdrmO2HaDfB931twJgAn1A4lGT96obPHPLBbhVgUoTHHWo9aAA'. + 'JVAKpyKEmQNzWRENAsL18ycKjAFN/9gCNvzLB/390MMmE7pnDi'. + 'Bvwt0K5Jv3O+0oB22nJ1Vvjb/UMhOpcKknqN1OiMB2DNHU2G5s'. + 'sVndpGJVcZXjX1IAlvw9PmhRQcOFPhsSDkiBrQR1G7brgs0a7D'. + 'ag3FK4rguqBXarI4Nt1SJv5gls7TEWtJDRBO2GwnIs8maevFnA'. + 'Gx6awLZvzeTBu4kFbLigijC47pscpx0xyDfkvtUEnlarCDtrUC'. + 't2HGIhvPHVdVwqjTIrxRU2a5uUrYoP0QZ2gMvACl7+3V/LuKDq'. + 'sJuDy597516+CEezIHXv7vcgXQu2l+Bvn8He9Y4AE4kgk5P9DE'. + 'R6aFdq5Et5Nit3yTf3m9sBcsAN3+D98c0Fit5JawE25r1zg1Fo'. + '5B8GFD7g+nVYnu8EUEop9XTa0N/9dUbqcphP/rDJzbUClVbpgR'. + 'y2fXM3fND95qj75J8AC6BWPINfVSBieK+x+6cS5UCzCLu3oFV9'. + 'GqCMx2NGOp2Znpv7aXZudsool3T5J/179sxVlHJ4kGPrP2COBX'. + '/7DmiApWCjxIMXpYNznYuXM+6TAKWUMppOZzLvv//ery5cuDCT'. + 'SqVS336bCwr1JfAPB9r+2KAFwJS+OcETzZHz/7v3etl6ipz77X'. + 'GAMh6PG+l0OjM3NzczOzs3k0pNnFlbW43+e/GKtMqrblSsF03V'. + 'WHcJA0PjIAzvg9JTze2H67g9DjAwOTmZ+uCDD96anZ2dnZiYmF'. + '5dW41++Lvfa1fnr7qllVK9103mXNTnJgPA+YugsvB3HTaEl+Qs'. + 'AZ/yeHPPDCiTyaRx5syZbGoilV1dW00szC9oV+avusuLy0Xd0X'. + 'MgFkDM+zkYBZEHV8f7wwKu84zmngQoNU0LaZoWUa4K31y5qX/8'. + '4cfyyvwVN5/L10NOKNeg8UmDxoKF5Vfj1xXAgD0JrgAcvBDfel'. + 'a4g4AykUgY6XR6emJiIru2ttZXq9S0K19eUcuLy8WQE8o5OAsN'. + 'Ggsmpl+NpoL1g9X4UBU+C9xDgEKIwNTUVOqdd955M9mbnJ3/cj'. + '6Vu5aTheXCQXNdVeMzAwJSCGEA2XKpnF1cXIzlFnOVhJPIKdR+'. + 'c88ctq4AlVKsrKzw0UcfKcC5uXqzXnNqSzb2pwLxOHP/l7Z/BN'. + 'eB01LKt4HTrusKvGr8jB+hGn8MQAkYQMrfw4Nq/MFPtf+rdvDb'. + 'k8QL+/5Z4Uepxm7bfwHuTAVUWpWaqAAAAABJRU5ErkJggg==' ; -//========================================================== -// File: ppl_green.png -//========================================================== - $this->imgdata_large[4][0]= 2854 ; - $this->imgdata_large[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFQ4hANhluwAACrNJREFUeJytmF1zE1eagJ+3u9'. - 'XdkvUty2AbmLEtEzDBgZ0UpDBOalNTUzU3czl7tct/2n+wt3M/'. - 'NVM12SSTQQSyW2TA+QAJQogtYYFtyfrqL3WfvWj5g8AEjzfvhS'. - 'SXjk8//Zz3Pf3qCMcJAWxMKlT4kH+jwu/FknnJSUItKFHzCrKA'. - 'BggBQx5ziz/wn/yBz3hED4/oaJfSjgVoYjJJgTLTZCjohp7IGT'. - 'k5aZ4kb+bRTR30Q7djj8f/kpPMUSCFedRL6W8e8qMQNE6S4xpv'. - 'c5HrTPFubiJ3ZnlyOXV59rJYU5Z00h1c3d0brxAiUkScRijisk'. - '6XLTyiN3s8HuAJpniXa/q8/pt8Or+0kF8oXJm5YiydWcIpOrJu'. - 'rjOQwd54AQwsMpTJYhPSoYuLQ58An/DnBQSdImXO8avsTPbqpc'. - 'lLp67OXDVzMznZLGxSs2qyIRu4at8gKHQEC50kE1icxqCAdxST'. - 'xjEA44tqaJlERl8uLWvvnX5PHuQfcCdxh5qq0aX76vj4WgWyXO'. - 'QiNgBP8IAaddr08X8+wHFmJSQhBbPAZGoSZSt5wQs6qoNC7UEd'. - '4AEoLIQSCaCCy78Dv8Tiv1hjjW1CRj8XIAgEKqDtt9keboMJZa'. - 'vMjuzQVd3Xr9prTJo+GF/jKZea95R25Lxs8jg5qFGiwDnOS0mW'. - 'NE0rjNRIt3WbklUCA9mV3Zdz8OBT/JfCQLB0SKYVVjGFYSfx/E'. - '26ow4e6uDujlPFQpE0FU6P8qNTHdXJdEdda0qf0itWBVM3pa/3'. - 'ccUlIECJet0cAJoeYk5EZCeS5IwEoerSxccJBwRqFFf38QCTaO'. - 'TRVFKJm3NTbtLNSyh2IkhIXsvLCesEGNCWdmwyruSD/z9kUlRc'. - '3bqNlSxhJNJ43p5JITrOEis8Qtr0cXEpU/JT/pmO18n2vb42pU'. - '3JnDnHMBqyPlpnoAaxhr2llv1ZUBqEGlqYwDQMsskMOcMgVL3Y'. - 'ZOQTHAcQQiIGjHCwCaiovjrv4hbcpKuJJjIcDHm685RGr4GLCx'. - 'YHkAcrLoAoDSLBiAQrMkjqybHJCbxgh+7xAC1MpsgzwRwD3qHL'. - 'WyTIBdlAa6u2rHfXaew06PV78ZZjAwleNnkolECoH5i090wOcY'. - '+TgwYzFHiPi1zkOkXexeAMASnVU+LiyiA1wFUuaqggACLizeWw'. - 'ycMzyssmVYKkbpGyC5T+OUALk2mKLHKWf+ED/az+YW42d66YL+'. - 'aNrmEEzQCFEnKw368EgEvcN1m80eTIQIt0TFOjMJHkzNEBBYPp'. - 'sblf8QHzrORO5JaWZ5ZLl6cuJyyxpNPv4PZdoT+GyIxBfI5uUg'. - 'eJMCwP2/bIHO1JEudcgUUWOceKNq99mCvnzs5PzRcuTV4y5mRO'. - 'SMIjo47z5S7a94oQCNKgJsZwO7D/IDNg3/LLhRNXt4JohBb4aG'. - '82GLdXcf93mQ+Y43r2RHZp+cRy6cqJK4l8MS+tdItaqiYtc0Mm'. - 'QpfJARh98HYh9IiXVcaAo58wGb+LBAjbSPgCOcoSa0wzxXtc08'. - '/pv8mfyL+9MLVQvDJ1JVHJV6SZbFI1qtTsB+KlehRtRTGE8Afo'. - 'P4DRcAxiEudhAHjjzz+ubgX4oHowakHQOlqzICQwyVPITGVOXi'. - 'xfLF6aumzmczl5lHzMff2+fCdPaGttEkXoLQAO9B7C6EugPYby'. - 'gVPjGXc5eIbNAJPjGwiAbaAJUQv8wVG7GROkJFpyOqn/ovgLba'. - '44L0+sDaraXb6jzq7aBQWjBOyUoHcaopOgmaA3IRyNDZnA1HjO'. - 'HSBkr7eEFDAEngHrQCf+/s2A8cSiSkqcKUeeTjwFy2Jd78t3+L'. - 'TR4itIiBLwLQhzkJyB5Cx4HXDaENVQCBAQcRqFIHTRaBIvuYXg'. - 'AdsouuNxEL0ZUBHnSQp66R73zYfUtQ6OytKT8RckQAJQoLtgO5'. - 'BJgj0D/WfgdyHaAHx8THoUcbGx8ciwhUl3bDEiToURPooeI7pH'. - 'MziK9Yd9nU5a6GgKjOH41vsgI4hAcyC5AZkapF+AoYNrjjsuhx'. - 'FbtPmeB5ykyQQzTPAWAQWC8S9oAI0QRRuPb9jkmyMZNAOTklvC'. - 'GGYZaFkGmkVAh8h4DtKFMIBunG+pB5B5AIkGBDsQ+qBiL20caj'. - 'zhJknq5KlgMkLjJHJos4kYEbFJi5vc5eYbATVN02bNWe19+32t'. - 'aJWlFm3wbf8Rz5NbDFJdlOFBF/g7cBf0JkrbBb+F6j1DOduEkU'. - '8bWCOiSofPWadBnSZDWmgUkEMGhZCINut8S/0NBtPptFlZrBSu'. - 'vnt1+ndnflfIp9OJ/279Ubbbd+lP7KBKPoEBsgnqLph/BRzwdS'. - 'LnBUFvHcfdpRsGPAGqwMco6jynz+e0SPKYCHMfLX5VKHwcenR+'. - 'Igd1XTcqlUr+xn/cePv91fevzy8sLO2OtrOpWkqL7gXKSAVRdh'. - 'ZFEmEXoYkwBNqovoc/3GHH3aUR+jwC1oD/AWrANi4hGwyBzqEG'. - 'Vvb77Dgi0eT1VZzJZMxKpVJYXV1dXF1dXVm6sPSvruue3Xzcyj'. - '6/syvDzwj0lNazK6Fj5LFCRZouZpBABj6jXouu3+Np6HNvDHaf'. - 'g91t74msbMuOJicnSSaTKKUQEUQEpRSO69But1/dB0VEm5uby9'. - 'y4cWNpdXX1+sLCworrume//PuXpeqnVeOban0U1PW2kcx+O9L7'. - 'Te9sUB4lWFR9SqNtNGcHx+/RDD2+Am4D94CnQA8OjjlEhMnyJC'. - 'srK8zOzu7BiYioMAzZ2Njg9u3brwIqpSSXy2WXl5eXLly4sOo4'. - 'zoV6vV6oflrVP/7Tx8Hmw1Zb6ydqmpWp7ha8h4O3gjOhzVANmF'. - 'XPMNQWvdDnCXCXuHR+APqH4fbCtm2mp6eZn59H13WJuYXRaKSU'. - 'UiSTyVcBdV3XDcOwRaTU7/en19bWCn/79G+JL/76RbhZ22y7u+'. - '6ahl71nPDz/nO17m7wAxlabFOihy4+DvAcqAMbPzZ3OFzX5dmz'. - 'Z2iahoiosUUVhiGNRgPHcV4GzGQy5uLiYuH8+fMzo9FoslarJW'. - '9+elP75E+fBJu1zY7qqpqBUW3T/niohnVvy+1zm5aVtp+WE2XT'. - 'nrHFzbjh1tYLz3XdPjD4R3BKKba2tqhWq4dzUO3noBPn4H5PKy'. - 'LaO++8U7hx48byhQsXVne7u6tf3/v64t3P7mbq9+odt+OuaWi3'. - 'PLxbW2ytubjbQCgiMnt6VlaurWgz0zM0m02q1WrUaDSUUuqI56'. - 'ivDxE5MCgiYllWtlwuL5mmufLV/a/O/uXPf9Ff1F+80Lv6Yx29'. - '2qHzyZBh3cdvc7gaTZuZkzPh/Py8ACqVSv1/uPZDKXUAGEWRtF'. - 'qtxEcffZTL5XLF+2v39fqjeivshA/TpP83JLwzYFBzcA4370Cc'. - 'S81nTRBUs9lkOByi1GuOPI4Rh3+26JZlnSkWi781DOPXvV4v3+'. - '/2G0R8kSBxB/jew+tERK+c49m2TblcxrZtXNfl+fPneJ6HZVmU'. - 'y2VJJpNyaJ9TSinlOA5bW1u4rntkQA0oAG8D54gb9W3ianxM3A'. - 'e/cn73U3Hq1Cm5du2aPjs7a+ztcSIShmE4ajQa6tatWzQajZ+0'. - 'fbiKI+It4SvijVUj7kL2qvGfgkskEqTTaZmcnDROnTplJhIJTU'. - 'QiwPd9P/Q8T6XTaQzDIAiCfzjP/wFVfszuFqdHXgAAAABJRU5E'. - 'rkJggg==' ; + //========================================================== + // File: ppl_green.png + //========================================================== + $this->imgdata_large[4][0]= 2854 ; + $this->imgdata_large[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQ4hANhluwAACrNJREFUeJytmF1zE1eagJ+3u9'. + 'XdkvUty2AbmLEtEzDBgZ0UpDBOalNTUzU3czl7tct/2n+wt3M/'. + 'NVM12SSTQQSyW2TA+QAJQogtYYFtyfrqL3WfvWj5g8AEjzfvhS'. + 'SXjk8//Zz3Pf3qCMcJAWxMKlT4kH+jwu/FknnJSUItKFHzCrKA'. + 'BggBQx5ziz/wn/yBz3hED4/oaJfSjgVoYjJJgTLTZCjohp7IGT'. + 'k5aZ4kb+bRTR30Q7djj8f/kpPMUSCFedRL6W8e8qMQNE6S4xpv'. + 'c5HrTPFubiJ3ZnlyOXV59rJYU5Z00h1c3d0brxAiUkScRijisk'. + '6XLTyiN3s8HuAJpniXa/q8/pt8Or+0kF8oXJm5YiydWcIpOrJu'. + 'rjOQwd54AQwsMpTJYhPSoYuLQ58An/DnBQSdImXO8avsTPbqpc'. + 'lLp67OXDVzMznZLGxSs2qyIRu4at8gKHQEC50kE1icxqCAdxST'. + 'xjEA44tqaJlERl8uLWvvnX5PHuQfcCdxh5qq0aX76vj4WgWyXO'. + 'QiNgBP8IAaddr08X8+wHFmJSQhBbPAZGoSZSt5wQs6qoNC7UEd'. + '4AEoLIQSCaCCy78Dv8Tiv1hjjW1CRj8XIAgEKqDtt9keboMJZa'. + 'vMjuzQVd3Xr9prTJo+GF/jKZea95R25Lxs8jg5qFGiwDnOS0mW'. + 'NE0rjNRIt3WbklUCA9mV3Zdz8OBT/JfCQLB0SKYVVjGFYSfx/E'. + '26ow4e6uDujlPFQpE0FU6P8qNTHdXJdEdda0qf0itWBVM3pa/3'. + 'ccUlIECJet0cAJoeYk5EZCeS5IwEoerSxccJBwRqFFf38QCTaO'. + 'TRVFKJm3NTbtLNSyh2IkhIXsvLCesEGNCWdmwyruSD/z9kUlRc'. + '3bqNlSxhJNJ43p5JITrOEis8Qtr0cXEpU/JT/pmO18n2vb42pU'. + '3JnDnHMBqyPlpnoAaxhr2llv1ZUBqEGlqYwDQMsskMOcMgVL3Y'. + 'ZOQTHAcQQiIGjHCwCaiovjrv4hbcpKuJJjIcDHm685RGr4GLCx'. + 'YHkAcrLoAoDSLBiAQrMkjqybHJCbxgh+7xAC1MpsgzwRwD3qHL'. + 'WyTIBdlAa6u2rHfXaew06PV78ZZjAwleNnkolECoH5i090wOcY'. + '+TgwYzFHiPi1zkOkXexeAMASnVU+LiyiA1wFUuaqggACLizeWw'. + 'ycMzyssmVYKkbpGyC5T+OUALk2mKLHKWf+ED/az+YW42d66YL+'. + 'aNrmEEzQCFEnKw368EgEvcN1m80eTIQIt0TFOjMJHkzNEBBYPp'. + 'sblf8QHzrORO5JaWZ5ZLl6cuJyyxpNPv4PZdoT+GyIxBfI5uUg'. + 'eJMCwP2/bIHO1JEudcgUUWOceKNq99mCvnzs5PzRcuTV4y5mRO'. + 'SMIjo47z5S7a94oQCNKgJsZwO7D/IDNg3/LLhRNXt4JohBb4aG'. + '82GLdXcf93mQ+Y43r2RHZp+cRy6cqJK4l8MS+tdItaqiYtc0Mm'. + 'QpfJARh98HYh9IiXVcaAo58wGb+LBAjbSPgCOcoSa0wzxXtc08'. + '/pv8mfyL+9MLVQvDJ1JVHJV6SZbFI1qtTsB+KlehRtRTGE8Afo'. + 'P4DRcAxiEudhAHjjzz+ubgX4oHowakHQOlqzICQwyVPITGVOXi'. + 'xfLF6aumzmczl5lHzMff2+fCdPaGttEkXoLQAO9B7C6EugPYby'. + 'gVPjGXc5eIbNAJPjGwiAbaAJUQv8wVG7GROkJFpyOqn/ovgLba'. + '44L0+sDaraXb6jzq7aBQWjBOyUoHcaopOgmaA3IRyNDZnA1HjO'. + 'HSBkr7eEFDAEngHrQCf+/s2A8cSiSkqcKUeeTjwFy2Jd78t3+L'. + 'TR4itIiBLwLQhzkJyB5Cx4HXDaENVQCBAQcRqFIHTRaBIvuYXg'. + 'AdsouuNxEL0ZUBHnSQp66R73zYfUtQ6OytKT8RckQAJQoLtgO5'. + 'BJgj0D/WfgdyHaAHx8THoUcbGx8ciwhUl3bDEiToURPooeI7pH'. + 'MziK9Yd9nU5a6GgKjOH41vsgI4hAcyC5AZkapF+AoYNrjjsuhx'. + 'FbtPmeB5ykyQQzTPAWAQWC8S9oAI0QRRuPb9jkmyMZNAOTklvC'. + 'GGYZaFkGmkVAh8h4DtKFMIBunG+pB5B5AIkGBDsQ+qBiL20caj'. + 'zhJknq5KlgMkLjJHJos4kYEbFJi5vc5eYbATVN02bNWe19+32t'. + 'aJWlFm3wbf8Rz5NbDFJdlOFBF/g7cBf0JkrbBb+F6j1DOduEkU'. + '8bWCOiSofPWadBnSZDWmgUkEMGhZCINut8S/0NBtPptFlZrBSu'. + 'vnt1+ndnflfIp9OJ/279Ubbbd+lP7KBKPoEBsgnqLph/BRzwdS'. + 'LnBUFvHcfdpRsGPAGqwMco6jynz+e0SPKYCHMfLX5VKHwcenR+'. + 'Igd1XTcqlUr+xn/cePv91fevzy8sLO2OtrOpWkqL7gXKSAVRdh'. + 'ZFEmEXoYkwBNqovoc/3GHH3aUR+jwC1oD/AWrANi4hGwyBzqEG'. + 'Vvb77Dgi0eT1VZzJZMxKpVJYXV1dXF1dXVm6sPSvruue3Xzcyj'. + '6/syvDzwj0lNazK6Fj5LFCRZouZpBABj6jXouu3+Np6HNvDHaf'. + 'g91t74msbMuOJicnSSaTKKUQEUQEpRSO69But1/dB0VEm5uby9'. + 'y4cWNpdXX1+sLCworrume//PuXpeqnVeOban0U1PW2kcx+O9L7'. + 'Te9sUB4lWFR9SqNtNGcHx+/RDD2+Am4D94CnQA8OjjlEhMnyJC'. + 'srK8zOzu7BiYioMAzZ2Njg9u3brwIqpSSXy2WXl5eXLly4sOo4'. + 'zoV6vV6oflrVP/7Tx8Hmw1Zb6ydqmpWp7ha8h4O3gjOhzVANmF'. + 'XPMNQWvdDnCXCXuHR+APqH4fbCtm2mp6eZn59H13WJuYXRaKSU'. + 'UiSTyVcBdV3XDcOwRaTU7/en19bWCn/79G+JL/76RbhZ22y7u+'. + '6ahl71nPDz/nO17m7wAxlabFOihy4+DvAcqAMbPzZ3OFzX5dmz'. + 'Z2iahoiosUUVhiGNRgPHcV4GzGQy5uLiYuH8+fMzo9FoslarJW'. + '9+elP75E+fBJu1zY7qqpqBUW3T/niohnVvy+1zm5aVtp+WE2XT'. + 'nrHFzbjh1tYLz3XdPjD4R3BKKba2tqhWq4dzUO3noBPn4H5PKy'. + 'LaO++8U7hx48byhQsXVne7u6tf3/v64t3P7mbq9+odt+OuaWi3'. + 'PLxbW2ytubjbQCgiMnt6VlaurWgz0zM0m02q1WrUaDSUUuqI56'. + 'ivDxE5MCgiYllWtlwuL5mmufLV/a/O/uXPf9Ff1F+80Lv6Yx29'. + '2qHzyZBh3cdvc7gaTZuZkzPh/Py8ACqVSv1/uPZDKXUAGEWRtF'. + 'qtxEcffZTL5XLF+2v39fqjeivshA/TpP83JLwzYFBzcA4370Cc'. + 'S81nTRBUs9lkOByi1GuOPI4Rh3+26JZlnSkWi781DOPXvV4v3+'. + '/2G0R8kSBxB/jew+tERK+c49m2TblcxrZtXNfl+fPneJ6HZVmU'. + 'y2VJJpNyaJ9TSinlOA5bW1u4rntkQA0oAG8D54gb9W3ianxM3A'. + 'e/cn73U3Hq1Cm5du2aPjs7a+ztcSIShmE4ajQa6tatWzQajZ+0'. + 'fbiKI+It4SvijVUj7kL2qvGfgkskEqTTaZmcnDROnTplJhIJTU'. + 'QiwPd9P/Q8T6XTaQzDIAiCfzjP/wFVfszuFqdHXgAAAABJRU5E'. + 'rkJggg==' ; -//========================================================== -// File: pp_red.png -//========================================================== - $this->imgdata_small[0][0]= 384 ; - $this->imgdata_small[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wMJFhouFobZrQAAAQ1JREFUeJyV1dFtwyAQBuD/og'. - 'xQdYxa8gRY6hJ0jK6QdohMkTEuE5wUj5ERen05IoLvID7Jkn2G'. - 'j8MgTMyMXqRlUQBYq9ydmaL2h1cwqD7l30t+L1iwlbYFRegY7I'. - 'SHjkEifGg4ww3aBa/l4+9AhxWWr/dLhEunXUGHq6yGniw3QkOw'. - '3jJ7UBd82n/VVAlAtvsfp98lAj2sAJOhU4AeQ7DC1ubVBODWDJ'. - 'TtCsEWa6u5M1NeFs1NzgdtuhHGtj+9Q2IDppQUAL6Cyrlz0gDN'. - 'ohSMiJCt861672EiAhEhESG3woJ9V9OKTkwRKbdqz4cHmFLSFg'. - 's69+LvAZKdeZ/n89uLnd2g0S+gjd5g8zzjH5Y/eLLi+NPEAAAA'. - 'AElFTkSuQmCC' ; + //========================================================== + // File: pp_red.png + //========================================================== + $this->imgdata_small[0][0]= 384 ; + $this->imgdata_small[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhouFobZrQAAAQ1JREFUeJyV1dFtwyAQBuD/og'. + 'xQdYxa8gRY6hJ0jK6QdohMkTEuE5wUj5ERen05IoLvID7Jkn2G'. + 'j8MgTMyMXqRlUQBYq9ydmaL2h1cwqD7l30t+L1iwlbYFRegY7I'. + 'SHjkEifGg4ww3aBa/l4+9AhxWWr/dLhEunXUGHq6yGniw3QkOw'. + '3jJ7UBd82n/VVAlAtvsfp98lAj2sAJOhU4AeQ7DC1ubVBODWDJ'. + 'TtCsEWa6u5M1NeFs1NzgdtuhHGtj+9Q2IDppQUAL6Cyrlz0gDN'. + 'ohSMiJCt861672EiAhEhESG3woJ9V9OKTkwRKbdqz4cHmFLSFg'. + 's69+LvAZKdeZ/n89uLnd2g0S+gjd5g8zzjH5Y/eLLi+NPEAAAA'. + 'AElFTkSuQmCC' ; -//========================================================== -// File: pp_orange.png -//========================================================== - $this->imgdata_small[1][0]= 403 ; - $this->imgdata_small[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wMJFhwAnApz5AAAASBJREFUeJyN1dFthDAMBuDf7S'. - '3BCm2VCRKpS4QxbhikW6IewzcBqm6Fm6JyH7iEEByCn5AJH38g'. - 'BBIRHNUzBAWAGNfe/SrUGv92CtNt309BrfFdMGPjvt9CD8Fyml'. - 'ZZaDchRgA/59FDMD18pvNoNyHxMnUmgLmPHoJ+CqqfMaNAH22C'. - 'fgqKRwR+GRpxGjXBEiuXDBWQhTK3plxijyWWvtKVS5KNG1xM8I'. - 'OBr7geV1WupDqpmTAPKjCqLhxk/z0PImQmjKrAuI6vMXlhFroD'. - 'vfdqITXWqg2YMSJEAFcReoag6UXU2DzPG8w5t09YYsAyLWvHrL'. - 'HUy6D3XmvMAAhAay8kAJpBosX4vt0G4+4Jam6s6Rz1fgFG0ncA'. - 'f3XfOQcA+Acv5IUSdQw9hgAAAABJRU5ErkJggg==' ; + //========================================================== + // File: pp_orange.png + //========================================================== + $this->imgdata_small[1][0]= 403 ; + $this->imgdata_small[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhwAnApz5AAAASBJREFUeJyN1dFthDAMBuDf7S'. + '3BCm2VCRKpS4QxbhikW6IewzcBqm6Fm6JyH7iEEByCn5AJH38g'. + 'BBIRHNUzBAWAGNfe/SrUGv92CtNt309BrfFdMGPjvt9CD8Fyml'. + 'ZZaDchRgA/59FDMD18pvNoNyHxMnUmgLmPHoJ+CqqfMaNAH22C'. + 'fgqKRwR+GRpxGjXBEiuXDBWQhTK3plxijyWWvtKVS5KNG1xM8I'. + 'OBr7geV1WupDqpmTAPKjCqLhxk/z0PImQmjKrAuI6vMXlhFroD'. + 'vfdqITXWqg2YMSJEAFcReoag6UXU2DzPG8w5t09YYsAyLWvHrL'. + 'HUy6D3XmvMAAhAay8kAJpBosX4vt0G4+4Jam6s6Rz1fgFG0ncA'. + 'f3XfOQcA+Acv5IUSdQw9hgAAAABJRU5ErkJggg==' ; -//========================================================== -// File: pp_pink.png -//========================================================== - $this->imgdata_small[2][0]= 419 ; - $this->imgdata_small[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wMJFhsQzvz1RwAAATBJREFUeJyd1MFthDAQheF/oi'. - 'gF+JYWQKICkCJRA1vGtrDbxFbhGvY0HVjCLeS2BeTiHFgTB2wg'. - 'eRISstCnmcG2qCpbuXf3ADBQzWsPfZfS9y9HsEu4/Fo33Wf4Fx'. - 'gxL3a1XkI3wbTNXHLoboVeLFUYDqObYBy+Fw/Uh9DdCmtOwIjF'. - 'YvG76CZoOhNGRmpO8zz30CJoOhMAqlDxFzQLppgXj2XaNlP7FF'. - 'GLL7ccMYCBgZERgCvXLBrfi2DEclmiKZwFY4tp6sW26bVfnede'. - 'e5Hc5dC2bUgrXGKqWrwcXnNYDjmCrcCIiQgDcFYV05kQ8SXmnB'. - 'NgPiVN06wrTDGAhz5EWY/FOccTk+cTnHM/YNu2YYllgFxCWuUM'. - 'ikzGx+2Gc+4N+CoJW8n+5a2UKm2aBoBvGA6L7wfl8aoAAAAASU'. - 'VORK5CYII=' ; + //========================================================== + // File: pp_pink.png + //========================================================== + $this->imgdata_small[2][0]= 419 ; + $this->imgdata_small[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhsQzvz1RwAAATBJREFUeJyd1MFthDAQheF/oi'. + 'gF+JYWQKICkCJRA1vGtrDbxFbhGvY0HVjCLeS2BeTiHFgTB2wg'. + 'eRISstCnmcG2qCpbuXf3ADBQzWsPfZfS9y9HsEu4/Fo33Wf4Fx'. + 'gxL3a1XkI3wbTNXHLoboVeLFUYDqObYBy+Fw/Uh9DdCmtOwIjF'. + 'YvG76CZoOhNGRmpO8zz30CJoOhMAqlDxFzQLppgXj2XaNlP7FF'. + 'GLL7ccMYCBgZERgCvXLBrfi2DEclmiKZwFY4tp6sW26bVfnede'. + 'e5Hc5dC2bUgrXGKqWrwcXnNYDjmCrcCIiQgDcFYV05kQ8SXmnB'. + 'NgPiVN06wrTDGAhz5EWY/FOccTk+cTnHM/YNu2YYllgFxCWuUM'. + 'ikzGx+2Gc+4N+CoJW8n+5a2UKm2aBoBvGA6L7wfl8aoAAAAASU'. + 'VORK5CYII=' ; -//========================================================== -// File: pp_blue.png -//========================================================== - $this->imgdata_small[3][0]= 883 ; - $this->imgdata_small[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAACi1'. - 'BMVEX///8AAAAAADMAAGYAAJkAAMwAAP8zAAAzADMzAGYzAJkz'. - 'AMwzAP9mAABmADNmAGZmAJlmAMxmAP+ZAACZADOZAGaZAJmZAM'. - 'yZAP/MAADMADPMAGbMAJnMAMzMAP//AAD/ADP/AGb/AJn/AMz/'. - 'AP8AMwAAMzMAM2YAM5kAM8wAM/8zMwAzMzMzM2YzM5kzM8wzM/'. - '9mMwBmMzNmM2ZmM5lmM8xmM/+ZMwCZMzOZM2aZM5mZM8yZM//M'. - 'MwDMMzPMM2bMM5nMM8zMM///MwD/MzP/M2b/M5n/M8z/M/8AZg'. - 'AAZjMAZmYAZpkAZswAZv8zZgAzZjMzZmYzZpkzZswzZv9mZgBm'. - 'ZjNmZmZmZplmZsxmZv+ZZgCZZjOZZmaZZpmZZsyZZv/MZgDMZj'. - 'PMZmbMZpnMZszMZv//ZgD/ZjP/Zmb/Zpn/Zsz/Zv8AmQAAmTMA'. - 'mWYAmZkAmcwAmf8zmQAzmTMzmWYzmZkzmcwzmf9mmQBmmTNmmW'. - 'ZmmZlmmcxmmf+ZmQCZmTOZmWaZmZmZmcyZmf/MmQDMmTPMmWbM'. - 'mZnMmczMmf//mQD/mTP/mWb/mZn/mcz/mf8AzAAAzDMAzGYAzJ'. - 'kAzMwAzP8zzAAzzDMzzGYzzJkzzMwzzP9mzABmzDNmzGZmzJlm'. - 'zMxmzP+ZzACZzDOZzGaZzJmZzMyZzP/MzADMzDPMzGbMzJnMzM'. - 'zMzP//zAD/zDP/zGb/zJn/zMz/zP8A/wAA/zMA/2YA/5kA/8wA'. - '//8z/wAz/zMz/2Yz/5kz/8wz//9m/wBm/zNm/2Zm/5lm/8xm//'. - '+Z/wCZ/zOZ/2aZ/5mZ/8yZ///M/wDM/zPM/2bM/5nM/8zM////'. - '/wD//zP//2b//5n//8z///9jJVUgAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAwkWGTNerea3AAAAYUlEQVR4nHXNwQ3AIAxDUUfyoROxRZ'. - 'icARin0EBTIP3Hp1gBRqSqYo0seqjZpnngojlWBir5+b8o06lM'. - 'ha5uFKEpDZulV8l52axhVzqaCdxQp32qVSSwC1wN3fYiw7b76w'. - 'bN4SMue4/KbwAAAABJRU5ErkJggg==' ; + //========================================================== + // File: pp_blue.png + //========================================================== + $this->imgdata_small[3][0]= 883 ; + $this->imgdata_small[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAACi1'. + 'BMVEX///8AAAAAADMAAGYAAJkAAMwAAP8zAAAzADMzAGYzAJkz'. + 'AMwzAP9mAABmADNmAGZmAJlmAMxmAP+ZAACZADOZAGaZAJmZAM'. + 'yZAP/MAADMADPMAGbMAJnMAMzMAP//AAD/ADP/AGb/AJn/AMz/'. + 'AP8AMwAAMzMAM2YAM5kAM8wAM/8zMwAzMzMzM2YzM5kzM8wzM/'. + '9mMwBmMzNmM2ZmM5lmM8xmM/+ZMwCZMzOZM2aZM5mZM8yZM//M'. + 'MwDMMzPMM2bMM5nMM8zMM///MwD/MzP/M2b/M5n/M8z/M/8AZg'. + 'AAZjMAZmYAZpkAZswAZv8zZgAzZjMzZmYzZpkzZswzZv9mZgBm'. + 'ZjNmZmZmZplmZsxmZv+ZZgCZZjOZZmaZZpmZZsyZZv/MZgDMZj'. + 'PMZmbMZpnMZszMZv//ZgD/ZjP/Zmb/Zpn/Zsz/Zv8AmQAAmTMA'. + 'mWYAmZkAmcwAmf8zmQAzmTMzmWYzmZkzmcwzmf9mmQBmmTNmmW'. + 'ZmmZlmmcxmmf+ZmQCZmTOZmWaZmZmZmcyZmf/MmQDMmTPMmWbM'. + 'mZnMmczMmf//mQD/mTP/mWb/mZn/mcz/mf8AzAAAzDMAzGYAzJ'. + 'kAzMwAzP8zzAAzzDMzzGYzzJkzzMwzzP9mzABmzDNmzGZmzJlm'. + 'zMxmzP+ZzACZzDOZzGaZzJmZzMyZzP/MzADMzDPMzGbMzJnMzM'. + 'zMzP//zAD/zDP/zGb/zJn/zMz/zP8A/wAA/zMA/2YA/5kA/8wA'. + '//8z/wAz/zMz/2Yz/5kz/8wz//9m/wBm/zNm/2Zm/5lm/8xm//'. + '+Z/wCZ/zOZ/2aZ/5mZ/8yZ///M/wDM/zPM/2bM/5nM/8zM////'. + '/wD//zP//2b//5n//8z///9jJVUgAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAwkWGTNerea3AAAAYUlEQVR4nHXNwQ3AIAxDUUfyoROxRZ'. + 'icARin0EBTIP3Hp1gBRqSqYo0seqjZpnngojlWBir5+b8o06lM'. + 'ha5uFKEpDZulV8l52axhVzqaCdxQp32qVSSwC1wN3fYiw7b76w'. + 'bN4SMue4/KbwAAAABJRU5ErkJggg==' ; -//========================================================== -// File: pp_green.png -//========================================================== - $this->imgdata_small[4][0]= 447 ; - $this->imgdata_small[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wMJFhkLdq9eKQAAAUxJREFUeJyN1LFVwzAQxvH/8f'. - 'IeDS0FLKABlN6eIwPYAzCHB0gWYI2jj+i1ABUTQN4TRSQ7iiWZ'. - 'qxLn9Mt9ydmiqrSq930AYFiu6YdKrf/hP1gYQn6960PxwBaYMG'. - 'E9UA3dBFtVQjdBOQmBakLennK0CapRwbZRZ3N0O/IeEsqp3HKL'. - 'Smtt5pUZgTPg4gdDud+6xoS97wM2rsxxmRSoTgoVcMZsXJkBho'. - 'SmKqCuOuEtls6nmGMFPTUmxBKx/MeyNfQGLoOOiC2ddsxb1Kzv'. - 'ZzUqu5IXbGDvBJf+hDisi77qFSuhq7Xpuu66TyJLRGbsXVUPxV'. - 'SxsgkzDMt0mKT3/RcjL8C5hHnvJToXY0xYRZ4xnVKsV/S+a8YA'. - 'AvCb3s9g13UhYj+TTo93B3fApRV1FVlEAD6H42DjN9/WvzDYuJ'. - 'dL5b1/ji+/IX8EGWP4AwRii8PdFHTqAAAAAElFTkSuQmCC' ; + //========================================================== + // File: pp_green.png + //========================================================== + $this->imgdata_small[4][0]= 447 ; + $this->imgdata_small[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhkLdq9eKQAAAUxJREFUeJyN1LFVwzAQxvH/8f'. + 'IeDS0FLKABlN6eIwPYAzCHB0gWYI2jj+i1ABUTQN4TRSQ7iiWZ'. + 'qxLn9Mt9ydmiqrSq930AYFiu6YdKrf/hP1gYQn6960PxwBaYMG'. + 'E9UA3dBFtVQjdBOQmBakLennK0CapRwbZRZ3N0O/IeEsqp3HKL'. + 'Smtt5pUZgTPg4gdDud+6xoS97wM2rsxxmRSoTgoVcMZsXJkBho'. + 'SmKqCuOuEtls6nmGMFPTUmxBKx/MeyNfQGLoOOiC2ddsxb1Kzv'. + 'ZzUqu5IXbGDvBJf+hDisi77qFSuhq7Xpuu66TyJLRGbsXVUPxV'. + 'SxsgkzDMt0mKT3/RcjL8C5hHnvJToXY0xYRZ4xnVKsV/S+a8YA'. + 'AvCb3s9g13UhYj+TTo93B3fApRV1FVlEAD6H42DjN9/WvzDYuJ'. + 'dL5b1/ji+/IX8EGWP4AwRii8PdFHTqAAAAAElFTkSuQmCC' ; } } diff --git a/libs/jpgraph/imgdata_squares.inc.php b/libs/jpgraph/imgdata_squares.inc.php index 3c0a977..b17faf0 100644 --- a/libs/jpgraph/imgdata_squares.inc.php +++ b/libs/jpgraph/imgdata_squares.inc.php @@ -1,9 +1,9 @@ 'imgdata'); - - protected $colors = array('bluegreen','blue','green', - 'lightblue','orange','purple','red','yellow'); - protected $index = array('bluegreen' =>2,'blue'=>5,'green'=>6, - 'lightblue'=>0,'orange'=>7,'purple'=>4,'red'=>3,'yellow'=>1); + + protected $colors = array('bluegreen','blue','green', + 'lightblue','orange','purple','red','yellow'); + protected $index = array('bluegreen' =>2,'blue'=>5,'green'=>6, + 'lightblue'=>0,'orange'=>7,'purple'=>4,'red'=>3,'yellow'=>1); protected $maxidx = 7 ; protected $imgdata ; function ImgData_Squares () { -//========================================================== -//sq_lblue.png -//========================================================== - $this->imgdata[0][0]= 362 ; - $this->imgdata[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFgojiPx/ygAAAPdJREFUeNpj/P377+kzHx89/c'. - 'VAHNBQ5VBX52HavPWWjg6nnDQbkXoUFTnnL7zD9PPXrz17HxCj'. - 'E6Jn6fL7H7/+ZWJgYCBGJ7IeBgYGJogofp1oehDa8OjE1IOiDa'. - 'tOrHoYGBhY0NwD0enirMDAwMDFxYRVD7ptyDrNTAU0NXix6sGu'. - 'jYGBgZOT9e/f/0xMjFyczFgVsGAKCfBza2kKzpl3hIuT1c9Xb/'. - 'PW58/foKchJqx6tmy98vbjj8cvPm/afMnXW1JShA2fNmQ9EBFc'. - 'Opnw6MGjkwm/Hlw6mQjqwaqTiRg9mDoZv//4M2/+UYJ64EBWgj'. - 'cm2hwA8l24oNDl+DMAAAAASUVORK5CYII=' ; + //========================================================== + //sq_lblue.png + //========================================================== + $this->imgdata[0][0]= 362 ; + $this->imgdata[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFgojiPx/ygAAAPdJREFUeNpj/P377+kzHx89/c'. + 'VAHNBQ5VBX52HavPWWjg6nnDQbkXoUFTnnL7zD9PPXrz17HxCj'. + 'E6Jn6fL7H7/+ZWJgYCBGJ7IeBgYGJogofp1oehDa8OjE1IOiDa'. + 'tOrHoYGBhY0NwD0enirMDAwMDFxYRVD7ptyDrNTAU0NXix6sGu'. + 'jYGBgZOT9e/f/0xMjFyczFgVsGAKCfBza2kKzpl3hIuT1c9Xb/'. + 'PW58/foKchJqx6tmy98vbjj8cvPm/afMnXW1JShA2fNmQ9EBFc'. + 'Opnw6MGjkwm/Hlw6mQjqwaqTiRg9mDoZv//4M2/+UYJ64EBWgj'. + 'cm2hwA8l24oNDl+DMAAAAASUVORK5CYII=' ; -//========================================================== -//sq_yellow.png -//========================================================== - $this->imgdata[1][0]= 338 ; - $this->imgdata[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAWl'. - 'BMVEX////+/+H+/9/9/9v8/8P8/8H8/7v8/7n6/4P5/335/3n5'. - '/3X4/1f4/1P3/031/w30/wn0/wPt+ADp9ADm8ADk7gDc5gDa5A'. - 'DL1ADFzgCwuACqsgClrABzeAC9M0MzAAAAAWJLR0QAiAUdSAAA'. - 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEDlOgDj'. - 'EAAAB+SURBVHjaVcpbCsQgDEDRGERGKopjDa2a/W9zfLWj9/Nw'. - 'Ac21ZRBOtZlRN9ApzSYFaDUj79KIorRDbJNO9bN/GUSh2ZRJFJ'. - 'S18iorURBiyksO8buT0zkfYaUqzI91ckfhWhoGXTLzsDjI68Sz'. - 'pGMjrzPzauA/iXk1AtykmvgBC8UcWUdc9HkAAAAASUVORK5CYI'. - 'I=' ; + //========================================================== + //sq_yellow.png + //========================================================== + $this->imgdata[1][0]= 338 ; + $this->imgdata[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAWl'. + 'BMVEX////+/+H+/9/9/9v8/8P8/8H8/7v8/7n6/4P5/335/3n5'. + '/3X4/1f4/1P3/031/w30/wn0/wPt+ADp9ADm8ADk7gDc5gDa5A'. + 'DL1ADFzgCwuACqsgClrABzeAC9M0MzAAAAAWJLR0QAiAUdSAAA'. + 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEDlOgDj'. + 'EAAAB+SURBVHjaVcpbCsQgDEDRGERGKopjDa2a/W9zfLWj9/Nw'. + 'Ac21ZRBOtZlRN9ApzSYFaDUj79KIorRDbJNO9bN/GUSh2ZRJFJ'. + 'S18iorURBiyksO8buT0zkfYaUqzI91ckfhWhoGXTLzsDjI68Sz'. + 'pGMjrzPzauA/iXk1AtykmvgBC8UcWUdc9HkAAAAASUVORK5CYI'. + 'I=' ; -//========================================================== -//sq_blgr.png -//========================================================== - $this->imgdata[2][0]= 347 ; - $this->imgdata[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAZl'. - 'BMVEX////0+vv0+vrz+fry+frv+Png7e/d7e/a6+zY6+250tSz'. - '0tSyztCtztGM0NWIz9SDzdNfsLVcrrRZrbJOp61MpqtIr7dHn6'. - 'RErrZArLQ6q7M2g4kygYcsp68npa4ctr8QZ20JnqepKsl4AAAA'. - 'AWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU'. - '1FB9MDCxYEByp8tpUAAAB7SURBVHjaVcjRFoIgDADQWZpWJpjY'. - 'MsnG//9kzIFn3McLzfArDA3MndFjrhvgfDHFBEB9pt0CVzwrY3'. - 'n2yicjhY4vTSp0nbXtN+hCV53SHDWe61dZY+/9463r2XuifHAM'. - '0SoH+6xEcovUlCfefeFSIwfTTQ3fB+pi4lV/bTIgvmaA7a0AAA'. - 'AASUVORK5CYII=' ; + //========================================================== + //sq_blgr.png + //========================================================== + $this->imgdata[2][0]= 347 ; + $this->imgdata[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAZl'. + 'BMVEX////0+vv0+vrz+fry+frv+Png7e/d7e/a6+zY6+250tSz'. + '0tSyztCtztGM0NWIz9SDzdNfsLVcrrRZrbJOp61MpqtIr7dHn6'. + 'RErrZArLQ6q7M2g4kygYcsp68npa4ctr8QZ20JnqepKsl4AAAA'. + 'AWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU'. + '1FB9MDCxYEByp8tpUAAAB7SURBVHjaVcjRFoIgDADQWZpWJpjY'. + 'MsnG//9kzIFn3McLzfArDA3MndFjrhvgfDHFBEB9pt0CVzwrY3'. + 'n2yicjhY4vTSp0nbXtN+hCV53SHDWe61dZY+/9463r2XuifHAM'. + '0SoH+6xEcovUlCfefeFSIwfTTQ3fB+pi4lV/bTIgvmaA7a0AAA'. + 'AASUVORK5CYII=' ; -//========================================================== -//sq_red.png -//========================================================== - $this->imgdata[3][0]= 324 ; - $this->imgdata[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. - 'BMVEX////++Pn99/j99ff99fb98/X98/T98PL55uj43+P24+bw'. - 'kKPvjaHviJ3teJHpxMnoL2Pjs73WW3rWNljVWXnUVnbUK1DTJk'. - '3SUHPOBz/KQmmxPVmuOFasNFOeIkWVka/fAAAAAWJLR0QAiAUd'. - 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEHd'. - 'ceT+8AAABtSURBVHjaVchbAkMwEAXQq6i3VrQiQfa/zDYTw8z5'. - 'PCjGt9JVWFt1XWPh1fWNdfDy+tq6WPfRUPENNKnSnXNWPB4uv2'. - 'b54nSZ8jHrMtOxvWZZZtpD4KP6xLkO9/AhzhaCOMhJh68cOjzV'. - '/K/4Ac2cG+nBcaRuAAAAAElFTkSuQmCC' ; + //========================================================== + //sq_red.png + //========================================================== + $this->imgdata[3][0]= 324 ; + $this->imgdata[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. + 'BMVEX////++Pn99/j99ff99fb98/X98/T98PL55uj43+P24+bw'. + 'kKPvjaHviJ3teJHpxMnoL2Pjs73WW3rWNljVWXnUVnbUK1DTJk'. + '3SUHPOBz/KQmmxPVmuOFasNFOeIkWVka/fAAAAAWJLR0QAiAUd'. + 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEHd'. + 'ceT+8AAABtSURBVHjaVchbAkMwEAXQq6i3VrQiQfa/zDYTw8z5'. + 'PCjGt9JVWFt1XWPh1fWNdfDy+tq6WPfRUPENNKnSnXNWPB4uv2'. + 'b54nSZ8jHrMtOxvWZZZtpD4KP6xLkO9/AhzhaCOMhJh68cOjzV'. + '/K/4Ac2cG+nBcaRuAAAAAElFTkSuQmCC' ; -//========================================================== -//sq_pink.png -//========================================================== - $this->imgdata[4][0]= 445 ; - $this->imgdata[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAApV'. - 'BMVEX////6+Pz69/v49Pr38/r17/jr4+/l3Onj2efh1ua/L+i+'. - 'q8m+Lue9Lua8qsS8LuW8LeS7pca5LOG4LN+2Y9O2YNW1ZdO1Kt'. - 'y0atC0aNGzb82zbc6zKtuzKdqycsuwa8qtJtOISZ2GRpuFN6GE'. - 'NqCDQpmCMZ+BPpd/LJ1/K519S5B9Jpx9Jpt9JZt6RY11BJZ1BJ'. - 'V0BJV0BJRzBJNvNoRtIoJUEmdZ/XbrAAAAAWJLR0QAiAUdSAAA'. - 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYDF3iKMD'. - 'YAAACeSURBVHjaVczbEoIgGARgCiMtrexoWpaa2FHUgvd/tH4Y'. - 'BnEvv9ldhNPradPnnGBUTtPDzMRPSIF46SaBoR25dYjz3I20Lb'. - 'ek6BgQz73Il7KKpSgCO0pTHU0886J1sCe0ZYbALjGhjFnEM2es'. - 'VhZVI4d+B1QtfnV47ywCEaKeP/p7JdLejSYt0j6NIiOq1wJZIs'. - 'QTDA0ELHwhPBCwyR/Cni9cOmzJtwAAAABJRU5ErkJggg==' ; + //========================================================== + //sq_pink.png + //========================================================== + $this->imgdata[4][0]= 445 ; + $this->imgdata[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAApV'. + 'BMVEX////6+Pz69/v49Pr38/r17/jr4+/l3Onj2efh1ua/L+i+'. + 'q8m+Lue9Lua8qsS8LuW8LeS7pca5LOG4LN+2Y9O2YNW1ZdO1Kt'. + 'y0atC0aNGzb82zbc6zKtuzKdqycsuwa8qtJtOISZ2GRpuFN6GE'. + 'NqCDQpmCMZ+BPpd/LJ1/K519S5B9Jpx9Jpt9JZt6RY11BJZ1BJ'. + 'V0BJV0BJRzBJNvNoRtIoJUEmdZ/XbrAAAAAWJLR0QAiAUdSAAA'. + 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYDF3iKMD'. + 'YAAACeSURBVHjaVczbEoIgGARgCiMtrexoWpaa2FHUgvd/tH4Y'. + 'BnEvv9ldhNPradPnnGBUTtPDzMRPSIF46SaBoR25dYjz3I20Lb'. + 'ek6BgQz73Il7KKpSgCO0pTHU0886J1sCe0ZYbALjGhjFnEM2es'. + 'VhZVI4d+B1QtfnV47ywCEaKeP/p7JdLejSYt0j6NIiOq1wJZIs'. + 'QTDA0ELHwhPBCwyR/Cni9cOmzJtwAAAABJRU5ErkJggg==' ; -//========================================================== -//sq_blue.png -//========================================================== - $this->imgdata[5][0]= 283 ; - $this->imgdata[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAQl'. - 'BMVEX////4+fz39/z19vvy8vru7/ni4+7g4fHW1ue8vteXmt6B'. - 'hdhiZ7FQVaZETcxCSJo1Oq4zNoMjKakhJHcKFaMEC2jRVYdWAA'. - 'AAAWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0'. - 'SU1FB9MDCxYDN0PkEP4AAABfSURBVHjaVchHAoAgDATAVcCCIF'. - 'j4/1elJEjmOFDHKVgDv4iz640gLs+LMF6ZUv/VqcXXplU7Gqpy'. - 'PFzBT5qml9NzlOX259riWHlS4kOffviHD8PQYZx2EFMPRkw+9Q'. - 'FSnRPeWEDzKAAAAABJRU5ErkJggg==' ; + //========================================================== + //sq_blue.png + //========================================================== + $this->imgdata[5][0]= 283 ; + $this->imgdata[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAQl'. + 'BMVEX////4+fz39/z19vvy8vru7/ni4+7g4fHW1ue8vteXmt6B'. + 'hdhiZ7FQVaZETcxCSJo1Oq4zNoMjKakhJHcKFaMEC2jRVYdWAA'. + 'AAAWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0'. + 'SU1FB9MDCxYDN0PkEP4AAABfSURBVHjaVchHAoAgDATAVcCCIF'. + 'j4/1elJEjmOFDHKVgDv4iz640gLs+LMF6ZUv/VqcXXplU7Gqpy'. + 'PFzBT5qml9NzlOX259riWHlS4kOffviHD8PQYZx2EFMPRkw+9Q'. + 'FSnRPeWEDzKAAAAABJRU5ErkJggg==' ; -//========================================================== -//sq_green.png -//========================================================== - $this->imgdata[6][0]= 325 ; - $this->imgdata[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. - 'BMVEX////2+vX1+vX1+fT0+fPz+PPx9/Dv9u7u9e3h7uHe697a'. - '6dnO2s3I1sa10LOvza2ay5aEwYBWlE9TqE5Tkk1RkEpMrUJMg0'. - 'hKiUNGpEFBojw8oTcsbScaYBMWlwmMT0NtAAAAAWJLR0QAiAUd'. - 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEFd'. - 'nFx90AAABuSURBVHjaVc9HAoAgDADB2HuJWLDx/2cKBITscW4L'. - '5byzMIWtZobNDZIZtrcCGZsRQ8GwvRSRNxIiMuysODKG3alikl'. - 'ueOPlpKTLBaRmOZxQxaXlfb5ZWI9om4WntrXiDSJzp7SBkwMQa'. - 'FEy0VR/NAB2kNuj7rgAAAABJRU5ErkJggg==' ; + //========================================================== + //sq_green.png + //========================================================== + $this->imgdata[6][0]= 325 ; + $this->imgdata[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. + 'BMVEX////2+vX1+vX1+fT0+fPz+PPx9/Dv9u7u9e3h7uHe697a'. + '6dnO2s3I1sa10LOvza2ay5aEwYBWlE9TqE5Tkk1RkEpMrUJMg0'. + 'hKiUNGpEFBojw8oTcsbScaYBMWlwmMT0NtAAAAAWJLR0QAiAUd'. + 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEFd'. + 'nFx90AAABuSURBVHjaVc9HAoAgDADB2HuJWLDx/2cKBITscW4L'. + '5byzMIWtZobNDZIZtrcCGZsRQ8GwvRSRNxIiMuysODKG3alikl'. + 'ueOPlpKTLBaRmOZxQxaXlfb5ZWI9om4WntrXiDSJzp7SBkwMQa'. + 'FEy0VR/NAB2kNuj7rgAAAABJRU5ErkJggg==' ; -//========================================================== -//sq_orange.png -//========================================================== - $this->imgdata[7][0]= 321 ; - $this->imgdata[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAUV'. - 'BMVEX/////8+n/8uf/8OP/59H/5Mv/zqH/zJ3/ypv/yJf/vYH/'. - 'u33/uXn/n0n/nUX/m0H/lzn/ljf/lDP/kS3/kCv/iR//hxv/fg'. - 'n/fAX/eQDYZgDW6ia5AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAL'. - 'EgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEJIgbx+cAAAB2SURBVH'. - 'jaVczRCoQwDETRbLAWLZSGUA35/w/dVI0283i4DODew3YESmWW'. - 'kg5gWkoQAe6TleUQI/66Sy7i56+kLk7cht2N0+hcnJgQu0SqiC'. - '1SzSIbzWSi6gavqJ63wSduRi2f+kwyD5rEukwCdZ1kGAMGMfv9'. - 'AbWuGMOr5COSAAAAAElFTkSuQmCC' ; + //========================================================== + //sq_orange.png + //========================================================== + $this->imgdata[7][0]= 321 ; + $this->imgdata[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAUV'. + 'BMVEX/////8+n/8uf/8OP/59H/5Mv/zqH/zJ3/ypv/yJf/vYH/'. + 'u33/uXn/n0n/nUX/m0H/lzn/ljf/lDP/kS3/kCv/iR//hxv/fg'. + 'n/fAX/eQDYZgDW6ia5AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAL'. + 'EgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEJIgbx+cAAAB2SURBVH'. + 'jaVczRCoQwDETRbLAWLZSGUA35/w/dVI0283i4DODew3YESmWW'. + 'kg5gWkoQAe6TleUQI/66Sy7i56+kLk7cht2N0+hcnJgQu0SqiC'. + '1SzSIbzWSi6gavqJ63wSduRi2f+kwyD5rEukwCdZ1kGAMGMfv9'. + 'AbWuGMOr5COSAAAAAElFTkSuQmCC' ; } } diff --git a/libs/jpgraph/imgdata_stars.inc.php b/libs/jpgraph/imgdata_stars.inc.php index 43728c4..3c5f799 100644 --- a/libs/jpgraph/imgdata_stars.inc.php +++ b/libs/jpgraph/imgdata_stars.inc.php @@ -1,9 +1,9 @@ 'imgdata'); protected $colors = array('bluegreen','lightblue','purple','blue','green','pink','red','yellow'); - protected $index = array('bluegreen'=>3,'lightblue'=>4,'purple'=>1, - 'blue'=>5,'green'=>0,'pink'=>7,'red'=>2,'yellow'=>6); + protected $index = array('bluegreen'=>3,'lightblue'=>4,'purple'=>1, + 'blue'=>5,'green'=>0,'pink'=>7,'red'=>2,'yellow'=>6); protected $maxidx = 7 ; protected $imgdata ; - function ImgData_Stars() { -//========================================================== -// File: bstar_green_001.png -//========================================================== - $this->imgdata[0][0]= 329 ; - $this->imgdata[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAAUV'. - 'BMVEX///////+/v7+83rqcyY2Q/4R7/15y/1tp/05p/0lg/zdX'. - '/zdX/zVV/zdO/zFJ9TFJvDFD4yg+8Bw+3iU68hwurhYotxYosx'. - 'YokBoTfwANgQFUp7DWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. - 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJj'. - 'CRyxgTAAAAcUlEQVR4nH3MSw6AIAwEUBL/IKBWwXL/g0pLojUS'. - 'ZzGLl8ko9Zumhr5iy66/GH0dp49llNPB5sTotDY5PVuLG6tnM9'. - 'CVKSIe1joSgPsAKSuANNaENFQvTAGzmheSkUpMBWeJZwqBT8wo'. - 'hmysD4bnnPsC/x8ItUdGPfAAAAAASUVORK5CYII=' ; -//========================================================== -// File: bstar_blred.png -//========================================================== - $this->imgdata[1][0]= 325 ; - $this->imgdata[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v79uRJ6jWPOSUtKrb+ejWO+gWPaGTruJTr6rZvF2'. - 'RqC2ocqdVuCeV+egV/GsnLuIXL66rMSpcOyATbipY/OdWOp+VK'. - 'aTU9WhV+yJKBoLAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJwynv1'. - 'XVAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + function __construct() { + //========================================================== + // File: bstar_green_001.png + //========================================================== + $this->imgdata[0][0]= 329 ; + $this->imgdata[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAAUV'. + 'BMVEX///////+/v7+83rqcyY2Q/4R7/15y/1tp/05p/0lg/zdX'. + '/zdX/zVV/zdO/zFJ9TFJvDFD4yg+8Bw+3iU68hwurhYotxYosx'. + 'YokBoTfwANgQFUp7DWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJj'. + 'CRyxgTAAAAcUlEQVR4nH3MSw6AIAwEUBL/IKBWwXL/g0pLojUS'. + 'ZzGLl8ko9Zumhr5iy66/GH0dp49llNPB5sTotDY5PVuLG6tnM9'. + 'CVKSIe1joSgPsAKSuANNaENFQvTAGzmheSkUpMBWeJZwqBT8wo'. + 'hmysD4bnnPsC/x8ItUdGPfAAAAAASUVORK5CYII=' ; + //========================================================== + // File: bstar_blred.png + //========================================================== + $this->imgdata[1][0]= 325 ; + $this->imgdata[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79uRJ6jWPOSUtKrb+ejWO+gWPaGTruJTr6rZvF2'. + 'RqC2ocqdVuCeV+egV/GsnLuIXL66rMSpcOyATbipY/OdWOp+VK'. + 'aTU9WhV+yJKBoLAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJwynv1'. + 'XVAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bstar_red_001.png -//========================================================== - $this->imgdata[2][0]= 325 ; - $this->imgdata[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v7+eRFHzWG3SUmHnb37vWGr2WHG7Tlm+TljxZneg'. - 'Rk3KoaXgVmXnV2nxV227nJ++XGzErK3scIS4TVzzY3fqWG2mVF'. - 'zVU2PsV2rJFw9VAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJzCI0C'. - 'lSAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bstar_red_001.png + //========================================================== + $this->imgdata[2][0]= 325 ; + $this->imgdata[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+eRFHzWG3SUmHnb37vWGr2WHG7Tlm+TljxZneg'. + 'Rk3KoaXgVmXnV2nxV227nJ++XGzErK3scIS4TVzzY3fqWG2mVF'. + 'zVU2PsV2rJFw9VAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJzCI0C'. + 'lSAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bstar_blgr_001.png -//========================================================== - $this->imgdata[3][0]= 325 ; - $this->imgdata[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v79Ehp5Yx/NSq9Jvw+dYwu9YzfZOmbtOmb5myPFG'. - 'gqChvcpWteBXvedXxvGcsbtcpb6su8RwzOxNmrhjyvNYwupUjK'. - 'ZTr9VXwOyJhmWNAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJTC65k'. - 'vQAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bstar_blgr_001.png + //========================================================== + $this->imgdata[3][0]= 325 ; + $this->imgdata[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79Ehp5Yx/NSq9Jvw+dYwu9YzfZOmbtOmb5myPFG'. + 'gqChvcpWteBXvedXxvGcsbtcpb6su8RwzOxNmrhjyvNYwupUjK'. + 'ZTr9VXwOyJhmWNAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJTC65k'. + 'vQAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bstar_blgr_002.png -//========================================================== - $this->imgdata[4][0]= 325 ; - $this->imgdata[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v79EnpxY8/FS0dJv5+dY7+9Y9vBOubtOur5m8fFG'. - 'nKChycpW3uBX5+ZX8e2curtcvrqswsRw7OdNuLZj8/BY6udUpK'. - 'ZT1dRX7OtNkrW5AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJgXHeN'. - 'wwAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bstar_blgr_002.png + //========================================================== + $this->imgdata[4][0]= 325 ; + $this->imgdata[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79EnpxY8/FS0dJv5+dY7+9Y9vBOubtOur5m8fFG'. + 'nKChycpW3uBX5+ZX8e2curtcvrqswsRw7OdNuLZj8/BY6udUpK'. + 'ZT1dRX7OtNkrW5AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJgXHeN'. + 'wwAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bstar_blue_001.png -//========================================================== - $this->imgdata[5][0]= 325 ; - $this->imgdata[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v79EY55Yi/NSetJvledYiO9YkPZOb7tObr5mkvFG'. - 'X6ChrcpWgOBXhedXi/Gcpbtcf76sssRwnOxNcbhjk/NYiepUbK'. - 'ZTfdVXh+ynNEzzAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJhStyP'. - 'zCAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bstar_blue_001.png + //========================================================== + $this->imgdata[5][0]= 325 ; + $this->imgdata[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79EY55Yi/NSetJvledYiO9YkPZOb7tObr5mkvFG'. + 'X6ChrcpWgOBXhedXi/Gcpbtcf76sssRwnOxNcbhjk/NYiepUbK'. + 'ZTfdVXh+ynNEzzAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJhStyP'. + 'zCAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bstar_oy_007.png -//========================================================== - $this->imgdata[6][0]= 325 ; - $this->imgdata[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v7+ejUTz11jSvVLn02/v1lj21li7q06+r07x2mag'. - 'lUbKxKHgy1bnz1fx1Ve7t5y+qlzEwqzs03C4pE3z2WPqz1imml'. - 'TVv1Ps01dGRjeyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJjsGGc'. - 'GbAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bstar_oy_007.png + //========================================================== + $this->imgdata[6][0]= 325 ; + $this->imgdata[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+ejUTz11jSvVLn02/v1lj21li7q06+r07x2mag'. + 'lUbKxKHgy1bnz1fx1Ve7t5y+qlzEwqzs03C4pE3z2WPqz1imml'. + 'TVv1Ps01dGRjeyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJjsGGc'. + 'GbAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; -//========================================================== -// File: bstar_lred.png -//========================================================== - $this->imgdata[7][0]= 325 ; - $this->imgdata[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v7+eRJPzWN3SUr7nb9TvWNj2WOS7Tqi+TqnxZtyg'. - 'Ro/KocPgVsjnV9LxV927nLa+XLTErL7scN24TarzY9/qWNemVJ'. - 'jVU8LsV9VCwcc9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJxi9ZY'. - 'GoAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + //========================================================== + // File: bstar_lred.png + //========================================================== + $this->imgdata[7][0]= 325 ; + $this->imgdata[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+eRJPzWN3SUr7nb9TvWNj2WOS7Tqi+TqnxZtyg'. + 'Ro/KocPgVsjnV9LxV927nLa+XLTErL7scN24TarzY9/qWNemVJ'. + 'jVU8LsV9VCwcc9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJxi9ZY'. + 'GoAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; } } diff --git a/libs/jpgraph/jpg-config.inc.php b/libs/jpgraph/jpg-config.inc.php index dbf2726..c471d66 100644 --- a/libs/jpgraph/jpg-config.inc.php +++ b/libs/jpgraph/jpg-config.inc.php @@ -1,17 +1,16 @@ diff --git a/libs/jpgraph/jpgraph.php b/libs/jpgraph/jpgraph.php index 9626fac..f6d8929 100644 --- a/libs/jpgraph/jpgraph.php +++ b/libs/jpgraph/jpgraph.php @@ -1,9 +1,9 @@ Get(11,$file,$lineno); - die($msg); - } - else { - DEFINE('CACHE_DIR', $_SERVER['TEMP'] . '/'); - } - } else { - DEFINE('CACHE_DIR','/tmp/jpgraph_cache/'); - } + if ( strstr( PHP_OS, 'WIN') ) { + if( empty($_SERVER['TEMP']) ) { + $t = new ErrMsgText(); + $msg = $t->Get(11,$file,$lineno); + die($msg); + } + else { + define('CACHE_DIR', $_SERVER['TEMP'] . '/'); + } + } else { + define('CACHE_DIR','/tmp/jpgraph_cache/'); + } } } elseif( !defined('CACHE_DIR') ) { - DEFINE('CACHE_DIR', ''); + define('CACHE_DIR', ''); } +// +// Setup path for western/latin TTF fonts +// if (!defined('TTF_DIR')) { if (strstr( PHP_OS, 'WIN') ) { - $sroot = getenv('SystemRoot'); + $sroot = getenv('SystemRoot'); if( empty($sroot) ) { - $t = new ErrMsgText(); - $msg = $t->Get(12,$file,$lineno); - die($msg); + $t = new ErrMsgText(); + $msg = $t->Get(12,$file,$lineno); + die($msg); } - else { - DEFINE('TTF_DIR', $sroot.'/fonts/'); + else { + define('TTF_DIR', $sroot.'/fonts/'); } } else { - DEFINE('TTF_DIR','/usr/X11R6/lib/X11/fonts/truetype/'); + define('TTF_DIR','/usr/share/fonts/truetype/'); } } +// +// Setup path for MultiByte TTF fonts (japanese, chinese etc.) +// if (!defined('MBTTF_DIR')) { - DEFINE('MBTTF_DIR','/usr/share/fonts/ja/TrueType/'); + if (strstr( PHP_OS, 'WIN') ) { + $sroot = getenv('SystemRoot'); + if( empty($sroot) ) { + $t = new ErrMsgText(); + $msg = $t->Get(12,$file,$lineno); + die($msg); + } + else { + define('MBTTF_DIR', $sroot.'/fonts/'); + } + } else { + define('MBTTF_DIR','/usr/share/fonts/truetype/'); + } } -//------------------------------------------------------------------ -// Constants which are used as parameters for the method calls -//------------------------------------------------------------------ +// +// Check minimum PHP version +// +function CheckPHPVersion($aMinVersion) { + list($majorC, $minorC, $editC) = preg_split('/[\/.-]/', PHP_VERSION); + list($majorR, $minorR, $editR) = preg_split('/[\/.-]/', $aMinVersion); - -// Tick density -DEFINE("TICKD_DENSE",1); -DEFINE("TICKD_NORMAL",2); -DEFINE("TICKD_SPARSE",3); -DEFINE("TICKD_VERYSPARSE",4); - -// Side for ticks and labels. -DEFINE("SIDE_LEFT",-1); -DEFINE("SIDE_RIGHT",1); -DEFINE("SIDE_DOWN",-1); -DEFINE("SIDE_BOTTOM",-1); -DEFINE("SIDE_UP",1); -DEFINE("SIDE_TOP",1); - -// Legend type stacked vertical or horizontal -DEFINE("LEGEND_VERT",0); -DEFINE("LEGEND_HOR",1); - -// Mark types for plot marks -DEFINE("MARK_SQUARE",1); -DEFINE("MARK_UTRIANGLE",2); -DEFINE("MARK_DTRIANGLE",3); -DEFINE("MARK_DIAMOND",4); -DEFINE("MARK_CIRCLE",5); -DEFINE("MARK_FILLEDCIRCLE",6); -DEFINE("MARK_CROSS",7); -DEFINE("MARK_STAR",8); -DEFINE("MARK_X",9); -DEFINE("MARK_LEFTTRIANGLE",10); -DEFINE("MARK_RIGHTTRIANGLE",11); -DEFINE("MARK_FLASH",12); -DEFINE("MARK_IMG",13); -DEFINE("MARK_FLAG1",14); -DEFINE("MARK_FLAG2",15); -DEFINE("MARK_FLAG3",16); -DEFINE("MARK_FLAG4",17); - -// Builtin images -DEFINE("MARK_IMG_PUSHPIN",50); -DEFINE("MARK_IMG_SPUSHPIN",50); -DEFINE("MARK_IMG_LPUSHPIN",51); -DEFINE("MARK_IMG_DIAMOND",52); -DEFINE("MARK_IMG_SQUARE",53); -DEFINE("MARK_IMG_STAR",54); -DEFINE("MARK_IMG_BALL",55); -DEFINE("MARK_IMG_SBALL",55); -DEFINE("MARK_IMG_MBALL",56); -DEFINE("MARK_IMG_LBALL",57); -DEFINE("MARK_IMG_BEVEL",58); - -// Inline defines -DEFINE("INLINE_YES",1); -DEFINE("INLINE_NO",0); - -// Format for background images -DEFINE("BGIMG_FILLPLOT",1); -DEFINE("BGIMG_FILLFRAME",2); -DEFINE("BGIMG_COPY",3); -DEFINE("BGIMG_CENTER",4); - -// Depth of objects -DEFINE("DEPTH_BACK",0); -DEFINE("DEPTH_FRONT",1); - -// Direction -DEFINE("VERTICAL",1); -DEFINE("HORIZONTAL",0); - - -// Axis styles for scientific style axis -DEFINE('AXSTYLE_SIMPLE',1); -DEFINE('AXSTYLE_BOXIN',2); -DEFINE('AXSTYLE_BOXOUT',3); -DEFINE('AXSTYLE_YBOXIN',4); -DEFINE('AXSTYLE_YBOXOUT',5); - -// Style for title backgrounds -DEFINE('TITLEBKG_STYLE1',1); -DEFINE('TITLEBKG_STYLE2',2); -DEFINE('TITLEBKG_STYLE3',3); -DEFINE('TITLEBKG_FRAME_NONE',0); -DEFINE('TITLEBKG_FRAME_FULL',1); -DEFINE('TITLEBKG_FRAME_BOTTOM',2); -DEFINE('TITLEBKG_FRAME_BEVEL',3); -DEFINE('TITLEBKG_FILLSTYLE_HSTRIPED',1); -DEFINE('TITLEBKG_FILLSTYLE_VSTRIPED',2); -DEFINE('TITLEBKG_FILLSTYLE_SOLID',3); - -// Style for background gradient fills -DEFINE('BGRAD_FRAME',1); -DEFINE('BGRAD_MARGIN',2); -DEFINE('BGRAD_PLOT',3); - -// Width of tab titles -DEFINE('TABTITLE_WIDTHFIT',0); -DEFINE('TABTITLE_WIDTHFULL',-1); - -// Defines for 3D skew directions -DEFINE('SKEW3D_UP',0); -DEFINE('SKEW3D_DOWN',1); -DEFINE('SKEW3D_LEFT',2); -DEFINE('SKEW3D_RIGHT',3); - -// Line styles -DEFINE('LINESTYLE_SOLID',1); -DEFINE('LINESTYLE_DOTTED',2); -DEFINE('LINESTYLE_DASHED',3); -DEFINE('LINESTYLE_LONGDASH',4); - -// For internal use only -DEFINE("_JPG_DEBUG",false); -DEFINE("_FORCE_IMGTOFILE",false); -DEFINE("_FORCE_IMGDIR",'/tmp/jpgimg/'); - -require_once('gd_image.inc.php'); - -function CheckPHPVersion($aMinVersion) -{ - list($majorC, $minorC, $editC) = split('[/.-]', PHP_VERSION); - list($majorR, $minorR, $editR) = split('[/.-]', $aMinVersion); - if ($majorC != $majorR) return false; if ($majorC < $majorR) return false; - // same major - check ninor + // same major - check minor if ($minorC > $minorR) return true; if ($minorC < $minorR) return false; // and same minor @@ -210,13 +247,12 @@ if( !CheckPHPVersion(MIN_PHPVERSION) ) { die(); } - // // Make GD sanity check // if( !function_exists("imagetypes") || !function_exists('imagecreatefromstring') ) { JpGraphError::RaiseL(25001); -//("This PHP installation is not configured with the GD library. Please recompile PHP with GD support to run JpGraph. (Neither function imagetypes() nor imagecreatefromstring() does exist)"); + //("This PHP installation is not configured with the GD library. Please recompile PHP with GD support to run JpGraph. (Neither function imagetypes() nor imagecreatefromstring() does exist)"); } // @@ -225,7 +261,7 @@ if( !function_exists("imagetypes") || !function_exists('imagecreatefromstring') function _phpErrorHandler($errno,$errmsg,$filename, $linenum, $vars) { // Respect current error level if( $errno & error_reporting() ) { - JpGraphError::RaiseL(25003,basename($filename),$linenum,$errmsg); + JpGraphError::RaiseL(25003,basename($filename),$linenum,$errmsg); } } @@ -234,47 +270,48 @@ if( INSTALL_PHP_ERR_HANDLER ) { } // -//Check if there were any warnings, perhaps some wrong includes by the -//user +// Check if there were any warnings, perhaps some wrong includes by the user. In this +// case we raise it immediately since otherwise the image will not show and makes +// debugging difficult. This is controlled by the user setting CATCH_PHPERRMSG // -if( isset($GLOBALS['php_errormsg']) && CATCH_PHPERRMSG && - !preg_match('/|Deprecated|/i', $GLOBALS['php_errormsg']) ) { +if( isset($GLOBALS['php_errormsg']) && CATCH_PHPERRMSG && !preg_match('/|Deprecated|/i', $GLOBALS['php_errormsg']) ) { JpGraphError::RaiseL(25004,$GLOBALS['php_errormsg']); } - // Useful mathematical function function sign($a) {return $a >= 0 ? 1 : -1;} +// // Utility function to generate an image name based on the filename we // are running from and assuming we use auto detection of graphic format // (top level), i.e it is safe to call this function // from a script that uses JpGraph +// function GenImgName() { // Determine what format we should use when we save the images $supported = imagetypes(); - if( $supported & IMG_PNG ) $img_format="png"; + if( $supported & IMG_PNG ) $img_format="png"; elseif( $supported & IMG_GIF ) $img_format="gif"; elseif( $supported & IMG_JPG ) $img_format="jpeg"; elseif( $supported & IMG_WBMP ) $img_format="wbmp"; elseif( $supported & IMG_XPM ) $img_format="xpm"; - if( !isset($_SERVER['PHP_SELF']) ) - JpGraphError::RaiseL(25005); -//(" Can't access PHP_SELF, PHP global variable. You can't run PHP from command line if you want to use the 'auto' naming of cache or image files."); + if( !isset($_SERVER['PHP_SELF']) ) { + JpGraphError::RaiseL(25005); + //(" Can't access PHP_SELF, PHP global variable. You can't run PHP from command line if you want to use the 'auto' naming of cache or image files."); + } $fname = basename($_SERVER['PHP_SELF']); if( !empty($_SERVER['QUERY_STRING']) ) { - $q = @$_SERVER['QUERY_STRING']; - $fname .= '_'.preg_replace("/\W/", "_", $q).'.'.$img_format; + $q = @$_SERVER['QUERY_STRING']; + $fname .= '_'.preg_replace("/\W/", "_", $q).'.'.$img_format; } else { - $fname = substr($fname,0,strlen($fname)-4).'.'.$img_format; + $fname = substr($fname,0,strlen($fname)-4).'.'.$img_format; } return $fname; } - //=================================================== // CLASS JpgTimer // Description: General timing utility class to handle @@ -282,129 +319,119 @@ function GenImgName() { // timers can be started. //=================================================== class JpgTimer { - private $start, $idx; -//--------------- -// CONSTRUCTOR - function JpgTimer() { - $this->idx=0; - } + private $start, $idx; -//--------------- -// PUBLIC METHODS + function __construct() { + $this->idx=0; + } // Push a new timer start on stack function Push() { - list($ms,$s)=explode(" ",microtime()); - $this->start[$this->idx++]=floor($ms*1000) + 1000*$s; + list($ms,$s)=explode(" ",microtime()); + $this->start[$this->idx++]=floor($ms*1000) + 1000*$s; } // Pop the latest timer start and return the diff with the // current time function Pop() { - assert($this->idx>0); - list($ms,$s)=explode(" ",microtime()); - $etime=floor($ms*1000) + (1000*$s); - $this->idx--; - return $etime-$this->start[$this->idx]; + assert($this->idx>0); + list($ms,$s)=explode(" ",microtime()); + $etime=floor($ms*1000) + (1000*$s); + $this->idx--; + return $etime-$this->start[$this->idx]; } } // Class -$gJpgBrandTiming = BRAND_TIMING; //=================================================== // CLASS DateLocale // Description: Hold localized text used in dates //=================================================== class DateLocale { - + public $iLocale = 'C'; // environmental locale be used by default private $iDayAbb = null, $iShortDay = null, $iShortMonth = null, $iMonthName = null; -//--------------- -// CONSTRUCTOR - function DateLocale() { - settype($this->iDayAbb, 'array'); - settype($this->iShortDay, 'array'); - settype($this->iShortMonth, 'array'); - settype($this->iMonthName, 'array'); - - - $this->Set('C'); + function __construct() { + settype($this->iDayAbb, 'array'); + settype($this->iShortDay, 'array'); + settype($this->iShortMonth, 'array'); + settype($this->iMonthName, 'array'); + $this->Set('C'); } -//--------------- -// PUBLIC METHODS function Set($aLocale) { - if ( in_array($aLocale, array_keys($this->iDayAbb)) ){ - $this->iLocale = $aLocale; - return TRUE; // already cached nothing else to do! - } + if ( in_array($aLocale, array_keys($this->iDayAbb)) ){ + $this->iLocale = $aLocale; + return TRUE; // already cached nothing else to do! + } - $pLocale = setlocale(LC_TIME, 0); // get current locale for LC_TIME + $pLocale = setlocale(LC_TIME, 0); // get current locale for LC_TIME - if (is_array($aLocale)) { - foreach ($aLocale as $loc) { - $res = @setlocale(LC_TIME, $loc); - if ( $res ) { - $aLocale = $loc; - break; - } - } - } - else { - $res = @setlocale(LC_TIME, $aLocale); - } + if (is_array($aLocale)) { + foreach ($aLocale as $loc) { + $res = @setlocale(LC_TIME, $loc); + if ( $res ) { + $aLocale = $loc; + break; + } + } + } + else { + $res = @setlocale(LC_TIME, $aLocale); + } - if ( ! $res ){ - JpGraphError::RaiseL(25007,$aLocale); -//("You are trying to use the locale ($aLocale) which your PHP installation does not support. Hint: Use '' to indicate the default locale for this geographic region."); - return FALSE; - } - - $this->iLocale = $aLocale; - for ( $i = 0, $ofs = 0 - strftime('%w'); $i < 7; $i++, $ofs++ ){ - $day = strftime('%a', strtotime("$ofs day")); - $day[0] = strtoupper($day[0]); - $this->iDayAbb[$aLocale][]= $day[0]; - $this->iShortDay[$aLocale][]= $day; - } + if ( ! $res ) { + JpGraphError::RaiseL(25007,$aLocale); + //("You are trying to use the locale ($aLocale) which your PHP installation does not support. Hint: Use '' to indicate the default locale for this geographic region."); + return FALSE; + } - for($i=1; $i<=12; ++$i) { - list($short ,$full) = explode('|', strftime("%b|%B",strtotime("2001-$i-01"))); - $this->iShortMonth[$aLocale][] = ucfirst($short); - $this->iMonthName [$aLocale][] = ucfirst($full); - } - - setlocale(LC_TIME, $pLocale); + $this->iLocale = $aLocale; + for( $i = 0, $ofs = 0 - strftime('%w'); $i < 7; $i++, $ofs++ ) { + $day = strftime('%a', strtotime("$ofs day")); + $day[0] = strtoupper($day[0]); + $this->iDayAbb[$aLocale][]= $day[0]; + $this->iShortDay[$aLocale][]= $day; + } - return TRUE; + for($i=1; $i<=12; ++$i) { + list($short ,$full) = explode('|', strftime("%b|%B",strtotime("2001-$i-01"))); + $this->iShortMonth[$aLocale][] = ucfirst($short); + $this->iMonthName [$aLocale][] = ucfirst($full); + } + + setlocale(LC_TIME, $pLocale); + + return TRUE; } function GetDayAbb() { - return $this->iDayAbb[$this->iLocale]; + return $this->iDayAbb[$this->iLocale]; } - + function GetShortDay() { - return $this->iShortDay[$this->iLocale]; + return $this->iShortDay[$this->iLocale]; } function GetShortMonth() { - return $this->iShortMonth[$this->iLocale]; + return $this->iShortMonth[$this->iLocale]; } - + function GetShortMonthName($aNbr) { - return $this->iShortMonth[$this->iLocale][$aNbr]; + return $this->iShortMonth[$this->iLocale][$aNbr]; } function GetLongMonthName($aNbr) { - return $this->iMonthName[$this->iLocale][$aNbr]; + return $this->iMonthName[$this->iLocale][$aNbr]; } function GetMonth() { - return $this->iMonthName[$this->iLocale]; + return $this->iMonthName[$this->iLocale]; } } +// Global object handlers $gDateLocale = new DateLocale(); $gJpgDateLocale = new DateLocale(); @@ -415,35 +442,44 @@ $gJpgDateLocale = new DateLocale(); class Footer { public $iLeftMargin = 3, $iRightMargin = 3, $iBottomMargin = 3 ; public $left,$center,$right; + private $iTimer=null, $itimerpoststring=''; - function Footer() { - $this->left = new Text(); - $this->left->ParagraphAlign('left'); - $this->center = new Text(); - $this->center->ParagraphAlign('center'); - $this->right = new Text(); - $this->right->ParagraphAlign('right'); + function __construct() { + $this->left = new Text(); + $this->left->ParagraphAlign('left'); + $this->center = new Text(); + $this->center->ParagraphAlign('center'); + $this->right = new Text(); + $this->right->ParagraphAlign('right'); + } + + function SetTimer($aTimer,$aTimerPostString='') { + $this->iTimer = $aTimer; + $this->itimerpoststring = $aTimerPostString; } function SetMargin($aLeft=3,$aRight=3,$aBottom=3) { - $this->iLeftMargin = $aLeft; - $this->iRightMargin = $aRight; - $this->iBottomMargin = $aBottom; + $this->iLeftMargin = $aLeft; + $this->iRightMargin = $aRight; + $this->iBottomMargin = $aBottom; } function Stroke($aImg) { - $y = $aImg->height - $this->iBottomMargin; - $x = $this->iLeftMargin; - $this->left->Align('left','bottom'); - $this->left->Stroke($aImg,$x,$y); + $y = $aImg->height - $this->iBottomMargin; + $x = $this->iLeftMargin; + $this->left->Align('left','bottom'); + $this->left->Stroke($aImg,$x,$y); - $x = ($aImg->width - $this->iLeftMargin - $this->iRightMargin)/2; - $this->center->Align('center','bottom'); - $this->center->Stroke($aImg,$x,$y); + $x = ($aImg->width - $this->iLeftMargin - $this->iRightMargin)/2; + $this->center->Align('center','bottom'); + $this->center->Stroke($aImg,$x,$y); - $x = $aImg->width - $this->iRightMargin; - $this->right->Align('right','bottom'); - $this->right->Stroke($aImg,$x,$y); + $x = $aImg->width - $this->iRightMargin; + $this->right->Align('right','bottom'); + if( $this->iTimer != null ) { + $this->right->Set( $this->right->t . sprintf('%.3f',$this->iTimer->Pop()/1000.0) . $this->itimerpoststring ); + } + $this->right->Stroke($aImg,$x,$y); } } @@ -453,37 +489,38 @@ class Footer { // Description: Main class to handle graphs //=================================================== class Graph { - public $cache=null; // Cache object (singleton) - public $img=null; // Img object (singleton) - public $plots=array(); // Array of all plot object in the graph (for Y 1 axis) - public $y2plots=array();// Array of all plot object in the graph (for Y 2 axis) + public $cache=null; // Cache object (singleton) + public $img=null; // Img object (singleton) + public $plots=array(); // Array of all plot object in the graph (for Y 1 axis) + public $y2plots=array(); // Array of all plot object in the graph (for Y 2 axis) public $ynplots=array(); - public $xscale=null; // X Scale object (could be instance of LinearScale or LogScale + public $xscale=null; // X Scale object (could be instance of LinearScale or LogScale public $yscale=null,$y2scale=null, $ynscale=array(); - public $iIcons = array(); // Array of Icons to add to - public $cache_name; // File name to be used for the current graph in the cache directory - public $xgrid=null; // X Grid object (linear or logarithmic) + public $iIcons = array(); // Array of Icons to add to + public $cache_name; // File name to be used for the current graph in the cache directory + public $xgrid=null; // X Grid object (linear or logarithmic) public $ygrid=null,$y2grid=null; //dito for Y - public $doframe=true,$frame_color=array(0,0,0), $frame_weight=1; // Frame around graph - public $boxed=false, $box_color=array(0,0,0), $box_weight=1; // Box around plot area - public $doshadow=false,$shadow_width=4,$shadow_color=array(102,102,102); // Shadow for graph - public $xaxis=null; // X-axis (instane of Axis class) - public $yaxis=null, $y2axis=null, $ynaxis=array(); // Y axis (instance of Axis class) - public $margin_color=array(200,200,200); // Margin color of graph - public $plotarea_color=array(255,255,255); // Plot area color - public $title,$subtitle,$subsubtitle; // Title and subtitle(s) text object - public $axtype="linlin"; // Type of axis - public $xtick_factor,$ytick_factor; // Factor to determine the maximum number of ticks depending on the plot width - public $texts=null, $y2texts=null; // Text object to ge shown in the graph + public $doframe=true,$frame_color='black', $frame_weight=1; // Frame around graph + public $boxed=false, $box_color='black', $box_weight=1; // Box around plot area + public $doshadow=false,$shadow_width=4,$shadow_color='gray@0.5'; // Shadow for graph + public $xaxis=null; // X-axis (instane of Axis class) + public $yaxis=null, $y2axis=null, $ynaxis=array(); // Y axis (instance of Axis class) + public $margin_color=array(230,230,230); // Margin color of graph + public $plotarea_color=array(255,255,255); // Plot area color + public $title,$subtitle,$subsubtitle; // Title and subtitle(s) text object + public $axtype="linlin"; // Type of axis + public $xtick_factor,$ytick_factor; // Factor to determine the maximum number of ticks depending on the plot width + public $texts=null, $y2texts=null; // Text object to ge shown in the graph public $lines=null, $y2lines=null; public $bands=null, $y2bands=null; - public $text_scale_off=0, $text_scale_abscenteroff=-1; // Text scale in fractions and for centering bars - public $background_image="",$background_image_type=-1,$background_image_format="png"; + public $text_scale_off=0, $text_scale_abscenteroff=-1; // Text scale in fractions and for centering bars + public $background_image='',$background_image_type=-1,$background_image_format="png"; public $background_image_bright=0,$background_image_contr=0,$background_image_sat=0; + public $background_image_xpos=0,$background_image_ypos=0; public $image_bright=0, $image_contr=0, $image_sat=0; public $inline; - public $showcsim=0,$csimcolor="red"; //debug stuff, draw the csim boundaris on the image if <>0 - public $grid_depth=DEPTH_BACK; // Draw grid under all plots as default + public $showcsim=0,$csimcolor="red";//debug stuff, draw the csim boundaris on the image if <>0 + public $grid_depth=DEPTH_BACK; // Draw grid under all plots as default public $iAxisStyle = AXSTYLE_SIMPLE; public $iCSIMdisplay=false,$iHasStroked = false; public $footer; @@ -495,11 +532,11 @@ class Graph { public $bkg_gradfrom='navy', $bkg_gradto='silver'; public $titlebackground = false; public $titlebackground_color = 'lightblue', - $titlebackground_style = 1, - $titlebackground_framecolor = 'blue', - $titlebackground_framestyle = 2, - $titlebackground_frameweight = 1, - $titlebackground_bevelheight = 3 ; + $titlebackground_style = 1, + $titlebackground_framecolor = 'blue', + $titlebackground_framestyle = 2, + $titlebackground_frameweight = 1, + $titlebackground_bevelheight = 3 ; public $titlebkg_fillstyle=TITLEBKG_FILLSTYLE_SOLID; public $titlebkg_scolor1='black',$titlebkg_scolor2='white'; public $framebevel = false, $framebeveldepth = 2 ; @@ -510,2281 +547,2418 @@ class Graph { public $background_cflag_type = BGIMG_FILLPLOT; public $background_cflag_mix = 100; public $iImgTrans=false, - $iImgTransHorizon = 100,$iImgTransSkewDist=150, - $iImgTransDirection = 1, $iImgTransMinSize = true, - $iImgTransFillColor='white',$iImgTransHighQ=false, - $iImgTransBorder=false,$iImgTransHorizonPos=0.5; + $iImgTransHorizon = 100,$iImgTransSkewDist=150, + $iImgTransDirection = 1, $iImgTransMinSize = true, + $iImgTransFillColor='white',$iImgTransHighQ=false, + $iImgTransBorder=false,$iImgTransHorizonPos=0.5; public $legend; protected $iYAxisDeltaPos=50; protected $iIconDepth=DEPTH_BACK; protected $iAxisLblBgType = 0, - $iXAxisLblBgFillColor = 'lightgray', $iXAxisLblBgColor = 'black', - $iYAxisLblBgFillColor = 'lightgray', $iYAxisLblBgColor = 'black'; + $iXAxisLblBgFillColor = 'lightgray', $iXAxisLblBgColor = 'black', + $iYAxisLblBgFillColor = 'lightgray', $iYAxisLblBgColor = 'black'; protected $iTables=NULL; -//--------------- -// CONSTRUCTOR + // aWIdth Width in pixels of image + // aHeight Height in pixels of image + // aCachedName Name for image file in cache directory + // aTimeOut Timeout in minutes for image in cache + // aInline If true the image is streamed back in the call to Stroke() + // If false the image is just created in the cache + function __construct($aWidth=300,$aHeight=200,$aCachedName='',$aTimeout=0,$aInline=true) { - // aWIdth Width in pixels of image - // aHeight Height in pixels of image - // aCachedName Name for image file in cache directory - // aTimeOut Timeout in minutes for image in cache - // aInline If true the image is streamed back in the call to Stroke() - // If false the image is just created in the cache - function Graph($aWidth=300,$aHeight=200,$aCachedName="",$aTimeOut=0,$aInline=true) { - GLOBAL $gJpgBrandTiming; - // If timing is used create a new timing object - if( $gJpgBrandTiming ) { - global $tim; - $tim = new JpgTimer(); - $tim->Push(); - } + if( !is_numeric($aWidth) || !is_numeric($aHeight) ) { + JpGraphError::RaiseL(25008);//('Image width/height argument in Graph::Graph() must be numeric'); + } - if( !is_numeric($aWidth) || !is_numeric($aHeight) ) { - JpGraphError::RaiseL(25008);//('Image width/height argument in Graph::Graph() must be numeric'); - } + // Automatically generate the image file name based on the name of the script that + // generates the graph + if( $aCachedName == 'auto' ) { + $aCachedName=GenImgName(); + } - // Automatically generate the image file name based on the name of the script that - // generates the graph - if( $aCachedName=="auto" ) - $aCachedName=GenImgName(); - - // Should the image be streamed back to the browser or only to the cache? - $this->inline=$aInline; - - $this->img = new RotImage($aWidth,$aHeight); + // Should the image be streamed back to the browser or only to the cache? + $this->inline=$aInline; - $this->cache = new ImgStreamCache($this->img); - $this->cache->SetTimeOut($aTimeOut); + $this->img = new RotImage($aWidth,$aHeight); + $this->cache = new ImgStreamCache(); - $this->title = new Text(); - $this->title->ParagraphAlign('center'); - $this->title->SetFont(FF_FONT2,FS_BOLD); - $this->title->SetMargin(3); - $this->title->SetAlign('center'); + // Window doesn't like '?' in the file name so replace it with an '_' + $aCachedName = str_replace("?","_",$aCachedName); + $this->SetupCache($aCachedName, $aTimeout); - $this->subtitle = new Text(); - $this->subtitle->ParagraphAlign('center'); - $this->subtitle->SetMargin(2); - $this->subtitle->SetAlign('center'); + $this->title = new Text(); + $this->title->ParagraphAlign('center'); + $this->title->SetFont(FF_FONT2,FS_BOLD); + $this->title->SetMargin(5); + $this->title->SetAlign('center'); - $this->subsubtitle = new Text(); - $this->subsubtitle->ParagraphAlign('center'); - $this->subsubtitle->SetMargin(2); - $this->subsubtitle->SetAlign('center'); + $this->subtitle = new Text(); + $this->subtitle->ParagraphAlign('center'); + $this->subtitle->SetMargin(3); + $this->subtitle->SetAlign('center'); - $this->legend = new Legend(); - $this->footer = new Footer(); + $this->subsubtitle = new Text(); + $this->subsubtitle->ParagraphAlign('center'); + $this->subsubtitle->SetMargin(3); + $this->subsubtitle->SetAlign('center'); - // Window doesn't like '?' in the file name so replace it with an '_' - $aCachedName = str_replace("?","_",$aCachedName); + $this->legend = new Legend(); + $this->footer = new Footer(); - // If the cached version exist just read it directly from the - // cache, stream it back to browser and exit - if( $aCachedName!="" && READ_CACHE && $aInline ) - if( $this->cache->GetAndStream($aCachedName) ) { - exit(); - } - - $this->cache_name = $aCachedName; - $this->SetTickDensity(); // Normal density + // If the cached version exist just read it directly from the + // cache, stream it back to browser and exit + if( $aCachedName!='' && READ_CACHE && $aInline ) { + if( $this->cache->GetAndStream($this->img,$aCachedName) ) { + exit(); + } + } - $this->tabtitle = new GraphTabTitle(); + $this->SetTickDensity(); // Normal density + + $this->tabtitle = new GraphTabTitle(); } -//--------------- -// PUBLIC METHODS - + + function SetupCache($aFilename,$aTimeout=60) { + $this->cache_name = $aFilename; + $this->cache->SetTimeOut($aTimeout); + } + // Enable final image perspective transformation function Set3DPerspective($aDir=1,$aHorizon=100,$aSkewDist=120,$aQuality=false,$aFillColor='#FFFFFF',$aBorder=false,$aMinSize=true,$aHorizonPos=0.5) { - $this->iImgTrans = true; - $this->iImgTransHorizon = $aHorizon; - $this->iImgTransSkewDist= $aSkewDist; - $this->iImgTransDirection = $aDir; - $this->iImgTransMinSize = $aMinSize; - $this->iImgTransFillColor=$aFillColor; - $this->iImgTransHighQ=$aQuality; - $this->iImgTransBorder=$aBorder; - $this->iImgTransHorizonPos=$aHorizonPos; + $this->iImgTrans = true; + $this->iImgTransHorizon = $aHorizon; + $this->iImgTransSkewDist= $aSkewDist; + $this->iImgTransDirection = $aDir; + $this->iImgTransMinSize = $aMinSize; + $this->iImgTransFillColor=$aFillColor; + $this->iImgTransHighQ=$aQuality; + $this->iImgTransBorder=$aBorder; + $this->iImgTransHorizonPos=$aHorizonPos; + } + + function SetUserFont($aNormal,$aBold='',$aItalic='',$aBoldIt='') { + $this->img->ttf->SetUserFont($aNormal,$aBold,$aItalic,$aBoldIt); + } + + function SetUserFont1($aNormal,$aBold='',$aItalic='',$aBoldIt='') { + $this->img->ttf->SetUserFont1($aNormal,$aBold,$aItalic,$aBoldIt); + } + + function SetUserFont2($aNormal,$aBold='',$aItalic='',$aBoldIt='') { + $this->img->ttf->SetUserFont2($aNormal,$aBold,$aItalic,$aBoldIt); + } + + function SetUserFont3($aNormal,$aBold='',$aItalic='',$aBoldIt='') { + $this->img->ttf->SetUserFont3($aNormal,$aBold,$aItalic,$aBoldIt); } // Set Image format and optional quality function SetImgFormat($aFormat,$aQuality=75) { - $this->img->SetImgFormat($aFormat,$aQuality); + $this->img->SetImgFormat($aFormat,$aQuality); } // Should the grid be in front or back of the plot? function SetGridDepth($aDepth) { - $this->grid_depth=$aDepth; + $this->grid_depth=$aDepth; } function SetIconDepth($aDepth) { - $this->iIconDepth=$aDepth; + $this->iIconDepth=$aDepth; } - + // Specify graph angle 0-360 degrees. function SetAngle($aAngle) { - $this->img->SetAngle($aAngle); + $this->img->SetAngle($aAngle); } function SetAlphaBlending($aFlg=true) { - $this->img->SetAlphaBlending($aFlg); + $this->img->SetAlphaBlending($aFlg); } // Shortcut to image margin function SetMargin($lm,$rm,$tm,$bm) { - $this->img->SetMargin($lm,$rm,$tm,$bm); + $this->img->SetMargin($lm,$rm,$tm,$bm); } function SetY2OrderBack($aBack=true) { - $this->y2orderback = $aBack; + $this->y2orderback = $aBack; } - // Rotate the graph 90 degrees and set the margin + // Rotate the graph 90 degrees and set the margin // when we have done a 90 degree rotation function Set90AndMargin($lm=0,$rm=0,$tm=0,$bm=0) { - $lm = $lm ==0 ? floor(0.2 * $this->img->width) : $lm ; - $rm = $rm ==0 ? floor(0.1 * $this->img->width) : $rm ; - $tm = $tm ==0 ? floor(0.2 * $this->img->height) : $tm ; - $bm = $bm ==0 ? floor(0.1 * $this->img->height) : $bm ; + $lm = $lm ==0 ? floor(0.2 * $this->img->width) : $lm ; + $rm = $rm ==0 ? floor(0.1 * $this->img->width) : $rm ; + $tm = $tm ==0 ? floor(0.2 * $this->img->height) : $tm ; + $bm = $bm ==0 ? floor(0.1 * $this->img->height) : $bm ; - $adj = ($this->img->height - $this->img->width)/2; - $this->img->SetMargin($tm-$adj,$bm-$adj,$rm+$adj,$lm+$adj); - $this->img->SetCenter(floor($this->img->width/2),floor($this->img->height/2)); - $this->SetAngle(90); - if( empty($this->yaxis) || empty($this->xaxis) ) { - JpgraphError::RaiseL(25009);//('You must specify what scale to use with a call to Graph::SetScale()'); - } - $this->xaxis->SetLabelAlign('right','center'); - $this->yaxis->SetLabelAlign('center','bottom'); + $adj = ($this->img->height - $this->img->width)/2; + $this->img->SetMargin($tm-$adj,$bm-$adj,$rm+$adj,$lm+$adj); + $this->img->SetCenter(floor($this->img->width/2),floor($this->img->height/2)); + $this->SetAngle(90); + if( empty($this->yaxis) || empty($this->xaxis) ) { + JpgraphError::RaiseL(25009);//('You must specify what scale to use with a call to Graph::SetScale()'); + } + $this->xaxis->SetLabelAlign('right','center'); + $this->yaxis->SetLabelAlign('center','bottom'); } - + function SetClipping($aFlg=true) { - $this->iDoClipping = $aFlg ; + $this->iDoClipping = $aFlg ; } // Add a plot object to the graph function Add($aPlot) { - if( $aPlot == null ) - JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph."); - if( is_array($aPlot) && count($aPlot) > 0 ) - $cl = $aPlot[0]; - else - $cl = $aPlot; + if( $aPlot == null ) { + JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph."); + } + if( is_array($aPlot) && count($aPlot) > 0 ) { + $cl = $aPlot[0]; + } + else { + $cl = $aPlot; + } - if( $cl instanceof Text ) - $this->AddText($aPlot); - elseif( $cl instanceof PlotLine ) - $this->AddLine($aPlot); - elseif( class_exists('PlotBand',false) && ($cl instanceof PlotBand) ) - $this->AddBand($aPlot); - elseif( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) - $this->AddIcon($aPlot); - elseif( class_exists('GTextTable',false) && ($cl instanceof GTextTable) ) - $this->AddTable($aPlot); - else - $this->plots[] = $aPlot; + if( $cl instanceof Text ) $this->AddText($aPlot); + elseif( class_exists('PlotLine') && ($cl instanceof PlotLine) ) $this->AddLine($aPlot); + elseif( class_exists('PlotBand',false) && ($cl instanceof PlotBand) ) $this->AddBand($aPlot); + elseif( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) $this->AddIcon($aPlot); + elseif( class_exists('GTextTable',false) && ($cl instanceof GTextTable) ) $this->AddTable($aPlot); + else { + if( is_array($aPlot) ) { + $this->plots = array_merge($this->plots,$aPlot); + } + else { + $this->plots[] = $aPlot; + } + } } function AddTable($aTable) { - if( is_array($aTable) ) { - for($i=0; $i < count($aTable); ++$i ) - $this->iTables[]=$aTable[$i]; - } - else { - $this->iTables[] = $aTable ; - } + if( is_array($aTable) ) { + for($i=0; $i < count($aTable); ++$i ) { + $this->iTables[]=$aTable[$i]; + } + } + else { + $this->iTables[] = $aTable ; + } } function AddIcon($aIcon) { - if( is_array($aIcon) ) { - for($i=0; $i < count($aIcon); ++$i ) - $this->iIcons[]=$aIcon[$i]; - } - else { - $this->iIcons[] = $aIcon ; - } + if( is_array($aIcon) ) { + for($i=0; $i < count($aIcon); ++$i ) { + $this->iIcons[]=$aIcon[$i]; + } + } + else { + $this->iIcons[] = $aIcon ; + } } // Add plot to second Y-scale function AddY2($aPlot) { - if( $aPlot == null ) - JpGraphError::RaiseL(25011);//("Graph::AddY2() You tried to add a null plot to the graph."); + if( $aPlot == null ) { + JpGraphError::RaiseL(25011);//("Graph::AddY2() You tried to add a null plot to the graph."); + } - if( is_array($aPlot) && count($aPlot) > 0 ) - $cl = $aPlot[0]; - else - $cl = $aPlot; + if( is_array($aPlot) && count($aPlot) > 0 ) { + $cl = $aPlot[0]; + } + else { + $cl = $aPlot; + } - if( $cl instanceof Text ) - $this->AddText($aPlot,true); - elseif( $cl instanceof PlotLine ) - $this->AddLine($aPlot,true); - elseif( class_exists('PlotBand',false) && ($cl instanceof PlotBand) ) - $this->AddBand($aPlot,true); - else - $this->y2plots[] = $aPlot; + if( $cl instanceof Text ) { + $this->AddText($aPlot,true); + } + elseif( class_exists('PlotLine',false) && ($cl instanceof PlotLine) ) { + $this->AddLine($aPlot,true); + } + elseif( class_exists('PlotBand',false) && ($cl instanceof PlotBand) ) { + $this->AddBand($aPlot,true); + } + else { + $this->y2plots[] = $aPlot; + } } - + // Add plot to the extra Y-axises function AddY($aN,$aPlot) { - if( $aPlot == null ) - JpGraphError::RaiseL(25012);//("Graph::AddYN() You tried to add a null plot to the graph."); + if( $aPlot == null ) { + JpGraphError::RaiseL(25012);//("Graph::AddYN() You tried to add a null plot to the graph."); + } - if( is_array($aPlot) && count($aPlot) > 0 ) - $cl = $aPlot[0]; - else - $cl = $aPlot; + if( is_array($aPlot) && count($aPlot) > 0 ) { + $cl = $aPlot[0]; + } + else { + $cl = $aPlot; + } - if( ($cl instanceof Text) || ($cl instanceof PlotLine) || - (class_exists('PlotBand',false) && ($cl instanceof PlotBand)) ) - JpGraph::RaiseL(25013);//('You can only add standard plots to multiple Y-axis'); - else - $this->ynplots[$aN][] = $aPlot; + if( ($cl instanceof Text) || + (class_exists('PlotLine',false) && ($cl instanceof PlotLine)) || + (class_exists('PlotBand',false) && ($cl instanceof PlotBand)) ) { + JpGraph::RaiseL(25013);//('You can only add standard plots to multiple Y-axis'); + } + else { + $this->ynplots[$aN][] = $aPlot; + } } // Add text object to the graph function AddText($aTxt,$aToY2=false) { - if( $aTxt == null ) - JpGraphError::RaiseL(25014);//("Graph::AddText() You tried to add a null text to the graph."); - if( $aToY2 ) { - if( is_array($aTxt) ) { - for($i=0; $i < count($aTxt); ++$i ) - $this->y2texts[]=$aTxt[$i]; - } - else - $this->y2texts[] = $aTxt; - } - else { - if( is_array($aTxt) ) { - for($i=0; $i < count($aTxt); ++$i ) - $this->texts[]=$aTxt[$i]; - } - else - $this->texts[] = $aTxt; - } + if( $aTxt == null ) { + JpGraphError::RaiseL(25014);//("Graph::AddText() You tried to add a null text to the graph."); + } + if( $aToY2 ) { + if( is_array($aTxt) ) { + for($i=0; $i < count($aTxt); ++$i ) { + $this->y2texts[]=$aTxt[$i]; + } + } + else { + $this->y2texts[] = $aTxt; + } + } + else { + if( is_array($aTxt) ) { + for($i=0; $i < count($aTxt); ++$i ) { + $this->texts[]=$aTxt[$i]; + } + } + else { + $this->texts[] = $aTxt; + } + } } - + // Add a line object (class PlotLine) to the graph function AddLine($aLine,$aToY2=false) { - if( $aLine == null ) - JpGraphError::RaiseL(25015);//("Graph::AddLine() You tried to add a null line to the graph."); + if( $aLine == null ) { + JpGraphError::RaiseL(25015);//("Graph::AddLine() You tried to add a null line to the graph."); + } - if( $aToY2 ) { - if( is_array($aLine) ) { - for($i=0; $i < count($aLine); ++$i ) - $this->y2lines[]=$aLine[$i]; - } - else - $this->y2lines[] = $aLine; - } - else { - if( is_array($aLine) ) { - for($i=0; $ilines[]=$aLine[$i]; - } - else - $this->lines[] = $aLine; - } + if( $aToY2 ) { + if( is_array($aLine) ) { + for($i=0; $i < count($aLine); ++$i ) { + //$this->y2lines[]=$aLine[$i]; + $this->y2plots[]=$aLine[$i]; + } + } + else { + //$this->y2lines[] = $aLine; + $this->y2plots[]=$aLine; + } + } + else { + if( is_array($aLine) ) { + for($i=0; $ilines[]=$aLine[$i]; + $this->plots[]=$aLine[$i]; + } + } + else { + //$this->lines[] = $aLine; + $this->plots[] = $aLine; + } + } } // Add vertical or horizontal band function AddBand($aBand,$aToY2=false) { - if( $aBand == null ) - JpGraphError::RaiseL(25016);//(" Graph::AddBand() You tried to add a null band to the graph."); + if( $aBand == null ) { + JpGraphError::RaiseL(25016);//(" Graph::AddBand() You tried to add a null band to the graph."); + } - if( $aToY2 ) { - if( is_array($aBand) ) { - for($i=0; $i < count($aBand); ++$i ) - $this->y2bands[] = $aBand[$i]; - } - else - $this->y2bands[] = $aBand; - } - else { - if( is_array($aBand) ) { - for($i=0; $i < count($aBand); ++$i ) - $this->bands[] = $aBand[$i]; - } - else - $this->bands[] = $aBand; - } + if( $aToY2 ) { + if( is_array($aBand) ) { + for($i=0; $i < count($aBand); ++$i ) { + $this->y2bands[] = $aBand[$i]; + } + } + else { + $this->y2bands[] = $aBand; + } + } + else { + if( is_array($aBand) ) { + for($i=0; $i < count($aBand); ++$i ) { + $this->bands[] = $aBand[$i]; + } + } + else { + $this->bands[] = $aBand; + } + } } function SetBackgroundGradient($aFrom='navy',$aTo='silver',$aGradType=2,$aStyle=BGRAD_FRAME) { - $this->bkg_gradtype=$aGradType; - $this->bkg_gradstyle=$aStyle; - $this->bkg_gradfrom = $aFrom; - $this->bkg_gradto = $aTo; - } - + $this->bkg_gradtype=$aGradType; + $this->bkg_gradstyle=$aStyle; + $this->bkg_gradfrom = $aFrom; + $this->bkg_gradto = $aTo; + } + // Set a country flag in the background function SetBackgroundCFlag($aName,$aBgType=BGIMG_FILLPLOT,$aMix=100) { - $this->background_cflag = $aName; - $this->background_cflag_type = $aBgType; - $this->background_cflag_mix = $aMix; + $this->background_cflag = $aName; + $this->background_cflag_type = $aBgType; + $this->background_cflag_mix = $aMix; } // Alias for the above method function SetBackgroundCountryFlag($aName,$aBgType=BGIMG_FILLPLOT,$aMix=100) { - $this->background_cflag = $aName; - $this->background_cflag_type = $aBgType; - $this->background_cflag_mix = $aMix; + $this->background_cflag = $aName; + $this->background_cflag_type = $aBgType; + $this->background_cflag_mix = $aMix; } // Specify a background image - function SetBackgroundImage($aFileName,$aBgType=BGIMG_FILLPLOT,$aImgFormat="auto") { + function SetBackgroundImage($aFileName,$aBgType=BGIMG_FILLPLOT,$aImgFormat='auto') { - if( !USE_TRUECOLOR ) { - JpGraphError::RaiseL(25017);//("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x you must enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts."); - } + // Get extension to determine image type + if( $aImgFormat == 'auto' ) { + $e = explode('.',$aFileName); + if( !$e ) { + JpGraphError::RaiseL(25018,$aFileName);//('Incorrect file name for Graph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type'); + } - // Get extension to determine image type - if( $aImgFormat == "auto" ) { - $e = explode('.',$aFileName); - if( !$e ) { - JpGraphError::RaiseL(25018,$aFileName);//('Incorrect file name for Graph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type'); - } + $valid_formats = array('png', 'jpg', 'gif'); + $aImgFormat = strtolower($e[count($e)-1]); + if ($aImgFormat == 'jpeg') { + $aImgFormat = 'jpg'; + } + elseif (!in_array($aImgFormat, $valid_formats) ) { + JpGraphError::RaiseL(25019,$aImgFormat);//('Unknown file extension ($aImgFormat) in Graph::SetBackgroundImage() for filename: '.$aFileName); + } + } - $valid_formats = array('png', 'jpg', 'gif'); - $aImgFormat = strtolower($e[count($e)-1]); - if ($aImgFormat == 'jpeg') { - $aImgFormat = 'jpg'; - } - elseif (!in_array($aImgFormat, $valid_formats) ) { - JpGraphError::RaiseL(25019,$aImgFormat);//('Unknown file extension ($aImgFormat) in Graph::SetBackgroundImage() for filename: '.$aFileName); - } - } - - $this->background_image = $aFileName; - $this->background_image_type=$aBgType; - $this->background_image_format=$aImgFormat; + $this->background_image = $aFileName; + $this->background_image_type=$aBgType; + $this->background_image_format=$aImgFormat; } function SetBackgroundImageMix($aMix) { - $this->background_image_mix = $aMix ; + $this->background_image_mix = $aMix ; } - + + // Adjust background image position + function SetBackgroundImagePos($aXpos,$aYpos) { + $this->background_image_xpos = $aXpos ; + $this->background_image_ypos = $aYpos ; + } + // Specify axis style (boxed or single) function SetAxisStyle($aStyle) { $this->iAxisStyle = $aStyle ; } - + // Set a frame around the plot area function SetBox($aDrawPlotFrame=true,$aPlotFrameColor=array(0,0,0),$aPlotFrameWeight=1) { - $this->boxed = $aDrawPlotFrame; - $this->box_weight = $aPlotFrameWeight; - $this->box_color = $aPlotFrameColor; + $this->boxed = $aDrawPlotFrame; + $this->box_weight = $aPlotFrameWeight; + $this->box_color = $aPlotFrameColor; } - + // Specify color for the plotarea (not the margins) function SetColor($aColor) { - $this->plotarea_color=$aColor; + $this->plotarea_color=$aColor; } - + // Specify color for the margins (all areas outside the plotarea) function SetMarginColor($aColor) { - $this->margin_color=$aColor; + $this->margin_color=$aColor; } - + // Set a frame around the entire image function SetFrame($aDrawImgFrame=true,$aImgFrameColor=array(0,0,0),$aImgFrameWeight=1) { - $this->doframe = $aDrawImgFrame; - $this->frame_color = $aImgFrameColor; - $this->frame_weight = $aImgFrameWeight; + $this->doframe = $aDrawImgFrame; + $this->frame_color = $aImgFrameColor; + $this->frame_weight = $aImgFrameWeight; } function SetFrameBevel($aDepth=3,$aBorder=false,$aBorderColor='black',$aColor1='white@0.4',$aColor2='darkgray@0.4',$aFlg=true) { - $this->framebevel = $aFlg ; - $this->framebeveldepth = $aDepth ; - $this->framebevelborder = $aBorder ; - $this->framebevelbordercolor = $aBorderColor ; - $this->framebevelcolor1 = $aColor1 ; - $this->framebevelcolor2 = $aColor2 ; + $this->framebevel = $aFlg ; + $this->framebeveldepth = $aDepth ; + $this->framebevelborder = $aBorder ; + $this->framebevelbordercolor = $aBorderColor ; + $this->framebevelcolor1 = $aColor1 ; + $this->framebevelcolor2 = $aColor2 ; - $this->doshadow = false ; + $this->doshadow = false ; } // Set the shadow around the whole image - function SetShadow($aShowShadow=true,$aShadowWidth=5,$aShadowColor=array(102,102,102)) { - $this->doshadow = $aShowShadow; - $this->shadow_color = $aShadowColor; - $this->shadow_width = $aShadowWidth; - $this->footer->iBottomMargin += $aShadowWidth; - $this->footer->iRightMargin += $aShadowWidth; + function SetShadow($aShowShadow=true,$aShadowWidth=4,$aShadowColor='gray@0.3') { + $this->doshadow = $aShowShadow; + $this->shadow_color = $aShadowColor; + $this->shadow_width = $aShadowWidth; + $this->footer->iBottomMargin += $aShadowWidth; + $this->footer->iRightMargin += $aShadowWidth; } // Specify x,y scale. Note that if you manually specify the scale // you must also specify the tick distance with a call to Ticks::Set() function SetScale($aAxisType,$aYMin=1,$aYMax=1,$aXMin=1,$aXMax=1) { - $this->axtype = $aAxisType; + $this->axtype = $aAxisType; - if( $aYMax < $aYMin || $aXMax < $aXMin ) - JpGraphError::RaiseL(25020);//('Graph::SetScale(): Specified Max value must be larger than the specified Min value.'); + if( $aYMax < $aYMin || $aXMax < $aXMin ) { + JpGraphError::RaiseL(25020);//('Graph::SetScale(): Specified Max value must be larger than the specified Min value.'); + } - $yt=substr($aAxisType,-3,3); - if( $yt=="lin" ) - $this->yscale = new LinearScale($aYMin,$aYMax); - elseif( $yt == "int" ) { - $this->yscale = new LinearScale($aYMin,$aYMax); - $this->yscale->SetIntScale(); - } - elseif( $yt=="log" ) - $this->yscale = new LogScale($aYMin,$aYMax); - else - JpGraphError::RaiseL(25021,$aAxisType);//("Unknown scale specification for Y-scale. ($aAxisType)"); - - $xt=substr($aAxisType,0,3); - if( $xt == "lin" || $xt == "tex" ) { - $this->xscale = new LinearScale($aXMin,$aXMax,"x"); - $this->xscale->textscale = ($xt == "tex"); - } - elseif( $xt == "int" ) { - $this->xscale = new LinearScale($aXMin,$aXMax,"x"); - $this->xscale->SetIntScale(); - } - elseif( $xt == "dat" ) { - $this->xscale = new DateScale($aXMin,$aXMax,"x"); - } - elseif( $xt == "log" ) - $this->xscale = new LogScale($aXMin,$aXMax,"x"); - else - JpGraphError::RaiseL(25022,$aAxisType);//(" Unknown scale specification for X-scale. ($aAxisType)"); + $yt=substr($aAxisType,-3,3); + if( $yt == 'lin' ) { + $this->yscale = new LinearScale($aYMin,$aYMax); + } + elseif( $yt == 'int' ) { + $this->yscale = new LinearScale($aYMin,$aYMax); + $this->yscale->SetIntScale(); + } + elseif( $yt == 'log' ) { + $this->yscale = new LogScale($aYMin,$aYMax); + } + else { + JpGraphError::RaiseL(25021,$aAxisType);//("Unknown scale specification for Y-scale. ($aAxisType)"); + } - $this->xaxis = new Axis($this->img,$this->xscale); - $this->yaxis = new Axis($this->img,$this->yscale); - $this->xgrid = new Grid($this->xaxis); - $this->ygrid = new Grid($this->yaxis); - $this->ygrid->Show(); + $xt=substr($aAxisType,0,3); + if( $xt == 'lin' || $xt == 'tex' ) { + $this->xscale = new LinearScale($aXMin,$aXMax,'x'); + $this->xscale->textscale = ($xt == 'tex'); + } + elseif( $xt == 'int' ) { + $this->xscale = new LinearScale($aXMin,$aXMax,'x'); + $this->xscale->SetIntScale(); + } + elseif( $xt == 'dat' ) { + $this->xscale = new DateScale($aXMin,$aXMax,'x'); + } + elseif( $xt == 'log' ) { + $this->xscale = new LogScale($aXMin,$aXMax,'x'); + } + else { + JpGraphError::RaiseL(25022,$aAxisType);//(" Unknown scale specification for X-scale. ($aAxisType)"); + } + + $this->xaxis = new Axis($this->img,$this->xscale); + $this->yaxis = new Axis($this->img,$this->yscale); + $this->xgrid = new Grid($this->xaxis); + $this->ygrid = new Grid($this->yaxis); + $this->ygrid->Show(); } - + // Specify secondary Y scale - function SetY2Scale($aAxisType="lin",$aY2Min=1,$aY2Max=1) { - if( $aAxisType=="lin" ) - $this->y2scale = new LinearScale($aY2Min,$aY2Max); - elseif( $aAxisType == "int" ) { - $this->y2scale = new LinearScale($aY2Min,$aY2Max); - $this->y2scale->SetIntScale(); - } - elseif( $aAxisType=="log" ) { - $this->y2scale = new LogScale($aY2Min,$aY2Max); - } - else JpGraphError::RaiseL(25023,$aAxisType);//("JpGraph: Unsupported Y2 axis type: $aAxisType\nMust be one of (lin,log,int)"); - - $this->y2axis = new Axis($this->img,$this->y2scale); - $this->y2axis->scale->ticks->SetDirection(SIDE_LEFT); - $this->y2axis->SetLabelSide(SIDE_RIGHT); - $this->y2axis->SetPos('max'); - $this->y2axis->SetTitleSide(SIDE_RIGHT); - - // Deafult position is the max x-value - $this->y2grid = new Grid($this->y2axis); + function SetY2Scale($aAxisType='lin',$aY2Min=1,$aY2Max=1) { + if( $aAxisType == 'lin' ) { + $this->y2scale = new LinearScale($aY2Min,$aY2Max); + } + elseif( $aAxisType == 'int' ) { + $this->y2scale = new LinearScale($aY2Min,$aY2Max); + $this->y2scale->SetIntScale(); + } + elseif( $aAxisType == 'log' ) { + $this->y2scale = new LogScale($aY2Min,$aY2Max); + } + else { + JpGraphError::RaiseL(25023,$aAxisType);//("JpGraph: Unsupported Y2 axis type: $aAxisType\nMust be one of (lin,log,int)"); + } + + $this->y2axis = new Axis($this->img,$this->y2scale); + $this->y2axis->scale->ticks->SetDirection(SIDE_LEFT); + $this->y2axis->SetLabelSide(SIDE_RIGHT); + $this->y2axis->SetPos('max'); + $this->y2axis->SetTitleSide(SIDE_RIGHT); + + // Deafult position is the max x-value + $this->y2grid = new Grid($this->y2axis); } // Set the delta position (in pixels) between the multiple Y-axis function SetYDeltaDist($aDist) { - $this->iYAxisDeltaPos = $aDist; + $this->iYAxisDeltaPos = $aDist; } // Specify secondary Y scale function SetYScale($aN,$aAxisType="lin",$aYMin=1,$aYMax=1) { - if( $aAxisType=="lin" ) - $this->ynscale[$aN] = new LinearScale($aYMin,$aYMax); - elseif( $aAxisType == "int" ) { - $this->ynscale[$aN] = new LinearScale($aYMin,$aYMax); - $this->ynscale[$aN]->SetIntScale(); - } - elseif( $aAxisType=="log" ) { - $this->ynscale[$aN] = new LogScale($aYMin,$aYMax); - } - else JpGraphError::RaiseL(25024,$aAxisType);//("JpGraph: Unsupported Y axis type: $aAxisType\nMust be one of (lin,log,int)"); - - $this->ynaxis[$aN] = new Axis($this->img,$this->ynscale[$aN]); - $this->ynaxis[$aN]->scale->ticks->SetDirection(SIDE_LEFT); - $this->ynaxis[$aN]->SetLabelSide(SIDE_RIGHT); + if( $aAxisType == 'lin' ) { + $this->ynscale[$aN] = new LinearScale($aYMin,$aYMax); + } + elseif( $aAxisType == 'int' ) { + $this->ynscale[$aN] = new LinearScale($aYMin,$aYMax); + $this->ynscale[$aN]->SetIntScale(); + } + elseif( $aAxisType == 'log' ) { + $this->ynscale[$aN] = new LogScale($aYMin,$aYMax); + } + else { + JpGraphError::RaiseL(25024,$aAxisType);//("JpGraph: Unsupported Y axis type: $aAxisType\nMust be one of (lin,log,int)"); + } + + $this->ynaxis[$aN] = new Axis($this->img,$this->ynscale[$aN]); + $this->ynaxis[$aN]->scale->ticks->SetDirection(SIDE_LEFT); + $this->ynaxis[$aN]->SetLabelSide(SIDE_RIGHT); } // Specify density of ticks when autoscaling 'normal', 'dense', 'sparse', 'verysparse' - // The dividing factor have been determined heuristically according to my aesthetic + // The dividing factor have been determined heuristically according to my aesthetic // sense (or lack off) y.m.m.v ! function SetTickDensity($aYDensity=TICKD_NORMAL,$aXDensity=TICKD_NORMAL) { - $this->xtick_factor=30; - $this->ytick_factor=25; - switch( $aYDensity ) { - case TICKD_DENSE: - $this->ytick_factor=12; - break; - case TICKD_NORMAL: - $this->ytick_factor=25; - break; - case TICKD_SPARSE: - $this->ytick_factor=40; - break; - case TICKD_VERYSPARSE: - $this->ytick_factor=100; - break; - default: - JpGraphError::RaiseL(25025,$densy);//("JpGraph: Unsupported Tick density: $densy"); - } - switch( $aXDensity ) { - case TICKD_DENSE: - $this->xtick_factor=15; - break; - case TICKD_NORMAL: - $this->xtick_factor=30; - break; - case TICKD_SPARSE: - $this->xtick_factor=45; - break; - case TICKD_VERYSPARSE: - $this->xtick_factor=60; - break; - default: - JpGraphError::RaiseL(25025,$densx);//("JpGraph: Unsupported Tick density: $densx"); - } + $this->xtick_factor=30; + $this->ytick_factor=25; + switch( $aYDensity ) { + case TICKD_DENSE: + $this->ytick_factor=12; + break; + case TICKD_NORMAL: + $this->ytick_factor=25; + break; + case TICKD_SPARSE: + $this->ytick_factor=40; + break; + case TICKD_VERYSPARSE: + $this->ytick_factor=100; + break; + default: + JpGraphError::RaiseL(25025,$densy);//("JpGraph: Unsupported Tick density: $densy"); + } + switch( $aXDensity ) { + case TICKD_DENSE: + $this->xtick_factor=15; + break; + case TICKD_NORMAL: + $this->xtick_factor=30; + break; + case TICKD_SPARSE: + $this->xtick_factor=45; + break; + case TICKD_VERYSPARSE: + $this->xtick_factor=60; + break; + default: + JpGraphError::RaiseL(25025,$densx);//("JpGraph: Unsupported Tick density: $densx"); + } } - - // Get a string of all image map areas + + // Get a string of all image map areas function GetCSIMareas() { - if( !$this->iHasStroked ) - $this->Stroke(_CSIM_SPECIALFILE); + if( !$this->iHasStroked ) { + $this->Stroke(_CSIM_SPECIALFILE); + } - $csim = $this->title->GetCSIMAreas(); - $csim .= $this->subtitle->GetCSIMAreas(); - $csim .= $this->subsubtitle->GetCSIMAreas(); - $csim .= $this->legend->GetCSIMAreas(); + $csim = $this->title->GetCSIMAreas(); + $csim .= $this->subtitle->GetCSIMAreas(); + $csim .= $this->subsubtitle->GetCSIMAreas(); + $csim .= $this->legend->GetCSIMAreas(); - if( $this->y2axis != NULL ) { - $csim .= $this->y2axis->title->GetCSIMAreas(); - } + if( $this->y2axis != NULL ) { + $csim .= $this->y2axis->title->GetCSIMAreas(); + } - if( $this->texts != null ) { - $n = count($this->texts); - for($i=0; $i < $n; ++$i ) { - $csim .= $this->texts[$i]->GetCSIMAreas(); - } - } + if( $this->texts != null ) { + $n = count($this->texts); + for($i=0; $i < $n; ++$i ) { + $csim .= $this->texts[$i]->GetCSIMAreas(); + } + } - if( $this->y2texts != null && $this->y2scale != null ) { - $n = count($this->y2texts); - for($i=0; $i < $n; ++$i ) { - $csim .= $this->y2texts[$i]->GetCSIMAreas(); - } - } + if( $this->y2texts != null && $this->y2scale != null ) { + $n = count($this->y2texts); + for($i=0; $i < $n; ++$i ) { + $csim .= $this->y2texts[$i]->GetCSIMAreas(); + } + } - if( $this->yaxis != null && $this->xaxis != null ) { - $csim .= $this->yaxis->title->GetCSIMAreas(); - $csim .= $this->xaxis->title->GetCSIMAreas(); - } + if( $this->yaxis != null && $this->xaxis != null ) { + $csim .= $this->yaxis->title->GetCSIMAreas(); + $csim .= $this->xaxis->title->GetCSIMAreas(); + } - $n = count($this->plots); - for( $i=0; $i < $n; ++$i ) - $csim .= $this->plots[$i]->GetCSIMareas(); + $n = count($this->plots); + for( $i=0; $i < $n; ++$i ) { + $csim .= $this->plots[$i]->GetCSIMareas(); + } - $n = count($this->y2plots); - for( $i=0; $i < $n; ++$i ) - $csim .= $this->y2plots[$i]->GetCSIMareas(); + $n = count($this->y2plots); + for( $i=0; $i < $n; ++$i ) { + $csim .= $this->y2plots[$i]->GetCSIMareas(); + } - $n = count($this->ynaxis); - for( $i=0; $i < $n; ++$i ) { - $m = count($this->ynplots[$i]); - for($j=0; $j < $m; ++$j ) { - $csim .= $this->ynplots[$i][$j]->GetCSIMareas(); - } - } + $n = count($this->ynaxis); + for( $i=0; $i < $n; ++$i ) { + $m = count($this->ynplots[$i]); + for($j=0; $j < $m; ++$j ) { + $csim .= $this->ynplots[$i][$j]->GetCSIMareas(); + } + } - $n = count($this->iTables); - for( $i=0; $i < $n; ++$i ) { - $csim .= $this->iTables[$i]->GetCSIMareas(); - } + $n = count($this->iTables); + for( $i=0; $i < $n; ++$i ) { + $csim .= $this->iTables[$i]->GetCSIMareas(); + } - return $csim; + return $csim; } - + // Get a complete .. tag for the final image map function GetHTMLImageMap($aMapName) { - $im = "\n"; - $im .= $this->GetCSIMareas(); - $im .= ""; - return $im; + $im = "\n"; + $im .= $this->GetCSIMareas(); + $im .= ""; + return $im; } function CheckCSIMCache($aCacheName,$aTimeOut=60) { - global $_SERVER; + global $_SERVER; - if( $aCacheName=='auto' ) - $aCacheName=basename($_SERVER['PHP_SELF']); + if( $aCacheName=='auto' ) { + $aCacheName=basename($_SERVER['PHP_SELF']); + } - $urlarg = $this->GetURLArguments(); - $this->csimcachename = CSIMCACHE_DIR.$aCacheName.$urlarg; - $this->csimcachetimeout = $aTimeOut; + $urlarg = $this->GetURLArguments(); + $this->csimcachename = CSIMCACHE_DIR.$aCacheName.$urlarg; + $this->csimcachetimeout = $aTimeOut; - // First determine if we need to check for a cached version - // This differs from the standard cache in the sense that the - // image and CSIM map HTML file is written relative to the directory - // the script executes in and not the specified cache directory. - // The reason for this is that the cache directory is not necessarily - // accessible from the HTTP server. - if( $this->csimcachename != '' ) { - $dir = dirname($this->csimcachename); - $base = basename($this->csimcachename); - $base = strtok($base,'.'); - $suffix = strtok('.'); - $basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html'; - $baseimg = $dir.'/'.$base.'?'.$urlarg.'.'.$this->img->img_format; + // First determine if we need to check for a cached version + // This differs from the standard cache in the sense that the + // image and CSIM map HTML file is written relative to the directory + // the script executes in and not the specified cache directory. + // The reason for this is that the cache directory is not necessarily + // accessible from the HTTP server. + if( $this->csimcachename != '' ) { + $dir = dirname($this->csimcachename); + $base = basename($this->csimcachename); + $base = strtok($base,'.'); + $suffix = strtok('.'); + $basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html'; + $baseimg = $dir.'/'.$base.'?'.$urlarg.'.'.$this->img->img_format; - $timedout=false; - // Does it exist at all ? - - if( file_exists($basecsim) && file_exists($baseimg) ) { - // Check that it hasn't timed out - $diff=time()-filemtime($basecsim); - if( $this->csimcachetimeout>0 && ($diff > $this->csimcachetimeout*60) ) { - $timedout=true; - @unlink($basecsim); - @unlink($baseimg); - } - else { - if ($fh = @fopen($basecsim, "r")) { - fpassthru($fh); - return true; - } - else - JpGraphError::RaiseL(25027,$basecsim);//(" Can't open cached CSIM \"$basecsim\" for reading."); - } - } - } - return false; + $timedout=false; + // Does it exist at all ? + + if( file_exists($basecsim) && file_exists($baseimg) ) { + // Check that it hasn't timed out + $diff=time()-filemtime($basecsim); + if( $this->csimcachetimeout>0 && ($diff > $this->csimcachetimeout*60) ) { + $timedout=true; + @unlink($basecsim); + @unlink($baseimg); + } + else { + if ($fh = @fopen($basecsim, "r")) { + fpassthru($fh); + return true; + } + else { + JpGraphError::RaiseL(25027,$basecsim);//(" Can't open cached CSIM \"$basecsim\" for reading."); + } + } + } + } + return false; } // Build the argument string to be used with the csim images - function GetURLArguments() { - - // This is a JPGRAPH internal defined that prevents - // us from recursively coming here again - $urlarg = _CSIM_DISPLAY.'=1'; + static function GetURLArguments($aAddRecursiveBlocker=false) { - // Now reconstruct any user URL argument - reset($_GET); - while( list($key,$value) = each($_GET) ) { - if( is_array($value) ) { - foreach ( $value as $k => $v ) { - $urlarg .= '&'.$key.'%5B'.$k.'%5D='.urlencode($v); - } - } - else { - $urlarg .= '&'.$key.'='.urlencode($value); - } - } + if( $aAddRecursiveBlocker ) { + // This is a JPGRAPH internal defined that prevents + // us from recursively coming here again + $urlarg = _CSIM_DISPLAY.'=1'; + } - // It's not ideal to convert POST argument to GET arguments - // but there is little else we can do. One idea for the - // future might be recreate the POST header in case. - reset($_POST); - while( list($key,$value) = each($_POST) ) { - if( is_array($value) ) { - foreach ( $value as $k => $v ) { - $urlarg .= '&'.$key.'%5B'.$k.'%5D='.urlencode($v); - } - } - else { - $urlarg .= '&'.$key.'='.urlencode($value); - } - } + // Now reconstruct any user URL argument + reset($_GET); + while( list($key,$value) = each($_GET) ) { + if( is_array($value) ) { + foreach ( $value as $k => $v ) { + $urlarg .= '&'.$key.'%5B'.$k.'%5D='.urlencode($v); + } + } + else { + $urlarg .= '&'.$key.'='.urlencode($value); + } + } - return $urlarg; + // It's not ideal to convert POST argument to GET arguments + // but there is little else we can do. One idea for the + // future might be recreate the POST header in case. + reset($_POST); + while( list($key,$value) = each($_POST) ) { + if( is_array($value) ) { + foreach ( $value as $k => $v ) { + $urlarg .= '&'.$key.'%5B'.$k.'%5D='.urlencode($v); + } + } + else { + $urlarg .= '&'.$key.'='.urlencode($value); + } + } + + return $urlarg; } function SetCSIMImgAlt($aAlt) { - $this->iCSIMImgAlt = $aAlt; + $this->iCSIMImgAlt = $aAlt; } function StrokeCSIM($aScriptName='auto',$aCSIMName='',$aBorder=0) { - if( $aCSIMName=='' ) { - // create a random map name - srand ((double) microtime() * 1000000); - $r = rand(0,100000); - $aCSIMName='__mapname'.$r.'__'; - } + if( $aCSIMName=='' ) { + // create a random map name + srand ((double) microtime() * 1000000); + $r = rand(0,100000); + $aCSIMName='__mapname'.$r.'__'; + } - if( $aScriptName=='auto' ) - $aScriptName=basename($_SERVER['PHP_SELF']); + if( $aScriptName=='auto' ) { + $aScriptName=basename($_SERVER['PHP_SELF']); + } - $urlarg = $this->GetURLArguments(); + $urlarg = $this->GetURLArguments(true); - if( empty($_GET[_CSIM_DISPLAY]) ) { - // First determine if we need to check for a cached version - // This differs from the standard cache in the sense that the - // image and CSIM map HTML file is written relative to the directory - // the script executes in and not the specified cache directory. - // The reason for this is that the cache directory is not necessarily - // accessible from the HTTP server. - if( $this->csimcachename != '' ) { - $dir = dirname($this->csimcachename); - $base = basename($this->csimcachename); - $base = strtok($base,'.'); - $suffix = strtok('.'); - $basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html'; - $baseimg = $base.'?'.$urlarg.'.'.$this->img->img_format; + if( empty($_GET[_CSIM_DISPLAY]) ) { + // First determine if we need to check for a cached version + // This differs from the standard cache in the sense that the + // image and CSIM map HTML file is written relative to the directory + // the script executes in and not the specified cache directory. + // The reason for this is that the cache directory is not necessarily + // accessible from the HTTP server. + if( $this->csimcachename != '' ) { + $dir = dirname($this->csimcachename); + $base = basename($this->csimcachename); + $base = strtok($base,'.'); + $suffix = strtok('.'); + $basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html'; + $baseimg = $base.'?'.$urlarg.'.'.$this->img->img_format; - // Check that apache can write to directory specified + // Check that apache can write to directory specified - if( file_exists($dir) && !is_writeable($dir) ) { - JpgraphError::RaiseL(25028,$dir);//('Apache/PHP does not have permission to write to the CSIM cache directory ('.$dir.'). Check permissions.'); - } - - // Make sure directory exists - $this->cache->MakeDirs($dir); + if( file_exists($dir) && !is_writeable($dir) ) { + JpgraphError::RaiseL(25028,$dir);//('Apache/PHP does not have permission to write to the CSIM cache directory ('.$dir.'). Check permissions.'); + } - // Write the image file - $this->Stroke(CSIMCACHE_DIR.$baseimg); + // Make sure directory exists + $this->cache->MakeDirs($dir); - // Construct wrapper HTML and write to file and send it back to browser + // Write the image file + $this->Stroke(CSIMCACHE_DIR.$baseimg); - // In the src URL we must replace the '?' with its encoding to prevent the arguments - // to be converted to real arguments. - $tmp = str_replace('?','%3f',$baseimg); - $htmlwrap = $this->GetHTMLImageMap($aCSIMName)."\n". - '\"".$this-iCSIMImgAlt."\" />\n"; + // Construct wrapper HTML and write to file and send it back to browser - if($fh = @fopen($basecsim,'w') ) { - fwrite($fh,$htmlwrap); - fclose($fh); - echo $htmlwrap; - } - else - JpGraphError::RaiseL(25029,$basecsim);//(" Can't write CSIM \"$basecsim\" for writing. Check free space and permissions."); - } - else { + // In the src URL we must replace the '?' with its encoding to prevent the arguments + // to be converted to real arguments. + $tmp = str_replace('?','%3f',$baseimg); + $htmlwrap = $this->GetHTMLImageMap($aCSIMName)."\n". + '\"".$this-iCSIMImgAlt."\" />\n"; - if( $aScriptName=='' ) { - JpGraphError::RaiseL(25030);//('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().'); - } - echo $this->GetHTMLImageMap($aCSIMName); - echo "\"".$this-iCSIMImgAlt."\" />\n"; - } - } - else { - $this->Stroke(); - } + if($fh = @fopen($basecsim,'w') ) { + fwrite($fh,$htmlwrap); + fclose($fh); + echo $htmlwrap; + } + else { + JpGraphError::RaiseL(25029,$basecsim);//(" Can't write CSIM \"$basecsim\" for writing. Check free space and permissions."); + } + } + else { + + if( $aScriptName=='' ) { + JpGraphError::RaiseL(25030);//('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().'); + } + echo $this->GetHTMLImageMap($aCSIMName) . $this->GetCSIMImgHTML($aCSIMName, $aScriptName, $aBorder); + } + } + else { + $this->Stroke(); + } + } + + function StrokeCSIMImage() { + if( @$_GET[_CSIM_DISPLAY] == 1 ) { + $this->Stroke(); + } + } + + function GetCSIMImgHTML($aCSIMName, $aScriptName='auto', $aBorder=0 ) { + if( $aScriptName=='auto' ) { + $aScriptName=basename($_SERVER['PHP_SELF']); + } + $urlarg = $this->GetURLArguments(true); + return "\"".$this-iCSIMImgAlt."\" />\n"; } function GetTextsYMinMax($aY2=false) { - if( $aY2 ) - $txts = $this->y2texts; - else - $txts = $this->texts; - $n = count($txts); - $min=null; - $max=null; - for( $i=0; $i < $n; ++$i ) { - if( $txts[$i]->iScalePosY !== null && - $txts[$i]->iScalePosX !== null ) { - if( $min === null ) { - $min = $max = $txts[$i]->iScalePosY ; - } - else { - $min = min($min,$txts[$i]->iScalePosY); - $max = max($max,$txts[$i]->iScalePosY); - } - } - } - if( $min !== null ) { - return array($min,$max); - } - else - return null; + if( $aY2 ) { + $txts = $this->y2texts; + } + else { + $txts = $this->texts; + } + $n = count($txts); + $min=null; + $max=null; + for( $i=0; $i < $n; ++$i ) { + if( $txts[$i]->iScalePosY !== null && $txts[$i]->iScalePosX !== null ) { + if( $min === null ) { + $min = $max = $txts[$i]->iScalePosY ; + } + else { + $min = min($min,$txts[$i]->iScalePosY); + $max = max($max,$txts[$i]->iScalePosY); + } + } + } + if( $min !== null ) { + return array($min,$max); + } + else { + return null; + } } function GetTextsXMinMax($aY2=false) { - if( $aY2 ) - $txts = $this->y2texts; - else - $txts = $this->texts; - $n = count($txts); - $min=null; - $max=null; - for( $i=0; $i < $n; ++$i ) { - if( $txts[$i]->iScalePosY !== null && - $txts[$i]->iScalePosX !== null ) { - if( $min === null ) { - $min = $max = $txts[$i]->iScalePosX ; - } - else { - $min = min($min,$txts[$i]->iScalePosX); - $max = max($max,$txts[$i]->iScalePosX); - } - } - } - if( $min !== null ) { - return array($min,$max); - } - else - return null; + if( $aY2 ) { + $txts = $this->y2texts; + } + else { + $txts = $this->texts; + } + $n = count($txts); + $min=null; + $max=null; + for( $i=0; $i < $n; ++$i ) { + if( $txts[$i]->iScalePosY !== null && $txts[$i]->iScalePosX !== null ) { + if( $min === null ) { + $min = $max = $txts[$i]->iScalePosX ; + } + else { + $min = min($min,$txts[$i]->iScalePosX); + $max = max($max,$txts[$i]->iScalePosX); + } + } + } + if( $min !== null ) { + return array($min,$max); + } + else { + return null; + } } function GetXMinMax() { - list($min,$ymin) = $this->plots[0]->Min(); - list($max,$ymax) = $this->plots[0]->Max(); - foreach( $this->plots as $p ) { - list($xmin,$ymin) = $p->Min(); - list($xmax,$ymax) = $p->Max(); - $min = Min($xmin,$min); - $max = Max($xmax,$max); - } + list($min,$ymin) = $this->plots[0]->Min(); + list($max,$ymax) = $this->plots[0]->Max(); + foreach( $this->plots as $p ) { + list($xmin,$ymin) = $p->Min(); + list($xmax,$ymax) = $p->Max(); + $min = Min($xmin,$min); + $max = Max($xmax,$max); + } - if( $this->y2axis != null ) { - foreach( $this->y2plots as $p ) { - list($xmin,$ymin) = $p->Min(); - list($xmax,$ymax) = $p->Max(); - $min = Min($xmin,$min); - $max = Max($xmax,$max); - } - } + if( $this->y2axis != null ) { + foreach( $this->y2plots as $p ) { + list($xmin,$ymin) = $p->Min(); + list($xmax,$ymax) = $p->Max(); + $min = Min($xmin,$min); + $max = Max($xmax,$max); + } + } - $n = count($this->ynaxis); - for( $i=0; $i < $n; ++$i ) { - if( $this->ynaxis[$i] != null) { - foreach( $this->ynplots[$i] as $p ) { - list($xmin,$ymin) = $p->Min(); - list($xmax,$ymax) = $p->Max(); - $min = Min($xmin,$min); - $max = Max($xmax,$max); - } - } - } - return array($min,$max); + $n = count($this->ynaxis); + for( $i=0; $i < $n; ++$i ) { + if( $this->ynaxis[$i] != null) { + foreach( $this->ynplots[$i] as $p ) { + list($xmin,$ymin) = $p->Min(); + list($xmax,$ymax) = $p->Max(); + $min = Min($xmin,$min); + $max = Max($xmax,$max); + } + } + } + return array($min,$max); } function AdjustMarginsForTitles() { - $totrequired = - ($this->title->t != '' ? - $this->title->GetTextHeight($this->img) + $this->title->margin + 5 : 0 ) + - ($this->subtitle->t != '' ? - $this->subtitle->GetTextHeight($this->img) + $this->subtitle->margin + 5 : 0 ) + - ($this->subsubtitle->t != '' ? - $this->subsubtitle->GetTextHeight($this->img) + $this->subsubtitle->margin + 5 : 0 ) ; - + $totrequired = ($this->title->t != '' ? $this->title->GetTextHeight($this->img) + $this->title->margin + 5 : 0 ) + + ($this->subtitle->t != '' ? $this->subtitle->GetTextHeight($this->img) + $this->subtitle->margin + 5 : 0 ) + + ($this->subsubtitle->t != '' ? $this->subsubtitle->GetTextHeight($this->img) + $this->subsubtitle->margin + 5 : 0 ) ; - $btotrequired = 0; - if($this->xaxis != null && !$this->xaxis->hide && !$this->xaxis->hide_labels ) { - // Minimum bottom margin - if( $this->xaxis->title->t != '' ) { - if( $this->img->a == 90 ) - $btotrequired = $this->yaxis->title->GetTextHeight($this->img) + 5 ; - else - $btotrequired = $this->xaxis->title->GetTextHeight($this->img) + 5 ; - } - else - $btotrequired = 0; - - if( $this->img->a == 90 ) { - $this->img->SetFont($this->yaxis->font_family,$this->yaxis->font_style, - $this->yaxis->font_size); - $lh = $this->img->GetTextHeight('Mg',$this->yaxis->label_angle); - } - else { - $this->img->SetFont($this->xaxis->font_family,$this->xaxis->font_style, - $this->xaxis->font_size); - $lh = $this->img->GetTextHeight('Mg',$this->xaxis->label_angle); - } - - $btotrequired += $lh + 5; - } + $btotrequired = 0; + if($this->xaxis != null && !$this->xaxis->hide && !$this->xaxis->hide_labels ) { + // Minimum bottom margin + if( $this->xaxis->title->t != '' ) { + if( $this->img->a == 90 ) { + $btotrequired = $this->yaxis->title->GetTextHeight($this->img) + 7 ; + } + else { + $btotrequired = $this->xaxis->title->GetTextHeight($this->img) + 7 ; + } + } + else { + $btotrequired = 0; + } - if( $this->img->a == 90 ) { - // DO Nothing. It gets too messy to do this properly for 90 deg... - } - else{ - if( $this->img->top_margin < $totrequired ) { - $this->SetMargin($this->img->left_margin,$this->img->right_margin, - $totrequired,$this->img->bottom_margin); - } - if( $this->img->bottom_margin < $btotrequired ) { - $this->SetMargin($this->img->left_margin,$this->img->right_margin, - $this->img->top_margin,$btotrequired); - } - } + if( $this->img->a == 90 ) { + $this->img->SetFont($this->yaxis->font_family,$this->yaxis->font_style, + $this->yaxis->font_size); + $lh = $this->img->GetTextHeight('Mg',$this->yaxis->label_angle); + } + else { + $this->img->SetFont($this->xaxis->font_family,$this->xaxis->font_style, + $this->xaxis->font_size); + $lh = $this->img->GetTextHeight('Mg',$this->xaxis->label_angle); + } + + $btotrequired += $lh + 6; + } + + if( $this->img->a == 90 ) { + // DO Nothing. It gets too messy to do this properly for 90 deg... + } + else{ + if( $this->img->top_margin < $totrequired ) { + $this->SetMargin($this->img->left_margin,$this->img->right_margin, + $totrequired,$this->img->bottom_margin); + } + if( $this->img->bottom_margin < $btotrequired ) { + $this->SetMargin($this->img->left_margin,$this->img->right_margin, + $this->img->top_margin,$btotrequired); + } + } } + function StrokeStore($aStrokeFileName) { + // Get the handler to prevent the library from sending the + // image to the browser + $ih = $this->Stroke(_IMG_HANDLER); + + // Stroke it to a file + $this->img->Stream($aStrokeFileName); + + // Send it back to browser + $this->img->Headers(); + $this->img->Stream(); + } + + function doAutoscaleXAxis() { + //Check if we should autoscale x-axis + if( !$this->xscale->IsSpecified() ) { + if( substr($this->axtype,0,4) == "text" ) { + $max=0; + $n = count($this->plots); + for($i=0; $i < $n; ++$i ) { + $p = $this->plots[$i]; + // We need some unfortunate sub class knowledge here in order + // to increase number of data points in case it is a line plot + // which has the barcenter set. If not it could mean that the + // last point of the data is outside the scale since the barcenter + // settings means that we will shift the entire plot half a tick step + // to the right in oder to align with the center of the bars. + if( class_exists('BarPlot',false) ) { + $cl = strtolower(get_class($p)); + if( (class_exists('BarPlot',false) && ($p instanceof BarPlot)) || empty($p->barcenter) ) { + $max=max($max,$p->numpoints-1); + } + else { + $max=max($max,$p->numpoints); + } + } + else { + if( empty($p->barcenter) ) { + $max=max($max,$p->numpoints-1); + } + else { + $max=max($max,$p->numpoints); + } + } + } + $min=0; + if( $this->y2axis != null ) { + foreach( $this->y2plots as $p ) { + $max=max($max,$p->numpoints-1); + } + } + $n = count($this->ynaxis); + for( $i=0; $i < $n; ++$i ) { + if( $this->ynaxis[$i] != null) { + foreach( $this->ynplots[$i] as $p ) { + $max=max($max,$p->numpoints-1); + } + } + } + + $this->xscale->Update($this->img,$min,$max); + $this->xscale->ticks->Set($this->xaxis->tick_step,1); + $this->xscale->ticks->SupressMinorTickMarks(); + } + else { + list($min,$max) = $this->GetXMinMax(); + + $lres = $this->GetLinesXMinMax($this->lines); + if( $lres ) { + list($linmin,$linmax) = $lres ; + $min = min($min,$linmin); + $max = max($max,$linmax); + } + + $lres = $this->GetLinesXMinMax($this->y2lines); + if( $lres ) { + list($linmin,$linmax) = $lres ; + $min = min($min,$linmin); + $max = max($max,$linmax); + } + + $tres = $this->GetTextsXMinMax(); + if( $tres ) { + list($tmin,$tmax) = $tres ; + $min = min($min,$tmin); + $max = max($max,$tmax); + } + + $tres = $this->GetTextsXMinMax(true); + if( $tres ) { + list($tmin,$tmax) = $tres ; + $min = min($min,$tmin); + $max = max($max,$tmax); + } + + $this->xscale->AutoScale($this->img,$min,$max,round($this->img->plotwidth/$this->xtick_factor)); + } + + //Adjust position of y-axis and y2-axis to minimum/maximum of x-scale + if( !is_numeric($this->yaxis->pos) && !is_string($this->yaxis->pos) ) { + $this->yaxis->SetPos($this->xscale->GetMinVal()); + } + if( $this->y2axis != null ) { + if( !is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos) ) { + $this->y2axis->SetPos($this->xscale->GetMaxVal()); + } + $this->y2axis->SetTitleSide(SIDE_RIGHT); + } + $n = count($this->ynaxis); + $nY2adj = $this->y2axis != null ? $this->iYAxisDeltaPos : 0; + for( $i=0; $i < $n; ++$i ) { + if( $this->ynaxis[$i] != null ) { + if( !is_numeric($this->ynaxis[$i]->pos) && !is_string($this->ynaxis[$i]->pos) ) { + $this->ynaxis[$i]->SetPos($this->xscale->GetMaxVal()); + $this->ynaxis[$i]->SetPosAbsDelta($i*$this->iYAxisDeltaPos + $nY2adj); + } + $this->ynaxis[$i]->SetTitleSide(SIDE_RIGHT); + } + } + + } + elseif( $this->xscale->IsSpecified() && ( $this->xscale->auto_ticks || !$this->xscale->ticks->IsSpecified()) ) { + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + $min = $this->xscale->scale[0]; + $max = $this->xscale->scale[1]; + $this->xscale->AutoScale($this->img,$min,$max,round($this->img->plotwidth/$this->xtick_factor),false); + + // Now make sure we show enough precision to accurate display the + // labels. If this is not done then the user might end up with + // a scale that might actually start with, say 13.5, butdue to rounding + // the scale label will ony show 14. + if( abs(floor($min)-$min) > 0 ) { + + // If the user has set a format then we bail out + if( $this->xscale->ticks->label_formatstr == '' && $this->xscale->ticks->label_dateformatstr == '' ) { + $this->xscale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1; + } + } + + if( $this->y2axis != null ) { + if( !is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos) ) { + $this->y2axis->SetPos($this->xscale->GetMaxVal()); + } + $this->y2axis->SetTitleSide(SIDE_RIGHT); + } + + $n = count($this->ynaxis); + $nY2adj = $this->y2axis != null ? $this->iYAxisDeltaPos : 0; + for( $i=0; $i < $n; ++$i ) { + if( $this->ynaxis[$i] != null ) { + if( !is_numeric($this->ynaxis[$i]->pos) && !is_string($this->ynaxis[$i]->pos) ) { + $this->ynaxis[$i]->SetPos($this->xscale->GetMaxVal()); + $this->ynaxis[$i]->SetPosAbsDelta($i*$this->iYAxisDeltaPos + $nY2adj); + } + $this->ynaxis[$i]->SetTitleSide(SIDE_RIGHT); + } + } + + } + } + + + function doAutoScaleYnAxis() { + + if( $this->y2scale != null) { + if( !$this->y2scale->IsSpecified() && count($this->y2plots)>0 ) { + list($min,$max) = $this->GetPlotsYMinMax($this->y2plots); + + $lres = $this->GetLinesYMinMax($this->y2lines); + if( is_array($lres) ) { + list($linmin,$linmax) = $lres ; + $min = min($min,$linmin); + $max = max($max,$linmax); + } + $tres = $this->GetTextsYMinMax(true); + if( is_array($tres) ) { + list($tmin,$tmax) = $tres ; + $min = min($min,$tmin); + $max = max($max,$tmax); + } + $this->y2scale->AutoScale($this->img,$min,$max,$this->img->plotheight/$this->ytick_factor); + } + elseif( $this->y2scale->IsSpecified() && ( $this->y2scale->auto_ticks || !$this->y2scale->ticks->IsSpecified()) ) { + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + $min = $this->y2scale->scale[0]; + $max = $this->y2scale->scale[1]; + $this->y2scale->AutoScale($this->img,$min,$max, + $this->img->plotheight/$this->ytick_factor, + $this->y2scale->auto_ticks); + + // Now make sure we show enough precision to accurate display the + // labels. If this is not done then the user might end up with + // a scale that might actually start with, say 13.5, butdue to rounding + // the scale label will ony show 14. + if( abs(floor($min)-$min) > 0 ) { + // If the user has set a format then we bail out + if( $this->y2scale->ticks->label_formatstr == '' && $this->y2scale->ticks->label_dateformatstr == '' ) { + $this->y2scale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1; + } + } + + } + } + + + // + // Autoscale the extra Y-axises + // + $n = count($this->ynaxis); + for( $i=0; $i < $n; ++$i ) { + if( $this->ynscale[$i] != null) { + if( !$this->ynscale[$i]->IsSpecified() && count($this->ynplots[$i])>0 ) { + list($min,$max) = $this->GetPlotsYMinMax($this->ynplots[$i]); + $this->ynscale[$i]->AutoScale($this->img,$min,$max,$this->img->plotheight/$this->ytick_factor); + } + elseif( $this->ynscale[$i]->IsSpecified() && ( $this->ynscale[$i]->auto_ticks || !$this->ynscale[$i]->ticks->IsSpecified()) ) { + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + $min = $this->ynscale[$i]->scale[0]; + $max = $this->ynscale[$i]->scale[1]; + $this->ynscale[$i]->AutoScale($this->img,$min,$max, + $this->img->plotheight/$this->ytick_factor, + $this->ynscale[$i]->auto_ticks); + + // Now make sure we show enough precision to accurate display the + // labels. If this is not done then the user might end up with + // a scale that might actually start with, say 13.5, butdue to rounding + // the scale label will ony show 14. + if( abs(floor($min)-$min) > 0 ) { + // If the user has set a format then we bail out + if( $this->ynscale[$i]->ticks->label_formatstr == '' && $this->ynscale[$i]->ticks->label_dateformatstr == '' ) { + $this->ynscale[$i]->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1; + } + } + } + } + } + } + + function doAutoScaleYAxis() { + + //Check if we should autoscale y-axis + if( !$this->yscale->IsSpecified() && count($this->plots)>0 ) { + list($min,$max) = $this->GetPlotsYMinMax($this->plots); + $lres = $this->GetLinesYMinMax($this->lines); + if( is_array($lres) ) { + list($linmin,$linmax) = $lres ; + $min = min($min,$linmin); + $max = max($max,$linmax); + } + $tres = $this->GetTextsYMinMax(); + if( is_array($tres) ) { + list($tmin,$tmax) = $tres ; + $min = min($min,$tmin); + $max = max($max,$tmax); + } + $this->yscale->AutoScale($this->img,$min,$max, + $this->img->plotheight/$this->ytick_factor); + } + elseif( $this->yscale->IsSpecified() && ( $this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified()) ) { + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + $min = $this->yscale->scale[0]; + $max = $this->yscale->scale[1]; + $this->yscale->AutoScale($this->img,$min,$max, + $this->img->plotheight/$this->ytick_factor, + $this->yscale->auto_ticks); + + // Now make sure we show enough precision to accurate display the + // labels. If this is not done then the user might end up with + // a scale that might actually start with, say 13.5, butdue to rounding + // the scale label will ony show 14. + if( abs(floor($min)-$min) > 0 ) { + + // If the user has set a format then we bail out + if( $this->yscale->ticks->label_formatstr == '' && $this->yscale->ticks->label_dateformatstr == '' ) { + $this->yscale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1; + } + } + } + + } + + function InitScaleConstants() { + // Setup scale constants + if( $this->yscale ) $this->yscale->InitConstants($this->img); + if( $this->xscale ) $this->xscale->InitConstants($this->img); + if( $this->y2scale ) $this->y2scale->InitConstants($this->img); + + $n=count($this->ynscale); + for($i=0; $i < $n; ++$i) { + if( $this->ynscale[$i] ) { + $this->ynscale[$i]->InitConstants($this->img); + } + } + } + + function doPrestrokeAdjustments() { + + // Do any pre-stroke adjustment that is needed by the different plot types + // (i.e bar plots want's to add an offset to the x-labels etc) + for($i=0; $i < count($this->plots) ; ++$i ) { + $this->plots[$i]->PreStrokeAdjust($this); + $this->plots[$i]->DoLegend($this); + } + + // Any plots on the second Y scale? + if( $this->y2scale != null ) { + for($i=0; $iy2plots) ; ++$i ) { + $this->y2plots[$i]->PreStrokeAdjust($this); + $this->y2plots[$i]->DoLegend($this); + } + } + + // Any plots on the extra Y axises? + $n = count($this->ynaxis); + for($i=0; $i<$n ; ++$i ) { + if( $this->ynplots == null || $this->ynplots[$i] == null) { + JpGraphError::RaiseL(25032,$i);//("No plots for Y-axis nbr:$i"); + } + $m = count($this->ynplots[$i]); + for($j=0; $j < $m; ++$j ) { + $this->ynplots[$i][$j]->PreStrokeAdjust($this); + $this->ynplots[$i][$j]->DoLegend($this); + } + } + } + + function StrokeBands($aDepth,$aCSIM) { + // Stroke bands + if( $this->bands != null && !$aCSIM) { + for($i=0; $i < count($this->bands); ++$i) { + // Stroke all bands that asks to be in the background + if( $this->bands[$i]->depth == $aDepth ) { + $this->bands[$i]->Stroke($this->img,$this->xscale,$this->yscale); + } + } + } + + if( $this->y2bands != null && $this->y2scale != null && !$aCSIM ) { + for($i=0; $i < count($this->y2bands); ++$i) { + // Stroke all bands that asks to be in the foreground + if( $this->y2bands[$i]->depth == $aDepth ) { + $this->y2bands[$i]->Stroke($this->img,$this->xscale,$this->y2scale); + } + } + } + } + + // Stroke the graph - // $aStrokeFileName If != "" the image will be written to this file and NOT + // $aStrokeFileName If != "" the image will be written to this file and NOT // streamed back to the browser - function Stroke($aStrokeFileName="") { + function Stroke($aStrokeFileName='') { - // Fist make a sanity check that user has specified a scale - if( empty($this->yscale) ) { - JpGraphError::RaiseL(25031);//('You must specify what scale to use with a call to Graph::SetScale().'); - } + // Fist make a sanity check that user has specified a scale + if( empty($this->yscale) ) { + JpGraphError::RaiseL(25031);//('You must specify what scale to use with a call to Graph::SetScale().'); + } - // Start by adjusting the margin so that potential titles will fit. - $this->AdjustMarginsForTitles(); + // Start by adjusting the margin so that potential titles will fit. + $this->AdjustMarginsForTitles(); - // Setup scale constants - if( $this->yscale ) $this->yscale->InitConstants($this->img); - if( $this->xscale ) $this->xscale->InitConstants($this->img); - if( $this->y2scale ) $this->y2scale->InitConstants($this->img); - - $n=count($this->ynscale); - for($i=0; $i < $n; ++$i) { - if( $this->ynscale[$i] ) $this->ynscale[$i]->InitConstants($this->img); - } + // Give the plot a chance to do any scale adjuments the individual plots + // wants to do. Right now this is only used by the contour plot to set scale + // limits + for($i=0; $i < count($this->plots) ; ++$i ) { + $this->plots[$i]->PreScaleSetup($this); + } - // If the filename is the predefined value = '_csim_special_' - // we assume that the call to stroke only needs to do enough - // to correctly generate the CSIM maps. - // We use this variable to skip things we don't strictly need - // to do to generate the image map to improve performance - // a best we can. Therefor you will see a lot of tests !$_csim in the - // code below. - $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); + // Init scale constants that are used to calculate the transformation from + // world to pixel coordinates + $this->InitScaleConstants(); - // We need to know if we have stroked the plot in the - // GetCSIMareas. Otherwise the CSIM hasn't been generated - // and in the case of GetCSIM called before stroke to generate - // CSIM without storing an image to disk GetCSIM must call Stroke. - $this->iHasStroked = true; + // If the filename is the predefined value = '_csim_special_' + // we assume that the call to stroke only needs to do enough + // to correctly generate the CSIM maps. + // We use this variable to skip things we don't strictly need + // to do to generate the image map to improve performance + // a best we can. Therefor you will see a lot of tests !$_csim in the + // code below. + $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); - // Do any pre-stroke adjustment that is needed by the different plot types - // (i.e bar plots want's to add an offset to the x-labels etc) - for($i=0; $i < count($this->plots) ; ++$i ) { - $this->plots[$i]->PreStrokeAdjust($this); - $this->plots[$i]->DoLegend($this); - } - - // Any plots on the second Y scale? - if( $this->y2scale != null ) { - for($i=0; $iy2plots) ; ++$i ) { - $this->y2plots[$i]->PreStrokeAdjust($this); - $this->y2plots[$i]->DoLegend($this); - } - } + // If we are called the second time (perhaps the user has called GetHTMLImageMap() + // himself then the legends have alsready been populated once in order to get the + // CSIM coordinats. Since we do not want the legends to be populated a second time + // we clear the legends + $this->legend->Clear(); - // Any plots on the extra Y axises? - $n = count($this->ynaxis); - for($i=0; $i<$n ; ++$i ) { - if( $this->ynplots == null || $this->ynplots[$i] == null) { - JpGraphError::RaiseL(25032,$i);//("No plots for Y-axis nbr:$i"); - } - $m = count($this->ynplots[$i]); - for($j=0; $j < $m; ++$j ) { - $this->ynplots[$i][$j]->PreStrokeAdjust($this); - $this->ynplots[$i][$j]->DoLegend($this); - } - } + // We need to know if we have stroked the plot in the + // GetCSIMareas. Otherwise the CSIM hasn't been generated + // and in the case of GetCSIM called before stroke to generate + // CSIM without storing an image to disk GetCSIM must call Stroke. + $this->iHasStroked = true; - // Bail out if any of the Y-axis not been specified and - // has no plots. (This means it is impossible to do autoscaling and - // no other scale was given so we can't possible draw anything). If you use manual - // scaling you also have to supply the tick steps as well. - if( (!$this->yscale->IsSpecified() && count($this->plots)==0) || - ($this->y2scale!=null && !$this->y2scale->IsSpecified() && count($this->y2plots)==0) ) { - //$e = "n=".count($this->y2plots)."\n"; - // $e = "Can't draw unspecified Y-scale.
\nYou have either:
\n"; - // $e .= "1. Specified an Y axis for autoscaling but have not supplied any plots
\n"; - // $e .= "2. Specified a scale manually but have forgot to specify the tick steps"; - JpGraphError::RaiseL(25026); - } - - // Bail out if no plots and no specified X-scale - if( (!$this->xscale->IsSpecified() && count($this->plots)==0 && count($this->y2plots)==0) ) - JpGraphError::RaiseL(25034);//("JpGraph: Can't draw unspecified X-scale.
No plots.
"); + // Setup pre-stroked adjustments and Legends + $this->doPrestrokeAdjustments(); - //Check if we should autoscale y-axis - if( !$this->yscale->IsSpecified() && count($this->plots)>0 ) { - list($min,$max) = $this->GetPlotsYMinMax($this->plots); - $lres = $this->GetLinesYMinMax($this->lines); - if( is_array($lres) ) { - list($linmin,$linmax) = $lres ; - $min = min($min,$linmin); - $max = max($max,$linmax); - } - $tres = $this->GetTextsYMinMax(); - if( is_array($tres) ) { - list($tmin,$tmax) = $tres ; - $min = min($min,$tmin); - $max = max($max,$tmax); - } - $this->yscale->AutoScale($this->img,$min,$max, - $this->img->plotheight/$this->ytick_factor); - } - elseif( $this->yscale->IsSpecified() && - ( $this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified()) ) { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - $min = $this->yscale->scale[0]; - $max = $this->yscale->scale[1]; - $this->yscale->AutoScale($this->img,$min,$max, - $this->img->plotheight/$this->ytick_factor, - $this->yscale->auto_ticks); + // Bail out if any of the Y-axis not been specified and + // has no plots. (This means it is impossible to do autoscaling and + // no other scale was given so we can't possible draw anything). If you use manual + // scaling you also have to supply the tick steps as well. + if( (!$this->yscale->IsSpecified() && count($this->plots)==0) || + ($this->y2scale!=null && !$this->y2scale->IsSpecified() && count($this->y2plots)==0) ) { + //$e = "n=".count($this->y2plots)."\n"; + // $e = "Can't draw unspecified Y-scale.
\nYou have either:
\n"; + // $e .= "1. Specified an Y axis for autoscaling but have not supplied any plots
\n"; + // $e .= "2. Specified a scale manually but have forgot to specify the tick steps"; + JpGraphError::RaiseL(25026); + } - // Now make sure we show enough precision to accurate display the - // labels. If this is not done then the user might end up with - // a scale that might actually start with, say 13.5, butdue to rounding - // the scale label will ony show 14. - if( abs(floor($min)-$min) > 0 ) { - - // If the user has set a format then we bail out - if( $this->yscale->ticks->label_formatstr == '' && $this->yscale->ticks->label_dateformatstr == '' ) { - $this->yscale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1; - } - } - } + // Bail out if no plots and no specified X-scale + if( (!$this->xscale->IsSpecified() && count($this->plots)==0 && count($this->y2plots)==0) ) { + JpGraphError::RaiseL(25034);//("JpGraph: Can't draw unspecified X-scale.
No plots.
"); + } - if( $this->y2scale != null) { - if( !$this->y2scale->IsSpecified() && count($this->y2plots)>0 ) { - list($min,$max) = $this->GetPlotsYMinMax($this->y2plots); + // Autoscale the normal Y-axis + $this->doAutoScaleYAxis(); - $lres = $this->GetLinesYMinMax($this->y2lines); - if( is_array($lres) ) { - list($linmin,$linmax) = $lres ; - $min = min($min,$linmin); - $max = max($max,$linmax); - } - $tres = $this->GetTextsYMinMax(true); - if( is_array($tres) ) { - list($tmin,$tmax) = $tres ; - $min = min($min,$tmin); - $max = max($max,$tmax); - } - $this->y2scale->AutoScale($this->img,$min,$max,$this->img->plotheight/$this->ytick_factor); - } - elseif( $this->y2scale->IsSpecified() && - ( $this->y2scale->auto_ticks || !$this->y2scale->ticks->IsSpecified()) ) { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - $min = $this->y2scale->scale[0]; - $max = $this->y2scale->scale[1]; - $this->y2scale->AutoScale($this->img,$min,$max, - $this->img->plotheight/$this->ytick_factor, - $this->y2scale->auto_ticks); + // Autoscale all additiopnal y-axis + $this->doAutoScaleYnAxis(); - // Now make sure we show enough precision to accurate display the - // labels. If this is not done then the user might end up with - // a scale that might actually start with, say 13.5, butdue to rounding - // the scale label will ony show 14. - if( abs(floor($min)-$min) > 0 ) { - - // If the user has set a format then we bail out - if( $this->y2scale->ticks->label_formatstr == '' && $this->y2scale->ticks->label_dateformatstr == '' ) { - $this->y2scale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1; - } - } + // Autoscale the regular x-axis and position the y-axis properly + $this->doAutoScaleXAxis(); - } - } - - // - // Autoscale the extra Y-axises - // - $n = count($this->ynaxis); - for( $i=0; $i < $n; ++$i ) { - if( $this->ynscale[$i] != null) { - if( !$this->ynscale[$i]->IsSpecified() && count($this->ynplots[$i])>0 ) { - list($min,$max) = $this->GetPlotsYMinMax($this->ynplots[$i]); - $this->ynscale[$i]->AutoScale($this->img,$min,$max,$this->img->plotheight/$this->ytick_factor); - } - elseif( $this->ynscale[$i]->IsSpecified() && - ( $this->ynscale[$i]->auto_ticks || !$this->ynscale[$i]->ticks->IsSpecified()) ) { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - $min = $this->ynscale[$i]->scale[0]; - $max = $this->ynscale[$i]->scale[1]; - $this->ynscale[$i]->AutoScale($this->img,$min,$max, - $this->img->plotheight/$this->ytick_factor, - $this->ynscale[$i]->auto_ticks); + // If we have a negative values and x-axis position is at 0 + // we need to supress the first and possible the last tick since + // they will be drawn on top of the y-axis (and possible y2 axis) + // The test below might seem strange the reasone being that if + // the user hasn't specified a value for position this will not + // be set until we do the stroke for the axis so as of now it + // is undefined. + // For X-text scale we ignore all this since the tick are usually + // much further in and not close to the Y-axis. Hence the test + // for 'text' + if( ($this->yaxis->pos==$this->xscale->GetMinVal() || (is_string($this->yaxis->pos) && $this->yaxis->pos=='min')) && + !is_numeric($this->xaxis->pos) && $this->yscale->GetMinVal() < 0 && + substr($this->axtype,0,4) != 'text' && $this->xaxis->pos != 'min' ) { - // Now make sure we show enough precision to accurate display the - // labels. If this is not done then the user might end up with - // a scale that might actually start with, say 13.5, butdue to rounding - // the scale label will ony show 14. - if( abs(floor($min)-$min) > 0 ) { - - // If the user has set a format then we bail out - if( $this->ynscale[$i]->ticks->label_formatstr == '' && $this->ynscale[$i]->ticks->label_dateformatstr == '' ) { - $this->ynscale[$i]->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1; - } - } + //$this->yscale->ticks->SupressZeroLabel(false); + $this->xscale->ticks->SupressFirst(); + if( $this->y2axis != null ) { + $this->xscale->ticks->SupressLast(); + } + } + elseif( !is_numeric($this->yaxis->pos) && $this->yaxis->pos=='max' ) { + $this->xscale->ticks->SupressLast(); + } - } - } - } - - //Check if we should autoscale x-axis - if( !$this->xscale->IsSpecified() ) { - if( substr($this->axtype,0,4) == "text" ) { - $max=0; - $n = count($this->plots); - for($i=0; $i < $n; ++$i ) { - $p = $this->plots[$i]; - // We need some unfortunate sub class knowledge here in order - // to increase number of data points in case it is a line plot - // which has the barcenter set. If not it could mean that the - // last point of the data is outside the scale since the barcenter - // settings means that we will shift the entire plot half a tick step - // to the right in oder to align with the center of the bars. - if( class_exists('BarPlot',false) ) { - $cl = strtolower(get_class($p)); - if( (class_exists('BarPlot',false) && ($p instanceof BarPlot)) || - empty($p->barcenter) ) - $max=max($max,$p->numpoints-1); - else { - $max=max($max,$p->numpoints); - } - } - else { - if( empty($p->barcenter) ) { - $max=max($max,$p->numpoints-1); - } - else { - $max=max($max,$p->numpoints); - } - } - } - $min=0; - if( $this->y2axis != null ) { - foreach( $this->y2plots as $p ) { - $max=max($max,$p->numpoints-1); - } - } - $n = count($this->ynaxis); - for( $i=0; $i < $n; ++$i ) { - if( $this->ynaxis[$i] != null) { - foreach( $this->ynplots[$i] as $p ) { - $max=max($max,$p->numpoints-1); - } - } - } - - $this->xscale->Update($this->img,$min,$max); - $this->xscale->ticks->Set($this->xaxis->tick_step,1); - $this->xscale->ticks->SupressMinorTickMarks(); - } - else { - list($min,$max) = $this->GetXMinMax(); + if( !$_csim ) { + $this->StrokePlotArea(); + if( $this->iIconDepth == DEPTH_BACK ) { + $this->StrokeIcons(); + } + } + $this->StrokeAxis(false); - $lres = $this->GetLinesXMinMax($this->lines); - if( $lres ) { - list($linmin,$linmax) = $lres ; - $min = min($min,$linmin); - $max = max($max,$linmax); - } + // Stroke colored bands + $this->StrokeBands(DEPTH_BACK,$_csim); - $lres = $this->GetLinesXMinMax($this->y2lines); - if( $lres ) { - list($linmin,$linmax) = $lres ; - $min = min($min,$linmin); - $max = max($max,$linmax); - } + if( $this->grid_depth == DEPTH_BACK && !$_csim) { + $this->ygrid->Stroke(); + $this->xgrid->Stroke(); + } - $tres = $this->GetTextsXMinMax(); - if( $tres ) { - list($tmin,$tmax) = $tres ; - $min = min($min,$tmin); - $max = max($max,$tmax); - } + // Stroke Y2-axis + if( $this->y2axis != null && !$_csim) { + $this->y2axis->Stroke($this->xscale); + $this->y2grid->Stroke(); + } - $tres = $this->GetTextsXMinMax(true); - if( $tres ) { - list($tmin,$tmax) = $tres ; - $min = min($min,$tmin); - $max = max($max,$tmax); - } + // Stroke yn-axis + $n = count($this->ynaxis); + for( $i=0; $i < $n; ++$i ) { + $this->ynaxis[$i]->Stroke($this->xscale); + } - $this->xscale->AutoScale($this->img,$min,$max,round($this->img->plotwidth/$this->xtick_factor)); - } - - //Adjust position of y-axis and y2-axis to minimum/maximum of x-scale - if( !is_numeric($this->yaxis->pos) && !is_string($this->yaxis->pos) ) - $this->yaxis->SetPos($this->xscale->GetMinVal()); - if( $this->y2axis != null ) { - if( !is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos) ) - $this->y2axis->SetPos($this->xscale->GetMaxVal()); - $this->y2axis->SetTitleSide(SIDE_RIGHT); - } - $n = count($this->ynaxis); - $nY2adj = $this->y2axis != null ? $this->iYAxisDeltaPos : 0; - for( $i=0; $i < $n; ++$i ) { - if( $this->ynaxis[$i] != null ) { - if( !is_numeric($this->ynaxis[$i]->pos) && !is_string($this->ynaxis[$i]->pos) ) { - $this->ynaxis[$i]->SetPos($this->xscale->GetMaxVal()); - $this->ynaxis[$i]->SetPosAbsDelta($i*$this->iYAxisDeltaPos + $nY2adj); - } - $this->ynaxis[$i]->SetTitleSide(SIDE_RIGHT); - } - } + $oldoff=$this->xscale->off; + if( substr($this->axtype,0,4) == 'text' ) { + if( $this->text_scale_abscenteroff > -1 ) { + // For a text scale the scale factor is the number of pixel per step. + // Hence we can use the scale factor as a substitute for number of pixels + // per major scale step and use that in order to adjust the offset so that + // an object of width "abscenteroff" becomes centered. + $this->xscale->off += round($this->xscale->scale_factor/2)-round($this->text_scale_abscenteroff/2); + } + else { + $this->xscale->off += ceil($this->xscale->scale_factor*$this->text_scale_off*$this->xscale->ticks->minor_step); + } + } - } - elseif( $this->xscale->IsSpecified() && - ( $this->xscale->auto_ticks || !$this->xscale->ticks->IsSpecified()) ) { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - $min = $this->xscale->scale[0]; - $max = $this->xscale->scale[1]; - $this->xscale->AutoScale($this->img,$min,$max, - round($this->img->plotwidth/$this->xtick_factor), - false); + if( $this->iDoClipping ) { + $oldimage = $this->img->CloneCanvasH(); + } - // Now make sure we show enough precision to accurate display the - // labels. If this is not done then the user might end up with - // a scale that might actually start with, say 13.5, butdue to rounding - // the scale label will ony show 14. - if( abs(floor($min)-$min) > 0 ) { - - // If the user has set a format then we bail out - if( $this->xscale->ticks->label_formatstr == '' && $this->xscale->ticks->label_dateformatstr == '' ) { - $this->xscale->ticks->precision = abs( floor(log10( abs(floor($min)-$min))) )+1; - } - } + if( ! $this->y2orderback ) { + // Stroke all plots for Y1 axis + for($i=0; $i < count($this->plots); ++$i) { + $this->plots[$i]->Stroke($this->img,$this->xscale,$this->yscale); + $this->plots[$i]->StrokeMargin($this->img); + } + } + // Stroke all plots for Y2 axis + if( $this->y2scale != null ) { + for($i=0; $i< count($this->y2plots); ++$i ) { + $this->y2plots[$i]->Stroke($this->img,$this->xscale,$this->y2scale); + } + } - if( $this->y2axis != null ) { - if( !is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos) ) - $this->y2axis->SetPos($this->xscale->GetMaxVal()); - $this->y2axis->SetTitleSide(SIDE_RIGHT); - } + if( $this->y2orderback ) { + // Stroke all plots for Y1 axis + for($i=0; $i < count($this->plots); ++$i) { + $this->plots[$i]->Stroke($this->img,$this->xscale,$this->yscale); + $this->plots[$i]->StrokeMargin($this->img); + } + } - } - - // If we have a negative values and x-axis position is at 0 - // we need to supress the first and possible the last tick since - // they will be drawn on top of the y-axis (and possible y2 axis) - // The test below might seem strange the reasone being that if - // the user hasn't specified a value for position this will not - // be set until we do the stroke for the axis so as of now it - // is undefined. - // For X-text scale we ignore all this since the tick are usually - // much further in and not close to the Y-axis. Hence the test - // for 'text' + $n = count($this->ynaxis); + for( $i=0; $i < $n; ++$i ) { + $m = count($this->ynplots[$i]); + for( $j=0; $j < $m; ++$j ) { + $this->ynplots[$i][$j]->Stroke($this->img,$this->xscale,$this->ynscale[$i]); + $this->ynplots[$i][$j]->StrokeMargin($this->img); + } + } - if( ($this->yaxis->pos==$this->xscale->GetMinVal() || - (is_string($this->yaxis->pos) && $this->yaxis->pos=='min')) && - !is_numeric($this->xaxis->pos) && $this->yscale->GetMinVal() < 0 && - substr($this->axtype,0,4) != 'text' && $this->xaxis->pos!="min" ) { + if( $this->iIconDepth == DEPTH_FRONT) { + $this->StrokeIcons(); + } - //$this->yscale->ticks->SupressZeroLabel(false); - $this->xscale->ticks->SupressFirst(); - if( $this->y2axis != null ) { - $this->xscale->ticks->SupressLast(); - } - } - elseif( !is_numeric($this->yaxis->pos) && $this->yaxis->pos=='max' ) { - $this->xscale->ticks->SupressLast(); - } - + if( $this->iDoClipping ) { + // Clipping only supports graphs at 0 and 90 degrees + if( $this->img->a == 0 ) { + $this->img->CopyCanvasH($oldimage,$this->img->img, + $this->img->left_margin,$this->img->top_margin, + $this->img->left_margin,$this->img->top_margin, + $this->img->plotwidth+1,$this->img->plotheight); + } + elseif( $this->img->a == 90 ) { + $adj = ($this->img->height - $this->img->width)/2; + $this->img->CopyCanvasH($oldimage,$this->img->img, + $this->img->bottom_margin-$adj,$this->img->left_margin+$adj, + $this->img->bottom_margin-$adj,$this->img->left_margin+$adj, + $this->img->plotheight+1,$this->img->plotwidth); + } + else { + JpGraphError::RaiseL(25035,$this->img->a);//('You have enabled clipping. Cliping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (='.$this->img->a.' degrees) or disable clipping.'); + } + $this->img->Destroy(); + $this->img->SetCanvasH($oldimage); + } - if( !$_csim ) { - $this->StrokePlotArea(); - if( $this->iIconDepth == DEPTH_BACK ) { - $this->StrokeIcons(); - } - } - $this->StrokeAxis(false); + $this->xscale->off=$oldoff; - // Stroke bands - if( $this->bands != null && !$_csim) - for($i=0; $i < count($this->bands); ++$i) { - // Stroke all bands that asks to be in the background - if( $this->bands[$i]->depth == DEPTH_BACK ) - $this->bands[$i]->Stroke($this->img,$this->xscale,$this->yscale); - } + if( $this->grid_depth == DEPTH_FRONT && !$_csim ) { + $this->ygrid->Stroke(); + $this->xgrid->Stroke(); + } - if( $this->y2bands != null && $this->y2scale != null && !$_csim ) - for($i=0; $i < count($this->y2bands); ++$i) { - // Stroke all bands that asks to be in the foreground - if( $this->y2bands[$i]->depth == DEPTH_BACK ) - $this->y2bands[$i]->Stroke($this->img,$this->xscale,$this->y2scale); - } + // Stroke colored bands + $this->StrokeBands(DEPTH_FRONT,$_csim); + // Finally draw the axis again since some plots may have nagged + // the axis in the edges. + if( !$_csim ) { + $this->StrokeAxis(); + } - if( $this->grid_depth == DEPTH_BACK && !$_csim) { - $this->ygrid->Stroke(); - $this->xgrid->Stroke(); - } - - // Stroke Y2-axis - if( $this->y2axis != null && !$_csim) { - $this->y2axis->Stroke($this->xscale); - $this->y2grid->Stroke(); - } + if( $this->y2scale != null && !$_csim ) { + $this->y2axis->Stroke($this->xscale,false); + } - // Stroke yn-axis - $n = count($this->ynaxis); - for( $i=0; $i < $n; ++$i ) { - $this->ynaxis[$i]->Stroke($this->xscale); - } + if( !$_csim ) { + $this->StrokePlotBox(); + } - $oldoff=$this->xscale->off; - if(substr($this->axtype,0,4)=="text") { - if( $this->text_scale_abscenteroff > -1 ) { - // For a text scale the scale factor is the number of pixel per step. - // Hence we can use the scale factor as a substitute for number of pixels - // per major scale step and use that in order to adjust the offset so that - // an object of width "abscenteroff" becomes centered. - $this->xscale->off += round($this->xscale->scale_factor/2)-round($this->text_scale_abscenteroff/2); - } - else { - $this->xscale->off += - ceil($this->xscale->scale_factor*$this->text_scale_off*$this->xscale->ticks->minor_step); - } - } + // The titles and legends never gets rotated so make sure + // that the angle is 0 before stroking them + $aa = $this->img->SetAngle(0); + $this->StrokeTitles(); + $this->footer->Stroke($this->img); + $this->legend->Stroke($this->img); + $this->img->SetAngle($aa); + $this->StrokeTexts(); + $this->StrokeTables(); - if( $this->iDoClipping ) { - $oldimage = $this->img->CloneCanvasH(); - } + if( !$_csim ) { - if( ! $this->y2orderback ) { - // Stroke all plots for Y1 axis - for($i=0; $i < count($this->plots); ++$i) { - $this->plots[$i]->Stroke($this->img,$this->xscale,$this->yscale); - $this->plots[$i]->StrokeMargin($this->img); - } - } + $this->img->SetAngle($aa); - // Stroke all plots for Y2 axis - if( $this->y2scale != null ) - for($i=0; $i< count($this->y2plots); ++$i ) { - $this->y2plots[$i]->Stroke($this->img,$this->xscale,$this->y2scale); - } + // Draw an outline around the image map + if(_JPG_DEBUG) { + $this->DisplayClientSideaImageMapAreas(); + } - if( $this->y2orderback ) { - // Stroke all plots for Y1 axis - for($i=0; $i < count($this->plots); ++$i) { - $this->plots[$i]->Stroke($this->img,$this->xscale,$this->yscale); - $this->plots[$i]->StrokeMargin($this->img); - } - } + // Should we do any final image transformation + if( $this->iImgTrans ) { + if( !class_exists('ImgTrans',false) ) { + require_once('jpgraph_imgtrans.php'); + //JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.'); + } - $n = count($this->ynaxis); - for( $i=0; $i < $n; ++$i ) { - $m = count($this->ynplots[$i]); - for( $j=0; $j < $m; ++$j ) { - $this->ynplots[$i][$j]->Stroke($this->img,$this->xscale,$this->ynscale[$i]); - $this->ynplots[$i][$j]->StrokeMargin($this->img); - } - } + $tform = new ImgTrans($this->img->img); + $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, + $this->iImgTransDirection,$this->iImgTransHighQ, + $this->iImgTransMinSize,$this->iImgTransFillColor, + $this->iImgTransBorder); + } - if( $this->iIconDepth == DEPTH_FRONT) { - $this->StrokeIcons(); - } - - if( $this->iDoClipping ) { - // Clipping only supports graphs at 0 and 90 degrees - if( $this->img->a == 0 ) { - $this->img->CopyCanvasH($oldimage,$this->img->img, - $this->img->left_margin,$this->img->top_margin, - $this->img->left_margin,$this->img->top_margin, - $this->img->plotwidth+1,$this->img->plotheight); - } - elseif( $this->img->a == 90 ) { - $adj = ($this->img->height - $this->img->width)/2; - $this->img->CopyCanvasH($oldimage,$this->img->img, - $this->img->bottom_margin-$adj,$this->img->left_margin+$adj, - $this->img->bottom_margin-$adj,$this->img->left_margin+$adj, - $this->img->plotheight+1,$this->img->plotwidth); - } - else { - JpGraphError::RaiseL(25035,$this->img->a);//('You have enabled clipping. Cliping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (='.$this->img->a.' degrees) or disable clipping.'); - } - $this->img->Destroy(); - $this->img->SetCanvasH($oldimage); - } - - $this->xscale->off=$oldoff; - - if( $this->grid_depth == DEPTH_FRONT && !$_csim ) { - $this->ygrid->Stroke(); - $this->xgrid->Stroke(); - } - - // Stroke bands - if( $this->bands!= null ) - for($i=0; $i < count($this->bands); ++$i) { - // Stroke all bands that asks to be in the foreground - if( $this->bands[$i]->depth == DEPTH_FRONT ) - $this->bands[$i]->Stroke($this->img,$this->xscale,$this->yscale); - } - - if( $this->y2bands!= null && $this->y2scale != null ) - for($i=0; $i < count($this->y2bands); ++$i) { - // Stroke all bands that asks to be in the foreground - if( $this->y2bands[$i]->depth == DEPTH_FRONT ) - $this->y2bands[$i]->Stroke($this->img,$this->xscale,$this->y2scale); - } - - - // Stroke any lines added - if( $this->lines != null ) { - for($i=0; $i < count($this->lines); ++$i) { - $this->lines[$i]->Stroke($this->img,$this->xscale,$this->yscale); - $this->lines[$i]->DoLegend($this); - } - } - - if( $this->y2lines != null && $this->y2scale != null ) { - for($i=0; $i < count($this->y2lines); ++$i) { - $this->y2lines[$i]->Stroke($this->img,$this->xscale,$this->y2scale); - $this->y2lines[$i]->DoLegend($this); - } - } - - // Finally draw the axis again since some plots may have nagged - // the axis in the edges. - if( !$_csim ) { - $this->StrokeAxis(); - } - - if( $this->y2scale != null && !$_csim ) - $this->y2axis->Stroke($this->xscale,false); - - if( !$_csim ) { - $this->StrokePlotBox(); - } - - // The titles and legends never gets rotated so make sure - // that the angle is 0 before stroking them - $aa = $this->img->SetAngle(0); - $this->StrokeTitles(); - $this->footer->Stroke($this->img); - $this->legend->Stroke($this->img); - $this->img->SetAngle($aa); - $this->StrokeTexts(); - $this->StrokeTables(); - - if( !$_csim ) { - - $this->img->SetAngle($aa); - - // Draw an outline around the image map - if(_JPG_DEBUG) { - $this->DisplayClientSideaImageMapAreas(); - } - - // Should we do any final image transformation - if( $this->iImgTrans ) { - if( !class_exists('ImgTrans',false) ) { - require_once('jpgraph_imgtrans.php'); - //JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.'); - } - - $tform = new ImgTrans($this->img->img); - $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, - $this->iImgTransDirection,$this->iImgTransHighQ, - $this->iImgTransMinSize,$this->iImgTransFillColor, - $this->iImgTransBorder); - } - - // If the filename is given as the special "__handle" - // then the image handler is returned and the image is NOT - // streamed back - if( $aStrokeFileName == _IMG_HANDLER ) { - return $this->img->img; - } - else { - // Finally stream the generated picture - $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName); - } - } + // If the filename is given as the special "__handle" + // then the image handler is returned and the image is NOT + // streamed back + if( $aStrokeFileName == _IMG_HANDLER ) { + return $this->img->img; + } + else { + // Finally stream the generated picture + $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName); + } + } } function SetAxisLabelBackground($aType,$aXFColor='lightgray',$aXColor='black',$aYFColor='lightgray',$aYColor='black') { - $this->iAxisLblBgType = $aType; - $this->iXAxisLblBgFillColor = $aXFColor; - $this->iXAxisLblBgColor = $aXColor; - $this->iYAxisLblBgFillColor = $aYFColor; - $this->iYAxisLblBgColor = $aYColor; + $this->iAxisLblBgType = $aType; + $this->iXAxisLblBgFillColor = $aXFColor; + $this->iXAxisLblBgColor = $aXColor; + $this->iYAxisLblBgFillColor = $aYFColor; + $this->iYAxisLblBgColor = $aYColor; } -//--------------- -// PRIVATE METHODS - function StrokeAxisLabelBackground() { - // Types - // 0 = No background - // 1 = Only X-labels, length of axis - // 2 = Only Y-labels, length of axis - // 3 = As 1 but extends to width of graph - // 4 = As 2 but extends to height of graph - // 5 = Combination of 3 & 4 - // 6 = Combination of 1 & 2 - - $t = $this->iAxisLblBgType ; - if( $t < 1 ) return; - // Stroke optional X-axis label background color - if( $t == 1 || $t == 3 || $t == 5 || $t == 6 ) { - $this->img->PushColor($this->iXAxisLblBgFillColor); - if( $t == 1 || $t == 6 ) { - $xl = $this->img->left_margin; - $yu = $this->img->height - $this->img->bottom_margin + 1; - $xr = $this->img->width - $this->img->right_margin ; - $yl = $this->img->height-1-$this->frame_weight; - } - else { // t==3 || t==5 - $xl = $this->frame_weight; - $yu = $this->img->height - $this->img->bottom_margin + 1; - $xr = $this->img->width - 1 - $this->frame_weight; - $yl = $this->img->height-1-$this->frame_weight; - } + // Types + // 0 = No background + // 1 = Only X-labels, length of axis + // 2 = Only Y-labels, length of axis + // 3 = As 1 but extends to width of graph + // 4 = As 2 but extends to height of graph + // 5 = Combination of 3 & 4 + // 6 = Combination of 1 & 2 - $this->img->FilledRectangle($xl,$yu,$xr,$yl); - $this->img->PopColor(); + $t = $this->iAxisLblBgType ; + if( $t < 1 ) return; - // Check if we should add the vertical lines at left and right edge - if( $this->iXAxisLblBgColor !== '' ) { - $this->img->PushColor($this->iXAxisLblBgColor); - if( $t == 1 || $t == 6 ) { - $this->img->Line($xl,$yu,$xl,$yl); - $this->img->Line($xr,$yu,$xr,$yl); - } - else { - $xl = $this->img->width - $this->img->right_margin ; - $this->img->Line($xl,$yu-1,$xr,$yu-1); - } - $this->img->PopColor(); - } - } + // Stroke optional X-axis label background color + if( $t == 1 || $t == 3 || $t == 5 || $t == 6 ) { + $this->img->PushColor($this->iXAxisLblBgFillColor); + if( $t == 1 || $t == 6 ) { + $xl = $this->img->left_margin; + $yu = $this->img->height - $this->img->bottom_margin + 1; + $xr = $this->img->width - $this->img->right_margin ; + $yl = $this->img->height-1-$this->frame_weight; + } + else { // t==3 || t==5 + $xl = $this->frame_weight; + $yu = $this->img->height - $this->img->bottom_margin + 1; + $xr = $this->img->width - 1 - $this->frame_weight; + $yl = $this->img->height-1-$this->frame_weight; + } - if( $t == 2 || $t == 4 || $t == 5 || $t == 6 ) { - $this->img->PushColor($this->iYAxisLblBgFillColor); - if( $t == 2 || $t == 6 ) { - $xl = $this->frame_weight; - $yu = $this->frame_weight+$this->img->top_margin; - $xr = $this->img->left_margin - 1; - $yl = $this->img->height - $this->img->bottom_margin + 1; - } - else { - $xl = $this->frame_weight; - $yu = $this->frame_weight; - $xr = $this->img->left_margin - 1; - $yl = $this->img->height-1-$this->frame_weight; - } + $this->img->FilledRectangle($xl,$yu,$xr,$yl); + $this->img->PopColor(); - $this->img->FilledRectangle($xl,$yu,$xr,$yl); - $this->img->PopColor(); + // Check if we should add the vertical lines at left and right edge + if( $this->iXAxisLblBgColor !== '' ) { + // Hardcode to one pixel wide + $this->img->SetLineWeight(1); + $this->img->PushColor($this->iXAxisLblBgColor); + if( $t == 1 || $t == 6 ) { + $this->img->Line($xl,$yu,$xl,$yl); + $this->img->Line($xr,$yu,$xr,$yl); + } + else { + $xl = $this->img->width - $this->img->right_margin ; + $this->img->Line($xl,$yu-1,$xr,$yu-1); + } + $this->img->PopColor(); + } + } - // Check if we should add the vertical lines at left and right edge - if( $this->iXAxisLblBgColor !== '' ) { - $this->img->PushColor($this->iXAxisLblBgColor); - if( $t == 2 || $t == 6 ) { - $this->img->Line($xl,$yu-1,$xr,$yu-1); - $this->img->Line($xl,$yl-1,$xr,$yl-1); - } - else { - $this->img->Line($xr+1,$yu,$xr+1,$this->img->top_margin); - } - $this->img->PopColor(); - } + if( $t == 2 || $t == 4 || $t == 5 || $t == 6 ) { + $this->img->PushColor($this->iYAxisLblBgFillColor); + if( $t == 2 || $t == 6 ) { + $xl = $this->frame_weight; + $yu = $this->frame_weight+$this->img->top_margin; + $xr = $this->img->left_margin - 1; + $yl = $this->img->height - $this->img->bottom_margin + 1; + } + else { + $xl = $this->frame_weight; + $yu = $this->frame_weight; + $xr = $this->img->left_margin - 1; + $yl = $this->img->height-1-$this->frame_weight; + } - } + $this->img->FilledRectangle($xl,$yu,$xr,$yl); + $this->img->PopColor(); + + // Check if we should add the vertical lines at left and right edge + if( $this->iXAxisLblBgColor !== '' ) { + $this->img->PushColor($this->iXAxisLblBgColor); + if( $t == 2 || $t == 6 ) { + $this->img->Line($xl,$yu-1,$xr,$yu-1); + $this->img->Line($xl,$yl-1,$xr,$yl-1); + } + else { + $this->img->Line($xr+1,$yu,$xr+1,$this->img->top_margin); + } + $this->img->PopColor(); + } + + } } function StrokeAxis($aStrokeLabels=true) { - - if( $aStrokeLabels ) { - $this->StrokeAxisLabelBackground(); - } - // Stroke axis - if( $this->iAxisStyle != AXSTYLE_SIMPLE ) { - switch( $this->iAxisStyle ) { - case AXSTYLE_BOXIN : - $toppos = SIDE_DOWN; - $bottompos = SIDE_UP; - $leftpos = SIDE_RIGHT; - $rightpos = SIDE_LEFT; - break; - case AXSTYLE_BOXOUT : - $toppos = SIDE_UP; - $bottompos = SIDE_DOWN; - $leftpos = SIDE_LEFT; - $rightpos = SIDE_RIGHT; - break; - case AXSTYLE_YBOXIN: - $toppos = FALSE; - $bottompos = SIDE_UP; - $leftpos = SIDE_RIGHT; - $rightpos = SIDE_LEFT; - break; - case AXSTYLE_YBOXOUT: - $toppos = FALSE; - $bottompos = SIDE_DOWN; - $leftpos = SIDE_LEFT; - $rightpos = SIDE_RIGHT; - break; - default: - JpGRaphError::RaiseL(25036,$this->iAxisStyle); //('Unknown AxisStyle() : '.$this->iAxisStyle); - break; - } - - // By default we hide the first label so it doesn't cross the - // Y-axis in case the positon hasn't been set by the user. - // However, if we use a box we always want the first value - // displayed so we make sure it will be displayed. - $this->xscale->ticks->SupressFirst(false); + if( $aStrokeLabels ) { + $this->StrokeAxisLabelBackground(); + } - // Now draw the bottom X-axis - $this->xaxis->SetPos('min'); - $this->xaxis->SetLabelSide(SIDE_DOWN); - $this->xaxis->scale->ticks->SetSide($bottompos); - $this->xaxis->Stroke($this->yscale,$aStrokeLabels); + // Stroke axis + if( $this->iAxisStyle != AXSTYLE_SIMPLE ) { + switch( $this->iAxisStyle ) { + case AXSTYLE_BOXIN : + $toppos = SIDE_DOWN; + $bottompos = SIDE_UP; + $leftpos = SIDE_RIGHT; + $rightpos = SIDE_LEFT; + break; + case AXSTYLE_BOXOUT : + $toppos = SIDE_UP; + $bottompos = SIDE_DOWN; + $leftpos = SIDE_LEFT; + $rightpos = SIDE_RIGHT; + break; + case AXSTYLE_YBOXIN: + $toppos = FALSE; + $bottompos = SIDE_UP; + $leftpos = SIDE_RIGHT; + $rightpos = SIDE_LEFT; + break; + case AXSTYLE_YBOXOUT: + $toppos = FALSE; + $bottompos = SIDE_DOWN; + $leftpos = SIDE_LEFT; + $rightpos = SIDE_RIGHT; + break; + default: + JpGRaphError::RaiseL(25036,$this->iAxisStyle); //('Unknown AxisStyle() : '.$this->iAxisStyle); + break; + } - if( $toppos !== FALSE ) { - // We also want a top X-axis - $this->xaxis = $this->xaxis; - $this->xaxis->SetPos('max'); - $this->xaxis->SetLabelSide(SIDE_UP); - // No title for the top X-axis - if( $aStrokeLabels ) { - $this->xaxis->title->Set(''); - } - $this->xaxis->scale->ticks->SetSide($toppos); - $this->xaxis->Stroke($this->yscale,$aStrokeLabels); - } + // By default we hide the first label so it doesn't cross the + // Y-axis in case the positon hasn't been set by the user. + // However, if we use a box we always want the first value + // displayed so we make sure it will be displayed. + $this->xscale->ticks->SupressFirst(false); - // Stroke the left Y-axis - $this->yaxis->SetPos('min'); - $this->yaxis->SetLabelSide(SIDE_LEFT); - $this->yaxis->scale->ticks->SetSide($leftpos); - $this->yaxis->Stroke($this->xscale,$aStrokeLabels); + // Now draw the bottom X-axis + $this->xaxis->SetPos('min'); + $this->xaxis->SetLabelSide(SIDE_DOWN); + $this->xaxis->scale->ticks->SetSide($bottompos); + $this->xaxis->Stroke($this->yscale,$aStrokeLabels); - // Stroke the right Y-axis - $this->yaxis->SetPos('max'); - // No title for the right side - if( $aStrokeLabels ) { - $this->yaxis->title->Set(''); - } - $this->yaxis->SetLabelSide(SIDE_RIGHT); - $this->yaxis->scale->ticks->SetSide($rightpos); - $this->yaxis->Stroke($this->xscale,$aStrokeLabels); - } - else { - $this->xaxis->Stroke($this->yscale,$aStrokeLabels); - $this->yaxis->Stroke($this->xscale,$aStrokeLabels); - } + if( $toppos !== FALSE ) { + // We also want a top X-axis + $this->xaxis = $this->xaxis; + $this->xaxis->SetPos('max'); + $this->xaxis->SetLabelSide(SIDE_UP); + // No title for the top X-axis + if( $aStrokeLabels ) { + $this->xaxis->title->Set(''); + } + $this->xaxis->scale->ticks->SetSide($toppos); + $this->xaxis->Stroke($this->yscale,$aStrokeLabels); + } + + // Stroke the left Y-axis + $this->yaxis->SetPos('min'); + $this->yaxis->SetLabelSide(SIDE_LEFT); + $this->yaxis->scale->ticks->SetSide($leftpos); + $this->yaxis->Stroke($this->xscale,$aStrokeLabels); + + // Stroke the right Y-axis + $this->yaxis->SetPos('max'); + // No title for the right side + if( $aStrokeLabels ) { + $this->yaxis->title->Set(''); + } + $this->yaxis->SetLabelSide(SIDE_RIGHT); + $this->yaxis->scale->ticks->SetSide($rightpos); + $this->yaxis->Stroke($this->xscale,$aStrokeLabels); + } + else { + $this->xaxis->Stroke($this->yscale,$aStrokeLabels); + $this->yaxis->Stroke($this->xscale,$aStrokeLabels); + } } // Private helper function for backgound image static function LoadBkgImage($aImgFormat='',$aFile='',$aImgStr='') { - if( $aImgStr != '' ) { - return Image::CreateFromString($aImgStr); - } + if( $aImgStr != '' ) { + return Image::CreateFromString($aImgStr); + } - // Remove case sensitivity and setup appropriate function to create image - // Get file extension. This should be the LAST '.' separated part of the filename - $e = explode('.',$aFile); - $ext = strtolower($e[count($e)-1]); - if ($ext == "jpeg") { - $ext = "jpg"; - } - - if( trim($ext) == '' ) - $ext = 'png'; // Assume PNG if no extension specified + // Remove case sensitivity and setup appropriate function to create image + // Get file extension. This should be the LAST '.' separated part of the filename + $e = explode('.',$aFile); + $ext = strtolower($e[count($e)-1]); + if ($ext == "jpeg") { + $ext = "jpg"; + } - if( $aImgFormat == '' ) - $imgtag = $ext; - else - $imgtag = $aImgFormat; + if( trim($ext) == '' ) { + $ext = 'png'; // Assume PNG if no extension specified + } - $supported = imagetypes(); - if( ( $ext == 'jpg' && !($supported & IMG_JPG) ) || - ( $ext == 'gif' && !($supported & IMG_GIF) ) || - ( $ext == 'png' && !($supported & IMG_PNG) ) || - ( $ext == 'bmp' && !($supported & IMG_WBMP) ) || - ( $ext == 'xpm' && !($supported & IMG_XPM) ) ) { + if( $aImgFormat == '' ) { + $imgtag = $ext; + } + else { + $imgtag = $aImgFormat; + } - JpGraphError::RaiseL(25037,$aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. '); - } + $supported = imagetypes(); + if( ( $ext == 'jpg' && !($supported & IMG_JPG) ) || + ( $ext == 'gif' && !($supported & IMG_GIF) ) || + ( $ext == 'png' && !($supported & IMG_PNG) ) || + ( $ext == 'bmp' && !($supported & IMG_WBMP) ) || + ( $ext == 'xpm' && !($supported & IMG_XPM) ) ) { + + JpGraphError::RaiseL(25037,$aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. '); + } - if( $imgtag == "jpg" || $imgtag == "jpeg") - { - $f = "imagecreatefromjpeg"; - $imgtag = "jpg"; - } - else - { - $f = "imagecreatefrom".$imgtag; - } + if( $imgtag == "jpg" || $imgtag == "jpeg") { + $f = "imagecreatefromjpeg"; + $imgtag = "jpg"; + } + else { + $f = "imagecreatefrom".$imgtag; + } - // Compare specified image type and file extension - if( $imgtag != $ext ) { - //$t = "Background image seems to be of different type (has different file extension) than specified imagetype. Specified: '".$aImgFormat."'File: '".$aFile."'"; - JpGraphError::RaiseL(25038, $aImgFormat, $aFile); - } + // Compare specified image type and file extension + if( $imgtag != $ext ) { + //$t = "Background image seems to be of different type (has different file extension) than specified imagetype. Specified: '".$aImgFormat."'File: '".$aFile."'"; + JpGraphError::RaiseL(25038, $aImgFormat, $aFile); + } - $img = @$f($aFile); - if( !$img ) { - JpGraphError::RaiseL(25039,$aFile);//(" Can't read background image: '".$aFile."'"); - } - return $img; - } + $img = @$f($aFile); + if( !$img ) { + JpGraphError::RaiseL(25039,$aFile);//(" Can't read background image: '".$aFile."'"); + } + return $img; + } function StrokeBackgroundGrad() { - if( $this->bkg_gradtype < 0 ) - return; - $grad = new Gradient($this->img); - if( $this->bkg_gradstyle == BGRAD_PLOT ) { - $xl = $this->img->left_margin; - $yt = $this->img->top_margin; - $xr = $xl + $this->img->plotwidth+1 ; - $yb = $yt + $this->img->plotheight ; - $grad->FilledRectangle($xl,$yt,$xr,$yb,$this->bkg_gradfrom,$this->bkg_gradto,$this->bkg_gradtype); - } - else { - $xl = 0; - $yt = 0; - $xr = $xl + $this->img->width - 1; - $yb = $yt + $this->img->height ; - if( $this->doshadow ) { - $xr -= $this->shadow_width; - $yb -= $this->shadow_width; - } - if( $this->doframe ) { - $yt += $this->frame_weight; - $yb -= $this->frame_weight; - $xl += $this->frame_weight; - $xr -= $this->frame_weight; - } - $aa = $this->img->SetAngle(0); - $grad->FilledRectangle($xl,$yt,$xr,$yb,$this->bkg_gradfrom,$this->bkg_gradto,$this->bkg_gradtype); - $aa = $this->img->SetAngle($aa); - } + if( $this->bkg_gradtype < 0 ) + return; + + $grad = new Gradient($this->img); + if( $this->bkg_gradstyle == BGRAD_PLOT ) { + $xl = $this->img->left_margin; + $yt = $this->img->top_margin; + $xr = $xl + $this->img->plotwidth+1 ; + $yb = $yt + $this->img->plotheight ; + $grad->FilledRectangle($xl,$yt,$xr,$yb,$this->bkg_gradfrom,$this->bkg_gradto,$this->bkg_gradtype); + } + else { + $xl = 0; + $yt = 0; + $xr = $xl + $this->img->width - 1; + $yb = $yt + $this->img->height - 1 ; + if( $this->doshadow ) { + $xr -= $this->shadow_width; + $yb -= $this->shadow_width; + } + if( $this->doframe ) { + $yt += $this->frame_weight; + $yb -= $this->frame_weight; + $xl += $this->frame_weight; + $xr -= $this->frame_weight; + } + $aa = $this->img->SetAngle(0); + $grad->FilledRectangle($xl,$yt,$xr,$yb,$this->bkg_gradfrom,$this->bkg_gradto,$this->bkg_gradtype); + $aa = $this->img->SetAngle($aa); + } } function StrokeFrameBackground() { - if( $this->background_image != "" && $this->background_cflag != "" ) { - JpGraphError::RaiseL(25040);//('It is not possible to specify both a background image and a background country flag.'); - } - if( $this->background_image != "" ) { - $bkgimg = $this->LoadBkgImage($this->background_image_format,$this->background_image); - } - elseif( $this->background_cflag != "" ) { - if( ! class_exists('FlagImages',false) ) { - JpGraphError::RaiseL(25041);//('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.'); - } - $fobj = new FlagImages(FLAGSIZE4); - $dummy=''; - $bkgimg = $fobj->GetImgByName($this->background_cflag,$dummy); - $this->background_image_mix = $this->background_cflag_mix; - $this->background_image_type = $this->background_cflag_type; - } - else { - return ; - } + if( $this->background_image != '' && $this->background_cflag != '' ) { + JpGraphError::RaiseL(25040);//('It is not possible to specify both a background image and a background country flag.'); + } + if( $this->background_image != '' ) { + $bkgimg = $this->LoadBkgImage($this->background_image_format,$this->background_image); + } + elseif( $this->background_cflag != '' ) { + if( ! class_exists('FlagImages',false) ) { + JpGraphError::RaiseL(25041);//('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.'); + } + $fobj = new FlagImages(FLAGSIZE4); + $dummy=''; + $bkgimg = $fobj->GetImgByName($this->background_cflag,$dummy); + $this->background_image_mix = $this->background_cflag_mix; + $this->background_image_type = $this->background_cflag_type; + } + else { + return ; + } - $bw = ImageSX($bkgimg); - $bh = ImageSY($bkgimg); + $bw = ImageSX($bkgimg); + $bh = ImageSY($bkgimg); - // No matter what the angle is we always stroke the image and frame - // assuming it is 0 degree - $aa = $this->img->SetAngle(0); - - switch( $this->background_image_type ) { - case BGIMG_FILLPLOT: // Resize to just fill the plotarea - $this->FillMarginArea(); - $this->StrokeFrame(); - // Special case to hande 90 degree rotated graph corectly - if( $aa == 90 ) { - $this->img->SetAngle(90); - $this->FillPlotArea(); - $aa = $this->img->SetAngle(0); - $adj = ($this->img->height - $this->img->width)/2; - $this->img->CopyMerge($bkgimg, - $this->img->bottom_margin-$adj,$this->img->left_margin+$adj, - 0,0, - $this->img->plotheight+1,$this->img->plotwidth, - $bw,$bh,$this->background_image_mix); + // No matter what the angle is we always stroke the image and frame + // assuming it is 0 degree + $aa = $this->img->SetAngle(0); - } - else { - $this->FillPlotArea(); - $this->img->CopyMerge($bkgimg, - $this->img->left_margin,$this->img->top_margin, - 0,0,$this->img->plotwidth+1,$this->img->plotheight, - $bw,$bh,$this->background_image_mix); - } - break; - case BGIMG_FILLFRAME: // Fill the whole area from upper left corner, resize to just fit - $hadj=0; $vadj=0; - if( $this->doshadow ) { - $hadj = $this->shadow_width; - $vadj = $this->shadow_width; - } - $this->FillMarginArea(); - $this->FillPlotArea(); - $this->img->CopyMerge($bkgimg,0,0,0,0,$this->img->width-$hadj,$this->img->height-$vadj, - $bw,$bh,$this->background_image_mix); - $this->StrokeFrame(); - break; - case BGIMG_COPY: // Just copy the image from left corner, no resizing - $this->FillMarginArea(); - $this->FillPlotArea(); - $this->img->CopyMerge($bkgimg,0,0,0,0,$bw,$bh, - $bw,$bh,$this->background_image_mix); - $this->StrokeFrame(); - break; - case BGIMG_CENTER: // Center original image in the plot area - $this->FillMarginArea(); - $this->FillPlotArea(); - $centerx = round($this->img->plotwidth/2+$this->img->left_margin-$bw/2); - $centery = round($this->img->plotheight/2+$this->img->top_margin-$bh/2); - $this->img->CopyMerge($bkgimg,$centerx,$centery,0,0,$bw,$bh, - $bw,$bh,$this->background_image_mix); - $this->StrokeFrame(); - break; - default: - JpGraphError::RaiseL(25042);//(" Unknown background image layout"); - } - $this->img->SetAngle($aa); + switch( $this->background_image_type ) { + case BGIMG_FILLPLOT: // Resize to just fill the plotarea + $this->FillMarginArea(); + $this->StrokeFrame(); + // Special case to hande 90 degree rotated graph corectly + if( $aa == 90 ) { + $this->img->SetAngle(90); + $this->FillPlotArea(); + $aa = $this->img->SetAngle(0); + $adj = ($this->img->height - $this->img->width)/2; + $this->img->CopyMerge($bkgimg, + $this->img->bottom_margin-$adj,$this->img->left_margin+$adj, + 0,0, + $this->img->plotheight+1,$this->img->plotwidth, + $bw,$bh,$this->background_image_mix); + } + else { + $this->FillPlotArea(); + $this->img->CopyMerge($bkgimg, + $this->img->left_margin,$this->img->top_margin+1, + 0,0,$this->img->plotwidth+1,$this->img->plotheight, + $bw,$bh,$this->background_image_mix); + } + break; + case BGIMG_FILLFRAME: // Fill the whole area from upper left corner, resize to just fit + $hadj=0; $vadj=0; + if( $this->doshadow ) { + $hadj = $this->shadow_width; + $vadj = $this->shadow_width; + } + $this->FillMarginArea(); + $this->FillPlotArea(); + $this->img->CopyMerge($bkgimg,0,0,0,0,$this->img->width-$hadj,$this->img->height-$vadj, + $bw,$bh,$this->background_image_mix); + $this->StrokeFrame(); + break; + case BGIMG_COPY: // Just copy the image from left corner, no resizing + $this->FillMarginArea(); + $this->FillPlotArea(); + $this->img->CopyMerge($bkgimg,0,0,0,0,$bw,$bh, + $bw,$bh,$this->background_image_mix); + $this->StrokeFrame(); + break; + case BGIMG_CENTER: // Center original image in the plot area + $this->FillMarginArea(); + $this->FillPlotArea(); + $centerx = round($this->img->plotwidth/2+$this->img->left_margin-$bw/2); + $centery = round($this->img->plotheight/2+$this->img->top_margin-$bh/2); + $this->img->CopyMerge($bkgimg,$centerx,$centery,0,0,$bw,$bh, + $bw,$bh,$this->background_image_mix); + $this->StrokeFrame(); + break; + case BGIMG_FREE: // Just copy the image to the specified location + $this->img->CopyMerge($bkgimg, + $this->background_image_xpos,$this->background_image_ypos, + 0,0,$bw,$bh,$bw,$bh,$this->background_image_mix); + $this->StrokeFrame(); // New + break; + default: + JpGraphError::RaiseL(25042);//(" Unknown background image layout"); + } + $this->img->SetAngle($aa); } // Private // Draw a frame around the image function StrokeFrame() { - if( !$this->doframe ) return; + if( !$this->doframe ) return; - if( $this->background_image_type <= 1 && - ($this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_PLOT)) ) { - $c = $this->margin_color; - } - else { - $c = false; - } - - if( $this->doshadow ) { - $this->img->SetColor($this->frame_color); - $this->img->ShadowRectangle(0,0,$this->img->width,$this->img->height, - $c,$this->shadow_width,$this->shadow_color); - } - elseif( $this->framebevel ) { - if( $c ) { - $this->img->SetColor($this->margin_color); - $this->img->FilledRectangle(0,0,$this->img->width-1,$this->img->height-1); - } - $this->img->Bevel(1,1,$this->img->width-2,$this->img->height-2, - $this->framebeveldepth, - $this->framebevelcolor1,$this->framebevelcolor2); - if( $this->framebevelborder ) { - $this->img->SetColor($this->framebevelbordercolor); - $this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1); - } - } - else { - $this->img->SetLineWeight($this->frame_weight); - if( $c ) { - $this->img->SetColor($this->margin_color); - $this->img->FilledRectangle(0,0,$this->img->width-1,$this->img->height-1); - } - $this->img->SetColor($this->frame_color); - $this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1); - } + if( $this->background_image_type <= 1 && ($this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_PLOT)) ) { + $c = $this->margin_color; + } + else { + $c = false; + } + + if( $this->doshadow ) { + $this->img->SetColor($this->frame_color); + $this->img->ShadowRectangle(0,0,$this->img->width,$this->img->height, + $c,$this->shadow_width,$this->shadow_color); + } + elseif( $this->framebevel ) { + if( $c ) { + $this->img->SetColor($this->margin_color); + $this->img->FilledRectangle(0,0,$this->img->width-1,$this->img->height-1); + } + $this->img->Bevel(1,1,$this->img->width-2,$this->img->height-2, + $this->framebeveldepth, + $this->framebevelcolor1,$this->framebevelcolor2); + if( $this->framebevelborder ) { + $this->img->SetColor($this->framebevelbordercolor); + $this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1); + } + } + else { + $this->img->SetLineWeight($this->frame_weight); + if( $c ) { + $this->img->SetColor($this->margin_color); + $this->img->FilledRectangle(0,0,$this->img->width-1,$this->img->height-1); + } + $this->img->SetColor($this->frame_color); + $this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1); + } } function FillMarginArea() { - $hadj=0; $vadj=0; - if( $this->doshadow ) { - $hadj = $this->shadow_width; - $vadj = $this->shadow_width; - } + $hadj=0; $vadj=0; + if( $this->doshadow ) { + $hadj = $this->shadow_width; + $vadj = $this->shadow_width; + } - $this->img->SetColor($this->margin_color); -// $this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->height-1-$vadj); + $this->img->SetColor($this->margin_color); + // $this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->height-1-$vadj); - $this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->top_margin); - $this->img->FilledRectangle(0,$this->img->top_margin,$this->img->left_margin,$this->img->height-1-$hadj); - $this->img->FilledRectangle($this->img->left_margin+1, - $this->img->height-$this->img->bottom_margin, - $this->img->width-1-$hadj, - $this->img->height-1-$hadj); - $this->img->FilledRectangle($this->img->width-$this->img->right_margin, - $this->img->top_margin+1, - $this->img->width-1-$hadj, - $this->img->height-$this->img->bottom_margin-1); + $this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->top_margin); + $this->img->FilledRectangle(0,$this->img->top_margin,$this->img->left_margin,$this->img->height-1-$hadj); + $this->img->FilledRectangle($this->img->left_margin+1, + $this->img->height-$this->img->bottom_margin, + $this->img->width-1-$hadj, + $this->img->height-1-$hadj); + $this->img->FilledRectangle($this->img->width-$this->img->right_margin, + $this->img->top_margin+1, + $this->img->width-1-$hadj, + $this->img->height-$this->img->bottom_margin-1); } function FillPlotArea() { - $this->img->PushColor($this->plotarea_color); - $this->img->FilledRectangle($this->img->left_margin, - $this->img->top_margin, - $this->img->width-$this->img->right_margin, - $this->img->height-$this->img->bottom_margin); - $this->img->PopColor(); + $this->img->PushColor($this->plotarea_color); + $this->img->FilledRectangle($this->img->left_margin, + $this->img->top_margin, + $this->img->width-$this->img->right_margin, + $this->img->height-$this->img->bottom_margin); + $this->img->PopColor(); } - + // Stroke the plot area with either a solid color or a background image function StrokePlotArea() { - // Note: To be consistent we really should take a possible shadow - // into account. However, that causes some problem for the LinearScale class - // since in the current design it does not have any links to class Graph which - // means it has no way of compensating for the adjusted plotarea in case of a - // shadow. So, until I redesign LinearScale we can't compensate for this. - // So just set the two adjustment parameters to zero for now. - $boxadj = 0; //$this->doframe ? $this->frame_weight : 0 ; - $adj = 0; //$this->doshadow ? $this->shadow_width : 0 ; + // Note: To be consistent we really should take a possible shadow + // into account. However, that causes some problem for the LinearScale class + // since in the current design it does not have any links to class Graph which + // means it has no way of compensating for the adjusted plotarea in case of a + // shadow. So, until I redesign LinearScale we can't compensate for this. + // So just set the two adjustment parameters to zero for now. + $boxadj = 0; //$this->doframe ? $this->frame_weight : 0 ; + $adj = 0; //$this->doshadow ? $this->shadow_width : 0 ; - if( $this->background_image != "" || $this->background_cflag != "" ) { - $this->StrokeFrameBackground(); - } - else { - $aa = $this->img->SetAngle(0); - $this->StrokeFrame(); - $aa = $this->img->SetAngle($aa); - $this->StrokeBackgroundGrad(); - if( $this->bkg_gradtype < 0 || - ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_MARGIN) ) { - $this->FillPlotArea(); - } - } - } + if( $this->background_image != '' || $this->background_cflag != '' ) { + $this->StrokeFrameBackground(); + } + else { + $aa = $this->img->SetAngle(0); + $this->StrokeFrame(); + $aa = $this->img->SetAngle($aa); + $this->StrokeBackgroundGrad(); + if( $this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_MARGIN) ) { + $this->FillPlotArea(); + } + } + } function StrokeIcons() { - $n = count($this->iIcons); - for( $i=0; $i < $n; ++$i ) { - $this->iIcons[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale); - } + $n = count($this->iIcons); + for( $i=0; $i < $n; ++$i ) { + $this->iIcons[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale); + } } - + function StrokePlotBox() { - // Should we draw a box around the plot area? - if( $this->boxed ) { - $this->img->SetLineWeight(1); - $this->img->SetLineStyle('solid'); - $this->img->SetColor($this->box_color); - for($i=0; $i < $this->box_weight; ++$i ) { - $this->img->Rectangle( - $this->img->left_margin-$i,$this->img->top_margin-$i, - $this->img->width-$this->img->right_margin+$i, - $this->img->height-$this->img->bottom_margin+$i); - } - } - } + // Should we draw a box around the plot area? + if( $this->boxed ) { + $this->img->SetLineWeight(1); + $this->img->SetLineStyle('solid'); + $this->img->SetColor($this->box_color); + for($i=0; $i < $this->box_weight; ++$i ) { + $this->img->Rectangle( + $this->img->left_margin-$i,$this->img->top_margin-$i, + $this->img->width-$this->img->right_margin+$i, + $this->img->height-$this->img->bottom_margin+$i); + } + } + } function SetTitleBackgroundFillStyle($aStyle,$aColor1='black',$aColor2='white') { - $this->titlebkg_fillstyle = $aStyle; - $this->titlebkg_scolor1 = $aColor1; - $this->titlebkg_scolor2 = $aColor2; + $this->titlebkg_fillstyle = $aStyle; + $this->titlebkg_scolor1 = $aColor1; + $this->titlebkg_scolor2 = $aColor2; } function SetTitleBackground($aBackColor='gray', $aStyle=TITLEBKG_STYLE1, $aFrameStyle=TITLEBKG_FRAME_NONE, $aFrameColor='black', $aFrameWeight=1, $aBevelHeight=3, $aEnable=true) { - $this->titlebackground = $aEnable; - $this->titlebackground_color = $aBackColor; - $this->titlebackground_style = $aStyle; - $this->titlebackground_framecolor = $aFrameColor; - $this->titlebackground_framestyle = $aFrameStyle; - $this->titlebackground_frameweight = $aFrameWeight; - $this->titlebackground_bevelheight = $aBevelHeight ; + $this->titlebackground = $aEnable; + $this->titlebackground_color = $aBackColor; + $this->titlebackground_style = $aStyle; + $this->titlebackground_framecolor = $aFrameColor; + $this->titlebackground_framestyle = $aFrameStyle; + $this->titlebackground_frameweight = $aFrameWeight; + $this->titlebackground_bevelheight = $aBevelHeight ; } function StrokeTitles() { - $margin=3; + $margin=3; - if( $this->titlebackground ) { + if( $this->titlebackground ) { + // Find out height + $this->title->margin += 2 ; + $h = $this->title->GetTextHeight($this->img)+$this->title->margin+$margin; + if( $this->subtitle->t != '' && !$this->subtitle->hide ) { + $h += $this->subtitle->GetTextHeight($this->img)+$margin+ + $this->subtitle->margin; + $h += 2; + } + if( $this->subsubtitle->t != '' && !$this->subsubtitle->hide ) { + $h += $this->subsubtitle->GetTextHeight($this->img)+$margin+ + $this->subsubtitle->margin; + $h += 2; + } + $this->img->PushColor($this->titlebackground_color); + if( $this->titlebackground_style === TITLEBKG_STYLE1 ) { + // Inside the frame + if( $this->framebevel ) { + $x1 = $y1 = $this->framebeveldepth + 1 ; + $x2 = $this->img->width - $this->framebeveldepth - 2 ; + $this->title->margin += $this->framebeveldepth + 1 ; + $h += $y1 ; + $h += 2; + } + else { + $x1 = $y1 = $this->frame_weight; + $x2 = $this->img->width - $this->frame_weight-1; + } + } + elseif( $this->titlebackground_style === TITLEBKG_STYLE2 ) { + // Cover the frame as well + $x1 = $y1 = 0; + $x2 = $this->img->width - 1 ; + } + elseif( $this->titlebackground_style === TITLEBKG_STYLE3 ) { + // Cover the frame as well (the difference is that + // for style==3 a bevel frame border is on top + // of the title background) + $x1 = $y1 = 0; + $x2 = $this->img->width - 1 ; + $h += $this->framebeveldepth ; + $this->title->margin += $this->framebeveldepth ; + } + else { + JpGraphError::RaiseL(25043);//('Unknown title background style.'); + } - // Find out height - $this->title->margin += 2 ; - $h = $this->title->GetTextHeight($this->img)+$this->title->margin+$margin; - if( $this->subtitle->t != "" && !$this->subtitle->hide ) { - $h += $this->subtitle->GetTextHeight($this->img)+$margin+ - $this->subtitle->margin; - $h += 2; - } - if( $this->subsubtitle->t != "" && !$this->subsubtitle->hide ) { - $h += $this->subsubtitle->GetTextHeight($this->img)+$margin+ - $this->subsubtitle->margin; - $h += 2; - } - $this->img->PushColor($this->titlebackground_color); - if( $this->titlebackground_style === TITLEBKG_STYLE1 ) { - // Inside the frame - if( $this->framebevel ) { - $x1 = $y1 = $this->framebeveldepth + 1 ; - $x2 = $this->img->width - $this->framebeveldepth - 2 ; - $this->title->margin += $this->framebeveldepth + 1 ; - $h += $y1 ; - $h += 2; - } - else { - $x1 = $y1 = $this->frame_weight; - $x2 = $this->img->width - 2*$x1; - } - } - elseif( $this->titlebackground_style === TITLEBKG_STYLE2 ) { - // Cover the frame as well - $x1 = $y1 = 0; - $x2 = $this->img->width - 1 ; - } - elseif( $this->titlebackground_style === TITLEBKG_STYLE3 ) { - // Cover the frame as well (the difference is that - // for style==3 a bevel frame border is on top - // of the title background) - $x1 = $y1 = 0; - $x2 = $this->img->width - 1 ; - $h += $this->framebeveldepth ; - $this->title->margin += $this->framebeveldepth ; - } - else { - JpGraphError::RaiseL(25043);//('Unknown title background style.'); - } + if( $this->titlebackground_framestyle === 3 ) { + $h += $this->titlebackground_bevelheight*2 + 1 ; + $this->title->margin += $this->titlebackground_bevelheight ; + } - if( $this->titlebackground_framestyle === 3 ) { - $h += $this->titlebackground_bevelheight*2 + 1 ; - $this->title->margin += $this->titlebackground_bevelheight ; - } + if( $this->doshadow ) { + $x2 -= $this->shadow_width ; + } - if( $this->doshadow ) { - $x2 -= $this->shadow_width ; - } - - $indent=0; - if( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) { - $ind = $this->titlebackground_bevelheight; - } + $indent=0; + if( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) { + $indent = $this->titlebackground_bevelheight; + } - if( $this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_HSTRIPED ) { - $this->img->FilledRectangle2($x1+$ind,$y1+$ind,$x2-$ind,$h-$ind, - $this->titlebkg_scolor1, - $this->titlebkg_scolor2); - } - elseif( $this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_VSTRIPED ) { - $this->img->FilledRectangle2($x1+$ind,$y1+$ind,$x2-$ind,$h-$ind, - $this->titlebkg_scolor1, - $this->titlebkg_scolor2,2); - } - else { - // Solid fill - $this->img->FilledRectangle($x1,$y1,$x2,$h); - } - $this->img->PopColor(); + if( $this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_HSTRIPED ) { + $this->img->FilledRectangle2($x1+$indent,$y1+$indent,$x2-$indent,$h-$indent, + $this->titlebkg_scolor1, + $this->titlebkg_scolor2); + } + elseif( $this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_VSTRIPED ) { + $this->img->FilledRectangle2($x1+$indent,$y1+$indent,$x2-$indent,$h-$indent, + $this->titlebkg_scolor1, + $this->titlebkg_scolor2,2); + } + else { + // Solid fill + $this->img->FilledRectangle($x1,$y1,$x2,$h); + } + $this->img->PopColor(); - $this->img->PushColor($this->titlebackground_framecolor); - $this->img->SetLineWeight($this->titlebackground_frameweight); - if( $this->titlebackground_framestyle == TITLEBKG_FRAME_FULL ) { - // Frame background - $this->img->Rectangle($x1,$y1,$x2,$h); - } - elseif( $this->titlebackground_framestyle == TITLEBKG_FRAME_BOTTOM ) { - // Bottom line only - $this->img->Line($x1,$h,$x2,$h); - } - elseif( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) { - $this->img->Bevel($x1,$y1,$x2,$h,$this->titlebackground_bevelheight); - } - $this->img->PopColor(); + $this->img->PushColor($this->titlebackground_framecolor); + $this->img->SetLineWeight($this->titlebackground_frameweight); + if( $this->titlebackground_framestyle == TITLEBKG_FRAME_FULL ) { + // Frame background + $this->img->Rectangle($x1,$y1,$x2,$h); + } + elseif( $this->titlebackground_framestyle == TITLEBKG_FRAME_BOTTOM ) { + // Bottom line only + $this->img->Line($x1,$h,$x2,$h); + } + elseif( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) { + $this->img->Bevel($x1,$y1,$x2,$h,$this->titlebackground_bevelheight); + } + $this->img->PopColor(); - // This is clumsy. But we neeed to stroke the whole graph frame if it is - // set to bevel to get the bevel shading on top of the text background - if( $this->framebevel && $this->doframe && - $this->titlebackground_style === 3 ) { - $this->img->Bevel(1,1,$this->img->width-2,$this->img->height-2, - $this->framebeveldepth, - $this->framebevelcolor1,$this->framebevelcolor2); - if( $this->framebevelborder ) { - $this->img->SetColor($this->framebevelbordercolor); - $this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1); - } - } - } + // This is clumsy. But we neeed to stroke the whole graph frame if it is + // set to bevel to get the bevel shading on top of the text background + if( $this->framebevel && $this->doframe && $this->titlebackground_style === 3 ) { + $this->img->Bevel(1,1,$this->img->width-2,$this->img->height-2, + $this->framebeveldepth, + $this->framebevelcolor1,$this->framebevelcolor2); + if( $this->framebevelborder ) { + $this->img->SetColor($this->framebevelbordercolor); + $this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1); + } + } + } - // Stroke title - $y = $this->title->margin; - if( $this->title->halign == 'center' ) - $this->title->Center(0,$this->img->width,$y); - elseif( $this->title->halign == 'left' ) { - $this->title->SetPos($this->title->margin+2,$y); - } - elseif( $this->title->halign == 'right' ) { - $indent = 0; - if( $this->doshadow ) - $indent = $this->shadow_width+2; - $this->title->SetPos($this->img->width-$this->title->margin-$indent,$y,'right'); - } - $this->title->Stroke($this->img); - - // ... and subtitle - $y += $this->title->GetTextHeight($this->img) + $margin + $this->subtitle->margin; - if( $this->subtitle->halign == 'center' ) - $this->subtitle->Center(0,$this->img->width,$y); - elseif( $this->subtitle->halign == 'left' ) { - $this->subtitle->SetPos($this->subtitle->margin+2,$y); - } - elseif( $this->subtitle->halign == 'right' ) { - $indent = 0; - if( $this->doshadow ) - $indent = $this->shadow_width+2; - $this->subtitle->SetPos($this->img->width-$this->subtitle->margin-$indent,$y,'right'); - } - $this->subtitle->Stroke($this->img); + // Stroke title + $y = $this->title->margin; + if( $this->title->halign == 'center' ) { + $this->title->Center(0,$this->img->width,$y); + } + elseif( $this->title->halign == 'left' ) { + $this->title->SetPos($this->title->margin+2,$y); + } + elseif( $this->title->halign == 'right' ) { + $indent = 0; + if( $this->doshadow ) { + $indent = $this->shadow_width+2; + } + $this->title->SetPos($this->img->width-$this->title->margin-$indent,$y,'right'); + } + $this->title->Stroke($this->img); - // ... and subsubtitle - $y += $this->subtitle->GetTextHeight($this->img) + $margin + $this->subsubtitle->margin; - if( $this->subsubtitle->halign == 'center' ) - $this->subsubtitle->Center(0,$this->img->width,$y); - elseif( $this->subsubtitle->halign == 'left' ) { - $this->subsubtitle->SetPos($this->subsubtitle->margin+2,$y); - } - elseif( $this->subsubtitle->halign == 'right' ) { - $indent = 0; - if( $this->doshadow ) - $indent = $this->shadow_width+2; - $this->subsubtitle->SetPos($this->img->width-$this->subsubtitle->margin-$indent,$y,'right'); - } - $this->subsubtitle->Stroke($this->img); + // ... and subtitle + $y += $this->title->GetTextHeight($this->img) + $margin + $this->subtitle->margin; + if( $this->subtitle->halign == 'center' ) { + $this->subtitle->Center(0,$this->img->width,$y); + } + elseif( $this->subtitle->halign == 'left' ) { + $this->subtitle->SetPos($this->subtitle->margin+2,$y); + } + elseif( $this->subtitle->halign == 'right' ) { + $indent = 0; + if( $this->doshadow ) + $indent = $this->shadow_width+2; + $this->subtitle->SetPos($this->img->width-$this->subtitle->margin-$indent,$y,'right'); + } + $this->subtitle->Stroke($this->img); - // ... and fancy title - $this->tabtitle->Stroke($this->img); + // ... and subsubtitle + $y += $this->subtitle->GetTextHeight($this->img) + $margin + $this->subsubtitle->margin; + if( $this->subsubtitle->halign == 'center' ) { + $this->subsubtitle->Center(0,$this->img->width,$y); + } + elseif( $this->subsubtitle->halign == 'left' ) { + $this->subsubtitle->SetPos($this->subsubtitle->margin+2,$y); + } + elseif( $this->subsubtitle->halign == 'right' ) { + $indent = 0; + if( $this->doshadow ) + $indent = $this->shadow_width+2; + $this->subsubtitle->SetPos($this->img->width-$this->subsubtitle->margin-$indent,$y,'right'); + } + $this->subsubtitle->Stroke($this->img); + + // ... and fancy title + $this->tabtitle->Stroke($this->img); } function StrokeTexts() { - // Stroke any user added text objects - if( $this->texts != null ) { - for($i=0; $i < count($this->texts); ++$i) { - $this->texts[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale); - } - } + // Stroke any user added text objects + if( $this->texts != null ) { + for($i=0; $i < count($this->texts); ++$i) { + $this->texts[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale); + } + } - if( $this->y2texts != null && $this->y2scale != null ) { - for($i=0; $i < count($this->y2texts); ++$i) { - $this->y2texts[$i]->StrokeWithScale($this->img,$this->xscale,$this->y2scale); - } - } + if( $this->y2texts != null && $this->y2scale != null ) { + for($i=0; $i < count($this->y2texts); ++$i) { + $this->y2texts[$i]->StrokeWithScale($this->img,$this->xscale,$this->y2scale); + } + } } function StrokeTables() { - if( $this->iTables != null ) { - $n = count($this->iTables); - for( $i=0; $i < $n; ++$i ) { - $this->iTables[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale); - } - } + if( $this->iTables != null ) { + $n = count($this->iTables); + for( $i=0; $i < $n; ++$i ) { + $this->iTables[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale); + } + } } function DisplayClientSideaImageMapAreas() { - // Debug stuff - display the outline of the image map areas - $csim=''; - foreach ($this->plots as $p) { - $csim.= $p->GetCSIMareas(); - } - $csim .= $this->legend->GetCSIMareas(); - if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) { - $this->img->SetColor($this->csimcolor); - $n = count($coords[0]); - for ($i=0; $i < $n; $i++) { - if ($coords[1][$i]=="poly") { - preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts); - $this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]); - $m = count($pts[0]); - for ($j=0; $j < $m; $j++) { - $this->img->LineTo($pts[1][$j],$pts[2][$j]); - } - } else if ($coords[1][$i]=="rect") { - $pts = preg_split('/,/', $coords[2][$i]); - $this->img->SetStartPoint($pts[0],$pts[1]); - $this->img->LineTo($pts[2],$pts[1]); - $this->img->LineTo($pts[2],$pts[3]); - $this->img->LineTo($pts[0],$pts[3]); - $this->img->LineTo($pts[0],$pts[1]); - } - } - } + // Debug stuff - display the outline of the image map areas + $csim=''; + foreach ($this->plots as $p) { + $csim.= $p->GetCSIMareas(); + } + $csim .= $this->legend->GetCSIMareas(); + if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) { + $this->img->SetColor($this->csimcolor); + $n = count($coords[0]); + for ($i=0; $i < $n; $i++) { + if ( $coords[1][$i] == 'poly' ) { + preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts); + $this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]); + $m = count($pts[0]); + for ($j=0; $j < $m; $j++) { + $this->img->LineTo($pts[1][$j],$pts[2][$j]); + } + } elseif ( $coords[1][$i] == 'rect' ) { + $pts = preg_split('/,/', $coords[2][$i]); + $this->img->SetStartPoint($pts[0],$pts[1]); + $this->img->LineTo($pts[2],$pts[1]); + $this->img->LineTo($pts[2],$pts[3]); + $this->img->LineTo($pts[0],$pts[3]); + $this->img->LineTo($pts[0],$pts[1]); + } + } + } } // Text scale offset in world coordinates function SetTextScaleOff($aOff) { - $this->text_scale_off = $aOff; - $this->xscale->text_scale_off = $aOff; + $this->text_scale_off = $aOff; + $this->xscale->text_scale_off = $aOff; } // Text width of bar to be centered in absolute pixels function SetTextScaleAbsCenterOff($aOff) { - $this->text_scale_abscenteroff = $aOff; + $this->text_scale_abscenteroff = $aOff; } // Get Y min and max values for added lines function GetLinesYMinMax( $aLines ) { - $n = count($aLines); - if( $n == 0 ) return false; - $min = $aLines[0]->scaleposition ; - $max = $min ; - $flg = false; - for( $i=0; $i < $n; ++$i ) { - if( $aLines[$i]->direction == HORIZONTAL ) { - $flg = true ; - $v = $aLines[$i]->scaleposition ; - if( $min > $v ) $min = $v ; - if( $max < $v ) $max = $v ; - } - } - return $flg ? array($min,$max) : false ; + $n = count($aLines); + if( $n == 0 ) return false; + $min = $aLines[0]->scaleposition ; + $max = $min ; + $flg = false; + for( $i=0; $i < $n; ++$i ) { + if( $aLines[$i]->direction == HORIZONTAL ) { + $flg = true ; + $v = $aLines[$i]->scaleposition ; + if( $min > $v ) $min = $v ; + if( $max < $v ) $max = $v ; + } + } + return $flg ? array($min,$max) : false ; } // Get X min and max values for added lines function GetLinesXMinMax( $aLines ) { - $n = count($aLines); - if( $n == 0 ) return false ; - $min = $aLines[0]->scaleposition ; - $max = $min ; - $flg = false; - for( $i=0; $i < $n; ++$i ) { - if( $aLines[$i]->direction == VERTICAL ) { - $flg = true ; - $v = $aLines[$i]->scaleposition ; - if( $min > $v ) $min = $v ; - if( $max < $v ) $max = $v ; - } - } - return $flg ? array($min,$max) : false ; + $n = count($aLines); + if( $n == 0 ) return false ; + $min = $aLines[0]->scaleposition ; + $max = $min ; + $flg = false; + for( $i=0; $i < $n; ++$i ) { + if( $aLines[$i]->direction == VERTICAL ) { + $flg = true ; + $v = $aLines[$i]->scaleposition ; + if( $min > $v ) $min = $v ; + if( $max < $v ) $max = $v ; + } + } + return $flg ? array($min,$max) : false ; } // Get min and max values for all included plots function GetPlotsYMinMax($aPlots) { - $n = count($aPlots); - $i=0; - do { - list($xmax,$max) = $aPlots[$i]->Max(); - } while( ++$i < $n && !is_numeric($max) ); + $n = count($aPlots); + $i=0; + do { + list($xmax,$max) = $aPlots[$i]->Max(); + } while( ++$i < $n && !is_numeric($max) ); - $i=0; - do { - list($xmin,$min) = $aPlots[$i]->Min(); - } while( ++$i < $n && !is_numeric($min) ); - - if( !is_numeric($min) || !is_numeric($max) ) { - JpGraphError::RaiseL(25044);//('Cannot use autoscaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).'); - } + $i=0; + do { + list($xmin,$min) = $aPlots[$i]->Min(); + } while( ++$i < $n && !is_numeric($min) ); - for($i=0; $i < $n; ++$i ) { - list($xmax,$ymax)=$aPlots[$i]->Max(); - list($xmin,$ymin)=$aPlots[$i]->Min(); - if (is_numeric($ymax)) $max=max($max,$ymax); - if (is_numeric($ymin)) $min=min($min,$ymin); - } - if( $min == '' ) $min = 0; - if( $max == '' ) $max = 0; - if( $min == 0 && $max == 0 ) { - // Special case if all values are 0 - $min=0;$max=1; - } - return array($min,$max); + if( !is_numeric($min) || !is_numeric($max) ) { + JpGraphError::RaiseL(25044);//('Cannot use autoscaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).'); + } + + for($i=0; $i < $n; ++$i ) { + list($xmax,$ymax)=$aPlots[$i]->Max(); + list($xmin,$ymin)=$aPlots[$i]->Min(); + if (is_numeric($ymax)) $max=max($max,$ymax); + if (is_numeric($ymin)) $min=min($min,$ymin); + } + if( $min == '' ) $min = 0; + if( $max == '' ) $max = 0; + if( $min == 0 && $max == 0 ) { + // Special case if all values are 0 + $min=0;$max=1; + } + return array($min,$max); } } // Class @@ -2794,416 +2968,168 @@ class Graph { // Description: Holds properties for a line //=================================================== class LineProperty { - public $iWeight=1, $iColor="black",$iStyle="solid",$iShow=true; - -//--------------- -// PUBLIC METHODS - function SetColor($aColor) { - $this->iColor = $aColor; - } - - function SetWeight($aWeight) { - $this->iWeight = $aWeight; - } - - function SetStyle($aStyle) { - $this->iStyle = $aStyle; - } - - function Show($aShow=true) { - $this->iShow=$aShow; - } - - function Stroke($aImg,$aX1,$aY1,$aX2,$aY2) { - if( $this->iShow ) { - $aImg->PushColor($this->iColor); - $oldls = $aImg->line_style; - $oldlw = $aImg->line_weight; - $aImg->SetLineWeight($this->iWeight); - $aImg->SetLineStyle($this->iStyle); - $aImg->StyleLine($aX1,$aY1,$aX2,$aY2); - $aImg->PopColor($this->iColor); - $aImg->line_style = $oldls; - $aImg->line_weight = $oldlw; + public $iWeight=1, $iColor='black', $iStyle='solid', $iShow=true; - } + function __construct($aWeight=1,$aColor='black',$aStyle='solid') { + $this->iWeight = $aWeight; + $this->iColor = $aColor; + $this->iStyle = $aStyle; + } + + function SetColor($aColor) { + $this->iColor = $aColor; + } + + function SetWeight($aWeight) { + $this->iWeight = $aWeight; + } + + function SetStyle($aStyle) { + $this->iStyle = $aStyle; + } + + function Show($aShow=true) { + $this->iShow=$aShow; + } + + function Stroke($aImg,$aX1,$aY1,$aX2,$aY2) { + if( $this->iShow ) { + $aImg->PushColor($this->iColor); + $oldls = $aImg->line_style; + $oldlw = $aImg->line_weight; + $aImg->SetLineWeight($this->iWeight); + $aImg->SetLineStyle($this->iStyle); + $aImg->StyleLine($aX1,$aY1,$aX2,$aY2); + $aImg->PopColor($this->iColor); + $aImg->line_style = $oldls; + $aImg->line_weight = $oldlw; + + } } } - //=================================================== -// CLASS Text -// Description: Arbitrary text object that can be added to the graph +// CLASS GraphTabTitle +// Description: Draw "tab" titles on top of graphs //=================================================== -class Text { - public $t,$margin=0; - public $x=0,$y=0,$halign="left",$valign="top",$color=array(0,0,0); - public $hide=false, $dir=0; - public $iScalePosY=null,$iScalePosX=null; - public $iWordwrap=0; - public $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=12; - protected $boxed=false; // Should the text be boxed - protected $paragraph_align="left"; - protected $icornerradius=0,$ishadowwidth=3; - protected $fcolor='white',$bcolor='black',$shadow=false; - protected $iCSIMarea='',$iCSIMalt='',$iCSIMtarget='',$iCSIMWinTarget=''; - -//--------------- -// CONSTRUCTOR - - // Create new text at absolute pixel coordinates - function Text($aTxt="",$aXAbsPos=0,$aYAbsPos=0) { - if( ! is_string($aTxt) ) { - JpGraphError::RaiseL(25050);//('First argument to Text::Text() must be s atring.'); - } - $this->t = $aTxt; - $this->x = round($aXAbsPos); - $this->y = round($aYAbsPos); - $this->margin = 0; - } -//--------------- -// PUBLIC METHODS - // Set the string in the text object - function Set($aTxt) { - $this->t = $aTxt; - } - - // Alias for Pos() - function SetPos($aXAbsPos=0,$aYAbsPos=0,$aHAlign="left",$aVAlign="top") { - //$this->Pos($aXAbsPos,$aYAbsPos,$aHAlign,$aVAlign); - $this->x = $aXAbsPos; - $this->y = $aYAbsPos; - $this->halign = $aHAlign; - $this->valign = $aVAlign; - } - - function SetScalePos($aX,$aY) { - $this->iScalePosX = $aX; - $this->iScalePosY = $aY; - } - - // Specify alignment for the text - function Align($aHAlign,$aVAlign="top",$aParagraphAlign="") { - $this->halign = $aHAlign; - $this->valign = $aVAlign; - if( $aParagraphAlign != "" ) - $this->paragraph_align = $aParagraphAlign; - } - - // Alias - function SetAlign($aHAlign,$aVAlign="top",$aParagraphAlign="") { - $this->Align($aHAlign,$aVAlign,$aParagraphAlign); - } - - // Specifies the alignment for a multi line text - function ParagraphAlign($aAlign) { - $this->paragraph_align = $aAlign; - } - - // Specifies the alignment for a multi line text - function SetParagraphAlign($aAlign) { - $this->paragraph_align = $aAlign; - } - - function SetShadow($aShadowColor='gray',$aShadowWidth=3) { - $this->ishadowwidth=$aShadowWidth; - $this->shadow=$aShadowColor; - $this->boxed=true; - } - - function SetWordWrap($aCol) { - $this->iWordwrap = $aCol ; - } - - // Specify that the text should be boxed. fcolor=frame color, bcolor=border color, - // $shadow=drop shadow should be added around the text. - function SetBox($aFrameColor=array(255,255,255),$aBorderColor=array(0,0,0),$aShadowColor=false,$aCornerRadius=4,$aShadowWidth=3) { - if( $aFrameColor==false ) - $this->boxed=false; - else - $this->boxed=true; - $this->fcolor=$aFrameColor; - $this->bcolor=$aBorderColor; - // For backwards compatibility when shadow was just true or false - if( $aShadowColor === true ) - $aShadowColor = 'gray'; - $this->shadow=$aShadowColor; - $this->icornerradius=$aCornerRadius; - $this->ishadowwidth=$aShadowWidth; - } - - // Hide the text - function Hide($aHide=true) { - $this->hide=$aHide; - } - - // This looks ugly since it's not a very orthogonal design - // but I added this "inverse" of Hide() to harmonize - // with some classes which I designed more recently (especially) - // jpgraph_gantt - function Show($aShow=true) { - $this->hide=!$aShow; - } - - // Specify font - function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) { - $this->font_family=$aFamily; - $this->font_style=$aStyle; - $this->font_size=$aSize; - } - - // Center the text between $left and $right coordinates - function Center($aLeft,$aRight,$aYAbsPos=false) { - $this->x = $aLeft + ($aRight-$aLeft )/2; - $this->halign = "center"; - if( is_numeric($aYAbsPos) ) - $this->y = $aYAbsPos; - } - - // Set text color - function SetColor($aColor) { - $this->color = $aColor; - } - - function SetAngle($aAngle) { - $this->SetOrientation($aAngle); - } - - // Orientation of text. Note only TTF fonts can have an arbitrary angle - function SetOrientation($aDirection=0) { - if( is_numeric($aDirection) ) - $this->dir=$aDirection; - elseif( $aDirection=="h" ) - $this->dir = 0; - elseif( $aDirection=="v" ) - $this->dir = 90; - else JpGraphError::RaiseL(25051);//(" Invalid direction specified for text."); - } - - // Total width of text - function GetWidth($aImg) { - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $w = $aImg->GetTextWidth($this->t,$this->dir); - return $w; - } - - // Hight of font - function GetFontHeight($aImg) { - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $h = $aImg->GetFontHeight(); - return $h; - - } - - function GetTextHeight($aImg) { - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $h = $aImg->GetTextHeight($this->t,$this->dir); - return $h; - } - - function GetHeight($aImg) { - // Synonym for GetTextHeight() - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $h = $aImg->GetTextHeight($this->t,$this->dir); - return $h; - } - - // Set the margin which will be interpretated differently depending - // on the context. - function SetMargin($aMarg) { - $this->margin = $aMarg; - } - - function StrokeWithScale($aImg,$axscale,$ayscale) { - if( $this->iScalePosX === null || - $this->iScalePosY === null ) { - $this->Stroke($aImg); - } - else { - $this->Stroke($aImg, - round($axscale->Translate($this->iScalePosX)), - round($ayscale->Translate($this->iScalePosY))); - } - } - - function SetCSIMTarget($aURITarget,$aAlt='',$aWinTarget='') { - $this->iCSIMtarget = $aURITarget; - $this->iCSIMalt = $aAlt; - $this->iCSIMWinTarget = $aWinTarget; - } - - function GetCSIMareas() { - if( $this->iCSIMtarget !== '' ) - return $this->iCSIMarea; - else - return ''; - } - - // Display text in image - function Stroke($aImg,$x=null,$y=null) { - - if( !empty($x) ) $this->x = round($x); - if( !empty($y) ) $this->y = round($y); - - // Insert newlines - if( $this->iWordwrap > 0 ) { - $this->t = wordwrap($this->t,$this->iWordwrap,"\n"); - } - - // If position been given as a fraction of the image size - // calculate the absolute position - if( $this->x < 1 && $this->x > 0 ) $this->x *= $aImg->width; - if( $this->y < 1 && $this->y > 0 ) $this->y *= $aImg->height; - - $aImg->PushColor($this->color); - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $aImg->SetTextAlign($this->halign,$this->valign); - if( $this->boxed ) { - if( $this->fcolor=="nofill" ) - $this->fcolor=false; - $aImg->SetLineWeight(1); - $bbox = $aImg->StrokeBoxedText($this->x,$this->y,$this->t, - $this->dir,$this->fcolor,$this->bcolor,$this->shadow, - $this->paragraph_align,5,5,$this->icornerradius, - $this->ishadowwidth); - } - else { - $bbox = $aImg->StrokeText($this->x,$this->y,$this->t,$this->dir,$this->paragraph_align); - } - - // Create CSIM targets - $coords = $bbox[0].','.$bbox[1].','.$bbox[2].','.$bbox[3].','.$bbox[4].','.$bbox[5].','.$bbox[6].','.$bbox[7]; - $this->iCSIMarea = "iCSIMtarget)."\" "; - if( trim($this->iCSIMalt) != '' ) { - $this->iCSIMarea .= " alt=\"".$this->iCSIMalt."\" "; - $this->iCSIMarea .= " title=\"".$this->iCSIMalt."\" "; - } - if( trim($this->iCSIMWinTarget) != '' ) { - $this->iCSIMarea .= " target=\"".$this->iCSIMWinTarget."\" "; - } - $this->iCSIMarea .= " />\n"; - - $aImg->PopColor($this->color); - - } -} // Class - class GraphTabTitle extends Text{ private $corner = 6 , $posx = 7, $posy = 4; private $fillcolor='lightyellow',$bordercolor='black'; private $align = 'left', $width=TABTITLE_WIDTHFIT; - function GraphTabTitle() { - $this->t = ''; - $this->font_style = FS_BOLD; - $this->hide = true; - $this->color = 'darkred'; + function __construct() { + $this->t = ''; + $this->font_style = FS_BOLD; + $this->hide = true; + $this->color = 'darkred'; } function SetColor($aTxtColor,$aFillColor='lightyellow',$aBorderColor='black') { - $this->color = $aTxtColor; - $this->fillcolor = $aFillColor; - $this->bordercolor = $aBorderColor; + $this->color = $aTxtColor; + $this->fillcolor = $aFillColor; + $this->bordercolor = $aBorderColor; } function SetFillColor($aFillColor) { - $this->fillcolor = $aFillColor; + $this->fillcolor = $aFillColor; } function SetTabAlign($aAlign) { - $this->align = $aAlign; + $this->align = $aAlign; } - + function SetWidth($aWidth) { - $this->width = $aWidth ; + $this->width = $aWidth ; } function Set($t) { - $this->t = $t; - $this->hide = false; + $this->t = $t; + $this->hide = false; } function SetCorner($aD) { - $this->corner = $aD ; + $this->corner = $aD ; } function Stroke($aImg,$aDummy1=null,$aDummy2=null) { - if( $this->hide ) - return; - $this->boxed = false; - $w = $this->GetWidth($aImg) + 2*$this->posx; - $h = $this->GetTextHeight($aImg) + 2*$this->posy; + if( $this->hide ) + return; + $this->boxed = false; + $w = $this->GetWidth($aImg) + 2*$this->posx; + $h = $this->GetTextHeight($aImg) + 2*$this->posy; - $x = $aImg->left_margin; - $y = $aImg->top_margin; + $x = $aImg->left_margin; + $y = $aImg->top_margin; - if( $this->width === TABTITLE_WIDTHFIT ) { - if( $this->align == 'left' ) { - $p = array($x, $y, - $x, $y-$h+$this->corner, - $x + $this->corner,$y-$h, - $x + $w - $this->corner, $y-$h, - $x + $w, $y-$h+$this->corner, - $x + $w, $y); - } - elseif( $this->align == 'center' ) { - $x += round($aImg->plotwidth/2) - round($w/2); - $p = array($x, $y, - $x, $y-$h+$this->corner, - $x + $this->corner, $y-$h, - $x + $w - $this->corner, $y-$h, - $x + $w, $y-$h+$this->corner, - $x + $w, $y); - } - else { - $x += $aImg->plotwidth -$w; - $p = array($x, $y, - $x, $y-$h+$this->corner, - $x + $this->corner,$y-$h, - $x + $w - $this->corner, $y-$h, - $x + $w, $y-$h+$this->corner, - $x + $w, $y); - } - } - else { - if( $this->width === TABTITLE_WIDTHFULL ) - $w = $aImg->plotwidth ; - else - $w = $this->width ; + if( $this->width === TABTITLE_WIDTHFIT ) { + if( $this->align == 'left' ) { + $p = array($x, $y, + $x, $y-$h+$this->corner, + $x + $this->corner,$y-$h, + $x + $w - $this->corner, $y-$h, + $x + $w, $y-$h+$this->corner, + $x + $w, $y); + } + elseif( $this->align == 'center' ) { + $x += round($aImg->plotwidth/2) - round($w/2); + $p = array($x, $y, + $x, $y-$h+$this->corner, + $x + $this->corner, $y-$h, + $x + $w - $this->corner, $y-$h, + $x + $w, $y-$h+$this->corner, + $x + $w, $y); + } + else { + $x += $aImg->plotwidth -$w; + $p = array($x, $y, + $x, $y-$h+$this->corner, + $x + $this->corner,$y-$h, + $x + $w - $this->corner, $y-$h, + $x + $w, $y-$h+$this->corner, + $x + $w, $y); + } + } + else { + if( $this->width === TABTITLE_WIDTHFULL ) { + $w = $aImg->plotwidth ; + } + else { + $w = $this->width ; + } - // Make the tab fit the width of the plot area - $p = array($x, $y, - $x, $y-$h+$this->corner, - $x + $this->corner,$y-$h, - $x + $w - $this->corner, $y-$h, - $x + $w, $y-$h+$this->corner, - $x + $w, $y); - - } - if( $this->halign == 'left' ) { - $aImg->SetTextAlign('left','bottom'); - $x += $this->posx; - $y -= $this->posy; - } - elseif( $this->halign == 'center' ) { - $aImg->SetTextAlign('center','bottom'); - $x += $w/2; - $y -= $this->posy; - } - else { - $aImg->SetTextAlign('right','bottom'); - $x += $w - $this->posx; - $y -= $this->posy; - } + // Make the tab fit the width of the plot area + $p = array($x, $y, + $x, $y-$h+$this->corner, + $x + $this->corner,$y-$h, + $x + $w - $this->corner, $y-$h, + $x + $w, $y-$h+$this->corner, + $x + $w, $y); - $aImg->SetColor($this->fillcolor); - $aImg->FilledPolygon($p); + } + if( $this->halign == 'left' ) { + $aImg->SetTextAlign('left','bottom'); + $x += $this->posx; + $y -= $this->posy; + } + elseif( $this->halign == 'center' ) { + $aImg->SetTextAlign('center','bottom'); + $x += $w/2; + $y -= $this->posy; + } + else { + $aImg->SetTextAlign('right','bottom'); + $x += $w - $this->posx; + $y -= $this->posy; + } - $aImg->SetColor($this->bordercolor); - $aImg->Polygon($p,true); - - $aImg->SetColor($this->color); - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $aImg->StrokeText($x,$y,$this->t,0,'center'); + $aImg->SetColor($this->fillcolor); + $aImg->FilledPolygon($p); + + $aImg->SetColor($this->bordercolor); + $aImg->Polygon($p,true); + + $aImg->SetColor($this->color); + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $aImg->StrokeText($x,$y,$this->t,0,'center'); } } @@ -3213,173 +3139,177 @@ class GraphTabTitle extends Text{ // Description: Format a superscript text //=================================================== class SuperScriptText extends Text { - private $iSuper=""; - private $sfont_family="",$sfont_style="",$sfont_size=8; + private $iSuper=''; + private $sfont_family='',$sfont_style='',$sfont_size=8; private $iSuperMargin=2,$iVertOverlap=4,$iSuperScale=0.65; private $iSDir=0; private $iSimple=false; - function SuperScriptText($aTxt="",$aSuper="",$aXAbsPos=0,$aYAbsPos=0) { - parent::Text($aTxt,$aXAbsPos,$aYAbsPos); - $this->iSuper = $aSuper; + function __construct($aTxt='',$aSuper='',$aXAbsPos=0,$aYAbsPos=0) { + parent::__construct($aTxt,$aXAbsPos,$aYAbsPos); + $this->iSuper = $aSuper; } function FromReal($aVal,$aPrecision=2) { - // Convert a floating point number to scientific notation - $neg=1.0; - if( $aVal < 0 ) { - $neg = -1.0; - $aVal = -$aVal; - } - - $l = floor(log10($aVal)); - $a = sprintf("%0.".$aPrecision."f",round($aVal / pow(10,$l),$aPrecision)); - $a *= $neg; - if( $this->iSimple && ($a == 1 || $a==-1) ) $a = ''; - - if( $a != '' ) - $this->t = $a.' * 10'; - else { - if( $neg == 1 ) - $this->t = '10'; - else - $this->t = '-10'; - } - $this->iSuper = $l; + // Convert a floating point number to scientific notation + $neg=1.0; + if( $aVal < 0 ) { + $neg = -1.0; + $aVal = -$aVal; + } + + $l = floor(log10($aVal)); + $a = sprintf("%0.".$aPrecision."f",round($aVal / pow(10,$l),$aPrecision)); + $a *= $neg; + if( $this->iSimple && ($a == 1 || $a==-1) ) $a = ''; + + if( $a != '' ) { + $this->t = $a.' * 10'; + } + else { + if( $neg == 1 ) { + $this->t = '10'; + } + else { + $this->t = '-10'; + } + } + $this->iSuper = $l; } - function Set($aTxt,$aSuper="") { - $this->t = $aTxt; - $this->iSuper = $aSuper; + function Set($aTxt,$aSuper='') { + $this->t = $aTxt; + $this->iSuper = $aSuper; } function SetSuperFont($aFontFam,$aFontStyle=FS_NORMAL,$aFontSize=8) { - $this->sfont_family = $aFontFam; - $this->sfont_style = $aFontStyle; - $this->sfont_size = $aFontSize; + $this->sfont_family = $aFontFam; + $this->sfont_style = $aFontStyle; + $this->sfont_size = $aFontSize; } // Total width of text function GetWidth($aImg) { - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $w = $aImg->GetTextWidth($this->t); - $aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size); - $w += $aImg->GetTextWidth($this->iSuper); - $w += $this->iSuperMargin; - return $w; + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $w = $aImg->GetTextWidth($this->t); + $aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size); + $w += $aImg->GetTextWidth($this->iSuper); + $w += $this->iSuperMargin; + return $w; } - + // Hight of font (approximate the height of the text) function GetFontHeight($aImg) { - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $h = $aImg->GetFontHeight(); - $aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size); - $h += $aImg->GetFontHeight(); - return $h; + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $h = $aImg->GetFontHeight(); + $aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size); + $h += $aImg->GetFontHeight(); + return $h; } // Hight of text function GetTextHeight($aImg) { - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $h = $aImg->GetTextHeight($this->t); - $aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size); - $h += $aImg->GetTextHeight($this->iSuper); - return $h; + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $h = $aImg->GetTextHeight($this->t); + $aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size); + $h += $aImg->GetTextHeight($this->iSuper); + return $h; } function Stroke($aImg,$ax=-1,$ay=-1) { - + // To position the super script correctly we need different - // cases to handle the alignmewnt specified since that will - // determine how we can interpret the x,y coordinates - - $w = parent::GetWidth($aImg); - $h = parent::GetTextHeight($aImg); - switch( $this->valign ) { - case 'top': - $sy = $this->y; - break; - case 'center': - $sy = $this->y - $h/2; - break; - case 'bottom': - $sy = $this->y - $h; - break; - default: - JpGraphError::RaiseL(25052);//('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text'); - break; - } + // cases to handle the alignmewnt specified since that will + // determine how we can interpret the x,y coordinates - switch( $this->halign ) { - case 'left': - $sx = $this->x + $w; - break; - case 'center': - $sx = $this->x + $w/2; - break; - case 'right': - $sx = $this->x; - break; - default: - JpGraphError::RaiseL(25053);//('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text'); - break; - } + $w = parent::GetWidth($aImg); + $h = parent::GetTextHeight($aImg); + switch( $this->valign ) { + case 'top': + $sy = $this->y; + break; + case 'center': + $sy = $this->y - $h/2; + break; + case 'bottom': + $sy = $this->y - $h; + break; + default: + JpGraphError::RaiseL(25052);//('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text'); + break; + } - $sx += $this->iSuperMargin; - $sy += $this->iVertOverlap; + switch( $this->halign ) { + case 'left': + $sx = $this->x + $w; + break; + case 'center': + $sx = $this->x + $w/2; + break; + case 'right': + $sx = $this->x; + break; + default: + JpGraphError::RaiseL(25053);//('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text'); + break; + } - // Should we automatically determine the font or - // has the user specified it explicetly? - if( $this->sfont_family == "" ) { - if( $this->font_family <= FF_FONT2 ) { - if( $this->font_family == FF_FONT0 ) { - $sff = FF_FONT0; - } - elseif( $this->font_family == FF_FONT1 ) { - if( $this->font_style == FS_NORMAL ) - $sff = FF_FONT0; - else - $sff = FF_FONT1; - } - else { - $sff = FF_FONT1; - } - $sfs = $this->font_style; - $sfz = $this->font_size; - } - else { - // TTF fonts - $sff = $this->font_family; - $sfs = $this->font_style; - $sfz = floor($this->font_size*$this->iSuperScale); - if( $sfz < 8 ) $sfz = 8; - } - $this->sfont_family = $sff; - $this->sfont_style = $sfs; - $this->sfont_size = $sfz; - } - else { - $sff = $this->sfont_family; - $sfs = $this->sfont_style; - $sfz = $this->sfont_size; - } + $sx += $this->iSuperMargin; + $sy += $this->iVertOverlap; - parent::Stroke($aImg,$ax,$ay); + // Should we automatically determine the font or + // has the user specified it explicetly? + if( $this->sfont_family == '' ) { + if( $this->font_family <= FF_FONT2 ) { + if( $this->font_family == FF_FONT0 ) { + $sff = FF_FONT0; + } + elseif( $this->font_family == FF_FONT1 ) { + if( $this->font_style == FS_NORMAL ) { + $sff = FF_FONT0; + } + else { + $sff = FF_FONT1; + } + } + else { + $sff = FF_FONT1; + } + $sfs = $this->font_style; + $sfz = $this->font_size; + } + else { + // TTF fonts + $sff = $this->font_family; + $sfs = $this->font_style; + $sfz = floor($this->font_size*$this->iSuperScale); + if( $sfz < 8 ) $sfz = 8; + } + $this->sfont_family = $sff; + $this->sfont_style = $sfs; + $this->sfont_size = $sfz; + } + else { + $sff = $this->sfont_family; + $sfs = $this->sfont_style; + $sfz = $this->sfont_size; + } + parent::Stroke($aImg,$ax,$ay); - // For the builtin fonts we need to reduce the margins - // since the bounding bx reported for the builtin fonts - // are much larger than for the TTF fonts. - if( $sff <= FF_FONT2 ) { - $sx -= 2; - $sy += 3; - } + // For the builtin fonts we need to reduce the margins + // since the bounding bx reported for the builtin fonts + // are much larger than for the TTF fonts. + if( $sff <= FF_FONT2 ) { + $sx -= 2; + $sy += 3; + } - $aImg->SetTextAlign('left','bottom'); - $aImg->SetFont($sff,$sfs,$sfz); - $aImg->PushColor($this->color); - $aImg->StrokeText($sx,$sy,$this->iSuper,$this->iSDir,'left'); - $aImg->PopColor(); + $aImg->SetTextAlign('left','bottom'); + $aImg->SetFont($sff,$sfs,$sfz); + $aImg->PushColor($this->color); + $aImg->StrokeText($sx,$sy,$this->iSuper,$this->iSDir,'left'); + $aImg->PopColor(); } } @@ -3391,144 +3321,140 @@ class SuperScriptText extends Text { class Grid { protected $img; protected $scale; - protected $grid_color='#DDDDDD',$grid_mincolor='#DDDDDD'; - protected $type="solid"; - protected $show=false, $showMinor=false,$weight=1; + protected $majorcolor='#DDDDDD',$minorcolor='#EEEEEE'; + protected $majortype='solid',$minortype='solid'; + protected $show=false, $showMinor=false,$majorweight=1,$minorweight=1; protected $fill=false,$fillcolor=array('#EFEFEF','#BBCCFF'); -//--------------- -// CONSTRUCTOR - function Grid($aAxis) { - $this->scale = $aAxis->scale; - $this->img = $aAxis->img; + + function __construct($aAxis) { + $this->scale = $aAxis->scale; + $this->img = $aAxis->img; } -//--------------- -// PUBLIC METHODS + function SetColor($aMajColor,$aMinColor=false) { - $this->grid_color=$aMajColor; - if( $aMinColor === false ) - $aMinColor = $aMajColor ; - $this->grid_mincolor = $aMinColor; + $this->majorcolor=$aMajColor; + if( $aMinColor === false ) { + $aMinColor = $aMajColor ; + } + $this->minorcolor = $aMinColor; } - - function SetWeight($aWeight) { - $this->weight=$aWeight; + + function SetWeight($aMajorWeight,$aMinorWeight=1) { + $this->majorweight=$aMajorWeight; + $this->minorweight=$aMinorWeight; } - + // Specify if grid should be dashed, dotted or solid - function SetLineStyle($aType) { - $this->type = $aType; + function SetLineStyle($aMajorType,$aMinorType='solid') { + $this->majortype = $aMajorType; + $this->minortype = $aMinorType; } - + + function SetStyle($aMajorType,$aMinorType='solid') { + $this->SetLineStyle($aMajorType,$aMinorType); + } + // Decide if both major and minor grid should be displayed function Show($aShowMajor=true,$aShowMinor=false) { - $this->show=$aShowMajor; - $this->showMinor=$aShowMinor; + $this->show=$aShowMajor; + $this->showMinor=$aShowMinor; } - + function SetFill($aFlg=true,$aColor1='lightgray',$aColor2='lightblue') { - $this->fill = $aFlg; - $this->fillcolor = array( $aColor1, $aColor2 ); + $this->fill = $aFlg; + $this->fillcolor = array( $aColor1, $aColor2 ); } - + // Display the grid function Stroke() { - if( $this->showMinor && !$this->scale->textscale ) { - $tmp = $this->grid_color; - $this->grid_color = $this->grid_mincolor; - $this->DoStroke($this->scale->ticks->ticks_pos); - - $this->grid_color = $tmp; - $this->DoStroke($this->scale->ticks->maj_ticks_pos); - } - else { - $this->DoStroke($this->scale->ticks->maj_ticks_pos); - } + if( $this->showMinor && !$this->scale->textscale ) { + $this->DoStroke($this->scale->ticks->ticks_pos,$this->minortype,$this->minorcolor,$this->minorweight); + $this->DoStroke($this->scale->ticks->maj_ticks_pos,$this->majortype,$this->majorcolor,$this->majorweight); + } + else { + $this->DoStroke($this->scale->ticks->maj_ticks_pos,$this->majortype,$this->majorcolor,$this->majorweight); + } } - -//-------------- -// Private methods + + //-------------- + // Private methods // Draw the grid - function DoStroke($aTicksPos) { - if( !$this->show ) - return; - $nbrgrids = count($aTicksPos); + function DoStroke($aTicksPos,$aType,$aColor,$aWeight) { + if( !$this->show ) return; + $nbrgrids = count($aTicksPos); - if( $this->scale->type=="y" ) { - $xl=$this->img->left_margin; - $xr=$this->img->width-$this->img->right_margin; - - if( $this->fill ) { - // Draw filled areas - $y2 = $aTicksPos[0]; - $i=1; - while( $i < $nbrgrids ) { - $y1 = $y2; - $y2 = $aTicksPos[$i++]; - $this->img->SetColor($this->fillcolor[$i & 1]); - $this->img->FilledRectangle($xl,$y1,$xr,$y2); - } - } + if( $this->scale->type == 'y' ) { + $xl=$this->img->left_margin; + $xr=$this->img->width-$this->img->right_margin; - $this->img->SetColor($this->grid_color); - $this->img->SetLineWeight($this->weight); + if( $this->fill ) { + // Draw filled areas + $y2 = $aTicksPos[0]; + $i=1; + while( $i < $nbrgrids ) { + $y1 = $y2; + $y2 = $aTicksPos[$i++]; + $this->img->SetColor($this->fillcolor[$i & 1]); + $this->img->FilledRectangle($xl,$y1,$xr,$y2); + } + } - // Draw grid lines - switch( $this->type ) { - case "solid": $style = LINESTYLE_SOLID; break; - case "dotted": $style = LINESTYLE_DOTTED; break; - case "dashed": $style = LINESTYLE_DASHED; break; - case "longdashed": $style = LINESTYLE_LONGDASH; break; - default: - $style = LINESTYLE_SOLID; break; - } + $this->img->SetColor($aColor); + $this->img->SetLineWeight($aWeight); - for($i=0; $i < $nbrgrids; ++$i) { - $y=$aTicksPos[$i]; - $this->img->StyleLine($xl,$y,$xr,$y,$style); - } - } - elseif( $this->scale->type=="x" ) { - $yu=$this->img->top_margin; - $yl=$this->img->height-$this->img->bottom_margin; - $limit=$this->img->width-$this->img->right_margin; + // Draw grid lines + switch( $aType ) { + case 'solid': $style = LINESTYLE_SOLID; break; + case 'dotted': $style = LINESTYLE_DOTTED; break; + case 'dashed': $style = LINESTYLE_DASHED; break; + case 'longdashed': $style = LINESTYLE_LONGDASH; break; + default: + $style = LINESTYLE_SOLID; break; + } - if( $this->fill ) { - // Draw filled areas - $x2 = $aTicksPos[0]; - $i=1; - while( $i < $nbrgrids ) { - $x1 = $x2; - $x2 = min($aTicksPos[$i++],$limit) ; - $this->img->SetColor($this->fillcolor[$i & 1]); - $this->img->FilledRectangle($x1,$yu,$x2,$yl); - } - } + for($i=0; $i < $nbrgrids; ++$i) { + $y=$aTicksPos[$i]; + $this->img->StyleLine($xl,$y,$xr,$y,$style); + } + } + elseif( $this->scale->type == 'x' ) { + $yu=$this->img->top_margin; + $yl=$this->img->height-$this->img->bottom_margin; + $limit=$this->img->width-$this->img->right_margin; - $this->img->SetColor($this->grid_color); - $this->img->SetLineWeight($this->weight); + if( $this->fill ) { + // Draw filled areas + $x2 = $aTicksPos[0]; + $i=1; + while( $i < $nbrgrids ) { + $x1 = $x2; + $x2 = min($aTicksPos[$i++],$limit) ; + $this->img->SetColor($this->fillcolor[$i & 1]); + $this->img->FilledRectangle($x1,$yu,$x2,$yl); + } + } - // We must also test for limit since we might have - // an offset and the number of ticks is calculated with - // assumption offset==0 so we might end up drawing one - // to many gridlines - $i=0; - $x=$aTicksPos[$i]; - while( $itype == "solid" ) - $this->img->Line($x,$yl,$x,$yu); - elseif( $this->type == "dotted" ) - $this->img->DashedLine($x,$yl,$x,$yu,1,6); - elseif( $this->type == "dashed" ) - $this->img->DashedLine($x,$yl,$x,$yu,2,4); - elseif( $this->type == "longdashed" ) - $this->img->DashedLine($x,$yl,$x,$yu,8,6); - ++$i; - } - } - else { - JpGraphError::RaiseL(25054,$this->scale->type);//('Internal error: Unknown grid axis ['.$this->scale->type.']'); - } - return true; + $this->img->SetColor($aColor); + $this->img->SetLineWeight($aWeight); + + // We must also test for limit since we might have + // an offset and the number of ticks is calculated with + // assumption offset==0 so we might end up drawing one + // to many gridlines + $i=0; + $x=$aTicksPos[$i]; + while( $iimg->Line($x,$yl,$x,$yu); + elseif( $aType == 'dotted' ) $this->img->DashedLine($x,$yl,$x,$yu,1,6); + elseif( $aType == 'dashed' ) $this->img->DashedLine($x,$yl,$x,$yu,2,4); + elseif( $aType == 'longdashed' ) $this->img->DashedLine($x,$yl,$x,$yu,8,6); + ++$i; + } + } + else { + JpGraphError::RaiseL(25054,$this->scale->type);//('Internal error: Unknown grid axis ['.$this->scale->type.']'); + } + return true; } } // Class @@ -3538,10 +3464,10 @@ class Grid { // moment the code is not really good since the axis on // several occasion must know wheter it's an X or Y axis. // This was a design decision to make the code easier to -// follow. +// follow. //=================================================== class AxisPrototype { - public $scale=null; + public $scale=null; public $img=null; public $hide=false,$hide_labels=false; public $title=null; @@ -3563,221 +3489,191 @@ class AxisPrototype { protected $hide_line=false; protected $iDeltaAbsPos=0; -//--------------- -// CONSTRUCTOR - function Axis($img,$aScale,$color=array(0,0,0)) { - $this->img = $img; - $this->scale = $aScale; - $this->color = $color; - $this->title=new Text(""); - - if( $aScale->type=="y" ) { - $this->title_margin = 25; - $this->title_adjust="middle"; - $this->title->SetOrientation(90); - $this->tick_label_margin=7; - $this->labelPos=SIDE_LEFT; - } - else { - $this->title_margin = 5; - $this->title_adjust="high"; - $this->title->SetOrientation(0); - $this->tick_label_margin=7; - $this->labelPos=SIDE_DOWN; - $this->title_side=SIDE_DOWN; - } + function __construct($img,$aScale,$color = array(0,0,0)) { + $this->img = $img; + $this->scale = $aScale; + $this->color = $color; + $this->title=new Text(''); + + if( $aScale->type == 'y' ) { + $this->title_margin = 25; + $this->title_adjust = 'middle'; + $this->title->SetOrientation(90); + $this->tick_label_margin=7; + $this->labelPos=SIDE_LEFT; + } + else { + $this->title_margin = 5; + $this->title_adjust = 'high'; + $this->title->SetOrientation(0); + $this->tick_label_margin=7; + $this->labelPos=SIDE_DOWN; + $this->title_side=SIDE_DOWN; + } } -//--------------- -// PUBLIC METHODS - + function SetLabelFormat($aFormStr) { - $this->scale->ticks->SetLabelFormat($aFormStr); + $this->scale->ticks->SetLabelFormat($aFormStr); } function SetLabelFormatString($aFormStr,$aDate=false) { - $this->scale->ticks->SetLabelFormat($aFormStr,$aDate); - } - - function SetLabelFormatCallback($aFuncName) { - $this->scale->ticks->SetFormatCallback($aFuncName); + $this->scale->ticks->SetLabelFormat($aFormStr,$aDate); } - function SetLabelAlign($aHAlign,$aVAlign="top",$aParagraphAlign='left') { - $this->label_halign = $aHAlign; - $this->label_valign = $aVAlign; - $this->label_para_align = $aParagraphAlign; - } + function SetLabelFormatCallback($aFuncName) { + $this->scale->ticks->SetFormatCallback($aFuncName); + } + + function SetLabelAlign($aHAlign,$aVAlign='top',$aParagraphAlign='left') { + $this->label_halign = $aHAlign; + $this->label_valign = $aVAlign; + $this->label_para_align = $aParagraphAlign; + } // Don't display the first label function HideFirstTickLabel($aShow=false) { - $this->show_first_label=$aShow; + $this->show_first_label=$aShow; } function HideLastTickLabel($aShow=false) { - $this->show_last_label=$aShow; + $this->show_last_label=$aShow; } // Manually specify the major and (optional) minor tick position and labels function SetTickPositions($aMajPos,$aMinPos=NULL,$aLabels=NULL) { - $this->scale->ticks->SetTickPositions($aMajPos,$aMinPos,$aLabels); + $this->scale->ticks->SetTickPositions($aMajPos,$aMinPos,$aLabels); } // Manually specify major tick positions and optional labels function SetMajTickPositions($aMajPos,$aLabels=NULL) { - $this->scale->ticks->SetTickPositions($aMajPos,NULL,$aLabels); + $this->scale->ticks->SetTickPositions($aMajPos,NULL,$aLabels); } // Hide minor or major tick marks function HideTicks($aHideMinor=true,$aHideMajor=true) { - $this->scale->ticks->SupressMinorTickMarks($aHideMinor); - $this->scale->ticks->SupressTickMarks($aHideMajor); + $this->scale->ticks->SupressMinorTickMarks($aHideMinor); + $this->scale->ticks->SupressTickMarks($aHideMajor); } // Hide zero label function HideZeroLabel($aFlag=true) { - $this->scale->ticks->SupressZeroLabel(); + $this->scale->ticks->SupressZeroLabel(); } - + function HideFirstLastLabel() { - // The two first calls to ticks method will supress - // automatically generated scale values. However, that - // will not affect manually specified value, e.g text-scales. - // therefor we also make a kludge here to supress manually - // specified scale labels. - $this->scale->ticks->SupressLast(); - $this->scale->ticks->SupressFirst(); - $this->show_first_label = false; - $this->show_last_label = false; + // The two first calls to ticks method will supress + // automatically generated scale values. However, that + // will not affect manually specified value, e.g text-scales. + // therefor we also make a kludge here to supress manually + // specified scale labels. + $this->scale->ticks->SupressLast(); + $this->scale->ticks->SupressFirst(); + $this->show_first_label = false; + $this->show_last_label = false; } - + // Hide the axis function Hide($aHide=true) { - $this->hide=$aHide; + $this->hide=$aHide; } // Hide the actual axis-line, but still print the labels function HideLine($aHide=true) { - $this->hide_line = $aHide; + $this->hide_line = $aHide; } function HideLabels($aHide=true) { - $this->hide_labels = $aHide; + $this->hide_labels = $aHide; } - // Weight of axis function SetWeight($aWeight) { - $this->weight = $aWeight; + $this->weight = $aWeight; } // Axis color function SetColor($aColor,$aLabelColor=false) { - $this->color = $aColor; - if( !$aLabelColor ) $this->label_color = $aColor; - else $this->label_color = $aLabelColor; - } - - // Title on axis - function SetTitle($aTitle,$aAdjustAlign="high") { - $this->title->Set($aTitle); - $this->title_adjust=$aAdjustAlign; - } - - // Specify distance from the axis - function SetTitleMargin($aMargin) { - $this->title_margin=$aMargin; - } - - // Which side of the axis should the axis title be? - function SetTitleSide($aSideOfAxis) { - $this->title_side = $aSideOfAxis; + $this->color = $aColor; + if( !$aLabelColor ) $this->label_color = $aColor; + else $this->label_color = $aLabelColor; } - // Utility function to set the direction for tick marks - function SetTickDirection($aDir) { - // Will be deprecated from 1.7 - if( ERR_DEPRECATED ) - JpGraphError::RaiseL(25055);//('Axis::SetTickDirection() is deprecated. Use Axis::SetTickSide() instead'); - $this->scale->ticks->SetSide($aDir); + // Title on axis + function SetTitle($aTitle,$aAdjustAlign='high') { + $this->title->Set($aTitle); + $this->title_adjust=$aAdjustAlign; } - + + // Specify distance from the axis + function SetTitleMargin($aMargin) { + $this->title_margin=$aMargin; + } + + // Which side of the axis should the axis title be? + function SetTitleSide($aSideOfAxis) { + $this->title_side = $aSideOfAxis; + } + function SetTickSide($aDir) { - $this->scale->ticks->SetSide($aDir); + $this->scale->ticks->SetSide($aDir); } - + + function SetTickSize($aMajSize,$aMinSize=3) { + $this->scale->ticks->SetSize($aMajSize,$aMinSize=3); + } + // Specify text labels for the ticks. One label for each data point function SetTickLabels($aLabelArray,$aLabelColorArray=null) { - $this->ticks_label = $aLabelArray; - $this->ticks_label_colors = $aLabelColorArray; - } - - // How far from the axis should the labels be drawn - function SetTickLabelMargin($aMargin) { - if( ERR_DEPRECATED ) - JpGraphError::RaiseL(25056);//('SetTickLabelMargin() is deprecated. Use Axis::SetLabelMargin() instead.'); - $this->tick_label_margin=$aMargin; + $this->ticks_label = $aLabelArray; + $this->ticks_label_colors = $aLabelColorArray; } function SetLabelMargin($aMargin) { - $this->tick_label_margin=$aMargin; - } - - // Specify that every $step of the ticks should be displayed starting - // at $start - // DEPRECATED FUNCTION: USE SetTextTickInterval() INSTEAD - function SetTextTicks($step,$start=0) { - JpGraphError::RaiseL(25057);//(" SetTextTicks() is deprecated. Use SetTextTickInterval() instead."); + $this->tick_label_margin=$aMargin; } // Specify that every $step of the ticks should be displayed starting - // at $start + // at $start function SetTextTickInterval($aStep,$aStart=0) { - $this->scale->ticks->SetTextLabelStart($aStart); - $this->tick_step=$aStep; + $this->scale->ticks->SetTextLabelStart($aStart); + $this->tick_step=$aStep; } - - // Specify that every $step tick mark should have a label + + // Specify that every $step tick mark should have a label // should be displayed starting function SetTextLabelInterval($aStep) { - if( $aStep < 1 ) - JpGraphError::RaiseL(25058);//(" Text label interval must be specified >= 1."); - $this->label_step=$aStep; + if( $aStep < 1 ) { + JpGraphError::RaiseL(25058);//(" Text label interval must be specified >= 1."); + } + $this->label_step=$aStep; } - - // Which side of the axis should the labels be on? - function SetLabelPos($aSidePos) { - // This will be deprecated from 1.7 - if( ERR_DEPRECATED ) - JpGraphError::RaiseL(25059);//('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.'); - $this->labelPos=$aSidePos; - } - + function SetLabelSide($aSidePos) { - $this->labelPos=$aSidePos; + $this->labelPos=$aSidePos; } // Set the font function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) { - $this->font_family = $aFamily; - $this->font_style = $aStyle; - $this->font_size = $aSize; + $this->font_family = $aFamily; + $this->font_style = $aStyle; + $this->font_size = $aSize; } // Position for axis line on the "other" scale function SetPos($aPosOnOtherScale) { - $this->pos=$aPosOnOtherScale; + $this->pos=$aPosOnOtherScale; } - // Set the position of the axis to be X-pixels delta to the right + // Set the position of the axis to be X-pixels delta to the right // of the max X-position (used to position the multiple Y-axis) function SetPosAbsDelta($aDelta) { - $this->iDeltaAbsPos=$aDelta; + $this->iDeltaAbsPos=$aDelta; } - + // Specify the angle for the tick labels function SetLabelAngle($aAngle) { - $this->label_angle = $aAngle; - } + $this->label_angle = $aAngle; + } } // Class @@ -3788,218 +3684,252 @@ class AxisPrototype { // moment the code is not really good since the axis on // several occasion must know wheter it's an X or Y axis. // This was a design decision to make the code easier to -// follow. +// follow. //=================================================== class Axis extends AxisPrototype { - function Axis($img,$aScale,$color=array(0,0,0)) { - parent::Axis($img,$aScale,$color); + function __construct($img,$aScale,$color='black') { + parent::__construct($img,$aScale,$color); } - + // Stroke the axis. - function Stroke($aOtherAxisScale,$aStrokeLabels=true) { - if( $this->hide ) return; - if( is_numeric($this->pos) ) { - $pos=$aOtherAxisScale->Translate($this->pos); - } - else { // Default to minimum of other scale if pos not set - if( ($aOtherAxisScale->GetMinVal() >= 0 && $this->pos==false) || $this->pos=="min" ) { - $pos = $aOtherAxisScale->scale_abs[0]; - } - elseif($this->pos == "max") { - $pos = $aOtherAxisScale->scale_abs[1]; - } - else { // If negative set x-axis at 0 - $this->pos=0; - $pos=$aOtherAxisScale->Translate(0); - } - } - $pos += $this->iDeltaAbsPos; - $this->img->SetLineWeight($this->weight); - $this->img->SetColor($this->color); - $this->img->SetFont($this->font_family,$this->font_style,$this->font_size); - if( $this->scale->type == "x" ) { - if( !$this->hide_line ) - $this->img->FilledRectangle($this->img->left_margin,$pos, - $this->img->width-$this->img->right_margin,$pos+$this->weight-1); - if( $this->title_side == SIDE_DOWN ) { - $y = $pos + $this->img->GetFontHeight() + $this->title_margin + $this->title->margin; - $yalign = 'top'; - } - else { - $y = $pos - $this->img->GetFontHeight() - $this->title_margin - $this->title->margin; - $yalign = 'bottom'; - } + function Stroke($aOtherAxisScale,$aStrokeLabels=true) { + if( $this->hide ) + return; + if( is_numeric($this->pos) ) { + $pos=$aOtherAxisScale->Translate($this->pos); + } + else { // Default to minimum of other scale if pos not set + if( ($aOtherAxisScale->GetMinVal() >= 0 && $this->pos==false) || $this->pos == 'min' ) { + $pos = $aOtherAxisScale->scale_abs[0]; + } + elseif($this->pos == "max") { + $pos = $aOtherAxisScale->scale_abs[1]; + } + else { // If negative set x-axis at 0 + $this->pos=0; + $pos=$aOtherAxisScale->Translate(0); + } + } + $pos += $this->iDeltaAbsPos; + $this->img->SetLineWeight($this->weight); + $this->img->SetColor($this->color); + $this->img->SetFont($this->font_family,$this->font_style,$this->font_size); + if( $this->scale->type == "x" ) { + if( !$this->hide_line ) { + $this->img->FilledRectangle($this->img->left_margin,$pos,$this->img->width-$this->img->right_margin,$pos+$this->weight-1); + } + if( $this->title_side == SIDE_DOWN ) { + $y = $pos + $this->img->GetFontHeight() + $this->title_margin + $this->title->margin; + $yalign = 'top'; + } + else { + $y = $pos - $this->img->GetFontHeight() - $this->title_margin - $this->title->margin; + $yalign = 'bottom'; + } - if( $this->title_adjust=='high' ) - $this->title->SetPos($this->img->width-$this->img->right_margin,$y,'right',$yalign); - elseif( $this->title_adjust=='middle' || $this->title_adjust=='center' ) - $this->title->SetPos(($this->img->width-$this->img->left_margin-$this->img->right_margin)/2+$this->img->left_margin,$y,'center',$yalign); - elseif($this->title_adjust=='low') - $this->title->SetPos($this->img->left_margin,$y,'left',$yalign); - else { - JpGraphError::RaiseL(25060,$this->title_adjust);//('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')'); - } - } - elseif( $this->scale->type == "y" ) { - // Add line weight to the height of the axis since - // the x-axis could have a width>1 and we want the axis to fit nicely together. - if( !$this->hide_line ) - $this->img->FilledRectangle($pos-$this->weight+1,$this->img->top_margin, - $pos,$this->img->height-$this->img->bottom_margin+$this->weight-1); - $x=$pos ; - if( $this->title_side == SIDE_LEFT ) { - $x -= $this->title_margin; - $x -= $this->title->margin; - $halign="right"; - } - else { - $x += $this->title_margin; - $x += $this->title->margin; - $halign="left"; - } - // If the user has manually specified an hor. align - // then we override the automatic settings with this - // specifed setting. Since default is 'left' we compare - // with that. (This means a manually set 'left' align - // will have no effect.) - if( $this->title->halign != 'left' ) - $halign = $this->title->halign; - if( $this->title_adjust=="high" ) - $this->title->SetPos($x,$this->img->top_margin,$halign,"top"); - elseif($this->title_adjust=="middle" || $this->title_adjust=="center") - $this->title->SetPos($x,($this->img->height-$this->img->top_margin-$this->img->bottom_margin)/2+$this->img->top_margin,$halign,"center"); - elseif($this->title_adjust=="low") - $this->title->SetPos($x,$this->img->height-$this->img->bottom_margin,$halign,"bottom"); - else - JpGraphError::RaiseL(25061,$this->title_adjust);//('Unknown alignment specified for Y-axis title. ('.$this->title_adjust.')'); - - } - $this->scale->ticks->Stroke($this->img,$this->scale,$pos); - if( $aStrokeLabels ) { - if( !$this->hide_labels ) - $this->StrokeLabels($pos); - $this->title->Stroke($this->img); - } + if( $this->title_adjust=='high' ) { + $this->title->SetPos($this->img->width-$this->img->right_margin,$y,'right',$yalign); + } + elseif( $this->title_adjust=='middle' || $this->title_adjust=='center' ) { + $this->title->SetPos(($this->img->width-$this->img->left_margin-$this->img->right_margin)/2+$this->img->left_margin,$y,'center',$yalign); + } + elseif($this->title_adjust=='low') { + $this->title->SetPos($this->img->left_margin,$y,'left',$yalign); + } + else { + JpGraphError::RaiseL(25060,$this->title_adjust);//('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')'); + } + } + elseif( $this->scale->type == "y" ) { + // Add line weight to the height of the axis since + // the x-axis could have a width>1 and we want the axis to fit nicely together. + if( !$this->hide_line ) { + $this->img->FilledRectangle($pos-$this->weight+1,$this->img->top_margin,$pos,$this->img->height-$this->img->bottom_margin+$this->weight-1); + } + $x=$pos ; + if( $this->title_side == SIDE_LEFT ) { + $x -= $this->title_margin; + $x -= $this->title->margin; + $halign = 'right'; + } + else { + $x += $this->title_margin; + $x += $this->title->margin; + $halign = 'left'; + } + // If the user has manually specified an hor. align + // then we override the automatic settings with this + // specifed setting. Since default is 'left' we compare + // with that. (This means a manually set 'left' align + // will have no effect.) + if( $this->title->halign != 'left' ) { + $halign = $this->title->halign; + } + if( $this->title_adjust == 'high' ) { + $this->title->SetPos($x,$this->img->top_margin,$halign,'top'); + } + elseif($this->title_adjust=='middle' || $this->title_adjust=='center') { + $this->title->SetPos($x,($this->img->height-$this->img->top_margin-$this->img->bottom_margin)/2+$this->img->top_margin,$halign,"center"); + } + elseif($this->title_adjust=='low') { + $this->title->SetPos($x,$this->img->height-$this->img->bottom_margin,$halign,'bottom'); + } + else { + JpGraphError::RaiseL(25061,$this->title_adjust);//('Unknown alignment specified for Y-axis title. ('.$this->title_adjust.')'); + } + } + $this->scale->ticks->Stroke($this->img,$this->scale,$pos); + if( $aStrokeLabels ) { + if( !$this->hide_labels ) { + $this->StrokeLabels($pos); + } + $this->title->Stroke($this->img); + } } -//--------------- -// PRIVATE METHODS + //--------------- + // PRIVATE METHODS // Draw all the tick labels on major tick marks function StrokeLabels($aPos,$aMinor=false,$aAbsLabel=false) { - $this->img->SetColor($this->label_color); - $this->img->SetFont($this->font_family,$this->font_style,$this->font_size); - $yoff=$this->img->GetFontHeight()/2; + if( is_array($this->label_color) && count($this->label_color) > 3 ) { + $this->ticks_label_colors = $this->label_color; + $this->img->SetColor($this->label_color[0]); + } + else { + $this->img->SetColor($this->label_color); + } + $this->img->SetFont($this->font_family,$this->font_style,$this->font_size); + $yoff=$this->img->GetFontHeight()/2; - // Only draw labels at major tick marks - $nbr = count($this->scale->ticks->maj_ticks_label); + // Only draw labels at major tick marks + $nbr = count($this->scale->ticks->maj_ticks_label); - // We have the option to not-display the very first mark - // (Usefull when the first label might interfere with another - // axis.) - $i = $this->show_first_label ? 0 : 1 ; - if( !$this->show_last_label ) --$nbr; - // Now run through all labels making sure we don't overshoot the end - // of the scale. - $ncolor=0; - if( isset($this->ticks_label_colors) ) - $ncolor=count($this->ticks_label_colors); - while( $i<$nbr ) { - // $tpos holds the absolute text position for the label - $tpos=$this->scale->ticks->maj_ticklabels_pos[$i]; + // We have the option to not-display the very first mark + // (Usefull when the first label might interfere with another + // axis.) + $i = $this->show_first_label ? 0 : 1 ; + if( !$this->show_last_label ) { + --$nbr; + } + // Now run through all labels making sure we don't overshoot the end + // of the scale. + $ncolor=0; + if( isset($this->ticks_label_colors) ) { + $ncolor=count($this->ticks_label_colors); + } + while( $i < $nbr ) { + // $tpos holds the absolute text position for the label + $tpos=$this->scale->ticks->maj_ticklabels_pos[$i]; - // Note. the $limit is only used for the x axis since we - // might otherwise overshoot if the scale has been centered - // This is due to us "loosing" the last tick mark if we center. - if( $this->scale->type=="x" && $tpos > $this->img->width-$this->img->right_margin+1 ) { - return; - } - // we only draw every $label_step label - if( ($i % $this->label_step)==0 ) { + // Note. the $limit is only used for the x axis since we + // might otherwise overshoot if the scale has been centered + // This is due to us "loosing" the last tick mark if we center. + if( $this->scale->type == 'x' && $tpos > $this->img->width-$this->img->right_margin+1 ) { + return; + } + // we only draw every $label_step label + if( ($i % $this->label_step)==0 ) { - // Set specific label color if specified - if( $ncolor > 0 ) - $this->img->SetColor($this->ticks_label_colors[$i % $ncolor]); - - // If the label has been specified use that and in other case - // just label the mark with the actual scale value - $m=$this->scale->ticks->GetMajor(); - - // ticks_label has an entry for each data point and is the array - // that holds the labels set by the user. If the user hasn't - // specified any values we use whats in the automatically asigned - // labels in the maj_ticks_label - if( isset($this->ticks_label[$i*$m]) ) - $label=$this->ticks_label[$i*$m]; - else { - if( $aAbsLabel ) - $label=abs($this->scale->ticks->maj_ticks_label[$i]); - else - $label=$this->scale->ticks->maj_ticks_label[$i]; - if( $this->scale->textscale && $this->scale->ticks->label_formfunc == '' ) { - ++$label; - } - } - - if( $this->scale->type == "x" ) { - if( $this->labelPos == SIDE_DOWN ) { - if( $this->label_angle==0 || $this->label_angle==90 ) { - if( $this->label_halign=='' && $this->label_valign=='') - $this->img->SetTextAlign('center','top'); - else - $this->img->SetTextAlign($this->label_halign,$this->label_valign); - - } - else { - if( $this->label_halign=='' && $this->label_valign=='') - $this->img->SetTextAlign("right","top"); - else - $this->img->SetTextAlign($this->label_halign,$this->label_valign); - } - $this->img->StrokeText($tpos,$aPos+$this->tick_label_margin+1,$label, - $this->label_angle,$this->label_para_align); - } - else { - if( $this->label_angle==0 || $this->label_angle==90 ) { - if( $this->label_halign=='' && $this->label_valign=='') - $this->img->SetTextAlign("center","bottom"); - else - $this->img->SetTextAlign($this->label_halign,$this->label_valign); - } - else { - if( $this->label_halign=='' && $this->label_valign=='') - $this->img->SetTextAlign("right","bottom"); - else - $this->img->SetTextAlign($this->label_halign,$this->label_valign); - } - $this->img->StrokeText($tpos,$aPos-$this->tick_label_margin-1,$label, - $this->label_angle,$this->label_para_align); - } - } - else { - // scale->type == "y" - //if( $this->label_angle!=0 ) - //JpGraphError::Raise(" Labels at an angle are not supported on Y-axis"); - if( $this->labelPos == SIDE_LEFT ) { // To the left of y-axis - if( $this->label_halign=='' && $this->label_valign=='') - $this->img->SetTextAlign("right","center"); - else - $this->img->SetTextAlign($this->label_halign,$this->label_valign); - $this->img->StrokeText($aPos-$this->tick_label_margin,$tpos,$label,$this->label_angle,$this->label_para_align); - } - else { // To the right of the y-axis - if( $this->label_halign=='' && $this->label_valign=='') - $this->img->SetTextAlign("left","center"); - else - $this->img->SetTextAlign($this->label_halign,$this->label_valign); - $this->img->StrokeText($aPos+$this->tick_label_margin,$tpos,$label,$this->label_angle,$this->label_para_align); - } - } - } - ++$i; - } - } + // Set specific label color if specified + if( $ncolor > 0 ) { + $this->img->SetColor($this->ticks_label_colors[$i % $ncolor]); + } + + // If the label has been specified use that and in other case + // just label the mark with the actual scale value + $m=$this->scale->ticks->GetMajor(); + + // ticks_label has an entry for each data point and is the array + // that holds the labels set by the user. If the user hasn't + // specified any values we use whats in the automatically asigned + // labels in the maj_ticks_label + if( isset($this->ticks_label[$i*$m]) ) { + $label=$this->ticks_label[$i*$m]; + } + else { + if( $aAbsLabel ) { + $label=abs($this->scale->ticks->maj_ticks_label[$i]); + } + else { + $label=$this->scale->ticks->maj_ticks_label[$i]; + } + if( $this->scale->textscale && $this->scale->ticks->label_formfunc == '' ) { + ++$label; + } + } + + if( $this->scale->type == "x" ) { + if( $this->labelPos == SIDE_DOWN ) { + if( $this->label_angle==0 || $this->label_angle==90 ) { + if( $this->label_halign=='' && $this->label_valign=='') { + $this->img->SetTextAlign('center','top'); + } + else { + $this->img->SetTextAlign($this->label_halign,$this->label_valign); + } + + } + else { + if( $this->label_halign=='' && $this->label_valign=='') { + $this->img->SetTextAlign("right","top"); + } + else { + $this->img->SetTextAlign($this->label_halign,$this->label_valign); + } + } + $this->img->StrokeText($tpos,$aPos+$this->tick_label_margin+1,$label, + $this->label_angle,$this->label_para_align); + } + else { + if( $this->label_angle==0 || $this->label_angle==90 ) { + if( $this->label_halign=='' && $this->label_valign=='') { + $this->img->SetTextAlign("center","bottom"); + } + else { + $this->img->SetTextAlign($this->label_halign,$this->label_valign); + } + } + else { + if( $this->label_halign=='' && $this->label_valign=='') { + $this->img->SetTextAlign("right","bottom"); + } + else { + $this->img->SetTextAlign($this->label_halign,$this->label_valign); + } + } + $this->img->StrokeText($tpos,$aPos-$this->tick_label_margin-1,$label, + $this->label_angle,$this->label_para_align); + } + } + else { + // scale->type == "y" + //if( $this->label_angle!=0 ) + //JpGraphError::Raise(" Labels at an angle are not supported on Y-axis"); + if( $this->labelPos == SIDE_LEFT ) { // To the left of y-axis + if( $this->label_halign=='' && $this->label_valign=='') { + $this->img->SetTextAlign("right","center"); + } + else { + $this->img->SetTextAlign($this->label_halign,$this->label_valign); + } + $this->img->StrokeText($aPos-$this->tick_label_margin,$tpos,$label,$this->label_angle,$this->label_para_align); + } + else { // To the right of the y-axis + if( $this->label_halign=='' && $this->label_valign=='') { + $this->img->SetTextAlign("left","center"); + } + else { + $this->img->SetTextAlign($this->label_halign,$this->label_valign); + } + $this->img->StrokeText($aPos+$this->tick_label_margin,$tpos,$label,$this->label_angle,$this->label_para_align); + } + } + } + ++$i; + } + } } @@ -4015,122 +3945,112 @@ class Ticks { public $label_dateformatstr=''; public $direction=1; // Should ticks be in(=1) the plot area or outside (=-1) public $supress_last=false,$supress_tickmarks=false,$supress_minor_tickmarks=false; - public $maj_ticks_pos = array(), $maj_ticklabels_pos = array(), - $ticks_pos = array(), $maj_ticks_label = array(); + public $maj_ticks_pos = array(), $maj_ticklabels_pos = array(), + $ticks_pos = array(), $maj_ticks_label = array(); public $precision; protected $minor_abs_size=3, $major_abs_size=5; protected $scale; protected $is_set=false; protected $supress_zerolabel=false,$supress_first=false; - protected $mincolor="",$majcolor=""; + protected $mincolor='',$majcolor=''; protected $weight=1; protected $label_usedateformat=FALSE; -//--------------- -// CONSTRUCTOR - function Ticks($aScale) { - $this->scale=$aScale; - $this->precision = -1; + function __construct($aScale) { + $this->scale=$aScale; + $this->precision = -1; } -//--------------- -// PUBLIC METHODS // Set format string for automatic labels function SetLabelFormat($aFormatString,$aDate=FALSE) { - $this->label_formatstr=$aFormatString; - $this->label_usedateformat=$aDate; + $this->label_formatstr=$aFormatString; + $this->label_usedateformat=$aDate; } - + function SetLabelDateFormat($aFormatString) { - $this->label_dateformatstr=$aFormatString; + $this->label_dateformatstr=$aFormatString; } - + function SetFormatCallback($aCallbackFuncName) { - $this->label_formfunc = $aCallbackFuncName; + $this->label_formfunc = $aCallbackFuncName; } - + // Don't display the first zero label function SupressZeroLabel($aFlag=true) { - $this->supress_zerolabel=$aFlag; + $this->supress_zerolabel=$aFlag; } - + // Don't display minor tick marks function SupressMinorTickMarks($aHide=true) { - $this->supress_minor_tickmarks=$aHide; + $this->supress_minor_tickmarks=$aHide; } - + // Don't display major tick marks function SupressTickMarks($aHide=true) { - $this->supress_tickmarks=$aHide; + $this->supress_tickmarks=$aHide; } - + // Hide the first tick mark function SupressFirst($aHide=true) { - $this->supress_first=$aHide; + $this->supress_first=$aHide; } - + // Hide the last tick mark function SupressLast($aHide=true) { - $this->supress_last=$aHide; + $this->supress_last=$aHide; } // Size (in pixels) of minor tick marks function GetMinTickAbsSize() { - return $this->minor_abs_size; + return $this->minor_abs_size; } - + // Size (in pixels) of major tick marks function GetMajTickAbsSize() { - return $this->major_abs_size; + return $this->major_abs_size; } - + function SetSize($aMajSize,$aMinSize=3) { - $this->major_abs_size = $aMajSize; - $this->minor_abs_size = $aMinSize; + $this->major_abs_size = $aMajSize; + $this->minor_abs_size = $aMinSize; } // Have the ticks been specified function IsSpecified() { - return $this->is_set; - } - - // Specify number of decimals in automatic labels - // Deprecated from 1.4. Use SetFormatString() instead - function SetPrecision($aPrecision) { - if( ERR_DEPRECATED ) - JpGraphError::RaiseL(25063);//('Ticks::SetPrecision() is deprecated. Use Ticks::SetLabelFormat() (or Ticks::SetFormatCallback()) instead'); - $this->precision=$aPrecision; + return $this->is_set; } function SetSide($aSide) { - $this->direction=$aSide; + $this->direction=$aSide; } - + // Which side of the axis should the ticks be on function SetDirection($aSide=SIDE_RIGHT) { - $this->direction=$aSide; + $this->direction=$aSide; } - + // Set colors for major and minor tick marks - function SetMarkColor($aMajorColor,$aMinorColor="") { - $this->SetColor($aMajorColor,$aMinorColor); + function SetMarkColor($aMajorColor,$aMinorColor='') { + $this->SetColor($aMajorColor,$aMinorColor); } - - function SetColor($aMajorColor,$aMinorColor="") { - $this->majcolor=$aMajorColor; - - // If not specified use same as major - if( $aMinorColor=="" ) - $this->mincolor=$aMajorColor; - else - $this->mincolor=$aMinorColor; + + function SetColor($aMajorColor,$aMinorColor='') { + $this->majcolor=$aMajorColor; + + // If not specified use same as major + if( $aMinorColor == '' ) { + $this->mincolor=$aMajorColor; + } + else { + $this->mincolor=$aMinorColor; + } } - + function SetWeight($aWeight) { - $this->weight=$aWeight; + $this->weight=$aWeight; } - + } // Class //=================================================== @@ -4146,349 +4066,366 @@ class LinearTicks extends Ticks { private $iManualTickPos = NULL, $iManualMinTickPos = NULL, $iManualTickLabels = NULL; private $iAdjustForDST = false; // If a date falls within the DST period add one hour to the diaplyed time -//--------------- -// CONSTRUCTOR - function LinearTicks() { - $this->precision = -1; + function __construct() { + $this->precision = -1; } -//--------------- -// PUBLIC METHODS - - // Return major step size in world coordinates function GetMajor() { - return $this->major_step; + return $this->major_step; } - + // Return minor step size in world coordinates function GetMinor() { - return $this->minor_step; + return $this->minor_step; } - + // Set Minor and Major ticks (in world coordinates) function Set($aMajStep,$aMinStep=false) { - if( $aMinStep==false ) - $aMinStep=$aMajStep; - - if( $aMajStep <= 0 || $aMinStep <= 0 ) { - JpGraphError::RaiseL(25064); -//(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem."); - } - - $this->major_step=$aMajStep; - $this->minor_step=$aMinStep; - $this->is_set = true; + if( $aMinStep==false ) { + $aMinStep=$aMajStep; + } + + if( $aMajStep <= 0 || $aMinStep <= 0 ) { + JpGraphError::RaiseL(25064); + //(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem."); + } + + $this->major_step=$aMajStep; + $this->minor_step=$aMinStep; + $this->is_set = true; } function SetMajTickPositions($aMajPos,$aLabels=NULL) { - $this->SetTickPositions($aMajPos,NULL,$aLabels); + $this->SetTickPositions($aMajPos,NULL,$aLabels); } function SetTickPositions($aMajPos,$aMinPos=NULL,$aLabels=NULL) { - if( !is_array($aMajPos) || ($aMinPos!==NULL && !is_array($aMinPos)) ) { - JpGraphError::RaiseL(25065);//('Tick positions must be specifued as an array()'); - return; - } - $n=count($aMajPos); - if( is_array($aLabels) && (count($aLabels) != $n) ) { - JpGraphError::RaiseL(25066);//('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.'); - return; - } - $this->iManualTickPos = $aMajPos; - $this->iManualMinTickPos = $aMinPos; - $this->iManualTickLabels = $aLabels; + if( !is_array($aMajPos) || ($aMinPos!==NULL && !is_array($aMinPos)) ) { + JpGraphError::RaiseL(25065);//('Tick positions must be specifued as an array()'); + return; + } + $n=count($aMajPos); + if( is_array($aLabels) && (count($aLabels) != $n) ) { + JpGraphError::RaiseL(25066);//('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.'); + } + $this->iManualTickPos = $aMajPos; + $this->iManualMinTickPos = $aMinPos; + $this->iManualTickLabels = $aLabels; } - // Specify all the tick positions manually and possible also the exact labels - function _doManualTickPos($aScale) { - $n=count($this->iManualTickPos); - $m=count($this->iManualMinTickPos); - $doLbl=count($this->iManualTickLabels) > 0; + // Specify all the tick positions manually and possible also the exact labels + function _doManualTickPos($aScale) { + $n=count($this->iManualTickPos); + $m=count($this->iManualMinTickPos); + $doLbl=count($this->iManualTickLabels) > 0; - $this->maj_ticks_pos = array(); - $this->maj_ticklabels_pos = array(); - $this->ticks_pos = array(); + $this->maj_ticks_pos = array(); + $this->maj_ticklabels_pos = array(); + $this->ticks_pos = array(); - // Now loop through the supplied positions and translate them to screen coordinates - // and store them in the maj_label_positions - $minScale = $aScale->scale[0]; - $maxScale = $aScale->scale[1]; - $j=0; - for($i=0; $i < $n ; ++$i ) { - // First make sure that the first tick is not lower than the lower scale value - if( !isset($this->iManualTickPos[$i]) || - $this->iManualTickPos[$i] < $minScale || $this->iManualTickPos[$i] > $maxScale) { - continue; - } + // Now loop through the supplied positions and translate them to screen coordinates + // and store them in the maj_label_positions + $minScale = $aScale->scale[0]; + $maxScale = $aScale->scale[1]; + $j=0; + for($i=0; $i < $n ; ++$i ) { + // First make sure that the first tick is not lower than the lower scale value + if( !isset($this->iManualTickPos[$i]) || $this->iManualTickPos[$i] < $minScale || $this->iManualTickPos[$i] > $maxScale) { + continue; + } + $this->maj_ticks_pos[$j] = $aScale->Translate($this->iManualTickPos[$i]); + $this->maj_ticklabels_pos[$j] = $this->maj_ticks_pos[$j]; - $this->maj_ticks_pos[$j] = $aScale->Translate($this->iManualTickPos[$i]); - $this->maj_ticklabels_pos[$j] = $this->maj_ticks_pos[$j]; + // Set the minor tick marks the same as major if not specified + if( $m <= 0 ) { + $this->ticks_pos[$j] = $this->maj_ticks_pos[$j]; + } + if( $doLbl ) { + $this->maj_ticks_label[$j] = $this->iManualTickLabels[$i]; + } + else { + $this->maj_ticks_label[$j]=$this->_doLabelFormat($this->iManualTickPos[$i],$i,$n); + } + ++$j; + } - // Set the minor tick marks the same as major if not specified - if( $m <= 0 ) { - $this->ticks_pos[$j] = $this->maj_ticks_pos[$j]; - } + // Some sanity check + if( count($this->maj_ticks_pos) < 2 ) { + JpGraphError::RaiseL(25067);//('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tickl marks.'); + } - if( $doLbl ) { - $this->maj_ticks_label[$j] = $this->iManualTickLabels[$i]; - } - else { - $this->maj_ticks_label[$j]=$this->_doLabelFormat($this->iManualTickPos[$i],$i,$n); - } - ++$j; - } - - // Some sanity check - if( count($this->maj_ticks_pos) < 2 ) { - JpGraphError::RaiseL(25067);//('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tickl marks.'); - } - - // Setup the minor tick marks - $j=0; - for($i=0; $i < $m; ++$i ) { - if( empty($this->iManualMinTickPos[$i]) || - $this->iManualMinTickPos[$i] < $minScale || $this->iManualMinTickPos[$i] > $maxScale) - continue; - $this->ticks_pos[$j] = $aScale->Translate($this->iManualMinTickPos[$i]); - ++$j; - } + // Setup the minor tick marks + $j=0; + for($i=0; $i < $m; ++$i ) { + if( empty($this->iManualMinTickPos[$i]) || $this->iManualMinTickPos[$i] < $minScale || $this->iManualMinTickPos[$i] > $maxScale) { + continue; + } + $this->ticks_pos[$j] = $aScale->Translate($this->iManualMinTickPos[$i]); + ++$j; + } } function _doAutoTickPos($aScale) { - $maj_step_abs = $aScale->scale_factor*$this->major_step; - $min_step_abs = $aScale->scale_factor*$this->minor_step; + $maj_step_abs = $aScale->scale_factor*$this->major_step; + $min_step_abs = $aScale->scale_factor*$this->minor_step; - if( $min_step_abs==0 || $maj_step_abs==0 ) { - JpGraphError::RaiseL(25068);//("A plot has an illegal scale. This could for example be that you are trying to use text autoscaling to draw a line plot with only one point or that the plot area is too small. It could also be that no input data value is numeric (perhaps only '-' or 'x')"); - } - // We need to make this an int since comparing it below - // with the result from round() can give wrong result, such that - // (40 < 40) == TRUE !!! - $limit = (int)$aScale->scale_abs[1]; + if( $min_step_abs==0 || $maj_step_abs==0 ) { + JpGraphError::RaiseL(25068);//("A plot has an illegal scale. This could for example be that you are trying to use text autoscaling to draw a line plot with only one point or that the plot area is too small. It could also be that no input data value is numeric (perhaps only '-' or 'x')"); + } + // We need to make this an int since comparing it below + // with the result from round() can give wrong result, such that + // (40 < 40) == TRUE !!! + $limit = (int)$aScale->scale_abs[1]; - if( $aScale->textscale ) { - // This can only be true for a X-scale (horizontal) - // Define ticks for a text scale. This is slightly different from a - // normal linear type of scale since the position might be adjusted - // and the labels start at on - $label = (float)$aScale->GetMinVal()+$this->text_label_start+$this->label_offset; - $start_abs=$aScale->scale_factor*$this->text_label_start; - $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1; + if( $aScale->textscale ) { + // This can only be true for a X-scale (horizontal) + // Define ticks for a text scale. This is slightly different from a + // normal linear type of scale since the position might be adjusted + // and the labels start at on + $label = (float)$aScale->GetMinVal()+$this->text_label_start+$this->label_offset; + $start_abs=$aScale->scale_factor*$this->text_label_start; + $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1; - $x = $aScale->scale_abs[0]+$start_abs+$this->xlabel_offset*$min_step_abs; - for( $i=0; $label <= $aScale->GetMaxVal()+$this->label_offset; ++$i ) { - // Apply format to label - $this->maj_ticks_label[$i]=$this->_doLabelFormat($label,$i,$nbrmajticks); - $label+=$this->major_step; + $x = $aScale->scale_abs[0]+$start_abs+$this->xlabel_offset*$min_step_abs; + for( $i=0; $label <= $aScale->GetMaxVal()+$this->label_offset; ++$i ) { + // Apply format to label + $this->maj_ticks_label[$i]=$this->_doLabelFormat($label,$i,$nbrmajticks); + $label+=$this->major_step; - // The x-position of the tick marks can be different from the labels. - // Note that we record the tick position (not the label) so that the grid - // happen upon tick marks and not labels. - $xtick=$aScale->scale_abs[0]+$start_abs+$this->xtick_offset*$min_step_abs+$i*$maj_step_abs; - $this->maj_ticks_pos[$i]=$xtick; - $this->maj_ticklabels_pos[$i] = round($x); - $x += $maj_step_abs; - } - } - else { - $label = $aScale->GetMinVal(); - $abs_pos = $aScale->scale_abs[0]; - $j=0; $i=0; - $step = round($maj_step_abs/$min_step_abs); - if( $aScale->type == "x" ) { - // For a normal linear type of scale the major ticks will always be multiples - // of the minor ticks. In order to avoid any rounding issues the major ticks are - // defined as every "step" minor ticks and not calculated separately - $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1; - while( round($abs_pos) <= $limit ) { - $this->ticks_pos[] = round($abs_pos); - $this->ticks_label[] = $label; - if( $step== 0 || $i % $step == 0 && $j < $nbrmajticks ) { - $this->maj_ticks_pos[$j] = round($abs_pos); - $this->maj_ticklabels_pos[$j] = round($abs_pos); - $this->maj_ticks_label[$j]=$this->_doLabelFormat($label,$j,$nbrmajticks); - ++$j; - } - ++$i; - $abs_pos += $min_step_abs; - $label+=$this->minor_step; - } - } - elseif( $aScale->type == "y" ) { - $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal())/$this->major_step)+1; - while( round($abs_pos) >= $limit ) { - $this->ticks_pos[$i] = round($abs_pos); - $this->ticks_label[$i]=$label; - if( $step== 0 || $i % $step == 0 && $j < $nbrmajticks) { - $this->maj_ticks_pos[$j] = round($abs_pos); - $this->maj_ticklabels_pos[$j] = round($abs_pos); - $this->maj_ticks_label[$j]=$this->_doLabelFormat($label,$j,$nbrmajticks); - ++$j; - } - ++$i; - $abs_pos += $min_step_abs; - $label += $this->minor_step; - } - } - } + // The x-position of the tick marks can be different from the labels. + // Note that we record the tick position (not the label) so that the grid + // happen upon tick marks and not labels. + $xtick=$aScale->scale_abs[0]+$start_abs+$this->xtick_offset*$min_step_abs+$i*$maj_step_abs; + $this->maj_ticks_pos[$i]=$xtick; + $this->maj_ticklabels_pos[$i] = round($x); + $x += $maj_step_abs; + } + } + else { + $label = $aScale->GetMinVal(); + $abs_pos = $aScale->scale_abs[0]; + $j=0; $i=0; + $step = round($maj_step_abs/$min_step_abs); + if( $aScale->type == "x" ) { + // For a normal linear type of scale the major ticks will always be multiples + // of the minor ticks. In order to avoid any rounding issues the major ticks are + // defined as every "step" minor ticks and not calculated separately + $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1; + while( round($abs_pos) <= $limit ) { + $this->ticks_pos[] = round($abs_pos); + $this->ticks_label[] = $label; + if( $step== 0 || $i % $step == 0 && $j < $nbrmajticks ) { + $this->maj_ticks_pos[$j] = round($abs_pos); + $this->maj_ticklabels_pos[$j] = round($abs_pos); + $this->maj_ticks_label[$j]=$this->_doLabelFormat($label,$j,$nbrmajticks); + ++$j; + } + ++$i; + $abs_pos += $min_step_abs; + $label+=$this->minor_step; + } + } + elseif( $aScale->type == "y" ) { + $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal())/$this->major_step)+1; + while( round($abs_pos) >= $limit ) { + $this->ticks_pos[$i] = round($abs_pos); + $this->ticks_label[$i]=$label; + if( $step== 0 || $i % $step == 0 && $j < $nbrmajticks) { + $this->maj_ticks_pos[$j] = round($abs_pos); + $this->maj_ticklabels_pos[$j] = round($abs_pos); + $this->maj_ticks_label[$j]=$this->_doLabelFormat($label,$j,$nbrmajticks); + ++$j; + } + ++$i; + $abs_pos += $min_step_abs; + $label += $this->minor_step; + } + } + } } function AdjustForDST($aFlg=true) { - $this->iAdjustForDST = $aFlg; + $this->iAdjustForDST = $aFlg; } function _doLabelFormat($aVal,$aIdx,$aNbrTicks) { - // If precision hasn't been specified set it to a sensible value - if( $this->precision==-1 ) { - $t = log10($this->minor_step); - if( $t > 0 ) - $precision = 0; - else - $precision = -floor($t); - } - else - $precision = $this->precision; + // If precision hasn't been specified set it to a sensible value + if( $this->precision==-1 ) { + $t = log10($this->minor_step); + if( $t > 0 ) { + $precision = 0; + } + else { + $precision = -floor($t); + } + } + else { + $precision = $this->precision; + } - if( $this->label_formfunc != '' ) { - $f=$this->label_formfunc; - $l = call_user_func($f,$aVal); - } - elseif( $this->label_formatstr != '' || $this->label_dateformatstr != '' ) { - if( $this->label_usedateformat ) { - // Adjust the value to take daylight savings into account - if (date("I",$aVal)==1 && $this->iAdjustForDST ) // DST - $aVal+=3600; + if( $this->label_formfunc != '' ) { + $f=$this->label_formfunc; + if( $this->label_formatstr == '' ) { + $l = call_user_func($f,$aVal); + } + else { + $l = sprintf($this->label_formatstr, call_user_func($f,$aVal)); + } + } + elseif( $this->label_formatstr != '' || $this->label_dateformatstr != '' ) { + if( $this->label_usedateformat ) { + // Adjust the value to take daylight savings into account + if (date("I",$aVal)==1 && $this->iAdjustForDST ) { + // DST + $aVal+=3600; + } - $l = date($this->label_formatstr,$aVal); - if( $this->label_formatstr == 'W' ) { - // If we use week formatting then add a single 'w' in front of the - // week number to differentiate it from dates - $l = 'w'.$l; - } - } - else { - if( $this->label_dateformatstr !== '' ) { - // Adjust the value to take daylight savings into account - if (date("I",$aVal)==1 && $this->iAdjustForDST ) // DST - $aVal+=3600; + $l = date($this->label_formatstr,$aVal); + if( $this->label_formatstr == 'W' ) { + // If we use week formatting then add a single 'w' in front of the + // week number to differentiate it from dates + $l = 'w'.$l; + } + } + else { + if( $this->label_dateformatstr !== '' ) { + // Adjust the value to take daylight savings into account + if (date("I",$aVal)==1 && $this->iAdjustForDST ) { + // DST + $aVal+=3600; + } - $l = date($this->label_dateformatstr,$aVal); - if( $this->label_formatstr == 'W' ) { - // If we use week formatting then add a single 'w' in front of the - // week number to differentiate it from dates - $l = 'w'.$l; - } - } - else - $l = sprintf($this->label_formatstr,$aVal); - } - } - else { - $l = sprintf('%01.'.$precision.'f',round($aVal,$precision)); - } - - if( ($this->supress_zerolabel && $l==0) || ($this->supress_first && $aIdx==0) || - ($this->supress_last && $aIdx==$aNbrTicks-1) ) { - $l=''; - } - return $l; + $l = date($this->label_dateformatstr,$aVal); + if( $this->label_formatstr == 'W' ) { + // If we use week formatting then add a single 'w' in front of the + // week number to differentiate it from dates + $l = 'w'.$l; + } + } + else { + $l = sprintf($this->label_formatstr,$aVal); + } + } + } + else { + $l = sprintf('%01.'.$precision.'f',round($aVal,$precision)); + } + + if( ($this->supress_zerolabel && $l==0) || ($this->supress_first && $aIdx==0) || ($this->supress_last && $aIdx==$aNbrTicks-1) ) { + $l=''; + } + return $l; } // Stroke ticks on either X or Y axis function _StrokeTicks($aImg,$aScale,$aPos) { - $hor = $aScale->type == 'x'; - $aImg->SetLineWeight($this->weight); + $hor = $aScale->type == 'x'; + $aImg->SetLineWeight($this->weight); - // We need to make this an int since comparing it below - // with the result from round() can give wrong result, such that - // (40 < 40) == TRUE !!! - $limit = (int)$aScale->scale_abs[1]; - - // A text scale doesn't have any minor ticks - if( !$aScale->textscale ) { - // Stroke minor ticks - $yu = $aPos - $this->direction*$this->GetMinTickAbsSize(); - $xr = $aPos + $this->direction*$this->GetMinTickAbsSize(); - $n = count($this->ticks_pos); - for($i=0; $i < $n; ++$i ) { - if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) { - if( $this->mincolor!="" ) $aImg->PushColor($this->mincolor); - if( $hor ) { - //if( $this->ticks_pos[$i] <= $limit ) - $aImg->Line($this->ticks_pos[$i],$aPos,$this->ticks_pos[$i],$yu); - } - else { - //if( $this->ticks_pos[$i] >= $limit ) - $aImg->Line($aPos,$this->ticks_pos[$i],$xr,$this->ticks_pos[$i]); - } - if( $this->mincolor!="" ) $aImg->PopColor(); - } - } - } + // We need to make this an int since comparing it below + // with the result from round() can give wrong result, such that + // (40 < 40) == TRUE !!! + $limit = (int)$aScale->scale_abs[1]; + + // A text scale doesn't have any minor ticks + if( !$aScale->textscale ) { + // Stroke minor ticks + $yu = $aPos - $this->direction*$this->GetMinTickAbsSize(); + $xr = $aPos + $this->direction*$this->GetMinTickAbsSize(); + $n = count($this->ticks_pos); + for($i=0; $i < $n; ++$i ) { + if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) { + if( $this->mincolor != '') { + $aImg->PushColor($this->mincolor); + } + if( $hor ) { + //if( $this->ticks_pos[$i] <= $limit ) + $aImg->Line($this->ticks_pos[$i],$aPos,$this->ticks_pos[$i],$yu); + } + else { + //if( $this->ticks_pos[$i] >= $limit ) + $aImg->Line($aPos,$this->ticks_pos[$i],$xr,$this->ticks_pos[$i]); + } + if( $this->mincolor != '' ) { + $aImg->PopColor(); + } + } + } + } + + // Stroke major ticks + $yu = $aPos - $this->direction*$this->GetMajTickAbsSize(); + $xr = $aPos + $this->direction*$this->GetMajTickAbsSize(); + $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1; + $n = count($this->maj_ticks_pos); + for($i=0; $i < $n ; ++$i ) { + if(!($this->xtick_offset > 0 && $i==$nbrmajticks-1) && !$this->supress_tickmarks) { + if( $this->majcolor != '') { + $aImg->PushColor($this->majcolor); + } + if( $hor ) { + //if( $this->maj_ticks_pos[$i] <= $limit ) + $aImg->Line($this->maj_ticks_pos[$i],$aPos,$this->maj_ticks_pos[$i],$yu); + } + else { + //if( $this->maj_ticks_pos[$i] >= $limit ) + $aImg->Line($aPos,$this->maj_ticks_pos[$i],$xr,$this->maj_ticks_pos[$i]); + } + if( $this->majcolor != '') { + $aImg->PopColor(); + } + } + } - // Stroke major ticks - $yu = $aPos - $this->direction*$this->GetMajTickAbsSize(); - $xr = $aPos + $this->direction*$this->GetMajTickAbsSize(); - $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1; - $n = count($this->maj_ticks_pos); - for($i=0; $i < $n ; ++$i ) { - if(!($this->xtick_offset > 0 && $i==$nbrmajticks-1) && !$this->supress_tickmarks) { - if( $this->majcolor!="" ) $aImg->PushColor($this->majcolor); - if( $hor ) { - //if( $this->maj_ticks_pos[$i] <= $limit ) - $aImg->Line($this->maj_ticks_pos[$i],$aPos,$this->maj_ticks_pos[$i],$yu); - } - else { - //if( $this->maj_ticks_pos[$i] >= $limit ) - $aImg->Line($aPos,$this->maj_ticks_pos[$i],$xr,$this->maj_ticks_pos[$i]); - } - if( $this->majcolor!="" ) $aImg->PopColor(); - } - } - } // Draw linear ticks function Stroke($aImg,$aScale,$aPos) { - if( $this->iManualTickPos != NULL ) - $this->_doManualTickPos($aScale); - else - $this->_doAutoTickPos($aScale); - $this->_StrokeTicks($aImg,$aScale,$aPos, $aScale->type == 'x' ); + if( $this->iManualTickPos != NULL ) { + $this->_doManualTickPos($aScale); + } + else { + $this->_doAutoTickPos($aScale); + } + $this->_StrokeTicks($aImg,$aScale,$aPos, $aScale->type == 'x' ); } -//--------------- -// PRIVATE METHODS + //--------------- + // PRIVATE METHODS // Spoecify the offset of the displayed tick mark with the tick "space" - // Legal values for $o is [0,1] used to adjust where the tick marks and label + // Legal values for $o is [0,1] used to adjust where the tick marks and label // should be positioned within the major tick-size // $lo specifies the label offset and $to specifies the tick offset // this comes in handy for example in bar graphs where we wont no offset for the // tick but have the labels displayed halfway under the bars. function SetXLabelOffset($aLabelOff,$aTickOff=-1) { - $this->xlabel_offset=$aLabelOff; - if( $aTickOff==-1 ) // Same as label offset - $this->xtick_offset=$aLabelOff; - else - $this->xtick_offset=$aTickOff; - if( $aLabelOff>0 ) - $this->SupressLast(); // The last tick wont fit + $this->xlabel_offset=$aLabelOff; + if( $aTickOff==-1 ) { + // Same as label offset + $this->xtick_offset=$aLabelOff; + } + else { + $this->xtick_offset=$aTickOff; + } + if( $aLabelOff>0 ) { + $this->SupressLast(); // The last tick wont fit + } } // Which tick label should we start with? function SetTextLabelStart($aTextLabelOff) { - $this->text_label_start=$aTextLabelOff; + $this->text_label_start=$aTextLabelOff; } - + } // Class //=================================================== // CLASS LinearScale -// Description: Handle linear scaling between screen and world +// Description: Handle linear scaling between screen and world //=================================================== class LinearScale { public $textscale=false; // Just a flag to let the Plot class find out if @@ -4507,1476 +4444,546 @@ class LinearScale { public $name = 'lin'; public $auto_ticks=false; // When using manual scale should the ticks be automatically set? public $world_abs_size; // Plot area size in pixels (Needed public in jpgraph_radar.php) - public $world_size; // Plot area size in world coordinates + public $world_size; // Plot area size in world coordinates public $intscale=false; // Restrict autoscale to integers protected $autoscale_min=false; // Forced minimum value, auto determine max protected $autoscale_max=false; // Forced maximum value, auto determine min private $gracetop=0,$gracebottom=0; -//--------------- -// CONSTRUCTOR - function LinearScale($aMin=0,$aMax=0,$aType="y") { - assert($aType=="x" || $aType=="y" ); - assert($aMin<=$aMax); - - $this->type=$aType; - $this->scale=array($aMin,$aMax); - $this->world_size=$aMax-$aMin; - $this->ticks = new LinearTicks(); + + function __construct($aMin=0,$aMax=0,$aType='y') { + assert($aType=='x' || $aType=='y' ); + assert($aMin<=$aMax); + + $this->type=$aType; + $this->scale=array($aMin,$aMax); + $this->world_size=$aMax-$aMin; + $this->ticks = new LinearTicks(); } -//--------------- -// PUBLIC METHODS // Check if scale is set or if we should autoscale // We should do this is either scale or ticks has not been set function IsSpecified() { - if( $this->GetMinVal()==$this->GetMaxVal() ) { // Scale not set - return false; - } - return true; + if( $this->GetMinVal()==$this->GetMaxVal() ) { // Scale not set + return false; + } + return true; } - - // Set the minimum data value when the autoscaling is used. + + // Set the minimum data value when the autoscaling is used. // Usefull if you want a fix minimum (like 0) but have an // automatic maximum function SetAutoMin($aMin) { - $this->autoscale_min=$aMin; + $this->autoscale_min=$aMin; } - // Set the minimum data value when the autoscaling is used. + // Set the minimum data value when the autoscaling is used. // Usefull if you want a fix minimum (like 0) but have an // automatic maximum function SetAutoMax($aMax) { - $this->autoscale_max=$aMax; + $this->autoscale_max=$aMax; } // If the user manually specifies a scale should the ticks // still be set automatically? function SetAutoTicks($aFlag=true) { - $this->auto_ticks = $aFlag; + $this->auto_ticks = $aFlag; } // Specify scale "grace" value (top and bottom) function SetGrace($aGraceTop,$aGraceBottom=0) { - if( $aGraceTop<0 || $aGraceBottom < 0 ) - JpGraphError::RaiseL(25069);//(" Grace must be larger then 0"); - $this->gracetop=$aGraceTop; - $this->gracebottom=$aGraceBottom; + if( $aGraceTop<0 || $aGraceBottom < 0 ) { + JpGraphError::RaiseL(25069);//(" Grace must be larger then 0"); + } + $this->gracetop=$aGraceTop; + $this->gracebottom=$aGraceBottom; } - + // Get the minimum value in the scale function GetMinVal() { - return $this->scale[0]; + return $this->scale[0]; } - + // get maximum value for scale function GetMaxVal() { - return $this->scale[1]; + return $this->scale[1]; } - - // Specify a new min/max value for sclae + + // Specify a new min/max value for sclae function Update($aImg,$aMin,$aMax) { - $this->scale=array($aMin,$aMax); - $this->world_size=$aMax-$aMin; - $this->InitConstants($aImg); + $this->scale=array($aMin,$aMax); + $this->world_size=$aMax-$aMin; + $this->InitConstants($aImg); } - + // Translate between world and screen function Translate($aCoord) { - if( !is_numeric($aCoord) ) { - if( $aCoord != '' && $aCoord != '-' && $aCoord != 'x' ) - JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.'); - return 0; - } - else { - return $this->off+($aCoord - $this->scale[0]) * $this->scale_factor; - } + if( !is_numeric($aCoord) ) { + if( $aCoord != '' && $aCoord != '-' && $aCoord != 'x' ) { + JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.'); + } + return 0; + } + else { + return round($this->off+($aCoord - $this->scale[0]) * $this->scale_factor); + } } - + // Relative translate (don't include offset) usefull when we just want // to know the relative position (in pixels) on the axis function RelTranslate($aCoord) { - if( !is_numeric($aCoord) ) { - if( $aCoord != '' && $aCoord != '-' && $aCoord != 'x' ) - JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.'); - return 0; - } - else { - return ($aCoord - $this->scale[0]) * $this->scale_factor; - } + if( !is_numeric($aCoord) ) { + if( $aCoord != '' && $aCoord != '-' && $aCoord != 'x' ) { + JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.'); + } + return 0; + } + else { + return ($aCoord - $this->scale[0]) * $this->scale_factor; + } } - + // Restrict autoscaling to only use integers function SetIntScale($aIntScale=true) { - $this->intscale=$aIntScale; + $this->intscale=$aIntScale; } - + // Calculate an integer autoscale function IntAutoScale($img,$min,$max,$maxsteps,$majend=true) { - // Make sure limits are integers - $min=floor($min); - $max=ceil($max); - if( abs($min-$max)==0 ) { - --$min; ++$max; - } - $maxsteps = floor($maxsteps); - - $gracetop=round(($this->gracetop/100.0)*abs($max-$min)); - $gracebottom=round(($this->gracebottom/100.0)*abs($max-$min)); - if( is_numeric($this->autoscale_min) ) { - $min = ceil($this->autoscale_min); - if( $min >= $max ) { - JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.'); - } - } + // Make sure limits are integers + $min=floor($min); + $max=ceil($max); + if( abs($min-$max)==0 ) { + --$min; ++$max; + } + $maxsteps = floor($maxsteps); - if( is_numeric($this->autoscale_max) ) { - $max = ceil($this->autoscale_max); - if( $min >= $max ) { - JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.'); - } - } + $gracetop=round(($this->gracetop/100.0)*abs($max-$min)); + $gracebottom=round(($this->gracebottom/100.0)*abs($max-$min)); + if( is_numeric($this->autoscale_min) ) { + $min = ceil($this->autoscale_min); + if( $min >= $max ) { + JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.'); + } + } - if( abs($min-$max ) == 0 ) { - ++$max; - --$min; - } - - $min -= $gracebottom; - $max += $gracetop; + if( is_numeric($this->autoscale_max) ) { + $max = ceil($this->autoscale_max); + if( $min >= $max ) { + JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.'); + } + } - // First get tickmarks as multiples of 1, 10, ... - if( $majend ) { - list($num1steps,$adj1min,$adj1max,$maj1step) = - $this->IntCalcTicks($maxsteps,$min,$max,1); - } - else { - $adj1min = $min; - $adj1max = $max; - list($num1steps,$maj1step) = - $this->IntCalcTicksFreeze($maxsteps,$min,$max,1); - } + if( abs($min-$max ) == 0 ) { + ++$max; + --$min; + } - if( abs($min-$max) > 2 ) { - // Then get tick marks as 2:s 2, 20, ... - if( $majend ) { - list($num2steps,$adj2min,$adj2max,$maj2step) = - $this->IntCalcTicks($maxsteps,$min,$max,5); - } - else { - $adj2min = $min; - $adj2max = $max; - list($num2steps,$maj2step) = - $this->IntCalcTicksFreeze($maxsteps,$min,$max,5); - } - } - else { - $num2steps = 10000; // Dummy high value so we don't choose this - } - - if( abs($min-$max) > 5 ) { - // Then get tickmarks as 5:s 5, 50, 500, ... - if( $majend ) { - list($num5steps,$adj5min,$adj5max,$maj5step) = - $this->IntCalcTicks($maxsteps,$min,$max,2); - } - else { - $adj5min = $min; - $adj5max = $max; - list($num5steps,$maj5step) = - $this->IntCalcTicksFreeze($maxsteps,$min,$max,2); - } - } - else { - $num5steps = 10000; // Dummy high value so we don't choose this - } - - // Check to see whichof 1:s, 2:s or 5:s fit better with - // the requested number of major ticks - $match1=abs($num1steps-$maxsteps); - $match2=abs($num2steps-$maxsteps); - if( !empty($maj5step) && $maj5step > 1 ) - $match5=abs($num5steps-$maxsteps); - else - $match5=10000; // Dummy high value - - // Compare these three values and see which is the closest match - // We use a 0.6 weight to gravitate towards multiple of 5:s - if( $match1 < $match2 ) { - if( $match1 < $match5 ) - $r=1; - else - $r=3; - } - else { - if( $match2 < $match5 ) - $r=2; - else - $r=3; - } - // Minsteps are always the same as maxsteps for integer scale - switch( $r ) { - case 1: - $this->ticks->Set($maj1step,$maj1step); - $this->Update($img,$adj1min,$adj1max); - break; - case 2: - $this->ticks->Set($maj2step,$maj2step); - $this->Update($img,$adj2min,$adj2max); - break; - case 3: - $this->ticks->Set($maj5step,$maj5step); - $this->Update($img,$adj5min,$adj5max); - break; - default: - JpGraphError::RaiseL(25073,$r);//('Internal error. Integer scale algorithm comparison out of bound (r=$r)'); - } + $min -= $gracebottom; + $max += $gracetop; + + // First get tickmarks as multiples of 1, 10, ... + if( $majend ) { + list($num1steps,$adj1min,$adj1max,$maj1step) = $this->IntCalcTicks($maxsteps,$min,$max,1); + } + else { + $adj1min = $min; + $adj1max = $max; + list($num1steps,$maj1step) = $this->IntCalcTicksFreeze($maxsteps,$min,$max,1); + } + + if( abs($min-$max) > 2 ) { + // Then get tick marks as 2:s 2, 20, ... + if( $majend ) { + list($num2steps,$adj2min,$adj2max,$maj2step) = $this->IntCalcTicks($maxsteps,$min,$max,5); + } + else { + $adj2min = $min; + $adj2max = $max; + list($num2steps,$maj2step) = $this->IntCalcTicksFreeze($maxsteps,$min,$max,5); + } + } + else { + $num2steps = 10000; // Dummy high value so we don't choose this + } + + if( abs($min-$max) > 5 ) { + // Then get tickmarks as 5:s 5, 50, 500, ... + if( $majend ) { + list($num5steps,$adj5min,$adj5max,$maj5step) = $this->IntCalcTicks($maxsteps,$min,$max,2); + } + else { + $adj5min = $min; + $adj5max = $max; + list($num5steps,$maj5step) = $this->IntCalcTicksFreeze($maxsteps,$min,$max,2); + } + } + else { + $num5steps = 10000; // Dummy high value so we don't choose this + } + + // Check to see whichof 1:s, 2:s or 5:s fit better with + // the requested number of major ticks + $match1=abs($num1steps-$maxsteps); + $match2=abs($num2steps-$maxsteps); + if( !empty($maj5step) && $maj5step > 1 ) { + $match5=abs($num5steps-$maxsteps); + } + else { + $match5=10000; // Dummy high value + } + + // Compare these three values and see which is the closest match + // We use a 0.6 weight to gravitate towards multiple of 5:s + if( $match1 < $match2 ) { + if( $match1 < $match5 ) $r=1; + else $r=3; + } + else { + if( $match2 < $match5 ) $r=2; + else $r=3; + } + // Minsteps are always the same as maxsteps for integer scale + switch( $r ) { + case 1: + $this->ticks->Set($maj1step,$maj1step); + $this->Update($img,$adj1min,$adj1max); + break; + case 2: + $this->ticks->Set($maj2step,$maj2step); + $this->Update($img,$adj2min,$adj2max); + break; + case 3: + $this->ticks->Set($maj5step,$maj5step); + $this->Update($img,$adj5min,$adj5max); + break; + default: + JpGraphError::RaiseL(25073,$r);//('Internal error. Integer scale algorithm comparison out of bound (r=$r)'); + } } - - + + // Calculate autoscale. Used if user hasn't given a scale and ticks // $maxsteps is the maximum number of major tickmarks allowed. function AutoScale($img,$min,$max,$maxsteps,$majend=true) { - if( $this->intscale ) { - $this->IntAutoScale($img,$min,$max,$maxsteps,$majend); - return; - } - if( abs($min-$max) < 0.00001 ) { - // We need some difference to be able to autoscale - // make it 5% above and 5% below value - if( $min==0 && $max==0 ) { // Special case - $min=-1; $max=1; - } - else { - $delta = (abs($max)+abs($min))*0.005; - $min -= $delta; - $max += $delta; - } - } - - $gracetop=($this->gracetop/100.0)*abs($max-$min); - $gracebottom=($this->gracebottom/100.0)*abs($max-$min); - if( is_numeric($this->autoscale_min) ) { - $min = $this->autoscale_min; - if( $min >= $max ) { - JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.'); - } - if( abs($min-$max ) < 0.00001 ) - $max *= 1.2; - } + if( $this->intscale ) { + $this->IntAutoScale($img,$min,$max,$maxsteps,$majend); + return; + } + if( abs($min-$max) < 0.00001 ) { + // We need some difference to be able to autoscale + // make it 5% above and 5% below value + if( $min==0 && $max==0 ) { // Special case + $min=-1; $max=1; + } + else { + $delta = (abs($max)+abs($min))*0.005; + $min -= $delta; + $max += $delta; + } + } - if( is_numeric($this->autoscale_max) ) { - $max = $this->autoscale_max; - if( $min >= $max ) { - JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.'); - } - if( abs($min-$max ) < 0.00001 ) - $min *= 0.8; - } + $gracetop=($this->gracetop/100.0)*abs($max-$min); + $gracebottom=($this->gracebottom/100.0)*abs($max-$min); + if( is_numeric($this->autoscale_min) ) { + $min = $this->autoscale_min; + if( $min >= $max ) { + JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.'); + } + if( abs($min-$max ) < 0.001 ) { + $max *= 1.2; + } + } - $min -= $gracebottom; - $max += $gracetop; + if( is_numeric($this->autoscale_max) ) { + $max = $this->autoscale_max; + if( $min >= $max ) { + JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.'); + } + if( abs($min-$max ) < 0.001 ) { + $min *= 0.8; + } + } + $min -= $gracebottom; + $max += $gracetop; - // First get tickmarks as multiples of 0.1, 1, 10, ... - if( $majend ) { - list($num1steps,$adj1min,$adj1max,$min1step,$maj1step) = - $this->CalcTicks($maxsteps,$min,$max,1,2); - } - else { - $adj1min=$min; - $adj1max=$max; - list($num1steps,$min1step,$maj1step) = - $this->CalcTicksFreeze($maxsteps,$min,$max,1,2,false); - } - - // Then get tick marks as 2:s 0.2, 2, 20, ... - if( $majend ) { - list($num2steps,$adj2min,$adj2max,$min2step,$maj2step) = - $this->CalcTicks($maxsteps,$min,$max,5,2); - } - else { - $adj2min=$min; - $adj2max=$max; - list($num2steps,$min2step,$maj2step) = - $this->CalcTicksFreeze($maxsteps,$min,$max,5,2,false); - } - - // Then get tickmarks as 5:s 0.05, 0.5, 5, 50, ... - if( $majend ) { - list($num5steps,$adj5min,$adj5max,$min5step,$maj5step) = - $this->CalcTicks($maxsteps,$min,$max,2,5); - } - else { - $adj5min=$min; - $adj5max=$max; - list($num5steps,$min5step,$maj5step) = - $this->CalcTicksFreeze($maxsteps,$min,$max,2,5,false); - } + // First get tickmarks as multiples of 0.1, 1, 10, ... + if( $majend ) { + list($num1steps,$adj1min,$adj1max,$min1step,$maj1step) = $this->CalcTicks($maxsteps,$min,$max,1,2); + } + else { + $adj1min=$min; + $adj1max=$max; + list($num1steps,$min1step,$maj1step) = $this->CalcTicksFreeze($maxsteps,$min,$max,1,2,false); + } - // Check to see whichof 1:s, 2:s or 5:s fit better with - // the requested number of major ticks - $match1=abs($num1steps-$maxsteps); - $match2=abs($num2steps-$maxsteps); - $match5=abs($num5steps-$maxsteps); - // Compare these three values and see which is the closest match - // We use a 0.8 weight to gravitate towards multiple of 5:s - $r=$this->MatchMin3($match1,$match2,$match5,0.8); - switch( $r ) { - case 1: - $this->Update($img,$adj1min,$adj1max); - $this->ticks->Set($maj1step,$min1step); - break; - case 2: - $this->Update($img,$adj2min,$adj2max); - $this->ticks->Set($maj2step,$min2step); - break; - case 3: - $this->Update($img,$adj5min,$adj5max); - $this->ticks->Set($maj5step,$min5step); - break; - } + // Then get tick marks as 2:s 0.2, 2, 20, ... + if( $majend ) { + list($num2steps,$adj2min,$adj2max,$min2step,$maj2step) = $this->CalcTicks($maxsteps,$min,$max,5,2); + } + else { + $adj2min=$min; + $adj2max=$max; + list($num2steps,$min2step,$maj2step) = $this->CalcTicksFreeze($maxsteps,$min,$max,5,2,false); + } + + // Then get tickmarks as 5:s 0.05, 0.5, 5, 50, ... + if( $majend ) { + list($num5steps,$adj5min,$adj5max,$min5step,$maj5step) = $this->CalcTicks($maxsteps,$min,$max,2,5); + } + else { + $adj5min=$min; + $adj5max=$max; + list($num5steps,$min5step,$maj5step) = $this->CalcTicksFreeze($maxsteps,$min,$max,2,5,false); + } + + // Check to see whichof 1:s, 2:s or 5:s fit better with + // the requested number of major ticks + $match1=abs($num1steps-$maxsteps); + $match2=abs($num2steps-$maxsteps); + $match5=abs($num5steps-$maxsteps); + + // Compare these three values and see which is the closest match + // We use a 0.8 weight to gravitate towards multiple of 5:s + $r=$this->MatchMin3($match1,$match2,$match5,0.8); + switch( $r ) { + case 1: + $this->Update($img,$adj1min,$adj1max); + $this->ticks->Set($maj1step,$min1step); + break; + case 2: + $this->Update($img,$adj2min,$adj2max); + $this->ticks->Set($maj2step,$min2step); + break; + case 3: + $this->Update($img,$adj5min,$adj5max); + $this->ticks->Set($maj5step,$min5step); + break; + } } -//--------------- -// PRIVATE METHODS + //--------------- + // PRIVATE METHODS // This method recalculates all constants that are depending on the // margins in the image. If the margins in the image are changed // this method should be called for every scale that is registred with // that image. Should really be installed as an observer of that image. function InitConstants($img) { - if( $this->type=="x" ) { - $this->world_abs_size=$img->width - $img->left_margin - $img->right_margin; - $this->off=$img->left_margin; - $this->scale_factor = 0; - if( $this->world_size > 0 ) - $this->scale_factor=$this->world_abs_size/($this->world_size*1.0); - } - else { // y scale - $this->world_abs_size=$img->height - $img->top_margin - $img->bottom_margin; - $this->off=$img->top_margin+$this->world_abs_size; - $this->scale_factor = 0; - if( $this->world_size > 0 ) - $this->scale_factor=-$this->world_abs_size/($this->world_size*1.0); - } - $size = $this->world_size * $this->scale_factor; - $this->scale_abs=array($this->off,$this->off + $size); + if( $this->type=='x' ) { + $this->world_abs_size=$img->width - $img->left_margin - $img->right_margin; + $this->off=$img->left_margin; + $this->scale_factor = 0; + if( $this->world_size > 0 ) { + $this->scale_factor=$this->world_abs_size/($this->world_size*1.0); + } + } + else { // y scale + $this->world_abs_size=$img->height - $img->top_margin - $img->bottom_margin; + $this->off=$img->top_margin+$this->world_abs_size; + $this->scale_factor = 0; + if( $this->world_size > 0 ) { + $this->scale_factor=-$this->world_abs_size/($this->world_size*1.0); + } + } + $size = $this->world_size * $this->scale_factor; + $this->scale_abs=array($this->off,$this->off + $size); } - + // Initialize the conversion constants for this scale // This tries to pre-calculate as much as possible to speed up the // actual conversion (with Translate()) later on - // $start =scale start in absolute pixels (for x-scale this is an y-position - // and for an y-scale this is an x-position - // $len =absolute length in pixels of scale + // $start =scale start in absolute pixels (for x-scale this is an y-position + // and for an y-scale this is an x-position + // $len =absolute length in pixels of scale function SetConstants($aStart,$aLen) { - $this->world_abs_size=$aLen; - $this->off=$aStart; - - if( $this->world_size<=0 ) { - // This should never ever happen !! - JpGraphError::RaiseL(25074); -//("You have unfortunately stumbled upon a bug in JpGraph. It seems like the scale range is ".$this->world_size." [for ".$this->type." scale]
Please report Bug #01 to jpgraph@aditus.nu and include the script that gave this error. This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the autoscaling to fail."); + $this->world_abs_size=$aLen; + $this->off=$aStart; - } - - // scale_factor = number of pixels per world unit - $this->scale_factor=$this->world_abs_size/($this->world_size*1.0); - - // scale_abs = start and end points of scale in absolute pixels - $this->scale_abs=array($this->off,$this->off+$this->world_size*$this->scale_factor); + if( $this->world_size<=0 ) { + // This should never ever happen !! + JpGraphError::RaiseL(25074); + //("You have unfortunately stumbled upon a bug in JpGraph. It seems like the scale range is ".$this->world_size." [for ".$this->type." scale]
Please report Bug #01 to jpgraph@aditus.nu and include the script that gave this error. This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the autoscaling to fail."); + } + + // scale_factor = number of pixels per world unit + $this->scale_factor=$this->world_abs_size/($this->world_size*1.0); + + // scale_abs = start and end points of scale in absolute pixels + $this->scale_abs=array($this->off,$this->off+$this->world_size*$this->scale_factor); } - - + + // Calculate number of ticks steps with a specific division // $a is the divisor of 10**x to generate the first maj tick intervall // $a=1, $b=2 give major ticks with multiple of 10, ...,0.1,1,10,... // $a=5, $b=2 give major ticks with multiple of 2:s ...,0.2,2,20,... // $a=2, $b=5 give major ticks with multiple of 5:s ...,0.5,5,50,... // We return a vector of - // [$numsteps,$adjmin,$adjmax,$minstep,$majstep] + // [$numsteps,$adjmin,$adjmax,$minstep,$majstep] // If $majend==true then the first and last marks on the axis will be major // labeled tick marks otherwise it will be adjusted to the closest min tick mark function CalcTicks($maxsteps,$min,$max,$a,$b,$majend=true) { - $diff=$max-$min; - if( $diff==0 ) - $ld=0; - else - $ld=floor(log10($diff)); + $diff=$max-$min; + if( $diff==0 ) { + $ld=0; + } + else { + $ld=floor(log10($diff)); + } - // Gravitate min towards zero if we are close - if( $min>0 && $min < pow(10,$ld) ) $min=0; - - //$majstep=pow(10,$ld-1)/$a; - $majstep=pow(10,$ld)/$a; - $minstep=$majstep/$b; - - $adjmax=ceil($max/$minstep)*$minstep; - $adjmin=floor($min/$minstep)*$minstep; - $adjdiff = $adjmax-$adjmin; - $numsteps=$adjdiff/$majstep; - - while( $numsteps>$maxsteps ) { - $majstep=pow(10,$ld)/$a; - $numsteps=$adjdiff/$majstep; - ++$ld; - } + // Gravitate min towards zero if we are close + if( $min>0 && $min < pow(10,$ld) ) $min=0; - $minstep=$majstep/$b; - $adjmin=floor($min/$minstep)*$minstep; - $adjdiff = $adjmax-$adjmin; - if( $majend ) { - $adjmin = floor($min/$majstep)*$majstep; - $adjdiff = $adjmax-$adjmin; - $adjmax = ceil($adjdiff/$majstep)*$majstep+$adjmin; - } - else - $adjmax=ceil($max/$minstep)*$minstep; + //$majstep=pow(10,$ld-1)/$a; + $majstep=pow(10,$ld)/$a; + $minstep=$majstep/$b; - return array($numsteps,$adjmin,$adjmax,$minstep,$majstep); + $adjmax=ceil($max/$minstep)*$minstep; + $adjmin=floor($min/$minstep)*$minstep; + $adjdiff = $adjmax-$adjmin; + $numsteps=$adjdiff/$majstep; + + while( $numsteps>$maxsteps ) { + $majstep=pow(10,$ld)/$a; + $numsteps=$adjdiff/$majstep; + ++$ld; + } + + $minstep=$majstep/$b; + $adjmin=floor($min/$minstep)*$minstep; + $adjdiff = $adjmax-$adjmin; + if( $majend ) { + $adjmin = floor($min/$majstep)*$majstep; + $adjdiff = $adjmax-$adjmin; + $adjmax = ceil($adjdiff/$majstep)*$majstep+$adjmin; + } + else { + $adjmax=ceil($max/$minstep)*$minstep; + } + + return array($numsteps,$adjmin,$adjmax,$minstep,$majstep); } function CalcTicksFreeze($maxsteps,$min,$max,$a,$b) { - // Same as CalcTicks but don't adjust min/max values - $diff=$max-$min; - if( $diff==0 ) - $ld=0; - else - $ld=floor(log10($diff)); + // Same as CalcTicks but don't adjust min/max values + $diff=$max-$min; + if( $diff==0 ) { + $ld=0; + } + else { + $ld=floor(log10($diff)); + } - //$majstep=pow(10,$ld-1)/$a; - $majstep=pow(10,$ld)/$a; - $minstep=$majstep/$b; - $numsteps=floor($diff/$majstep); - - while( $numsteps > $maxsteps ) { - $majstep=pow(10,$ld)/$a; - $numsteps=floor($diff/$majstep); - ++$ld; - } - $minstep=$majstep/$b; - return array($numsteps,$minstep,$majstep); + //$majstep=pow(10,$ld-1)/$a; + $majstep=pow(10,$ld)/$a; + $minstep=$majstep/$b; + $numsteps=floor($diff/$majstep); + + while( $numsteps > $maxsteps ) { + $majstep=pow(10,$ld)/$a; + $numsteps=floor($diff/$majstep); + ++$ld; + } + $minstep=$majstep/$b; + return array($numsteps,$minstep,$majstep); } - - function IntCalcTicks($maxsteps,$min,$max,$a,$majend=true) { - $diff=$max-$min; - if( $diff==0 ) - JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.'); - else - $ld=floor(log10($diff)); - - // Gravitate min towards zero if we are close - if( $min>0 && $min < pow(10,$ld) ) $min=0; - - if( $ld == 0 ) $ld=1; - - if( $a == 1 ) - $majstep = 1; - else - $majstep=pow(10,$ld)/$a; - $adjmax=ceil($max/$majstep)*$majstep; - $adjmin=floor($min/$majstep)*$majstep; - $adjdiff = $adjmax-$adjmin; - $numsteps=$adjdiff/$majstep; - while( $numsteps>$maxsteps ) { - $majstep=pow(10,$ld)/$a; - $numsteps=$adjdiff/$majstep; - ++$ld; - } - - $adjmin=floor($min/$majstep)*$majstep; - $adjdiff = $adjmax-$adjmin; - if( $majend ) { - $adjmin = floor($min/$majstep)*$majstep; - $adjdiff = $adjmax-$adjmin; - $adjmax = ceil($adjdiff/$majstep)*$majstep+$adjmin; - } - else - $adjmax=ceil($max/$majstep)*$majstep; - - return array($numsteps,$adjmin,$adjmax,$majstep); + function IntCalcTicks($maxsteps,$min,$max,$a,$majend=true) { + $diff=$max-$min; + if( $diff==0 ) { + JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.'); + } + else { + $ld=floor(log10($diff)); + } + + // Gravitate min towards zero if we are close + if( $min>0 && $min < pow(10,$ld) ) { + $min=0; + } + if( $ld == 0 ) { + $ld=1; + } + if( $a == 1 ) { + $majstep = 1; + } + else { + $majstep=pow(10,$ld)/$a; + } + $adjmax=ceil($max/$majstep)*$majstep; + + $adjmin=floor($min/$majstep)*$majstep; + $adjdiff = $adjmax-$adjmin; + $numsteps=$adjdiff/$majstep; + while( $numsteps>$maxsteps ) { + $majstep=pow(10,$ld)/$a; + $numsteps=$adjdiff/$majstep; + ++$ld; + } + + $adjmin=floor($min/$majstep)*$majstep; + $adjdiff = $adjmax-$adjmin; + if( $majend ) { + $adjmin = floor($min/$majstep)*$majstep; + $adjdiff = $adjmax-$adjmin; + $adjmax = ceil($adjdiff/$majstep)*$majstep+$adjmin; + } + else { + $adjmax=ceil($max/$majstep)*$majstep; + } + + return array($numsteps,$adjmin,$adjmax,$majstep); } function IntCalcTicksFreeze($maxsteps,$min,$max,$a) { - // Same as IntCalcTick but don't change min/max values - $diff=$max-$min; - if( $diff==0 ) - JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.'); - else - $ld=floor(log10($diff)); - - if( $ld == 0 ) $ld=1; - - if( $a == 1 ) - $majstep = 1; - else - $majstep=pow(10,$ld)/$a; + // Same as IntCalcTick but don't change min/max values + $diff=$max-$min; + if( $diff==0 ) { + JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.'); + } + else { + $ld=floor(log10($diff)); + } + if( $ld == 0 ) { + $ld=1; + } + if( $a == 1 ) { + $majstep = 1; + } + else { + $majstep=pow(10,$ld)/$a; + } - $numsteps=floor($diff/$majstep); - while( $numsteps > $maxsteps ) { - $majstep=pow(10,$ld)/$a; - $numsteps=floor($diff/$majstep); - ++$ld; - } - - return array($numsteps,$majstep); + $numsteps=floor($diff/$majstep); + while( $numsteps > $maxsteps ) { + $majstep=pow(10,$ld)/$a; + $numsteps=floor($diff/$majstep); + ++$ld; + } + + return array($numsteps,$majstep); } - - // Determine the minimum of three values witha weight for last value function MatchMin3($a,$b,$c,$weight) { - if( $a < $b ) { - if( $a < ($c*$weight) ) - return 1; // $a smallest - else - return 3; // $c smallest - } - elseif( $b < ($c*$weight) ) - return 2; // $b smallest - return 3; // $c smallest + if( $a < $b ) { + if( $a < ($c*$weight) ) { + return 1; // $a smallest + } + else { + return 3; // $c smallest + } + } + elseif( $b < ($c*$weight) ) { + return 2; // $b smallest + } + return 3; // $c smallest } } // Class -//=================================================== -// CLASS RGB -// Description: Color definitions as RGB triples -//=================================================== -class RGB { - public $rgb_table; - public $img; - - function RGB($aImg=null) { - $this->img = $aImg; - - // Conversion array between color names and RGB - $this->rgb_table = array( - "aqua"=> array(0,255,255), - "lime"=> array(0,255,0), - "teal"=> array(0,128,128), - "whitesmoke"=>array(245,245,245), - "gainsboro"=>array(220,220,220), - "oldlace"=>array(253,245,230), - "linen"=>array(250,240,230), - "antiquewhite"=>array(250,235,215), - "papayawhip"=>array(255,239,213), - "blanchedalmond"=>array(255,235,205), - "bisque"=>array(255,228,196), - "peachpuff"=>array(255,218,185), - "navajowhite"=>array(255,222,173), - "moccasin"=>array(255,228,181), - "cornsilk"=>array(255,248,220), - "ivory"=>array(255,255,240), - "lemonchiffon"=>array(255,250,205), - "seashell"=>array(255,245,238), - "mintcream"=>array(245,255,250), - "azure"=>array(240,255,255), - "aliceblue"=>array(240,248,255), - "lavender"=>array(230,230,250), - "lavenderblush"=>array(255,240,245), - "mistyrose"=>array(255,228,225), - "white"=>array(255,255,255), - "black"=>array(0,0,0), - "darkslategray"=>array(47,79,79), - "dimgray"=>array(105,105,105), - "slategray"=>array(112,128,144), - "lightslategray"=>array(119,136,153), - "gray"=>array(190,190,190), - "lightgray"=>array(211,211,211), - "midnightblue"=>array(25,25,112), - "navy"=>array(0,0,128), - "cornflowerblue"=>array(100,149,237), - "darkslateblue"=>array(72,61,139), - "slateblue"=>array(106,90,205), - "mediumslateblue"=>array(123,104,238), - "lightslateblue"=>array(132,112,255), - "mediumblue"=>array(0,0,205), - "royalblue"=>array(65,105,225), - "blue"=>array(0,0,255), - "dodgerblue"=>array(30,144,255), - "deepskyblue"=>array(0,191,255), - "skyblue"=>array(135,206,235), - "lightskyblue"=>array(135,206,250), - "steelblue"=>array(70,130,180), - "lightred"=>array(211,167,168), - "lightsteelblue"=>array(176,196,222), - "lightblue"=>array(173,216,230), - "powderblue"=>array(176,224,230), - "paleturquoise"=>array(175,238,238), - "darkturquoise"=>array(0,206,209), - "mediumturquoise"=>array(72,209,204), - "turquoise"=>array(64,224,208), - "cyan"=>array(0,255,255), - "lightcyan"=>array(224,255,255), - "cadetblue"=>array(95,158,160), - "mediumaquamarine"=>array(102,205,170), - "aquamarine"=>array(127,255,212), - "darkgreen"=>array(0,100,0), - "darkolivegreen"=>array(85,107,47), - "darkseagreen"=>array(143,188,143), - "seagreen"=>array(46,139,87), - "mediumseagreen"=>array(60,179,113), - "lightseagreen"=>array(32,178,170), - "palegreen"=>array(152,251,152), - "springgreen"=>array(0,255,127), - "lawngreen"=>array(124,252,0), - "green"=>array(0,255,0), - "chartreuse"=>array(127,255,0), - "mediumspringgreen"=>array(0,250,154), - "greenyellow"=>array(173,255,47), - "limegreen"=>array(50,205,50), - "yellowgreen"=>array(154,205,50), - "forestgreen"=>array(34,139,34), - "olivedrab"=>array(107,142,35), - "darkkhaki"=>array(189,183,107), - "khaki"=>array(240,230,140), - "palegoldenrod"=>array(238,232,170), - "lightgoldenrodyellow"=>array(250,250,210), - "lightyellow"=>array(255,255,200), - "yellow"=>array(255,255,0), - "gold"=>array(255,215,0), - "lightgoldenrod"=>array(238,221,130), - "goldenrod"=>array(218,165,32), - "darkgoldenrod"=>array(184,134,11), - "rosybrown"=>array(188,143,143), - "indianred"=>array(205,92,92), - "saddlebrown"=>array(139,69,19), - "sienna"=>array(160,82,45), - "peru"=>array(205,133,63), - "burlywood"=>array(222,184,135), - "beige"=>array(245,245,220), - "wheat"=>array(245,222,179), - "sandybrown"=>array(244,164,96), - "tan"=>array(210,180,140), - "chocolate"=>array(210,105,30), - "firebrick"=>array(178,34,34), - "brown"=>array(165,42,42), - "darksalmon"=>array(233,150,122), - "salmon"=>array(250,128,114), - "lightsalmon"=>array(255,160,122), - "orange"=>array(255,165,0), - "darkorange"=>array(255,140,0), - "coral"=>array(255,127,80), - "lightcoral"=>array(240,128,128), - "tomato"=>array(255,99,71), - "orangered"=>array(255,69,0), - "red"=>array(255,0,0), - "hotpink"=>array(255,105,180), - "deeppink"=>array(255,20,147), - "pink"=>array(255,192,203), - "lightpink"=>array(255,182,193), - "palevioletred"=>array(219,112,147), - "maroon"=>array(176,48,96), - "mediumvioletred"=>array(199,21,133), - "violetred"=>array(208,32,144), - "magenta"=>array(255,0,255), - "violet"=>array(238,130,238), - "plum"=>array(221,160,221), - "orchid"=>array(218,112,214), - "mediumorchid"=>array(186,85,211), - "darkorchid"=>array(153,50,204), - "darkviolet"=>array(148,0,211), - "blueviolet"=>array(138,43,226), - "purple"=>array(160,32,240), - "mediumpurple"=>array(147,112,219), - "thistle"=>array(216,191,216), - "snow1"=>array(255,250,250), - "snow2"=>array(238,233,233), - "snow3"=>array(205,201,201), - "snow4"=>array(139,137,137), - "seashell1"=>array(255,245,238), - "seashell2"=>array(238,229,222), - "seashell3"=>array(205,197,191), - "seashell4"=>array(139,134,130), - "AntiqueWhite1"=>array(255,239,219), - "AntiqueWhite2"=>array(238,223,204), - "AntiqueWhite3"=>array(205,192,176), - "AntiqueWhite4"=>array(139,131,120), - "bisque1"=>array(255,228,196), - "bisque2"=>array(238,213,183), - "bisque3"=>array(205,183,158), - "bisque4"=>array(139,125,107), - "peachPuff1"=>array(255,218,185), - "peachpuff2"=>array(238,203,173), - "peachpuff3"=>array(205,175,149), - "peachpuff4"=>array(139,119,101), - "navajowhite1"=>array(255,222,173), - "navajowhite2"=>array(238,207,161), - "navajowhite3"=>array(205,179,139), - "navajowhite4"=>array(139,121,94), - "lemonchiffon1"=>array(255,250,205), - "lemonchiffon2"=>array(238,233,191), - "lemonchiffon3"=>array(205,201,165), - "lemonchiffon4"=>array(139,137,112), - "ivory1"=>array(255,255,240), - "ivory2"=>array(238,238,224), - "ivory3"=>array(205,205,193), - "ivory4"=>array(139,139,131), - "honeydew"=>array(193,205,193), - "lavenderblush1"=>array(255,240,245), - "lavenderblush2"=>array(238,224,229), - "lavenderblush3"=>array(205,193,197), - "lavenderblush4"=>array(139,131,134), - "mistyrose1"=>array(255,228,225), - "mistyrose2"=>array(238,213,210), - "mistyrose3"=>array(205,183,181), - "mistyrose4"=>array(139,125,123), - "azure1"=>array(240,255,255), - "azure2"=>array(224,238,238), - "azure3"=>array(193,205,205), - "azure4"=>array(131,139,139), - "slateblue1"=>array(131,111,255), - "slateblue2"=>array(122,103,238), - "slateblue3"=>array(105,89,205), - "slateblue4"=>array(71,60,139), - "royalblue1"=>array(72,118,255), - "royalblue2"=>array(67,110,238), - "royalblue3"=>array(58,95,205), - "royalblue4"=>array(39,64,139), - "dodgerblue1"=>array(30,144,255), - "dodgerblue2"=>array(28,134,238), - "dodgerblue3"=>array(24,116,205), - "dodgerblue4"=>array(16,78,139), - "steelblue1"=>array(99,184,255), - "steelblue2"=>array(92,172,238), - "steelblue3"=>array(79,148,205), - "steelblue4"=>array(54,100,139), - "deepskyblue1"=>array(0,191,255), - "deepskyblue2"=>array(0,178,238), - "deepskyblue3"=>array(0,154,205), - "deepskyblue4"=>array(0,104,139), - "skyblue1"=>array(135,206,255), - "skyblue2"=>array(126,192,238), - "skyblue3"=>array(108,166,205), - "skyblue4"=>array(74,112,139), - "lightskyblue1"=>array(176,226,255), - "lightskyblue2"=>array(164,211,238), - "lightskyblue3"=>array(141,182,205), - "lightskyblue4"=>array(96,123,139), - "slategray1"=>array(198,226,255), - "slategray2"=>array(185,211,238), - "slategray3"=>array(159,182,205), - "slategray4"=>array(108,123,139), - "lightsteelblue1"=>array(202,225,255), - "lightsteelblue2"=>array(188,210,238), - "lightsteelblue3"=>array(162,181,205), - "lightsteelblue4"=>array(110,123,139), - "lightblue1"=>array(191,239,255), - "lightblue2"=>array(178,223,238), - "lightblue3"=>array(154,192,205), - "lightblue4"=>array(104,131,139), - "lightcyan1"=>array(224,255,255), - "lightcyan2"=>array(209,238,238), - "lightcyan3"=>array(180,205,205), - "lightcyan4"=>array(122,139,139), - "paleturquoise1"=>array(187,255,255), - "paleturquoise2"=>array(174,238,238), - "paleturquoise3"=>array(150,205,205), - "paleturquoise4"=>array(102,139,139), - "cadetblue1"=>array(152,245,255), - "cadetblue2"=>array(142,229,238), - "cadetblue3"=>array(122,197,205), - "cadetblue4"=>array(83,134,139), - "turquoise1"=>array(0,245,255), - "turquoise2"=>array(0,229,238), - "turquoise3"=>array(0,197,205), - "turquoise4"=>array(0,134,139), - "cyan1"=>array(0,255,255), - "cyan2"=>array(0,238,238), - "cyan3"=>array(0,205,205), - "cyan4"=>array(0,139,139), - "darkslategray1"=>array(151,255,255), - "darkslategray2"=>array(141,238,238), - "darkslategray3"=>array(121,205,205), - "darkslategray4"=>array(82,139,139), - "aquamarine1"=>array(127,255,212), - "aquamarine2"=>array(118,238,198), - "aquamarine3"=>array(102,205,170), - "aquamarine4"=>array(69,139,116), - "darkseagreen1"=>array(193,255,193), - "darkseagreen2"=>array(180,238,180), - "darkseagreen3"=>array(155,205,155), - "darkseagreen4"=>array(105,139,105), - "seagreen1"=>array(84,255,159), - "seagreen2"=>array(78,238,148), - "seagreen3"=>array(67,205,128), - "seagreen4"=>array(46,139,87), - "palegreen1"=>array(154,255,154), - "palegreen2"=>array(144,238,144), - "palegreen3"=>array(124,205,124), - "palegreen4"=>array(84,139,84), - "springgreen1"=>array(0,255,127), - "springgreen2"=>array(0,238,118), - "springgreen3"=>array(0,205,102), - "springgreen4"=>array(0,139,69), - "chartreuse1"=>array(127,255,0), - "chartreuse2"=>array(118,238,0), - "chartreuse3"=>array(102,205,0), - "chartreuse4"=>array(69,139,0), - "olivedrab1"=>array(192,255,62), - "olivedrab2"=>array(179,238,58), - "olivedrab3"=>array(154,205,50), - "olivedrab4"=>array(105,139,34), - "darkolivegreen1"=>array(202,255,112), - "darkolivegreen2"=>array(188,238,104), - "darkolivegreen3"=>array(162,205,90), - "darkolivegreen4"=>array(110,139,61), - "khaki1"=>array(255,246,143), - "khaki2"=>array(238,230,133), - "khaki3"=>array(205,198,115), - "khaki4"=>array(139,134,78), - "lightgoldenrod1"=>array(255,236,139), - "lightgoldenrod2"=>array(238,220,130), - "lightgoldenrod3"=>array(205,190,112), - "lightgoldenrod4"=>array(139,129,76), - "yellow1"=>array(255,255,0), - "yellow2"=>array(238,238,0), - "yellow3"=>array(205,205,0), - "yellow4"=>array(139,139,0), - "gold1"=>array(255,215,0), - "gold2"=>array(238,201,0), - "gold3"=>array(205,173,0), - "gold4"=>array(139,117,0), - "goldenrod1"=>array(255,193,37), - "goldenrod2"=>array(238,180,34), - "goldenrod3"=>array(205,155,29), - "goldenrod4"=>array(139,105,20), - "darkgoldenrod1"=>array(255,185,15), - "darkgoldenrod2"=>array(238,173,14), - "darkgoldenrod3"=>array(205,149,12), - "darkgoldenrod4"=>array(139,101,8), - "rosybrown1"=>array(255,193,193), - "rosybrown2"=>array(238,180,180), - "rosybrown3"=>array(205,155,155), - "rosybrown4"=>array(139,105,105), - "indianred1"=>array(255,106,106), - "indianred2"=>array(238,99,99), - "indianred3"=>array(205,85,85), - "indianred4"=>array(139,58,58), - "sienna1"=>array(255,130,71), - "sienna2"=>array(238,121,66), - "sienna3"=>array(205,104,57), - "sienna4"=>array(139,71,38), - "burlywood1"=>array(255,211,155), - "burlywood2"=>array(238,197,145), - "burlywood3"=>array(205,170,125), - "burlywood4"=>array(139,115,85), - "wheat1"=>array(255,231,186), - "wheat2"=>array(238,216,174), - "wheat3"=>array(205,186,150), - "wheat4"=>array(139,126,102), - "tan1"=>array(255,165,79), - "tan2"=>array(238,154,73), - "tan3"=>array(205,133,63), - "tan4"=>array(139,90,43), - "chocolate1"=>array(255,127,36), - "chocolate2"=>array(238,118,33), - "chocolate3"=>array(205,102,29), - "chocolate4"=>array(139,69,19), - "firebrick1"=>array(255,48,48), - "firebrick2"=>array(238,44,44), - "firebrick3"=>array(205,38,38), - "firebrick4"=>array(139,26,26), - "brown1"=>array(255,64,64), - "brown2"=>array(238,59,59), - "brown3"=>array(205,51,51), - "brown4"=>array(139,35,35), - "salmon1"=>array(255,140,105), - "salmon2"=>array(238,130,98), - "salmon3"=>array(205,112,84), - "salmon4"=>array(139,76,57), - "lightsalmon1"=>array(255,160,122), - "lightsalmon2"=>array(238,149,114), - "lightsalmon3"=>array(205,129,98), - "lightsalmon4"=>array(139,87,66), - "orange1"=>array(255,165,0), - "orange2"=>array(238,154,0), - "orange3"=>array(205,133,0), - "orange4"=>array(139,90,0), - "darkorange1"=>array(255,127,0), - "darkorange2"=>array(238,118,0), - "darkorange3"=>array(205,102,0), - "darkorange4"=>array(139,69,0), - "coral1"=>array(255,114,86), - "coral2"=>array(238,106,80), - "coral3"=>array(205,91,69), - "coral4"=>array(139,62,47), - "tomato1"=>array(255,99,71), - "tomato2"=>array(238,92,66), - "tomato3"=>array(205,79,57), - "tomato4"=>array(139,54,38), - "orangered1"=>array(255,69,0), - "orangered2"=>array(238,64,0), - "orangered3"=>array(205,55,0), - "orangered4"=>array(139,37,0), - "deeppink1"=>array(255,20,147), - "deeppink2"=>array(238,18,137), - "deeppink3"=>array(205,16,118), - "deeppink4"=>array(139,10,80), - "hotpink1"=>array(255,110,180), - "hotpink2"=>array(238,106,167), - "hotpink3"=>array(205,96,144), - "hotpink4"=>array(139,58,98), - "pink1"=>array(255,181,197), - "pink2"=>array(238,169,184), - "pink3"=>array(205,145,158), - "pink4"=>array(139,99,108), - "lightpink1"=>array(255,174,185), - "lightpink2"=>array(238,162,173), - "lightpink3"=>array(205,140,149), - "lightpink4"=>array(139,95,101), - "palevioletred1"=>array(255,130,171), - "palevioletred2"=>array(238,121,159), - "palevioletred3"=>array(205,104,137), - "palevioletred4"=>array(139,71,93), - "maroon1"=>array(255,52,179), - "maroon2"=>array(238,48,167), - "maroon3"=>array(205,41,144), - "maroon4"=>array(139,28,98), - "violetred1"=>array(255,62,150), - "violetred2"=>array(238,58,140), - "violetred3"=>array(205,50,120), - "violetred4"=>array(139,34,82), - "magenta1"=>array(255,0,255), - "magenta2"=>array(238,0,238), - "magenta3"=>array(205,0,205), - "magenta4"=>array(139,0,139), - "mediumred"=>array(140,34,34), - "orchid1"=>array(255,131,250), - "orchid2"=>array(238,122,233), - "orchid3"=>array(205,105,201), - "orchid4"=>array(139,71,137), - "plum1"=>array(255,187,255), - "plum2"=>array(238,174,238), - "plum3"=>array(205,150,205), - "plum4"=>array(139,102,139), - "mediumorchid1"=>array(224,102,255), - "mediumorchid2"=>array(209,95,238), - "mediumorchid3"=>array(180,82,205), - "mediumorchid4"=>array(122,55,139), - "darkorchid1"=>array(191,62,255), - "darkorchid2"=>array(178,58,238), - "darkorchid3"=>array(154,50,205), - "darkorchid4"=>array(104,34,139), - "purple1"=>array(155,48,255), - "purple2"=>array(145,44,238), - "purple3"=>array(125,38,205), - "purple4"=>array(85,26,139), - "mediumpurple1"=>array(171,130,255), - "mediumpurple2"=>array(159,121,238), - "mediumpurple3"=>array(137,104,205), - "mediumpurple4"=>array(93,71,139), - "thistle1"=>array(255,225,255), - "thistle2"=>array(238,210,238), - "thistle3"=>array(205,181,205), - "thistle4"=>array(139,123,139), - "gray1"=>array(10,10,10), - "gray2"=>array(40,40,30), - "gray3"=>array(70,70,70), - "gray4"=>array(100,100,100), - "gray5"=>array(130,130,130), - "gray6"=>array(160,160,160), - "gray7"=>array(190,190,190), - "gray8"=>array(210,210,210), - "gray9"=>array(240,240,240), - "darkgray"=>array(100,100,100), - "darkblue"=>array(0,0,139), - "darkcyan"=>array(0,139,139), - "darkmagenta"=>array(139,0,139), - "darkred"=>array(139,0,0), - "silver"=>array(192, 192, 192), - "eggplant"=>array(144,176,168), - "lightgreen"=>array(144,238,144)); - } -//---------------- -// PUBLIC METHODS - // Colors can be specified as either - // 1. #xxxxxx HTML style - // 2. "colorname" as a named color - // 3. array(r,g,b) RGB triple - // This function translates this to a native RGB format and returns an - // RGB triple. - function Color($aColor) { - if (is_string($aColor)) { - // Strip of any alpha factor - $pos = strpos($aColor,'@'); - if( $pos === false ) { - $alpha = 0; - } - else { - $pos2 = strpos($aColor,':'); - if( $pos2===false ) - $pos2 = $pos-1; // Sentinel - if( $pos > $pos2 ) { - $alpha = str_replace(',','.',substr($aColor,$pos+1)); - $aColor = substr($aColor,0,$pos); - } - else { - $alpha = substr($aColor,$pos+1,$pos2-$pos-1); - $aColor = substr($aColor,0,$pos).substr($aColor,$pos2); - } - } - - // Extract potential adjustment figure at end of color - // specification - $pos = strpos($aColor,":"); - if( $pos === false ) { - $adj = 1.0; - } - else { - $adj = 0.0 + str_replace(',','.',substr($aColor,$pos+1)); - $aColor = substr($aColor,0,$pos); - } - if( $adj < 0 ) - JpGraphError::RaiseL(25077);//('Adjustment factor for color must be > 0'); - - if (substr($aColor, 0, 1) == "#") { - $r = hexdec(substr($aColor, 1, 2)); - $g = hexdec(substr($aColor, 3, 2)); - $b = hexdec(substr($aColor, 5, 2)); - } else { - if(!isset($this->rgb_table[$aColor]) ) - JpGraphError::RaiseL(25078,$aColor);//(" Unknown color: $aColor"); - $tmp=$this->rgb_table[$aColor]; - $r = $tmp[0]; - $g = $tmp[1]; - $b = $tmp[2]; - } - // Scale adj so that an adj=2 always - // makes the color 100% white (i.e. 255,255,255. - // and adj=1 neutral and adj=0 black. - if( $adj > 1 ) { - $m = ($adj-1.0)*(255-min(255,min($r,min($g,$b)))); - return array(min(255,$r+$m), min(255,$g+$m), min(255,$b+$m),$alpha); - } - elseif( $adj < 1 ) { - $m = ($adj-1.0)*max(255,max($r,max($g,$b))); - return array(max(0,$r+$m), max(0,$g+$m), max(0,$b+$m),$alpha); - } - else { - return array($r,$g,$b,$alpha); - } - - } elseif( is_array($aColor) ) { - if( count($aColor)==3 ) { - $aColor[3]=0; - return $aColor; - } - else - return $aColor; - } - else - JpGraphError::RaiseL(25079,$aColor,count($aColor));//(" Unknown color specification: $aColor , size=".count($aColor)); - } - - // Compare two colors - // return true if equal - function Equal($aCol1,$aCol2) { - $c1 = $this->Color($aCol1); - $c2 = $this->Color($aCol2); - if( $c1[0]==$c2[0] && $c1[1]==$c2[1] && $c1[2]==$c2[2] ) - return true; - else - return false; - } - - // Allocate a new color in the current image - // Return new color index, -1 if no more colors could be allocated - function Allocate($aColor,$aAlpha=0.0) { - list ($r, $g, $b, $a) = $this->color($aColor); - // If alpha is specified in the color string then this - // takes precedence over the second argument - if( $a > 0 ) - $aAlpha = $a; - if( $aAlpha < 0 || $aAlpha > 1 ) { - JpGraphError::RaiseL(25080);//('Alpha parameter for color must be between 0.0 and 1.0'); - } - return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127)); - } -} // Class - - -//=================================================== -// CLASS Legend -// Description: Responsible for drawing the box containing -// all the legend text for the graph -//=================================================== -DEFINE('_DEFAULT_LPM_SIZE',8); -class Legend { - public $txtcol=array(); - private $color=array(0,0,0); // Default fram color - private $fill_color=array(235,235,235); // Default fill color - private $shadow=true; // Shadow around legend "box" - private $shadow_color='darkgray@0.5'; - private $mark_abs_hsize=_DEFAULT_LPM_SIZE,$mark_abs_vsize=_DEFAULT_LPM_SIZE; - private $xmargin=10,$ymargin=3,$shadow_width=2; - private $xlmargin=2, $ylmargin=''; - private $xpos=0.05, $ypos=0.15, $xabspos=-1, $yabspos=-1; - private $halign="right", $valign="top"; - private $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=12; - private $font_color='black'; - private $hide=false,$layout_n=1; - private $weight=1,$frameweight=1; - private $csimareas=''; - private $reverse = false ; -//--------------- -// CONSTRUCTOR - function Legend() { - // Empty - } -//--------------- -// PUBLIC METHODS - function Hide($aHide=true) { - $this->hide=$aHide; - } - - function SetHColMargin($aXMarg) { - $this->xmargin = $aXMarg; - } - - function SetVColMargin($aSpacing) { - $this->ymargin = $aSpacing ; - } - - function SetLeftMargin($aXMarg) { - $this->xlmargin = $aXMarg; - } - - - // Synonym - function SetLineSpacing($aSpacing) { - $this->ymargin = $aSpacing ; - } - - function SetShadow($aShow='gray',$aWidth=2) { - if( is_string($aShow) ) { - $this->shadow_color = $aShow; - $this->shadow=true; - } - else - $this->shadow=$aShow; - $this->shadow_width=$aWidth; - } - - function SetMarkAbsSize($aSize) { - $this->mark_abs_vsize = $aSize ; - $this->mark_abs_hsize = $aSize ; - } - - function SetMarkAbsVSize($aSize) { - $this->mark_abs_vsize = $aSize ; - } - - function SetMarkAbsHSize($aSize) { - $this->mark_abs_hsize = $aSize ; - } - - function SetLineWeight($aWeight) { - $this->weight = $aWeight; - } - - function SetFrameWeight($aWeight) { - $this->frameweight = $aWeight; - } - - function SetLayout($aDirection=LEGEND_VERT) { - $this->layout_n = $aDirection==LEGEND_VERT ? 1 : 99 ; - } - - function SetColumns($aCols) { - $this->layout_n = $aCols ; - } - - function SetReverse($f=true) { - $this->reverse = $f ; - } - - // Set color on frame around box - function SetColor($aFontColor,$aColor='black') { - $this->font_color=$aFontColor; - $this->color=$aColor; - } - - function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) { - $this->font_family = $aFamily; - $this->font_style = $aStyle; - $this->font_size = $aSize; - } - - function SetPos($aX,$aY,$aHAlign="right",$aVAlign="top") { - $this->Pos($aX,$aY,$aHAlign,$aVAlign); - } - - function SetAbsPos($aX,$aY,$aHAlign="right",$aVAlign="top") { - $this->xabspos=$aX; - $this->yabspos=$aY; - $this->halign=$aHAlign; - $this->valign=$aVAlign; - } - - - function Pos($aX,$aY,$aHAlign="right",$aVAlign="top") { - if( !($aX<1 && $aY<1) ) - JpGraphError::RaiseL(25120);//(" Position for legend must be given as percentage in range 0-1"); - $this->xpos=$aX; - $this->ypos=$aY; - $this->halign=$aHAlign; - $this->valign=$aVAlign; - } - - function SetFillColor($aColor) { - $this->fill_color=$aColor; - } - - function Add($aTxt,$aColor,$aPlotmark='',$aLinestyle=0,$csimtarget='',$csimalt='',$csimwintarget='') { - $this->txtcol[]=array($aTxt,$aColor,$aPlotmark,$aLinestyle,$csimtarget,$csimalt,$csimwintarget); - } - - function GetCSIMAreas() { - return $this->csimareas; - } - - function Stroke(&$aImg) { - // Constant - $fillBoxFrameWeight=1; - - if( $this->hide ) return; - - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - - if( $this->reverse ) { - $this->txtcol = array_reverse($this->txtcol); - } - - $n=count($this->txtcol); - if( $n == 0 ) return; - - // Find out the max width and height of each column to be able - // to size the legend box. - $numcolumns = ($n > $this->layout_n ? $this->layout_n : $n); - for( $i=0; $i < $numcolumns; ++$i ) { - $colwidth[$i] = $aImg->GetTextWidth($this->txtcol[$i][0]) + - 2*$this->xmargin + 2*$this->mark_abs_hsize; - $colheight[$i] = 0; - } - - // Find our maximum height in each row - $rows = 0 ; $rowheight[0] = 0; - for( $i=0; $i < $n; ++$i ) { - $h = max($this->mark_abs_vsize,$aImg->GetTextHeight($this->txtcol[$i][0]))+$this->ymargin; - if( $i % $numcolumns == 0 ) { - $rows++; - $rowheight[$rows-1] = 0; - } - $rowheight[$rows-1] = max($rowheight[$rows-1],$h); - } - - $abs_height = 0; - for( $i=0; $i < $rows; ++$i ) { - $abs_height += $rowheight[$i] ; - } - - // Make sure that the height is at least as high as mark size + ymargin - $abs_height = max($abs_height,$this->mark_abs_vsize); - - // We add 3 extra pixels height to compensate for the difficult in - // calculating font height - $abs_height += $this->ymargin+3; - - // Find out the maximum width in each column - for( $i=$numcolumns; $i < $n; ++$i ) { - $colwidth[$i % $numcolumns] = max( - $aImg->GetTextWidth($this->txtcol[$i][0])+2*$this->xmargin+2*$this->mark_abs_hsize,$colwidth[$i % $numcolumns]); - } - - // Get the total width - $mtw = 0; - for( $i=0; $i < $numcolumns; ++$i ) { - $mtw += $colwidth[$i] ; - } - - // Find out maximum width we need for legend box - $abs_width = $mtw+$this->xlmargin; - - if( $this->xabspos === -1 && $this->yabspos === -1 ) { - $this->xabspos = $this->xpos*$aImg->width ; - $this->yabspos = $this->ypos*$aImg->height ; - } - - // Positioning of the legend box - if( $this->halign == 'left' ) - $xp = $this->xabspos; - elseif( $this->halign == 'center' ) - $xp = $this->xabspos - $abs_width/2; - else - $xp = $aImg->width - $this->xabspos - $abs_width; - - $yp=$this->yabspos; - if( $this->valign == 'center' ) - $yp-=$abs_height/2; - elseif( $this->valign == 'bottom' ) - $yp-=$abs_height; - - // Stroke legend box - $aImg->SetColor($this->color); - $aImg->SetLineWeight($this->frameweight); - $aImg->SetLineStyle('solid'); - - if( $this->shadow ) - $aImg->ShadowRectangle($xp,$yp,$xp+$abs_width+$this->shadow_width, - $yp+$abs_height+$this->shadow_width, - $this->fill_color,$this->shadow_width,$this->shadow_color); - else { - $aImg->SetColor($this->fill_color); - $aImg->FilledRectangle($xp,$yp,$xp+$abs_width,$yp+$abs_height); - $aImg->SetColor($this->color); - $aImg->Rectangle($xp,$yp,$xp+$abs_width,$yp+$abs_height); - } - - // x1,y1 is the position for the legend mark - $x1=$xp+$this->mark_abs_hsize+$this->xlmargin; - $y1=$yp + $this->ymargin; - - $f2 = round($aImg->GetTextHeight('X')/2); - - $grad = new Gradient($aImg); - $patternFactory = null; - - // Now stroke each legend in turn - // Each plot has added the following information to the legend - // p[0] = Legend text - // p[1] = Color, - // p[2] = For markers a reference to the PlotMark object - // p[3] = For lines the line style, for gradient the negative gradient style - // p[4] = CSIM target - // p[5] = CSIM Alt text - $i = 1 ; $row = 0; - foreach($this->txtcol as $p) { - - // STROKE DEBUG BOX - if( _JPG_DEBUG ) { - $aImg->SetLineWeight(1); - $aImg->SetColor('red'); - $aImg->SetLineStyle('solid'); - $aImg->Rectangle($xp,$y1,$xp+$abs_width,$y1+$rowheight[$row]); - } - - $aImg->SetLineWeight($this->weight); - $x1 = round($x1); $y1=round($y1); - if ( !empty($p[2]) && $p[2]->GetType() > -1 ) { - // Make a plot mark legend - $aImg->SetColor($p[1]); - if( is_string($p[3]) || $p[3]>0 ) { - $aImg->SetLineStyle($p[3]); - $aImg->StyleLine($x1-$this->mark_abs_hsize,$y1+$f2,$x1+$this->mark_abs_hsize,$y1+$f2); - } - // Stroke a mark with the standard size - // (As long as it is not an image mark ) - if( $p[2]->GetType() != MARK_IMG ) { - - // Clear any user callbacks since we ont want them called for - // the legend marks - $p[2]->iFormatCallback = ''; - $p[2]->iFormatCallback2 = ''; - - // Since size for circles is specified as the radius - // this means that we must half the size to make the total - // width behave as the other marks - if( $p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE ) { - $p[2]->SetSize(min($this->mark_abs_vsize,$this->mark_abs_hsize)/2); - $p[2]->Stroke($aImg,$x1,$y1+$f2); - } - else { - $p[2]->SetSize(min($this->mark_abs_vsize,$this->mark_abs_hsize)); - $p[2]->Stroke($aImg,$x1,$y1+$f2); - } - } - } - elseif ( !empty($p[2]) && (is_string($p[3]) || $p[3]>0 ) ) { - // Draw a styled line - $aImg->SetColor($p[1]); - $aImg->SetLineStyle($p[3]); - $aImg->StyleLine($x1-1,$y1+$f2,$x1+$this->mark_abs_hsize,$y1+$f2); - $aImg->StyleLine($x1-1,$y1+$f2+1,$x1+$this->mark_abs_hsize,$y1+$f2+1); - } - else { - // Draw a colored box - $color = $p[1] ; - // We make boxes slightly larger to better show - $boxsize = min($this->mark_abs_vsize,$this->mark_abs_hsize) + 2 ; - $ym = round($y1 + $f2 - $boxsize/2); - // We either need to plot a gradient or a - // pattern. To differentiate we use a kludge. - // Patterns have a p[3] value of < -100 - if( $p[3] < -100 ) { - // p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity - if( $patternFactory == null ) { - $patternFactory = new RectPatternFactory(); - } - $prect = $patternFactory->Create($p[1][0],$p[1][1],1); - $prect->SetBackground($p[1][3]); - $prect->SetDensity($p[1][2]+1); - $prect->SetPos(new Rectangle($x1,$ym,$boxsize,$boxsize)); - $prect->Stroke($aImg); - $prect=null; - } - else { - if( is_array($color) && count($color)==2 ) { - // The client want a gradient color - $grad->FilledRectangle($x1,$ym, - $x1+$boxsize,$ym+$boxsize, - $color[0],$color[1],-$p[3]); - } - else { - $aImg->SetColor($p[1]); - $aImg->FilledRectangle($x1,$ym,$x1+$boxsize,$ym+$boxsize); - } - $aImg->SetColor($this->color); - $aImg->SetLineWeight($fillBoxFrameWeight); - $aImg->Rectangle($x1,$ym,$x1+$boxsize,$ym+$boxsize); - } - } - $aImg->SetColor($this->font_color); - $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); - $aImg->SetTextAlign("left","top"); - $aImg->StrokeText(round($x1+$this->mark_abs_hsize+$this->xmargin),$y1,$p[0]); - - // Add CSIM for Legend if defined - if( !empty($p[4]) ) { - - $xe = $x1 + $this->xmargin+$this->mark_abs_hsize+$aImg->GetTextWidth($p[0]); - $ye = $y1 + max($this->mark_abs_vsize,$aImg->GetTextHeight($p[0])); - $coords = "$x1,$y1,$xe,$y1,$xe,$ye,$x1,$ye"; - if( ! empty($p[4]) ) { - $this->csimareas .= "csimareas .= " target=\"".$p[6]."\""; - } - - if( !empty($p[5]) ) { - $tmp=sprintf($p[5],$p[0]); - $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimareas .= " />\n"; - } - } - if( $i >= $this->layout_n ) { - $x1 = $xp+$this->mark_abs_hsize+$this->xlmargin; - $y1 += $rowheight[$row++]; - $i = 1; - } - else { - $x1 += $colwidth[($i-1) % $numcolumns] ; - ++$i; - } - } - } -} // Class - //=================================================== // CLASS DisplayValue @@ -5985,111 +4992,130 @@ class Legend { class DisplayValue { public $margin=5; public $show=false; - public $valign="",$halign="center"; - public $format="%.1f",$negformat=""; + public $valign='',$halign='center'; + public $format='%.1f',$negformat=''; private $ff=FF_FONT1,$fs=FS_NORMAL,$fsize=10; private $iFormCallback=''; private $angle=0; - private $color="navy",$negcolor=""; + private $color='navy',$negcolor=''; private $iHideZero=false; + public $txt=null; - function Show($aFlag=true) { - $this->show=$aFlag; + function __construct() { + $this->txt = new Text(); } - function SetColor($aColor,$aNegcolor="") { - $this->color = $aColor; - $this->negcolor = $aNegcolor; + function Show($aFlag=true) { + $this->show=$aFlag; + } + + function SetColor($aColor,$aNegcolor='') { + $this->color = $aColor; + $this->negcolor = $aNegcolor; } function SetFont($aFontFamily,$aFontStyle=FS_NORMAL,$aFontSize=10) { - $this->ff=$aFontFamily; - $this->fs=$aFontStyle; - $this->fsize=$aFontSize; + $this->ff=$aFontFamily; + $this->fs=$aFontStyle; + $this->fsize=$aFontSize; } function ApplyFont($aImg) { - $aImg->SetFont($this->ff,$this->fs,$this->fsize); + $aImg->SetFont($this->ff,$this->fs,$this->fsize); } function SetMargin($aMargin) { - $this->margin = $aMargin; + $this->margin = $aMargin; } function SetAngle($aAngle) { - $this->angle = $aAngle; + $this->angle = $aAngle; } function SetAlign($aHAlign,$aVAlign='') { - $this->halign = $aHAlign; - $this->valign = $aVAlign; + $this->halign = $aHAlign; + $this->valign = $aVAlign; } - function SetFormat($aFormat,$aNegFormat="") { - $this->format= $aFormat; - $this->negformat= $aNegFormat; + function SetFormat($aFormat,$aNegFormat='') { + $this->format= $aFormat; + $this->negformat= $aNegFormat; } function SetFormatCallback($aFunc) { - $this->iFormCallback = $aFunc; + $this->iFormCallback = $aFunc; } function HideZero($aFlag=true) { - $this->iHideZero=$aFlag; + $this->iHideZero=$aFlag; } function Stroke($img,$aVal,$x,$y) { - - if( $this->show ) - { - if( $this->negformat=="" ) $this->negformat=$this->format; - if( $this->negcolor=="" ) $this->negcolor=$this->color; - if( $aVal===NULL || (is_string($aVal) && ($aVal=="" || $aVal=="-" || $aVal=="x" ) ) ) - return; + if( $this->show ) + { + if( $this->negformat=='' ) { + $this->negformat=$this->format; + } + if( $this->negcolor=='' ) { + $this->negcolor=$this->color; + } - if( is_numeric($aVal) && $aVal==0 && $this->iHideZero ) { - return; - } + if( $aVal===NULL || (is_string($aVal) && ($aVal=='' || $aVal=='-' || $aVal=='x' ) ) ) { + return; + } - // Since the value is used in different cirumstances we need to check what - // kind of formatting we shall use. For example, to display values in a line - // graph we simply display the formatted value, but in the case where the user - // has already specified a text string we don't fo anything. - if( $this->iFormCallback != '' ) { - $f = $this->iFormCallback; - $sval = call_user_func($f,$aVal); - } - elseif( is_numeric($aVal) ) { - if( $aVal >= 0 ) - $sval=sprintf($this->format,$aVal); - else - $sval=sprintf($this->negformat,$aVal); - } - else - $sval=$aVal; + if( is_numeric($aVal) && $aVal==0 && $this->iHideZero ) { + return; + } - $y = $y-sign($aVal)*$this->margin; + // Since the value is used in different cirumstances we need to check what + // kind of formatting we shall use. For example, to display values in a line + // graph we simply display the formatted value, but in the case where the user + // has already specified a text string we don't fo anything. + if( $this->iFormCallback != '' ) { + $f = $this->iFormCallback; + $sval = call_user_func($f,$aVal); + } + elseif( is_numeric($aVal) ) { + if( $aVal >= 0 ) { + $sval=sprintf($this->format,$aVal); + } + else { + $sval=sprintf($this->negformat,$aVal); + } + } + else { + $sval=$aVal; + } - $txt = new Text($sval,$x,$y); - $txt->SetFont($this->ff,$this->fs,$this->fsize); - if( $this->valign == "" ) { - if( $aVal >= 0 ) - $valign = "bottom"; - else - $valign = "top"; - } - else - $valign = $this->valign; - $txt->Align($this->halign,$valign); + $y = $y-sign($aVal)*$this->margin; - $txt->SetOrientation($this->angle); - if( $aVal > 0 ) - $txt->SetColor($this->color); - else - $txt->SetColor($this->negcolor); - $txt->Stroke($img); - } + $this->txt->Set($sval); + $this->txt->SetPos($x,$y); + $this->txt->SetFont($this->ff,$this->fs,$this->fsize); + if( $this->valign == '' ) { + if( $aVal >= 0 ) { + $valign = "bottom"; + } + else { + $valign = "top"; + } + } + else { + $valign = $this->valign; + } + $this->txt->Align($this->halign,$valign); + + $this->txt->SetOrientation($this->angle); + if( $aVal > 0 ) { + $this->txt->SetColor($this->color); + } + else { + $this->txt->SetColor($this->negcolor); + } + $this->txt->Stroke($img); + } } } @@ -6102,289 +5128,237 @@ class Plot { public $value; public $legend=''; public $coords=array(); - public $color="black"; + public $color='black'; public $hidelegend=false; public $line_weight=1; public $csimtargets=array(),$csimwintargets=array(); // Array of targets for CSIM - public $csimareas=""; // Resultant CSIM area tags - public $csimalts=null; // ALT:s for corresponding target + public $csimareas=''; // Resultant CSIM area tags + public $csimalts=null; // ALT:s for corresponding target public $legendcsimtarget='',$legendcsimwintarget=''; public $legendcsimalt=''; - protected $weight=1; + protected $weight=1; protected $center=false; -//--------------- -// CONSTRUCTOR - function Plot($aDatay,$aDatax=false) { - $this->numpoints = count($aDatay); - if( $this->numpoints==0 ) - JpGraphError::RaiseL(25121);//("Empty input data array specified for plot. Must have at least one data point."); - $this->coords[0]=$aDatay; - if( is_array($aDatax) ) { - $this->coords[1]=$aDatax; - $n = count($aDatax); - for($i=0; $i < $n; ++$i ) { - if( !is_numeric($aDatax[$i]) ) { - JpGraphError::RaiseL(25070); - } - } - } - $this->value = new DisplayValue(); - } -//--------------- -// PUBLIC METHODS + function __construct($aDatay,$aDatax=false) { + $this->numpoints = count($aDatay); + if( $this->numpoints==0 ) { + JpGraphError::RaiseL(25121);//("Empty input data array specified for plot. Must have at least one data point."); + } + $this->coords[0]=$aDatay; + if( is_array($aDatax) ) { + $this->coords[1]=$aDatax; + $n = count($aDatax); + for( $i=0; $i < $n; ++$i ) { + if( !is_numeric($aDatax[$i]) ) { + JpGraphError::RaiseL(25070); + } + } + } + $this->value = new DisplayValue(); + } // Stroke the plot // "virtual" function which must be implemented by // the subclasses function Stroke($aImg,$aXScale,$aYScale) { - JpGraphError::RaiseL(25122);//("JpGraph: Stroke() must be implemented by concrete subclass to class Plot"); + JpGraphError::RaiseL(25122);//("JpGraph: Stroke() must be implemented by concrete subclass to class Plot"); } function HideLegend($f=true) { - $this->hidelegend = $f; + $this->hidelegend = $f; } function DoLegend($graph) { - if( !$this->hidelegend ) - $this->Legend($graph); + if( !$this->hidelegend ) + $this->Legend($graph); } function StrokeDataValue($img,$aVal,$x,$y) { - $this->value->Stroke($img,$aVal,$x,$y); + $this->value->Stroke($img,$aVal,$x,$y); } - - // Set href targets for CSIM + + // Set href targets for CSIM function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') { - $this->csimtargets=$aTargets; - $this->csimwintargets=$aWinTargets; - $this->csimalts=$aAlts; + $this->csimtargets=$aTargets; + $this->csimwintargets=$aWinTargets; + $this->csimalts=$aAlts; } - + // Get all created areas function GetCSIMareas() { - return $this->csimareas; - } - + return $this->csimareas; + } + // "Virtual" function which gets called before any scale // or axis are stroked used to do any plot specific adjustment function PreStrokeAdjust($aGraph) { - if( substr($aGraph->axtype,0,4) == "text" && (isset($this->coords[1])) ) - JpGraphError::RaiseL(25123);//("JpGraph: You can't use a text X-scale with specified X-coords. Use a \"int\" or \"lin\" scale instead."); - return true; + if( substr($aGraph->axtype,0,4) == "text" && (isset($this->coords[1])) ) { + JpGraphError::RaiseL(25123);//("JpGraph: You can't use a text X-scale with specified X-coords. Use a \"int\" or \"lin\" scale instead."); + } + return true; } - + + // Virtual function to the the concrete plot class to make any changes to the graph + // and scale before the stroke process begins + function PreScaleSetup($aGraph) { + // Empty + } + // Get minimum values in plot function Min() { - if( isset($this->coords[1]) ) - $x=$this->coords[1]; - else - $x=""; - if( $x != "" && count($x) > 0 ) { - $xm=min($x); - } - else - $xm=0; - $y=$this->coords[0]; - $cnt = count($y); - if( $cnt > 0 ) { - /* - if( ! isset($y[0]) ) { - JpGraphError('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)'); - } - $ym = $y[0]; - */ - $i=0; - while( $i<$cnt && !is_numeric($ym=$y[$i]) ) - $i++; - while( $i < $cnt) { - if( is_numeric($y[$i]) ) - $ym=min($ym,$y[$i]); - ++$i; - } - } - else - $ym=""; - return array($xm,$ym); + if( isset($this->coords[1]) ) { + $x=$this->coords[1]; + } + else { + $x=''; + } + if( $x != '' && count($x) > 0 ) { + $xm=min($x); + } + else { + $xm=0; + } + $y=$this->coords[0]; + $cnt = count($y); + if( $cnt > 0 ) { + $i=0; + while( $i<$cnt && !is_numeric($ym=$y[$i]) ) { + $i++; + } + while( $i < $cnt) { + if( is_numeric($y[$i]) ) { + $ym=min($ym,$y[$i]); + } + ++$i; + } + } + else { + $ym=''; + } + return array($xm,$ym); } - + // Get maximum value in plot function Max() { - if( isset($this->coords[1]) ) - $x=$this->coords[1]; - else - $x=""; + if( isset($this->coords[1]) ) { + $x=$this->coords[1]; + } + else { + $x=''; + } - if( $x!="" && count($x) > 0 ) - $xm=max($x); - else { - $xm = $this->numpoints-1; - } - $y=$this->coords[0]; - if( count($y) > 0 ) { - /* - if( !isset($y[0]) ) { - JpGraphError::Raise('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)'); -// $y[0] = 0; -// Change in 1.5.1 Don't treat this as an error any more. Just silently convert to 0 -// Change in 1.17 Treat his as an error again !! This is the right way to do !! - } - */ - $cnt = count($y); - $i=0; - while( $i<$cnt && !is_numeric($ym=$y[$i]) ) - $i++; - while( $i < $cnt ) { - if( is_numeric($y[$i]) ) - $ym=max($ym,$y[$i]); - ++$i; - } - } - else - $ym=""; - return array($xm,$ym); + if( $x!='' && count($x) > 0 ) { + $xm=max($x); + } + else { + $xm = $this->numpoints-1; + } + $y=$this->coords[0]; + if( count($y) > 0 ) { + $cnt = count($y); + $i=0; + while( $i<$cnt && !is_numeric($ym=$y[$i]) ) { + $i++; + } + while( $i < $cnt ) { + if( is_numeric($y[$i]) ) { + $ym=max($ym,$y[$i]); + } + ++$i; + } + } + else { + $ym=''; + } + return array($xm,$ym); } - + function SetColor($aColor) { - $this->color=$aColor; + $this->color=$aColor; } - + function SetLegend($aLegend,$aCSIM='',$aCSIMAlt='',$aCSIMWinTarget='') { - $this->legend = $aLegend; - $this->legendcsimtarget = $aCSIM; - $this->legendcsimwintarget = $aCSIMWinTarget; - $this->legendcsimalt = $aCSIMAlt; + $this->legend = $aLegend; + $this->legendcsimtarget = $aCSIM; + $this->legendcsimwintarget = $aCSIMWinTarget; + $this->legendcsimalt = $aCSIMAlt; } function SetWeight($aWeight) { - $this->weight=$aWeight; + $this->weight=$aWeight; } - + function SetLineWeight($aWeight=1) { - $this->line_weight=$aWeight; + $this->line_weight=$aWeight; } - + function SetCenter($aCenter=true) { - $this->center = $aCenter; + $this->center = $aCenter; } - + // This method gets called by Graph class to plot anything that should go // into the margin after the margin color has been set. function StrokeMargin($aImg) { - return true; + return true; } // Framework function the chance for each plot class to set a legend function Legend($aGraph) { - if( $this->legend != "" ) - $aGraph->legend->Add($this->legend,$this->color,"",0,$this->legendcsimtarget, - $this->legendcsimalt,$this->legendcsimwintarget); + if( $this->legend != '' ) { + $aGraph->legend->Add($this->legend,$this->color,'',0,$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } } - + } // Class -//=================================================== -// CLASS PlotLine -// Description: -// Data container class to hold properties for a static -// line that is drawn directly in the plot area. -// Usefull to add static borders inside a plot to show -// for example set-values -//=================================================== -class PlotLine { - public $scaleposition, $direction=-1; - protected $weight=1; - protected $color="black"; - private $legend='',$hidelegend=false, $legendcsimtarget='', $legendcsimalt='',$legendcsimwintarget=''; - private $iLineStyle='solid'; +// Provide a deterministic list of new colors whenever the getColor() method +// is called. Used to automatically set colors of plots. +class ColorFactory { -//--------------- -// CONSTRUCTOR - function PlotLine($aDir=HORIZONTAL,$aPos=0,$aColor="black",$aWeight=1) { - $this->direction = $aDir; - $this->color=$aColor; - $this->weight=$aWeight; - $this->scaleposition=$aPos; - } - -//--------------- -// PUBLIC METHODS + static private $iIdx = 0; + static private $iColorList = array( + 'black', + 'blue', + 'orange', + 'darkgreen', + 'red', + 'AntiqueWhite3', + 'aquamarine3', + 'azure4', + 'brown', + 'cadetblue3', + 'chartreuse4', + 'chocolate', + 'darkblue', + 'darkgoldenrod3', + 'darkorchid3', + 'darksalmon', + 'darkseagreen4', + 'deepskyblue2', + 'dodgerblue4', + 'gold3', + 'hotpink', + 'lawngreen', + 'lightcoral', + 'lightpink3', + 'lightseagreen', + 'lightslateblue', + 'mediumpurple', + 'olivedrab', + 'orangered1', + 'peru', + 'slategray', + 'yellow4', + 'springgreen2'); + static private $iNum = 33; - function SetLegend($aLegend,$aCSIM='',$aCSIMAlt='',$aCSIMWinTarget='') { - $this->legend = $aLegend; - $this->legendcsimtarget = $aCSIM; - $this->legendcsimwintarget = $aCSIMWinTarget; - $this->legendcsimalt = $aCSIMAlt; + static function getColor() { + if( ColorFactory::$iIdx >= ColorFactory::$iNum ) + ColorFactory::$iIdx = 0; + return ColorFactory::$iColorList[ColorFactory::$iIdx++]; } - function HideLegend($f=true) { - $this->hidelegend = $f; - } - - function SetPosition($aScalePosition) { - $this->scaleposition=$aScalePosition; - } - - function SetDirection($aDir) { - $this->direction = $aDir; - } - - function SetColor($aColor) { - $this->color=$aColor; - } - - function SetWeight($aWeight) { - $this->weight=$aWeight; - } - - function SetLineStyle($aStyle) { - $this->iLineStyle = $aStyle; - } - -//--------------- -// PRIVATE METHODS - - function DoLegend(&$graph) { - if( !$this->hidelegend ) - $this->Legend($graph); - } - - // Framework function the chance for each plot class to set a legend - function Legend(&$aGraph) { - if( $this->legend != "" ) { - $dummyPlotMark = new PlotMark(); - $lineStyle = 1; - $aGraph->legend->Add($this->legend,$this->color,$dummyPlotMark,$lineStyle, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - } - - function PreStrokeAdjust($aGraph) { - // Nothing to do - } - - function Stroke($aImg,$aXScale,$aYScale) { - $aImg->SetColor($this->color); - $aImg->SetLineWeight($this->weight); - $oldStyle = $aImg->SetLineStyle($this->iLineStyle); - if( $this->direction == VERTICAL ) { - $ymin_abs=$aYScale->Translate($aYScale->GetMinVal()); - $ymax_abs=$aYScale->Translate($aYScale->GetMaxVal()); - $xpos_abs=$aXScale->Translate($this->scaleposition); - $aImg->StyleLine($xpos_abs, $ymin_abs, $xpos_abs, $ymax_abs); - } - elseif( $this->direction == HORIZONTAL ) { - $xmin_abs=$aXScale->Translate($aXScale->GetMinVal()); - $xmax_abs=$aXScale->Translate($aXScale->GetMaxVal()); - $ypos_abs=$aYScale->Translate($this->scaleposition); - $aImg->StyleLine($xmin_abs, $ypos_abs, $xmax_abs, $ypos_abs); - } - else { - JpGraphError::RaiseL(25125);//(" Illegal direction for static line"); - } - $aImg->SetLineStyle($oldStyle); - } } // diff --git a/libs/jpgraph/jpgraph_antispam-digits.php b/libs/jpgraph/jpgraph_antispam-digits.php index a73081a..f3cff8a 100644 --- a/libs/jpgraph/jpgraph_antispam-digits.php +++ b/libs/jpgraph/jpgraph_antispam-digits.php @@ -1,9 +1,9 @@ digits['6'][0]= 645 ; - $this->digits['6'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'. - 'BAQEBwAAAAAAAAABAgMEAAURBiESIjFRBxMUQRUWMmFTYnGRkrHC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAA'. - 'AAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwDslwiR3oDku8ONttsAvDiVyMcO/ET7ke5/aoOz6k1Vr5htNjW7a7M1yO3NTQU9JUDu'. - 'GgrlSn8xyf6p4gXaHJvNps9/mKZtSkGdMjRwpfqAFBLLACRlZUrJONsI2717No1lbZ10kx7XGnRpKWQ/6GVGMfzEJ5VFIVtsOH6e'. - 'wyKVhYsia0y22pLThSkJK1uniVgdThOM0ol+StIUhpopIyCFq3H8aUVCwnG3PGe4Rp6fLXJtMdyM0ojcIWvIz3HFnAPfrWTXb6GN'. - 'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'. - 'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ; + function __construct() { + //========================================================== + // d6-small.jpg + //========================================================== + $this->digits['6'][0]= 645 ; + $this->digits['6'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'. + 'BAQEBwAAAAAAAAABAgMEAAURBiESIjFRBxMUQRUWMmFTYnGRkrHC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAA'. + 'AAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwDslwiR3oDku8ONttsAvDiVyMcO/ET7ke5/aoOz6k1Vr5htNjW7a7M1yO3NTQU9JUDu'. + 'GgrlSn8xyf6p4gXaHJvNps9/mKZtSkGdMjRwpfqAFBLLACRlZUrJONsI2717No1lbZ10kx7XGnRpKWQ/6GVGMfzEJ5VFIVtsOH6e'. + 'wyKVhYsia0y22pLThSkJK1uniVgdThOM0ol+StIUhpopIyCFq3H8aUVCwnG3PGe4Rp6fLXJtMdyM0ojcIWvIz3HFnAPfrWTXb6GN'. + 'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'. + 'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ; -//========================================================== -// d2-small.jpg -//========================================================== - $this->digits['2'][0]= 606 ; - $this->digits['2'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'. - 'BAYDAAAAAAAAAAIBAwQABQYRIRIxQVFhcQcTFSJSU5GU0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQACAwEAAAAAAAAA'. - 'AAAAAAAAARESUUH/2gAMAwEAAhEDEQA/AOqXm/Q8dxmOL4PPSnCSNFixx6nXnkXgRT3Te17JWbGsveueSyLZdbPItNxOKLzTLjou'. - 'gYCSoSoY8ISKSbFeUrzkdlnTL1YshskiErkQnFEZaF8kkdBBVdjyi6RNL5+9F486eS/ECVkcBtDt1vZcho5viS8ZCp9C9tAIAm/F'. - 'VoPRU+HRtJ5JVRP1kP0PfwP+1VKrHBMliXG4Nw8VgE4xGkuqk2S1wTUNEVdIvgpL9iL6KtNxY7WOwo9tt0RCitj0sR2uCbFPPzH1'. - '7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'. - 'DLZ6f//Z' ; + //========================================================== + // d2-small.jpg + //========================================================== + $this->digits['2'][0]= 606 ; + $this->digits['2'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'. + 'BAYDAAAAAAAAAAIBAwQABQYRIRIxQVFhcQcTFSJSU5GU0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQACAwEAAAAAAAAA'. + 'AAAAAAAAARESUUH/2gAMAwEAAhEDEQA/AOqXm/Q8dxmOL4PPSnCSNFixx6nXnkXgRT3Te17JWbGsveueSyLZdbPItNxOKLzTLjou'. + 'gYCSoSoY8ISKSbFeUrzkdlnTL1YshskiErkQnFEZaF8kkdBBVdjyi6RNL5+9F486eS/ECVkcBtDt1vZcho5viS8ZCp9C9tAIAm/F'. + 'VoPRU+HRtJ5JVRP1kP0PfwP+1VKrHBMliXG4Nw8VgE4xGkuqk2S1wTUNEVdIvgpL9iL6KtNxY7WOwo9tt0RCitj0sR2uCbFPPzH1'. + '7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'. + 'DLZ6f//Z' ; -//========================================================== -// d9-small.jpg -//========================================================== - $this->digits['9'][0]= 680 ; - $this->digits['9'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'. - 'AgYBBQAAAAAAAAABAgMEBQYRABIhE1EUIjEzQUIHMlJhcdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/xAAYEQEAAwEAAAAAAAAA'. - 'AAAAAAAAAREhQf/aAAwDAQACEQMRAD8AkK7brF6X7XpMeGoKhFMLEeT4ZUheEhanF4OcZ2pTgDykk92bZpdCsi7aezLjxkIPUZiV'. - 'RSCy8hah7EkZ27yM7V+iscal5bE22Lon1qNDmSKROd8Sl+Ix1lMOlIS4HGgQpbStoUCnlJz8HmsXtW3Lst2rmBAelLMRRekOwnYz'. - 'Edls9QKKnOVLyk7UgcbzzrdBthqEJJwZbAI4x1U/7o1TaFa9lG36aXaZTy54VrcXUgrzsGdx+T30aNydweqVw1GS87T6Lb86Q4ha'. - 'my/IAYjZBx+snKk99oOQMf1AViE65SY348hzFy6hPKnqtKz7DC1lbqyPrvJKUJ7H+M6Wrt3InP7o1brFNp4bCDGhxGAsqz69VSiQ'. - 'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'. - '1V1//9k=' ; + //========================================================== + // d9-small.jpg + //========================================================== + $this->digits['9'][0]= 680 ; + $this->digits['9'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'. + 'AgYBBQAAAAAAAAABAgMEBQYRABIhE1EUIjEzQUIHMlJhcdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/xAAYEQEAAwEAAAAAAAAA'. + 'AAAAAAAAAREhQf/aAAwDAQACEQMRAD8AkK7brF6X7XpMeGoKhFMLEeT4ZUheEhanF4OcZ2pTgDykk92bZpdCsi7aezLjxkIPUZiV'. + 'RSCy8hah7EkZ27yM7V+iscal5bE22Lon1qNDmSKROd8Sl+Ix1lMOlIS4HGgQpbStoUCnlJz8HmsXtW3Lst2rmBAelLMRRekOwnYz'. + 'Edls9QKKnOVLyk7UgcbzzrdBthqEJJwZbAI4x1U/7o1TaFa9lG36aXaZTy54VrcXUgrzsGdx+T30aNydweqVw1GS87T6Lb86Q4ha'. + 'my/IAYjZBx+snKk99oOQMf1AViE65SY348hzFy6hPKnqtKz7DC1lbqyPrvJKUJ7H+M6Wrt3InP7o1brFNp4bCDGhxGAsqz69VSiQ'. + 'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'. + '1V1//9k=' ; -//========================================================== -// d5-small.jpg -//========================================================== - $this->digits['5'][0]= 632 ; - $this->digits['5'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'. - 'AQQCAwAAAAAAAAABAgMEBQYRABIhIkEUMVFhBxNCgaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABcRAQEBAQAAAAAAAAAAAAAA'. - 'AAABEUH/2gAMAwEAAhEDEQA/ANGvW4YVOeiRX5b4mv5Sin05IdlupPKdo/j2SO3+6TbPNQvOsTVz33KRT4csR3YUF7Dsh5OSFvug'. - 'kqG4FPBxnjxpvvi4KZb1pTpU+QwxUi2Y7ZIAefUk5ATxnB9/gbtL/wCH1UpuhPUlZlMVaQ0mS8zJjqZOPfc2TwpIUonI9tw40R1r'. - 'WNGq/wBdJR1XT3lqHBUnGCfkfWjRWs1ve249erQqQYjOtN1FqPUpCXQ4WIzQSsJwT0UpRwQPG0nzqyuNHobjsl9kBuWqoOoXtT1/'. - 'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'. - '8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ; + //========================================================== + // d5-small.jpg + //========================================================== + $this->digits['5'][0]= 632 ; + $this->digits['5'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'. + 'AQQCAwAAAAAAAAABAgMEBQYRABIhIkEUMVFhBxNCgaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABcRAQEBAQAAAAAAAAAAAAAA'. + 'AAABEUH/2gAMAwEAAhEDEQA/ANGvW4YVOeiRX5b4mv5Sin05IdlupPKdo/j2SO3+6TbPNQvOsTVz33KRT4csR3YUF7Dsh5OSFvug'. + 'kqG4FPBxnjxpvvi4KZb1pTpU+QwxUi2Y7ZIAefUk5ATxnB9/gbtL/wCH1UpuhPUlZlMVaQ0mS8zJjqZOPfc2TwpIUonI9tw40R1r'. + 'WNGq/wBdJR1XT3lqHBUnGCfkfWjRWs1ve249erQqQYjOtN1FqPUpCXQ4WIzQSsJwT0UpRwQPG0nzqyuNHobjsl9kBuWqoOoXtT1/'. + 'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'. + '8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ; -//========================================================== -// d1-small.jpg -//========================================================== - $this->digits['1'][0]= 646 ; - $this->digits['1'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'. - 'AwQBBQAAAAAAAAABAgMEBREABiESMUEHEyJRkSNCYXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAA'. - 'AAAAAAEREv/aAAwDAQACEQMRAD8A6jdd4WLbstILnc4Uq0VoWpkJknb6IjXLHJUePOlez923fcW4r1SxWlqC2UbdKirQif3Xw3yA'. - 'OFAGT09/kO3OmV3a20MFRf6lIYPcpy7yRRAzgxjIy2M8YwcdiBzpX6d22VNvUlTXsFkuwkrKqNSfnK7F8OTzwrAY+l5zoxKskudN'. - 'EgQPUT9PBkWF3DH+1GPxo1mLnRoAqF2VRgGOFmX/AAgY/GjRUP6hVMFv2FuFqUvUGrpDFJMBnpdyF5bsAQew7Hxzp6LZNT0yQ1DI'. - 'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'. - 'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ; + //========================================================== + // d1-small.jpg + //========================================================== + $this->digits['1'][0]= 646 ; + $this->digits['1'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'. + 'AwQBBQAAAAAAAAABAgMEBREABiESMUEHEyJRkSNCYXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAA'. + 'AAAAAAEREv/aAAwDAQACEQMRAD8A6jdd4WLbstILnc4Uq0VoWpkJknb6IjXLHJUePOlez923fcW4r1SxWlqC2UbdKirQif3Xw3yA'. + 'OFAGT09/kO3OmV3a20MFRf6lIYPcpy7yRRAzgxjIy2M8YwcdiBzpX6d22VNvUlTXsFkuwkrKqNSfnK7F8OTzwrAY+l5zoxKskudN'. + 'EgQPUT9PBkWF3DH+1GPxo1mLnRoAqF2VRgGOFmX/AAgY/GjRUP6hVMFv2FuFqUvUGrpDFJMBnpdyF5bsAQew7Hxzp6LZNT0yQ1DI'. + 'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'. + 'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ; -//========================================================== -// d8-small.jpg -//========================================================== - $this->digits['8'][0]= 694 ; - $this->digits['8'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'. - 'AwMFAAAAAAAAAAECAwQFBhEAEiEUMVEHE0EVYYEiIzJCsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/EABcRAQEBAQAAAAAAAAAA'. - 'AAAAAAABERL/2gAMAwEAAhEDEQA/AKL6gVVUa0i1T5QjvTprUJMlxW4R9zgQXe/AH+kaWrntqlWjaq7gpcmotXAw82ht9yY4tch8'. - 'uAFC0k7VBXPGMY51ruiaue+bThIj+7NbWqS+7HDxajFf6AlB/k44o8ZOABk4xkL0X0tZiojKrlRuGRJjugqldSlKGf6t7BuUQe3J'. - '44xxxrA1a4KVJipLidri8uLHgqOcfjOPxo0o2hdDvS1CmV2Yl6fS5ioipIQR1CAlKkLKR2UUqAI8g6NRSwuuyHab6s1ufLI/Zai7'. - 'UBJOxhTS0+6B32pWSFH4CidOdWU0ukLiN1BLr0zG5Sdm3GRvcPhIT858DvjXNrVsSLnm/VIdTXS6tTnFsxZTSN3jchaTwps+O/z9'. - 'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'. - 'EylmLHQltptPZKQOBo1FzH//2Q==' ; + //========================================================== + // d8-small.jpg + //========================================================== + $this->digits['8'][0]= 694 ; + $this->digits['8'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'. + 'AwMFAAAAAAAAAAECAwQFBhEAEiEUMVEHE0EVYYEiIzJCsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/EABcRAQEBAQAAAAAAAAAA'. + 'AAAAAAABERL/2gAMAwEAAhEDEQA/AKL6gVVUa0i1T5QjvTprUJMlxW4R9zgQXe/AH+kaWrntqlWjaq7gpcmotXAw82ht9yY4tch8'. + 'uAFC0k7VBXPGMY51ruiaue+bThIj+7NbWqS+7HDxajFf6AlB/k44o8ZOABk4xkL0X0tZiojKrlRuGRJjugqldSlKGf6t7BuUQe3J'. + '44xxxrA1a4KVJipLidri8uLHgqOcfjOPxo0o2hdDvS1CmV2Yl6fS5ioipIQR1CAlKkLKR2UUqAI8g6NRSwuuyHab6s1ufLI/Zai7'. + 'UBJOxhTS0+6B32pWSFH4CidOdWU0ukLiN1BLr0zG5Sdm3GRvcPhIT858DvjXNrVsSLnm/VIdTXS6tTnFsxZTSN3jchaTwps+O/z9'. + 'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'. + 'EylmLHQltptPZKQOBo1FzH//2Q==' ; -//========================================================== -// d4-small.jpg -//========================================================== - $this->digits['4'][0]= 643 ; - $this->digits['4'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'. - 'BAMJAAAAAAAAAAECAwQFEQAGEiETFDFBUmGBByIjUVNxobHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGBEBAAMBAAAAAAAA'. - 'AAAAAAAAAAERIVH/2gAMAwEAAhEDEQA/ANjM00Nxmt1xiWW31CZp5uJwoAAaOQ/n7qfcZHqO5my3q5XX7R6ijiqnNut9u4NyJ4yv'. - 'JJyjYr8Xhrn5g599J7x3ulBNU7Zo7dXXXcLQ8kURYi4epYtkALjOePv1nUvbLvV7P3BZm3DR3eh88Kp7pVzBZI6iUhGWRRGWwE44'. - 'HX3V+uiL1uHgt+vL/H+aNJQ3CSeCOaFqSaJ1DJKs/TqRkMOvQjvRorHE4pRDLNWLGlRHGUeYIORXs9e5B7OP31E0fmdyb/t0DJ4Q'. - '27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'. - 'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ; + //========================================================== + // d4-small.jpg + //========================================================== + $this->digits['4'][0]= 643 ; + $this->digits['4'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'. + 'BAMJAAAAAAAAAAECAwQFEQAGEiETFDFBUmGBByIjUVNxobHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGBEBAAMBAAAAAAAA'. + 'AAAAAAAAAAERIVH/2gAMAwEAAhEDEQA/ANjM00Nxmt1xiWW31CZp5uJwoAAaOQ/n7qfcZHqO5my3q5XX7R6ijiqnNut9u4NyJ4yv'. + 'JJyjYr8Xhrn5g599J7x3ulBNU7Zo7dXXXcLQ8kURYi4epYtkALjOePv1nUvbLvV7P3BZm3DR3eh88Kp7pVzBZI6iUhGWRRGWwE44'. + 'HX3V+uiL1uHgt+vL/H+aNJQ3CSeCOaFqSaJ1DJKs/TqRkMOvQjvRorHE4pRDLNWLGlRHGUeYIORXs9e5B7OP31E0fmdyb/t0DJ4Q'. + '27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'. + 'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ; -//========================================================== -// d7-small.jpg -//========================================================== - $this->digits['7'][0]= 658 ; - $this->digits['7'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'. - 'BAQGAwAAAAAAAAABAgMEBREABiExEhMiQSMyUXEHFBclVJFhk9L/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEAAwAA'. - 'AAAAAAAAAAAAAAEREiFR/9oADAMBAAIRAxEAPwDXq9mCjZeQ05VZ5ZST4bfEpa3VdglCbqUe+g9MZ5Uq7V8415WXoMSdQ6etgSps'. - '19wpkCMDZKUpv0FZvbi1NzpYasMDLDUbMVXrtQdbeeU23xLWkj5RlLYK0J7anW9gbAjCzkOtsVSUJUdtc6dVZK51UeaFm4LKbhpC'. - 'l7EhIFkDW974GbRI2XorUVls1OTdKAOqUpR0Hc3198GITQ6k+hLwrEpoODiDenRfW23bBicg78JXxPpD0mgVOW5PAivNNpahsPW5'. - '8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'. - 'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ; + //========================================================== + // d7-small.jpg + //========================================================== + $this->digits['7'][0]= 658 ; + $this->digits['7'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'. + 'BAQGAwAAAAAAAAABAgMEBREABiExEhMiQSMyUXEHFBclVJFhk9L/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEAAwAA'. + 'AAAAAAAAAAAAAAEREiFR/9oADAMBAAIRAxEAPwDXq9mCjZeQ05VZ5ZST4bfEpa3VdglCbqUe+g9MZ5Uq7V8415WXoMSdQ6etgSps'. + '19wpkCMDZKUpv0FZvbi1NzpYasMDLDUbMVXrtQdbeeU23xLWkj5RlLYK0J7anW9gbAjCzkOtsVSUJUdtc6dVZK51UeaFm4LKbhpC'. + 'l7EhIFkDW974GbRI2XorUVls1OTdKAOqUpR0Hc3198GITQ6k+hLwrEpoODiDenRfW23bBicg78JXxPpD0mgVOW5PAivNNpahsPW5'. + '8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'. + 'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ; -//========================================================== -// d3-small.jpg -//========================================================== - $this->digits['3'][0]= 662 ; - $this->digits['3'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'. - 'AwMDBQEAAAAAAAABAgMEBREABhIhMUEiMmETFZEHFkJDUdH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAA'. - 'AAAAAAAAEQExQf/aAAwDAQACEQMRAD8A0vclruBdk3VVLLUNssGRJsZSCtqOjlgJAHvcOD6c4HnOdIbcttw1W5P29cFEhuawqTXS'. - 'VsJjnCMBxKkJJx7goAde+ceJfdNxU0UNlyymyXHi6kxWUNl1S3EnkAEIHX2nv86qtTuZr9Q9+1VhRsOoYpYcgSVyAE/TdewkJxnK'. - 'sBCjkdPGpnOtFMd3PqsXgfOAgD8Y0aX+11H9rDDjn8lr9yj5J+dGqsqxaw6Cc9cQZU4Sp7zTJsIrKlcUEKwhSin1JABI45GUjqOu'. - 'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'. - 'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ; - } + //========================================================== + // d3-small.jpg + //========================================================== + $this->digits['3'][0]= 662 ; + $this->digits['3'][1]= + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'. + 'AwMDBQEAAAAAAAABAgMEBREABhIhMUEiMmETFZEHFkJDUdH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAA'. + 'AAAAAAAAEQExQf/aAAwDAQACEQMRAD8A0vclruBdk3VVLLUNssGRJsZSCtqOjlgJAHvcOD6c4HnOdIbcttw1W5P29cFEhuawqTXS'. + 'VsJjnCMBxKkJJx7goAde+ceJfdNxU0UNlyymyXHi6kxWUNl1S3EnkAEIHX2nv86qtTuZr9Q9+1VhRsOoYpYcgSVyAE/TdewkJxnK'. + 'sBCjkdPGpnOtFMd3PqsXgfOAgD8Y0aX+11H9rDDjn8lr9yj5J+dGqsqxaw6Cc9cQZU4Sp7zTJsIrKlcUEKwhSin1JABI45GUjqOu'. + 'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'. + 'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ; + } } class AntiSpam { var $iNumber=''; - function AntiSpam($aNumber='') { - $this->iNumber = $aNumber; + function __construct($aNumber='') { + $this->iNumber = $aNumber; } function Rand($aLen) { - $d=''; - for($i=0; $i < $aLen; ++$i) { - $d .= rand(1,9); - } - $this->iNumber = $d; - return $d; + $d=''; + for($i=0; $i < $aLen; ++$i) { + $d .= rand(1,9); + } + $this->iNumber = $d; + return $d; } function Stroke() { - $n=strlen($this->iNumber); - for($i=0; $i < $n; ++$i ) { - if( !is_numeric($this->iNumber[$i]) || $this->iNumber[$i]==0 ) { - return false; - } - } + $n=strlen($this->iNumber); + for($i=0; $i < $n; ++$i ) { + if( !is_numeric($this->iNumber[$i]) || $this->iNumber[$i]==0 ) { + return false; + } + } - $dd = new HandDigits(); - $n = strlen($this->iNumber); - $img = @imagecreatetruecolor($n*$dd->iWidth, $dd->iHeight); - if( $img < 1 ) { - return false; - } - $start=0; - for($i=0; $i < $n; ++$i ) { - $size = $dd->digits[$this->iNumber[$i]][0]; - $dimg = imagecreatefromstring(base64_decode($dd->digits[$this->iNumber[$i]][1])); - imagecopy($img,$dimg,$start,0,0,0,imagesx($dimg), $dd->iHeight); - $start += imagesx($dimg); - } - $resimg = @imagecreatetruecolor($start+4, $dd->iHeight+4); - if( $resimg < 1 ) { - return false; - } - imagecopy($resimg,$img,2,2,0,0,$start, $dd->iHeight); - header("Content-type: image/jpeg"); - imagejpeg($resimg); - return true; + $dd = new HandDigits(); + $n = strlen($this->iNumber); + $img = @imagecreatetruecolor($n*$dd->iWidth, $dd->iHeight); + if( $img < 1 ) { + return false; + } + $start=0; + for($i=0; $i < $n; ++$i ) { + $size = $dd->digits[$this->iNumber[$i]][0]; + $dimg = imagecreatefromstring(base64_decode($dd->digits[$this->iNumber[$i]][1])); + imagecopy($img,$dimg,$start,0,0,0,imagesx($dimg), $dd->iHeight); + $start += imagesx($dimg); + } + $resimg = @imagecreatetruecolor($start+4, $dd->iHeight+4); + if( $resimg < 1 ) { + return false; + } + imagecopy($resimg,$img,2,2,0,0,$start, $dd->iHeight); + header("Content-type: image/jpeg"); + imagejpeg($resimg); + return true; } } diff --git a/libs/jpgraph/jpgraph_antispam.php b/libs/jpgraph/jpgraph_antispam.php index d83aed9..e9c995a 100644 --- a/libs/jpgraph/jpgraph_antispam.php +++ b/libs/jpgraph/jpgraph_antispam.php @@ -1,9 +1,9 @@ chars['j'][0]= 658 ; -$this->chars['j'][1]= + //========================================================== + // lj-small.jpg + //========================================================== + $this->chars['j'][0]= 658 ; + $this->chars['j'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUGBAf/xAAsEAACAQMDAwMBCQAAAAAAAAAB'. @@ -29,11 +29,11 @@ $this->chars['j'][1]= 'jEoKiOecXBqh2TDDYIXLKuP6549xk8auI6aJqV45oknWdNswkAIkGMYIxjGO2NR1F0LZY5qkWqkS1xrM0M8lMSJpY+TGrnJiQ577'. 'cEgeNHhi7D3qC3UN69M8tIakRhgrh9o748+eNGtcCiKjjpkQKlMTEg3ZwoxtHHtgfTRpYXArvp//2Q==' ; -//========================================================== -// lf-small.jpg -//========================================================== -$this->chars['f'][0]= 633 ; -$this->chars['f'][1]= + //========================================================== + // lf-small.jpg + //========================================================== + $this->chars['f'][0]= 633 ; + $this->chars['f'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQFBgcC/8QAKxAAAgEDAwMCBQUAAAAAAAAA'. @@ -44,11 +44,11 @@ $this->chars['f'][1]= 'aNItzr4usVNdG3S0rmRYAVwEUmyjyQLZ11x7aF4zs9DQOyzml29I2cLa/pixIHi99DFCtU9dFuLIaijo9qiYPmR2mZmB9thgAHOD'. '4+mjUrURyrUNMZFEkkIOFuFAbsP9d/OjVIQ6Vh4tP//Z' ; -//========================================================== -// lb-small.jpg -//========================================================== -$this->chars['b'][0]= 645 ; -$this->chars['b'][1]= + //========================================================== + // lb-small.jpg + //========================================================== + $this->chars['b'][0]= 645 ; + $this->chars['b'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYCAwUH/8QAKxAAAQMDAwMDAwUAAAAAAAAA'. @@ -59,11 +59,11 @@ $this->chars['b'][1]= 'HTG/CWx5wPY8AADx2NYk3SL9wukvUjGobnBkORksIbjdMANozgEqSo8qJPGO/wAVO36IsjUmBIfZfuM7epZk3F9UhSSk5O0K9Kcq'. '8AcU3UzFuhUSBFud6nRXoz96mqmJZWg7m2dqUNhWBwdqQSP1UU5c/FFCn//Z' ; -//========================================================== -// d6-small.jpg -//========================================================== -$this->chars['6'][0]= 645 ; -$this->chars['6'][1]= + //========================================================== + // d6-small.jpg + //========================================================== + $this->chars['6'][0]= 645 ; + $this->chars['6'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'. @@ -74,11 +74,11 @@ $this->chars['6'][1]= 'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'. 'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ; -//========================================================== -// lx-small.jpg -//========================================================== -$this->chars['x'][0]= 650 ; -$this->chars['x'][1]= + //========================================================== + // lx-small.jpg + //========================================================== + $this->chars['x'][0]= 650 ; + $this->chars['x'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABMDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUHBgj/xAApEAABAwMDAwQCAwAAAAAAAAAB'. @@ -89,11 +89,11 @@ $this->chars['x'][1]= '9wQdveOEqBIB425xqhQuk8qo9UKlPrlRblw2ZBeCSVKW6CcoSrI2AGOT41SKzT4dYtmdS5bIXDZhNoWgbZJ94x8AYT/GkM03oNUc'. 'uKgwqtTZDTMOU0FttqRkoHggnPkEEHRrkJ6t1SlSHYUOc6zHaWrsbQrATk5/vRqK/9k=' ; -//========================================================== -// d2-small.jpg -//========================================================== -$this->chars['2'][0]= 606 ; -$this->chars['2'][1]= + //========================================================== + // d2-small.jpg + //========================================================== + $this->chars['2'][0]= 606 ; + $this->chars['2'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'. @@ -104,11 +104,11 @@ $this->chars['2'][1]= '7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'. 'DLZ6f//Z' ; -//========================================================== -// lm-small.jpg -//========================================================== -$this->chars['m'][0]= 649 ; -$this->chars['m'][1]= + //========================================================== + // lm-small.jpg + //========================================================== + $this->chars['m'][0]= 649 ; + $this->chars['m'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAcDBAUCBv/EAC0QAAICAQMCBAMJAAAAAAAA'. @@ -119,11 +119,11 @@ $this->chars['m'][1]= 'LNjJwM99bm67NB1Ht89KSxNXnr2hNDbiUc47K4KyD2GQMfmMjUnS+7vuIktTqPCaaWCqAMMojPFyw8hyYMQBnAwNJHYGXPTsW9VN'. 'jg2zf50W9zk524GAEihuz+xbIOD82jW5TkjtRPZkTkJ+4VgDhQfuj/f3OjUxl1f/2Q==' ; -//========================================================== -// lt-small.jpg -//========================================================== -$this->chars['t'][0]= 648 ; -$this->chars['t'][1]= + //========================================================== + // lt-small.jpg + //========================================================== + $this->chars['t'][0]= 648 ; + $this->chars['t'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQDBQYH/8QAJxAAAQMDAgYDAQEAAAAAAAAA'. @@ -134,11 +134,11 @@ $this->chars['t'][1]= '+zjtq6mtsyJjclxpKlUhSXEbkgkqWnBx4+J5e/zU0pZemPvJJQzEPDfQOrwwFY9AZ5eeYPLV6FwhoFYZuigxpkJeIjqAeIoAk9wA'. 'D46EnuD+6Nc1smDNrTlRkxqtMo1vzKhIdYgU9YDqVpISrLhHxSSd21I0aYyqP//Z' ; -//========================================================== -// li-small.jpg -//========================================================== -$this->chars['i'][0]= 639 ; -$this->chars['i'][1]= + //========================================================== + // li-small.jpg + //========================================================== + $this->chars['i'][0]= 639 ; + $this->chars['i'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABwAGBP/EACcQAAEEAQMEAgIDAAAAAAAAAAEC'. @@ -148,13 +148,13 @@ $this->chars['i'][1]= 't2fmEIckqIZaaKuSGG0lQ4gduRoFRHQ9AOgs2lOJbk9aSUlpjGvAWeSVH2VKq/2dFPw3IjyJe8s281ct3I9UoHJXGiQkD2STrSZ7'. 'Yf8AOl7JTdw5eOCz0jw3+LbYCfA9nz71msb8KMxoTGTw+5srjsipAdDqFBQBIuiOl6KrdYyJMyTCshlw2G3Fr/HiNqNNAqJJUoGl'. 'KND+h47km1bZwsvCbYYjycxIyK1qDv2yEi0hQviK8atKDcy9j//Z' ; - -//========================================================== -// lp-small.jpg -//========================================================== -$this->chars['p'][0]= 700 ; -$this->chars['p'][1]= + + //========================================================== + // lp-small.jpg + //========================================================== + $this->chars['p'][0]= 700 ; + $this->chars['p'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAECBAUGB//EAC8QAAEDAwMCBAMJAAAAAAAA'. @@ -166,11 +166,11 @@ $this->chars['p'][1]= 'eQukO3ejUxgENqTcfnE5WbkHiOnJ76N2IqI1DibabptS+zkZhtp90F2Y0S026EkAFK/qL46cXv65NVZDfxHmVCK4DE2/RX/lRFbA'. 'C5LwAyq2EtpHZI7mxPYDRqoctdESimz/2Q==' ; -//========================================================== -// le-small.jpg -//========================================================== -$this->chars['e'][0]= 700 ; -$this->chars['e'][1]= + //========================================================== + // le-small.jpg + //========================================================== + $this->chars['e'][0]= 700 ; + $this->chars['e'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABgDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYEBQcB/8QAKhAAAQMCBAUEAwEAAAAAAAAA'. @@ -182,11 +182,11 @@ $this->chars['e'][1]= 'TGc1ng6eYs0idczXUZscBBABWgEhEtfKNuUezwPnBhEuj8X2M21z9BR6NUX211Kk/UKKAjuhkPhL7XVf8vtgw7UPJlEyrDWFSYLb'. 'LBNF6qrzG6t0spEu6+fpL7YMXhUndp//2Q==' ; -//========================================================== -// la-small.jpg -//========================================================== -$this->chars['a'][0]= 730 ; -$this->chars['a'][1]= + //========================================================== + // la-small.jpg + //========================================================== + $this->chars['a'][0]= 730 ; + $this->chars['a'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABoDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwIFAQcCBwAAAAAAAAAB'. @@ -198,11 +198,11 @@ $this->chars['a'][1]= 'UGaD1c9HSR1HFUh9tJU45EBcAtcC9+P9wqbg8IAto9o81yputrVGpiUkgHKkqUTZI32+cKm1z1tIUgPBBAKQ4UBQH3uL3xmXSXep'. 'HVDtXStE5K5jlPU7PF3Q41+okJFkjgC+3OuNSYiSzHaLtRcW4UDMpLYSCbakDW3thhum5p//2Q==' ; -//========================================================== -// d9-small.jpg -//========================================================== -$this->chars['9'][0]= 680 ; -$this->chars['9'][1]= + //========================================================== + // d9-small.jpg + //========================================================== + $this->chars['9'][0]= 680 ; + $this->chars['9'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'. @@ -214,11 +214,11 @@ $this->chars['9'][1]= 'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'. '1V1//9k=' ; -//========================================================== -// d5-small.jpg -//========================================================== -$this->chars['5'][0]= 632 ; -$this->chars['5'][1]= + //========================================================== + // d5-small.jpg + //========================================================== + $this->chars['5'][0]= 632 ; + $this->chars['5'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'. @@ -229,11 +229,11 @@ $this->chars['5'][1]= 'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'. '8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ; -//========================================================== -// d1-small.jpg -//========================================================== -$this->chars['1'][0]= 646 ; -$this->chars['1'][1]= + //========================================================== + // d1-small.jpg + //========================================================== + $this->chars['1'][0]= 646 ; + $this->chars['1'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'. @@ -244,11 +244,11 @@ $this->chars['1'][1]= 'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'. 'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ; -//========================================================== -// ll-small.jpg -//========================================================== -$this->chars['l'][0]= 626 ; -$this->chars['l'][1]= + //========================================================== + // ll-small.jpg + //========================================================== + $this->chars['l'][0]= 626 ; + $this->chars['l'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYEBQf/xAArEAACAQIFAwIGAwAAAAAAAAAB'. @@ -260,11 +260,11 @@ $this->chars['l'][1]= 'Ivgw+T0yRRyyxIqNfkLcA8jt7YMKcBWn/9k=' ; -//========================================================== -// ls-small.jpg -//========================================================== -$this->chars['s'][0]= 701 ; -$this->chars['s'][1]= + //========================================================== + // ls-small.jpg + //========================================================== + $this->chars['s'][0]= 701 ; + $this->chars['s'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAMCBAUGB//EACwQAAEEAQIFAgUFAAAAAAAA'. @@ -276,11 +276,11 @@ $this->chars['s'][1]= '2k1HvlT3ri2sLOCgtsyJz6XEtBwZPAgJAGQMHUNPWKqWItsqh0UCFVyLeKhyLHQ2TMdHNVj+RKlAnJyfto1FW2ahgjrq6LYTFjjf'. 'lymUOLdWfJyoHA+gA7AAAaNPE3ysJdLT/9k=' ; -//========================================================== -// lh-small.jpg -//========================================================== -$this->chars['h'][0]= 677 ; -$this->chars['h'][1]= + //========================================================== + // lh-small.jpg + //========================================================== + $this->chars['h'][0]= 677 ; + $this->chars['h'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAIDBAUGB//EACwQAAIBAwMCBQIHAAAAAAAA'. @@ -293,11 +293,11 @@ $this->chars['h'][1]= '/9k=' ; -//========================================================== -// ld-small.jpg -//========================================================== -$this->chars['d'][0]= 681 ; -$this->chars['d'][1]= + //========================================================== + // ld-small.jpg + //========================================================== + $this->chars['d'][0]= 681 ; + $this->chars['d'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFBgH/xAAsEAABAwMEAAQFBQAAAAAAAAAB'. @@ -309,11 +309,11 @@ $this->chars['d'][1]= 'slsRKo0HwlODkBRzxj2AGoXTtpzIdQ8MbffUChz4NCPRaClAo9Mn6c7T3o13wytmo0K05VIqkiPJbizFiMWs4CTgnIIHOST796NL'. 'Ia1JX//Z' ; -//========================================================== -// d8-small.jpg -//========================================================== -$this->chars['8'][0]= 694 ; -$this->chars['8'][1]= + //========================================================== + // d8-small.jpg + //========================================================== + $this->chars['8'][0]= 694 ; + $this->chars['8'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'. @@ -325,11 +325,11 @@ $this->chars['8'][1]= 'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'. 'EylmLHQltptPZKQOBo1FzH//2Q==' ; -//========================================================== -// lz-small.jpg -//========================================================== -$this->chars['z'][0]= 690 ; -$this->chars['z'][1]= + //========================================================== + // lz-small.jpg + //========================================================== + $this->chars['z'][0]= 690 ; + $this->chars['z'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABgAHA//EACsQAAEDAwQBAwIHAAAAAAAAAAEC'. @@ -341,11 +341,11 @@ $this->chars['z'][1]= '4lLlyJk2cEqW+6V+m0AE9ISLnsj5+O9UhsFK92bZZqb9SRu9p2c4A0OCEqDbYAJSlJwAVZv3fBvbFrg/462btlhuS1RG5nL8pYkq'. 'KrnsKH06I/rVrQKkf//Z' ; -//========================================================== -// d4-small.jpg -//========================================================== -$this->chars['4'][0]= 643 ; -$this->chars['4'][1]= + //========================================================== + // d4-small.jpg + //========================================================== + $this->chars['4'][0]= 643 ; + $this->chars['4'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'. @@ -356,11 +356,11 @@ $this->chars['4'][1]= '27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'. 'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ; -//========================================================== -// lv-small.jpg -//========================================================== -$this->chars['v'][0]= 648 ; -$this->chars['v'][1]= + //========================================================== + // lv-small.jpg + //========================================================== + $this->chars['v'][0]= 648 ; + $this->chars['v'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQDBQYH/8QAKBAAAQQBAwMEAgMAAAAAAAAA'. @@ -371,11 +371,11 @@ $this->chars['v'][1]= 'shyW6AocpHNIrv8AvWzk9BUSdPdYS4BcRlomkhIV6KP0VE39V+tU2wdlRMHtZUB8NuTQ+51X27+Kr46ZPIAFV540D8zeLsJ5LMHa'. 'ubmMBCVJdjx0pRyLoWR4I8aNIQ8BvZMNtMTeUcsptKfc4tC1gAkCyFC+K0aJtf/Z' ; -//========================================================== -// lk-small.jpg -//========================================================== -$this->chars['k'][0]= 680 ; -$this->chars['k'][1]= + //========================================================== + // lk-small.jpg + //========================================================== + $this->chars['k'][0]= 680 ; + $this->chars['k'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBAMH/8QALhAAAQMDAwIEBAcAAAAAAAAA'. @@ -387,11 +387,11 @@ $this->chars['k'][1]= 'hQ5bXb1K9Scuybdxo2OTu92dwSZkWn0Sb8viQWyn8Qq5D6ifSLd0BIv7q0arTBRSKPToMZbi2GWylsvLK148Wue/XRrRjxOpT2R2'. 'k9aP/9k=' ; -//========================================================== -// lr-small.jpg -//========================================================== -$this->chars['r'][0]= 681 ; -$this->chars['r'][1]= + //========================================================== + // lr-small.jpg + //========================================================== + $this->chars['r'][0]= 681 ; + $this->chars['r'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAGgAAAgIDAAAAAAAAAAAAAAAAAAYCBQMEB//EAC4QAAICAQIFAgMJAQAAAAAA'. @@ -403,11 +403,11 @@ $this->chars['r'][1]= '2K2qcnK0Z5S8gPjrgAY8cNEWmq7u23pEos6/Zji+Kd0rLLGWwseA3joeZj/w4OET1g0vlmrWV+ydFnkUxSgsvM4V+YYIwfHz6cHB'. 'ZeKZ1//Z' ; -//========================================================== -// lg-small.jpg -//========================================================== -$this->chars['g'][0]= 655 ; -$this->chars['g'][1]= + //========================================================== + // lg-small.jpg + //========================================================== + $this->chars['g'][0]= 655 ; + $this->chars['g'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQCBQYH/8QAJxAAAQQBAwQCAgMAAAAAAAAA'. @@ -418,11 +418,11 @@ $this->chars['g'][1]= 'KvtaSkW4tYNVSqKiTwB+fw5n9sY/cuOXCzDDcluyW3Ckd7V+0n0eNZTH9DdouFalHIOJBUhtDki0pNV3UALo81ehG6IdKjPZ6d47'. '4ywltanVJvuJI+RQs/sHRqy2r003JhsImEc/CUyhxRZBjKV2oJ8eRXNmufPnRo1WIz3DdNn/2Q==' ; -//========================================================== -// lc-small.jpg -//========================================================== -$this->chars['c'][0]= 629 ; -$this->chars['c'][1]= + //========================================================== + // lc-small.jpg + //========================================================== + $this->chars['c'][0]= 629 ; + $this->chars['c'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBwID/8QALRAAAgICAQIEBAYDAAAAAAAA'. @@ -433,11 +433,11 @@ $this->chars['c'][1]= '305xkaEV/GTULMUT1LD/AAGh8gIZS2jv+vpybb8NMIb0dVLWYWgiiU0vmMphOj6V0TvQI3rfsON1E6dYjGtisa0F1mAWR2NhG0WZ'. '3Ls3TqNs5Hc9h23w49NWL9K+Q/VD5T/zhwPH/9k=' ; -//========================================================== -// d7-small.jpg -//========================================================== -$this->chars['7'][0]= 658 ; -$this->chars['7'][1]= + //========================================================== + // d7-small.jpg + //========================================================== + $this->chars['7'][0]= 658 ; + $this->chars['7'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'. @@ -448,11 +448,11 @@ $this->chars['7'][1]= '8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'. 'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ; -//========================================================== -// ly-small.jpg -//========================================================== -$this->chars['y'][0]= 672 ; -$this->chars['y'][1]= + //========================================================== + // ly-small.jpg + //========================================================== + $this->chars['y'][0]= 672 ; + $this->chars['y'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQGBQf/xAArEAABAwMEAQIFBQAAAAAAAAAB'. @@ -463,11 +463,11 @@ $this->chars['y'][1]= 'DMds24l3HvcNr3Pi9gME6T9WWVsemdYWswwC2lPta4m5WMA3OdUExCmozUJD6g84ntMjrHIFBTdQz5yLDx/WDNytpwW6nAkViqVe'. 'uvmXdlme6n4dCwlRBKEgA2tj99QG7Ilncp5QqpU31PMsJ6x7A32f6SPxo0hPVCD45oVyKf0MtgeT97/nRrO7UOCFla3tn//Z' ; -//========================================================== -// d3-small.jpg -//========================================================== -$this->chars['3'][0]= 662 ; -$this->chars['3'][1]= + //========================================================== + // d3-small.jpg + //========================================================== + $this->chars['3'][0]= 662 ; + $this->chars['3'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'. @@ -478,11 +478,11 @@ $this->chars['3'][1]= 'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'. 'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ; -//========================================================== -// ln-small.jpg -//========================================================== -$this->chars['n'][0]= 643 ; -$this->chars['n'][1]= + //========================================================== + // ln-small.jpg + //========================================================== + $this->chars['n'][0]= 643 ; + $this->chars['n'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGwAAAgEFAAAAAAAAAAAAAAAAAAYCAQMEBQf/xAAtEAACAQMCBAUCBwAAAAAA'. @@ -493,11 +493,11 @@ $this->chars['n'][1]= 'fB7hj59/XJ08cPWaKj4gvlwSQiG7dCboqvLy9NOmQT9SM7ayJrBa6K5V91hjlWorp4JGUOAglRSiMMDb82/vgaBGTpVvtNUVtyJg'. '5+WNAh5ZCu/r2+dGrgq0pi0DhmlRsSSAfqMd+b6ZyNu3po1Rk1yNBe3/2Q==' ; -//========================================================== -// lu-small.jpg -//========================================================== -$this->chars['u'][0]= 671 ; -$this->chars['u'][1]= + //========================================================== + // lu-small.jpg + //========================================================== + $this->chars['u'][0]= 671 ; + $this->chars['u'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYDBAUH/8QAJRAAAQQBAwQDAQEAAAAAAAAA'. @@ -508,11 +508,11 @@ $this->chars['u'][1]= 'T1KBPdpV2f0pom/1Ws7cmPazu98Ltvcq3VzRHfehz8a4pirFEKRZo8eQT+eCdWYfS/b+WYnxpbuVcDRMdHcyTqg2fiAfiLoi+Rf+'. 'jT7Xc74HtOYnHyUOh8yWUvKeHhy0CiPVUAPoDRrm+OeznTva6lzsyMjCYbbaiNJjJSWElagD5tRpNUSALFeNGoOCH7Bv/9k=' ; -//========================================================== -// lw-small.jpg -//========================================================== -$this->chars['w'][0]= 673 ; -$this->chars['w'][1]= + //========================================================== + // lw-small.jpg + //========================================================== + $this->chars['w'][0]= 673 ; + $this->chars['w'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYDBAX/xAAtEAACAQMDAgMHBQAAAAAAAAAB'. @@ -523,11 +523,11 @@ $this->chars['w'][1]= '7oz/ALqitJulYJKuqvFsppHALLFb3cp9FBaXr+O51bq0q6i38KK5PDVAAxSzU6SIpz3Kjjn8jUFoS7uFmut1gq17xLFQ+DxOccj8'. 'Rsn+tVpiyJnqv09YfOXu5AycgZZQEhBZjgDBOOgwO/po0sttWHdNzqLruioa4UwmdaC3kYp4IwSvJlBHKQ4OSe3po0qxM6P/2Q==' ; -//========================================================== -// lq-small.jpg -//========================================================== -$this->chars['q'][0]= 671 ; -$this->chars['q'][1]= + //========================================================== + // lq-small.jpg + //========================================================== + $this->chars['q'][0]= 671 ; + $this->chars['q'][1]= '/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'. 'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. 'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAcDBAUG/8QAKRAAAQQBBAICAQQDAAAAAAAA'. @@ -540,7 +540,7 @@ $this->chars['q'][1]= - } + } } class AntiSpam { @@ -548,67 +548,67 @@ class AntiSpam { private $iData=''; private $iDD=null; - function AntiSpam($aData='') { - $this->iData = $aData; - $this->iDD = new HandDigits(); + function __construct($aData='') { + $this->iData = $aData; + $this->iDD = new HandDigits(); } function Set($aData) { - $this->iData = $aData; + $this->iData = $aData; } function Rand($aLen) { - $d=''; - for($i=0; $i < $aLen; ++$i) { - if( rand(0,9) < 6 ) { - // Digits - $d .= chr( ord('1') + rand(0,8) ); - } - else { - // Letters - do { - $offset = rand(0,25); - } while ( $offset==14 ); - $d .= chr( ord('a') + $offset ); - } - } - $this->iData = $d; - return $d; + $d=''; + for($i=0; $i < $aLen; ++$i) { + if( rand(0,9) < 6 ) { + // Digits + $d .= chr( ord('1') + rand(0,8) ); + } + else { + // Letters + do { + $offset = rand(0,25); + } while ( $offset==14 ); + $d .= chr( ord('a') + $offset ); + } + } + $this->iData = $d; + return $d; } function Stroke() { - $n=strlen($this->iData); - if( $n==0 ) { - return false; - } + $n=strlen($this->iData); + if( $n==0 ) { + return false; + } - for($i=0; $i < $n; ++$i ) { - if( $this->iData[$i]==='0' || strtolower($this->iData[$i])==='o') { - return false; - } - } + for($i=0; $i < $n; ++$i ) { + if( $this->iData[$i]==='0' || strtolower($this->iData[$i])==='o') { + return false; + } + } - $img = @imagecreatetruecolor($n*$this->iDD->iWidth, $this->iDD->iHeight); - if( $img < 1 ) { - return false; - } + $img = @imagecreatetruecolor($n*$this->iDD->iWidth, $this->iDD->iHeight); + if( $img < 1 ) { + return false; + } - $start=0; - for($i=0; $i < $n; ++$i ) { - $dimg = imagecreatefromstring(base64_decode($this->iDD->chars[strtolower($this->iData[$i])][1])); - imagecopy($img,$dimg,$start,0,0,0,imagesx($dimg), $this->iDD->iHeight); - $start += imagesx($dimg); - } - $resimg = @imagecreatetruecolor($start+4, $this->iDD->iHeight+4); - if( $resimg < 1 ) { - return false; - } + $start=0; + for($i=0; $i < $n; ++$i ) { + $dimg = imagecreatefromstring(base64_decode($this->iDD->chars[strtolower($this->iData[$i])][1])); + imagecopy($img,$dimg,$start,0,0,0,imagesx($dimg), $this->iDD->iHeight); + $start += imagesx($dimg); + } + $resimg = @imagecreatetruecolor($start+4, $this->iDD->iHeight+4); + if( $resimg < 1 ) { + return false; + } - imagecopy($resimg,$img,2,2,0,0,$start, $this->iDD->iHeight); - header("Content-type: image/jpeg"); - imagejpeg($resimg); - return true; + imagecopy($resimg,$img,2,2,0,0,$start, $this->iDD->iHeight); + header("Content-type: image/jpeg"); + imagejpeg($resimg); + return true; } } diff --git a/libs/jpgraph/jpgraph_bar.php b/libs/jpgraph/jpgraph_bar.php index bcf6fdd..a116bc4 100644 --- a/libs/jpgraph/jpgraph_bar.php +++ b/libs/jpgraph/jpgraph_bar.php @@ -1,13 +1,13 @@ Plot($datay,$datax); - ++$this->numpoints; + protected $bar_shadow_hsize=3,$bar_shadow_vsize=3; + + //--------------- + // CONSTRUCTOR + function __construct($datay,$datax=false) { + parent::__construct($datay,$datax); + ++$this->numpoints; } -//--------------- -// PUBLIC METHODS - + //--------------- + // PUBLIC METHODS + // Set a drop shadow for the bar (or rather an "up-right" shadow) - function SetShadow($color="black",$hsize=3,$vsize=3,$show=true) { - $this->bar_shadow=$show; - $this->bar_shadow_color=$color; - $this->bar_shadow_vsize=$vsize; - $this->bar_shadow_hsize=$hsize; - - // Adjust the value margin to compensate for shadow - $this->value->margin += $vsize; + function SetShadow($aColor="black",$aHSize=3,$aVSize=3,$aShow=true) { + $this->bar_shadow=$aShow; + $this->bar_shadow_color=$aColor; + $this->bar_shadow_vsize=$aVSize; + $this->bar_shadow_hsize=$aHSize; + + // Adjust the value margin to compensate for shadow + $this->value->margin += $aVSize; } - + // DEPRECATED use SetYBase instead function SetYMin($aYStartValue) { - //die("JpGraph Error: Deprecated function SetYMin. Use SetYBase() instead."); - $this->ybase=$aYStartValue; + //die("JpGraph Error: Deprecated function SetYMin. Use SetYBase() instead."); + $this->ybase=$aYStartValue; } // Specify the base value for the bars function SetYBase($aYStartValue) { - $this->ybase=$aYStartValue; + $this->ybase=$aYStartValue; } - + + // The method will take the specified pattern anre + // return a pattern index that corresponds to the original + // patterm being rotated 90 degreees. This is needed when plottin + // Horizontal bars + function RotatePattern($aPat,$aRotate=true) { + $rotate = array(1 => 2, 2 => 1, 3 => 3, 4 => 5, 5 => 4, 6 => 6, 7 => 7, 8 => 8); + if( $aRotate ) { + return $rotate[$aPat]; + } + else { + return $aPat; + } + } + function Legend($graph) { - if( $this->grad && $this->legend!="" && !$this->fill ) { - $color=array($this->grad_fromcolor,$this->grad_tocolor); - // In order to differentiate between gradients and cooors specified as an RGB triple - $graph->legend->Add($this->legend,$color,"",-$this->grad_style, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - elseif( $this->legend!="" && ($this->iPattern > -1 || is_array($this->iPattern)) ) { - if( is_array($this->iPattern) ) { - $p1 = $this->iPattern[0]; - $p2 = $this->iPatternColor[0]; - $p3 = $this->iPatternDensity[0]; - } - else { - $p1 = $this->iPattern; - $p2 = $this->iPatternColor; - $p3 = $this->iPatternDensity; - } - $color = array($p1,$p2,$p3,$this->fill_color); - // A kludge: Too mark that we add a pattern we use a type value of < 100 - $graph->legend->Add($this->legend,$color,"",-101, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - elseif( $this->fill_color && $this->legend!="" ) { - if( is_array($this->fill_color) ) { - $graph->legend->Add($this->legend,$this->fill_color[0],"",0, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - else { - $graph->legend->Add($this->legend,$this->fill_color,"",0, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - } + if( $this->grad && $this->legend!="" && !$this->fill ) { + $color=array($this->grad_fromcolor,$this->grad_tocolor); + // In order to differentiate between gradients and cooors specified as an RGB triple + $graph->legend->Add($this->legend,$color,"",-$this->grad_style, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + elseif( $this->legend!="" && ($this->iPattern > -1 || is_array($this->iPattern)) ) { + if( is_array($this->iPattern) ) { + $p1 = $this->RotatePattern( $this->iPattern[0], $graph->img->a == 90 ); + $p2 = $this->iPatternColor[0]; + $p3 = $this->iPatternDensity[0]; + } + else { + $p1 = $this->RotatePattern( $this->iPattern, $graph->img->a == 90 ); + $p2 = $this->iPatternColor; + $p3 = $this->iPatternDensity; + } + if( $p3 < 90 ) $p3 += 5; + $color = array($p1,$p2,$p3,$this->fill_color); + // A kludge: Too mark that we add a pattern we use a type value of < 100 + $graph->legend->Add($this->legend,$color,"",-101, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + elseif( $this->fill_color && $this->legend!="" ) { + if( is_array($this->fill_color) ) { + $graph->legend->Add($this->legend,$this->fill_color[0],"",0, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + else { + $graph->legend->Add($this->legend,$this->fill_color,"",0, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + } } // Gets called before any axis are stroked function PreStrokeAdjust($graph) { - parent::PreStrokeAdjust($graph); + parent::PreStrokeAdjust($graph); - // If we are using a log Y-scale we want the base to be at the - // minimum Y-value unless the user have specifically set some other - // value than the default. - if( substr($graph->axtype,-3,3)=="log" && $this->ybase==0 ) - $this->ybase = $graph->yaxis->scale->GetMinVal(); - - // For a "text" X-axis scale we will adjust the - // display of the bars a little bit. - if( substr($graph->axtype,0,3)=="tex" ) { - // Position the ticks between the bars - $graph->xaxis->scale->ticks->SetXLabelOffset(0.5,0); + // If we are using a log Y-scale we want the base to be at the + // minimum Y-value unless the user have specifically set some other + // value than the default. + if( substr($graph->axtype,-3,3)=="log" && $this->ybase==0 ) + $this->ybase = $graph->yaxis->scale->GetMinVal(); - // Center the bars - if( $this->abswidth > -1 ) { - $graph->SetTextScaleAbsCenterOff($this->abswidth); - } - else { - if( $this->align == "center" ) - $graph->SetTextScaleOff(0.5-$this->width/2); - elseif( $this->align == "right" ) - $graph->SetTextScaleOff(1-$this->width); - } - } - elseif( ($this instanceof AccBarPlot) || ($this instanceof GroupBarPlot) ) { - // We only set an absolute width for linear and int scale - // for text scale the width will be set to a fraction of - // the majstep width. - if( $this->abswidth == -1 ) { + // For a "text" X-axis scale we will adjust the + // display of the bars a little bit. + if( substr($graph->axtype,0,3)=="tex" ) { + // Position the ticks between the bars + $graph->xaxis->scale->ticks->SetXLabelOffset(0.5,0); + + // Center the bars + if( $this->abswidth > -1 ) { + $graph->SetTextScaleAbsCenterOff($this->abswidth); + } + else { + if( $this->align == "center" ) + $graph->SetTextScaleOff(0.5-$this->width/2); + elseif( $this->align == "right" ) + $graph->SetTextScaleOff(1-$this->width); + } + } + elseif( ($this instanceof AccBarPlot) || ($this instanceof GroupBarPlot) ) { + // We only set an absolute width for linear and int scale + // for text scale the width will be set to a fraction of + // the majstep width. + if( $this->abswidth == -1 ) { // Not set - // set width to a visuable sensible default - $this->abswidth = $graph->img->plotwidth/(2*count($this->coords[0])); - } - } + // set width to a visuable sensible default + $this->abswidth = $graph->img->plotwidth/(2*$this->numpoints); + } + } } function Min() { - $m = parent::Min(); - if( $m[1] >= $this->ybase ) - $m[1] = $this->ybase; - return $m; + $m = parent::Min(); + if( $m[1] >= $this->ybase ) $m[1] = $this->ybase; + return $m; } function Max() { - $m = parent::Max(); - if( $m[1] <= $this->ybase ) - $m[1] = $this->ybase; - return $m; - } - + $m = parent::Max(); + if( $m[1] <= $this->ybase ) $m[1] = $this->ybase; + return $m; + } + // Specify width as fractions of the major stepo size function SetWidth($aWidth) { - if( $aWidth > 1 ) { - // Interpret this as absolute width - $this->abswidth=$aWidth; - } - else - $this->width=$aWidth; + if( $aWidth > 1 ) { + // Interpret this as absolute width + $this->abswidth=$aWidth; + } + else { + $this->width=$aWidth; + } } - + // Specify width in absolute pixels. If specified this // overrides SetWidth() function SetAbsWidth($aWidth) { - $this->abswidth=$aWidth; + $this->abswidth=$aWidth; } - + function SetAlign($aAlign) { - $this->align=$aAlign; + $this->align=$aAlign; } - + function SetNoFill() { - $this->grad = false; - $this->fill_color=false; - $this->fill=false; + $this->grad = false; + $this->fill_color=false; + $this->fill=false; } - + function SetFillColor($aColor) { - $this->fill = true ; - $this->fill_color=$aColor; + // Do an extra error check if the color is specified as an RG array triple + // In that case convert it to a hex string since it will otherwise be + // interpretated as an array of colors for each individual bar. + + $aColor = RGB::tryHexConversion($aColor); + $this->fill = true ; + $this->fill_color=$aColor; + } - + function SetFillGradient($aFromColor,$aToColor=null,$aStyle=null) { - $this->grad = true; - $this->grad_fromcolor = $aFromColor; - $this->grad_tocolor = $aToColor; - $this->grad_style = $aStyle; + $this->grad = true; + $this->grad_fromcolor = $aFromColor; + $this->grad_tocolor = $aToColor; + $this->grad_style = $aStyle; } - + function SetValuePos($aPos) { - $this->valuepos = $aPos; + $this->valuepos = $aPos; } function SetPattern($aPattern, $aColor='black'){ - if( is_array($aPattern) ) { - $n = count($aPattern); - $this->iPattern = array(); - $this->iPatternDensity = array(); - if( is_array($aColor) ) { - $this->iPatternColor = array(); - if( count($aColor) != $n ) { - JpGraphError::Raise('NUmber of colors is not the same as the number of patterns in BarPlot::SetPattern()'); - } - } - else - $this->iPatternColor = $aColor; - for( $i=0; $i < $n; ++$i ) { - $this->_SetPatternHelper($aPattern[$i], $this->iPattern[$i], $this->iPatternDensity[$i]); - if( is_array($aColor) ) { - $this->iPatternColor[$i] = $aColor[$i]; - } - } - } - else { - $this->_SetPatternHelper($aPattern, $this->iPattern, $this->iPatternDensity); - $this->iPatternColor = $aColor; - } + if( is_array($aPattern) ) { + $n = count($aPattern); + $this->iPattern = array(); + $this->iPatternDensity = array(); + if( is_array($aColor) ) { + $this->iPatternColor = array(); + if( count($aColor) != $n ) { + JpGraphError::RaiseL(2001);//('NUmber of colors is not the same as the number of patterns in BarPlot::SetPattern()'); + } + } + else { + $this->iPatternColor = $aColor; + } + for( $i=0; $i < $n; ++$i ) { + $this->_SetPatternHelper($aPattern[$i], $this->iPattern[$i], $this->iPatternDensity[$i]); + if( is_array($aColor) ) { + $this->iPatternColor[$i] = $aColor[$i]; + } + } + } + else { + $this->_SetPatternHelper($aPattern, $this->iPattern, $this->iPatternDensity); + $this->iPatternColor = $aColor; + } } function _SetPatternHelper($aPattern, &$aPatternValue, &$aDensity){ - switch( $aPattern ) { - case PATTERN_DIAG1: - $aPatternValue= 1; - $aDensity = 90; - break; - case PATTERN_DIAG2: - $aPatternValue= 1; - $aDensity = 75; - break; - case PATTERN_DIAG3: - $aPatternValue= 2; - $aDensity = 90; - break; - case PATTERN_DIAG4: - $aPatternValue= 2; - $aDensity = 75; - break; - case PATTERN_CROSS1: - $aPatternValue= 8; - $aDensity = 90; - break; - case PATTERN_CROSS2: - $aPatternValue= 8; - $aDensity = 78; - break; - case PATTERN_CROSS3: - $aPatternValue= 8; - $aDensity = 65; - break; - case PATTERN_CROSS4: - $aPatternValue= 7; - $aDensity = 90; - break; - case PATTERN_STRIPE1: - $aPatternValue= 5; - $aDensity = 90; - break; - case PATTERN_STRIPE2: - $aPatternValue= 5; - $aDensity = 75; - break; - default: - JpGraphError::Raise('Unknown pattern specified in call to BarPlot::SetPattern()'); - } + switch( $aPattern ) { + case PATTERN_DIAG1: + $aPatternValue= 1; + $aDensity = 92; + break; + case PATTERN_DIAG2: + $aPatternValue= 1; + $aDensity = 78; + break; + case PATTERN_DIAG3: + $aPatternValue= 2; + $aDensity = 92; + break; + case PATTERN_DIAG4: + $aPatternValue= 2; + $aDensity = 78; + break; + case PATTERN_CROSS1: + $aPatternValue= 8; + $aDensity = 90; + break; + case PATTERN_CROSS2: + $aPatternValue= 8; + $aDensity = 78; + break; + case PATTERN_CROSS3: + $aPatternValue= 8; + $aDensity = 65; + break; + case PATTERN_CROSS4: + $aPatternValue= 7; + $aDensity = 90; + break; + case PATTERN_STRIPE1: + $aPatternValue= 5; + $aDensity = 94; + break; + case PATTERN_STRIPE2: + $aPatternValue= 5; + $aDensity = 85; + break; + default: + JpGraphError::RaiseL(2002); + //('Unknown pattern specified in call to BarPlot::SetPattern()'); + } } - function Stroke($img,$xscale,$yscale) { - - $numpoints = count($this->coords[0]); - if( isset($this->coords[1]) ) { - if( count($this->coords[1])!=$numpoints ) - JpGraphError::Raise("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])."Number of Y-points:$numpoints"); - else - $exist_x = true; - } - else - $exist_x = false; - - - $numbars=count($this->coords[0]); + function Stroke($img,$xscale,$yscale) { - // Use GetMinVal() instead of scale[0] directly since in the case - // of log scale we get a correct value. Log scales will have negative - // values for values < 1 while still not representing negative numbers. - if( $yscale->GetMinVal() >= 0 ) - $zp=$yscale->scale_abs[0]; - else { - $zp=$yscale->Translate(0); - } + $numpoints = count($this->coords[0]); + if( isset($this->coords[1]) ) { + if( count($this->coords[1])!=$numpoints ) { + JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints); + //"Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])."Number of Y-points:$numpoints"); + } + else { + $exist_x = true; + } + } + else { + $exist_x = false; + } - if( $this->abswidth > -1 ) { - $abswidth=$this->abswidth; - } - else - $abswidth=round($this->width*$xscale->scale_factor,0); - // Count pontetial pattern array to avoid doing the count for each iteration - if( is_array($this->iPattern) ) { - $np = count($this->iPattern); - } - - $grad = null; - for($i=0; $i < $numbars; ++$i) { + $numbars=count($this->coords[0]); - // If value is NULL, or 0 then don't draw a bar at all - if ($this->coords[0][$i] === null || $this->coords[0][$i] === '' ) - continue; + // Use GetMinVal() instead of scale[0] directly since in the case + // of log scale we get a correct value. Log scales will have negative + // values for values < 1 while still not representing negative numbers. + if( $yscale->GetMinVal() >= 0 ) + $zp=$yscale->scale_abs[0]; + else { + $zp=$yscale->Translate(0); + } - if( $exist_x ) $x=$this->coords[1][$i]; - else $x=$i; - - $x=$xscale->Translate($x); + if( $this->abswidth > -1 ) { + $abswidth=$this->abswidth; + } + else { + $abswidth=round($this->width*$xscale->scale_factor,0); + } -// Comment Note: This confuses the positioning when using acc together with -// grouped bars. Workaround for fixing #191 -/* - if( !$xscale->textscale ) { - if($this->align=="center") - $x -= $abswidth/2; - elseif($this->align=="right") - $x -= $abswidth; - } -*/ - // Stroke fill color and fill gradient - $pts=array( - $x,$zp, - $x,$yscale->Translate($this->coords[0][$i]), - $x+$abswidth,$yscale->Translate($this->coords[0][$i]), - $x+$abswidth,$zp); - if( $this->grad ) { - if( $grad === null ) - $grad = new Gradient($img); - if( is_array($this->grad_fromcolor) ) { - // The first argument (grad_fromcolor) can be either an array or a single color. If it is an array - // then we have two choices. It can either a) be a single color specified as an RGB triple or it can be - // an array to specify both (from, to style) for each individual bar. The way to know the difference is - // to investgate the first element. If this element is an integer [0,255] then we assume it is an RGB - // triple. - $ng = count($this->grad_fromcolor); - if( $ng === 3 ) { - if( is_numeric($this->grad_fromcolor[0]) && $this->grad_fromcolor[0] > 0 && $this->grad_fromcolor[0] < 256 ) { - // RGB Triple - $fromcolor = $this->grad_fromcolor; - $tocolor = $this->grad_tocolor; - $style = $this->grad_style; - } - } - else { - $fromcolor = $this->grad_fromcolor[$i % $ng][0]; - $tocolor = $this->grad_fromcolor[$i % $ng][1]; - $style = $this->grad_fromcolor[$i % $ng][2]; - } - $grad->FilledRectangle($pts[2],$pts[3], - $pts[6],$pts[7], - $fromcolor,$tocolor,$style); - } - else { - $grad->FilledRectangle($pts[2],$pts[3], - $pts[6],$pts[7], - $this->grad_fromcolor,$this->grad_tocolor,$this->grad_style); - } - } - elseif( !empty($this->fill_color) ) { - if(is_array($this->fill_color)) { - $img->PushColor($this->fill_color[$i % count($this->fill_color)]); - } else { - $img->PushColor($this->fill_color); - } - $img->FilledPolygon($pts); - $img->PopColor(); - } - - - // Remember value of this bar - $val=$this->coords[0][$i]; + // Count pontetial pattern array to avoid doing the count for each iteration + if( is_array($this->iPattern) ) { + $np = count($this->iPattern); + } - if( !empty($val) && !is_numeric($val) ) { - JpGraphError::Raise('All values for a barplot must be numeric. You have specified value['.$i.'] == \''.$val.'\''); - } + $grad = null; + for($i=0; $i < $numbars; ++$i) { - // Determine the shadow - if( $this->bar_shadow && $val != 0) { + // If value is NULL, or 0 then don't draw a bar at all + if ($this->coords[0][$i] === null || $this->coords[0][$i] === '' ) + continue; - $ssh = $this->bar_shadow_hsize; - $ssv = $this->bar_shadow_vsize; - // Create points to create a "upper-right" shadow - if( $val > 0 ) { - $sp[0]=$pts[6]; $sp[1]=$pts[7]; - $sp[2]=$pts[4]; $sp[3]=$pts[5]; - $sp[4]=$pts[2]; $sp[5]=$pts[3]; - $sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv; - $sp[8]=$pts[4]+$ssh; $sp[9]=$pts[5]-$ssv; - $sp[10]=$pts[6]+$ssh; $sp[11]=$pts[7]-$ssv; - } - elseif( $val < 0 ) { - $sp[0]=$pts[4]; $sp[1]=$pts[5]; - $sp[2]=$pts[6]; $sp[3]=$pts[7]; - $sp[4]=$pts[0]; $sp[5]=$pts[1]; - $sp[6]=$pts[0]+$ssh; $sp[7]=$pts[1]-$ssv; - $sp[8]=$pts[6]+$ssh; $sp[9]=$pts[7]-$ssv; - $sp[10]=$pts[4]+$ssh; $sp[11]=$pts[5]-$ssv; - } - if( is_array($this->bar_shadow_color) ) { - $numcolors = count($this->bar_shadow_color); - if( $numcolors == 0 ) { - JpGraphError::Raise('You have specified an empty array for shadow colors in the bar plot.'); - } - $img->PushColor($this->bar_shadow_color[$i % $numcolors]); - } - else { - $img->PushColor($this->bar_shadow_color); - } - $img->FilledPolygon($sp); - $img->PopColor(); - } - - // Stroke the pattern - if( is_array($this->iPattern) ) { - $f = new RectPatternFactory(); - if( is_array($this->iPatternColor) ) { - $pcolor = $this->iPatternColor[$i % $np]; - } - else - $pcolor = $this->iPatternColor; - $prect = $f->Create($this->iPattern[$i % $np],$pcolor,1); - $prect->SetDensity($this->iPatternDensity[$i % $np]); + if( $exist_x ) { + $x=$this->coords[1][$i]; + } + else { + $x=$i; + } - if( $val < 0 ) { - $rx = $pts[0]; - $ry = $pts[1]; - } - else { - $rx = $pts[2]; - $ry = $pts[3]; - } - $width = abs($pts[4]-$pts[0])+1; - $height = abs($pts[1]-$pts[3])+1; - $prect->SetPos(new Rectangle($rx,$ry,$width,$height)); - $prect->Stroke($img); - } - else { - if( $this->iPattern > -1 ) { - $f = new RectPatternFactory(); - $prect = $f->Create($this->iPattern,$this->iPatternColor,1); - $prect->SetDensity($this->iPatternDensity); - if( $val < 0 ) { - $rx = $pts[0]; - $ry = $pts[1]; - } - else { - $rx = $pts[2]; - $ry = $pts[3]; - } - $width = abs($pts[4]-$pts[0])+1; - $height = abs($pts[1]-$pts[3])+1; - $prect->SetPos(new Rectangle($rx,$ry,$width,$height)); - $prect->Stroke($img); - } - } - // Stroke the outline of the bar - if( is_array($this->color) ) - $img->SetColor($this->color[$i % count($this->color)]); - else - $img->SetColor($this->color); + $x=$xscale->Translate($x); - $pts[] = $pts[0]; - $pts[] = $pts[1]; + // Comment Note: This confuses the positioning when using acc together with + // grouped bars. Workaround for fixing #191 + /* + if( !$xscale->textscale ) { + if($this->align=="center") + $x -= $abswidth/2; + elseif($this->align=="right") + $x -= $abswidth; + } + */ + // Stroke fill color and fill gradient + $pts=array( + $x,$zp, + $x,$yscale->Translate($this->coords[0][$i]), + $x+$abswidth,$yscale->Translate($this->coords[0][$i]), + $x+$abswidth,$zp); + if( $this->grad ) { + if( $grad === null ) { + $grad = new Gradient($img); + } + if( is_array($this->grad_fromcolor) ) { + // The first argument (grad_fromcolor) can be either an array or a single color. If it is an array + // then we have two choices. It can either a) be a single color specified as an RGB triple or it can be + // an array to specify both (from, to style) for each individual bar. The way to know the difference is + // to investgate the first element. If this element is an integer [0,255] then we assume it is an RGB + // triple. + $ng = count($this->grad_fromcolor); + if( $ng === 3 ) { + if( is_numeric($this->grad_fromcolor[0]) && $this->grad_fromcolor[0] > 0 && $this->grad_fromcolor[0] < 256 ) { + // RGB Triple + $fromcolor = $this->grad_fromcolor; + $tocolor = $this->grad_tocolor; + $style = $this->grad_style; + } + else { + $fromcolor = $this->grad_fromcolor[$i % $ng][0]; + $tocolor = $this->grad_fromcolor[$i % $ng][1]; + $style = $this->grad_fromcolor[$i % $ng][2]; + } + } + else { + $fromcolor = $this->grad_fromcolor[$i % $ng][0]; + $tocolor = $this->grad_fromcolor[$i % $ng][1]; + $style = $this->grad_fromcolor[$i % $ng][2]; + } + $grad->FilledRectangle($pts[2],$pts[3], + $pts[6],$pts[7], + $fromcolor,$tocolor,$style); + } + else { + $grad->FilledRectangle($pts[2],$pts[3], + $pts[6],$pts[7], + $this->grad_fromcolor,$this->grad_tocolor,$this->grad_style); + } + } + elseif( !empty($this->fill_color) ) { + if(is_array($this->fill_color)) { + $img->PushColor($this->fill_color[$i % count($this->fill_color)]); + } else { + $img->PushColor($this->fill_color); + } + $img->FilledPolygon($pts); + $img->PopColor(); + } - if( $this->weight > 0 ) { - $img->SetLineWeight($this->weight); - $img->Polygon($pts); - } - - // Determine how to best position the values of the individual bars - $x=$pts[2]+($pts[4]-$pts[2])/2; - if( $this->valuepos=='top' ) { - $y=$pts[3]; - if( $img->a === 90 ) { - if( $val < 0 ) - $this->value->SetAlign('right','center'); - else - $this->value->SetAlign('left','center'); - - } - $this->value->Stroke($img,$val,$x,$y); - } - elseif( $this->valuepos=='max' ) { - $y=$pts[3]; - if( $img->a === 90 ) { - if( $val < 0 ) - $this->value->SetAlign('left','center'); - else - $this->value->SetAlign('right','center'); - } - else { - $this->value->SetAlign('center','top'); - } - $this->value->SetMargin(-3); - $this->value->Stroke($img,$val,$x,$y); - } - elseif( $this->valuepos=='center' ) { - $y = ($pts[3] + $pts[1])/2; - $this->value->SetAlign('center','center'); - $this->value->SetMargin(0); - $this->value->Stroke($img,$val,$x,$y); - } - elseif( $this->valuepos=='bottom' || $this->valuepos=='min' ) { - $y=$pts[1]; - if( $img->a === 90 ) { - if( $val < 0 ) - $this->value->SetAlign('right','center'); - else - $this->value->SetAlign('left','center'); - } - $this->value->SetMargin(3); - $this->value->Stroke($img,$val,$x,$y); - } - else { - JpGraphError::Raise('Unknown position for values on bars :'.$this->valuepos); - } - // Create the client side image map - $rpts = $img->ArrRotate($pts); - $csimcoord=round($rpts[0]).", ".round($rpts[1]); - for( $j=1; $j < 4; ++$j){ - $csimcoord .= ", ".round($rpts[2*$j]).", ".round($rpts[2*$j+1]); - } - if( !empty($this->csimtargets[$i]) ) { - $this->csimareas .= 'csimareas .= " href=\"".htmlentities($this->csimtargets[$i])."\""; - if( !empty($this->csimwintargets[$i]) ) { - $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; - } + // Remember value of this bar + $val=$this->coords[0][$i]; - $sval=''; - if( !empty($this->csimalts[$i]) ) { - $sval=sprintf($this->csimalts[$i],$this->coords[0][$i]); - $this->csimareas .= " title=\"$sval\" alt=\"$sval\" "; - } - $this->csimareas .= " />\n"; - } - } - return true; + if( !empty($val) && !is_numeric($val) ) { + JpGraphError::RaiseL(2004,$i,$val); + //'All values for a barplot must be numeric. You have specified value['.$i.'] == \''.$val.'\''); + } + + // Determine the shadow + if( $this->bar_shadow && $val != 0) { + + $ssh = $this->bar_shadow_hsize; + $ssv = $this->bar_shadow_vsize; + // Create points to create a "upper-right" shadow + if( $val > 0 ) { + $sp[0]=$pts[6]; $sp[1]=$pts[7]; + $sp[2]=$pts[4]; $sp[3]=$pts[5]; + $sp[4]=$pts[2]; $sp[5]=$pts[3]; + $sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv; + $sp[8]=$pts[4]+$ssh; $sp[9]=$pts[5]-$ssv; + $sp[10]=$pts[6]+$ssh; $sp[11]=$pts[7]-$ssv; + } + elseif( $val < 0 ) { + $sp[0]=$pts[4]; $sp[1]=$pts[5]; + $sp[2]=$pts[6]; $sp[3]=$pts[7]; + $sp[4]=$pts[0]; $sp[5]=$pts[1]; + $sp[6]=$pts[0]+$ssh; $sp[7]=$pts[1]-$ssv; + $sp[8]=$pts[6]+$ssh; $sp[9]=$pts[7]-$ssv; + $sp[10]=$pts[4]+$ssh; $sp[11]=$pts[5]-$ssv; + } + if( is_array($this->bar_shadow_color) ) { + $numcolors = count($this->bar_shadow_color); + if( $numcolors == 0 ) { + JpGraphError::RaiseL(2005);//('You have specified an empty array for shadow colors in the bar plot.'); + } + $img->PushColor($this->bar_shadow_color[$i % $numcolors]); + } + else { + $img->PushColor($this->bar_shadow_color); + } + $img->FilledPolygon($sp); + $img->PopColor(); + } + + // Stroke the pattern + if( is_array($this->iPattern) ) { + $f = new RectPatternFactory(); + if( is_array($this->iPatternColor) ) { + $pcolor = $this->iPatternColor[$i % $np]; + } + else { + $pcolor = $this->iPatternColor; + } + $prect = $f->Create($this->iPattern[$i % $np],$pcolor,1); + $prect->SetDensity($this->iPatternDensity[$i % $np]); + + if( $val < 0 ) { + $rx = $pts[0]; + $ry = $pts[1]; + } + else { + $rx = $pts[2]; + $ry = $pts[3]; + } + $width = abs($pts[4]-$pts[0])+1; + $height = abs($pts[1]-$pts[3])+1; + $prect->SetPos(new Rectangle($rx,$ry,$width,$height)); + $prect->Stroke($img); + } + else { + if( $this->iPattern > -1 ) { + $f = new RectPatternFactory(); + $prect = $f->Create($this->iPattern,$this->iPatternColor,1); + $prect->SetDensity($this->iPatternDensity); + if( $val < 0 ) { + $rx = $pts[0]; + $ry = $pts[1]; + } + else { + $rx = $pts[2]; + $ry = $pts[3]; + } + $width = abs($pts[4]-$pts[0])+1; + $height = abs($pts[1]-$pts[3])+1; + $prect->SetPos(new Rectangle($rx,$ry,$width,$height)); + $prect->Stroke($img); + } + } + + // Stroke the outline of the bar + if( is_array($this->color) ) { + $img->SetColor($this->color[$i % count($this->color)]); + } + else { + $img->SetColor($this->color); + } + + $pts[] = $pts[0]; + $pts[] = $pts[1]; + + if( $this->weight > 0 ) { + $img->SetLineWeight($this->weight); + $img->Polygon($pts); + } + + // Determine how to best position the values of the individual bars + $x=$pts[2]+($pts[4]-$pts[2])/2; + $this->value->SetMargin(5); + + if( $this->valuepos=='top' ) { + $y=$pts[3]; + if( $img->a === 90 ) { + if( $val < 0 ) { + $this->value->SetAlign('right','center'); + } + else { + $this->value->SetAlign('left','center'); + } + + } + else { + if( $val < 0 ) { + $this->value->SetMargin(-5); + $y=$pts[1]; + $this->value->SetAlign('center','bottom'); + } + else { + $this->value->SetAlign('center','bottom'); + } + + } + $this->value->Stroke($img,$val,$x,$y); + } + elseif( $this->valuepos=='max' ) { + $y=$pts[3]; + if( $img->a === 90 ) { + if( $val < 0 ) + $this->value->SetAlign('left','center'); + else + $this->value->SetAlign('right','center'); + } + else { + if( $val < 0 ) { + $this->value->SetAlign('center','bottom'); + } + else { + $this->value->SetAlign('center','top'); + } + } + $this->value->SetMargin(-5); + $this->value->Stroke($img,$val,$x,$y); + } + elseif( $this->valuepos=='center' ) { + $y = ($pts[3] + $pts[1])/2; + $this->value->SetAlign('center','center'); + $this->value->SetMargin(0); + $this->value->Stroke($img,$val,$x,$y); + } + elseif( $this->valuepos=='bottom' || $this->valuepos=='min' ) { + $y=$pts[1]; + if( $img->a === 90 ) { + if( $val < 0 ) + $this->value->SetAlign('right','center'); + else + $this->value->SetAlign('left','center'); + } + $this->value->SetMargin(3); + $this->value->Stroke($img,$val,$x,$y); + } + else { + JpGraphError::RaiseL(2006,$this->valuepos); + //'Unknown position for values on bars :'.$this->valuepos); + } + // Create the client side image map + $rpts = $img->ArrRotate($pts); + $csimcoord=round($rpts[0]).", ".round($rpts[1]); + for( $j=1; $j < 4; ++$j){ + $csimcoord .= ", ".round($rpts[2*$j]).", ".round($rpts[2*$j+1]); + } + if( !empty($this->csimtargets[$i]) ) { + $this->csimareas .= 'csimareas .= " href=\"".htmlentities($this->csimtargets[$i])."\""; + + if( !empty($this->csimwintargets[$i]) ) { + $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; + } + + $sval=''; + if( !empty($this->csimalts[$i]) ) { + $sval=sprintf($this->csimalts[$i],$this->coords[0][$i]); + $this->csimareas .= " title=\"$sval\" alt=\"$sval\" "; + } + $this->csimareas .= " />\n"; + } + } + return true; } } // Class @@ -563,87 +626,88 @@ class BarPlot extends Plot { //=================================================== class GroupBarPlot extends BarPlot { private $plots, $nbrplots=0; -//--------------- -// CONSTRUCTOR + //--------------- + // CONSTRUCTOR function GroupBarPlot($plots) { - $this->width=0.7; - $this->plots = $plots; - $this->nbrplots = count($plots); - if( $this->nbrplots < 1 ) { - JpGraphError::Raise('Cannot create GroupBarPlot from empty plot array.'); - } - for($i=0; $i < $this->nbrplots; ++$i ) { - if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) { - JpGraphError::Raise("Group bar plot element nbr $i is undefined or empty."); - } - } - $this->numpoints = $plots[0]->numpoints; - $this->width=0.7; + $this->width=0.7; + $this->plots = $plots; + $this->nbrplots = count($plots); + if( $this->nbrplots < 1 ) { + JpGraphError::RaiseL(2007);//('Cannot create GroupBarPlot from empty plot array.'); + } + for($i=0; $i < $this->nbrplots; ++$i ) { + if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) { + JpGraphError::RaiseL(2008,$i);//("Group bar plot element nbr $i is undefined or empty."); + } + } + $this->numpoints = $plots[0]->numpoints; + $this->width=0.7; } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function Legend($graph) { - $n = count($this->plots); - for($i=0; $i < $n; ++$i) { - $c = get_class($this->plots[$i]); - if( !($this->plots[$i] instanceof BarPlot) ) { - JpGraphError::Raise('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the Group Bar plot from an array of BarPlot or AccBarPlot objects. (Class = '.$c.')'); - } - $this->plots[$i]->DoLegend($graph); - } + $n = count($this->plots); + for($i=0; $i < $n; ++$i) { + $c = get_class($this->plots[$i]); + if( !($this->plots[$i] instanceof BarPlot) ) { + JpGraphError::RaiseL(2009,$c); + //('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the Group Bar plot from an array of BarPlot or AccBarPlot objects. (Class = '.$c.')'); + } + $this->plots[$i]->DoLegend($graph); + } } - - function Min() { - list($xmin,$ymin) = $this->plots[0]->Min(); - $n = count($this->plots); - for($i=0; $i < $n; ++$i) { - list($xm,$ym) = $this->plots[$i]->Min(); - $xmin = max($xmin,$xm); - $ymin = min($ymin,$ym); - } - return array($xmin,$ymin); - } - - function Max() { - list($xmax,$ymax) = $this->plots[0]->Max(); - $n = count($this->plots); - for($i=0; $i < $n; ++$i) { - list($xm,$ym) = $this->plots[$i]->Max(); - $xmax = max($xmax,$xm); - $ymax = max($ymax,$ym); - } - return array($xmax,$ymax); - } - - function GetCSIMareas() { - $n = count($this->plots); - $csimareas=''; - for($i=0; $i < $n; ++$i) { - $csimareas .= $this->plots[$i]->csimareas; - } - return $csimareas; - } - - // Stroke all the bars next to each other - function Stroke($img,$xscale,$yscale) { - $tmp=$xscale->off; - $n = count($this->plots); - $subwidth = $this->width/$this->nbrplots ; - for( $i=0; $i < $n; ++$i ) { - $this->plots[$i]->ymin=$this->ybase; - $this->plots[$i]->SetWidth($subwidth); - - // If the client have used SetTextTickInterval() then - // major_step will be > 1 and the positioning will fail. - // If we assume it is always one the positioning will work - // fine with a text scale but this will not work with - // arbitrary linear scale - $xscale->off = $tmp+$i*round($xscale->scale_factor* $subwidth); - $this->plots[$i]->Stroke($img,$xscale,$yscale); - } - $xscale->off=$tmp; + function Min() { + list($xmin,$ymin) = $this->plots[0]->Min(); + $n = count($this->plots); + for($i=0; $i < $n; ++$i) { + list($xm,$ym) = $this->plots[$i]->Min(); + $xmin = max($xmin,$xm); + $ymin = min($ymin,$ym); + } + return array($xmin,$ymin); + } + + function Max() { + list($xmax,$ymax) = $this->plots[0]->Max(); + $n = count($this->plots); + for($i=0; $i < $n; ++$i) { + list($xm,$ym) = $this->plots[$i]->Max(); + $xmax = max($xmax,$xm); + $ymax = max($ymax,$ym); + } + return array($xmax,$ymax); + } + + function GetCSIMareas() { + $n = count($this->plots); + $csimareas=''; + for($i=0; $i < $n; ++$i) { + $csimareas .= $this->plots[$i]->csimareas; + } + return $csimareas; + } + + // Stroke all the bars next to each other + function Stroke($img,$xscale,$yscale) { + $tmp=$xscale->off; + $n = count($this->plots); + $subwidth = $this->width/$this->nbrplots ; + + for( $i=0; $i < $n; ++$i ) { + $this->plots[$i]->ymin=$this->ybase; + $this->plots[$i]->SetWidth($subwidth); + + // If the client have used SetTextTickInterval() then + // major_step will be > 1 and the positioning will fail. + // If we assume it is always one the positioning will work + // fine with a text scale but this will not work with + // arbitrary linear scale + $xscale->off = $tmp+$i*round($xscale->scale_factor* $subwidth); + $this->plots[$i]->Stroke($img,$xscale,$yscale); + } + $xscale->off=$tmp; } } // Class @@ -653,355 +717,418 @@ class GroupBarPlot extends BarPlot { //=================================================== class AccBarPlot extends BarPlot { private $plots=null,$nbrplots=0; -//--------------- -// CONSTRUCTOR - function AccBarPlot($plots) { - $this->plots = $plots; - $this->nbrplots = count($plots); - if( $this->nbrplots < 1 ) { - JpGraphError::Raise('Cannot create AccBarPlot from empty plot array.'); - } - for($i=0; $i < $this->nbrplots; ++$i ) { - if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) { - JpGraphError::Raise("Acc bar plot element nbr $i is undefined or empty."); - } - } - $this->numpoints = $plots[0]->numpoints; - $this->value = new DisplayValue(); + //--------------- + // CONSTRUCTOR + function __construct($plots) { + $this->plots = $plots; + $this->nbrplots = count($plots); + if( $this->nbrplots < 1 ) { + JpGraphError::RaiseL(2010);//('Cannot create AccBarPlot from empty plot array.'); + } + for($i=0; $i < $this->nbrplots; ++$i ) { + if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) { + JpGraphError::RaiseL(2011,$i);//("Acc bar plot element nbr $i is undefined or empty."); + } + } + + // We can only allow individual plost which do not have specified X-positions + for($i=0; $i < $this->nbrplots; ++$i ) { + if( !empty($this->plots[$i]->coords[1]) ) { + JpGraphError::RaiseL(2015); + //'Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-positions.'); + } + } + + // Use 0 weight by default which means that the individual bar + // weights will be used per part n the accumulated bar + $this->SetWeight(0); + + $this->numpoints = $plots[0]->numpoints; + $this->value = new DisplayValue(); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function Legend($graph) { - $n = count($this->plots); - for( $i=$n-1; $i >= 0; --$i ) { - $c = get_class($this->plots[$i]); - if( !($this->plots[$i] instanceof BarPlot) ) { - JpGraphError::Raise('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects.(Class='.$c.')'); - } - $this->plots[$i]->DoLegend($graph); - } + $n = count($this->plots); + for( $i=$n-1; $i >= 0; --$i ) { + $c = get_class($this->plots[$i]); + if( !($this->plots[$i] instanceof BarPlot) ) { + JpGraphError::RaiseL(2012,$c); + //('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects.(Class='.$c.')'); + } + $this->plots[$i]->DoLegend($graph); + } } function Max() { - list($xmax) = $this->plots[0]->Max(); - $nmax=0; - for($i=0; $i < count($this->plots); ++$i) { - $n = count($this->plots[$i]->coords[0]); - $nmax = max($nmax,$n); - list($x) = $this->plots[$i]->Max(); - $xmax = max($xmax,$x); - } - for( $i = 0; $i < $nmax; $i++ ) { - // Get y-value for bar $i by adding the - // individual bars from all the plots added. - // It would be wrong to just add the - // individual plots max y-value since that - // would in most cases give to large y-value. - $y=0; - if( !isset($this->plots[0]->coords[0][$i]) ) { - JpGraphError::RaiseL(2014); - } - if( $this->plots[0]->coords[0][$i] > 0 ) - $y=$this->plots[0]->coords[0][$i]; - for( $j = 1; $j < $this->nbrplots; $j++ ) { - if( !isset($this->plots[$j]->coords[0][$i]) ) { - JpGraphError::RaiseL(2014); - } - if( $this->plots[$j]->coords[0][$i] > 0 ) - $y += $this->plots[$j]->coords[0][$i]; - } - $ymax[$i] = $y; - } - $ymax = max($ymax); + list($xmax) = $this->plots[0]->Max(); + $nmax=0; + for($i=0; $i < count($this->plots); ++$i) { + $n = count($this->plots[$i]->coords[0]); + $nmax = max($nmax,$n); + list($x) = $this->plots[$i]->Max(); + $xmax = max($xmax,$x); + } + for( $i = 0; $i < $nmax; $i++ ) { + // Get y-value for bar $i by adding the + // individual bars from all the plots added. + // It would be wrong to just add the + // individual plots max y-value since that + // would in most cases give to large y-value. + $y=0; + if( !isset($this->plots[0]->coords[0][$i]) ) { + JpGraphError::RaiseL(2014); + } + if( $this->plots[0]->coords[0][$i] > 0 ) + $y=$this->plots[0]->coords[0][$i]; + for( $j = 1; $j < $this->nbrplots; $j++ ) { + if( !isset($this->plots[$j]->coords[0][$i]) ) { + JpGraphError::RaiseL(2014); + } + if( $this->plots[$j]->coords[0][$i] > 0 ) + $y += $this->plots[$j]->coords[0][$i]; + } + $ymax[$i] = $y; + } + $ymax = max($ymax); - // Bar always start at baseline - if( $ymax <= $this->ybase ) - $ymax = $this->ybase; - return array($xmax,$ymax); + // Bar always start at baseline + if( $ymax <= $this->ybase ) + $ymax = $this->ybase; + return array($xmax,$ymax); } function Min() { - $nmax=0; - list($xmin,$ysetmin) = $this->plots[0]->Min(); - for($i=0; $i < count($this->plots); ++$i) { - $n = count($this->plots[$i]->coords[0]); - $nmax = max($nmax,$n); - list($x,$y) = $this->plots[$i]->Min(); - $xmin = Min($xmin,$x); - $ysetmin = Min($y,$ysetmin); - } - for( $i = 0; $i < $nmax; $i++ ) { - // Get y-value for bar $i by adding the - // individual bars from all the plots added. - // It would be wrong to just add the - // individual plots max y-value since that - // would in most cases give to large y-value. - $y=0; - if( $this->plots[0]->coords[0][$i] < 0 ) - $y=$this->plots[0]->coords[0][$i]; - for( $j = 1; $j < $this->nbrplots; $j++ ) { - if( $this->plots[$j]->coords[0][$i] < 0 ) - $y += $this->plots[ $j ]->coords[0][$i]; - } - $ymin[$i] = $y; - } - $ymin = Min($ysetmin,Min($ymin)); - // Bar always start at baseline - if( $ymin >= $this->ybase ) - $ymin = $this->ybase; - return array($xmin,$ymin); + $nmax=0; + list($xmin,$ysetmin) = $this->plots[0]->Min(); + for($i=0; $i < count($this->plots); ++$i) { + $n = count($this->plots[$i]->coords[0]); + $nmax = max($nmax,$n); + list($x,$y) = $this->plots[$i]->Min(); + $xmin = Min($xmin,$x); + $ysetmin = Min($y,$ysetmin); + } + for( $i = 0; $i < $nmax; $i++ ) { + // Get y-value for bar $i by adding the + // individual bars from all the plots added. + // It would be wrong to just add the + // individual plots max y-value since that + // would in most cases give to large y-value. + $y=0; + if( $this->plots[0]->coords[0][$i] < 0 ) + $y=$this->plots[0]->coords[0][$i]; + for( $j = 1; $j < $this->nbrplots; $j++ ) { + if( $this->plots[$j]->coords[0][$i] < 0 ) + $y += $this->plots[ $j ]->coords[0][$i]; + } + $ymin[$i] = $y; + } + $ymin = Min($ysetmin,Min($ymin)); + // Bar always start at baseline + if( $ymin >= $this->ybase ) + $ymin = $this->ybase; + return array($xmin,$ymin); } // Stroke acc bar plot function Stroke($img,$xscale,$yscale) { - $pattern=NULL; - $img->SetLineWeight($this->weight); - for($i=0; $i < $this->numpoints-1; $i++) { - $accy = 0; - $accy_neg = 0; - for($j=0; $j < $this->nbrplots; ++$j ) { - $img->SetColor($this->plots[$j]->color); + $pattern=NULL; + $img->SetLineWeight($this->weight); + $grad=null; + for($i=0; $i < $this->numpoints-1; $i++) { + $accy = 0; + $accy_neg = 0; + for($j=0; $j < $this->nbrplots; ++$j ) { + $img->SetColor($this->plots[$j]->color); - if ( $this->plots[$j]->coords[0][$i] >= 0) { - $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy); - $accyt=$yscale->Translate($accy); - $accy+=$this->plots[$j]->coords[0][$i]; - } - else { - //if ( $this->plots[$j]->coords[0][$i] < 0 || $accy_neg < 0 ) { - $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg); - $accyt=$yscale->Translate($accy_neg); - $accy_neg+=$this->plots[$j]->coords[0][$i]; - } - - $xt=$xscale->Translate($i); + if ( $this->plots[$j]->coords[0][$i] >= 0) { + $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy); + $accyt=$yscale->Translate($accy); + $accy+=$this->plots[$j]->coords[0][$i]; + } + else { + //if ( $this->plots[$j]->coords[0][$i] < 0 || $accy_neg < 0 ) { + $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg); + $accyt=$yscale->Translate($accy_neg); + $accy_neg+=$this->plots[$j]->coords[0][$i]; + } - if( $this->abswidth > -1 ) - $abswidth=$this->abswidth; - else - $abswidth=round($this->width*$xscale->scale_factor,0); - - $pts=array($xt,$accyt,$xt,$yt,$xt+$abswidth,$yt,$xt+$abswidth,$accyt); + $xt=$xscale->Translate($i); - if( $this->bar_shadow ) { - $ssh = $this->bar_shadow_hsize; - $ssv = $this->bar_shadow_vsize; - - // We must also differ if we are a positive or negative bar. - if( $j === 0 ) { - // This gets extra complicated since we have to - // see all plots to see if we are negative. It could - // for example be that all plots are 0 until the very - // last one. We therefore need to save the initial setup - // for both the negative and positive case + if( $this->abswidth > -1 ) { + $abswidth=$this->abswidth; + } + else { + $abswidth=round($this->width*$xscale->scale_factor,0); + } - // In case the final bar is positive - $sp[0]=$pts[6]+1; $sp[1]=$pts[7]; - $sp[2]=$pts[6]+$ssh; $sp[3]=$pts[7]-$ssv; + $pts=array($xt,$accyt,$xt,$yt,$xt+$abswidth,$yt,$xt+$abswidth,$accyt); - // In case the final bar is negative - $nsp[0]=$pts[0]; $nsp[1]=$pts[1]; - $nsp[2]=$pts[0]+$ssh; $nsp[3]=$pts[1]-$ssv; - $nsp[4]=$pts[6]+$ssh; $nsp[5]=$pts[7]-$ssv; - $nsp[10]=$pts[6]+1; $nsp[11]=$pts[7]; - } + if( $this->bar_shadow ) { + $ssh = $this->bar_shadow_hsize; + $ssv = $this->bar_shadow_vsize; - if( $j === $this->nbrplots-1 ) { - // If this is the last plot of the bar and - // the total value is larger than 0 then we - // add the shadow. - if( is_array($this->bar_shadow_color) ) { - $numcolors = count($this->bar_shadow_color); - if( $numcolors == 0 ) { - JpGraphError::Raise('You have specified an empty array for shadow colors in the bar plot.'); - } - $img->PushColor($this->bar_shadow_color[$i % $numcolors]); - } - else { - $img->PushColor($this->bar_shadow_color); - } + // We must also differ if we are a positive or negative bar. + if( $j === 0 ) { + // This gets extra complicated since we have to + // see all plots to see if we are negative. It could + // for example be that all plots are 0 until the very + // last one. We therefore need to save the initial setup + // for both the negative and positive case - if( $accy > 0 ) { - $sp[4]=$pts[4]+$ssh; $sp[5]=$pts[5]-$ssv; - $sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv; - $sp[8]=$pts[2]; $sp[9]=$pts[3]-1; - $sp[10]=$pts[4]+1; $sp[11]=$pts[5]; - $img->FilledPolygon($sp,4); - } - elseif( $accy_neg < 0 ) { - $nsp[6]=$pts[4]+$ssh; $nsp[7]=$pts[5]-$ssv; - $nsp[8]=$pts[4]+1; $nsp[9]=$pts[5]; - $img->FilledPolygon($nsp,4); - } - $img->PopColor(); - } - } + // In case the final bar is positive + $sp[0]=$pts[6]+1; $sp[1]=$pts[7]; + $sp[2]=$pts[6]+$ssh; $sp[3]=$pts[7]-$ssv; + + // In case the final bar is negative + $nsp[0]=$pts[0]; $nsp[1]=$pts[1]; + $nsp[2]=$pts[0]+$ssh; $nsp[3]=$pts[1]-$ssv; + $nsp[4]=$pts[6]+$ssh; $nsp[5]=$pts[7]-$ssv; + $nsp[10]=$pts[6]+1; $nsp[11]=$pts[7]; + } + + if( $j === $this->nbrplots-1 ) { + // If this is the last plot of the bar and + // the total value is larger than 0 then we + // add the shadow. + if( is_array($this->bar_shadow_color) ) { + $numcolors = count($this->bar_shadow_color); + if( $numcolors == 0 ) { + JpGraphError::RaiseL(2013);//('You have specified an empty array for shadow colors in the bar plot.'); + } + $img->PushColor($this->bar_shadow_color[$i % $numcolors]); + } + else { + $img->PushColor($this->bar_shadow_color); + } + + if( $accy > 0 ) { + $sp[4]=$pts[4]+$ssh; $sp[5]=$pts[5]-$ssv; + $sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv; + $sp[8]=$pts[2]; $sp[9]=$pts[3]-1; + $sp[10]=$pts[4]+1; $sp[11]=$pts[5]; + $img->FilledPolygon($sp,4); + } + elseif( $accy_neg < 0 ) { + $nsp[6]=$pts[4]+$ssh; $nsp[7]=$pts[5]-$ssv; + $nsp[8]=$pts[4]+1; $nsp[9]=$pts[5]; + $img->FilledPolygon($nsp,4); + } + $img->PopColor(); + } + } - // If value is NULL or 0, then don't draw a bar at all - if ($this->plots[$j]->coords[0][$i] == 0 ) continue; + // If value is NULL or 0, then don't draw a bar at all + if ($this->plots[$j]->coords[0][$i] == 0 ) continue; - if( $this->plots[$j]->grad ) { - $grad = new Gradient($img); - $grad->FilledRectangle( - $pts[2],$pts[3], - $pts[6],$pts[7], - $this->plots[$j]->grad_fromcolor, - $this->plots[$j]->grad_tocolor, - $this->plots[$j]->grad_style); - } else { - if (is_array($this->plots[$j]->fill_color) ) { - $numcolors = count($this->plots[$j]->fill_color); - $fillcolor = $this->plots[$j]->fill_color[$i % $numcolors]; - // If the bar is specified to be non filled then the fill color is false - if( $fillcolor !== false ) - $img->SetColor($this->plots[$j]->fill_color[$i % $numcolors]); - } - else { - $fillcolor = $this->plots[$j]->fill_color; - if( $fillcolor !== false ) - $img->SetColor($this->plots[$j]->fill_color); - } - if( $fillcolor !== false ) - $img->FilledPolygon($pts); - $img->SetColor($this->plots[$j]->color); - } + if( $this->plots[$j]->grad ) { + if( $grad === null ) { + $grad = new Gradient($img); + } + if( is_array($this->plots[$j]->grad_fromcolor) ) { + // The first argument (grad_fromcolor) can be either an array or a single color. If it is an array + // then we have two choices. It can either a) be a single color specified as an RGB triple or it can be + // an array to specify both (from, to style) for each individual bar. The way to know the difference is + // to investgate the first element. If this element is an integer [0,255] then we assume it is an RGB + // triple. + $ng = count($this->plots[$j]->grad_fromcolor); + if( $ng === 3 ) { + if( is_numeric($this->plots[$j]->grad_fromcolor[0]) && $this->plots[$j]->grad_fromcolor[0] > 0 && + $this->plots[$j]->grad_fromcolor[0] < 256 ) { + // RGB Triple + $fromcolor = $this->plots[$j]->grad_fromcolor; + $tocolor = $this->plots[$j]->grad_tocolor; + $style = $this->plots[$j]->grad_style; + } + else { + $fromcolor = $this->plots[$j]->grad_fromcolor[$i % $ng][0]; + $tocolor = $this->plots[$j]->grad_fromcolor[$i % $ng][1]; + $style = $this->plots[$j]->grad_fromcolor[$i % $ng][2]; + } + } + else { + $fromcolor = $this->plots[$j]->grad_fromcolor[$i % $ng][0]; + $tocolor = $this->plots[$j]->grad_fromcolor[$i % $ng][1]; + $style = $this->plots[$j]->grad_fromcolor[$i % $ng][2]; + } + $grad->FilledRectangle($pts[2],$pts[3], + $pts[6],$pts[7], + $fromcolor,$tocolor,$style); + } + else { + $grad->FilledRectangle($pts[2],$pts[3], + $pts[6],$pts[7], + $this->plots[$j]->grad_fromcolor, + $this->plots[$j]->grad_tocolor, + $this->plots[$j]->grad_style); + } + } else { + if (is_array($this->plots[$j]->fill_color) ) { + $numcolors = count($this->plots[$j]->fill_color); + $fillcolor = $this->plots[$j]->fill_color[$i % $numcolors]; + // If the bar is specified to be non filled then the fill color is false + if( $fillcolor !== false ) { + $img->SetColor($this->plots[$j]->fill_color[$i % $numcolors]); + } + } + else { + $fillcolor = $this->plots[$j]->fill_color; + if( $fillcolor !== false ) { + $img->SetColor($this->plots[$j]->fill_color); + } + } + if( $fillcolor !== false ) { + $img->FilledPolygon($pts); + } + } - // Stroke the pattern - if( $this->plots[$j]->iPattern > -1 ) { - if( $pattern===NULL ) - $pattern = new RectPatternFactory(); - - $prect = $pattern->Create($this->plots[$j]->iPattern,$this->plots[$j]->iPatternColor,1); - $prect->SetDensity($this->plots[$j]->iPatternDensity); - if( $this->plots[$j]->coords[0][$i] < 0 ) { - $rx = $pts[0]; - $ry = $pts[1]; - } - else { - $rx = $pts[2]; - $ry = $pts[3]; - } - $width = abs($pts[4]-$pts[0])+1; - $height = abs($pts[1]-$pts[3])+1; - $prect->SetPos(new Rectangle($rx,$ry,$width,$height)); - $prect->Stroke($img); - } + $img->SetColor($this->plots[$j]->color); + + // Stroke the pattern + if( $this->plots[$j]->iPattern > -1 ) { + if( $pattern===NULL ) { + $pattern = new RectPatternFactory(); + } + + $prect = $pattern->Create($this->plots[$j]->iPattern,$this->plots[$j]->iPatternColor,1); + $prect->SetDensity($this->plots[$j]->iPatternDensity); + if( $this->plots[$j]->coords[0][$i] < 0 ) { + $rx = $pts[0]; + $ry = $pts[1]; + } + else { + $rx = $pts[2]; + $ry = $pts[3]; + } + $width = abs($pts[4]-$pts[0])+1; + $height = abs($pts[1]-$pts[3])+1; + $prect->SetPos(new Rectangle($rx,$ry,$width,$height)); + $prect->Stroke($img); + } - // CSIM array + // CSIM array - if( $i < count($this->plots[$j]->csimtargets) ) { - // Create the client side image map - $rpts = $img->ArrRotate($pts); - $csimcoord=round($rpts[0]).", ".round($rpts[1]); - for( $k=1; $k < 4; ++$k){ - $csimcoord .= ", ".round($rpts[2*$k]).", ".round($rpts[2*$k+1]); - } - if( ! empty($this->plots[$j]->csimtargets[$i]) ) { - $this->csimareas.= 'csimareas.= " href=\"".$this->plots[$j]->csimtargets[$i]."\" "; + if( $i < count($this->plots[$j]->csimtargets) ) { + // Create the client side image map + $rpts = $img->ArrRotate($pts); + $csimcoord=round($rpts[0]).", ".round($rpts[1]); + for( $k=1; $k < 4; ++$k){ + $csimcoord .= ", ".round($rpts[2*$k]).", ".round($rpts[2*$k+1]); + } + if( ! empty($this->plots[$j]->csimtargets[$i]) ) { + $this->csimareas.= 'csimareas.= " href=\"".$this->plots[$j]->csimtargets[$i]."\" "; - if( ! empty($this->plots[$j]->csimwintargets[$i]) ) { - $this->csimareas.= " target=\"".$this->plots[$j]->csimwintargets[$i]."\" "; - } + if( ! empty($this->plots[$j]->csimwintargets[$i]) ) { + $this->csimareas.= " target=\"".$this->plots[$j]->csimwintargets[$i]."\" "; + } - $sval=''; - if( !empty($this->plots[$j]->csimalts[$i]) ) { - $sval=sprintf($this->plots[$j]->csimalts[$i],$this->plots[$j]->coords[0][$i]); - $this->csimareas .= " title=\"$sval\" "; - } - $this->csimareas .= " alt=\"$sval\" />\n"; - } - } + $sval=''; + if( !empty($this->plots[$j]->csimalts[$i]) ) { + $sval=sprintf($this->plots[$j]->csimalts[$i],$this->plots[$j]->coords[0][$i]); + $this->csimareas .= " title=\"$sval\" "; + } + $this->csimareas .= " alt=\"$sval\" />\n"; + } + } - $pts[] = $pts[0]; - $pts[] = $pts[1]; - $img->SetLineWeight($this->plots[$j]->line_weight); - $img->Polygon($pts); - $img->SetLineWeight(1); - } - - // Draw labels for each acc.bar - - $x=$pts[2]+($pts[4]-$pts[2])/2; - if($this->bar_shadow) $x += $ssh; + $pts[] = $pts[0]; + $pts[] = $pts[1]; + $img->SetLineWeight($this->plots[$j]->weight); + $img->Polygon($pts); + $img->SetLineWeight(1); + } - // First stroke the accumulated value for the entire bar - // This value is always placed at the top/bottom of the bars - if( $accy_neg < 0 ) { - $y=$yscale->Translate($accy_neg); - $this->value->Stroke($img,$accy_neg,$x,$y); - } - else { - $y=$yscale->Translate($accy); - $this->value->Stroke($img,$accy,$x,$y); - } + // Daw potential bar around the entire accbar bar + if( $this->weight > 0 ) { + $y=$yscale->Translate(0); + $img->SetColor($this->color); + $img->SetLineWeight($this->weight); + $img->Rectangle($pts[0],$y,$pts[6],$pts[5]); + } - $accy = 0; - $accy_neg = 0; - for($j=0; $j < $this->nbrplots; ++$j ) { + // Draw labels for each acc.bar - // We don't print 0 values in an accumulated bar plot - if( $this->plots[$j]->coords[0][$i] == 0 ) continue; - - if ($this->plots[$j]->coords[0][$i] > 0) { - $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy); - $accyt=$yscale->Translate($accy); - if( $this->plots[$j]->valuepos=='center' ) { - $y = $accyt-($accyt-$yt)/2; - } - elseif( $this->plots[$j]->valuepos=='bottom' ) { - $y = $accyt; - } - else { // top or max - $y = $accyt-($accyt-$yt); - } - $accy+=$this->plots[$j]->coords[0][$i]; - if( $this->plots[$j]->valuepos=='center' ) { - $this->plots[$j]->value->SetAlign("center","center"); - $this->plots[$j]->value->SetMargin(0); - } - elseif( $this->plots[$j]->valuepos=='bottom' ) { - $this->plots[$j]->value->SetAlign('center','bottom'); - $this->plots[$j]->value->SetMargin(2); - } - else { - $this->plots[$j]->value->SetAlign('center','top'); - $this->plots[$j]->value->SetMargin(1); - } - } else { - $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg); - $accyt=$yscale->Translate($accy_neg); - $accy_neg+=$this->plots[$j]->coords[0][$i]; - if( $this->plots[$j]->valuepos=='center' ) { - $y = $accyt-($accyt-$yt)/2; - } - elseif( $this->plots[$j]->valuepos=='bottom' ) { - $y = $accyt; - } - else { - $y = $accyt-($accyt-$yt); - } - if( $this->plots[$j]->valuepos=='center' ) { - $this->plots[$j]->value->SetAlign("center","center"); - $this->plots[$j]->value->SetMargin(0); - } - elseif( $this->plots[$j]->valuepos=='bottom' ) { - $this->plots[$j]->value->SetAlign('center',$j==0 ? 'bottom':'top'); - $this->plots[$j]->value->SetMargin(-2); - } - else { - $this->plots[$j]->value->SetAlign('center','bottom'); - $this->plots[$j]->value->SetMargin(-1); - } - } - $this->plots[$j]->value->Stroke($img,$this->plots[$j]->coords[0][$i],$x,$y); - } + $x=$pts[2]+($pts[4]-$pts[2])/2; + if($this->bar_shadow) $x += $ssh; - } - return true; + // First stroke the accumulated value for the entire bar + // This value is always placed at the top/bottom of the bars + if( $accy_neg < 0 ) { + $y=$yscale->Translate($accy_neg); + $this->value->Stroke($img,$accy_neg,$x,$y); + } + else { + $y=$yscale->Translate($accy); + $this->value->Stroke($img,$accy,$x,$y); + } + + $accy = 0; + $accy_neg = 0; + for($j=0; $j < $this->nbrplots; ++$j ) { + + // We don't print 0 values in an accumulated bar plot + if( $this->plots[$j]->coords[0][$i] == 0 ) continue; + + if ($this->plots[$j]->coords[0][$i] > 0) { + $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy); + $accyt=$yscale->Translate($accy); + if( $this->plots[$j]->valuepos=='center' ) { + $y = $accyt-($accyt-$yt)/2; + } + elseif( $this->plots[$j]->valuepos=='bottom' ) { + $y = $accyt; + } + else { // top or max + $y = $accyt-($accyt-$yt); + } + $accy+=$this->plots[$j]->coords[0][$i]; + if( $this->plots[$j]->valuepos=='center' ) { + $this->plots[$j]->value->SetAlign("center","center"); + $this->plots[$j]->value->SetMargin(0); + } + elseif( $this->plots[$j]->valuepos=='bottom' ) { + $this->plots[$j]->value->SetAlign('center','bottom'); + $this->plots[$j]->value->SetMargin(2); + } + else { + $this->plots[$j]->value->SetAlign('center','top'); + $this->plots[$j]->value->SetMargin(1); + } + } else { + $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg); + $accyt=$yscale->Translate($accy_neg); + $accy_neg+=$this->plots[$j]->coords[0][$i]; + if( $this->plots[$j]->valuepos=='center' ) { + $y = $accyt-($accyt-$yt)/2; + } + elseif( $this->plots[$j]->valuepos=='bottom' ) { + $y = $accyt; + } + else { + $y = $accyt-($accyt-$yt); + } + if( $this->plots[$j]->valuepos=='center' ) { + $this->plots[$j]->value->SetAlign("center","center"); + $this->plots[$j]->value->SetMargin(0); + } + elseif( $this->plots[$j]->valuepos=='bottom' ) { + $this->plots[$j]->value->SetAlign('center',$j==0 ? 'bottom':'top'); + $this->plots[$j]->value->SetMargin(-2); + } + else { + $this->plots[$j]->value->SetAlign('center','bottom'); + $this->plots[$j]->value->SetMargin(-1); + } + } + $this->plots[$j]->value->Stroke($img,$this->plots[$j]->coords[0][$i],$x,$y); + } + + } + return true; } } // Class diff --git a/libs/jpgraph/jpgraph_canvas.php b/libs/jpgraph/jpgraph_canvas.php index fbd9473..e1f4ad0 100644 --- a/libs/jpgraph/jpgraph_canvas.php +++ b/libs/jpgraph/jpgraph_canvas.php @@ -1,13 +1,13 @@ Graph($aWidth,$aHeight,$aCachedName,$timeout,$inline); + //--------------- + // CONSTRUCTOR + function __construct($aWidth=300,$aHeight=200,$aCachedName="",$timeout=0,$inline=1) { + parent::__construct($aWidth,$aHeight,$aCachedName,$timeout,$inline); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function InitFrame() { - $this->StrokePlotArea(); + $this->StrokePlotArea(); } // Method description function Stroke($aStrokeFileName="") { - if( $this->texts != null ) { - for($i=0; $i < count($this->texts); ++$i) { - $this->texts[$i]->Stroke($this->img); - } - } - if( $this->iTables !== null ) { - for($i=0; $i < count($this->iTables); ++$i) { - $this->iTables[$i]->Stroke($this->img); - } - } - $this->StrokeTitles(); + if( $this->texts != null ) { + for($i=0; $i < count($this->texts); ++$i) { + $this->texts[$i]->Stroke($this->img); + } + } + if( $this->iTables !== null ) { + for($i=0; $i < count($this->iTables); ++$i) { + $this->iTables[$i]->Stroke($this->img); + } + } + $this->StrokeTitles(); - // If the filename is the predefined value = '_csim_special_' - // we assume that the call to stroke only needs to do enough - // to correctly generate the CSIM maps. - // We use this variable to skip things we don't strictly need - // to do to generate the image map to improve performance - // a best we can. Therefor you will see a lot of tests !$_csim in the - // code below. - $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); + // If the filename is the predefined value = '_csim_special_' + // we assume that the call to stroke only needs to do enough + // to correctly generate the CSIM maps. + // We use this variable to skip things we don't strictly need + // to do to generate the image map to improve performance + // a best we can. Therefor you will see a lot of tests !$_csim in the + // code below. + $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); - // We need to know if we have stroked the plot in the - // GetCSIMareas. Otherwise the CSIM hasn't been generated - // and in the case of GetCSIM called before stroke to generate - // CSIM without storing an image to disk GetCSIM must call Stroke. - $this->iHasStroked = true; + // We need to know if we have stroked the plot in the + // GetCSIMareas. Otherwise the CSIM hasn't been generated + // and in the case of GetCSIM called before stroke to generate + // CSIM without storing an image to disk GetCSIM must call Stroke. + $this->iHasStroked = true; - if( !$_csim ) { + if( !$_csim ) { - // Should we do any final image transformation - if( $this->iImgTrans ) { - if( !class_exists('ImgTrans') ) { - require_once('jpgraph_imgtrans.php'); - } - - $tform = new ImgTrans($this->img->img); - $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, - $this->iImgTransDirection,$this->iImgTransHighQ, - $this->iImgTransMinSize,$this->iImgTransFillColor, - $this->iImgTransBorder); - } - + // Should we do any final image transformation + if( $this->iImgTrans ) { + if( !class_exists('ImgTrans') ) { + require_once('jpgraph_imgtrans.php'); + } - // If the filename is given as the special _IMG_HANDLER - // then the image handler is returned and the image is NOT - // streamed back - if( $aStrokeFileName == _IMG_HANDLER ) { - return $this->img->img; - } - else { - // Finally stream the generated picture - $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName); - return true; - } - } + $tform = new ImgTrans($this->img->img); + $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, + $this->iImgTransDirection,$this->iImgTransHighQ, + $this->iImgTransMinSize,$this->iImgTransFillColor, + $this->iImgTransBorder); + } + + + // If the filename is given as the special _IMG_HANDLER + // then the image handler is returned and the image is NOT + // streamed back + if( $aStrokeFileName == _IMG_HANDLER ) { + return $this->img->img; + } + else { + // Finally stream the generated picture + $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName); + return true; + } + } } } // Class diff --git a/libs/jpgraph/jpgraph_canvtools.php b/libs/jpgraph/jpgraph_canvtools.php index 5f8a4dc..bb821bf 100644 --- a/libs/jpgraph/jpgraph_canvtools.php +++ b/libs/jpgraph/jpgraph_canvtools.php @@ -1,18 +1,18 @@ g = $graph; - $this->w = $graph->img->width; - $this->h = $graph->img->height; - $this->ixmin = $xmin; - $this->ixmax = $xmax; - $this->iymin = $ymin; - $this->iymax = $ymax; + function __construct($graph,$xmin=0,$xmax=10,$ymin=0,$ymax=10) { + $this->g = $graph; + $this->w = $graph->img->width; + $this->h = $graph->img->height; + $this->ixmin = $xmin; + $this->ixmax = $xmax; + $this->iymin = $ymin; + $this->iymax = $ymax; } - + function Set($xmin=0,$xmax=10,$ymin=0,$ymax=10) { - $this->ixmin = $xmin; - $this->ixmax = $xmax; - $this->iymin = $ymin; - $this->iymax = $ymax; + $this->ixmin = $xmin; + $this->ixmax = $xmax; + $this->iymin = $ymin; + $this->iymax = $ymax; + } + + function Get() { + return array($this->ixmin,$this->ixmax,$this->iymin,$this->iymax); } function Translate($x,$y) { - $xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w); - $yp = round(($y-$this->iymin)/($this->iymax - $this->iymin) * $this->h); - return array($xp,$yp); + $xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w); + $yp = round(($y-$this->iymin)/($this->iymax - $this->iymin) * $this->h); + return array($xp,$yp); } function TranslateX($x) { - $xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w); - return $xp; + $xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w); + return $xp; } function TranslateY($y) { - $yp = round(($y-$this->iymin)/($this->iymax - $this->iymin) * $this->h); - return $yp; + $yp = round(($y-$this->iymin)/($this->iymax - $this->iymin) * $this->h); + return $yp; } } @@ -69,40 +73,44 @@ class CanvasScale { class Shape { private $img,$scale; - function Shape($aGraph,$scale) { - $this->img = $aGraph->img; - $this->img->SetColor('black'); - $this->scale = $scale; + function __construct($aGraph,$scale) { + $this->img = $aGraph->img; + $this->img->SetColor('black'); + $this->scale = $scale; } function SetColor($aColor) { - $this->img->SetColor($aColor); + $this->img->SetColor($aColor); } function Line($x1,$y1,$x2,$y2) { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - list($x2,$y2) = $this->scale->Translate($x2,$y2); - $this->img->Line($x1,$y1,$x2,$y2); + list($x1,$y1) = $this->scale->Translate($x1,$y1); + list($x2,$y2) = $this->scale->Translate($x2,$y2); + $this->img->Line($x1,$y1,$x2,$y2); + } + + function SetLineWeight($aWeight) { + $this->img->SetLineWeight($aWeight); } function Polygon($p,$aClosed=false) { - $n=count($p); - for($i=0; $i < $n; $i+=2 ) { - $p[$i] = $this->scale->TranslateX($p[$i]); - $p[$i+1] = $this->scale->TranslateY($p[$i+1]); - } - $this->img->Polygon($p,$aClosed); + $n=count($p); + for($i=0; $i < $n; $i+=2 ) { + $p[$i] = $this->scale->TranslateX($p[$i]); + $p[$i+1] = $this->scale->TranslateY($p[$i+1]); + } + $this->img->Polygon($p,$aClosed); } function FilledPolygon($p) { - $n=count($p); - for($i=0; $i < $n; $i+=2 ) { - $p[$i] = $this->scale->TranslateX($p[$i]); - $p[$i+1] = $this->scale->TranslateY($p[$i+1]); - } - $this->img->FilledPolygon($p); + $n=count($p); + for($i=0; $i < $n; $i+=2 ) { + $p[$i] = $this->scale->TranslateX($p[$i]); + $p[$i+1] = $this->scale->TranslateY($p[$i+1]); + } + $this->img->FilledPolygon($p); } - + // Draw a bezier curve with defining points in the $aPnts array // using $aSteps steps. @@ -111,265 +119,265 @@ class Shape { // 4=x2, 5=y2 // 6=x3, 7=y3 function Bezier($p,$aSteps=40) { - $x0 = $p[0]; - $y0 = $p[1]; - // Calculate coefficients - $cx = 3*($p[2]-$p[0]); - $bx = 3*($p[4]-$p[2])-$cx; - $ax = $p[6]-$p[0]-$cx-$bx; - $cy = 3*($p[3]-$p[1]); - $by = 3*($p[5]-$p[3])-$cy; - $ay = $p[7]-$p[1]-$cy-$by; + $x0 = $p[0]; + $y0 = $p[1]; + // Calculate coefficients + $cx = 3*($p[2]-$p[0]); + $bx = 3*($p[4]-$p[2])-$cx; + $ax = $p[6]-$p[0]-$cx-$bx; + $cy = 3*($p[3]-$p[1]); + $by = 3*($p[5]-$p[3])-$cy; + $ay = $p[7]-$p[1]-$cy-$by; - // Step size - $delta = 1.0/$aSteps; + // Step size + $delta = 1.0/$aSteps; - $x_old = $x0; - $y_old = $y0; - for($t=$delta; $t<=1.0; $t+=$delta) { - $tt = $t*$t; $ttt=$tt*$t; - $x = $ax*$ttt + $bx*$tt + $cx*$t + $x0; - $y = $ay*$ttt + $by*$tt + $cy*$t + $y0; - $this->Line($x_old,$y_old,$x,$y); - $x_old = $x; - $y_old = $y; - } - $this->Line($x_old,$y_old,$p[6],$p[7]); + $x_old = $x0; + $y_old = $y0; + for($t=$delta; $t<=1.0; $t+=$delta) { + $tt = $t*$t; $ttt=$tt*$t; + $x = $ax*$ttt + $bx*$tt + $cx*$t + $x0; + $y = $ay*$ttt + $by*$tt + $cy*$t + $y0; + $this->Line($x_old,$y_old,$x,$y); + $x_old = $x; + $y_old = $y; + } + $this->Line($x_old,$y_old,$p[6],$p[7]); } function Rectangle($x1,$y1,$x2,$y2) { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - list($x2,$y2) = $this->scale->Translate($x2,$y2); - $this->img->Rectangle($x1,$y1,$x2,$y2); + list($x1,$y1) = $this->scale->Translate($x1,$y1); + list($x2,$y2) = $this->scale->Translate($x2,$y2); + $this->img->Rectangle($x1,$y1,$x2,$y2); } function FilledRectangle($x1,$y1,$x2,$y2) { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - list($x2,$y2) = $this->scale->Translate($x2,$y2); - $this->img->FilledRectangle($x1,$y1,$x2,$y2); + list($x1,$y1) = $this->scale->Translate($x1,$y1); + list($x2,$y2) = $this->scale->Translate($x2,$y2); + $this->img->FilledRectangle($x1,$y1,$x2,$y2); } - + function Circle($x1,$y1,$r) { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - if( $r >= 0 ) - $r = $this->scale->TranslateX($r); - else - $r = -$r; - $this->img->Circle($x1,$y1,$r); + list($x1,$y1) = $this->scale->Translate($x1,$y1); + if( $r >= 0 ) + $r = $this->scale->TranslateX($r); + else + $r = -$r; + $this->img->Circle($x1,$y1,$r); } function FilledCircle($x1,$y1,$r) { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - if( $r >= 0 ) - $r = $this->scale->TranslateX($r); - else - $r = -$r; - $this->img->FilledCircle($x1,$y1,$r); + list($x1,$y1) = $this->scale->Translate($x1,$y1); + if( $r >= 0 ) + $r = $this->scale->TranslateX($r); + else + $r = -$r; + $this->img->FilledCircle($x1,$y1,$r); } - function RoundedRectangle($x1,$y1,$x2,$y2,$r=null) { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - list($x2,$y2) = $this->scale->Translate($x2,$y2); + function RoundedRectangle($x1,$y1,$x2,$y2,$r=null) { + list($x1,$y1) = $this->scale->Translate($x1,$y1); + list($x2,$y2) = $this->scale->Translate($x2,$y2); - if( $r == null ) - $r = 5; - elseif( $r >= 0 ) - $r = $this->scale->TranslateX($r); - else - $r = -$r; - $this->img->RoundedRectangle($x1,$y1,$x2,$y2,$r); + if( $r == null ) + $r = 5; + elseif( $r >= 0 ) + $r = $this->scale->TranslateX($r); + else + $r = -$r; + $this->img->RoundedRectangle($x1,$y1,$x2,$y2,$r); } - function FilledRoundedRectangle($x1,$y1,$x2,$y2,$r=null) { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - list($x2,$y2) = $this->scale->Translate($x2,$y2); + function FilledRoundedRectangle($x1,$y1,$x2,$y2,$r=null) { + list($x1,$y1) = $this->scale->Translate($x1,$y1); + list($x2,$y2) = $this->scale->Translate($x2,$y2); - if( $r == null ) - $r = 5; - elseif( $r > 0 ) - $r = $this->scale->TranslateX($r); - else - $r = -$r; - $this->img->FilledRoundedRectangle($x1,$y1,$x2,$y2,$r); + if( $r == null ) + $r = 5; + elseif( $r > 0 ) + $r = $this->scale->TranslateX($r); + else + $r = -$r; + $this->img->FilledRoundedRectangle($x1,$y1,$x2,$y2,$r); } function ShadowRectangle($x1,$y1,$x2,$y2,$fcolor=false,$shadow_width=null,$shadow_color=array(102,102,102)) { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - list($x2,$y2) = $this->scale->Translate($x2,$y2); - if( $shadow_width == null ) - $shadow_width=4; - else - $shadow_width=$this->scale->TranslateX($shadow_width); - $this->img->ShadowRectangle($x1,$y1,$x2,$y2,$fcolor,$shadow_width,$shadow_color); + list($x1,$y1) = $this->scale->Translate($x1,$y1); + list($x2,$y2) = $this->scale->Translate($x2,$y2); + if( $shadow_width == null ) + $shadow_width=4; + else + $shadow_width=$this->scale->TranslateX($shadow_width); + $this->img->ShadowRectangle($x1,$y1,$x2,$y2,$fcolor,$shadow_width,$shadow_color); } function SetTextAlign($halign,$valign="bottom") { - $this->img->SetTextAlign($halign,$valign="bottom"); + $this->img->SetTextAlign($halign,$valign="bottom"); } function StrokeText($x1,$y1,$txt,$dir=0,$paragraph_align="left") { - list($x1,$y1) = $this->scale->Translate($x1,$y1); - $this->img->StrokeText($x1,$y1,$txt,$dir,$paragraph_align); + list($x1,$y1) = $this->scale->Translate($x1,$y1); + $this->img->StrokeText($x1,$y1,$txt,$dir,$paragraph_align); } // A rounded rectangle where one of the corner has been moved "into" the // rectangle 'iw' width and 'ih' height. Corners: // 0=Top left, 1=top right, 2=bottom right, 3=bottom left function IndentedRectangle($xt,$yt,$w,$h,$iw=0,$ih=0,$aCorner=3,$aFillColor="",$r=4) { - - list($xt,$yt) = $this->scale->Translate($xt,$yt); - list($w,$h) = $this->scale->Translate($w,$h); - list($iw,$ih) = $this->scale->Translate($iw,$ih); - - $xr = $xt + $w - 0; - $yl = $yt + $h - 0; - switch( $aCorner ) { - case 0: // Upper left - - // Bottom line, left & right arc - $this->img->Line($xt+$r,$yl,$xr-$r,$yl); - $this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); - $this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); + list($xt,$yt) = $this->scale->Translate($xt,$yt); + list($w,$h) = $this->scale->Translate($w,$h); + list($iw,$ih) = $this->scale->Translate($iw,$ih); - // Right line, Top right arc - $this->img->Line($xr,$yt+$r,$xr,$yl-$r); - $this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); + $xr = $xt + $w - 0; + $yl = $yt + $h - 0; - // Top line, Top left arc - $this->img->Line($xt+$iw+$r,$yt,$xr-$r,$yt); - $this->img->Arc($xt+$iw+$r,$yt+$r,$r*2,$r*2,180,270); + switch( $aCorner ) { + case 0: // Upper left + + // Bottom line, left & right arc + $this->img->Line($xt+$r,$yl,$xr-$r,$yl); + $this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); + $this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); - // Left line - $this->img->Line($xt,$yt+$ih+$r,$xt,$yl-$r); + // Right line, Top right arc + $this->img->Line($xr,$yt+$r,$xr,$yl-$r); + $this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); - // Indent horizontal, Lower left arc - $this->img->Line($xt+$r,$yt+$ih,$xt+$iw-$r,$yt+$ih); - $this->img->Arc($xt+$r,$yt+$ih+$r,$r*2,$r*2,180,270); + // Top line, Top left arc + $this->img->Line($xt+$iw+$r,$yt,$xr-$r,$yt); + $this->img->Arc($xt+$iw+$r,$yt+$r,$r*2,$r*2,180,270); - // Indent vertical, Indent arc - $this->img->Line($xt+$iw,$yt+$r,$xt+$iw,$yt+$ih-$r); - $this->img->Arc($xt+$iw-$r,$yt+$ih-$r,$r*2,$r*2,0,90); + // Left line + $this->img->Line($xt,$yt+$ih+$r,$xt,$yl-$r); - if( $aFillColor != '' ) { - $bc = $this->img->current_color_name; - $this->img->PushColor($aFillColor); - $this->img->FillToBorder($xr-$r,$yl-$r,$bc); - $this->img->PopColor(); - } + // Indent horizontal, Lower left arc + $this->img->Line($xt+$r,$yt+$ih,$xt+$iw-$r,$yt+$ih); + $this->img->Arc($xt+$r,$yt+$ih+$r,$r*2,$r*2,180,270); - break; + // Indent vertical, Indent arc + $this->img->Line($xt+$iw,$yt+$r,$xt+$iw,$yt+$ih-$r); + $this->img->Arc($xt+$iw-$r,$yt+$ih-$r,$r*2,$r*2,0,90); - case 1: // Upper right + if( $aFillColor != '' ) { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xr-$r,$yl-$r,$bc); + $this->img->PopColor(); + } - // Bottom line, left & right arc - $this->img->Line($xt+$r,$yl,$xr-$r,$yl); - $this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); - $this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); + break; - // Left line, Top left arc - $this->img->Line($xt,$yt+$r,$xt,$yl-$r); - $this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); + case 1: // Upper right - // Top line, Top right arc - $this->img->Line($xt+$r,$yt,$xr-$iw-$r,$yt); - $this->img->Arc($xr-$iw-$r,$yt+$r,$r*2,$r*2,270,360); + // Bottom line, left & right arc + $this->img->Line($xt+$r,$yl,$xr-$r,$yl); + $this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); + $this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); - // Right line - $this->img->Line($xr,$yt+$ih+$r,$xr,$yl-$r); + // Left line, Top left arc + $this->img->Line($xt,$yt+$r,$xt,$yl-$r); + $this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); - // Indent horizontal, Lower right arc - $this->img->Line($xr-$iw+$r,$yt+$ih,$xr-$r,$yt+$ih); - $this->img->Arc($xr-$r,$yt+$ih+$r,$r*2,$r*2,270,360); + // Top line, Top right arc + $this->img->Line($xt+$r,$yt,$xr-$iw-$r,$yt); + $this->img->Arc($xr-$iw-$r,$yt+$r,$r*2,$r*2,270,360); - // Indent vertical, Indent arc - $this->img->Line($xr-$iw,$yt+$r,$xr-$iw,$yt+$ih-$r); - $this->img->Arc($xr-$iw+$r,$yt+$ih-$r,$r*2,$r*2,90,180); + // Right line + $this->img->Line($xr,$yt+$ih+$r,$xr,$yl-$r); - if( $aFillColor != '' ) { - $bc = $this->img->current_color_name; - $this->img->PushColor($aFillColor); - $this->img->FillToBorder($xt+$r,$yl-$r,$bc); - $this->img->PopColor(); - } + // Indent horizontal, Lower right arc + $this->img->Line($xr-$iw+$r,$yt+$ih,$xr-$r,$yt+$ih); + $this->img->Arc($xr-$r,$yt+$ih+$r,$r*2,$r*2,270,360); - break; + // Indent vertical, Indent arc + $this->img->Line($xr-$iw,$yt+$r,$xr-$iw,$yt+$ih-$r); + $this->img->Arc($xr-$iw+$r,$yt+$ih-$r,$r*2,$r*2,90,180); - case 2: // Lower right - // Top line, Top left & Top right arc - $this->img->Line($xt+$r,$yt,$xr-$r,$yt); - $this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); - $this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); + if( $aFillColor != '' ) { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xt+$r,$yl-$r,$bc); + $this->img->PopColor(); + } - // Left line, Bottom left arc - $this->img->Line($xt,$yt+$r,$xt,$yl-$r); - $this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); + break; - // Bottom line, Bottom right arc - $this->img->Line($xt+$r,$yl,$xr-$iw-$r,$yl); - $this->img->Arc($xr-$iw-$r,$yl-$r,$r*2,$r*2,0,90); + case 2: // Lower right + // Top line, Top left & Top right arc + $this->img->Line($xt+$r,$yt,$xr-$r,$yt); + $this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); + $this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); - // Right line - $this->img->Line($xr,$yt+$r,$xr,$yl-$ih-$r); - - // Indent horizontal, Lower right arc - $this->img->Line($xr-$r,$yl-$ih,$xr-$iw+$r,$yl-$ih); - $this->img->Arc($xr-$r,$yl-$ih-$r,$r*2,$r*2,0,90); + // Left line, Bottom left arc + $this->img->Line($xt,$yt+$r,$xt,$yl-$r); + $this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180); - // Indent vertical, Indent arc - $this->img->Line($xr-$iw,$yl-$r,$xr-$iw,$yl-$ih+$r); - $this->img->Arc($xr-$iw+$r,$yl-$ih+$r,$r*2,$r*2,180,270); + // Bottom line, Bottom right arc + $this->img->Line($xt+$r,$yl,$xr-$iw-$r,$yl); + $this->img->Arc($xr-$iw-$r,$yl-$r,$r*2,$r*2,0,90); - if( $aFillColor != '' ) { - $bc = $this->img->current_color_name; - $this->img->PushColor($aFillColor); - $this->img->FillToBorder($xt+$r,$yt+$r,$bc); - $this->img->PopColor(); - } + // Right line + $this->img->Line($xr,$yt+$r,$xr,$yl-$ih-$r); + + // Indent horizontal, Lower right arc + $this->img->Line($xr-$r,$yl-$ih,$xr-$iw+$r,$yl-$ih); + $this->img->Arc($xr-$r,$yl-$ih-$r,$r*2,$r*2,0,90); - break; + // Indent vertical, Indent arc + $this->img->Line($xr-$iw,$yl-$r,$xr-$iw,$yl-$ih+$r); + $this->img->Arc($xr-$iw+$r,$yl-$ih+$r,$r*2,$r*2,180,270); - case 3: // Lower left - // Top line, Top left & Top right arc - $this->img->Line($xt+$r,$yt,$xr-$r,$yt); - $this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); - $this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); + if( $aFillColor != '' ) { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xt+$r,$yt+$r,$bc); + $this->img->PopColor(); + } - // Right line, Bottom right arc - $this->img->Line($xr,$yt+$r,$xr,$yl-$r); - $this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); + break; - // Bottom line, Bottom left arc - $this->img->Line($xt+$iw+$r,$yl,$xr-$r,$yl); - $this->img->Arc($xt+$iw+$r,$yl-$r,$r*2,$r*2,90,180); + case 3: // Lower left + // Top line, Top left & Top right arc + $this->img->Line($xt+$r,$yt,$xr-$r,$yt); + $this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270); + $this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360); - // Left line - $this->img->Line($xt,$yt+$r,$xt,$yl-$ih-$r); - - // Indent horizontal, Lower left arc - $this->img->Line($xt+$r,$yl-$ih,$xt+$iw-$r,$yl-$ih); - $this->img->Arc($xt+$r,$yl-$ih-$r,$r*2,$r*2,90,180); + // Right line, Bottom right arc + $this->img->Line($xr,$yt+$r,$xr,$yl-$r); + $this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90); - // Indent vertical, Indent arc - $this->img->Line($xt+$iw,$yl-$ih+$r,$xt+$iw,$yl-$r); - $this->img->Arc($xt+$iw-$r,$yl-$ih+$r,$r*2,$r*2,270,360); + // Bottom line, Bottom left arc + $this->img->Line($xt+$iw+$r,$yl,$xr-$r,$yl); + $this->img->Arc($xt+$iw+$r,$yl-$r,$r*2,$r*2,90,180); - if( $aFillColor != '' ) { - $bc = $this->img->current_color_name; - $this->img->PushColor($aFillColor); - $this->img->FillToBorder($xr-$r,$yt+$r,$bc); - $this->img->PopColor(); - } + // Left line + $this->img->Line($xt,$yt+$r,$xt,$yl-$ih-$r); + + // Indent horizontal, Lower left arc + $this->img->Line($xt+$r,$yl-$ih,$xt+$iw-$r,$yl-$ih); + $this->img->Arc($xt+$r,$yl-$ih-$r,$r*2,$r*2,90,180); - break; - } + // Indent vertical, Indent arc + $this->img->Line($xt+$iw,$yl-$ih+$r,$xt+$iw,$yl-$r); + $this->img->Arc($xt+$iw-$r,$yl-$ih+$r,$r*2,$r*2,270,360); + + if( $aFillColor != '' ) { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xr-$r,$yt+$r,$bc); + $this->img->PopColor(); + } + + break; + } } } //=================================================== // CLASS RectangleText -// Description: Draws a text paragraph inside a +// Description: Draws a text paragraph inside a // rounded, possible filled, rectangle. //=================================================== class CanvasRectangleText { @@ -379,133 +387,133 @@ class CanvasRectangleText { private $iAutoBoxMargin=5; private $iShadowWidth=3,$iShadowColor=''; - function CanvasRectangleText($aTxt='',$xl=0,$yt=0,$w=0,$h=0) { - $this->iTxt = new Text($aTxt); - $this->ix = $xl; - $this->iy = $yt; - $this->iw = $w; - $this->ih = $h; + function __construct($aTxt='',$xl=0,$yt=0,$w=0,$h=0) { + $this->iTxt = new Text($aTxt); + $this->ix = $xl; + $this->iy = $yt; + $this->iw = $w; + $this->ih = $h; } - + function SetShadow($aColor='gray',$aWidth=3) { - $this->iShadowColor = $aColor; - $this->iShadowWidth = $aWidth; + $this->iShadowColor = $aColor; + $this->iShadowWidth = $aWidth; } function SetFont($FontFam,$aFontStyle,$aFontSize=12) { - $this->iTxt->SetFont($FontFam,$aFontStyle,$aFontSize); + $this->iTxt->SetFont($FontFam,$aFontStyle,$aFontSize); } function SetTxt($aTxt) { - $this->iTxt->Set($aTxt); + $this->iTxt->Set($aTxt); } function ParagraphAlign($aParaAlign) { - $this->iParaAlign = $aParaAlign; + $this->iParaAlign = $aParaAlign; } function SetFillColor($aFillColor) { - $this->iFillColor = $aFillColor; + $this->iFillColor = $aFillColor; } function SetAutoMargin($aMargin) { - $this->iAutoBoxMargin=$aMargin; + $this->iAutoBoxMargin=$aMargin; } function SetColor($aColor) { - $this->iColor = $aColor; + $this->iColor = $aColor; } function SetFontColor($aColor) { - $this->iFontColor = $aColor; + $this->iFontColor = $aColor; } function SetPos($xl=0,$yt=0,$w=0,$h=0) { - $this->ix = $xl; - $this->iy = $yt; - $this->iw = $w; - $this->ih = $h; + $this->ix = $xl; + $this->iy = $yt; + $this->iw = $w; + $this->ih = $h; } function Pos($xl=0,$yt=0,$w=0,$h=0) { - $this->ix = $xl; - $this->iy = $yt; - $this->iw = $w; - $this->ih = $h; + $this->ix = $xl; + $this->iy = $yt; + $this->iw = $w; + $this->ih = $h; } function Set($aTxt,$xl,$yt,$w=0,$h=0) { - $this->iTxt->Set($aTxt); - $this->ix = $xl; - $this->iy = $yt; - $this->iw = $w; - $this->ih = $h; + $this->iTxt->Set($aTxt); + $this->ix = $xl; + $this->iy = $yt; + $this->iw = $w; + $this->ih = $h; } function SetCornerRadius($aRad=5) { - $this->ir = $aRad; + $this->ir = $aRad; } function Stroke($aImg,$scale) { - - // If coordinates are specifed as negative this means we should - // treat them as abolsute (pixels) coordinates - if( $this->ix > 0 ) { - $this->ix = $scale->TranslateX($this->ix) ; - } - else { - $this->ix = -$this->ix; - } - if( $this->iy > 0 ) { - $this->iy = $scale->TranslateY($this->iy) ; - } - else { - $this->iy = -$this->iy; - } - - list($this->iw,$this->ih) = $scale->Translate($this->iw,$this->ih) ; + // If coordinates are specifed as negative this means we should + // treat them as abolsute (pixels) coordinates + if( $this->ix > 0 ) { + $this->ix = $scale->TranslateX($this->ix) ; + } + else { + $this->ix = -$this->ix; + } - if( $this->iw == 0 ) - $this->iw = round($this->iTxt->GetWidth($aImg) + $this->iAutoBoxMargin); - if( $this->ih == 0 ) { - $this->ih = round($this->iTxt->GetTextHeight($aImg) + $this->iAutoBoxMargin); - } + if( $this->iy > 0 ) { + $this->iy = $scale->TranslateY($this->iy) ; + } + else { + $this->iy = -$this->iy; + } + + list($this->iw,$this->ih) = $scale->Translate($this->iw,$this->ih) ; - if( $this->iShadowColor != '' ) { - $aImg->PushColor($this->iShadowColor); - $aImg->FilledRoundedRectangle($this->ix+$this->iShadowWidth, - $this->iy+$this->iShadowWidth, - $this->ix+$this->iw-1+$this->iShadowWidth, - $this->iy+$this->ih-1+$this->iShadowWidth, - $this->ir); - $aImg->PopColor(); - } + if( $this->iw == 0 ) + $this->iw = round($this->iTxt->GetWidth($aImg) + $this->iAutoBoxMargin); + if( $this->ih == 0 ) { + $this->ih = round($this->iTxt->GetTextHeight($aImg) + $this->iAutoBoxMargin); + } - if( $this->iFillColor != '' ) { - $aImg->PushColor($this->iFillColor); - $aImg->FilledRoundedRectangle($this->ix,$this->iy, - $this->ix+$this->iw-1, - $this->iy+$this->ih-1, - $this->ir); - $aImg->PopColor(); - } + if( $this->iShadowColor != '' ) { + $aImg->PushColor($this->iShadowColor); + $aImg->FilledRoundedRectangle($this->ix+$this->iShadowWidth, + $this->iy+$this->iShadowWidth, + $this->ix+$this->iw-1+$this->iShadowWidth, + $this->iy+$this->ih-1+$this->iShadowWidth, + $this->ir); + $aImg->PopColor(); + } - if( $this->iColor != '' ) { - $aImg->PushColor($this->iColor); - $aImg->RoundedRectangle($this->ix,$this->iy, - $this->ix+$this->iw-1, - $this->iy+$this->ih-1, - $this->ir); - $aImg->PopColor(); - } - - $this->iTxt->Align('center','center'); - $this->iTxt->ParagraphAlign($this->iParaAlign); - $this->iTxt->SetColor($this->iFontColor); - $this->iTxt->Stroke($aImg, $this->ix+$this->iw/2, $this->iy+$this->ih/2); + if( $this->iFillColor != '' ) { + $aImg->PushColor($this->iFillColor); + $aImg->FilledRoundedRectangle($this->ix,$this->iy, + $this->ix+$this->iw-1, + $this->iy+$this->ih-1, + $this->ir); + $aImg->PopColor(); + } - return array($this->iw, $this->ih); + if( $this->iColor != '' ) { + $aImg->PushColor($this->iColor); + $aImg->RoundedRectangle($this->ix,$this->iy, + $this->ix+$this->iw-1, + $this->iy+$this->ih-1, + $this->ir); + $aImg->PopColor(); + } + + $this->iTxt->Align('center','center'); + $this->iTxt->ParagraphAlign($this->iParaAlign); + $this->iTxt->SetColor($this->iFontColor); + $this->iTxt->Stroke($aImg, $this->ix+$this->iw/2, $this->iy+$this->ih/2); + + return array($this->iw, $this->ih); } diff --git a/libs/jpgraph/jpgraph_contour.php b/libs/jpgraph/jpgraph_contour.php new file mode 100644 index 0000000..0b23cde --- /dev/null +++ b/libs/jpgraph/jpgraph_contour.php @@ -0,0 +1,587 @@ +nbrRows = count($aMatrix); + $this->nbrCols = count($aMatrix[0]); + $this->dataPoints = $aMatrix; + + if( is_array($aIsobars) ) { + // use the isobar values supplied + $this->nbrIsobars = count($aIsobars); + $this->isobarValues = $aIsobars; + } + else { + // Determine the isobar values automatically + $this->nbrIsobars = $aIsobars; + list($min,$max) = $this->getMinMaxVal(); + $stepSize = ($max-$min) / $aIsobars ; + $isobar = $min+$stepSize/2; + for ($i = 0; $i < $aIsobars; $i++) { + $this->isobarValues[$i] = $isobar; + $isobar += $stepSize; + } + } + + if( $aColors !== null && count($aColors) > 0 ) { + + if( !is_array($aColors) ) { + JpGraphError::RaiseL(28001); + //'Third argument to Contour must be an array of colors.' + } + + if( count($aColors) != count($this->isobarValues) ) { + JpGraphError::RaiseL(28002); + //'Number of colors must equal the number of isobar lines specified'; + } + + $this->isobarColors = $aColors; + } + } + + /** + * Flip the plot around the Y-coordinate. This has the same affect as flipping the input + * data matrice + * + * @param $aFlg If true the the vertice in input data matrice position (0,0) corresponds to the top left + * corner of teh plot otherwise it will correspond to the bottom left corner (a horizontal flip) + */ + function SetInvert($aFlg=true) { + $this->invert = $aFlg; + } + + /** + * Find the min and max values in the data matrice + * + * @return array(min_value,max_value) + */ + function getMinMaxVal() { + $min = $this->dataPoints[0][0]; + $max = $this->dataPoints[0][0]; + for ($i = 0; $i < $this->nbrRows; $i++) { + if( ($mi=min($this->dataPoints[$i])) < $min ) $min = $mi; + if( ($ma=max($this->dataPoints[$i])) > $max ) $max = $ma; + } + return array($min,$max); + } + + /** + * Reset the two matrices that keeps track on where the isobars crosses the + * horizontal and vertical edges + */ + function resetEdgeMatrices() { + for ($k = 0; $k < 2; $k++) { + for ($i = 0; $i <= $this->nbrRows; $i++) { + for ($j = 0; $j <= $this->nbrCols; $j++) { + $this->edges[$k][$i][$j] = false; + } + } + } + } + + /** + * Determine if the specified isobar crosses the horizontal edge specified by its row and column + * + * @param $aRow Row index of edge to be checked + * @param $aCol Col index of edge to be checked + * @param $aIsobar Isobar value + * @return true if the isobar is crossing this edge + */ + function isobarHCrossing($aRow,$aCol,$aIsobar) { + + if( $aCol >= $this->nbrCols-1 ) { + JpGraphError::RaiseL(28003,$aCol); + //'ContourPlot Internal Error: isobarHCrossing: Coloumn index too large (%d)' + } + if( $aRow >= $this->nbrRows ) { + JpGraphError::RaiseL(28004,$aRow); + //'ContourPlot Internal Error: isobarHCrossing: Row index too large (%d)' + } + + $v1 = $this->dataPoints[$aRow][$aCol]; + $v2 = $this->dataPoints[$aRow][$aCol+1]; + + return ($aIsobar-$v1)*($aIsobar-$v2) < 0 ; + + } + + /** + * Determine if the specified isobar crosses the vertical edge specified by its row and column + * + * @param $aRow Row index of edge to be checked + * @param $aCol Col index of edge to be checked + * @param $aIsobar Isobar value + * @return true if the isobar is crossing this edge + */ + function isobarVCrossing($aRow,$aCol,$aIsobar) { + + if( $aRow >= $this->nbrRows-1) { + JpGraphError::RaiseL(28005,$aRow); + //'isobarVCrossing: Row index too large + } + if( $aCol >= $this->nbrCols ) { + JpGraphError::RaiseL(28006,$aCol); + //'isobarVCrossing: Col index too large + } + + $v1 = $this->dataPoints[$aRow][$aCol]; + $v2 = $this->dataPoints[$aRow+1][$aCol]; + + return ($aIsobar-$v1)*($aIsobar-$v2) < 0 ; + + } + + /** + * Determine all edges, horizontal and vertical that the specified isobar crosses. The crossings + * are recorded in the two edge matrices. + * + * @param $aIsobar The value of the isobar to be checked + */ + function determineIsobarEdgeCrossings($aIsobar) { + + $ib = $this->isobarValues[$aIsobar]; + + for ($i = 0; $i < $this->nbrRows-1; $i++) { + for ($j = 0; $j < $this->nbrCols-1; $j++) { + $this->edges[HORIZ_EDGE][$i][$j] = $this->isobarHCrossing($i,$j,$ib); + $this->edges[VERT_EDGE][$i][$j] = $this->isobarVCrossing($i,$j,$ib); + } + } + + // We now have the bottom and rightmost edges unsearched + for ($i = 0; $i < $this->nbrRows-1; $i++) { + $this->edges[VERT_EDGE][$i][$j] = $this->isobarVCrossing($i,$this->nbrCols-1,$ib); + } + for ($j = 0; $j < $this->nbrCols-1; $j++) { + $this->edges[HORIZ_EDGE][$i][$j] = $this->isobarHCrossing($this->nbrRows-1,$j,$ib); + } + + } + + /** + * Return the normalized coordinates for the crossing of the specified edge with the specified + * isobar- The crossing is simpy detrmined with a linear interpolation between the two vertices + * on each side of the edge and the value of the isobar + * + * @param $aRow Row of edge + * @param $aCol Column of edge + * @param $aEdgeDir Determine if this is a horizontal or vertical edge + * @param $ib The isobar value + * @return unknown_type + */ + function getCrossingCoord($aRow,$aCol,$aEdgeDir,$aIsobarVal) { + + // In order to avoid numerical problem when two vertices are very close + // we have to check and avoid dividing by close to zero denumerator. + if( $aEdgeDir == HORIZ_EDGE ) { + $d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow][$aCol+1]); + if( $d > 0.001 ) { + $xcoord = $aCol + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d; + } + else { + $xcoord = $aCol; + } + $ycoord = $aRow; + } + else { + $d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow+1][$aCol]); + if( $d > 0.001 ) { + $ycoord = $aRow + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d; + } + else { + $ycoord = $aRow; + } + $xcoord = $aCol; + } + if( $this->invert ) { + $ycoord = $this->nbrRows-1 - $ycoord; + } + return array($xcoord,$ycoord); + + } + + /** + * In order to avoid all kinds of unpleasent extra checks and complex boundary + * controls for the degenerated case where the contour levels exactly crosses + * one of the vertices we add a very small delta (0.1%) to the data point value. + * This has no visible affect but it makes the code sooooo much cleaner. + * + */ + function adjustDataPointValues() { + + $ni = count($this->isobarValues); + for ($k = 0; $k < $ni; $k++) { + $ib = $this->isobarValues[$k]; + for ($row = 0 ; $row < $this->nbrRows-1; ++$row) { + for ($col = 0 ; $col < $this->nbrCols-1; ++$col ) { + if( abs($this->dataPoints[$row][$col] - $ib) < 0.0001 ) { + $this->dataPoints[$row][$col] += $this->dataPoints[$row][$col]*0.001; + } + } + } + } + + } + + /** + * @param $aFlg + * @param $aBW + * @return unknown_type + */ + function UseHighContrastColor($aFlg=true,$aBW=false) { + $this->highcontrast = $aFlg; + $this->highcontrastbw = $aBW; + } + + /** + * Calculate suitable colors for each defined isobar + * + */ + function CalculateColors() { + if ( $this->highcontrast ) { + if ( $this->highcontrastbw ) { + for ($ib = 0; $ib < $this->nbrIsobars; $ib++) { + $this->isobarColors[$ib] = 'black'; + } + } + else { + // Use only blue/red scale + $step = round(255/($this->nbrIsobars-1)); + for ($ib = 0; $ib < $this->nbrIsobars; $ib++) { + $this->isobarColors[$ib] = array($ib*$step, 50, 255-$ib*$step); + } + } + } + else { + $n = $this->nbrIsobars; + $v = 0; $step = 1 / ($this->nbrIsobars-1); + for ($ib = 0; $ib < $this->nbrIsobars; $ib++) { + $this->isobarColors[$ib] = RGB::GetSpectrum($v); + $v += $step; + } + } + } + + /** + * This is where the main work is done. For each isobar the crossing of the edges are determined + * and then each cell is analyzed to find the 0, 2 or 4 crossings. Then the normalized coordinate + * for the crossings are determined and pushed on to the isobar stack. When the method is finished + * the $isobarCoord will hold one arrayfor each isobar where all the line segments that makes + * up the contour plot are stored. + * + * @return array( $isobarCoord, $isobarValues, $isobarColors ) + */ + function getIsobars() { + + $this->adjustDataPointValues(); + + for ($isobar = 0; $isobar < $this->nbrIsobars; $isobar++) { + + $ib = $this->isobarValues[$isobar]; + $this->resetEdgeMatrices(); + $this->determineIsobarEdgeCrossings($isobar); + $this->isobarCoord[$isobar] = array(); + + $ncoord = 0; + + for ($row = 0 ; $row < $this->nbrRows-1; ++$row) { + for ($col = 0 ; $col < $this->nbrCols-1; ++$col ) { + + // Find out how many crossings around the edges + $n = 0; + if ( $this->edges[HORIZ_EDGE][$row][$col] ) $neigh[$n++] = array($row, $col, HORIZ_EDGE); + if ( $this->edges[HORIZ_EDGE][$row+1][$col] ) $neigh[$n++] = array($row+1,$col, HORIZ_EDGE); + if ( $this->edges[VERT_EDGE][$row][$col] ) $neigh[$n++] = array($row, $col, VERT_EDGE); + if ( $this->edges[VERT_EDGE][$row][$col+1] ) $neigh[$n++] = array($row, $col+1,VERT_EDGE); + + if ( $n == 2 ) { + $n1=0; $n2=1; + $this->isobarCoord[$isobar][$ncoord++] = array( + $this->getCrossingCoord($neigh[$n1][0],$neigh[$n1][1],$neigh[$n1][2],$ib), + $this->getCrossingCoord($neigh[$n2][0],$neigh[$n2][1],$neigh[$n2][2],$ib) ); + } + elseif ( $n == 4 ) { + // We must determine how to connect the edges either northwest->southeast or + // northeast->southwest. We do that by calculating the imaginary middle value of + // the cell by averaging the for corners. This will compared with the value of the + // top left corner will help determine the orientation of the ridge/creek + $midval = ($this->dataPoints[$row][$col]+$this->dataPoints[$row][$col+1]+$this->dataPoints[$row+1][$col]+$this->dataPoints[$row+1][$col+1])/4; + $v = $this->dataPoints[$row][$col]; + if( $midval == $ib ) { + // Orientation "+" + $n1=0; $n2=1; $n3=2; $n4=3; + } elseif ( ($midval > $ib && $v > $ib) || ($midval < $ib && $v < $ib) ) { + // Orientation of ridge/valley = "\" + $n1=0; $n2=3; $n3=2; $n4=1; + } elseif ( ($midval > $ib && $v < $ib) || ($midval < $ib && $v > $ib) ) { + // Orientation of ridge/valley = "/" + $n1=0; $n2=2; $n3=3; $n4=1; + } + + $this->isobarCoord[$isobar][$ncoord++] = array( + $this->getCrossingCoord($neigh[$n1][0],$neigh[$n1][1],$neigh[$n1][2],$ib), + $this->getCrossingCoord($neigh[$n2][0],$neigh[$n2][1],$neigh[$n2][2],$ib) ); + + $this->isobarCoord[$isobar][$ncoord++] = array( + $this->getCrossingCoord($neigh[$n3][0],$neigh[$n3][1],$neigh[$n3][2],$ib), + $this->getCrossingCoord($neigh[$n4][0],$neigh[$n4][1],$neigh[$n4][2],$ib) ); + + } + } + } + } + + if( count($this->isobarColors) == 0 ) { + // No manually specified colors. Calculate them automatically. + $this->CalculateColors(); + } + return array( $this->isobarCoord, $this->isobarValues, $this->isobarColors ); + } +} + + +/** + * This class represent a plotting of a contour outline of data given as a X-Y matrice + * + */ +class ContourPlot extends Plot { + + private $contour, $contourCoord, $contourVal, $contourColor; + private $nbrCountours = 0 ; + private $dataMatrix = array(); + private $invertLegend = false; + private $interpFactor = 1; + private $flipData = false; + private $isobar = 10; + private $showLegend = false; + private $highcontrast = false, $highcontrastbw = false; + private $manualIsobarColors = array(); + + /** + * Construct a contour plotting algorithm. The end result of the algorithm is a sequence of + * line segments for each isobar given as two vertices. + * + * @param $aDataMatrix The Z-data to be used + * @param $aIsobar A mixed variable, if it is an integer then this specified the number of isobars to use. + * The values of the isobars are automatically detrmined to be equ-spaced between the min/max value of the + * data. If it is an array then it explicetely gives the isobar values + * @param $aInvert By default the matrice with row index 0 corresponds to Y-value 0, i.e. in the bottom of + * the plot. If this argument is true then the row with the highest index in the matrice corresponds to + * Y-value 0. In affect flipping the matrice around an imaginary horizontal axis. + * @param $aHighContrast Use high contrast colors (blue/red:ish) + * @param $aHighContrastBW Use only black colors for contours + * @return an instance of the contour plot algorithm + */ + function __construct($aDataMatrix, $aIsobar=10, $aFactor=1, $aInvert=false, $aIsobarColors=array()) { + + $this->dataMatrix = $aDataMatrix; + $this->flipData = $aInvert; + $this->isobar = $aIsobar; + $this->interpFactor = $aFactor; + + if ( $this->interpFactor > 1 ) { + + if( $this->interpFactor > 5 ) { + JpGraphError::RaiseL(28007);// ContourPlot interpolation factor is too large (>5) + } + + $ip = new MeshInterpolate(); + $this->dataMatrix = $ip->Linear($this->dataMatrix, $this->interpFactor); + } + + $this->contour = new Contour($this->dataMatrix,$this->isobar,$aIsobarColors); + + if( is_array($aIsobar) ) + $this->nbrContours = count($aIsobar); + else + $this->nbrContours = $aIsobar; + } + + + /** + * Flipe the data around the center + * + * @param $aFlg + * + */ + function SetInvert($aFlg=true) { + $this->flipData = $aFlg; + } + + /** + * Set the colors for the isobar lines + * + * @param $aColorArray + * + */ + function SetIsobarColors($aColorArray) { + $this->manualIsobarColors = $aColorArray; + } + + /** + * Show the legend + * + * @param $aFlg true if the legend should be shown + * + */ + function ShowLegend($aFlg=true) { + $this->showLegend = $aFlg; + } + + + /** + * @param $aFlg true if the legend should start with the lowest isobar on top + * @return unknown_type + */ + function Invertlegend($aFlg=true) { + $this->invertLegend = $aFlg; + } + + /* Internal method. Give the min value to be used for the scaling + * + */ + function Min() { + return array(0,0); + } + + /* Internal method. Give the max value to be used for the scaling + * + */ + function Max() { + return array(count($this->dataMatrix[0])-1,count($this->dataMatrix)-1); + } + + /** + * Internal ramewrok method to setup the legend to be used for this plot. + * @param $aGraph The parent graph class + */ + function Legend($aGraph) { + + if( ! $this->showLegend ) + return; + + if( $this->invertLegend ) { + for ($i = 0; $i < $this->nbrContours; $i++) { + $aGraph->legend->Add(sprintf('%.1f',$this->contourVal[$i]), $this->contourColor[$i]); + } + } + else { + for ($i = $this->nbrContours-1; $i >= 0 ; $i--) { + $aGraph->legend->Add(sprintf('%.1f',$this->contourVal[$i]), $this->contourColor[$i]); + } + } + } + + + /** + * Framework function which gets called before the Stroke() method is called + * + * @see Plot#PreScaleSetup($aGraph) + * + */ + function PreScaleSetup($aGraph) { + $xn = count($this->dataMatrix[0])-1; + $yn = count($this->dataMatrix)-1; + + $aGraph->xaxis->scale->Update($aGraph->img,0,$xn); + $aGraph->yaxis->scale->Update($aGraph->img,0,$yn); + + $this->contour->SetInvert($this->flipData); + list($this->contourCoord,$this->contourVal,$this->contourColor) = $this->contour->getIsobars(); + } + + /** + * Use high contrast color schema + * + * @param $aFlg True, to use high contrast color + * @param $aBW True, Use only black and white color schema + */ + function UseHighContrastColor($aFlg=true,$aBW=false) { + $this->highcontrast = $aFlg; + $this->highcontrastbw = $aBW; + $this->contour->UseHighContrastColor($this->highcontrast,$this->highcontrastbw); + } + + /** + * Internal method. Stroke the contour plot to the graph + * + * @param $img Image handler + * @param $xscale Instance of the xscale to use + * @param $yscale Instance of the yscale to use + */ + function Stroke($img,$xscale,$yscale) { + + if( count($this->manualIsobarColors) > 0 ) { + $this->contourColor = $this->manualIsobarColors; + if( count($this->manualIsobarColors) != $this->nbrContours ) { + JpGraphError::RaiseL(28002); + } + } + + $img->SetLineWeight($this->line_weight); + + for ($c = 0; $c < $this->nbrContours; $c++) { + + $img->SetColor( $this->contourColor[$c] ); + + $n = count($this->contourCoord[$c]); + $i = 0; + while ( $i < $n ) { + list($x1,$y1) = $this->contourCoord[$c][$i][0]; + $x1t = $xscale->Translate($x1); + $y1t = $yscale->Translate($y1); + + list($x2,$y2) = $this->contourCoord[$c][$i++][1]; + $x2t = $xscale->Translate($x2); + $y2t = $yscale->Translate($y2); + + $img->Line($x1t,$y1t,$x2t,$y2t); + } + + } + } + +} + +// EOF +?> diff --git a/libs/jpgraph/jpgraph_date.php b/libs/jpgraph/jpgraph_date.php index c771573..6adc9e4 100644 --- a/libs/jpgraph/jpgraph_date.php +++ b/libs/jpgraph/jpgraph_date.php @@ -1,49 +1,49 @@ type=$aType; - $this->scale=array($aMin,$aMax); - $this->world_size=$aMax-$aMin; - $this->ticks = new LinearTicks(); - $this->intscale=true; + //--------------- + // CONSTRUCTOR + function __construct($aMin=0,$aMax=0,$aType='x') { + assert($aType=="x"); + assert($aMin<=$aMax); + + $this->type=$aType; + $this->scale=array($aMin,$aMax); + $this->world_size=$aMax-$aMin; + $this->ticks = new LinearTicks(); + $this->intscale=true; } -//------------------------------------------------------------------------------------------ -// Utility Function AdjDate() -// Description: Will round a given time stamp to an even year, month or day -// argument. -//------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------ + // Utility Function AdjDate() + // Description: Will round a given time stamp to an even year, month or day + // argument. + //------------------------------------------------------------------------------------------ function AdjDate($aTime,$aRound=0,$aYearType=false,$aMonthType=false,$aDayType=false) { - $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); - $h=0;$i=0;$s=0; - if( $aYearType !== false ) { - $yearAdj = array(0=>1, 1=>2, 2=>5); - if( $aRound == 0 ) { - $y = floor($y/$yearAdj[$aYearType])*$yearAdj[$aYearType]; - } - else { - ++$y; - $y = ceil($y/$yearAdj[$aYearType])*$yearAdj[$aYearType]; - } - $m=1;$d=1; - } - elseif( $aMonthType !== false ) { - $monthAdj = array(0=>1, 1=>6); - if( $aRound == 0 ) { - $m = floor($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType]; - $d=1; - } - else { - ++$m; - $m = ceil($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType]; - $d=1; - } - } - elseif( $aDayType !== false ) { - if( $aDayType == 0 ) { - if( $aRound == 1 ) { - //++$d; - $h=23;$i=59;$s=59; - } - } - else { - // Adjust to an even week boundary. - $w = (int)date('w',$aTime); // Day of week 0=Sun, 6=Sat - if( true ) { // Adjust to start on Mon - if( $w==0 ) $w=6; - else --$w; - } - if( $aRound == 0 ) { - $d -= $w; - } - else { - $d += (7-$w); - $h=23;$i=59;$s=59; - } - } - } - return mktime($h,$i,$s,$m,$d,$y); - + $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); + $h=0;$i=0;$s=0; + if( $aYearType !== false ) { + $yearAdj = array(0=>1, 1=>2, 2=>5); + if( $aRound == 0 ) { + $y = floor($y/$yearAdj[$aYearType])*$yearAdj[$aYearType]; + } + else { + ++$y; + $y = ceil($y/$yearAdj[$aYearType])*$yearAdj[$aYearType]; + } + $m=1;$d=1; + } + elseif( $aMonthType !== false ) { + $monthAdj = array(0=>1, 1=>6); + if( $aRound == 0 ) { + $m = floor($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType]; + $d=1; + } + else { + ++$m; + $m = ceil($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType]; + $d=1; + } + } + elseif( $aDayType !== false ) { + if( $aDayType == 0 ) { + if( $aRound == 1 ) { + //++$d; + $h=23;$i=59;$s=59; + } + } + else { + // Adjust to an even week boundary. + $w = (int)date('w',$aTime); // Day of week 0=Sun, 6=Sat + if( true ) { // Adjust to start on Mon + if( $w==0 ) $w=6; + else --$w; + } + if( $aRound == 0 ) { + $d -= $w; + } + else { + $d += (7-$w); + $h=23;$i=59;$s=59; + } + } + } + return mktime($h,$i,$s,$m,$d,$y); + } -//------------------------------------------------------------------------------------------ -// Wrapper for AdjDate that will round a timestamp to an even date rounding -// it downwards. -//------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------ + // Wrapper for AdjDate that will round a timestamp to an even date rounding + // it downwards. + //------------------------------------------------------------------------------------------ function AdjStartDate($aTime,$aYearType=false,$aMonthType=false,$aDayType=false) { - return $this->AdjDate($aTime,0,$aYearType,$aMonthType,$aDayType); + return $this->AdjDate($aTime,0,$aYearType,$aMonthType,$aDayType); } -//------------------------------------------------------------------------------------------ -// Wrapper for AdjDate that will round a timestamp to an even date rounding -// it upwards -//------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------ + // Wrapper for AdjDate that will round a timestamp to an even date rounding + // it upwards + //------------------------------------------------------------------------------------------ function AdjEndDate($aTime,$aYearType=false,$aMonthType=false,$aDayType=false) { - return $this->AdjDate($aTime,1,$aYearType,$aMonthType,$aDayType); + return $this->AdjDate($aTime,1,$aYearType,$aMonthType,$aDayType); } -//------------------------------------------------------------------------------------------ -// Utility Function AdjTime() -// Description: Will round a given time stamp to an even time according to -// argument. -//------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------ + // Utility Function AdjTime() + // Description: Will round a given time stamp to an even time according to + // argument. + //------------------------------------------------------------------------------------------ function AdjTime($aTime,$aRound=0,$aHourType=false,$aMinType=false,$aSecType=false) { - $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); - $h = (int)date('H',$aTime); $i = (int)date('i',$aTime); $s = (int)date('s',$aTime); - if( $aHourType !== false ) { - $aHourType %= 6; - $hourAdj = array(0=>1, 1=>2, 2=>3, 3=>4, 4=>6, 5=>12); - if( $aRound == 0 ) - $h = floor($h/$hourAdj[$aHourType])*$hourAdj[$aHourType]; - else { - if( ($h % $hourAdj[$aHourType]==0) && ($i > 0 || $s > 0) ) { - $h++; - } - $h = ceil($h/$hourAdj[$aHourType])*$hourAdj[$aHourType]; - if( $h >= 24 ) { - $aTime += 86400; - $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); - $h -= 24; - } - } - $i=0;$s=0; - } - elseif( $aMinType !== false ) { - $aMinType %= 5; - $minAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30); - if( $aRound == 0 ) { - $i = floor($i/$minAdj[$aMinType])*$minAdj[$aMinType]; - } - else { - if( ($i % $minAdj[$aMinType]==0) && $s > 0 ) { - $i++; - } - $i = ceil($i/$minAdj[$aMinType])*$minAdj[$aMinType]; - if( $i >= 60) { - $aTime += 3600; - $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); - $h = (int)date('H',$aTime); $i = 0; - } - } - $s=0; - } - elseif( $aSecType !== false ) { - $aSecType %= 5; - $secAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30); - if( $aRound == 0 ) { - $s = floor($s/$secAdj[$aSecType])*$secAdj[$aSecType]; - } - else { - $s = ceil($s/$secAdj[$aSecType]*1.0)*$secAdj[$aSecType]; - if( $s >= 60) { - $s=0; - $aTime += 60; - $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); - $h = (int)date('H',$aTime); $i = (int)date('i',$aTime); - } - } - } - return mktime($h,$i,$s,$m,$d,$y); + $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); + $h = (int)date('H',$aTime); $i = (int)date('i',$aTime); $s = (int)date('s',$aTime); + if( $aHourType !== false ) { + $aHourType %= 6; + $hourAdj = array(0=>1, 1=>2, 2=>3, 3=>4, 4=>6, 5=>12); + if( $aRound == 0 ) + $h = floor($h/$hourAdj[$aHourType])*$hourAdj[$aHourType]; + else { + if( ($h % $hourAdj[$aHourType]==0) && ($i > 0 || $s > 0) ) { + $h++; + } + $h = ceil($h/$hourAdj[$aHourType])*$hourAdj[$aHourType]; + if( $h >= 24 ) { + $aTime += 86400; + $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); + $h -= 24; + } + } + $i=0;$s=0; + } + elseif( $aMinType !== false ) { + $aMinType %= 5; + $minAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30); + if( $aRound == 0 ) { + $i = floor($i/$minAdj[$aMinType])*$minAdj[$aMinType]; + } + else { + if( ($i % $minAdj[$aMinType]==0) && $s > 0 ) { + $i++; + } + $i = ceil($i/$minAdj[$aMinType])*$minAdj[$aMinType]; + if( $i >= 60) { + $aTime += 3600; + $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); + $h = (int)date('H',$aTime); $i = 0; + } + } + $s=0; + } + elseif( $aSecType !== false ) { + $aSecType %= 5; + $secAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30); + if( $aRound == 0 ) { + $s = floor($s/$secAdj[$aSecType])*$secAdj[$aSecType]; + } + else { + $s = ceil($s/$secAdj[$aSecType]*1.0)*$secAdj[$aSecType]; + if( $s >= 60) { + $s=0; + $aTime += 60; + $y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime); + $h = (int)date('H',$aTime); $i = (int)date('i',$aTime); + } + } + } + return mktime($h,$i,$s,$m,$d,$y); } -//------------------------------------------------------------------------------------------ -// Wrapper for AdjTime that will round a timestamp to an even time rounding -// it downwards. -// Example: AdjStartTime(mktime(18,27,13,2,22,2005),false,2) => 18:20 -//------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------ + // Wrapper for AdjTime that will round a timestamp to an even time rounding + // it downwards. + // Example: AdjStartTime(mktime(18,27,13,2,22,2005),false,2) => 18:20 + //------------------------------------------------------------------------------------------ function AdjStartTime($aTime,$aHourType=false,$aMinType=false,$aSecType=false) { - return $this->AdjTime($aTime,0,$aHourType,$aMinType,$aSecType); + return $this->AdjTime($aTime,0,$aHourType,$aMinType,$aSecType); } -//------------------------------------------------------------------------------------------ -// Wrapper for AdjTime that will round a timestamp to an even time rounding -// it upwards -// Example: AdjEndTime(mktime(18,27,13,2,22,2005),false,2) => 18:30 -//------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------ + // Wrapper for AdjTime that will round a timestamp to an even time rounding + // it upwards + // Example: AdjEndTime(mktime(18,27,13,2,22,2005),false,2) => 18:30 + //------------------------------------------------------------------------------------------ function AdjEndTime($aTime,$aHourType=false,$aMinType=false,$aSecType=false) { - return $this->AdjTime($aTime,1,$aHourType,$aMinType,$aSecType); + return $this->AdjTime($aTime,1,$aHourType,$aMinType,$aSecType); } -//------------------------------------------------------------------------------------------ -// DateAutoScale -// Autoscale a date axis given start and end time -// Returns an array ($start,$end,$major,$minor,$format) -//------------------------------------------------------------------------------------------ + //------------------------------------------------------------------------------------------ + // DateAutoScale + // Autoscale a date axis given start and end time + // Returns an array ($start,$end,$major,$minor,$format) + //------------------------------------------------------------------------------------------ function DoDateAutoScale($aStartTime,$aEndTime,$aDensity=0,$aAdjust=true) { - // Format of array - // array ( Decision point, array( array( Major-scale-step-array ), - // array( Minor-scale-step-array ), - // array( 0=date-adjust, 1=time-adjust, adjustment-alignment) ) - // - $scalePoints = - array( - /* Intervall larger than 10 years */ - SECPERYEAR*10,array(array(SECPERYEAR*5,SECPERYEAR*2), - array(SECPERYEAR), - array(0,YEARADJ_1, 0,YEARADJ_1) ), + // Format of array + // array ( Decision point, array( array( Major-scale-step-array ), + // array( Minor-scale-step-array ), + // array( 0=date-adjust, 1=time-adjust, adjustment-alignment) ) + // + $scalePoints = + array( + /* Intervall larger than 10 years */ + SECPERYEAR*10,array(array(SECPERYEAR*5,SECPERYEAR*2), + array(SECPERYEAR), + array(0,YEARADJ_1, 0,YEARADJ_1) ), - /* Intervall larger than 2 years */ - SECPERYEAR*2,array(array(SECPERYEAR),array(SECPERYEAR), - array(0,YEARADJ_1) ), + /* Intervall larger than 2 years */ + SECPERYEAR*2,array(array(SECPERYEAR),array(SECPERYEAR), + array(0,YEARADJ_1) ), - /* Intervall larger than 90 days (approx 3 month) */ - SECPERDAY*90,array(array(SECPERDAY*30,SECPERDAY*14,SECPERDAY*7,SECPERDAY), - array(SECPERDAY*5,SECPERDAY*7,SECPERDAY,SECPERDAY), - array(0,MONTHADJ_1, 0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1)), + /* Intervall larger than 90 days (approx 3 month) */ + SECPERDAY*90,array(array(SECPERDAY*30,SECPERDAY*14,SECPERDAY*7,SECPERDAY), + array(SECPERDAY*5,SECPERDAY*7,SECPERDAY,SECPERDAY), + array(0,MONTHADJ_1, 0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1)), - /* Intervall larger than 30 days (approx 1 month) */ - SECPERDAY*30,array(array(SECPERDAY*14,SECPERDAY*7,SECPERDAY*2, SECPERDAY), - array(SECPERDAY,SECPERDAY,SECPERDAY,SECPERDAY), - array(0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1, 0,DAYADJ_1)), + /* Intervall larger than 30 days (approx 1 month) */ + SECPERDAY*30,array(array(SECPERDAY*14,SECPERDAY*7,SECPERDAY*2, SECPERDAY), + array(SECPERDAY,SECPERDAY,SECPERDAY,SECPERDAY), + array(0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1, 0,DAYADJ_1)), - /* Intervall larger than 7 days */ - SECPERDAY*7,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2), - array(SECPERHOUR*6,SECPERHOUR*3,SECPERHOUR,SECPERHOUR), - array(0,DAYADJ_1, 1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1)), + /* Intervall larger than 7 days */ + SECPERDAY*7,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2), + array(SECPERHOUR*6,SECPERHOUR*3,SECPERHOUR,SECPERHOUR), + array(0,DAYADJ_1, 1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1)), - /* Intervall larger than 1 day */ - SECPERDAY,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR), - array(SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR,SECPERHOUR,SECPERHOUR), - array(1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1, 1,HOURADJ_1)), + /* Intervall larger than 1 day */ + SECPERDAY,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR), + array(SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR,SECPERHOUR,SECPERHOUR), + array(1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1, 1,HOURADJ_1)), - /* Intervall larger than 12 hours */ - SECPERHOUR*12,array(array(SECPERHOUR*2,SECPERHOUR,SECPERMIN*30,900,600), - array(1800,1800,900,300,300), - array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), + /* Intervall larger than 12 hours */ + SECPERHOUR*12,array(array(SECPERHOUR*2,SECPERHOUR,SECPERMIN*30,900,600), + array(1800,1800,900,300,300), + array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), - /* Intervall larger than 2 hours */ - SECPERHOUR*2,array(array(SECPERHOUR,SECPERMIN*30,900,600,300), - array(1800,900,300,120,60), - array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), + /* Intervall larger than 2 hours */ + SECPERHOUR*2,array(array(SECPERHOUR,SECPERMIN*30,900,600,300), + array(1800,900,300,120,60), + array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), - /* Intervall larger than 1 hours */ - SECPERHOUR,array(array(SECPERMIN*30,900,600,300),array(900,300,120,60), - array(1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), + /* Intervall larger than 1 hours */ + SECPERHOUR,array(array(SECPERMIN*30,900,600,300),array(900,300,120,60), + array(1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), - /* Intervall larger than 30 min */ - SECPERMIN*30,array(array(SECPERMIN*15,SECPERMIN*10,SECPERMIN*5,SECPERMIN), - array(300,300,60,10), - array(1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5, 1,MINADJ_1)), + /* Intervall larger than 30 min */ + SECPERMIN*30,array(array(SECPERMIN*15,SECPERMIN*10,SECPERMIN*5,SECPERMIN), + array(300,300,60,10), + array(1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5, 1,MINADJ_1)), - /* Intervall larger than 1 min */ - SECPERMIN,array(array(SECPERMIN,15,10,5), - array(15,5,2,1), - array(1,MINADJ_1, 1,SECADJ_15, 1,SECADJ_10, 1,SECADJ_5)), + /* Intervall larger than 1 min */ + SECPERMIN,array(array(SECPERMIN,15,10,5), + array(15,5,2,1), + array(1,MINADJ_1, 1,SECADJ_15, 1,SECADJ_10, 1,SECADJ_5)), - /* Intervall larger than 10 sec */ - 10,array(array(5,2), - array(1,1), - array(1,SECADJ_5, 1,SECADJ_1)), + /* Intervall larger than 10 sec */ + 10,array(array(5,2), + array(1,1), + array(1,SECADJ_5, 1,SECADJ_1)), - /* Intervall larger than 1 sec */ - 1,array(array(1), - array(1), - array(1,SECADJ_1)), - ); + /* Intervall larger than 1 sec */ + 1,array(array(1), + array(1), + array(1,SECADJ_1)), + ); - $ns = count($scalePoints); - // Establish major and minor scale units for the date scale - $diff = $aEndTime - $aStartTime; - if( $diff < 1 ) return false; - $done=false; - $i=0; - while( ! $done ) { - if( $diff > $scalePoints[2*$i] ) { - // Get major and minor scale for this intervall - $scaleSteps = $scalePoints[2*$i+1]; - $major = $scaleSteps[0][min($aDensity,count($scaleSteps[0])-1)]; - // Try to find out which minor step looks best - $minor = $scaleSteps[1][min($aDensity,count($scaleSteps[1])-1)]; - if( $aAdjust ) { - // Find out how we should align the start and end timestamps - $idx = 2*min($aDensity,floor(count($scaleSteps[2])/2)-1); - if( $scaleSteps[2][$idx] === 0 ) { - // Use date adjustment - $adj = $scaleSteps[2][$idx+1]; - if( $adj >= 30 ) { - $start = $this->AdjStartDate($aStartTime,$adj-30); - $end = $this->AdjEndDate($aEndTime,$adj-30); - } - elseif( $adj >= 20 ) { - $start = $this->AdjStartDate($aStartTime,false,$adj-20); - $end = $this->AdjEndDate($aEndTime,false,$adj-20); - } - else { - $start = $this->AdjStartDate($aStartTime,false,false,$adj); - $end = $this->AdjEndDate($aEndTime,false,false,$adj); - // We add 1 second for date adjustment to make sure we end on 00:00 the following day - // This makes the final major tick be srawn when we step day-by-day instead of ending - // on xx:59:59 which would not draw the final major tick - $end++; - } - } - else { - // Use time adjustment - $adj = $scaleSteps[2][$idx+1]; - if( $adj >= 30 ) { - $start = $this->AdjStartTime($aStartTime,$adj-30); - $end = $this->AdjEndTime($aEndTime,$adj-30); - } - elseif( $adj >= 20 ) { - $start = $this->AdjStartTime($aStartTime,false,$adj-20); - $end = $this->AdjEndTime($aEndTime,false,$adj-20); - } - else { - $start = $this->AdjStartTime($aStartTime,false,false,$adj); - $end = $this->AdjEndTime($aEndTime,false,false,$adj); - } - } - } - // If the overall date span is larger than 1 day ten we show date - $format = ''; - if( ($end-$start) > SECPERDAY ) { - $format = 'Y-m-d '; - } - // If the major step is less than 1 day we need to whow hours + min - if( $major < SECPERDAY ) { - $format .= 'H:i'; - } - // If the major step is less than 1 min we need to show sec - if( $major < 60 ) { - $format .= ':s'; - } - $done=true; - } - ++$i; - } - return array($start,$end,$major,$minor,$format); + $ns = count($scalePoints); + // Establish major and minor scale units for the date scale + $diff = $aEndTime - $aStartTime; + if( $diff < 1 ) return false; + $done=false; + $i=0; + while( ! $done ) { + if( $diff > $scalePoints[2*$i] ) { + // Get major and minor scale for this intervall + $scaleSteps = $scalePoints[2*$i+1]; + $major = $scaleSteps[0][min($aDensity,count($scaleSteps[0])-1)]; + // Try to find out which minor step looks best + $minor = $scaleSteps[1][min($aDensity,count($scaleSteps[1])-1)]; + if( $aAdjust ) { + // Find out how we should align the start and end timestamps + $idx = 2*min($aDensity,floor(count($scaleSteps[2])/2)-1); + if( $scaleSteps[2][$idx] === 0 ) { + // Use date adjustment + $adj = $scaleSteps[2][$idx+1]; + if( $adj >= 30 ) { + $start = $this->AdjStartDate($aStartTime,$adj-30); + $end = $this->AdjEndDate($aEndTime,$adj-30); + } + elseif( $adj >= 20 ) { + $start = $this->AdjStartDate($aStartTime,false,$adj-20); + $end = $this->AdjEndDate($aEndTime,false,$adj-20); + } + else { + $start = $this->AdjStartDate($aStartTime,false,false,$adj); + $end = $this->AdjEndDate($aEndTime,false,false,$adj); + // We add 1 second for date adjustment to make sure we end on 00:00 the following day + // This makes the final major tick be srawn when we step day-by-day instead of ending + // on xx:59:59 which would not draw the final major tick + $end++; + } + } + else { + // Use time adjustment + $adj = $scaleSteps[2][$idx+1]; + if( $adj >= 30 ) { + $start = $this->AdjStartTime($aStartTime,$adj-30); + $end = $this->AdjEndTime($aEndTime,$adj-30); + } + elseif( $adj >= 20 ) { + $start = $this->AdjStartTime($aStartTime,false,$adj-20); + $end = $this->AdjEndTime($aEndTime,false,$adj-20); + } + else { + $start = $this->AdjStartTime($aStartTime,false,false,$adj); + $end = $this->AdjEndTime($aEndTime,false,false,$adj); + } + } + } + // If the overall date span is larger than 1 day ten we show date + $format = ''; + if( ($end-$start) > SECPERDAY ) { + $format = 'Y-m-d '; + } + // If the major step is less than 1 day we need to whow hours + min + if( $major < SECPERDAY ) { + $format .= 'H:i'; + } + // If the major step is less than 1 min we need to show sec + if( $major < 60 ) { + $format .= ':s'; + } + $done=true; + } + ++$i; + } + return array($start,$end,$major,$minor,$format); } // Overrides the automatic determined date format. Must be a valid date() format string function SetDateFormat($aFormat) { - $this->date_format = $aFormat; - $this->ticks->SetLabelDateFormat($this->date_format); + $this->date_format = $aFormat; + $this->ticks->SetLabelDateFormat($this->date_format); } function AdjustForDST($aFlg=true) { - $this->ticks->AdjustForDST($aFlg); + $this->ticks->AdjustForDST($aFlg); } function SetDateAlign($aStartAlign,$aEndAlign=false) { - if( $aEndAlign === false ) { - $aEndAlign=$aStartAlign; - } - $this->iStartAlign = $aStartAlign; - $this->iEndAlign = $aEndAlign; + if( $aEndAlign === false ) { + $aEndAlign=$aStartAlign; + } + $this->iStartAlign = $aStartAlign; + $this->iEndAlign = $aEndAlign; } function SetTimeAlign($aStartAlign,$aEndAlign=false) { - if( $aEndAlign === false ) { - $aEndAlign=$aStartAlign; - } - $this->iStartTimeAlign = $aStartAlign; - $this->iEndTimeAlign = $aEndAlign; + if( $aEndAlign === false ) { + $aEndAlign=$aStartAlign; + } + $this->iStartTimeAlign = $aStartAlign; + $this->iEndTimeAlign = $aEndAlign; } function AutoScale($img,$aStartTime,$aEndTime,$aNumSteps,$_adummy=false) { - // We need to have one dummy argument to make the signature of AutoScale() - // identical to LinearScale::AutoScale - if( $aStartTime == $aEndTime ) { - // Special case when we only have one data point. - // Create a small artifical intervall to do the autoscaling - $aStartTime -= 10; - $aEndTime += 10; - } - $done=false; - $i=0; - while( ! $done && $i < 5) { - list($adjstart,$adjend,$maj,$min,$format) = $this->DoDateAutoScale($aStartTime,$aEndTime,$i); - $n = floor(($adjend-$adjstart)/$maj); - if( $n * 1.7 > $aNumSteps ) { - $done=true; - } - $i++; - } - - /* - if( 0 ) { // DEBUG - echo " Start =".date("Y-m-d H:i:s",$aStartTime)."
"; - echo " End =".date("Y-m-d H:i:s",$aEndTime)."
"; - echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."
"; - echo "Adj End =".date("Y-m-d H:i:s",$adjend)."

"; - echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day
"; - echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day
"; - echo "Format=$format

"; - } - */ - - if( $this->iStartTimeAlign !== false && $this->iStartAlign !== false ) { - JpGraphError::RaiseL(3001); -//('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both'); - } + // We need to have one dummy argument to make the signature of AutoScale() + // identical to LinearScale::AutoScale + if( $aStartTime == $aEndTime ) { + // Special case when we only have one data point. + // Create a small artifical intervall to do the autoscaling + $aStartTime -= 10; + $aEndTime += 10; + } + $done=false; + $i=0; + while( ! $done && $i < 5) { + list($adjstart,$adjend,$maj,$min,$format) = $this->DoDateAutoScale($aStartTime,$aEndTime,$i); + $n = floor(($adjend-$adjstart)/$maj); + if( $n * 1.7 > $aNumSteps ) { + $done=true; + } + $i++; + } - if( $this->iStartTimeAlign !== false ) { - if( $this->iStartTimeAlign >= 30 ) { - $adjstart = $this->AdjStartTime($aStartTime,$this->iStartTimeAlign-30); - } - elseif( $this->iStartTimeAlign >= 20 ) { - $adjstart = $this->AdjStartTime($aStartTime,false,$this->iStartTimeAlign-20); - } - else { - $adjstart = $this->AdjStartTime($aStartTime,false,false,$this->iStartTimeAlign); - } - } - if( $this->iEndTimeAlign !== false ) { - if( $this->iEndTimeAlign >= 30 ) { - $adjend = $this->AdjEndTime($aEndTime,$this->iEndTimeAlign-30); - } - elseif( $this->iEndTimeAlign >= 20 ) { - $adjend = $this->AdjEndTime($aEndTime,false,$this->iEndTimeAlign-20); - } - else { - $adjend = $this->AdjEndTime($aEndTime,false,false,$this->iEndTimeAlign); - } - } + /* + if( 0 ) { // DEBUG + echo " Start =".date("Y-m-d H:i:s",$aStartTime)."
"; + echo " End =".date("Y-m-d H:i:s",$aEndTime)."
"; + echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."
"; + echo "Adj End =".date("Y-m-d H:i:s",$adjend)."

"; + echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day
"; + echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day
"; + echo "Format=$format

"; + } + */ + + if( $this->iStartTimeAlign !== false && $this->iStartAlign !== false ) { + JpGraphError::RaiseL(3001); + //('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both'); + } + + if( $this->iStartTimeAlign !== false ) { + if( $this->iStartTimeAlign >= 30 ) { + $adjstart = $this->AdjStartTime($aStartTime,$this->iStartTimeAlign-30); + } + elseif( $this->iStartTimeAlign >= 20 ) { + $adjstart = $this->AdjStartTime($aStartTime,false,$this->iStartTimeAlign-20); + } + else { + $adjstart = $this->AdjStartTime($aStartTime,false,false,$this->iStartTimeAlign); + } + } + if( $this->iEndTimeAlign !== false ) { + if( $this->iEndTimeAlign >= 30 ) { + $adjend = $this->AdjEndTime($aEndTime,$this->iEndTimeAlign-30); + } + elseif( $this->iEndTimeAlign >= 20 ) { + $adjend = $this->AdjEndTime($aEndTime,false,$this->iEndTimeAlign-20); + } + else { + $adjend = $this->AdjEndTime($aEndTime,false,false,$this->iEndTimeAlign); + } + } - - if( $this->iStartAlign !== false ) { - if( $this->iStartAlign >= 30 ) { - $adjstart = $this->AdjStartDate($aStartTime,$this->iStartAlign-30); - } - elseif( $this->iStartAlign >= 20 ) { - $adjstart = $this->AdjStartDate($aStartTime,false,$this->iStartAlign-20); - } - else { - $adjstart = $this->AdjStartDate($aStartTime,false,false,$this->iStartAlign); - } - } - if( $this->iEndAlign !== false ) { - if( $this->iEndAlign >= 30 ) { - $adjend = $this->AdjEndDate($aEndTime,$this->iEndAlign-30); - } - elseif( $this->iEndAlign >= 20 ) { - $adjend = $this->AdjEndDate($aEndTime,false,$this->iEndAlign-20); - } - else { - $adjend = $this->AdjEndDate($aEndTime,false,false,$this->iEndAlign); - } - } - $this->Update($img,$adjstart,$adjend); - if( ! $this->ticks->IsSpecified() ) - $this->ticks->Set($maj,$min); - if( $this->date_format == '' ) - $this->ticks->SetLabelDateFormat($format); - else - $this->ticks->SetLabelDateFormat($this->date_format); + + if( $this->iStartAlign !== false ) { + if( $this->iStartAlign >= 30 ) { + $adjstart = $this->AdjStartDate($aStartTime,$this->iStartAlign-30); + } + elseif( $this->iStartAlign >= 20 ) { + $adjstart = $this->AdjStartDate($aStartTime,false,$this->iStartAlign-20); + } + else { + $adjstart = $this->AdjStartDate($aStartTime,false,false,$this->iStartAlign); + } + } + if( $this->iEndAlign !== false ) { + if( $this->iEndAlign >= 30 ) { + $adjend = $this->AdjEndDate($aEndTime,$this->iEndAlign-30); + } + elseif( $this->iEndAlign >= 20 ) { + $adjend = $this->AdjEndDate($aEndTime,false,$this->iEndAlign-20); + } + else { + $adjend = $this->AdjEndDate($aEndTime,false,false,$this->iEndAlign); + } + } + $this->Update($img,$adjstart,$adjend); + if( ! $this->ticks->IsSpecified() ) + $this->ticks->Set($maj,$min); + if( $this->date_format == '' ) + $this->ticks->SetLabelDateFormat($format); + else + $this->ticks->SetLabelDateFormat($this->date_format); } } diff --git a/libs/jpgraph/jpgraph_errhandler.inc.php b/libs/jpgraph/jpgraph_errhandler.inc.php index 3c00cb4..0d08b2c 100644 --- a/libs/jpgraph/jpgraph_errhandler.inc.php +++ b/libs/jpgraph/jpgraph_errhandler.inc.php @@ -1,112 +1,186 @@ lt = $_jpg_messages; + $file = 'lang/'.$__jpg_err_locale.'.inc.php'; + if( !file_exists(dirname(__FILE__).'/'.$file) ) { + die('Chosen locale file ("'.$file.'") for error messages does not exist or is not readable for the PHP process. Please make sure that the file exists and that the file permissions are such that the PHP process is allowed to read this file.'); + } + require($file); + $this->lt = $_jpg_messages; } function Get($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) { - GLOBAL $__jpg_err_locale; - if( !isset($this->lt[$errnbr]) ) { - return 'Internal error: The specified error message ('.$errnbr.') does not exist in the chosen locale ('.$__jpg_err_locale.')'; - } - $ea = $this->lt[$errnbr]; - $j=0; - if( $a1 !== null ) { - $argv[$j++] = $a1; - if( $a2 !== null ) { - $argv[$j++] = $a2; - if( $a3 !== null ) { - $argv[$j++] = $a3; - if( $a4 !== null ) { - $argv[$j++] = $a4; - if( $a5 !== null ) { - $argv[$j++] = $a5; - } - } - } - } - } - $numargs = $j; - if( $ea[1] != $numargs ) { - // Error message argument count do not match. - // Just return the error message without arguments. - return $ea[0]; - } - switch( $numargs ) { - case 1: - $msg = sprintf($ea[0],$argv[0]); - break; - case 2: - $msg = sprintf($ea[0],$argv[0],$argv[1]); - break; - case 3: - $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2]); - break; - case 4: - $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3]); - break; - case 5: - $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3],$argv[4]); - break; - case 0: - default: - $msg = sprintf($ea[0]); - break; - } - return $msg; + GLOBAL $__jpg_err_locale; + if( !isset($this->lt[$errnbr]) ) { + return 'Internal error: The specified error message ('.$errnbr.') does not exist in the chosen locale ('.$__jpg_err_locale.')'; + } + $ea = $this->lt[$errnbr]; + $j=0; + if( $a1 !== null ) { + $argv[$j++] = $a1; + if( $a2 !== null ) { + $argv[$j++] = $a2; + if( $a3 !== null ) { + $argv[$j++] = $a3; + if( $a4 !== null ) { + $argv[$j++] = $a4; + if( $a5 !== null ) { + $argv[$j++] = $a5; + } + } + } + } + } + $numargs = $j; + if( $ea[1] != $numargs ) { + // Error message argument count do not match. + // Just return the error message without arguments. + return $ea[0]; + } + switch( $numargs ) { + case 1: + $msg = sprintf($ea[0],$argv[0]); + break; + case 2: + $msg = sprintf($ea[0],$argv[0],$argv[1]); + break; + case 3: + $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2]); + break; + case 4: + $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3]); + break; + case 5: + $msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3],$argv[4]); + break; + case 0: + default: + $msg = sprintf($ea[0]); + break; + } + return $msg; } } - + // // A wrapper class that is used to access the specified error object // (to hide the global error parameter and avoid having a GLOBAL directive // in all methods. // class JpGraphError { - private static $__jpg_err; - public static function Install($aErrObject) { - self::$__jpg_err = new $aErrObject; - } + private static $__iImgFlg = true; + private static $__iLogFile = ''; + private static $__iTitle = 'JpGraph Error: '; public static function Raise($aMsg,$aHalt=true){ - self::$__jpg_err->Raise($aMsg,$aHalt); + throw new JpGraphException($aMsg); } public static function SetErrLocale($aLoc) { - GLOBAL $__jpg_err_locale ; - $__jpg_err_locale = $aLoc; + GLOBAL $__jpg_err_locale ; + $__jpg_err_locale = $aLoc; } public static function RaiseL($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) { - $t = new ErrMsgText(); - $msg = $t->Get($errnbr,$a1,$a2,$a3,$a4,$a5); - self::$__jpg_err->Raise($msg); + throw new JpGraphExceptionL($errnbr,$a1,$a2,$a3,$a4,$a5); + } + public static function SetImageFlag($aFlg=true) { + self::$__iImgFlg = $aFlg; + } + public static function GetImageFlag() { + return self::$__iImgFlg; + } + public static function SetLogFile($aFile) { + self::$__iLogFile = $aFile; + } + public static function GetLogFile() { + return self::$__iLogFile; + } + public static function SetTitle($aTitle) { + self::$__iTitle = $aTitle; + } + public static function GetTitle() { + return self::$__iTitle; + } +} + +// Setup the default handler +global $__jpg_OldHandler; +$__jpg_OldHandler = set_exception_handler(array('JpGraphException','defaultHandler')); + +class JpGraphException extends Exception { + // Redefine the exception so message isn't optional + public function __construct($message, $code = 0) { + // make sure everything is assigned properly + parent::__construct($message, $code); + } + // custom string representation of object + public function _toString() { + return __CLASS__ . ": [{$this->code}]: {$this->message} at " . basename($this->getFile()) . ":" . $this->getLine() . "\n" . $this->getTraceAsString() . "\n"; + } + // custom representation of error as an image + public function Stroke() { + if( JpGraphError::GetImageFlag() ) { + $errobj = new JpGraphErrObjectImg(); + $errobj->SetTitle(JpGraphError::GetTitle()); + } + else { + $errobj = new JpGraphErrObject(); + $errobj->SetTitle(JpGraphError::GetTitle()); + $errobj->SetStrokeDest(JpGraphError::GetLogFile()); + } + $errobj->Raise($this->getMessage()); + } + static public function defaultHandler(Exception $exception) { + global $__jpg_OldHandler; + if( $exception instanceof JpGraphException ) { + $exception->Stroke(); + } + else { + // Restore old handler + if( $__jpg_OldHandler !== NULL ) { + set_exception_handler($__jpg_OldHandler); + } + throw $exception; + } + } +} + +class JpGraphExceptionL extends JpGraphException { + // Redefine the exception so message isn't optional + public function __construct($errcode,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) { + // make sure everything is assigned properly + $errtxt = new ErrMsgText(); + JpGraphError::SetTitle('JpGraph Error: '.$errcode); + parent::__construct($errtxt->Get($errcode,$a1,$a2,$a3,$a4,$a5), 0); } } @@ -119,37 +193,50 @@ class JpGraphError { //============================================================= class JpGraphErrObject { - protected $iTitle = "JpGraph Error"; + protected $iTitle = "JpGraph error: "; protected $iDest = false; - function JpGraphErrObject() { - // Empty. Reserved for future use + function __construct() { + // Empty. Reserved for future use } function SetTitle($aTitle) { - $this->iTitle = $aTitle; + $this->iTitle = $aTitle; } - function SetStrokeDest($aDest) { - $this->iDest = $aDest; + function SetStrokeDest($aDest) { + $this->iDest = $aDest; } // If aHalt is true then execution can't continue. Typical used for fatal errors - function Raise($aMsg,$aHalt=true) { - $aMsg = $this->iTitle.' '.$aMsg; - if ($this->iDest) { - $f = @fopen($this->iDest,'a'); - if( $f ) { - @fwrite($f,$aMsg); - @fclose($f); - } - } - else { - echo $aMsg; - } - if( $aHalt ) - die(); + function Raise($aMsg,$aHalt=false) { + if( $this->iDest != '' ) { + if( $this->iDest == 'syslog' ) { + error_log($this->iTitle.$aMsg); + } + else { + $str = '['.date('r').'] '.$this->iTitle.$aMsg."\n"; + $f = @fopen($this->iDest,'a'); + if( $f ) { + @fwrite($f,$str); + @fclose($f); + } + } + } + else { + $aMsg = $this->iTitle.$aMsg; + // Check SAPI and if we are called from the command line + // send the error to STDERR instead + if( PHP_SAPI == 'cli' ) { + fwrite(STDERR,$aMsg); + } + else { + echo $aMsg; + } + } + if( $aHalt ) + exit(1); } } @@ -157,122 +244,125 @@ class JpGraphErrObject { // An image based error handler //============================================================== class JpGraphErrObjectImg extends JpGraphErrObject { + + function __construct() { + parent::__construct(); + // Empty. Reserved for future use + } function Raise($aMsg,$aHalt=true) { - $img_iconerror = - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'. - 'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'. - 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'. - 'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'. - 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. - 'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'. - '2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'. - 'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'. - 'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'. - 'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'. - '6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'. - 'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'. - 'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'. - 'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'. - 'qL72fwAAAABJRU5ErkJggg==' ; + $img_iconerror = + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'. + 'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'. + 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'. + 'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. + 'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'. + '2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'. + 'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'. + 'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'. + 'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'. + '6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'. + 'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'. + 'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'. + 'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'. + 'qL72fwAAAABJRU5ErkJggg==' ; - if( function_exists("imagetypes") ) - $supported = imagetypes(); - else - $supported = 0; + + if( function_exists("imagetypes") ) { + $supported = imagetypes(); + } else { + $supported = 0; + } - if( !function_exists('imagecreatefromstring') ) - $supported = 0; + if( !function_exists('imagecreatefromstring') ) { + $supported = 0; + } + + if( ob_get_length() || headers_sent() || !($supported & IMG_PNG) ) { + // Special case for headers already sent or that the installation doesn't support + // the PNG format (which the error icon is encoded in). + // Dont return an image since it can't be displayed + die($this->iTitle.' '.$aMsg); + } - if( ob_get_length() || headers_sent() || !($supported & IMG_PNG) ) { - // Special case for headers already sent or that the installation doesn't support - // the PNG format (which the error icon is encoded in). - // Dont return an image since it can't be displayed - die($this->iTitle.' '.$aMsg); - } + $aMsg = wordwrap($aMsg,55); + $lines = substr_count($aMsg,"\n"); - $aMsg = wordwrap($aMsg,55); - $lines = substr_count($aMsg,"\n"); + // Create the error icon GD + $erricon = Image::CreateFromString(base64_decode($img_iconerror)); - // Create the error icon GD - $erricon = Image::CreateFromString(base64_decode($img_iconerror)); + // Create an image that contains the error text. + $w=400; + $h=100 + 15*max(0,$lines-3); - // Create an image that contains the error text. - $w=400; - $h=100 + 15*max(0,$lines-3); - - $img = new Image($w,$h); + $img = new Image($w,$h); - // Drop shadow - $img->SetColor("gray"); - $img->FilledRectangle(5,5,$w-1,$h-1,10); - $img->SetColor("gray:0.7"); - $img->FilledRectangle(5,5,$w-3,$h-3,10); - - // Window background - $img->SetColor("lightblue"); - $img->FilledRectangle(1,1,$w-5,$h-5); - $img->CopyCanvasH($img->img,$erricon,5,30,0,0,40,40); + // Drop shadow + $img->SetColor("gray"); + $img->FilledRectangle(5,5,$w-1,$h-1,10); + $img->SetColor("gray:0.7"); + $img->FilledRectangle(5,5,$w-3,$h-3,10); - // Window border - $img->SetColor("black"); - $img->Rectangle(1,1,$w-5,$h-5); - $img->Rectangle(0,0,$w-4,$h-4); - - // Window top row - $img->SetColor("darkred"); - for($y=3; $y < 18; $y += 2 ) - $img->Line(1,$y,$w-6,$y); + // Window background + $img->SetColor("lightblue"); + $img->FilledRectangle(1,1,$w-5,$h-5); + $img->CopyCanvasH($img->img,$erricon,5,30,0,0,40,40); - // "White shadow" - $img->SetColor("white"); + // Window border + $img->SetColor("black"); + $img->Rectangle(1,1,$w-5,$h-5); + $img->Rectangle(0,0,$w-4,$h-4); - // Left window edge - $img->Line(2,2,2,$h-5); - $img->Line(2,2,$w-6,2); + // Window top row + $img->SetColor("darkred"); + for($y=3; $y < 18; $y += 2 ) + $img->Line(1,$y,$w-6,$y); - // "Gray button shadow" - $img->SetColor("darkgray"); + // "White shadow" + $img->SetColor("white"); - // Gray window shadow - $img->Line(2,$h-6,$w-5,$h-6); - $img->Line(3,$h-7,$w-5,$h-7); + // Left window edge + $img->Line(2,2,2,$h-5); + $img->Line(2,2,$w-6,2); - // Window title - $m = floor($w/2-5); - $l = 100; - $img->SetColor("lightgray:1.3"); - $img->FilledRectangle($m-$l,2,$m+$l,16); + // "Gray button shadow" + $img->SetColor("darkgray"); - // Stroke text - $img->SetColor("darkred"); - $img->SetFont(FF_FONT2,FS_BOLD); - $img->StrokeText($m-50,15,$this->iTitle); - $img->SetColor("black"); - $img->SetFont(FF_FONT1,FS_NORMAL); - $txt = new Text($aMsg,52,25); - $txt->Align("left","top"); - $txt->Stroke($img); - if ($this->iDest) { - $img->Stream($this->iDest); - } else { - $img->Headers(); - $img->Stream(); - } - if( $aHalt ) - die(); + // Gray window shadow + $img->Line(2,$h-6,$w-5,$h-6); + $img->Line(3,$h-7,$w-5,$h-7); + + // Window title + $m = floor($w/2-5); + $l = 110; + $img->SetColor("lightgray:1.3"); + $img->FilledRectangle($m-$l,2,$m+$l,16); + + // Stroke text + $img->SetColor("darkred"); + $img->SetFont(FF_FONT2,FS_BOLD); + $img->StrokeText($m-90,15,$this->iTitle); + $img->SetColor("black"); + $img->SetFont(FF_FONT1,FS_NORMAL); + $txt = new Text($aMsg,52,25); + $txt->Align("left","top"); + $txt->Stroke($img); + if ($this->iDest) { + $img->Stream($this->iDest); + } else { + $img->Headers(); + $img->Stream(); + } + if( $aHalt ) + die(); } } -// Install the default error handler -if( USE_IMAGE_ERROR_HANDLER ) { - JpGraphError::Install("JpGraphErrObjectImg"); -} -else { - JpGraphError::Install("JpGraphErrObject"); -} - +if( ! USE_IMAGE_ERROR_HANDLER ) { + JpGraphError::SetImageFlag(false); +} ?> diff --git a/libs/jpgraph/jpgraph_error.php b/libs/jpgraph/jpgraph_error.php index 40b27c2..5e0857f 100644 --- a/libs/jpgraph/jpgraph_error.php +++ b/libs/jpgraph/jpgraph_error.php @@ -1,14 +1,14 @@ Plot($datay,$datax); - $this->numpoints /= 2; + + //--------------- + // CONSTRUCTOR + function __construct($datay,$datax=false) { + parent::__construct($datay,$datax); + $this->numpoints /= 2; } -//--------------- -// PUBLIC METHODS - + //--------------- + // PUBLIC METHODS + // Gets called before any axis are stroked function PreStrokeAdjust($graph) { - if( $this->center ) { - $a=0.5; $b=0.5; - ++$this->numpoints; - } else { - $a=0; $b=0; - } - $graph->xaxis->scale->ticks->SetXLabelOffset($a); - $graph->SetTextScaleOff($b); - //$graph->xaxis->scale->ticks->SupressMinorTickMarks(); + if( $this->center ) { + $a=0.5; $b=0.5; + ++$this->numpoints; + } else { + $a=0; $b=0; + } + $graph->xaxis->scale->ticks->SetXLabelOffset($a); + $graph->SetTextScaleOff($b); + //$graph->xaxis->scale->ticks->SupressMinorTickMarks(); } - + // Method description function Stroke($img,$xscale,$yscale) { - $numpoints=count($this->coords[0])/2; - $img->SetColor($this->color); - $img->SetLineWeight($this->weight); + $numpoints=count($this->coords[0])/2; + $img->SetColor($this->color); + $img->SetLineWeight($this->weight); - if( isset($this->coords[1]) ) { - if( count($this->coords[1])!=$numpoints ) - JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints); -//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); - else - $exist_x = true; - } - else - $exist_x = false; + if( isset($this->coords[1]) ) { + if( count($this->coords[1])!=$numpoints ) + JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints); + //("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); + else + $exist_x = true; + } + else + $exist_x = false; - for( $i=0; $i<$numpoints; ++$i) { - if( $exist_x ) - $x=$this->coords[1][$i]; - else - $x=$i; + for( $i=0; $i<$numpoints; ++$i) { + if( $exist_x ) + $x=$this->coords[1][$i]; + else + $x=$i; - if( !is_numeric($x) || - !is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1]) ) { - continue; - } + if( !is_numeric($x) || + !is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1]) ) { + continue; + } - $xt = $xscale->Translate($x); - $yt1 = $yscale->Translate($this->coords[0][$i*2]); - $yt2 = $yscale->Translate($this->coords[0][$i*2+1]); - $img->Line($xt,$yt1,$xt,$yt2); - $img->Line($xt-$this->errwidth,$yt1,$xt+$this->errwidth,$yt1); - $img->Line($xt-$this->errwidth,$yt2,$xt+$this->errwidth,$yt2); - } - return true; + $xt = $xscale->Translate($x); + $yt1 = $yscale->Translate($this->coords[0][$i*2]); + $yt2 = $yscale->Translate($this->coords[0][$i*2+1]); + $img->Line($xt,$yt1,$xt,$yt2); + $img->Line($xt-$this->errwidth,$yt1,$xt+$this->errwidth,$yt1); + $img->Line($xt-$this->errwidth,$yt2,$xt+$this->errwidth,$yt2); + } + return true; } } // Class @@ -85,29 +86,29 @@ class ErrorPlot extends Plot { //=================================================== class ErrorLinePlot extends ErrorPlot { public $line=null; -//--------------- -// CONSTRUCTOR - function ErrorLinePlot($datay,$datax=false) { - $this->ErrorPlot($datay,$datax); - // Calculate line coordinates as the average of the error limits - $n = count($datay); - for($i=0; $i < $n; $i+=2 ) { - $ly[]=($datay[$i]+$datay[$i+1])/2; - } - $this->line=new LinePlot($ly,$datax); + //--------------- + // CONSTRUCTOR + function __construct($datay,$datax=false) { + parent::__construct($datay,$datax); + // Calculate line coordinates as the average of the error limits + $n = count($datay); + for($i=0; $i < $n; $i+=2 ) { + $ly[]=($datay[$i]+$datay[$i+1])/2; + } + $this->line=new LinePlot($ly,$datax); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function Legend($graph) { - if( $this->legend != "" ) - $graph->legend->Add($this->legend,$this->color); - $this->line->Legend($graph); + if( $this->legend != "" ) + $graph->legend->Add($this->legend,$this->color); + $this->line->Legend($graph); } - + function Stroke($img,$xscale,$yscale) { - parent::Stroke($img,$xscale,$yscale); - $this->line->Stroke($img,$xscale,$yscale); + parent::Stroke($img,$xscale,$yscale); + $this->line->Stroke($img,$xscale,$yscale); } } // Class @@ -118,36 +119,36 @@ class ErrorLinePlot extends ErrorPlot { //=================================================== class LineErrorPlot extends ErrorPlot { public $line=null; -//--------------- -// CONSTRUCTOR + //--------------- + // CONSTRUCTOR // Data is (val, errdeltamin, errdeltamax) - function LineErrorPlot($datay,$datax=false) { - $ly=array(); $ey=array(); - $n = count($datay); - if( $n % 3 != 0 ) { - JpGraphError::RaiseL(4002); -//('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3'); - } - for($i=0; $i < $n; $i+=3 ) { - $ly[]=$datay[$i]; - $ey[]=$datay[$i]+$datay[$i+1]; - $ey[]=$datay[$i]+$datay[$i+2]; - } - $this->ErrorPlot($ey,$datax); - $this->line=new LinePlot($ly,$datax); + function __construct($datay,$datax=false) { + $ly=array(); $ey=array(); + $n = count($datay); + if( $n % 3 != 0 ) { + JpGraphError::RaiseL(4002); + //('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3'); + } + for($i=0; $i < $n; $i+=3 ) { + $ly[]=$datay[$i]; + $ey[]=$datay[$i]+$datay[$i+1]; + $ey[]=$datay[$i]+$datay[$i+2]; + } + parent::__construct($ey,$datax); + $this->line=new LinePlot($ly,$datax); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function Legend($graph) { - if( $this->legend != "" ) - $graph->legend->Add($this->legend,$this->color); - $this->line->Legend($graph); + if( $this->legend != "" ) + $graph->legend->Add($this->legend,$this->color); + $this->line->Legend($graph); } - + function Stroke($img,$xscale,$yscale) { - parent::Stroke($img,$xscale,$yscale); - $this->line->Stroke($img,$xscale,$yscale); + parent::Stroke($img,$xscale,$yscale); + $this->line->Stroke($img,$xscale,$yscale); } } // Class diff --git a/libs/jpgraph/jpgraph_flags.php b/libs/jpgraph/jpgraph_flags.php index a15bae4..3bf902d 100644 --- a/libs/jpgraph/jpgraph_flags.php +++ b/libs/jpgraph/jpgraph_flags.php @@ -1,9 +1,9 @@ 'flags_thumb35x35', - FLAGSIZE2 => 'flags_thumb60x60', - FLAGSIZE3 => 'flags_thumb100x100', - FLAGSIZE4 => 'flags' - ); + FLAGSIZE1 => 'flags_thumb35x35', + FLAGSIZE2 => 'flags_thumb60x60', + FLAGSIZE3 => 'flags_thumb100x100', + FLAGSIZE4 => 'flags' + ); private $iFlagData ; private $iOrdIdx=array(); function FlagImages($aSize=FLAGSIZE1) { - switch($aSize) { - case FLAGSIZE1 : - case FLAGSIZE2 : - case FLAGSIZE3 : - case FLAGSIZE4 : - $file = dirname(__FILE__).'/'.$this->iFlagSetMap[$aSize].'.dat'; - $fp = fopen($file,'rb'); - $rawdata = fread($fp,filesize($file)); - $this->iFlagData = unserialize($rawdata); - break; - default: - JpGraphError::RaiseL(5001,$aSize); -//('Unknown flag size. ('.$aSize.')'); - } - $this->iFlagCount = count($this->iCountryNameMap); + switch($aSize) { + case FLAGSIZE1 : + case FLAGSIZE2 : + case FLAGSIZE3 : + case FLAGSIZE4 : + $file = dirname(__FILE__).'/'.$this->iFlagSetMap[$aSize].'.dat'; + $fp = fopen($file,'rb'); + $rawdata = fread($fp,filesize($file)); + $this->iFlagData = unserialize($rawdata); + break; + default: + JpGraphError::RaiseL(5001,$aSize); + //('Unknown flag size. ('.$aSize.')'); + } + $this->iFlagCount = count($this->iCountryNameMap); } function GetNum() { - return $this->iFlagCount; + return $this->iFlagCount; } function GetImgByName($aName,&$outFullName) { - $idx = $this->GetIdxByName($aName,$outFullName); - return $this->GetImgByIdx($idx); + $idx = $this->GetIdxByName($aName,$outFullName); + return $this->GetImgByIdx($idx); } function GetImgByIdx($aIdx) { - if( array_key_exists($aIdx,$this->iFlagData) ) { - $d = $this->iFlagData[$aIdx][1]; - return Image::CreateFromString($d); - } - else { - JpGraphError::RaiseL(5002,$aIdx); -//("Flag index \" $aIdx\" does not exist."); - } + if( array_key_exists($aIdx,$this->iFlagData) ) { + $d = $this->iFlagData[$aIdx][1]; + return Image::CreateFromString($d); + } + else { + JpGraphError::RaiseL(5002,$aIdx); + //("Flag index \"�$aIdx\" does not exist."); + } } function GetIdxByOrdinal($aOrd,&$outFullName) { - $aOrd--; - $n = count($this->iOrdIdx); - if( $n == 0 ) { - reset($this->iCountryNameMap); - $this->iOrdIdx=array(); - $i=0; - while( list($key,$val) = each($this->iCountryNameMap) ) { - $this->iOrdIdx[$i++] = array($val,$key); - } - $tmp=$this->iOrdIdx[$aOrd]; - $outFullName = $tmp[1]; - return $tmp[0]; - - } - elseif( $aOrd >= 0 && $aOrd < $n ) { - $tmp=$this->iOrdIdx[$aOrd]; - $outFullName = $tmp[1]; - return $tmp[0]; - } - else { - JpGraphError::RaiseL(5003,$aOrd); -//('Invalid ordinal number specified for flag index.'); - } + $aOrd--; + $n = count($this->iOrdIdx); + if( $n == 0 ) { + reset($this->iCountryNameMap); + $this->iOrdIdx=array(); + $i=0; + while( list($key,$val) = each($this->iCountryNameMap) ) { + $this->iOrdIdx[$i++] = array($val,$key); + } + $tmp=$this->iOrdIdx[$aOrd]; + $outFullName = $tmp[1]; + return $tmp[0]; + + } + elseif( $aOrd >= 0 && $aOrd < $n ) { + $tmp=$this->iOrdIdx[$aOrd]; + $outFullName = $tmp[1]; + return $tmp[0]; + } + else { + JpGraphError::RaiseL(5003,$aOrd); + //('Invalid ordinal number specified for flag index.'); + } } function GetIdxByName($aName,&$outFullName) { - if( is_integer($aName) ) { - $idx = $this->GetIdxByOrdinal($aName,$outFullName); - return $idx; - } + if( is_integer($aName) ) { + $idx = $this->GetIdxByOrdinal($aName,$outFullName); + return $idx; + } - $found=false; - $aName = strtolower($aName); - $nlen = strlen($aName); - reset($this->iCountryNameMap); - // Start by trying to match exact index name - while( list($key,$val) = each($this->iCountryNameMap) ) { - if( $nlen == strlen($val) && $val == $aName ) { - $found=true; - break; - } - } - if( !$found ) { - reset($this->iCountryNameMap); - // If the exact index doesn't work try a (partial) full name - while( list($key,$val) = each($this->iCountryNameMap) ) { - if( strpos(strtolower($key), $aName) !== false ) { - $found=true; - break; - } - } - } - if( $found ) { - $outFullName = $key; - return $val; - } - else { - JpGraphError::RaiseL(5004,$aName); -//("The (partial) country name \"$aName\" does not have a cooresponding flag image. The flag may still exist but under another name, e.g. insted of \"usa\" try \"united states\"."); - } + $found=false; + $aName = strtolower($aName); + $nlen = strlen($aName); + reset($this->iCountryNameMap); + // Start by trying to match exact index name + while( list($key,$val) = each($this->iCountryNameMap) ) { + if( $nlen == strlen($val) && $val == $aName ) { + $found=true; + break; + } + } + if( !$found ) { + reset($this->iCountryNameMap); + // If the exact index doesn't work try a (partial) full name + while( list($key,$val) = each($this->iCountryNameMap) ) { + if( strpos(strtolower($key), $aName) !== false ) { + $found=true; + break; + } + } + } + if( $found ) { + $outFullName = $key; + return $val; + } + else { + JpGraphError::RaiseL(5004,$aName); + //("The (partial) country name \"$aName\" does not have a cooresponding flag image. The flag may still exist but under another name, e.g. insted of \"usa\" try \"united states\"."); + } } } diff --git a/libs/jpgraph/jpgraph_gantt.php b/libs/jpgraph/jpgraph_gantt.php index 69fc0d1..b8f0e5f 100644 --- a/libs/jpgraph/jpgraph_gantt.php +++ b/libs/jpgraph/jpgraph_gantt.php @@ -1,143 +1,143 @@ vgrid = new LineProperty(); + function __construct() { + $this->vgrid = new LineProperty(); } function Hide($aF=true) { - $this->iShow=!$aF; + $this->iShow=!$aF; } function Show($aF=true) { - $this->iShow=$aF; + $this->iShow=$aF; } // Specify font function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) { - $this->iFFamily = $aFFamily; - $this->iFStyle = $aFStyle; - $this->iFSize = $aFSize; + $this->iFFamily = $aFFamily; + $this->iFStyle = $aFStyle; + $this->iFSize = $aFSize; } function SetStyle($aStyle) { - $this->iStyle = $aStyle; + $this->iStyle = $aStyle; } function SetColumnMargin($aLeft,$aRight) { - $this->iLeftColMargin = $aLeft; - $this->iRightColMargin = $aRight; + $this->iLeftColMargin = $aLeft; + $this->iRightColMargin = $aRight; } function SetFontColor($aFontColor) { - $this->iFontColor = $aFontColor; + $this->iFontColor = $aFontColor; } function SetColor($aColor) { - $this->iColor = $aColor; + $this->iColor = $aColor; } function SetBackgroundColor($aColor) { - $this->iBackgroundColor = $aColor; + $this->iBackgroundColor = $aColor; } function SetColTitles($aTitles,$aWidth=null) { - $this->iTitles = $aTitles; - $this->iWidth = $aWidth; + $this->iTitles = $aTitles; + $this->iWidth = $aWidth; } function SetMinColWidth($aWidths) { - $n = min(count($this->iTitles),count($aWidths)); - for($i=0; $i < $n; ++$i ) { - if( !empty($aWidths[$i]) ) { - if( empty($this->iWidth[$i]) ) { - $this->iWidth[$i] = $aWidths[$i]; - } - else { - $this->iWidth[$i] = max($this->iWidth[$i],$aWidths[$i]); - } - } - } + $n = min(count($this->iTitles),count($aWidths)); + for($i=0; $i < $n; ++$i ) { + if( !empty($aWidths[$i]) ) { + if( empty($this->iWidth[$i]) ) { + $this->iWidth[$i] = $aWidths[$i]; + } + else { + $this->iWidth[$i] = max($this->iWidth[$i],$aWidths[$i]); + } + } + } } function GetWidth($aImg) { - $txt = new TextProperty(); - $txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - $n = count($this->iTitles) ; - $rm=$this->iRightColMargin; - $w = 0; - for($h=0, $i=0; $i < $n; ++$i ) { - $w += $this->iLeftColMargin; - $txt->Set($this->iTitles[$i]); - if( !empty($this->iWidth[$i]) ) { - $w1 = max($txt->GetWidth($aImg)+$rm,$this->iWidth[$i]); - } - else { - $w1 = $txt->GetWidth($aImg)+$rm; - } - $this->iWidth[$i] = $w1; - $w += $w1; - $h = max($h,$txt->GetHeight($aImg)); - } - $this->iHeight = $h+$this->iTopHeaderMargin; + $txt = new TextProperty(); + $txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + $n = count($this->iTitles) ; + $rm=$this->iRightColMargin; + $w = 0; + for($h=0, $i=0; $i < $n; ++$i ) { + $w += $this->iLeftColMargin; + $txt->Set($this->iTitles[$i]); + if( !empty($this->iWidth[$i]) ) { + $w1 = max($txt->GetWidth($aImg)+$rm,$this->iWidth[$i]); + } + else { + $w1 = $txt->GetWidth($aImg)+$rm; + } + $this->iWidth[$i] = $w1; + $w += $w1; + $h = max($h,$txt->GetHeight($aImg)); + } + $this->iHeight = $h+$this->iTopHeaderMargin; $txt=''; - return $w; + return $w; } - + function GetColStart($aImg,&$aStart,$aAddLeftMargin=false) { - $n = count($this->iTitles) ; - $adj = $aAddLeftMargin ? $this->iLeftColMargin : 0; - $aStart=array($aImg->left_margin+$adj); - for( $i=1; $i < $n; ++$i ) { - $aStart[$i] = $aStart[$i-1]+$this->iLeftColMargin+$this->iWidth[$i-1]; - } + $n = count($this->iTitles) ; + $adj = $aAddLeftMargin ? $this->iLeftColMargin : 0; + $aStart=array($aImg->left_margin+$adj); + for( $i=1; $i < $n; ++$i ) { + $aStart[$i] = $aStart[$i-1]+$this->iLeftColMargin+$this->iWidth[$i-1]; + } } - + // Adjust headers left, right or centered function SetHeaderAlign($aAlign) { - $this->iHeaderAlign=$aAlign; + $this->iHeaderAlign=$aAlign; } function Stroke($aImg,$aXLeft,$aYTop,$aXRight,$aYBottom,$aUseTextHeight=false) { - if( !$this->iShow ) return; + if( !$this->iShow ) return; - $txt = new TextProperty(); - $txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - $txt->SetColor($this->iFontColor); - $txt->SetAlign($this->iHeaderAlign,'top'); - $n=count($this->iTitles); + $txt = new TextProperty(); + $txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + $txt->SetColor($this->iFontColor); + $txt->SetAlign($this->iHeaderAlign,'top'); + $n=count($this->iTitles); - if( $n == 0 ) - return; - - $x = $aXLeft; - $h = $this->iHeight; - $yTop = $aUseTextHeight ? $aYBottom-$h-$this->iTopColMargin-$this->iBottomColMargin : $aYTop ; + if( $n == 0 ) + return; - if( $h < 0 ) { - JpGraphError::RaiseL(6001); -//('Internal error. Height for ActivityTitles is < 0'); - } + $x = $aXLeft; + $h = $this->iHeight; + $yTop = $aUseTextHeight ? $aYBottom-$h-$this->iTopColMargin-$this->iBottomColMargin : $aYTop ; - $aImg->SetLineWeight(1); - // Set background color - $aImg->SetColor($this->iBackgroundColor); - $aImg->FilledRectangle($aXLeft,$yTop,$aXRight,$aYBottom-1); + if( $h < 0 ) { + JpGraphError::RaiseL(6001); + //('Internal error. Height for ActivityTitles is < 0'); + } - if( $this->iStyle == 1 ) { - // Make a 3D effect - $aImg->SetColor('white'); - $aImg->Line($aXLeft,$yTop+1, - $aXRight,$yTop+1); - } - - for($i=0; $i < $n; ++$i ) { - if( $this->iStyle == 1 ) { - // Make a 3D effect - $aImg->SetColor('white'); - $aImg->Line($x+1,$yTop,$x+1,$aYBottom); - } - $x += $this->iLeftColMargin; - $txt->Set($this->iTitles[$i]); - - // Adjust the text anchor position according to the choosen alignment - $xp = $x; - if( $this->iHeaderAlign == 'center' ) { - $xp = (($x-$this->iLeftColMargin)+($x+$this->iWidth[$i]))/2; - } - elseif( $this->iHeaderAlign == 'right' ) { - $xp = $x +$this->iWidth[$i]-$this->iRightColMargin; - } - - $txt->Stroke($aImg,$xp,$yTop+$this->iTopHeaderMargin); - $x += $this->iWidth[$i]; - if( $i < $n-1 ) { - $aImg->SetColor($this->iColor); - $aImg->Line($x,$yTop,$x,$aYBottom); - } - } + $aImg->SetLineWeight(1); + // Set background color + $aImg->SetColor($this->iBackgroundColor); + $aImg->FilledRectangle($aXLeft,$yTop,$aXRight,$aYBottom-1); - $aImg->SetColor($this->iColor); - $aImg->Line($aXLeft,$yTop, $aXRight,$yTop); + if( $this->iStyle == 1 ) { + // Make a 3D effect + $aImg->SetColor('white'); + $aImg->Line($aXLeft,$yTop+1,$aXRight,$yTop+1); + } - // Stroke vertical column dividers - $cols=array(); - $this->GetColStart($aImg,$cols); - $n=count($cols); - for( $i=1; $i < $n; ++$i ) { - $this->vgrid->Stroke($aImg,$cols[$i],$aYBottom,$cols[$i], - $aImg->height - $aImg->bottom_margin); - } + for($i=0; $i < $n; ++$i ) { + if( $this->iStyle == 1 ) { + // Make a 3D effect + $aImg->SetColor('white'); + $aImg->Line($x+1,$yTop,$x+1,$aYBottom); + } + $x += $this->iLeftColMargin; + $txt->Set($this->iTitles[$i]); + + // Adjust the text anchor position according to the choosen alignment + $xp = $x; + if( $this->iHeaderAlign == 'center' ) { + $xp = (($x-$this->iLeftColMargin)+($x+$this->iWidth[$i]))/2; + } + elseif( $this->iHeaderAlign == 'right' ) { + $xp = $x +$this->iWidth[$i]-$this->iRightColMargin; + } + + $txt->Stroke($aImg,$xp,$yTop+$this->iTopHeaderMargin); + $x += $this->iWidth[$i]; + if( $i < $n-1 ) { + $aImg->SetColor($this->iColor); + $aImg->Line($x,$yTop,$x,$aYBottom); + } + } + + $aImg->SetColor($this->iColor); + $aImg->Line($aXLeft,$yTop, $aXRight,$yTop); + + // Stroke vertical column dividers + $cols=array(); + $this->GetColStart($aImg,$cols); + $n=count($cols); + for( $i=1; $i < $n; ++$i ) { + $this->vgrid->Stroke($aImg,$cols[$i],$aYBottom,$cols[$i], + $aImg->height - $aImg->bottom_margin); + } } } @@ -329,296 +328,328 @@ class GanttActivityInfo { // Description: Main class to handle gantt graphs //=================================================== class GanttGraph extends Graph { - public $scale; // Public accessible + public $scale; // Public accessible public $hgrid=null; - private $iObj=array(); // Gantt objects - private $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels - private $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label - private $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN + private $iObj=array(); // Gantt objects + private $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels + private $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label + private $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN private $iSimpleFont = FF_FONT1,$iSimpleFontSize=11; private $iSimpleStyle=GANTT_RDIAG,$iSimpleColor='yellow',$iSimpleBkgColor='red'; private $iSimpleProgressBkgColor='gray',$iSimpleProgressColor='darkgreen'; private $iSimpleProgressStyle=GANTT_SOLID; -//--------------- -// CONSTRUCTOR + private $iZoomFactor = 1.0; + //--------------- + // CONSTRUCTOR // Create a new gantt graph - function GanttGraph($aWidth=0,$aHeight=0,$aCachedName="",$aTimeOut=0,$aInline=true) { + function __construct($aWidth=0,$aHeight=0,$aCachedName="",$aTimeOut=0,$aInline=true) { - // Backward compatibility - if( $aWidth == -1 ) $aWidth=0; - if( $aHeight == -1 ) $aHeight=0; + // Backward compatibility + if( $aWidth == -1 ) $aWidth=0; + if( $aHeight == -1 ) $aHeight=0; - if( $aWidth< 0 || $aHeight < 0 ) { - JpgraphError::RaiseL(6002); -//("You can't specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension."); - } - Graph::Graph($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline); - $this->scale = new GanttScale($this->img); + if( $aWidth< 0 || $aHeight < 0 ) { + JpgraphError::RaiseL(6002); + //("You can't specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension."); + } + parent::__construct($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline); + $this->scale = new GanttScale($this->img); - // Default margins - $this->img->SetMargin(15,17,25,15); + // Default margins + $this->img->SetMargin(15,17,25,15); - $this->hgrid = new HorizontalGridLine(); - - $this->scale->ShowHeaders(GANTT_HWEEK|GANTT_HDAY); - $this->SetBox(); + $this->hgrid = new HorizontalGridLine(); + + $this->scale->ShowHeaders(GANTT_HWEEK|GANTT_HDAY); + $this->SetBox(); } - -//--------------- -// PUBLIC METHODS - // + //--------------- + // PUBLIC METHODS + + // function SetSimpleFont($aFont,$aSize) { - $this->iSimpleFont = $aFont; - $this->iSimpleFontSize = $aSize; + $this->iSimpleFont = $aFont; + $this->iSimpleFontSize = $aSize; } function SetSimpleStyle($aBand,$aColor,$aBkgColor) { - $this->iSimpleStyle = $aBand; - $this->iSimpleColor = $aColor; - $this->iSimpleBkgColor = $aBkgColor; + $this->iSimpleStyle = $aBand; + $this->iSimpleColor = $aColor; + $this->iSimpleBkgColor = $aBkgColor; } // A utility function to help create basic Gantt charts function CreateSimple($data,$constrains=array(),$progress=array()) { - $num = count($data); - for( $i=0; $i < $num; ++$i) { - switch( $data[$i][1] ) { - case ACTYPE_GROUP: - // Create a slightly smaller height bar since the - // "wings" at the end will make it look taller - $a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',8); - $a->title->SetFont($this->iSimpleFont,FS_BOLD,$this->iSimpleFontSize); - $a->rightMark->Show(); - $a->rightMark->SetType(MARK_RIGHTTRIANGLE); - $a->rightMark->SetWidth(8); - $a->rightMark->SetColor('black'); - $a->rightMark->SetFillColor('black'); - - $a->leftMark->Show(); - $a->leftMark->SetType(MARK_LEFTTRIANGLE); - $a->leftMark->SetWidth(8); - $a->leftMark->SetColor('black'); - $a->leftMark->SetFillColor('black'); - - $a->SetPattern(BAND_SOLID,'black'); - $csimpos = 6; - break; - - case ACTYPE_NORMAL: - $a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',10); - $a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize); - $a->SetPattern($this->iSimpleStyle,$this->iSimpleColor); - $a->SetFillColor($this->iSimpleBkgColor); - // Check if this activity should have a constrain line - $n = count($constrains); - for( $j=0; $j < $n; ++$j ) { - if( empty($constrains[$j]) || (count($constrains[$j]) != 3) ) { - JpGraphError::RaiseL(6003,$j); -//("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)"); - } - if( $constrains[$j][0]==$data[$i][0] ) { - $a->SetConstrain($constrains[$j][1],$constrains[$j][2],'black',ARROW_S2,ARROWT_SOLID); - } - } + $num = count($data); + for( $i=0; $i < $num; ++$i) { + switch( $data[$i][1] ) { + case ACTYPE_GROUP: + // Create a slightly smaller height bar since the + // "wings" at the end will make it look taller + $a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',8); + $a->title->SetFont($this->iSimpleFont,FS_BOLD,$this->iSimpleFontSize); + $a->rightMark->Show(); + $a->rightMark->SetType(MARK_RIGHTTRIANGLE); + $a->rightMark->SetWidth(8); + $a->rightMark->SetColor('black'); + $a->rightMark->SetFillColor('black'); - // Check if this activity have a progress bar - $n = count($progress); - for( $j=0; $j < $n; ++$j ) { - - if( empty($progress[$j]) || (count($progress[$j]) != 2) ) { - JpGraphError::RaiseL(6004,$j); -//("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)"); - } - if( $progress[$j][0]==$data[$i][0] ) { - $a->progress->Set($progress[$j][1]); - $a->progress->SetPattern($this->iSimpleProgressStyle, - $this->iSimpleProgressColor); - $a->progress->SetFillColor($this->iSimpleProgressBkgColor); - //$a->progress->SetPattern($progress[$j][2],$progress[$j][3]); - break; - } - } - $csimpos = 6; - break; + $a->leftMark->Show(); + $a->leftMark->SetType(MARK_LEFTTRIANGLE); + $a->leftMark->SetWidth(8); + $a->leftMark->SetColor('black'); + $a->leftMark->SetFillColor('black'); - case ACTYPE_MILESTONE: - $a = new MileStone($data[$i][0],$data[$i][2],$data[$i][3]); - $a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize); - $a->caption->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize); - $csimpos = 5; - break; - default: - die('Unknown activity type'); - break; - } + $a->SetPattern(BAND_SOLID,'black'); + $csimpos = 6; + break; - // Setup caption - $a->caption->Set($data[$i][$csimpos-1]); + case ACTYPE_NORMAL: + $a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',10); + $a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize); + $a->SetPattern($this->iSimpleStyle,$this->iSimpleColor); + $a->SetFillColor($this->iSimpleBkgColor); + // Check if this activity should have a constrain line + $n = count($constrains); + for( $j=0; $j < $n; ++$j ) { + if( empty($constrains[$j]) || (count($constrains[$j]) != 3) ) { + JpGraphError::RaiseL(6003,$j); + //("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)"); + } + if( $constrains[$j][0]==$data[$i][0] ) { + $a->SetConstrain($constrains[$j][1],$constrains[$j][2],'black',ARROW_S2,ARROWT_SOLID); + } + } - // Check if this activity should have a CSIM target ? - if( !empty($data[$i][$csimpos]) ) { - $a->SetCSIMTarget($data[$i][$csimpos]); - $a->SetCSIMAlt($data[$i][$csimpos+1]); - } - if( !empty($data[$i][$csimpos+2]) ) { - $a->title->SetCSIMTarget($data[$i][$csimpos+2]); - $a->title->SetCSIMAlt($data[$i][$csimpos+3]); - } + // Check if this activity have a progress bar + $n = count($progress); + for( $j=0; $j < $n; ++$j ) { - $this->Add($a); - } + if( empty($progress[$j]) || (count($progress[$j]) != 2) ) { + JpGraphError::RaiseL(6004,$j); + //("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)"); + } + if( $progress[$j][0]==$data[$i][0] ) { + $a->progress->Set($progress[$j][1]); + $a->progress->SetPattern($this->iSimpleProgressStyle, + $this->iSimpleProgressColor); + $a->progress->SetFillColor($this->iSimpleProgressBkgColor); + //$a->progress->SetPattern($progress[$j][2],$progress[$j][3]); + break; + } + } + $csimpos = 6; + break; + + case ACTYPE_MILESTONE: + $a = new MileStone($data[$i][0],$data[$i][2],$data[$i][3]); + $a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize); + $a->caption->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize); + $csimpos = 5; + break; + default: + die('Unknown activity type'); + break; + } + + // Setup caption + $a->caption->Set($data[$i][$csimpos-1]); + + // Check if this activity should have a CSIM target�? + if( !empty($data[$i][$csimpos]) ) { + $a->SetCSIMTarget($data[$i][$csimpos]); + $a->SetCSIMAlt($data[$i][$csimpos+1]); + } + if( !empty($data[$i][$csimpos+2]) ) { + $a->title->SetCSIMTarget($data[$i][$csimpos+2]); + $a->title->SetCSIMAlt($data[$i][$csimpos+3]); + } + + $this->Add($a); + } } - + // Set user specified scale zoom factor when auto sizing is used + function SetZoomFactor($aZoom) { + $this->iZoomFactor = $aZoom; + } + + // Set what headers should be shown function ShowHeaders($aFlg) { - $this->scale->ShowHeaders($aFlg); + $this->scale->ShowHeaders($aFlg); } - - // Specify the fraction of the font height that should be added + + // Specify the fraction of the font height that should be added // as vertical margin function SetLabelVMarginFactor($aVal) { - $this->iLabelVMarginFactor = $aVal; + $this->iLabelVMarginFactor = $aVal; } // Synonym to the method above function SetVMarginFactor($aVal) { - $this->iLabelVMarginFactor = $aVal; + $this->iLabelVMarginFactor = $aVal; } - - + + // Add a new Gantt object function Add($aObject) { - if( is_array($aObject) && count($aObject) > 0 ) { - $cl = $aObject[0]; - if( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) { - $this->AddIcon($aObject); - } - else { - $n = count($aObject); - for($i=0; $i < $n; ++$i) - $this->iObj[] = $aObject[$i]; - } - } - else { - if( class_exists('IconPlot',false) && ($aObject instanceof IconPlot) ) { - $this->AddIcon($aObject); - } - else { - $this->iObj[] = $aObject; - } - } + if( is_array($aObject) && count($aObject) > 0 ) { + $cl = $aObject[0]; + if( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) { + $this->AddIcon($aObject); + } + elseif( class_exists('Text',false) && ($cl instanceof Text) ) { + $this->AddText($aObject); + } + else { + $n = count($aObject); + for($i=0; $i < $n; ++$i) + $this->iObj[] = $aObject[$i]; + } + } + else { + if( class_exists('IconPlot',false) && ($aObject instanceof IconPlot) ) { + $this->AddIcon($aObject); + } + elseif( class_exists('Text',false) && ($aObject instanceof Text) ) { + $this->AddText($aObject); + } + else { + $this->iObj[] = $aObject; + } + } } + function StrokeTexts() { + // Stroke any user added text objects + if( $this->texts != null ) { + $n = count($this->texts); + for($i=0; $i < $n; ++$i) { + if( $this->texts[$i]->iScalePosX !== null && $this->texts[$i]->iScalePosY !== null ) { + $x = $this->scale->TranslateDate($this->texts[$i]->iScalePosX); + $y = $this->scale->TranslateVertPos($this->texts[$i]->iScalePosY); + $y -= $this->scale->GetVertSpacing()/2; + } + else { + $x = $y = null; + } + $this->texts[$i]->Stroke($this->img,$x,$y); + } + } + } + // Override inherit method from Graph and give a warning message function SetScale($aAxisType,$aYMin=1,$aYMax=1,$aXMin=1,$aXMax=1) { - JpGraphError::RaiseL(6005); -//("SetScale() is not meaningfull with Gantt charts."); + JpGraphError::RaiseL(6005); + //("SetScale() is not meaningfull with Gantt charts."); } // Specify the date range for Gantt graphs (if this is not set it will be // automtically determined from the input data) function SetDateRange($aStart,$aEnd) { - // Adjust the start and end so that the indicate the - // begining and end of respective start and end days - if( strpos($aStart,':') === false ) - $aStart = date('Y-m-d 00:00',strtotime($aStart)); - if( strpos($aEnd,':') === false ) - $aEnd = date('Y-m-d 23:59',strtotime($aEnd)); - $this->scale->SetRange($aStart,$aEnd); + // Adjust the start and end so that the indicate the + // begining and end of respective start and end days + if( strpos($aStart,':') === false ) + $aStart = date('Y-m-d 00:00',strtotime($aStart)); + if( strpos($aEnd,':') === false ) + $aEnd = date('Y-m-d 23:59',strtotime($aEnd)); + $this->scale->SetRange($aStart,$aEnd); } - + // Get the maximum width of the activity titles columns for the bars // The name is lightly misleading since we from now on can have // multiple columns in the label section. When this was first written // it only supported a single label, hence the name. function GetMaxLabelWidth() { - $m=10; - if( $this->iObj != null ) { - $marg = $this->scale->actinfo->iLeftColMargin+$this->scale->actinfo->iRightColMargin; - $n = count($this->iObj); - for($i=0; $i < $n; ++$i) { - if( !empty($this->iObj[$i]->title) ) { - if( $this->iObj[$i]->title->HasTabs() ) { - list($tot,$w) = $this->iObj[$i]->title->GetWidth($this->img,true); - $m=max($m,$tot); - } - else - $m=max($m,$this->iObj[$i]->title->GetWidth($this->img)); - } - } - } - return $m; + $m=10; + if( $this->iObj != null ) { + $marg = $this->scale->actinfo->iLeftColMargin+$this->scale->actinfo->iRightColMargin; + $n = count($this->iObj); + for($i=0; $i < $n; ++$i) { + if( !empty($this->iObj[$i]->title) ) { + if( $this->iObj[$i]->title->HasTabs() ) { + list($tot,$w) = $this->iObj[$i]->title->GetWidth($this->img,true); + $m=max($m,$tot); + } + else + $m=max($m,$this->iObj[$i]->title->GetWidth($this->img)); + } + } + } + return $m; } - + // Get the maximum height of the titles for the bars function GetMaxLabelHeight() { - $m=10; - if( $this->iObj != null ) { - $n = count($this->iObj); - for($i=0; $i < $n; ++$i) { - if( !empty($this->iObj[$i]->title) ) { - $m=max($m,$this->iObj[$i]->title->GetHeight($this->img)); - } - } - } - return $m; + $m=10; + if( $this->iObj != null ) { + $n = count($this->iObj); + // We can not include the title of GnttVLine since that title is stroked at the bottom + // of the Gantt bar and not in the activity title columns + for($i=0; $i < $n; ++$i) { + if( !empty($this->iObj[$i]->title) && !($this->iObj[$i] instanceof GanttVLine) ) { + $m=max($m,$this->iObj[$i]->title->GetHeight($this->img)); + } + } + } + return $m; } function GetMaxBarAbsHeight() { - $m=0; - if( $this->iObj != null ) { - $m = $this->iObj[0]->GetAbsHeight($this->img); - $n = count($this->iObj); - for($i=1; $i < $n; ++$i) { - $m=max($m,$this->iObj[$i]->GetAbsHeight($this->img)); - } - } - return $m; + $m=0; + if( $this->iObj != null ) { + $m = $this->iObj[0]->GetAbsHeight($this->img); + $n = count($this->iObj); + for($i=1; $i < $n; ++$i) { + $m=max($m,$this->iObj[$i]->GetAbsHeight($this->img)); + } + } + return $m; } - + // Get the maximum used line number (vertical position) for bars function GetBarMaxLineNumber() { - $m=1; - if( $this->iObj != null ) { - $m = $this->iObj[0]->GetLineNbr(); - $n = count($this->iObj); - for($i=1; $i < $n; ++$i) { - $m=max($m,$this->iObj[$i]->GetLineNbr()); - } - } - return $m; + $m=1; + if( $this->iObj != null ) { + $m = $this->iObj[0]->GetLineNbr(); + $n = count($this->iObj); + for($i=1; $i < $n; ++$i) { + $m=max($m,$this->iObj[$i]->GetLineNbr()); + } + } + return $m; } - + // Get the minumum and maximum used dates for all bars function GetBarMinMax() { - $start = 0 ; - $n = count($this->iObj); - while( $start < $n && $this->iObj[$start]->GetMaxDate() === false ) - ++$start; - if( $start >= $n ) { - JpgraphError::RaiseL(6006); -//('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]'); - } + $start = 0 ; + $n = count($this->iObj); + while( $start < $n && $this->iObj[$start]->GetMaxDate() === false ) + ++$start; + if( $start >= $n ) { + JpgraphError::RaiseL(6006); + //('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]'); + } - $max=$this->scale->NormalizeDate($this->iObj[$start]->GetMaxDate()); - $min=$this->scale->NormalizeDate($this->iObj[$start]->GetMinDate()); + $max=$this->scale->NormalizeDate($this->iObj[$start]->GetMaxDate()); + $min=$this->scale->NormalizeDate($this->iObj[$start]->GetMinDate()); - for($i=$start+1; $i < $n; ++$i) { - $rmax = $this->scale->NormalizeDate($this->iObj[$i]->GetMaxDate()); - if( $rmax != false ) - $max=Max($max,$rmax); - $rmin = $this->scale->NormalizeDate($this->iObj[$i]->GetMinDate()); - if( $rmin != false ) - $min=Min($min,$rmin); - } - $minDate = date("Y-m-d",$min); - $min = strtotime($minDate); - $maxDate = date("Y-m-d 23:59",$max); - $max = strtotime($maxDate); - return array($min,$max); + for($i=$start+1; $i < $n; ++$i) { + $rmax = $this->scale->NormalizeDate($this->iObj[$i]->GetMaxDate()); + if( $rmax != false ) + $max=Max($max,$rmax); + $rmin = $this->scale->NormalizeDate($this->iObj[$i]->GetMinDate()); + if( $rmin != false ) + $min=Min($min,$rmin); + } + $minDate = date("Y-m-d",$min); + $min = strtotime($minDate); + $maxDate = date("Y-m-d 23:59",$max); + $max = strtotime($maxDate); + return array($min,$max); } // Create a new auto sized canvas if the user hasn't specified a size @@ -627,255 +658,270 @@ class GanttGraph extends Graph { // also added to make it better looking. function AutoSize() { - if( $this->img->img == null ) { - // The predefined left, right, top, bottom margins. - // Note that the top margin might incease depending on - // the title. - $lm = $this->img->left_margin; - $rm = $this->img->right_margin; - $rm += 2 ; - $tm = $this->img->top_margin; - $bm = $this->img->bottom_margin; - $bm += 1; - if( BRAND_TIMING ) $bm += 10; - - // First find out the height - $n=$this->GetBarMaxLineNumber()+1; - $m=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight()); - $height=$n*((1+$this->iLabelVMarginFactor)*$m); - - // Add the height of the scale titles - $h=$this->scale->GetHeaderHeight(); - $height += $h; + if( $this->img->img == null ) { + // The predefined left, right, top, bottom margins. + // Note that the top margin might incease depending on + // the title. + $hadj = $vadj = 0; + if( $this->doshadow ) { + $hadj = $this->shadow_width; + $vadj = $this->shadow_width+5; + } - // Calculate the top margin needed for title and subtitle - if( $this->title->t != "" ) { - $tm += $this->title->GetFontHeight($this->img); - } - if( $this->subtitle->t != "" ) { - $tm += $this->subtitle->GetFontHeight($this->img); - } + $lm = $this->img->left_margin; + $rm = $this->img->right_margin +$hadj; + $rm += 2 ; + $tm = $this->img->top_margin; + $bm = $this->img->bottom_margin + $vadj; + $bm += 2; - // ...and then take the bottom and top plot margins into account - $height += $tm + $bm + $this->scale->iTopPlotMargin + $this->scale->iBottomPlotMargin; - // Now find the minimum width for the chart required + // If there are any added GanttVLine we must make sure that the + // bottom margin is wide enough to hold a title. + $n = count($this->iObj); + for($i=0; $i < $n; ++$i) { + if( $this->iObj[$i] instanceof GanttVLine ) { + $bm = max($bm,$this->iObj[$i]->title->GetHeight($this->img)+10); + } + } - // If day scale or smaller is shown then we use the day font width - // as the base size unit. - // If only weeks or above is displayed we use a modified unit to - // get a smaller image. - if( $this->scale->IsDisplayHour() || $this->scale->IsDisplayMinute() ) { - // Add 2 pixel margin on each side - $fw=$this->scale->day->GetFontWidth($this->img)+4; - } - elseif( $this->scale->IsDisplayWeek() ) { - $fw = 8; - } - elseif( $this->scale->IsDisplayMonth() ) { - $fw = 4; - } - else { - $fw = 2; - } + // First find out the height + $n=$this->GetBarMaxLineNumber()+1; + $m=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight()); + $height=$n*((1+$this->iLabelVMarginFactor)*$m); - $nd=$this->scale->GetNumberOfDays(); + // Add the height of the scale titles + $h=$this->scale->GetHeaderHeight(); + $height += $h; - if( $this->scale->IsDisplayDay() ) { - // If the days are displayed we also need to figure out - // how much space each day's title will require. - switch( $this->scale->day->iStyle ) { - case DAYSTYLE_LONG : - $txt = "Monday"; - break; - case DAYSTYLE_LONGDAYDATE1 : - $txt = "Monday 23 Jun"; - break; - case DAYSTYLE_LONGDAYDATE2 : - $txt = "Monday 23 Jun 2003"; - break; - case DAYSTYLE_SHORT : - $txt = "Mon"; - break; - case DAYSTYLE_SHORTDAYDATE1 : + // Calculate the top margin needed for title and subtitle + if( $this->title->t != "" ) { + $tm += $this->title->GetFontHeight($this->img); + } + if( $this->subtitle->t != "" ) { + $tm += $this->subtitle->GetFontHeight($this->img); + } + + // ...and then take the bottom and top plot margins into account + $height += $tm + $bm + $this->scale->iTopPlotMargin + $this->scale->iBottomPlotMargin; + // Now find the minimum width for the chart required + + // If day scale or smaller is shown then we use the day font width + // as the base size unit. + // If only weeks or above is displayed we use a modified unit to + // get a smaller image. + if( $this->scale->IsDisplayHour() || $this->scale->IsDisplayMinute() ) { + // Add 2 pixel margin on each side + $fw=$this->scale->day->GetFontWidth($this->img)+4; + } + elseif( $this->scale->IsDisplayWeek() ) { + $fw = 8; + } + elseif( $this->scale->IsDisplayMonth() ) { + $fw = 4; + } + else { + $fw = 2; + } + + $nd=$this->scale->GetNumberOfDays(); + + if( $this->scale->IsDisplayDay() ) { + // If the days are displayed we also need to figure out + // how much space each day's title will require. + switch( $this->scale->day->iStyle ) { + case DAYSTYLE_LONG : + $txt = "Monday"; + break; + case DAYSTYLE_LONGDAYDATE1 : + $txt = "Monday 23 Jun"; + break; + case DAYSTYLE_LONGDAYDATE2 : + $txt = "Monday 23 Jun 2003"; + break; + case DAYSTYLE_SHORT : + $txt = "Mon"; + break; + case DAYSTYLE_SHORTDAYDATE1 : $txt = "Mon 23/6"; - break; - case DAYSTYLE_SHORTDAYDATE2 : - $txt = "Mon 23 Jun"; - break; - case DAYSTYLE_SHORTDAYDATE3 : - $txt = "Mon 23"; - break; - case DAYSTYLE_SHORTDATE1 : + break; + case DAYSTYLE_SHORTDAYDATE2 : + $txt = "Mon 23 Jun"; + break; + case DAYSTYLE_SHORTDAYDATE3 : + $txt = "Mon 23"; + break; + case DAYSTYLE_SHORTDATE1 : $txt = "23/6"; - break; - case DAYSTYLE_SHORTDATE2 : - $txt = "23 Jun"; - break; - case DAYSTYLE_SHORTDATE3 : - $txt = "Mon 23"; - break; - case DAYSTYLE_SHORTDATE4 : - $txt = "88"; - break; - case DAYSTYLE_CUSTOM : - $txt = date($this->scale->day->iLabelFormStr, - strtotime('2003-12-20 18:00')); - break; - case DAYSTYLE_ONELETTER : - default: - $txt = "M"; - break; - } - $fw = $this->scale->day->GetStrWidth($this->img,$txt)+6; - } + break; + case DAYSTYLE_SHORTDATE2 : + $txt = "23 Jun"; + break; + case DAYSTYLE_SHORTDATE3 : + $txt = "Mon 23"; + break; + case DAYSTYLE_SHORTDATE4 : + $txt = "88"; + break; + case DAYSTYLE_CUSTOM : + $txt = date($this->scale->day->iLabelFormStr,strtotime('2003-12-20 18:00')); + break; + case DAYSTYLE_ONELETTER : + default: + $txt = "M"; + break; + } + $fw = $this->scale->day->GetStrWidth($this->img,$txt)+6; + } - // If we have hours enabled we must make sure that each day has enough - // space to fit the number of hours to be displayed. - if( $this->scale->IsDisplayHour() ) { - // Depending on what format the user has choose we need different amount - // of space. We therefore create a typical string for the choosen format - // and determine the length of that string. - switch( $this->scale->hour->iStyle ) { - case HOURSTYLE_HMAMPM: - $txt = '12:00pm'; - break; - case HOURSTYLE_H24: - // 13 - $txt = '24'; - break; - case HOURSTYLE_HAMPM: - $txt = '12pm'; - break; - case HOURSTYLE_CUSTOM: - $txt = date($this->scale->hour->iLabelFormStr,strtotime('2003-12-20 18:00')); - break; - case HOURSTYLE_HM24: - default: - $txt = '24:00'; - break; - } + // If we have hours enabled we must make sure that each day has enough + // space to fit the number of hours to be displayed. + if( $this->scale->IsDisplayHour() ) { + // Depending on what format the user has choose we need different amount + // of space. We therefore create a typical string for the choosen format + // and determine the length of that string. + switch( $this->scale->hour->iStyle ) { + case HOURSTYLE_HMAMPM: + $txt = '12:00pm'; + break; + case HOURSTYLE_H24: + // 13 + $txt = '24'; + break; + case HOURSTYLE_HAMPM: + $txt = '12pm'; + break; + case HOURSTYLE_CUSTOM: + $txt = date($this->scale->hour->iLabelFormStr,strtotime('2003-12-20 18:00')); + break; + case HOURSTYLE_HM24: + default: + $txt = '24:00'; + break; + } - $hfw = $this->scale->hour->GetStrWidth($this->img,$txt)+6; - $mw = $hfw; - if( $this->scale->IsDisplayMinute() ) { - // Depending on what format the user has choose we need different amount - // of space. We therefore create a typical string for the choosen format - // and determine the length of that string. - switch( $this->scale->minute->iStyle ) { - case HOURSTYLE_CUSTOM: - $txt2 = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55')); - break; - case MINUTESTYLE_MM: - default: - $txt2 = '15'; - break; - } - - $mfw = $this->scale->minute->GetStrWidth($this->img,$txt2)+6; - $n2 = ceil(60 / $this->scale->minute->GetIntervall() ); - $mw = $n2 * $mfw; - } - $hfw = $hfw < $mw ? $mw : $hfw ; - $n = ceil(24*60 / $this->scale->TimeToMinutes($this->scale->hour->GetIntervall()) ); - $hw = $n * $hfw; - $fw = $fw < $hw ? $hw : $fw ; - } + $hfw = $this->scale->hour->GetStrWidth($this->img,$txt)+6; + $mw = $hfw; + if( $this->scale->IsDisplayMinute() ) { + // Depending on what format the user has choose we need different amount + // of space. We therefore create a typical string for the choosen format + // and determine the length of that string. + switch( $this->scale->minute->iStyle ) { + case HOURSTYLE_CUSTOM: + $txt2 = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55')); + break; + case MINUTESTYLE_MM: + default: + $txt2 = '15'; + break; + } - // We need to repeat this code block here as well. - // THIS iS NOT A MISTAKE ! - // We really need it since we need to adjust for minutes both in the case - // where hour scale is shown and when it is not shown. + $mfw = $this->scale->minute->GetStrWidth($this->img,$txt2)+6; + $n2 = ceil(60 / $this->scale->minute->GetIntervall() ); + $mw = $n2 * $mfw; + } + $hfw = $hfw < $mw ? $mw : $hfw ; + $n = ceil(24*60 / $this->scale->TimeToMinutes($this->scale->hour->GetIntervall()) ); + $hw = $n * $hfw; + $fw = $fw < $hw ? $hw : $fw ; + } - if( $this->scale->IsDisplayMinute() ) { - // Depending on what format the user has choose we need different amount - // of space. We therefore create a typical string for the choosen format - // and determine the length of that string. - switch( $this->scale->minute->iStyle ) { - case HOURSTYLE_CUSTOM: - $txt = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55')); - break; - case MINUTESTYLE_MM: - default: - $txt = '15'; - break; - } - - $mfw = $this->scale->minute->GetStrWidth($this->img,$txt)+6; - $n = ceil(60 / $this->scale->TimeToMinutes($this->scale->minute->GetIntervall()) ); - $mw = $n * $mfw; - $fw = $fw < $mw ? $mw : $fw ; - } + // We need to repeat this code block here as well. + // THIS iS NOT A MISTAKE ! + // We really need it since we need to adjust for minutes both in the case + // where hour scale is shown and when it is not shown. - // If we display week we must make sure that 7*$fw is enough - // to fit up to 10 characters of the week font (if the week is enabled) - if( $this->scale->IsDisplayWeek() ) { - // Depending on what format the user has choose we need different amount - // of space - $fsw = strlen($this->scale->week->iLabelFormStr); - if( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) { - $fsw += 8; - } - elseif( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ) { - $fsw += 7; - } - else { - $fsw += 4; - } - - $ww = $fsw*$this->scale->week->GetFontWidth($this->img); - if( 7*$fw < $ww ) { - $fw = ceil($ww/7); - } - } + if( $this->scale->IsDisplayMinute() ) { + // Depending on what format the user has choose we need different amount + // of space. We therefore create a typical string for the choosen format + // and determine the length of that string. + switch( $this->scale->minute->iStyle ) { + case HOURSTYLE_CUSTOM: + $txt = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55')); + break; + case MINUTESTYLE_MM: + default: + $txt = '15'; + break; + } - if( !$this->scale->IsDisplayDay() && !$this->scale->IsDisplayHour() && - !( ($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || - $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek() ) ) { - // If we don't display the individual days we can shrink the - // scale a little bit. This is a little bit pragmatic at the - // moment and should be re-written to take into account - // a) What scales exactly are shown and - // b) what format do they use so we know how wide we need to - // make each scale text space at minimum. - $fw /= 2; - if( !$this->scale->IsDisplayWeek() ) { - $fw /= 1.8; - } - } + $mfw = $this->scale->minute->GetStrWidth($this->img,$txt)+6; + $n = ceil(60 / $this->scale->TimeToMinutes($this->scale->minute->GetIntervall()) ); + $mw = $n * $mfw; + $fw = $fw < $mw ? $mw : $fw ; + } - $cw = $this->GetMaxActInfoColWidth() ; - $this->scale->actinfo->SetMinColWidth($cw); - if( $this->img->width <= 0 ) { - // Now determine the width for the activity titles column + // If we display week we must make sure that 7*$fw is enough + // to fit up to 10 characters of the week font (if the week is enabled) + if( $this->scale->IsDisplayWeek() ) { + // Depending on what format the user has choose we need different amount + // of space + $fsw = strlen($this->scale->week->iLabelFormStr); + if( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) { + $fsw += 8; + } + elseif( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ) { + $fsw += 7; + } + else { + $fsw += 4; + } - // Firdst find out the maximum width of each object column - $titlewidth = max(max($this->GetMaxLabelWidth(), - $this->scale->tableTitle->GetWidth($this->img)), - $this->scale->actinfo->GetWidth($this->img)); + $ww = $fsw*$this->scale->week->GetFontWidth($this->img); + if( 7*$fw < $ww ) { + $fw = ceil($ww/7); + } + } - // Add the width of the vertivcal divider line - $titlewidth += $this->scale->divider->iWeight*2; + if( !$this->scale->IsDisplayDay() && !$this->scale->IsDisplayHour() && + !( ($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || + $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek() ) ) { + // If we don't display the individual days we can shrink the + // scale a little bit. This is a little bit pragmatic at the + // moment and should be re-written to take into account + // a) What scales exactly are shown and + // b) what format do they use so we know how wide we need to + // make each scale text space at minimum. + $fw /= 2; + if( !$this->scale->IsDisplayWeek() ) { + $fw /= 1.8; + } + } + $cw = $this->GetMaxActInfoColWidth() ; + $this->scale->actinfo->SetMinColWidth($cw); + if( $this->img->width <= 0 ) { + // Now determine the width for the activity titles column - // Now get the total width taking - // titlewidth, left and rigt margin, dayfont size - // into account - $width = $titlewidth + $nd*$fw + $lm+$rm; - } - else { - $width = $this->img->width; - } + // Firdst find out the maximum width of each object column + $titlewidth = max(max($this->GetMaxLabelWidth(), + $this->scale->tableTitle->GetWidth($this->img)), + $this->scale->actinfo->GetWidth($this->img)); - $width = round($width); - $height = round($height); - // Make a sanity check on image size - if( $width > MAX_GANTTIMG_SIZE_W || $height > MAX_GANTTIMG_SIZE_H ) { - JpgraphError::RaiseL(6007,$width,$height); -//("Sanity check for automatic Gantt chart size failed. Either the width (=$width) or height (=$height) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities."); - } - $this->img->CreateImgCanvas($width,$height); - $this->img->SetMargin($lm,$rm,$tm,$bm); - } + // Add the width of the vertivcal divider line + $titlewidth += $this->scale->divider->iWeight*2; + + // Adjust the width by the user specified zoom factor + $fw *= $this->iZoomFactor; + + // Now get the total width taking + // titlewidth, left and rigt margin, dayfont size + // into account + $width = $titlewidth + $nd*$fw + $lm+$rm; + } + else { + $width = $this->img->width; + } + + $width = round($width); + $height = round($height); + // Make a sanity check on image size + if( $width > MAX_GANTTIMG_SIZE_W || $height > MAX_GANTTIMG_SIZE_H ) { + JpgraphError::RaiseL(6007,$width,$height); + //("Sanity check for automatic Gantt chart size failed. Either the width (=$width) or height (=$height) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities."); + } + $this->img->CreateImgCanvas($width,$height); + $this->img->SetMargin($lm,$rm,$tm,$bm); + } } // Return an array width the maximum width for each activity @@ -883,225 +929,228 @@ class GanttGraph extends Graph { // to find out the maximum width of each column. In order to do that we // must walk through all the objects, sigh... function GetMaxActInfoColWidth() { - $n = count($this->iObj); - if( $n == 0 ) return; - $w = array(); - $m = $this->scale->actinfo->iLeftColMargin + $this->scale->actinfo->iRightColMargin; - - for( $i=0; $i < $n; ++$i ) { - $tmp = $this->iObj[$i]->title->GetColWidth($this->img,$m); - $nn = count($tmp); - for( $j=0; $j < $nn; ++$j ) { - if( empty($w[$j]) ) - $w[$j] = $tmp[$j]; - else - $w[$j] = max($w[$j],$tmp[$j]); - } - } - return $w; + $n = count($this->iObj); + if( $n == 0 ) return; + $w = array(); + $m = $this->scale->actinfo->iLeftColMargin + $this->scale->actinfo->iRightColMargin; + + for( $i=0; $i < $n; ++$i ) { + $tmp = $this->iObj[$i]->title->GetColWidth($this->img,$m); + $nn = count($tmp); + for( $j=0; $j < $nn; ++$j ) { + if( empty($w[$j]) ) + $w[$j] = $tmp[$j]; + else + $w[$j] = max($w[$j],$tmp[$j]); + } + } + return $w; } // Stroke the gantt chart - function Stroke($aStrokeFileName="") { + function Stroke($aStrokeFileName="") { - // If the filename is the predefined value = '_csim_special_' - // we assume that the call to stroke only needs to do enough - // to correctly generate the CSIM maps. - // We use this variable to skip things we don't strictly need - // to do to generate the image map to improve performance - // a best we can. Therefor you will see a lot of tests !$_csim in the - // code below. - $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); + // If the filename is the predefined value = '_csim_special_' + // we assume that the call to stroke only needs to do enough + // to correctly generate the CSIM maps. + // We use this variable to skip things we don't strictly need + // to do to generate the image map to improve performance + // a best we can. Therefor you will see a lot of tests !$_csim in the + // code below. + $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); - // Should we autoscale dates? + // Should we autoscale dates? - if( !$this->scale->IsRangeSet() ) { - list($min,$max) = $this->GetBarMinMax(); - $this->scale->SetRange($min,$max); - } + if( !$this->scale->IsRangeSet() ) { + list($min,$max) = $this->GetBarMinMax(); + $this->scale->SetRange($min,$max); + } - $this->scale->AdjustStartEndDay(); + $this->scale->AdjustStartEndDay(); - // Check if we should autoscale the image - $this->AutoSize(); + // Check if we should autoscale the image + $this->AutoSize(); - // Should we start from the top or just spread the bars out even over the - // available height - $this->scale->SetVertLayout($this->iLayout); - if( $this->iLayout == GANTT_FROMTOP ) { - $maxheight=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight()); - $this->scale->SetVertSpacing($maxheight*(1+$this->iLabelVMarginFactor)); - } - // If it hasn't been set find out the maximum line number - if( $this->scale->iVertLines == -1 ) - $this->scale->iVertLines = $this->GetBarMaxLineNumber()+1; - - $maxwidth=max($this->scale->actinfo->GetWidth($this->img), - max($this->GetMaxLabelWidth(), - $this->scale->tableTitle->GetWidth($this->img))); + // Should we start from the top or just spread the bars out even over the + // available height + $this->scale->SetVertLayout($this->iLayout); + if( $this->iLayout == GANTT_FROMTOP ) { + $maxheight=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight()); + $this->scale->SetVertSpacing($maxheight*(1+$this->iLabelVMarginFactor)); + } + // If it hasn't been set find out the maximum line number + if( $this->scale->iVertLines == -1 ) + $this->scale->iVertLines = $this->GetBarMaxLineNumber()+1; - $this->scale->SetLabelWidth($maxwidth+$this->scale->divider->iWeight);//*(1+$this->iLabelHMarginFactor)); + $maxwidth=max($this->scale->actinfo->GetWidth($this->img), + max($this->GetMaxLabelWidth(), + $this->scale->tableTitle->GetWidth($this->img))); - if( !$_csim ) { - $this->StrokePlotArea(); - if( $this->iIconDepth == DEPTH_BACK ) { - $this->StrokeIcons(); - } - } + $this->scale->SetLabelWidth($maxwidth+$this->scale->divider->iWeight);//*(1+$this->iLabelHMarginFactor)); - $this->scale->Stroke(); + if( !$_csim ) { + $this->StrokePlotArea(); + if( $this->iIconDepth == DEPTH_BACK ) { + $this->StrokeIcons(); + } + } - if( !$_csim ) { - // Due to a minor off by 1 bug we need to temporarily adjust the margin - $this->img->right_margin--; - $this->StrokePlotBox(); - $this->img->right_margin++; - } + $this->scale->Stroke(); - // Stroke Grid line - $this->hgrid->Stroke($this->img,$this->scale); + if( !$_csim ) { + // Due to a minor off by 1 bug we need to temporarily adjust the margin + $this->img->right_margin--; + $this->StrokePlotBox(); + $this->img->right_margin++; + } - $n = count($this->iObj); - for($i=0; $i < $n; ++$i) { - //$this->iObj[$i]->SetLabelLeftMargin(round($maxwidth*$this->iLabelHMarginFactor/2)); - $this->iObj[$i]->Stroke($this->img,$this->scale); - } + // Stroke Grid line + $this->hgrid->Stroke($this->img,$this->scale); - $this->StrokeTitles(); + $n = count($this->iObj); + for($i=0; $i < $n; ++$i) { + //$this->iObj[$i]->SetLabelLeftMargin(round($maxwidth*$this->iLabelHMarginFactor/2)); + $this->iObj[$i]->Stroke($this->img,$this->scale); + } - if( !$_csim ) { - $this->StrokeConstrains(); - $this->footer->Stroke($this->img); + $this->StrokeTitles(); + + if( !$_csim ) { + $this->StrokeConstrains(); + $this->footer->Stroke($this->img); - if( $this->iIconDepth == DEPTH_FRONT) { - $this->StrokeIcons(); - } + if( $this->iIconDepth == DEPTH_FRONT) { + $this->StrokeIcons(); + } - // Should we do any final image transformation - if( $this->iImgTrans ) { - if( !class_exists('ImgTrans',false) ) { - require_once('jpgraph_imgtrans.php'); - } - - $tform = new ImgTrans($this->img->img); - $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, - $this->iImgTransDirection,$this->iImgTransHighQ, - $this->iImgTransMinSize,$this->iImgTransFillColor, - $this->iImgTransBorder); - } - - - // If the filename is given as the special "__handle" - // then the image handler is returned and the image is NOT - // streamed back - if( $aStrokeFileName == _IMG_HANDLER ) { - return $this->img->img; - } - else { - // Finally stream the generated picture - $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline, - $aStrokeFileName); - } - } + // Stroke all added user texts + $this->StrokeTexts(); + + // Should we do any final image transformation + if( $this->iImgTrans ) { + if( !class_exists('ImgTrans',false) ) { + require_once('jpgraph_imgtrans.php'); + } + + $tform = new ImgTrans($this->img->img); + $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, + $this->iImgTransDirection,$this->iImgTransHighQ, + $this->iImgTransMinSize,$this->iImgTransFillColor, + $this->iImgTransBorder); + } + + + // If the filename is given as the special "__handle" + // then the image handler is returned and the image is NOT + // streamed back + if( $aStrokeFileName == _IMG_HANDLER ) { + return $this->img->img; + } + else { + // Finally stream the generated picture + $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline, + $aStrokeFileName); + } + } } function StrokeConstrains() { - $n = count($this->iObj); + $n = count($this->iObj); - // Stroke all constrains - for($i=0; $i < $n; ++$i) { + // Stroke all constrains + for($i=0; $i < $n; ++$i) { - // Some gantt objects may not have constraints associated with them - // for example we can add IconPlots which doesn't have this property. - if( empty($this->iObj[$i]->constraints) ) continue; + // Some gantt objects may not have constraints associated with them + // for example we can add IconPlots which doesn't have this property. + if( empty($this->iObj[$i]->constraints) ) continue; - $numConstrains = count($this->iObj[$i]->constraints); + $numConstrains = count($this->iObj[$i]->constraints); - for( $k = 0; $k < $numConstrains; $k++ ) { - $vpos = $this->iObj[$i]->constraints[$k]->iConstrainRow; - if( $vpos >= 0 ) { - $c1 = $this->iObj[$i]->iConstrainPos; + for( $k = 0; $k < $numConstrains; $k++ ) { + $vpos = $this->iObj[$i]->constraints[$k]->iConstrainRow; + if( $vpos >= 0 ) { + $c1 = $this->iObj[$i]->iConstrainPos; - // Find out which object is on the target row - $targetobj = -1; - for( $j=0; $j < $n && $targetobj == -1; ++$j ) { - if( $this->iObj[$j]->iVPos == $vpos ) { - $targetobj = $j; - } - } - if( $targetobj == -1 ) { - JpGraphError::RaiseL(6008,$this->iObj[$i]->iVPos,$vpos); -//('You have specifed a constrain from row='.$this->iObj[$i]->iVPos.' to row='.$vpos.' which does not have any activity.'); - } - $c2 = $this->iObj[$targetobj]->iConstrainPos; - if( count($c1) == 4 && count($c2 ) == 4) { - switch( $this->iObj[$i]->constraints[$k]->iConstrainType ) { - case CONSTRAIN_ENDSTART: - if( $c1[1] < $c2[1] ) { - $link = new GanttLink($c1[2],$c1[3],$c2[0],$c2[1]); - } - else { - $link = new GanttLink($c1[2],$c1[1],$c2[0],$c2[3]); - } - $link->SetPath(3); - break; - case CONSTRAIN_STARTEND: - if( $c1[1] < $c2[1] ) { - $link = new GanttLink($c1[0],$c1[3],$c2[2],$c2[1]); - } - else { - $link = new GanttLink($c1[0],$c1[1],$c2[2],$c2[3]); - } - $link->SetPath(0); - break; - case CONSTRAIN_ENDEND: - if( $c1[1] < $c2[1] ) { - $link = new GanttLink($c1[2],$c1[3],$c2[2],$c2[1]); - } - else { - $link = new GanttLink($c1[2],$c1[1],$c2[2],$c2[3]); - } - $link->SetPath(1); - break; - case CONSTRAIN_STARTSTART: - if( $c1[1] < $c2[1] ) { - $link = new GanttLink($c1[0],$c1[3],$c2[0],$c2[1]); - } - else { - $link = new GanttLink($c1[0],$c1[1],$c2[0],$c2[3]); - } - $link->SetPath(3); - break; - default: - JpGraphError::RaiseL(6009,$this->iObj[$i]->iVPos,$vpos); -//('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos); - break; - } + // Find out which object is on the target row + $targetobj = -1; + for( $j=0; $j < $n && $targetobj == -1; ++$j ) { + if( $this->iObj[$j]->iVPos == $vpos ) { + $targetobj = $j; + } + } + if( $targetobj == -1 ) { + JpGraphError::RaiseL(6008,$this->iObj[$i]->iVPos,$vpos); + //('You have specifed a constrain from row='.$this->iObj[$i]->iVPos.' to row='.$vpos.' which does not have any activity.'); + } + $c2 = $this->iObj[$targetobj]->iConstrainPos; + if( count($c1) == 4 && count($c2 ) == 4) { + switch( $this->iObj[$i]->constraints[$k]->iConstrainType ) { + case CONSTRAIN_ENDSTART: + if( $c1[1] < $c2[1] ) { + $link = new GanttLink($c1[2],$c1[3],$c2[0],$c2[1]); + } + else { + $link = new GanttLink($c1[2],$c1[1],$c2[0],$c2[3]); + } + $link->SetPath(3); + break; + case CONSTRAIN_STARTEND: + if( $c1[1] < $c2[1] ) { + $link = new GanttLink($c1[0],$c1[3],$c2[2],$c2[1]); + } + else { + $link = new GanttLink($c1[0],$c1[1],$c2[2],$c2[3]); + } + $link->SetPath(0); + break; + case CONSTRAIN_ENDEND: + if( $c1[1] < $c2[1] ) { + $link = new GanttLink($c1[2],$c1[3],$c2[2],$c2[1]); + } + else { + $link = new GanttLink($c1[2],$c1[1],$c2[2],$c2[3]); + } + $link->SetPath(1); + break; + case CONSTRAIN_STARTSTART: + if( $c1[1] < $c2[1] ) { + $link = new GanttLink($c1[0],$c1[3],$c2[0],$c2[1]); + } + else { + $link = new GanttLink($c1[0],$c1[1],$c2[0],$c2[3]); + } + $link->SetPath(3); + break; + default: + JpGraphError::RaiseL(6009,$this->iObj[$i]->iVPos,$vpos); + //('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos); + break; + } - $link->SetColor($this->iObj[$i]->constraints[$k]->iConstrainColor); - $link->SetArrow($this->iObj[$i]->constraints[$k]->iConstrainArrowSize, - $this->iObj[$i]->constraints[$k]->iConstrainArrowType); - - $link->Stroke($this->img); - } - } - } - } + $link->SetColor($this->iObj[$i]->constraints[$k]->iConstrainColor); + $link->SetArrow($this->iObj[$i]->constraints[$k]->iConstrainArrowSize, + $this->iObj[$i]->constraints[$k]->iConstrainArrowType); + + $link->Stroke($this->img); + } + } + } + } } function GetCSIMAreas() { - if( !$this->iHasStroked ) - $this->Stroke(_CSIM_SPECIALFILE); - - $csim = $this->title->GetCSIMAreas(); - $csim .= $this->subtitle->GetCSIMAreas(); - $csim .= $this->subsubtitle->GetCSIMAreas(); + if( !$this->iHasStroked ) + $this->Stroke(_CSIM_SPECIALFILE); - $n = count($this->iObj); - for( $i=$n-1; $i >= 0; --$i ) - $csim .= $this->iObj[$i]->GetCSIMArea(); - return $csim; + $csim = $this->title->GetCSIMAreas(); + $csim .= $this->subtitle->GetCSIMAreas(); + $csim .= $this->subsubtitle->GetCSIMAreas(); + + $n = count($this->iObj); + for( $i=$n-1; $i >= 0; --$i ) + $csim .= $this->iObj[$i]->GetCSIMArea(); + return $csim; } } @@ -1109,313 +1158,313 @@ class GanttGraph extends Graph { // CLASS PredefIcons // Description: Predefined icons for use with Gantt charts //=================================================== -DEFINE('GICON_WARNINGRED',0); -DEFINE('GICON_TEXT',1); -DEFINE('GICON_ENDCONS',2); -DEFINE('GICON_MAIL',3); -DEFINE('GICON_STARTCONS',4); -DEFINE('GICON_CALC',5); -DEFINE('GICON_MAGNIFIER',6); -DEFINE('GICON_LOCK',7); -DEFINE('GICON_STOP',8); -DEFINE('GICON_WARNINGYELLOW',9); -DEFINE('GICON_FOLDEROPEN',10); -DEFINE('GICON_FOLDER',11); -DEFINE('GICON_TEXTIMPORTANT',12); +define('GICON_WARNINGRED',0); +define('GICON_TEXT',1); +define('GICON_ENDCONS',2); +define('GICON_MAIL',3); +define('GICON_STARTCONS',4); +define('GICON_CALC',5); +define('GICON_MAGNIFIER',6); +define('GICON_LOCK',7); +define('GICON_STOP',8); +define('GICON_WARNINGYELLOW',9); +define('GICON_FOLDEROPEN',10); +define('GICON_FOLDER',11); +define('GICON_TEXTIMPORTANT',12); class PredefIcons { private $iBuiltinIcon = null, $iLen = -1 ; function GetLen() { - return $this->iLen ; + return $this->iLen ; } function GetImg($aIdx) { - if( $aIdx < 0 || $aIdx >= $this->iLen ) { - JpGraphError::RaiseL(6010,$aIdx); -//('Illegal icon index for Gantt builtin icon ['.$aIdx.']'); - } - return Image::CreateFromString(base64_decode($this->iBuiltinIcon[$aIdx][1])); + if( $aIdx < 0 || $aIdx >= $this->iLen ) { + JpGraphError::RaiseL(6010,$aIdx); + //('Illegal icon index for Gantt builtin icon ['.$aIdx.']'); + } + return Image::CreateFromString(base64_decode($this->iBuiltinIcon[$aIdx][1])); } - function PredefIcons() { - //========================================================== - // warning.png - //========================================================== - $this->iBuiltinIcon[0][0]= 1043 ; - $this->iBuiltinIcon[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'. - '0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'. - '5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'. - 'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'. - 'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'. - '/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'. - 'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'. - 'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'. - 'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'. - 'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'. - 'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'. - 'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'. - 'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ; + function __construct() { + //========================================================== + // warning.png + //========================================================== + $this->iBuiltinIcon[0][0]= 1043 ; + $this->iBuiltinIcon[0][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'. + '0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'. + '5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'. + 'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'. + 'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'. + '/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'. + 'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'. + 'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'. + 'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'. + 'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'. + 'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'. + 'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'. + 'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ; - //========================================================== - // edit.png - //========================================================== - $this->iBuiltinIcon[1][0]= 959 ; - $this->iBuiltinIcon[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'. - 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'. - 'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'. - 'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'. - 'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'. - 'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'. - 'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'. - 'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'. - 'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'. - 'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'. - 'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'. - 'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'. - 'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ; + //========================================================== + // edit.png + //========================================================== + $this->iBuiltinIcon[1][0]= 959 ; + $this->iBuiltinIcon[1][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'. + 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'. + 'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'. + 'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'. + 'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'. + 'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'. + 'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'. + 'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'. + 'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'. + 'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'. + 'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'. + 'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'. + 'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ; - //========================================================== - // endconstrain.png - //========================================================== - $this->iBuiltinIcon[2][0]= 666 ; - $this->iBuiltinIcon[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. - 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'. - 'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'. - 'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'. - 'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'. - '7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'. - '7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'. - 'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'. - 'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ; + //========================================================== + // endconstrain.png + //========================================================== + $this->iBuiltinIcon[2][0]= 666 ; + $this->iBuiltinIcon[2][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. + 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'. + 'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'. + 'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'. + 'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'. + '7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'. + '7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'. + 'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'. + 'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ; - //========================================================== - // mail.png - //========================================================== - $this->iBuiltinIcon[3][0]= 1122 ; - $this->iBuiltinIcon[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. - 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'. - 'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'. - 'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'. - 'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'. - '3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'. - '7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'. - 'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'. - 'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'. - '6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'. - 'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'. - 'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'. - 'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'. - 'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'. - 'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ; + //========================================================== + // mail.png + //========================================================== + $this->iBuiltinIcon[3][0]= 1122 ; + $this->iBuiltinIcon[3][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. + 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'. + 'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'. + 'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'. + 'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'. + '3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'. + '7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'. + 'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'. + 'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'. + '6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'. + 'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'. + 'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'. + 'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'. + 'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'. + 'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ; - //========================================================== - // startconstrain.png - //========================================================== - $this->iBuiltinIcon[4][0]= 725 ; - $this->iBuiltinIcon[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. - 'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'. - 'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'. - 'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'. - 'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'. - '5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'. - 'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'. - 'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'. - '5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'. - 'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ; + //========================================================== + // startconstrain.png + //========================================================== + $this->iBuiltinIcon[4][0]= 725 ; + $this->iBuiltinIcon[4][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. + 'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'. + 'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'. + 'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'. + 'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'. + '5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'. + 'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'. + 'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'. + '5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'. + 'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ; - //========================================================== - // calc.png - //========================================================== - $this->iBuiltinIcon[5][0]= 589 ; - $this->iBuiltinIcon[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'. - 'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'. - 'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'. - '3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'. - 'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'. - 'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'. - 'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'. - 'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ; + //========================================================== + // calc.png + //========================================================== + $this->iBuiltinIcon[5][0]= 589 ; + $this->iBuiltinIcon[5][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'. + 'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'. + 'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'. + '3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'. + 'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'. + 'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'. + 'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'. + 'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ; - //========================================================== - // mag.png - //========================================================== - $this->iBuiltinIcon[6][0]= 1415 ; - $this->iBuiltinIcon[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. - 'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'. - '0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'. - 'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'. - 'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'. - 'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'. - '8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'. - 'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'. - '/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'. - 'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'. - 'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'. - 'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'. - 'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'. - 'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'. - 'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'. - 'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'. - 'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'. - 'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'. - 'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ; + //========================================================== + // mag.png + //========================================================== + $this->iBuiltinIcon[6][0]= 1415 ; + $this->iBuiltinIcon[6][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. + 'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'. + '0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'. + 'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'. + 'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'. + 'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'. + '8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'. + 'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'. + '/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'. + 'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'. + 'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'. + 'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'. + 'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'. + 'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'. + 'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'. + 'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'. + 'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'. + 'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'. + 'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ; - //========================================================== - // lock.png - //========================================================== - $this->iBuiltinIcon[7][0]= 963 ; - $this->iBuiltinIcon[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. - 'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'. - 'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'. - 'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'. - 'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'. - 'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'. - 'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'. - 'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'. - 'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'. - 'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'. - 'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'. - '2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'. - 'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ; + //========================================================== + // lock.png + //========================================================== + $this->iBuiltinIcon[7][0]= 963 ; + $this->iBuiltinIcon[7][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. + 'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'. + 'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'. + 'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'. + 'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'. + 'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'. + 'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'. + 'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'. + 'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'. + 'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'. + 'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'. + '2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'. + 'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ; - //========================================================== - // stop.png - //========================================================== - $this->iBuiltinIcon[8][0]= 889 ; - $this->iBuiltinIcon[8][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. - 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'. - 'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'. - 'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'. - 'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'. - 'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'. - 'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'. - 'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'. - 'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'. - 'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'. - 'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'. - 'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ; + //========================================================== + // stop.png + //========================================================== + $this->iBuiltinIcon[8][0]= 889 ; + $this->iBuiltinIcon[8][1]= + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. + 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'. + 'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'. + 'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'. + 'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'. + 'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'. + 'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'. + 'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'. + 'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'. + 'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'. + 'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'. + 'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ; - //========================================================== - // error.png - //========================================================== - $this->iBuiltinIcon[9][0]= 541 ; - $this->iBuiltinIcon[9][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'. - 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'. - 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'. - '2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'. - 'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'. - 'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'. - 'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'. - 'iOsCHgAAAABJRU5ErkJggg==' ; + //========================================================== + // error.png + //========================================================== + $this->iBuiltinIcon[9][0]= 541 ; + $this->iBuiltinIcon[9][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'. + 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'. + '2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'. + 'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'. + 'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'. + 'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'. + 'iOsCHgAAAABJRU5ErkJggg==' ; - //========================================================== - // openfolder.png - //========================================================== - $this->iBuiltinIcon[10][0]= 2040 ; - $this->iBuiltinIcon[10][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'. - 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'. - 'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'. - 'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'. - 'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'. - 'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'. - '9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'. - 'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'. - '4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'. - 'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'. - 'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'. - 'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'. - 'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'. - 'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'. - 'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'. - 'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'. - 'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'. - 'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'. - 'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'. - 'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'. - 'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'. - 'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'. - 'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'. - 'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'. - '+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'. - '4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'. - 'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'. - 'dBntAAAAAElFTkSuQmCC' ; + //========================================================== + // openfolder.png + //========================================================== + $this->iBuiltinIcon[10][0]= 2040 ; + $this->iBuiltinIcon[10][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'. + 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'. + 'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'. + 'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'. + 'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'. + 'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'. + '9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'. + 'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'. + '4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'. + 'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'. + 'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'. + 'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'. + 'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'. + 'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'. + 'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'. + 'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'. + 'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'. + 'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'. + 'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'. + 'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'. + 'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'. + 'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'. + 'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'. + 'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'. + '+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'. + '4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'. + 'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'. + 'dBntAAAAAElFTkSuQmCC' ; - //========================================================== - // folder.png - //========================================================== + //========================================================== + // folder.png + //========================================================== $this->iBuiltinIcon[11][0]= 1824 ; - $this->iBuiltinIcon[11][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. - 'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'. - '6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'. - 'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'. - '309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'. - 'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'. - 'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'. - '3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'. - 'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'. - 'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'. - '/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'. - '4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'. - 'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'. - 'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'. - 'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'. - 'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'. - 'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'. - 'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'. - 'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'. - 'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'. - 'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'. - 'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'. - 'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'. - 'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'. - 'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ; + $this->iBuiltinIcon[11][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. + 'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'. + '6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'. + 'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'. + '309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'. + 'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'. + 'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'. + '3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'. + 'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'. + 'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'. + '/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'. + '4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'. + 'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'. + 'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'. + 'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'. + 'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'. + 'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'. + 'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'. + 'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'. + 'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'. + 'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'. + 'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'. + 'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'. + 'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'. + 'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ; - //========================================================== - // file_important.png - //========================================================== - $this->iBuiltinIcon[12][0]= 1785 ; - $this->iBuiltinIcon[12][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. - 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'. - 'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'. - 'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'. - '1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'. - 's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'. - 'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'. - 'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'. - 'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'. - '73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'. - '4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'. - 'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'. - 'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'. - 'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'. - 'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'. - 't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'. - '9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'. - 'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'. - 'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'. - 'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'. - '8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'. - 'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'. - 'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'. - '7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ; + //========================================================== + // file_important.png + //========================================================== + $this->iBuiltinIcon[12][0]= 1785 ; + $this->iBuiltinIcon[12][1]= + 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. + 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'. + 'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'. + 'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'. + '1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'. + 's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'. + 'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'. + 'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'. + 'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'. + '73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'. + '4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'. + 'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'. + 'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'. + 'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'. + 'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'. + 't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'. + '9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'. + 'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'. + 'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'. + 'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'. + '8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'. + 'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'. + 'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'. + '7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ; - $this->iLen = count($this->iBuiltinIcon); + $this->iLen = count($this->iBuiltinIcon); } } @@ -1426,7 +1475,7 @@ $_gPredefIcons = new PredefIcons(); //=================================================== // CLASS IconImage -// Description: Holds properties for an icon image +// Description: Holds properties for an icon image //=================================================== class IconImage { private $iGDImage=null; @@ -1434,59 +1483,57 @@ class IconImage { private $ixalign='left',$iyalign='center'; private $iScale=1.0; - function IconImage($aIcon,$aScale=1) { - GLOBAL $_gPredefIcons ; - if( is_string($aIcon) ) { - $this->iGDImage = Graph::LoadBkgImage('',$aIcon); - } - elseif( is_integer($aIcon) ) { - // Builtin image - $this->iGDImage = $_gPredefIcons->GetImg($aIcon); - } - else { - JpGraphError::RaiseL(6011); -//('Argument to IconImage must be string or integer'); - } - $this->iScale = $aScale; - $this->iWidth = Image::GetWidth($this->iGDImage); - $this->iHeight = Image::GetHeight($this->iGDImage); + function __construct($aIcon,$aScale=1) { + GLOBAL $_gPredefIcons ; + if( is_string($aIcon) ) { + $this->iGDImage = Graph::LoadBkgImage('',$aIcon); + } + elseif( is_integer($aIcon) ) { + // Builtin image + $this->iGDImage = $_gPredefIcons->GetImg($aIcon); + } + else { + JpGraphError::RaiseL(6011); + //('Argument to IconImage must be string or integer'); + } + $this->iScale = $aScale; + $this->iWidth = Image::GetWidth($this->iGDImage); + $this->iHeight = Image::GetHeight($this->iGDImage); } function GetWidth() { - return round($this->iScale*$this->iWidth); + return round($this->iScale*$this->iWidth); } function GetHeight() { - return round($this->iScale*$this->iHeight); + return round($this->iScale*$this->iHeight); } function SetAlign($aX='left',$aY='center') { - - $this->ixalign = $aX; - $this->iyalign = $aY; - + $this->ixalign = $aX; + $this->iyalign = $aY; } function Stroke($aImg,$x,$y) { - if( $this->ixalign == 'right' ) { - $x -= $this->iWidth; - } - elseif( $this->ixalign == 'center' ) { - $x -= round($this->iWidth/2*$this->iScale); - } + if( $this->ixalign == 'right' ) { + $x -= $this->iWidth; + } + elseif( $this->ixalign == 'center' ) { + $x -= round($this->iWidth/2*$this->iScale); + } - if( $this->iyalign == 'bottom' ) { - $y -= $this->iHeight; - } - elseif( $this->iyalign == 'center' ) { - $y -= round($this->iHeight/2*$this->iScale); - } + if( $this->iyalign == 'bottom' ) { + $y -= $this->iHeight; + } + elseif( $this->iyalign == 'center' ) { + $y -= round($this->iHeight/2*$this->iScale); + } - $aImg->Copy($this->iGDImage, - $x,$y,0,0, - round($this->iWidth*$this->iScale),round($this->iHeight*$this->iScale), - $this->iWidth,$this->iHeight); + $aImg->Copy($this->iGDImage, + $x,$y,0,0, + round($this->iWidth*$this->iScale),round($this->iHeight*$this->iScale), + $this->iWidth,$this->iHeight); } } @@ -1499,234 +1546,287 @@ class TextProperty { public $iShow=true; public $csimtarget='',$csimwintarget='',$csimalt=''; private $iFFamily=FF_FONT1,$iFStyle=FS_NORMAL,$iFSize=10; + private $iFontArray=array(); private $iColor="black"; private $iText=""; private $iHAlign="left",$iVAlign="bottom"; - -//--------------- -// CONSTRUCTOR - function TextProperty($aTxt='') { - $this->iText = $aTxt; - } - -//--------------- -// PUBLIC METHODS + + //--------------- + // CONSTRUCTOR + function __construct($aTxt='') { + $this->iText = $aTxt; + } + + //--------------- + // PUBLIC METHODS function Set($aTxt) { - $this->iText = $aTxt; + $this->iText = $aTxt; } function SetCSIMTarget($aTarget,$aAltText='',$aWinTarget='') { - if( is_string($aTarget) ) - $aTarget = array($aTarget); - $this->csimtarget=$aTarget; + if( is_string($aTarget) ) + $aTarget = array($aTarget); + $this->csimtarget=$aTarget; - if( is_string($aWinTarget) ) - $aWinTarget = array($aWinTarget); - $this->csimwintarget=$aWinTarget; + if( is_string($aWinTarget) ) + $aWinTarget = array($aWinTarget); + $this->csimwintarget=$aWinTarget; - if( is_string($aAltText) ) - $aAltText = array($aAltText); + if( is_string($aAltText) ) + $aAltText = array($aAltText); $this->csimalt=$aAltText; - + } - + function SetCSIMAlt($aAltText) { - if( is_string($aAltText) ) - $aAltText = array($aAltText); + if( is_string($aAltText) ) + $aAltText = array($aAltText); $this->csimalt=$aAltText; } // Set text color function SetColor($aColor) { - $this->iColor = $aColor; - } - - function HasTabs() { - if( is_string($this->iText) ) { - return substr_count($this->iText,"\t") > 0; - } - elseif( is_array($this->iText) ) { - return false; - } - } - - // Get number of tabs in string - function GetNbrTabs() { - if( is_string($this->iText) ) { - return substr_count($this->iText,"\t") ; - } - else{ - return 0; - } - } - - // Set alignment - function Align($aHAlign,$aVAlign="bottom") { - $this->iHAlign=$aHAlign; - $this->iVAlign=$aVAlign; - } - - // Synonym - function SetAlign($aHAlign,$aVAlign="bottom") { - $this->iHAlign=$aHAlign; - $this->iVAlign=$aVAlign; - } - - // Specify font - function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) { - $this->iFFamily = $aFFamily; - $this->iFStyle = $aFStyle; - $this->iFSize = $aFSize; + $this->iColor = $aColor; } - function IsColumns() { - return is_array($this->iText) ; + function HasTabs() { + if( is_string($this->iText) ) { + return substr_count($this->iText,"\t") > 0; + } + elseif( is_array($this->iText) ) { + return false; + } } - + + // Get number of tabs in string + function GetNbrTabs() { + if( is_string($this->iText) ) { + return substr_count($this->iText,"\t") ; + } + else{ + return 0; + } + } + + // Set alignment + function Align($aHAlign,$aVAlign="bottom") { + $this->iHAlign=$aHAlign; + $this->iVAlign=$aVAlign; + } + + // Synonym + function SetAlign($aHAlign,$aVAlign="bottom") { + $this->iHAlign=$aHAlign; + $this->iVAlign=$aVAlign; + } + + // Specify font + function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) { + $this->iFFamily = $aFFamily; + $this->iFStyle = $aFStyle; + $this->iFSize = $aFSize; + } + + function SetColumnFonts($aFontArray) { + if( !is_array($aFontArray) || count($aFontArray[0]) != 3 ) { + JpGraphError::RaiseL(6033); + // 'Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)' + } + $this->iFontArray = $aFontArray; + } + + + function IsColumns() { + return is_array($this->iText) ; + } + // Get width of text. If text contains several columns separated by - // tabs then return both the total width as well as an array with a + // tabs then return both the total width as well as an array with a // width for each column. function GetWidth($aImg,$aUseTabs=false,$aTabExtraMargin=1.1) { - $extra_margin=4; - $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - if( is_string($this->iText) ) { - if( strlen($this->iText) == 0 ) return 0; - $tmp = split("\t",$this->iText); - if( count($tmp) <= 1 || !$aUseTabs ) { - $w = $aImg->GetTextWidth($this->iText); - return $w + 2*$extra_margin; - } - else { - $tot=0; - $n = count($tmp); - for($i=0; $i < $n; ++$i) { - $res[$i] = $aImg->GetTextWidth($tmp[$i]); - $tot += $res[$i]*$aTabExtraMargin; - } - return array(round($tot),$res); - } - } - elseif( is_object($this->iText) ) { - // A single icon - return $this->iText->GetWidth()+2*$extra_margin; - } - elseif( is_array($this->iText) ) { - // Must be an array of texts. In this case we return the sum of the - // length + a fixed margin of 4 pixels on each text string - $n = count($this->iText); - for( $i=0, $w=0; $i < $n; ++$i ) { - $tmp = $this->iText[$i]; - if( is_string($tmp) ) { - $w += $aImg->GetTextWidth($tmp)+$extra_margin; - } - else { - if( is_object($tmp) === false ) { - JpGraphError::RaiseL(6012); - } - $w += $tmp->GetWidth()+$extra_margin; - } - } - return $w; - } - else { - JpGraphError::RaiseL(6012); - } + $extra_margin=4; + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + if( is_string($this->iText) ) { + if( strlen($this->iText) == 0 ) return 0; + $tmp = preg_split('/\t/',$this->iText); + if( count($tmp) <= 1 || !$aUseTabs ) { + $w = $aImg->GetTextWidth($this->iText); + return $w + 2*$extra_margin; + } + else { + $tot=0; + $n = count($tmp); + for($i=0; $i < $n; ++$i) { + $res[$i] = $aImg->GetTextWidth($tmp[$i]); + $tot += $res[$i]*$aTabExtraMargin; + } + return array(round($tot),$res); + } + } + elseif( is_object($this->iText) ) { + // A single icon + return $this->iText->GetWidth()+2*$extra_margin; + } + elseif( is_array($this->iText) ) { + // Must be an array of texts. In this case we return the sum of the + // length + a fixed margin of 4 pixels on each text string + $n = count($this->iText); + $nf = count($this->iFontArray); + for( $i=0, $w=0; $i < $n; ++$i ) { + if( $i < $nf ) { + $aImg->SetFont($this->iFontArray[$i][0],$this->iFontArray[$i][1],$this->iFontArray[$i][2]); + } + else { + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + } + $tmp = $this->iText[$i]; + if( is_string($tmp) ) { + $w += $aImg->GetTextWidth($tmp)+$extra_margin; + } + else { + if( is_object($tmp) === false ) { + JpGraphError::RaiseL(6012); + } + $w += $tmp->GetWidth()+$extra_margin; + } + } + return $w; + } + else { + JpGraphError::RaiseL(6012); + } } // for the case where we have multiple columns this function returns the width of each // column individually. If there is no columns just return the width of the single // column as an array of one function GetColWidth($aImg,$aMargin=0) { - $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - if( is_array($this->iText) ) { - $n = count($this->iText); - for( $i=0, $w=array(); $i < $n; ++$i ) { - $tmp = $this->iText[$i]; - if( is_string($tmp) ) { - $w[$i] = $aImg->GetTextWidth($this->iText[$i])+$aMargin; - } - else { - if( is_object($tmp) === false ) { - JpGraphError::RaiseL(6012); - } - $w[$i] = $tmp->GetWidth()+$aMargin; - } - } - return $w; - } - else { - return array($this->GetWidth($aImg)); - } + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + if( is_array($this->iText) ) { + $n = count($this->iText); + $nf = count($this->iFontArray); + for( $i=0, $w=array(); $i < $n; ++$i ) { + $tmp = $this->iText[$i]; + if( is_string($tmp) ) { + if( $i < $nf ) { + $aImg->SetFont($this->iFontArray[$i][0],$this->iFontArray[$i][1],$this->iFontArray[$i][2]); + } + else { + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + } + $w[$i] = $aImg->GetTextWidth($tmp)+$aMargin; + } + else { + if( is_object($tmp) === false ) { + JpGraphError::RaiseL(6012); + } + $w[$i] = $tmp->GetWidth()+$aMargin; + } + } + return $w; + } + else { + return array($this->GetWidth($aImg)); + } } - + // Get total height of text function GetHeight($aImg) { - $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - return $aImg->GetFontHeight(); + $nf = count($this->iFontArray); + $maxheight = -1; + + if( $nf > 0 ) { + // We have to find out the largest font and take that one as the + // height of the row + for($i=0; $i < $nf; ++$i ) { + $aImg->SetFont($this->iFontArray[$i][0],$this->iFontArray[$i][1],$this->iFontArray[$i][2]); + $height = $aImg->GetFontHeight(); + $maxheight = max($height,$maxheight); + } + } + + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + $height = $aImg->GetFontHeight(); + $maxheight = max($height,$maxheight); + return $maxheight; } - - // Unhide/hide the text + + // Unhide/hide the text function Show($aShow=true) { - $this->iShow=$aShow; + $this->iShow=$aShow; } - + // Stroke text at (x,y) coordinates. If the text contains tabs then the // x parameter should be an array of positions to be used for each successive // tab mark. If no array is supplied then the tabs will be ignored. function Stroke($aImg,$aX,$aY) { - if( $this->iShow ) { - $aImg->SetColor($this->iColor); - $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - $aImg->SetTextAlign($this->iHAlign,$this->iVAlign); - if( $this->GetNbrTabs() <= 1 ) { - if( is_string($this->iText) ) { - // Get rid of any "\t" characters and stroke string - if( is_array($aX) ) $aX=$aX[0]; - if( is_array($aY) ) $aY=$aY[0]; - $aImg->StrokeText($aX,$aY,str_replace("\t"," ",$this->iText)); - } - elseif( is_array($this->iText) && ($n = count($this->iText)) > 0 ) { - $ax = is_array($aX) ; - $ay = is_array($aY) ; - if( $ax && $ay ) { - // Nothing; both are already arrays - } - elseif( $ax ) { - $aY = array_fill(0,$n,$aY); - } - elseif( $ay ) { - $aX = array_fill(0,$n,$aX); - } - else { - $aX = array_fill(0,$n,$aX); - $aY = array_fill(0,$n,$aY); - } - $n = min($n, count($aX) ) ; - $n = min($n, count($aY) ) ; - for($i=0; $i < $n; ++$i ) { - $tmp = $this->iText[$i]; - if( is_object($tmp) ) { - $tmp->Stroke($aImg,$aX[$i],$aY[$i]); - } - else - $aImg->StrokeText($aX[$i],$aY[$i],str_replace("\t"," ",$tmp)); - } - } - } - else { - $tmp = split("\t",$this->iText); - $n = min(count($tmp),count($aX)); - for($i=0; $i < $n; ++$i) { - $aImg->StrokeText($aX[$i],$aY,$tmp[$i]); - } - } - } + if( $this->iShow ) { + $aImg->SetColor($this->iColor); + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + $aImg->SetTextAlign($this->iHAlign,$this->iVAlign); + if( $this->GetNbrTabs() < 1 ) { + if( is_string($this->iText) ) { + if( is_array($aX) ) $aX=$aX[0]; + if( is_array($aY) ) $aY=$aY[0]; + $aImg->StrokeText($aX,$aY,$this->iText); + } + elseif( is_array($this->iText) && ($n = count($this->iText)) > 0 ) { + $ax = is_array($aX) ; + $ay = is_array($aY) ; + if( $ax && $ay ) { + // Nothing; both are already arrays + } + elseif( $ax ) { + $aY = array_fill(0,$n,$aY); + } + elseif( $ay ) { + $aX = array_fill(0,$n,$aX); + } + else { + $aX = array_fill(0,$n,$aX); + $aY = array_fill(0,$n,$aY); + } + $n = min($n, count($aX) ) ; + $n = min($n, count($aY) ) ; + for($i=0; $i < $n; ++$i ) { + $tmp = $this->iText[$i]; + if( is_object($tmp) ) { + $tmp->Stroke($aImg,$aX[$i],$aY[$i]); + } + else { + if( $i < count($this->iFontArray) ) { + $font = $this->iFontArray[$i]; + $aImg->SetFont($font[0],$font[1],$font[2]); + } + else { + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + } + $aImg->StrokeText($aX[$i],$aY[$i],str_replace("\t"," ",$tmp)); + } + } + } + } + else { + $tmp = preg_split('/\t/',$this->iText); + $n = min(count($tmp),count($aX)); + for($i=0; $i < $n; ++$i) { + if( $i < count($this->iFontArray) ) { + $font = $this->iFontArray[$i]; + $aImg->SetFont($font[0],$font[1],$font[2]); + } + else { + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + } + $aImg->StrokeText($aX[$i],$aY,$tmp[$i]); + } + } + } } } //=================================================== // CLASS HeaderProperty -// Description: Data encapsulating class to hold property +// Description: Data encapsulating class to hold property // for each type of the scale headers //=================================================== class HeaderProperty { @@ -1741,87 +1841,91 @@ class HeaderProperty { public $iLabelFormStr="%d"; public $iIntervall = 1; -//--------------- -// CONSTRUCTOR - function HeaderProperty() { - $this->grid = new LineProperty(); + //--------------- + // CONSTRUCTOR + function __construct() { + $this->grid = new LineProperty(); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function Show($aShow=true) { - $this->iShowLabels = $aShow; + $this->iShowLabels = $aShow; } function SetIntervall($aInt) { - $this->iIntervall = $aInt; + $this->iIntervall = $aInt; + } + + function SetInterval($aInt) { + $this->iIntervall = $aInt; } function GetIntervall() { - return $this->iIntervall ; + return $this->iIntervall ; } - + function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) { - $this->iFFamily = $aFFamily; - $this->iFStyle = $aFStyle; - $this->iFSize = $aFSize; + $this->iFFamily = $aFFamily; + $this->iFStyle = $aFStyle; + $this->iFSize = $aFSize; } function SetFontColor($aColor) { - $this->iTextColor = $aColor; + $this->iTextColor = $aColor; } - + function GetFontHeight($aImg) { - $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - return $aImg->GetFontHeight(); + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + return $aImg->GetFontHeight(); } function GetFontWidth($aImg) { - $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - return $aImg->GetFontWidth(); + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + return $aImg->GetFontWidth(); } function GetStrWidth($aImg,$aStr) { - $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); - return $aImg->GetTextWidth($aStr); + $aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize); + return $aImg->GetTextWidth($aStr); } - + function SetStyle($aStyle) { - $this->iStyle = $aStyle; + $this->iStyle = $aStyle; } - + function SetBackgroundColor($aColor) { - $this->iBackgroundColor=$aColor; + $this->iBackgroundColor=$aColor; } function SetFrameWeight($aWeight) { - $this->iFrameWeight=$aWeight; + $this->iFrameWeight=$aWeight; } function SetFrameColor($aColor) { - $this->iFrameColor=$aColor; + $this->iFrameColor=$aColor; } - + // Only used by day scale function SetWeekendColor($aColor) { - $this->iWeekendBackgroundColor=$aColor; + $this->iWeekendBackgroundColor=$aColor; } - + // Only used by day scale function SetSundayFontColor($aColor) { - $this->iSundayTextColor=$aColor; + $this->iSundayTextColor=$aColor; } - + function SetTitleVertMargin($aMargin) { - $this->iTitleVertMargin=$aMargin; + $this->iTitleVertMargin=$aMargin; } - + function SetLabelFormatString($aStr) { - $this->iLabelFormStr=$aStr; + $this->iLabelFormStr=$aStr; } function SetFormatString($aStr) { - $this->SetLabelFormatString($aStr); + $this->SetLabelFormatString($aStr); } @@ -1843,174 +1947,174 @@ class GanttScale { // bars but the number of bar positions is 5 public $actinfo; public $iTopPlotMargin=10,$iBottomPlotMargin=15; - public $iVertLines=-1; + public $iVertLines=-1; public $iVertHeaderSize=-1; // The width of the labels (defaults to the widest of all labels) - private $iLabelWidth; + private $iLabelWidth; // Out image to stroke the scale to - private $iImg; + private $iImg; private $iTableHeaderBackgroundColor="white",$iTableHeaderFrameColor="black"; private $iTableHeaderFrameWeight=1; private $iAvailableHeight=-1,$iVertSpacing=-1; private $iDateLocale; private $iVertLayout=GANTT_EVEN; private $iUsePlotWeekendBackground=true; - private $iWeekStart = 1; // Default to have weekends start on Monday - -//--------------- -// CONSTRUCTOR - function GanttScale($aImg) { - $this->iImg = $aImg; - $this->iDateLocale = new DateLocale(); + private $iWeekStart = 1; // Default to have weekends start on Monday - $this->minute = new HeaderProperty(); - $this->minute->SetIntervall(15); - $this->minute->SetLabelFormatString('i'); - $this->minute->SetFont(FF_FONT0); - $this->minute->grid->SetColor("gray"); + //--------------- + // CONSTRUCTOR + function __construct($aImg) { + $this->iImg = $aImg; + $this->iDateLocale = new DateLocale(); - $this->hour = new HeaderProperty(); - $this->hour->SetFont(FF_FONT0); - $this->hour->SetIntervall(6); - $this->hour->SetStyle(HOURSTYLE_HM24); - $this->hour->SetLabelFormatString('H:i'); - $this->hour->grid->SetColor("gray"); + $this->minute = new HeaderProperty(); + $this->minute->SetIntervall(15); + $this->minute->SetLabelFormatString('i'); + $this->minute->SetFont(FF_FONT0); + $this->minute->grid->SetColor("gray"); - $this->day = new HeaderProperty(); - $this->day->grid->SetColor("gray"); - $this->day->SetLabelFormatString('l'); + $this->hour = new HeaderProperty(); + $this->hour->SetFont(FF_FONT0); + $this->hour->SetIntervall(6); + $this->hour->SetStyle(HOURSTYLE_HM24); + $this->hour->SetLabelFormatString('H:i'); + $this->hour->grid->SetColor("gray"); - $this->week = new HeaderProperty(); - $this->week->SetLabelFormatString("w%d"); - $this->week->SetFont(FF_FONT1); + $this->day = new HeaderProperty(); + $this->day->grid->SetColor("gray"); + $this->day->SetLabelFormatString('l'); - $this->month = new HeaderProperty(); - $this->month->SetFont(FF_FONT1,FS_BOLD); + $this->week = new HeaderProperty(); + $this->week->SetLabelFormatString("w%d"); + $this->week->SetFont(FF_FONT1); - $this->year = new HeaderProperty(); - $this->year->SetFont(FF_FONT1,FS_BOLD); - - $this->divider=new LineProperty(); - $this->dividerh=new LineProperty(); - $this->dividerh->SetWeight(2); - $this->divider->SetWeight(6); - $this->divider->SetColor('gray'); - $this->divider->SetStyle('fancy'); + $this->month = new HeaderProperty(); + $this->month->SetFont(FF_FONT1,FS_BOLD); - $this->tableTitle=new TextProperty(); - $this->tableTitle->Show(false); - $this->actinfo = new GanttActivityInfo(); + $this->year = new HeaderProperty(); + $this->year->SetFont(FF_FONT1,FS_BOLD); + + $this->divider=new LineProperty(); + $this->dividerh=new LineProperty(); + $this->dividerh->SetWeight(2); + $this->divider->SetWeight(6); + $this->divider->SetColor('gray'); + $this->divider->SetStyle('fancy'); + + $this->tableTitle=new TextProperty(); + $this->tableTitle->Show(false); + $this->actinfo = new GanttActivityInfo(); } - -//--------------- -// PUBLIC METHODS + + //--------------- + // PUBLIC METHODS // Specify what headers should be visible function ShowHeaders($aFlg) { - $this->day->Show($aFlg & GANTT_HDAY); - $this->week->Show($aFlg & GANTT_HWEEK); - $this->month->Show($aFlg & GANTT_HMONTH); - $this->year->Show($aFlg & GANTT_HYEAR); - $this->hour->Show($aFlg & GANTT_HHOUR); - $this->minute->Show($aFlg & GANTT_HMIN); + $this->day->Show($aFlg & GANTT_HDAY); + $this->week->Show($aFlg & GANTT_HWEEK); + $this->month->Show($aFlg & GANTT_HMONTH); + $this->year->Show($aFlg & GANTT_HYEAR); + $this->hour->Show($aFlg & GANTT_HHOUR); + $this->minute->Show($aFlg & GANTT_HMIN); - // Make some default settings of gridlines whihc makes sense - if( $aFlg & GANTT_HWEEK ) { - $this->month->grid->Show(false); - $this->year->grid->Show(false); - } - if( $aFlg & GANTT_HHOUR ) { - $this->day->grid->SetColor("black"); - } + // Make some default settings of gridlines whihc makes sense + if( $aFlg & GANTT_HWEEK ) { + $this->month->grid->Show(false); + $this->year->grid->Show(false); + } + if( $aFlg & GANTT_HHOUR ) { + $this->day->grid->SetColor("black"); + } } - + // Should the weekend background stretch all the way down in the plotarea function UseWeekendBackground($aShow) { - $this->iUsePlotWeekendBackground = $aShow; + $this->iUsePlotWeekendBackground = $aShow; } - + // Have a range been specified? function IsRangeSet() { - return $this->iStartDate!=-1 && $this->iEndDate!=-1; + return $this->iStartDate!=-1 && $this->iEndDate!=-1; } - + // Should the layout be from top or even? function SetVertLayout($aLayout) { - $this->iVertLayout = $aLayout; + $this->iVertLayout = $aLayout; } - + // Which locale should be used? function SetDateLocale($aLocale) { - $this->iDateLocale->Set($aLocale); + $this->iDateLocale->Set($aLocale); } - + // Number of days we are showing function GetNumberOfDays() { - return round(($this->iEndDate-$this->iStartDate)/SECPERDAY); + return round(($this->iEndDate-$this->iStartDate)/SECPERDAY); } - + // The width of the actual plot area function GetPlotWidth() { - $img=$this->iImg; - return $img->width - $img->left_margin - $img->right_margin; + $img=$this->iImg; + return $img->width - $img->left_margin - $img->right_margin; } // Specify the width of the titles(labels) for the activities // (This is by default set to the minimum width enought for the // widest title) function SetLabelWidth($aLabelWidth) { - $this->iLabelWidth=$aLabelWidth; + $this->iLabelWidth=$aLabelWidth; } - // Which day should the week start? - // 0==Sun, 1==Monday, 2==Tuesday etc + // Which day should the week start? + // 0==Sun, 1==Monday, 2==Tuesday etc function SetWeekStart($aStartDay) { - $this->iWeekStart = $aStartDay % 7; - - //Recalculate the startday since this will change the week start - $this->SetRange($this->iStartDate,$this->iEndDate); + $this->iWeekStart = $aStartDay % 7; + + //Recalculate the startday since this will change the week start + $this->SetRange($this->iStartDate,$this->iEndDate); } // Do we show min scale? function IsDisplayMinute() { - return $this->minute->iShowLabels; + return $this->minute->iShowLabels; } // Do we show day scale? function IsDisplayHour() { - return $this->hour->iShowLabels; + return $this->hour->iShowLabels; } - + // Do we show day scale? function IsDisplayDay() { - return $this->day->iShowLabels; + return $this->day->iShowLabels; } - + // Do we show week scale? function IsDisplayWeek() { - return $this->week->iShowLabels; + return $this->week->iShowLabels; } - + // Do we show month scale? function IsDisplayMonth() { - return $this->month->iShowLabels; + return $this->month->iShowLabels; } - + // Do we show year scale? function IsDisplayYear() { - return $this->year->iShowLabels; + return $this->year->iShowLabels; } // Specify spacing (in percent of bar height) between activity bars function SetVertSpacing($aSpacing) { - $this->iVertSpacing = $aSpacing; + $this->iVertSpacing = $aSpacing; } // Specify scale min and max date either as timestamp or as date strings // Always round to the nearest week boundary function SetRange($aMin,$aMax) { - $this->iStartDate = $this->NormalizeDate($aMin); - $this->iEndDate = $this->NormalizeDate($aMax); + $this->iStartDate = $this->NormalizeDate($aMin); + $this->iEndDate = $this->NormalizeDate($aMax); } @@ -2018,890 +2122,895 @@ class GanttScale { // of the week taking the specified week start day into account. function AdjustStartEndDay() { - if( !($this->IsDisplayYear() ||$this->IsDisplayMonth() || $this->IsDisplayWeek()) ) { - // Don't adjust - return; - } + if( !($this->IsDisplayYear() ||$this->IsDisplayMonth() || $this->IsDisplayWeek()) ) { + // Don't adjust + return; + } - // Get day in week for start and ending date (Sun==0) - $ds=strftime("%w",$this->iStartDate); - $de=strftime("%w",$this->iEndDate); - - // We want to start on iWeekStart day. But first we subtract a week - // if the startdate is "behind" the day the week start at. - // This way we ensure that the given start date is always included - // in the range. If we don't do this the nearest correct weekday in the week - // to start at might be later than the start date. - if( $ds < $this->iWeekStart ) - $d = strtotime('-7 day',$this->iStartDate); - else - $d = $this->iStartDate; - $adjdate = strtotime(($this->iWeekStart-$ds).' day',$d /*$this->iStartDate*/ ); - $this->iStartDate = $adjdate; - - // We want to end on the last day of the week - $preferredEndDay = ($this->iWeekStart+6)%7; - if( $preferredEndDay != $de ) { - // Solve equivalence eq: $de + x ~ $preferredDay (mod 7) - $adj = (7+($preferredEndDay - $de)) % 7; - $adjdate = strtotime("+$adj day",$this->iEndDate); - $this->iEndDate = $adjdate; - } + // Get day in week for start and ending date (Sun==0) + $ds=strftime("%w",$this->iStartDate); + $de=strftime("%w",$this->iEndDate); + + // We want to start on iWeekStart day. But first we subtract a week + // if the startdate is "behind" the day the week start at. + // This way we ensure that the given start date is always included + // in the range. If we don't do this the nearest correct weekday in the week + // to start at might be later than the start date. + if( $ds < $this->iWeekStart ) + $d = strtotime('-7 day',$this->iStartDate); + else + $d = $this->iStartDate; + $adjdate = strtotime(($this->iWeekStart-$ds).' day',$d /*$this->iStartDate*/ ); + $this->iStartDate = $adjdate; + + // We want to end on the last day of the week + $preferredEndDay = ($this->iWeekStart+6)%7; + if( $preferredEndDay != $de ) { + // Solve equivalence eq: $de + x ~ $preferredDay (mod 7) + $adj = (7+($preferredEndDay - $de)) % 7; + $adjdate = strtotime("+$adj day",$this->iEndDate); + $this->iEndDate = $adjdate; + } } - // Specify background for the table title area (upper left corner of the table) + // Specify background for the table title area (upper left corner of the table) function SetTableTitleBackground($aColor) { - $this->iTableHeaderBackgroundColor = $aColor; + $this->iTableHeaderBackgroundColor = $aColor; } -/////////////////////////////////////// -// PRIVATE Methods - + /////////////////////////////////////// + // PRIVATE Methods + // Determine the height of all the scale headers combined function GetHeaderHeight() { - $img=$this->iImg; - $height=1; - if( $this->minute->iShowLabels ) { - $height += $this->minute->GetFontHeight($img); - $height += $this->minute->iTitleVertMargin; - } - if( $this->hour->iShowLabels ) { - $height += $this->hour->GetFontHeight($img); - $height += $this->hour->iTitleVertMargin; - } - if( $this->day->iShowLabels ) { - $height += $this->day->GetFontHeight($img); - $height += $this->day->iTitleVertMargin; - } - if( $this->week->iShowLabels ) { - $height += $this->week->GetFontHeight($img); - $height += $this->week->iTitleVertMargin; - } - if( $this->month->iShowLabels ) { - $height += $this->month->GetFontHeight($img); - $height += $this->month->iTitleVertMargin; - } - if( $this->year->iShowLabels ) { - $height += $this->year->GetFontHeight($img); - $height += $this->year->iTitleVertMargin; - } - return $height; + $img=$this->iImg; + $height=1; + if( $this->minute->iShowLabels ) { + $height += $this->minute->GetFontHeight($img); + $height += $this->minute->iTitleVertMargin; + } + if( $this->hour->iShowLabels ) { + $height += $this->hour->GetFontHeight($img); + $height += $this->hour->iTitleVertMargin; + } + if( $this->day->iShowLabels ) { + $height += $this->day->GetFontHeight($img); + $height += $this->day->iTitleVertMargin; + } + if( $this->week->iShowLabels ) { + $height += $this->week->GetFontHeight($img); + $height += $this->week->iTitleVertMargin; + } + if( $this->month->iShowLabels ) { + $height += $this->month->GetFontHeight($img); + $height += $this->month->iTitleVertMargin; + } + if( $this->year->iShowLabels ) { + $height += $this->year->GetFontHeight($img); + $height += $this->year->iTitleVertMargin; + } + return $height; } - + // Get width (in pixels) for a single day function GetDayWidth() { - return ($this->GetPlotWidth()-$this->iLabelWidth+1)/$this->GetNumberOfDays(); + return ($this->GetPlotWidth()-$this->iLabelWidth+1)/$this->GetNumberOfDays(); } // Get width (in pixels) for a single hour function GetHourWidth() { - return $this->GetDayWidth() / 24 ; + return $this->GetDayWidth() / 24 ; } function GetMinuteWidth() { - return $this->GetHourWidth() / 60 ; + return $this->GetHourWidth() / 60 ; } // Nuber of days in a year function GetNumDaysInYear($aYear) { - if( $this->IsLeap($aYear) ) - return 366; - else - return 365; + if( $this->IsLeap($aYear) ) + return 366; + else + return 365; } - - // Get week number - function GetWeekNbr($aDate,$aSunStart=true) { - // We can't use the internal strftime() since it gets the weeknumber - // wrong since it doesn't follow ISO on all systems since this is - // system linrary dependent. - // Even worse is that this works differently if we are on a Windows - // or UNIX box (it even differs between UNIX boxes how strftime() - // is natively implemented) - // - // Credit to Nicolas Hoizey for this elegant - // version of Week Nbr calculation. - $day = $this->NormalizeDate($aDate); - if( $aSunStart ) - $day += 60*60*24; - - /*------------------------------------------------------------------------- - According to ISO-8601 : - "Week 01 of a year is per definition the first week that has the Thursday in this year, - which is equivalent to the week that contains the fourth day of January. - In other words, the first week of a new year is the week that has the majority of its - days in the new year." - - Be carefull, with PHP, -3 % 7 = -3, instead of 4 !!! - - day of year = date("z", $day) + 1 - offset to thursday = 3 - (date("w", $day) + 6) % 7 - first thursday of year = 1 + (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $day)))) % 7 - week number = (thursday's day of year - first thursday's day of year) / 7 + 1 - ---------------------------------------------------------------------------*/ - - $thursday = $day + 60 * 60 * 24 * (3 - (date("w", $day) + 6) % 7); // take week's thursday - $week = 1 + (date("z", $thursday) - (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $thursday)))) % 7) / 7; - - return $week; + // Get week number + function GetWeekNbr($aDate,$aSunStart=true) { + // We can't use the internal strftime() since it gets the weeknumber + // wrong since it doesn't follow ISO on all systems since this is + // system linrary dependent. + // Even worse is that this works differently if we are on a Windows + // or UNIX box (it even differs between UNIX boxes how strftime() + // is natively implemented) + // + // Credit to Nicolas Hoizey for this elegant + // version of Week Nbr calculation. + + $day = $this->NormalizeDate($aDate); + if( $aSunStart ) + $day += 60*60*24; + + /*------------------------------------------------------------------------- + According to ISO-8601 : + "Week 01 of a year is per definition the first week that has the Thursday in this year, + which is equivalent to the week that contains the fourth day of January. + In other words, the first week of a new year is the week that has the majority of its + days in the new year." + + Be carefull, with PHP, -3 % 7 = -3, instead of 4 !!! + + day of year = date("z", $day) + 1 + offset to thursday = 3 - (date("w", $day) + 6) % 7 + first thursday of year = 1 + (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $day)))) % 7 + week number = (thursday's day of year - first thursday's day of year) / 7 + 1 + ---------------------------------------------------------------------------*/ + + $thursday = $day + 60 * 60 * 24 * (3 - (date("w", $day) + 6) % 7); // take week's thursday + $week = 1 + (date("z", $thursday) - (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $thursday)))) % 7) / 7; + + return $week; } - + // Is year a leap year? function IsLeap($aYear) { - // Is the year a leap year? - //$year = 0+date("Y",$aDate); - if( $aYear % 4 == 0) - if( !($aYear % 100 == 0) || ($aYear % 400 == 0) ) - return true; - return false; + // Is the year a leap year? + //$year = 0+date("Y",$aDate); + if( $aYear % 4 == 0) + if( !($aYear % 100 == 0) || ($aYear % 400 == 0) ) + return true; + return false; } // Get current year function GetYear($aDate) { - return 0+Date("Y",$aDate); + return 0+Date("Y",$aDate); } - + // Return number of days in a year function GetNumDaysInMonth($aMonth,$aYear) { - $days=array(31,28,31,30,31,30,31,31,30,31,30,31); - $daysl=array(31,29,31,30,31,30,31,31,30,31,30,31); - if( $this->IsLeap($aYear)) - return $daysl[$aMonth]; - else - return $days[$aMonth]; + $days=array(31,28,31,30,31,30,31,31,30,31,30,31); + $daysl=array(31,29,31,30,31,30,31,31,30,31,30,31); + if( $this->IsLeap($aYear)) + return $daysl[$aMonth]; + else + return $days[$aMonth]; } - + // Get day in month function GetMonthDayNbr($aDate) { - return 0+strftime("%d",$aDate); + return 0+strftime("%d",$aDate); } // Get day in year function GetYearDayNbr($aDate) { - return 0+strftime("%j",$aDate); + return 0+strftime("%j",$aDate); } - + // Get month number function GetMonthNbr($aDate) { - return 0+strftime("%m",$aDate); - } - - // Translate a date to screen coordinates (horizontal scale) - function TranslateDate($aDate) { - // - // In order to handle the problem with Daylight savings time - // the scale written with equal number of seconds per day beginning - // with the start date. This means that we "cement" the state of - // DST as it is in the start date. If later the scale includes the - // switchover date (depends on the locale) we need to adjust back - // if the date we try to translate has a different DST status since - // we would otherwise be off by one hour. - $aDate = $this->NormalizeDate($aDate); - $tmp = localtime($aDate); - $cloc = $tmp[8]; - $tmp = localtime($this->iStartDate); - $sloc = $tmp[8]; - $offset = 0; - if( $sloc != $cloc) { - if( $sloc ) - $offset = 3600; - else - $offset = -3600; - } - $img=$this->iImg; - return ($aDate-$this->iStartDate-$offset)/SECPERDAY*$this->GetDayWidth()+$img->left_margin+$this->iLabelWidth;; + return 0+strftime("%m",$aDate); } - // Get screen coordinatesz for the vertical position for a bar - function TranslateVertPos($aPos) { - $img=$this->iImg; - $ph=$this->iAvailableHeight; - if( $aPos > $this->iVertLines ) - JpGraphError::RaiseL(6015,$aPos); -// 'Illegal vertical position %d' - if( $this->iVertLayout == GANTT_EVEN ) { - // Position the top bar at 1 vert spacing from the scale - return round($img->top_margin + $this->iVertHeaderSize + ($aPos+1)*$this->iVertSpacing); - } - else { - // position the top bar at 1/2 a vert spacing from the scale - return round($img->top_margin + $this->iVertHeaderSize + $this->iTopPlotMargin + ($aPos+1)*$this->iVertSpacing); - } + // Translate a date to screen coordinates (horizontal scale) + function TranslateDate($aDate) { + // + // In order to handle the problem with Daylight savings time + // the scale written with equal number of seconds per day beginning + // with the start date. This means that we "cement" the state of + // DST as it is in the start date. If later the scale includes the + // switchover date (depends on the locale) we need to adjust back + // if the date we try to translate has a different DST status since + // we would otherwise be off by one hour. + $aDate = $this->NormalizeDate($aDate); + $tmp = localtime($aDate); + $cloc = $tmp[8]; + $tmp = localtime($this->iStartDate); + $sloc = $tmp[8]; + $offset = 0; + if( $sloc != $cloc) { + if( $sloc ) + $offset = 3600; + else + $offset = -3600; + } + $img=$this->iImg; + return ($aDate-$this->iStartDate-$offset)/SECPERDAY*$this->GetDayWidth()+$img->left_margin+$this->iLabelWidth;; } - + + // Get screen coordinatesz for the vertical position for a bar + function TranslateVertPos($aPos,$atTop=false) { + $img=$this->iImg; + if( $aPos > $this->iVertLines ) + JpGraphError::RaiseL(6015,$aPos); + // 'Illegal vertical position %d' + if( $this->iVertLayout == GANTT_EVEN ) { + // Position the top bar at 1 vert spacing from the scale + $pos = round($img->top_margin + $this->iVertHeaderSize + ($aPos+1)*$this->iVertSpacing); + } + else { + // position the top bar at 1/2 a vert spacing from the scale + $pos = round($img->top_margin + $this->iVertHeaderSize + $this->iTopPlotMargin + ($aPos+1)*$this->iVertSpacing); + } + + if( $atTop ) + $pos -= $this->iVertSpacing; + + return $pos; + } + // What is the vertical spacing? function GetVertSpacing() { - return $this->iVertSpacing; - } - - // Convert a date to timestamp - function NormalizeDate($aDate) { - if( $aDate === false ) return false; - if( is_string($aDate) ) { - $t = strtotime($aDate); - if( $t === FALSE || $t === -1 ) { - JpGraphError::RaiseL(6016,$aDate); -//("Date string ($aDate) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30"); - } - return $t; - } - elseif( is_int($aDate) || is_float($aDate) ) - return $aDate; - else - JpGraphError::RaiseL(6017,$aDate); -//Unknown date format in GanttScale ($aDate)."); + return $this->iVertSpacing; } - + // Convert a date to timestamp + function NormalizeDate($aDate) { + if( $aDate === false ) return false; + if( is_string($aDate) ) { + $t = strtotime($aDate); + if( $t === FALSE || $t === -1 ) { + JpGraphError::RaiseL(6016,$aDate); + //("Date string ($aDate) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30"); + } + return $t; + } + elseif( is_int($aDate) || is_float($aDate) ) + return $aDate; + else + JpGraphError::RaiseL(6017,$aDate); + //Unknown date format in GanttScale ($aDate)."); + } + + // Convert a time string to minutes function TimeToMinutes($aTimeString) { - // Split in hours and minutes - $pos=strpos($aTimeString,':'); - $minint=60; - if( $pos === false ) { - $hourint = $aTimeString; - $minint = 0; - } - else { - $hourint = floor(substr($aTimeString,0,$pos)); - $minint = floor(substr($aTimeString,$pos+1)); - } - $minint += 60 * $hourint; - return $minint; + // Split in hours and minutes + $pos=strpos($aTimeString,':'); + $minint=60; + if( $pos === false ) { + $hourint = $aTimeString; + $minint = 0; + } + else { + $hourint = floor(substr($aTimeString,0,$pos)); + $minint = floor(substr($aTimeString,$pos+1)); + } + $minint += 60 * $hourint; + return $minint; } - // Stroke the day scale (including gridlines) + // Stroke the day scale (including gridlines) function StrokeMinutes($aYCoord,$getHeight=false) { - $img=$this->iImg; - $xt=$img->left_margin+$this->iLabelWidth; - $yt=$aYCoord+$img->top_margin; - if( $this->minute->iShowLabels ) { - $img->SetFont($this->minute->iFFamily,$this->minute->iFStyle,$this->minute->iFSize); - $yb = $yt + $img->GetFontHeight() + - $this->minute->iTitleVertMargin + $this->minute->iFrameWeight; - if( $getHeight ) { - return $yb - $img->top_margin; - } - $xb = $img->width-$img->right_margin+1; - $img->SetColor($this->minute->iBackgroundColor); - $img->FilledRectangle($xt,$yt,$xb,$yb); + $img=$this->iImg; + $xt=$img->left_margin+$this->iLabelWidth; + $yt=$aYCoord+$img->top_margin; + if( $this->minute->iShowLabels ) { + $img->SetFont($this->minute->iFFamily,$this->minute->iFStyle,$this->minute->iFSize); + $yb = $yt + $img->GetFontHeight() + + $this->minute->iTitleVertMargin + $this->minute->iFrameWeight; + if( $getHeight ) { + return $yb - $img->top_margin; + } + $xb = $img->width-$img->right_margin+1; + $img->SetColor($this->minute->iBackgroundColor); + $img->FilledRectangle($xt,$yt,$xb,$yb); - $x = $xt; - $img->SetTextAlign("center"); - $day = date('w',$this->iStartDate); - $minint = $this->minute->GetIntervall() ; - - if( 60 % $minint !== 0 ) { + $x = $xt; + $img->SetTextAlign("center"); + $day = date('w',$this->iStartDate); + $minint = $this->minute->GetIntervall() ; + + if( 60 % $minint !== 0 ) { JpGraphError::RaiseL(6018,$minint); -//'Intervall for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an intervall of '.$minint.' minutes.'); - } + //'Intervall for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an intervall of '.$minint.' minutes.'); + } - $n = 60 / $minint; - $datestamp = $this->iStartDate; - $width = $this->GetHourWidth() / $n ; - if( $width < 8 ) { - // TO small width to draw minute scale - JpGraphError::RaiseL(6019,$width); -//('The available width ('.$width.') for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.'); - } + $n = 60 / $minint; + $datestamp = $this->iStartDate; + $width = $this->GetHourWidth() / $n ; + if( $width < 8 ) { + // TO small width to draw minute scale + JpGraphError::RaiseL(6019,$width); + //('The available width ('.$width.') for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.'); + } - $nh = ceil(24*60 / $this->TimeToMinutes($this->hour->GetIntervall()) ); - $nd = $this->GetNumberOfDays(); - // Convert to intervall to seconds - $minint *= 60; - for($j=0; $j < $nd; ++$j, $day += 1, $day %= 7) { - for( $k=0; $k < $nh; ++$k ) { - for($i=0; $i < $n ;++$i, $x+=$width, $datestamp += $minint ) { - if( $day==6 || $day==0 ) { - - $img->PushColor($this->day->iWeekendBackgroundColor); - if( $this->iUsePlotWeekendBackground ) - $img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$img->height-$img->bottom_margin); - else - $img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$yb-$this->day->iFrameWeight); - $img->PopColor(); + $nh = ceil(24*60 / $this->TimeToMinutes($this->hour->GetIntervall()) ); + $nd = $this->GetNumberOfDays(); + // Convert to intervall to seconds + $minint *= 60; + for($j=0; $j < $nd; ++$j, $day += 1, $day %= 7) { + for( $k=0; $k < $nh; ++$k ) { + for($i=0; $i < $n ;++$i, $x+=$width, $datestamp += $minint ) { + if( $day==6 || $day==0 ) { - } + $img->PushColor($this->day->iWeekendBackgroundColor); + if( $this->iUsePlotWeekendBackground ) + $img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$img->height-$img->bottom_margin); + else + $img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$yb-$this->day->iFrameWeight); + $img->PopColor(); - if( $day==0 ) - $img->SetColor($this->day->iSundayTextColor); - else - $img->SetColor($this->day->iTextColor); + } - switch( $this->minute->iStyle ) { - case MINUTESTYLE_CUSTOM: - $txt = date($this->minute->iLabelFormStr,$datestamp); - break; - case MINUTESTYLE_MM: - default: - // 15 - $txt = date('i',$datestamp); - break; - } - $img->StrokeText(round($x+$width/2),round($yb-$this->minute->iTitleVertMargin),$txt); + if( $day==0 ) + $img->SetColor($this->day->iSundayTextColor); + else + $img->SetColor($this->day->iTextColor); - // FIXME: The rounding problem needs to be solved properly ... - // - // Fix a rounding problem the wrong way .. - // If we also have hour scale then don't draw the firsta or last - // gridline since that will be overwritten by the hour scale gridline if such exists. - // However, due to the propagation of rounding of the 'x+=width' term in the loop - // this might sometimes be one pixel of so we fix this by not drawing it. - // The proper way to fix it would be to re-calculate the scale for each step and - // not using the additive term. - if( !(($i == $n || $i==0) && $this->hour->iShowLabels && $this->hour->grid->iShow) ) { - $img->SetColor($this->minute->grid->iColor); - $img->SetLineWeight($this->minute->grid->iWeight); - $img->Line($x,$yt,$x,$yb); - $this->minute->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); - } - } - } - } - $img->SetColor($this->minute->iFrameColor); - $img->SetLineWeight($this->minute->iFrameWeight); - $img->Rectangle($xt,$yt,$xb,$yb); - return $yb - $img->top_margin; - } - return $aYCoord; + switch( $this->minute->iStyle ) { + case MINUTESTYLE_CUSTOM: + $txt = date($this->minute->iLabelFormStr,$datestamp); + break; + case MINUTESTYLE_MM: + default: + // 15 + $txt = date('i',$datestamp); + break; + } + $img->StrokeText(round($x+$width/2),round($yb-$this->minute->iTitleVertMargin),$txt); + + // Fix a rounding problem the wrong way .. + // If we also have hour scale then don't draw the firsta or last + // gridline since that will be overwritten by the hour scale gridline if such exists. + // However, due to the propagation of rounding of the 'x+=width' term in the loop + // this might sometimes be one pixel of so we fix this by not drawing it. + // The proper way to fix it would be to re-calculate the scale for each step and + // not using the additive term. + if( !(($i == $n || $i==0) && $this->hour->iShowLabels && $this->hour->grid->iShow) ) { + $img->SetColor($this->minute->grid->iColor); + $img->SetLineWeight($this->minute->grid->iWeight); + $img->Line($x,$yt,$x,$yb); + $this->minute->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); + } + } + } + } + $img->SetColor($this->minute->iFrameColor); + $img->SetLineWeight($this->minute->iFrameWeight); + $img->Rectangle($xt,$yt,$xb,$yb); + return $yb - $img->top_margin; + } + return $aYCoord; } - // Stroke the day scale (including gridlines) + // Stroke the day scale (including gridlines) function StrokeHours($aYCoord,$getHeight=false) { - $img=$this->iImg; - $xt=$img->left_margin+$this->iLabelWidth; - $yt=$aYCoord+$img->top_margin; - if( $this->hour->iShowLabels ) { - $img->SetFont($this->hour->iFFamily,$this->hour->iFStyle,$this->hour->iFSize); - $yb = $yt + $img->GetFontHeight() + - $this->hour->iTitleVertMargin + $this->hour->iFrameWeight; - if( $getHeight ) { - return $yb - $img->top_margin; - } - $xb = $img->width-$img->right_margin+1; - $img->SetColor($this->hour->iBackgroundColor); - $img->FilledRectangle($xt,$yt,$xb,$yb); + $img=$this->iImg; + $xt=$img->left_margin+$this->iLabelWidth; + $yt=$aYCoord+$img->top_margin; + if( $this->hour->iShowLabels ) { + $img->SetFont($this->hour->iFFamily,$this->hour->iFStyle,$this->hour->iFSize); + $yb = $yt + $img->GetFontHeight() + + $this->hour->iTitleVertMargin + $this->hour->iFrameWeight; + if( $getHeight ) { + return $yb - $img->top_margin; + } + $xb = $img->width-$img->right_margin+1; + $img->SetColor($this->hour->iBackgroundColor); + $img->FilledRectangle($xt,$yt,$xb,$yb); - $x = $xt; - $img->SetTextAlign("center"); - $tmp = $this->hour->GetIntervall() ; - $minint = $this->TimeToMinutes($tmp); - if( 1440 % $minint !== 0 ) { + $x = $xt; + $img->SetTextAlign("center"); + $tmp = $this->hour->GetIntervall() ; + $minint = $this->TimeToMinutes($tmp); + if( 1440 % $minint !== 0 ) { JpGraphError::RaiseL(6020,$tmp); -//('Intervall for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an intervall of '.$tmp); - } + //('Intervall for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an intervall of '.$tmp); + } - $n = ceil(24*60 / $minint ); - $datestamp = $this->iStartDate; - $day = date('w',$this->iStartDate); - $doback = !$this->minute->iShowLabels; - $width = $this->GetDayWidth() / $n ; - for($j=0; $j < $this->GetNumberOfDays(); ++$j, $day += 1,$day %= 7) { - for($i=0; $i < $n ;++$i, $x+=$width) { - if( $day==6 || $day==0 ) { - - $img->PushColor($this->day->iWeekendBackgroundColor); - if( $this->iUsePlotWeekendBackground && $doback ) - $img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$img->height-$img->bottom_margin); - else - $img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$yb-$this->day->iFrameWeight); - $img->PopColor(); + $n = ceil(24*60 / $minint ); + $datestamp = $this->iStartDate; + $day = date('w',$this->iStartDate); + $doback = !$this->minute->iShowLabels; + $width = $this->GetDayWidth() / $n ; + for($j=0; $j < $this->GetNumberOfDays(); ++$j, $day += 1,$day %= 7) { + for($i=0; $i < $n ;++$i, $x+=$width) { + if( $day==6 || $day==0 ) { - } + $img->PushColor($this->day->iWeekendBackgroundColor); + if( $this->iUsePlotWeekendBackground && $doback ) + $img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$img->height-$img->bottom_margin); + else + $img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$yb-$this->day->iFrameWeight); + $img->PopColor(); - if( $day==0 ) - $img->SetColor($this->day->iSundayTextColor); - else - $img->SetColor($this->day->iTextColor); + } - switch( $this->hour->iStyle ) { - case HOURSTYLE_HMAMPM: - // 1:35pm - $txt = date('g:ia',$datestamp); - break; - case HOURSTYLE_H24: - // 13 - $txt = date('H',$datestamp); - break; - case HOURSTYLE_HAMPM: - $txt = date('ga',$datestamp); - break; - case HOURSTYLE_CUSTOM: - $txt = date($this->hour->iLabelFormStr,$datestamp); - break; - case HOURSTYLE_HM24: - default: - $txt = date('H:i',$datestamp); - break; - } - $img->StrokeText(round($x+$width/2),round($yb-$this->hour->iTitleVertMargin),$txt); - $img->SetColor($this->hour->grid->iColor); - $img->SetLineWeight($this->hour->grid->iWeight); - $img->Line($x,$yt,$x,$yb); - $this->hour->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); - //$datestamp += $minint*60 - $datestamp = mktime(date('H',$datestamp),date('i',$datestamp)+$minint,0, - date("m",$datestamp),date("d",$datestamp)+1,date("Y",$datestamp)); - - } - } - $img->SetColor($this->hour->iFrameColor); - $img->SetLineWeight($this->hour->iFrameWeight); - $img->Rectangle($xt,$yt,$xb,$yb); - return $yb - $img->top_margin; - } - return $aYCoord; + if( $day==0 ) + $img->SetColor($this->day->iSundayTextColor); + else + $img->SetColor($this->day->iTextColor); + + switch( $this->hour->iStyle ) { + case HOURSTYLE_HMAMPM: + // 1:35pm + $txt = date('g:ia',$datestamp); + break; + case HOURSTYLE_H24: + // 13 + $txt = date('H',$datestamp); + break; + case HOURSTYLE_HAMPM: + $txt = date('ga',$datestamp); + break; + case HOURSTYLE_CUSTOM: + $txt = date($this->hour->iLabelFormStr,$datestamp); + break; + case HOURSTYLE_HM24: + default: + $txt = date('H:i',$datestamp); + break; + } + $img->StrokeText(round($x+$width/2),round($yb-$this->hour->iTitleVertMargin),$txt); + $img->SetColor($this->hour->grid->iColor); + $img->SetLineWeight($this->hour->grid->iWeight); + $img->Line($x,$yt,$x,$yb); + $this->hour->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); + //$datestamp += $minint*60 + $datestamp = mktime(date('H',$datestamp),date('i',$datestamp)+$minint,0, + date("m",$datestamp),date("d",$datestamp)+1,date("Y",$datestamp)); + + } + } + $img->SetColor($this->hour->iFrameColor); + $img->SetLineWeight($this->hour->iFrameWeight); + $img->Rectangle($xt,$yt,$xb,$yb); + return $yb - $img->top_margin; + } + return $aYCoord; } - // Stroke the day scale (including gridlines) + // Stroke the day scale (including gridlines) function StrokeDays($aYCoord,$getHeight=false) { - $img=$this->iImg; - $daywidth=$this->GetDayWidth(); - $xt=$img->left_margin+$this->iLabelWidth; - $yt=$aYCoord+$img->top_margin; - if( $this->day->iShowLabels ) { - $img->SetFont($this->day->iFFamily,$this->day->iFStyle,$this->day->iFSize); - $yb=$yt + $img->GetFontHeight() + $this->day->iTitleVertMargin + $this->day->iFrameWeight; - if( $getHeight ) { - return $yb - $img->top_margin; - } - $xb=$img->width-$img->right_margin+1; - $img->SetColor($this->day->iBackgroundColor); - $img->FilledRectangle($xt,$yt,$xb,$yb); + $img=$this->iImg; + $daywidth=$this->GetDayWidth(); + $xt=$img->left_margin+$this->iLabelWidth; + $yt=$aYCoord+$img->top_margin; + if( $this->day->iShowLabels ) { + $img->SetFont($this->day->iFFamily,$this->day->iFStyle,$this->day->iFSize); + $yb=$yt + $img->GetFontHeight() + $this->day->iTitleVertMargin + $this->day->iFrameWeight; + if( $getHeight ) { + return $yb - $img->top_margin; + } + $xb=$img->width-$img->right_margin+1; + $img->SetColor($this->day->iBackgroundColor); + $img->FilledRectangle($xt,$yt,$xb,$yb); - $x = $xt; - $img->SetTextAlign("center"); - $day = date('w',$this->iStartDate); - $datestamp = $this->iStartDate; - - $doback = !($this->hour->iShowLabels || $this->minute->iShowLabels); + $x = $xt; + $img->SetTextAlign("center"); + $day = date('w',$this->iStartDate); + $datestamp = $this->iStartDate; - setlocale(LC_TIME,$this->iDateLocale->iLocale); - - for($i=0; $i < $this->GetNumberOfDays(); ++$i, $x+=$daywidth, $day += 1,$day %= 7) { - if( $day==6 || $day==0 ) { - $img->SetColor($this->day->iWeekendBackgroundColor); - if( $this->iUsePlotWeekendBackground && $doback) - $img->FilledRectangle($x,$yt+$this->day->iFrameWeight, - $x+$daywidth,$img->height-$img->bottom_margin); - else - $img->FilledRectangle($x,$yt+$this->day->iFrameWeight, - $x+$daywidth,$yb-$this->day->iFrameWeight); - } + $doback = !($this->hour->iShowLabels || $this->minute->iShowLabels); - $mn = strftime('%m',$datestamp); - if( $mn[0]=='0' ) - $mn = $mn[1]; + setlocale(LC_TIME,$this->iDateLocale->iLocale); - switch( $this->day->iStyle ) { - case DAYSTYLE_LONG: - // "Monday" - $txt = strftime('%A',$datestamp); - break; - case DAYSTYLE_SHORT: - // "Mon" - $txt = strftime('%a',$datestamp); - break; - case DAYSTYLE_SHORTDAYDATE1: - // "Mon 23/6" - $txt = strftime('%a %d/'.$mn,$datestamp); - break; - case DAYSTYLE_SHORTDAYDATE2: - // "Mon 23 Jun" - $txt = strftime('%a %d %b',$datestamp); - break; - case DAYSTYLE_SHORTDAYDATE3: - // "Mon 23 Jun 2003" - $txt = strftime('%a %d %b %Y',$datestamp); - break; - case DAYSTYLE_LONGDAYDATE1: - // "Monday 23 Jun" - $txt = strftime('%A %d %b',$datestamp); - break; - case DAYSTYLE_LONGDAYDATE2: - // "Monday 23 Jun 2003" - $txt = strftime('%A %d %b %Y',$datestamp); - break; - case DAYSTYLE_SHORTDATE1: - // "23/6" - $txt = strftime('%d/'.$mn,$datestamp); - break; - case DAYSTYLE_SHORTDATE2: - // "23 Jun" - $txt = strftime('%d %b',$datestamp); - break; - case DAYSTYLE_SHORTDATE3: - // "Mon 23" - $txt = strftime('%a %d',$datestamp); - break; - case DAYSTYLE_SHORTDATE4: - // "23" - $txt = strftime('%d',$datestamp); - break; - case DAYSTYLE_CUSTOM: - // Custom format - $txt = strftime($this->day->iLabelFormStr,$datestamp); - break; - case DAYSTYLE_ONELETTER: - default: - // "M" - $txt = strftime('%A',$datestamp); - $txt = strtoupper($txt[0]); - break; - } + for($i=0; $i < $this->GetNumberOfDays(); ++$i, $x+=$daywidth, $day += 1,$day %= 7) { + if( $day==6 || $day==0 ) { + $img->SetColor($this->day->iWeekendBackgroundColor); + if( $this->iUsePlotWeekendBackground && $doback) + $img->FilledRectangle($x,$yt+$this->day->iFrameWeight, + $x+$daywidth,$img->height-$img->bottom_margin); + else + $img->FilledRectangle($x,$yt+$this->day->iFrameWeight, + $x+$daywidth,$yb-$this->day->iFrameWeight); + } - if( $day==0 ) - $img->SetColor($this->day->iSundayTextColor); - else - $img->SetColor($this->day->iTextColor); - $img->StrokeText(round($x+$daywidth/2+1), - round($yb-$this->day->iTitleVertMargin),$txt); - $img->SetColor($this->day->grid->iColor); - $img->SetLineWeight($this->day->grid->iWeight); - $img->Line($x,$yt,$x,$yb); - $this->day->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); - $datestamp = mktime(0,0,0,date("m",$datestamp),date("d",$datestamp)+1,date("Y",$datestamp)); - //$datestamp += SECPERDAY; - - } - $img->SetColor($this->day->iFrameColor); - $img->SetLineWeight($this->day->iFrameWeight); - $img->Rectangle($xt,$yt,$xb,$yb); - return $yb - $img->top_margin; - } - return $aYCoord; + $mn = strftime('%m',$datestamp); + if( $mn[0]=='0' ) + $mn = $mn[1]; + + switch( $this->day->iStyle ) { + case DAYSTYLE_LONG: + // "Monday" + $txt = strftime('%A',$datestamp); + break; + case DAYSTYLE_SHORT: + // "Mon" + $txt = strftime('%a',$datestamp); + break; + case DAYSTYLE_SHORTDAYDATE1: + // "Mon 23/6" + $txt = strftime('%a %d/'.$mn,$datestamp); + break; + case DAYSTYLE_SHORTDAYDATE2: + // "Mon 23 Jun" + $txt = strftime('%a %d %b',$datestamp); + break; + case DAYSTYLE_SHORTDAYDATE3: + // "Mon 23 Jun 2003" + $txt = strftime('%a %d %b %Y',$datestamp); + break; + case DAYSTYLE_LONGDAYDATE1: + // "Monday 23 Jun" + $txt = strftime('%A %d %b',$datestamp); + break; + case DAYSTYLE_LONGDAYDATE2: + // "Monday 23 Jun 2003" + $txt = strftime('%A %d %b %Y',$datestamp); + break; + case DAYSTYLE_SHORTDATE1: + // "23/6" + $txt = strftime('%d/'.$mn,$datestamp); + break; + case DAYSTYLE_SHORTDATE2: + // "23 Jun" + $txt = strftime('%d %b',$datestamp); + break; + case DAYSTYLE_SHORTDATE3: + // "Mon 23" + $txt = strftime('%a %d',$datestamp); + break; + case DAYSTYLE_SHORTDATE4: + // "23" + $txt = strftime('%d',$datestamp); + break; + case DAYSTYLE_CUSTOM: + // Custom format + $txt = strftime($this->day->iLabelFormStr,$datestamp); + break; + case DAYSTYLE_ONELETTER: + default: + // "M" + $txt = strftime('%A',$datestamp); + $txt = strtoupper($txt[0]); + break; + } + + if( $day==0 ) + $img->SetColor($this->day->iSundayTextColor); + else + $img->SetColor($this->day->iTextColor); + $img->StrokeText(round($x+$daywidth/2+1), + round($yb-$this->day->iTitleVertMargin),$txt); + $img->SetColor($this->day->grid->iColor); + $img->SetLineWeight($this->day->grid->iWeight); + $img->Line($x,$yt,$x,$yb); + $this->day->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); + $datestamp = mktime(0,0,0,date("m",$datestamp),date("d",$datestamp)+1,date("Y",$datestamp)); + //$datestamp += SECPERDAY; + + } + $img->SetColor($this->day->iFrameColor); + $img->SetLineWeight($this->day->iFrameWeight); + $img->Rectangle($xt,$yt,$xb,$yb); + return $yb - $img->top_margin; + } + return $aYCoord; } - + // Stroke week header and grid function StrokeWeeks($aYCoord,$getHeight=false) { - if( $this->week->iShowLabels ) { - $img=$this->iImg; - $yt=$aYCoord+$img->top_margin; - $img->SetFont($this->week->iFFamily,$this->week->iFStyle,$this->week->iFSize); - $yb=$yt + $img->GetFontHeight() + $this->week->iTitleVertMargin + $this->week->iFrameWeight; + if( $this->week->iShowLabels ) { + $img=$this->iImg; + $yt=$aYCoord+$img->top_margin; + $img->SetFont($this->week->iFFamily,$this->week->iFStyle,$this->week->iFSize); + $yb=$yt + $img->GetFontHeight() + $this->week->iTitleVertMargin + $this->week->iFrameWeight; - if( $getHeight ) { - return $yb - $img->top_margin; - } + if( $getHeight ) { + return $yb - $img->top_margin; + } - $xt=$img->left_margin+$this->iLabelWidth; - $weekwidth=$this->GetDayWidth()*7; - $wdays=$this->iDateLocale->GetDayAbb(); - $xb=$img->width-$img->right_margin+1; - $week = $this->iStartDate; - $weeknbr=$this->GetWeekNbr($week); - $img->SetColor($this->week->iBackgroundColor); - $img->FilledRectangle($xt,$yt,$xb,$yb); - $img->SetColor($this->week->grid->iColor); - $x = $xt; - if( $this->week->iStyle==WEEKSTYLE_WNBR ) { - $img->SetTextAlign("center"); - $txtOffset = $weekwidth/2+1; - } - elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY || - $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 || - $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || - $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) { - $img->SetTextAlign("left"); - $txtOffset = 3; - } - else - JpGraphError::RaiseL(6021); -//("Unknown formatting style for week."); - - for($i=0; $i<$this->GetNumberOfDays()/7; ++$i, $x+=$weekwidth) { - $img->PushColor($this->week->iTextColor); - - if( $this->week->iStyle==WEEKSTYLE_WNBR ) - $txt = sprintf($this->week->iLabelFormStr,$weeknbr); - elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY || - $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ) - $txt = date("j/n",$week); - elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 || - $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) { - $monthnbr = date("n",$week)-1; - $shortmonth = $this->iDateLocale->GetShortMonthName($monthnbr); - $txt = Date("j",$week)." ".$shortmonth; - } + $xt=$img->left_margin+$this->iLabelWidth; + $weekwidth=$this->GetDayWidth()*7; + $wdays=$this->iDateLocale->GetDayAbb(); + $xb=$img->width-$img->right_margin+1; + $week = $this->iStartDate; + $weeknbr=$this->GetWeekNbr($week); + $img->SetColor($this->week->iBackgroundColor); + $img->FilledRectangle($xt,$yt,$xb,$yb); + $img->SetColor($this->week->grid->iColor); + $x = $xt; + if( $this->week->iStyle==WEEKSTYLE_WNBR ) { + $img->SetTextAlign("center"); + $txtOffset = $weekwidth/2+1; + } + elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY || + $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 || + $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || + $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) { + $img->SetTextAlign("left"); + $txtOffset = 3; + } + else { + JpGraphError::RaiseL(6021); + //("Unknown formatting style for week."); + } + + for($i=0; $i<$this->GetNumberOfDays()/7; ++$i, $x+=$weekwidth) { + $img->PushColor($this->week->iTextColor); + + if( $this->week->iStyle==WEEKSTYLE_WNBR ) + $txt = sprintf($this->week->iLabelFormStr,$weeknbr); + elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY || + $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ) + $txt = date("j/n",$week); + elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 || + $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) { + $monthnbr = date("n",$week)-1; + $shortmonth = $this->iDateLocale->GetShortMonthName($monthnbr); + $txt = Date("j",$week)." ".$shortmonth; + } + + if( $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || + $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) { + $w = sprintf($this->week->iLabelFormStr,$weeknbr); + $txt .= ' '.$w; + } + + $img->StrokeText(round($x+$txtOffset), + round($yb-$this->week->iTitleVertMargin),$txt); + + $week = strtotime('+7 day',$week); + $weeknbr = $this->GetWeekNbr($week); + $img->PopColor(); + $img->SetLineWeight($this->week->grid->iWeight); + $img->Line($x,$yt,$x,$yb); + $this->week->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); + } + $img->SetColor($this->week->iFrameColor); + $img->SetLineWeight($this->week->iFrameWeight); + $img->Rectangle($xt,$yt,$xb,$yb); + return $yb-$img->top_margin; + } + return $aYCoord; + } - if( $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || - $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) { - $w = sprintf($this->week->iLabelFormStr,$weeknbr); - $txt .= ' '.$w; - } - - $img->StrokeText(round($x+$txtOffset), - round($yb-$this->week->iTitleVertMargin),$txt); - - $week = strtotime('+7 day',$week); - $weeknbr = $this->GetWeekNbr($week); - $img->PopColor(); - $img->SetLineWeight($this->week->grid->iWeight); - $img->Line($x,$yt,$x,$yb); - $this->week->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); - } - $img->SetColor($this->week->iFrameColor); - $img->SetLineWeight($this->week->iFrameWeight); - $img->Rectangle($xt,$yt,$xb,$yb); - return $yb-$img->top_margin; - } - return $aYCoord; - } - // Format the mont scale header string function GetMonthLabel($aMonthNbr,$year) { - $sn = $this->iDateLocale->GetShortMonthName($aMonthNbr); - $ln = $this->iDateLocale->GetLongMonthName($aMonthNbr); - switch($this->month->iStyle) { - case MONTHSTYLE_SHORTNAME: - $m=$sn; - break; - case MONTHSTYLE_LONGNAME: - $m=$ln; - break; - case MONTHSTYLE_SHORTNAMEYEAR2: - $m=$sn." '".substr("".$year,2); - break; - case MONTHSTYLE_SHORTNAMEYEAR4: - $m=$sn." ".$year; - break; - case MONTHSTYLE_LONGNAMEYEAR2: - $m=$ln." '".substr("".$year,2); - break; - case MONTHSTYLE_LONGNAMEYEAR4: - $m=$ln." ".$year; - break; - case MONTHSTYLE_FIRSTLETTER: - $m=$sn[0]; - break; - } - return $m; + $sn = $this->iDateLocale->GetShortMonthName($aMonthNbr); + $ln = $this->iDateLocale->GetLongMonthName($aMonthNbr); + switch($this->month->iStyle) { + case MONTHSTYLE_SHORTNAME: + $m=$sn; + break; + case MONTHSTYLE_LONGNAME: + $m=$ln; + break; + case MONTHSTYLE_SHORTNAMEYEAR2: + $m=$sn." '".substr("".$year,2); + break; + case MONTHSTYLE_SHORTNAMEYEAR4: + $m=$sn." ".$year; + break; + case MONTHSTYLE_LONGNAMEYEAR2: + $m=$ln." '".substr("".$year,2); + break; + case MONTHSTYLE_LONGNAMEYEAR4: + $m=$ln." ".$year; + break; + case MONTHSTYLE_FIRSTLETTER: + $m=$sn[0]; + break; + } + return $m; } - + // Stroke month scale and gridlines function StrokeMonths($aYCoord,$getHeight=false) { - if( $this->month->iShowLabels ) { - $img=$this->iImg; - $img->SetFont($this->month->iFFamily,$this->month->iFStyle,$this->month->iFSize); - $yt=$aYCoord+$img->top_margin; - $yb=$yt + $img->GetFontHeight() + $this->month->iTitleVertMargin + $this->month->iFrameWeight; - if( $getHeight ) { - return $yb - $img->top_margin; - } - $monthnbr = $this->GetMonthNbr($this->iStartDate)-1; - $xt=$img->left_margin+$this->iLabelWidth; - $xb=$img->width-$img->right_margin+1; - - $img->SetColor($this->month->iBackgroundColor); - $img->FilledRectangle($xt,$yt,$xb,$yb); + if( $this->month->iShowLabels ) { + $img=$this->iImg; + $img->SetFont($this->month->iFFamily,$this->month->iFStyle,$this->month->iFSize); + $yt=$aYCoord+$img->top_margin; + $yb=$yt + $img->GetFontHeight() + $this->month->iTitleVertMargin + $this->month->iFrameWeight; + if( $getHeight ) { + return $yb - $img->top_margin; + } + $monthnbr = $this->GetMonthNbr($this->iStartDate)-1; + $xt=$img->left_margin+$this->iLabelWidth; + $xb=$img->width-$img->right_margin+1; - $img->SetLineWeight($this->month->grid->iWeight); - $img->SetColor($this->month->iTextColor); - $year = 0+strftime("%Y",$this->iStartDate); - $img->SetTextAlign("center"); - if( $this->GetMonthNbr($this->iStartDate) == $this->GetMonthNbr($this->iEndDate) - && $this->GetYear($this->iStartDate)==$this->GetYear($this->iEndDate) ) { - $monthwidth=$this->GetDayWidth()*($this->GetMonthDayNbr($this->iEndDate) - $this->GetMonthDayNbr($this->iStartDate) + 1); - } - else { - $monthwidth=$this->GetDayWidth()*($this->GetNumDaysInMonth($monthnbr,$year)-$this->GetMonthDayNbr($this->iStartDate)+1); - } - // Is it enough space to stroke the first month? - $monthName = $this->GetMonthLabel($monthnbr,$year); - if( $monthwidth >= 1.2*$img->GetTextWidth($monthName) ) { - $img->SetColor($this->month->iTextColor); - $img->StrokeText(round($xt+$monthwidth/2+1), - round($yb-$this->month->iTitleVertMargin), - $monthName); - } - $x = $xt + $monthwidth; - while( $x < $xb ) { - $img->SetColor($this->month->grid->iColor); - $img->Line($x,$yt,$x,$yb); - $this->month->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); - $monthnbr++; - if( $monthnbr==12 ) { - $monthnbr=0; - $year++; - } - $monthName = $this->GetMonthLabel($monthnbr,$year); - $monthwidth=$this->GetDayWidth()*$this->GetNumDaysInMonth($monthnbr,$year); - if( $x + $monthwidth < $xb ) - $w = $monthwidth; - else - $w = $xb-$x; - if( $w >= 1.2*$img->GetTextWidth($monthName) ) { - $img->SetColor($this->month->iTextColor); - $img->StrokeText(round($x+$w/2+1), - round($yb-$this->month->iTitleVertMargin),$monthName); - } - $x += $monthwidth; - } - $img->SetColor($this->month->iFrameColor); - $img->SetLineWeight($this->month->iFrameWeight); - $img->Rectangle($xt,$yt,$xb,$yb); - return $yb-$img->top_margin; - } - return $aYCoord; + $img->SetColor($this->month->iBackgroundColor); + $img->FilledRectangle($xt,$yt,$xb,$yb); + + $img->SetLineWeight($this->month->grid->iWeight); + $img->SetColor($this->month->iTextColor); + $year = 0+strftime("%Y",$this->iStartDate); + $img->SetTextAlign("center"); + if( $this->GetMonthNbr($this->iStartDate) == $this->GetMonthNbr($this->iEndDate) + && $this->GetYear($this->iStartDate)==$this->GetYear($this->iEndDate) ) { + $monthwidth=$this->GetDayWidth()*($this->GetMonthDayNbr($this->iEndDate) - $this->GetMonthDayNbr($this->iStartDate) + 1); + } + else { + $monthwidth=$this->GetDayWidth()*($this->GetNumDaysInMonth($monthnbr,$year)-$this->GetMonthDayNbr($this->iStartDate)+1); + } + // Is it enough space to stroke the first month? + $monthName = $this->GetMonthLabel($monthnbr,$year); + if( $monthwidth >= 1.2*$img->GetTextWidth($monthName) ) { + $img->SetColor($this->month->iTextColor); + $img->StrokeText(round($xt+$monthwidth/2+1), + round($yb-$this->month->iTitleVertMargin), + $monthName); + } + $x = $xt + $monthwidth; + while( $x < $xb ) { + $img->SetColor($this->month->grid->iColor); + $img->Line($x,$yt,$x,$yb); + $this->month->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); + $monthnbr++; + if( $monthnbr==12 ) { + $monthnbr=0; + $year++; + } + $monthName = $this->GetMonthLabel($monthnbr,$year); + $monthwidth=$this->GetDayWidth()*$this->GetNumDaysInMonth($monthnbr,$year); + if( $x + $monthwidth < $xb ) + $w = $monthwidth; + else + $w = $xb-$x; + if( $w >= 1.2*$img->GetTextWidth($monthName) ) { + $img->SetColor($this->month->iTextColor); + $img->StrokeText(round($x+$w/2+1), + round($yb-$this->month->iTitleVertMargin),$monthName); + } + $x += $monthwidth; + } + $img->SetColor($this->month->iFrameColor); + $img->SetLineWeight($this->month->iFrameWeight); + $img->Rectangle($xt,$yt,$xb,$yb); + return $yb-$img->top_margin; + } + return $aYCoord; } // Stroke year scale and gridlines function StrokeYears($aYCoord,$getHeight=false) { - if( $this->year->iShowLabels ) { - $img=$this->iImg; - $yt=$aYCoord+$img->top_margin; - $img->SetFont($this->year->iFFamily,$this->year->iFStyle,$this->year->iFSize); - $yb=$yt + $img->GetFontHeight() + $this->year->iTitleVertMargin + $this->year->iFrameWeight; + if( $this->year->iShowLabels ) { + $img=$this->iImg; + $yt=$aYCoord+$img->top_margin; + $img->SetFont($this->year->iFFamily,$this->year->iFStyle,$this->year->iFSize); + $yb=$yt + $img->GetFontHeight() + $this->year->iTitleVertMargin + $this->year->iFrameWeight; - if( $getHeight ) { - return $yb - $img->top_margin; - } + if( $getHeight ) { + return $yb - $img->top_margin; + } - $xb=$img->width-$img->right_margin+1; - $xt=$img->left_margin+$this->iLabelWidth; - $year = $this->GetYear($this->iStartDate); - $img->SetColor($this->year->iBackgroundColor); - $img->FilledRectangle($xt,$yt,$xb,$yb); - $img->SetLineWeight($this->year->grid->iWeight); - $img->SetTextAlign("center"); - if( $year == $this->GetYear($this->iEndDate) ) - $yearwidth=$this->GetDayWidth()*($this->GetYearDayNbr($this->iEndDate)-$this->GetYearDayNbr($this->iStartDate)+1); - else - $yearwidth=$this->GetDayWidth()*($this->GetNumDaysInYear($year)-$this->GetYearDayNbr($this->iStartDate)+1); - - // The space for a year must be at least 20% bigger than the actual text - // so we allow 10% margin on each side - if( $yearwidth >= 1.20*$img->GetTextWidth("".$year) ) { - $img->SetColor($this->year->iTextColor); - $img->StrokeText(round($xt+$yearwidth/2+1), - round($yb-$this->year->iTitleVertMargin), - $year); - } - $x = $xt + $yearwidth; - while( $x < $xb ) { - $img->SetColor($this->year->grid->iColor); - $img->Line($x,$yt,$x,$yb); - $this->year->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); - $year += 1; - $yearwidth=$this->GetDayWidth()*$this->GetNumDaysInYear($year); - if( $x + $yearwidth < $xb ) - $w = $yearwidth; - else - $w = $xb-$x; - if( $w >= 1.2*$img->GetTextWidth("".$year) ) { - $img->SetColor($this->year->iTextColor); - $img->StrokeText(round($x+$w/2+1), - round($yb-$this->year->iTitleVertMargin), - $year); - } - $x += $yearwidth; - } - $img->SetColor($this->year->iFrameColor); - $img->SetLineWeight($this->year->iFrameWeight); - $img->Rectangle($xt,$yt,$xb,$yb); - return $yb-$img->top_margin; - } - return $aYCoord; + $xb=$img->width-$img->right_margin+1; + $xt=$img->left_margin+$this->iLabelWidth; + $year = $this->GetYear($this->iStartDate); + $img->SetColor($this->year->iBackgroundColor); + $img->FilledRectangle($xt,$yt,$xb,$yb); + $img->SetLineWeight($this->year->grid->iWeight); + $img->SetTextAlign("center"); + if( $year == $this->GetYear($this->iEndDate) ) + $yearwidth=$this->GetDayWidth()*($this->GetYearDayNbr($this->iEndDate)-$this->GetYearDayNbr($this->iStartDate)+1); + else + $yearwidth=$this->GetDayWidth()*($this->GetNumDaysInYear($year)-$this->GetYearDayNbr($this->iStartDate)+1); + + // The space for a year must be at least 20% bigger than the actual text + // so we allow 10% margin on each side + if( $yearwidth >= 1.20*$img->GetTextWidth("".$year) ) { + $img->SetColor($this->year->iTextColor); + $img->StrokeText(round($xt+$yearwidth/2+1), + round($yb-$this->year->iTitleVertMargin), + $year); + } + $x = $xt + $yearwidth; + while( $x < $xb ) { + $img->SetColor($this->year->grid->iColor); + $img->Line($x,$yt,$x,$yb); + $this->year->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin); + $year += 1; + $yearwidth=$this->GetDayWidth()*$this->GetNumDaysInYear($year); + if( $x + $yearwidth < $xb ) + $w = $yearwidth; + else + $w = $xb-$x; + if( $w >= 1.2*$img->GetTextWidth("".$year) ) { + $img->SetColor($this->year->iTextColor); + $img->StrokeText(round($x+$w/2+1), + round($yb-$this->year->iTitleVertMargin), + $year); + } + $x += $yearwidth; + } + $img->SetColor($this->year->iFrameColor); + $img->SetLineWeight($this->year->iFrameWeight); + $img->Rectangle($xt,$yt,$xb,$yb); + return $yb-$img->top_margin; + } + return $aYCoord; } - + // Stroke table title (upper left corner) function StrokeTableHeaders($aYBottom) { - $img=$this->iImg; - $xt=$img->left_margin; - $yt=$img->top_margin; - $xb=$xt+$this->iLabelWidth; - $yb=$aYBottom+$img->top_margin; + $img=$this->iImg; + $xt=$img->left_margin; + $yt=$img->top_margin; + $xb=$xt+$this->iLabelWidth; + $yb=$aYBottom+$img->top_margin; - if( $this->tableTitle->iShow ) { - $img->SetColor($this->iTableHeaderBackgroundColor); - $img->FilledRectangle($xt,$yt,$xb,$yb); - $this->tableTitle->Align("center","top"); - $this->tableTitle->Stroke($img,$xt+($xb-$xt)/2+1,$yt+2); - $img->SetColor($this->iTableHeaderFrameColor); - $img->SetLineWeight($this->iTableHeaderFrameWeight); - $img->Rectangle($xt,$yt,$xb,$yb); - } + if( $this->tableTitle->iShow ) { + $img->SetColor($this->iTableHeaderBackgroundColor); + $img->FilledRectangle($xt,$yt,$xb,$yb); + $this->tableTitle->Align("center","top"); + $this->tableTitle->Stroke($img,$xt+($xb-$xt)/2+1,$yt+2); + $img->SetColor($this->iTableHeaderFrameColor); + $img->SetLineWeight($this->iTableHeaderFrameWeight); + $img->Rectangle($xt,$yt,$xb,$yb); + } - $this->actinfo->Stroke($img,$xt,$yt,$xb,$yb,$this->tableTitle->iShow); + $this->actinfo->Stroke($img,$xt,$yt,$xb,$yb,$this->tableTitle->iShow); - // Draw the horizontal dividing line - $this->dividerh->Stroke($img,$xt,$yb,$img->width-$img->right_margin,$yb); - - // Draw the vertical dividing line - // We do the width "manually" since we want the line only to grow - // to the left - $fancy = $this->divider->iStyle == 'fancy' ; - if( $fancy ) { - $this->divider->iStyle = 'solid'; - } + // Draw the horizontal dividing line + $this->dividerh->Stroke($img,$xt,$yb,$img->width-$img->right_margin,$yb); - $tmp = $this->divider->iWeight; - $this->divider->iWeight=1; - $y = $img->height-$img->bottom_margin; - for($i=0; $i < $tmp; ++$i ) { - $this->divider->Stroke($img,$xb-$i,$yt,$xb-$i,$y); - } + // Draw the vertical dividing line + // We do the width "manually" since we want the line only to grow + // to the left + $fancy = $this->divider->iStyle == 'fancy' ; + if( $fancy ) { + $this->divider->iStyle = 'solid'; + } - // Should we draw "fancy" divider - if( $fancy ) { - $img->SetLineWeight(1); - $img->SetColor($this->iTableHeaderFrameColor); - $img->Line($xb,$yt,$xb,$y); - $img->Line($xb-$tmp+1,$yt,$xb-$tmp+1,$y); - $img->SetColor('white'); - $img->Line($xb-$tmp+2,$yt,$xb-$tmp+2,$y); - } + $tmp = $this->divider->iWeight; + $this->divider->iWeight=1; + $y = $img->height-$img->bottom_margin; + for($i=0; $i < $tmp; ++$i ) { + $this->divider->Stroke($img,$xb-$i,$yt,$xb-$i,$y); + } + + // Should we draw "fancy" divider + if( $fancy ) { + $img->SetLineWeight(1); + $img->SetColor($this->iTableHeaderFrameColor); + $img->Line($xb,$yt,$xb,$y); + $img->Line($xb-$tmp+1,$yt,$xb-$tmp+1,$y); + $img->SetColor('white'); + $img->Line($xb-$tmp+2,$yt,$xb-$tmp+2,$y); + } } // Main entry point to stroke scale function Stroke() { - if( !$this->IsRangeSet() ) - JpGraphError::RaiseL(6022); -//("Gantt scale has not been specified."); - $img=$this->iImg; + if( !$this->IsRangeSet() ) { + JpGraphError::RaiseL(6022); + //("Gantt scale has not been specified."); + } + $img=$this->iImg; - // If minutes are displayed then hour interval must be 1 - if( $this->IsDisplayMinute() && $this->hour->GetIntervall() > 1 ) { - JpGraphError::RaiseL(6023); -//('If you display both hour and minutes the hour intervall must be 1 (Otherwise it doesn\' make sense to display minutes).'); - } - - // Stroke all headers. As argument we supply the offset from the - // top which depends on any previous headers - - // First find out the height of each header - $offy=$this->StrokeYears(0,true); - $offm=$this->StrokeMonths($offy,true); - $offw=$this->StrokeWeeks($offm,true); - $offd=$this->StrokeDays($offw,true); - $offh=$this->StrokeHours($offd,true); - $offmin=$this->StrokeMinutes($offh,true); + // If minutes are displayed then hour interval must be 1 + if( $this->IsDisplayMinute() && $this->hour->GetIntervall() > 1 ) { + JpGraphError::RaiseL(6023); + //('If you display both hour and minutes the hour intervall must be 1 (Otherwise it doesn\' make sense to display minutes).'); + } + + // Stroke all headers. As argument we supply the offset from the + // top which depends on any previous headers + + // First find out the height of each header + $offy=$this->StrokeYears(0,true); + $offm=$this->StrokeMonths($offy,true); + $offw=$this->StrokeWeeks($offm,true); + $offd=$this->StrokeDays($offw,true); + $offh=$this->StrokeHours($offd,true); + $offmin=$this->StrokeMinutes($offh,true); - // ... then we can stroke them in the "backwards order to ensure that - // the larger scale gridlines is stroked over the smaller scale gridline - $this->StrokeMinutes($offh); - $this->StrokeHours($offd); - $this->StrokeDays($offw); - $this->StrokeWeeks($offm); - $this->StrokeMonths($offy); - $this->StrokeYears(0); + // ... then we can stroke them in the "backwards order to ensure that + // the larger scale gridlines is stroked over the smaller scale gridline + $this->StrokeMinutes($offh); + $this->StrokeHours($offd); + $this->StrokeDays($offw); + $this->StrokeWeeks($offm); + $this->StrokeMonths($offy); + $this->StrokeYears(0); - // Now when we now the oaverall size of the scale headers - // we can stroke the overall table headers - $this->StrokeTableHeaders($offmin); - - // Now we can calculate the correct scaling factor for each vertical position - $this->iAvailableHeight = $img->height - $img->top_margin - $img->bottom_margin - $offd; - $this->iVertHeaderSize = $offmin; - if( $this->iVertSpacing == -1 ) - $this->iVertSpacing = $this->iAvailableHeight / $this->iVertLines; - } + // Now when we now the oaverall size of the scale headers + // we can stroke the overall table headers + $this->StrokeTableHeaders($offmin); + + // Now we can calculate the correct scaling factor for each vertical position + $this->iAvailableHeight = $img->height - $img->top_margin - $img->bottom_margin - $offd; + + $this->iVertHeaderSize = $offmin; + if( $this->iVertSpacing == -1 ) + $this->iVertSpacing = $this->iAvailableHeight / $this->iVertLines; + } } @@ -2916,14 +3025,14 @@ class GanttConstraint { public $iConstrainArrowSize; public $iConstrainArrowType; -//--------------- -// CONSTRUCTOR - function GanttConstraint($aRow,$aType,$aColor,$aArrowSize,$aArrowType){ - $this->iConstrainType = $aType; - $this->iConstrainRow = $aRow; - $this->iConstrainColor=$aColor; - $this->iConstrainArrowSize=$aArrowSize; - $this->iConstrainArrowType=$aArrowType; + //--------------- + // CONSTRUCTOR + function __construct($aRow,$aType,$aColor,$aArrowSize,$aArrowType){ + $this->iConstrainType = $aType; + $this->iConstrainRow = $aRow; + $this->iConstrainColor=$aColor; + $this->iConstrainArrowSize=$aArrowSize; + $this->iConstrainArrowType=$aArrowType; } } @@ -2935,129 +3044,124 @@ class GanttConstraint { class GanttPlotObject { public $title,$caption; public $csimarea='',$csimtarget='',$csimwintarget='',$csimalt=''; - public $constraints = array(); + public $constraints = array(); public $iCaptionMargin=5; public $iConstrainPos=array(); - protected $iStart=""; // Start date - public $iVPos=0; // Vertical position - protected $iLabelLeftMargin=2; // Title margin - - function GanttPlotObject() { - $this->title = new TextProperty(); - $this->title->Align("left","center"); - $this->caption = new TextProperty(); + protected $iStart=""; // Start date + public $iVPos=0; // Vertical position + protected $iLabelLeftMargin=2; // Title margin + + function __construct() { + $this->title = new TextProperty(); + $this->title->Align('left','center'); + $this->caption = new TextProperty(); } function GetCSIMArea() { - return $this->csimarea; + return $this->csimarea; } function SetCSIMTarget($aTarget,$aAlt='',$aWinTarget='') { - if( !is_string($aTarget) ) { - $tv = substr(var_export($aTarget,true),0,40); - JpGraphError::RaiseL(6024,$tv); -//('CSIM Target must be specified as a string.'."\nStart of target is:\n$tv"); - } - if( !is_string($aAlt) ) { - $tv = substr(var_export($aAlt,true),0,40); - JpGraphError::RaiseL(6025,$tv); -//('CSIM Alt text must be specified as a string.'."\nStart of alt text is:\n$tv"); - } + if( !is_string($aTarget) ) { + $tv = substr(var_export($aTarget,true),0,40); + JpGraphError::RaiseL(6024,$tv); + //('CSIM Target must be specified as a string.'."\nStart of target is:\n$tv"); + } + if( !is_string($aAlt) ) { + $tv = substr(var_export($aAlt,true),0,40); + JpGraphError::RaiseL(6025,$tv); + //('CSIM Alt text must be specified as a string.'."\nStart of alt text is:\n$tv"); + } $this->csimtarget=$aTarget; $this->csimwintarget=$aWinTarget; $this->csimalt=$aAlt; } - + function SetCSIMAlt($aAlt) { - if( !is_string($aAlt) ) { - $tv = substr(var_export($aAlt,true),0,40); - JpGraphError::RaiseL(6025,$tv); -//('CSIM Alt text must be specified as a string.'."\nStart of alt text is:\n$tv"); - } + if( !is_string($aAlt) ) { + $tv = substr(var_export($aAlt,true),0,40); + JpGraphError::RaiseL(6025,$tv); + //('CSIM Alt text must be specified as a string.'."\nStart of alt text is:\n$tv"); + } $this->csimalt=$aAlt; } function SetConstrain($aRow,$aType,$aColor='black',$aArrowSize=ARROW_S2,$aArrowType=ARROWT_SOLID) { - $this->constraints[] = new GanttConstraint($aRow, $aType, $aColor, $aArrowSize, $aArrowType); + $this->constraints[] = new GanttConstraint($aRow, $aType, $aColor, $aArrowSize, $aArrowType); } function SetConstrainPos($xt,$yt,$xb,$yb) { - $this->iConstrainPos = array($xt,$yt,$xb,$yb); + $this->iConstrainPos = array($xt,$yt,$xb,$yb); } - /* - function GetConstrain() { - return array($this->iConstrainRow,$this->iConstrainType); - } - */ - function GetMinDate() { - return $this->iStart; + return $this->iStart; } function GetMaxDate() { - return $this->iStart; + return $this->iStart; } - + function SetCaptionMargin($aMarg) { - $this->iCaptionMargin=$aMarg; + $this->iCaptionMargin=$aMarg; } function GetAbsHeight($aImg) { - return 0; + return 0; } - + function GetLineNbr() { - return $this->iVPos; + return $this->iVPos; } function SetLabelLeftMargin($aOff) { - $this->iLabelLeftMargin=$aOff; - } + $this->iLabelLeftMargin=$aOff; + } function StrokeActInfo($aImg,$aScale,$aYPos) { - $cols=array(); - $aScale->actinfo->GetColStart($aImg,$cols,true); - $this->title->Stroke($aImg,$cols,$aYPos); + $cols=array(); + $aScale->actinfo->GetColStart($aImg,$cols,true); + $this->title->Stroke($aImg,$cols,$aYPos); } } //=================================================== // CLASS Progress -// Holds parameters for the progress indicator +// Holds parameters for the progress indicator // displyed within a bar //=================================================== class Progress { public $iProgress=-1; public $iPattern=GANTT_SOLID; public $iColor="black", $iFillColor='black'; - public $iDensity=98, $iHeight=0.65; - + public $iDensity=98, $iHeight=0.65; + function Set($aProg) { - if( $aProg < 0.0 || $aProg > 1.0 ) - JpGraphError::RaiseL(6027); -//("Progress value must in range [0, 1]"); - $this->iProgress = $aProg; + if( $aProg < 0.0 || $aProg > 1.0 ) { + JpGraphError::RaiseL(6027); + //("Progress value must in range [0, 1]"); + } + $this->iProgress = $aProg; } - function SetPattern($aPattern,$aColor="blue",$aDensity=98) { - $this->iPattern = $aPattern; - $this->iColor = $aColor; - $this->iDensity = $aDensity; + function SetPattern($aPattern,$aColor="blue",$aDensity=98) { + $this->iPattern = $aPattern; + $this->iColor = $aColor; + $this->iDensity = $aDensity; } function SetFillColor($aColor) { - $this->iFillColor = $aColor; + $this->iFillColor = $aColor; } - + function SetHeight($aHeight) { - $this->iHeight = $aHeight; + $this->iHeight = $aHeight; } } -DEFINE('GANTT_HGRID1',0); -DEFINE('GANTT_HGRID2',1); +define('GANTT_HGRID1',0); +define('GANTT_HGRID2',1); //=================================================== // CLASS HorizontalGridLine @@ -3070,70 +3174,70 @@ class HorizontalGridLine { private $line=null; private $iStart=0; // 0=from left margin, 1=just along header - function HorizontalGridLine() { - $this->line = new LineProperty(); - $this->line->SetColor('gray@0.4'); - $this->line->SetStyle('dashed'); + function __construct() { + $this->line = new LineProperty(); + $this->line->SetColor('gray@0.4'); + $this->line->SetStyle('dashed'); } - + function Show($aShow=true) { - $this->iShow = $aShow; + $this->iShow = $aShow; } function SetRowFillColor($aColor1,$aColor2='') { - $this->iRowColor1 = $aColor1; - $this->iRowColor2 = $aColor2; + $this->iRowColor1 = $aColor1; + $this->iRowColor2 = $aColor2; } function SetStart($aStart) { - $this->iStart = $aStart; + $this->iStart = $aStart; } function Stroke($aImg,$aScale) { - - if( ! $this->iShow ) return; - // Get horizontal width of line - /* - $limst = $aScale->iStartDate; - $limen = $aScale->iEndDate; - $xt = round($aScale->TranslateDate($aScale->iStartDate)); - $xb = round($aScale->TranslateDate($limen)); - */ + if( ! $this->iShow ) return; - if( $this->iStart === 0 ) { - $xt = $aImg->left_margin-1; - } - else { - $xt = round($aScale->TranslateDate($aScale->iStartDate))+1; - } + // Get horizontal width of line + /* + $limst = $aScale->iStartDate; + $limen = $aScale->iEndDate; + $xt = round($aScale->TranslateDate($aScale->iStartDate)); + $xb = round($aScale->TranslateDate($limen)); + */ - $xb = $aImg->width-$aImg->right_margin; + if( $this->iStart === 0 ) { + $xt = $aImg->left_margin-1; + } + else { + $xt = round($aScale->TranslateDate($aScale->iStartDate))+1; + } - $yt = round($aScale->TranslateVertPos(0)); - $yb = round($aScale->TranslateVertPos(1)); - $height = $yb - $yt; + $xb = $aImg->width-$aImg->right_margin; - // Loop around for all lines in the chart - for($i=0; $i < $aScale->iVertLines; ++$i ) { - $yb = $yt - $height; - $this->line->Stroke($aImg,$xt,$yb,$xb,$yb); - if( $this->iRowColor1 !== '' ) { - if( $i % 2 == 0 ) { - $aImg->PushColor($this->iRowColor1); - $aImg->FilledRectangle($xt,$yt,$xb,$yb); - $aImg->PopColor(); - } - elseif( $this->iRowColor2 !== '' ) { - $aImg->PushColor($this->iRowColor2); - $aImg->FilledRectangle($xt,$yt,$xb,$yb); - $aImg->PopColor(); - } - } - $yt = round($aScale->TranslateVertPos($i+1)); - } - $yb = $yt - $height; - $this->line->Stroke($aImg,$xt,$yb,$xb,$yb); + $yt = round($aScale->TranslateVertPos(0)); + $yb = round($aScale->TranslateVertPos(1)); + $height = $yb - $yt; + + // Loop around for all lines in the chart + for($i=0; $i < $aScale->iVertLines; ++$i ) { + $yb = $yt - $height; + $this->line->Stroke($aImg,$xt,$yb,$xb,$yb); + if( $this->iRowColor1 !== '' ) { + if( $i % 2 == 0 ) { + $aImg->PushColor($this->iRowColor1); + $aImg->FilledRectangle($xt,$yt,$xb,$yb); + $aImg->PopColor(); + } + elseif( $this->iRowColor2 !== '' ) { + $aImg->PushColor($this->iRowColor2); + $aImg->FilledRectangle($xt,$yt,$xb,$yb); + $aImg->PopColor(); + } + } + $yt = round($aScale->TranslateVertPos($i+1)); + } + $yb = $yt - $height; + $this->line->Stroke($aImg,$xt,$yb,$xb,$yb); } } @@ -3150,237 +3254,259 @@ class GanttBar extends GanttPlotObject { private $iFillColor="white",$iFrameColor="black"; private $iShadow=false,$iShadowColor="darkgray",$iShadowWidth=1,$iShadowFrame="black"; private $iPattern=GANTT_RDIAG,$iPatternColor="blue",$iPatternDensity=95; -//--------------- -// CONSTRUCTOR - function GanttBar($aPos,$aLabel,$aStart,$aEnd,$aCaption="",$aHeightFactor=0.6) { - parent::GanttPlotObject(); - $this->iStart = $aStart; - // Is the end date given as a date or as number of days added to start date? - if( is_string($aEnd) ) { - // If end date has been specified without a time we will asssume - // end date is at the end of that date - if( strpos($aEnd,':') === false ) - $this->iEnd = strtotime($aEnd)+SECPERDAY-1; - else - $this->iEnd = $aEnd; - } - elseif(is_int($aEnd) || is_float($aEnd) ) - $this->iEnd = strtotime($aStart)+round($aEnd*SECPERDAY); - $this->iVPos = $aPos; - $this->iHeightFactor = $aHeightFactor; - $this->title->Set($aLabel); - $this->caption = new TextProperty($aCaption); - $this->caption->Align("left","center"); - $this->leftMark =new PlotMark(); - $this->leftMark->Hide(); - $this->rightMark=new PlotMark(); - $this->rightMark->Hide(); - $this->progress = new Progress(); + private $iBreakStyle=false, $iBreakLineStyle='dotted',$iBreakLineWeight=1; + //--------------- + // CONSTRUCTOR + function __construct($aPos,$aLabel,$aStart,$aEnd,$aCaption="",$aHeightFactor=0.6) { + parent::__construct(); + $this->iStart = $aStart; + // Is the end date given as a date or as number of days added to start date? + if( is_string($aEnd) ) { + // If end date has been specified without a time we will asssume + // end date is at the end of that date + if( strpos($aEnd,':') === false ) { + $this->iEnd = strtotime($aEnd)+SECPERDAY-1; + } + else { + $this->iEnd = $aEnd; + } + } + elseif(is_int($aEnd) || is_float($aEnd) ) { + $this->iEnd = strtotime($aStart)+round($aEnd*SECPERDAY); + } + $this->iVPos = $aPos; + $this->iHeightFactor = $aHeightFactor; + $this->title->Set($aLabel); + $this->caption = new TextProperty($aCaption); + $this->caption->Align("left","center"); + $this->leftMark =new PlotMark(); + $this->leftMark->Hide(); + $this->rightMark=new PlotMark(); + $this->rightMark->Hide(); + $this->progress = new Progress(); } - -//--------------- -// PUBLIC METHODS + + //--------------- + // PUBLIC METHODS function SetShadow($aShadow=true,$aColor="gray") { - $this->iShadow=$aShadow; - $this->iShadowColor=$aColor; + $this->iShadow=$aShadow; + $this->iShadowColor=$aColor; } - + + function SetBreakStyle($aFlg=true,$aLineStyle='dotted',$aLineWeight=1) { + $this->iBreakStyle = $aFlg; + $this->iBreakLineStyle = $aLineStyle; + $this->iBreakLineWeight = $aLineWeight; + } + function GetMaxDate() { - return $this->iEnd; + return $this->iEnd; } - + function SetHeight($aHeight) { - $this->iHeightFactor = $aHeight; + $this->iHeightFactor = $aHeight; } function SetColor($aColor) { - $this->iFrameColor = $aColor; + $this->iFrameColor = $aColor; } function SetFillColor($aColor) { - $this->iFillColor = $aColor; + $this->iFillColor = $aColor; } function GetAbsHeight($aImg) { - if( is_int($this->iHeightFactor) || $this->leftMark->show || $this->rightMark->show ) { - $m=-1; - if( is_int($this->iHeightFactor) ) - $m = $this->iHeightFactor; - if( $this->leftMark->show ) - $m = max($m,$this->leftMark->width*2); - if( $this->rightMark->show ) - $m = max($m,$this->rightMark->width*2); - return $m; - } - else - return -1; + if( is_int($this->iHeightFactor) || $this->leftMark->show || $this->rightMark->show ) { + $m=-1; + if( is_int($this->iHeightFactor) ) + $m = $this->iHeightFactor; + if( $this->leftMark->show ) + $m = max($m,$this->leftMark->width*2); + if( $this->rightMark->show ) + $m = max($m,$this->rightMark->width*2); + return $m; + } + else + return -1; } - - function SetPattern($aPattern,$aColor="blue",$aDensity=95) { - $this->iPattern = $aPattern; - $this->iPatternColor = $aColor; - $this->iPatternDensity = $aDensity; + + function SetPattern($aPattern,$aColor="blue",$aDensity=95) { + $this->iPattern = $aPattern; + $this->iPatternColor = $aColor; + $this->iPatternDensity = $aDensity; } function Stroke($aImg,$aScale) { - $factory = new RectPatternFactory(); - $prect = $factory->Create($this->iPattern,$this->iPatternColor); - $prect->SetDensity($this->iPatternDensity); + $factory = new RectPatternFactory(); + $prect = $factory->Create($this->iPattern,$this->iPatternColor); + $prect->SetDensity($this->iPatternDensity); - // If height factor is specified as a float between 0,1 then we take it as meaning - // percetage of the scale width between horizontal line. - // If it is an integer > 1 we take it to mean the absolute height in pixels - if( $this->iHeightFactor > -0.0 && $this->iHeightFactor <= 1.1) - $vs = $aScale->GetVertSpacing()*$this->iHeightFactor; - elseif(is_int($this->iHeightFactor) && $this->iHeightFactor>2 && $this->iHeightFactor < 200 ) - $vs = $this->iHeightFactor; - else - JpGraphError::RaiseL(6028,$this->iHeightFactor); -//("Specified height (".$this->iHeightFactor.") for gantt bar is out of range."); - - // Clip date to min max dates to show - $st = $aScale->NormalizeDate($this->iStart); - $en = $aScale->NormalizeDate($this->iEnd); - + // If height factor is specified as a float between 0,1 then we take it as meaning + // percetage of the scale width between horizontal line. + // If it is an integer > 1 we take it to mean the absolute height in pixels + if( $this->iHeightFactor > -0.0 && $this->iHeightFactor <= 1.1) + $vs = $aScale->GetVertSpacing()*$this->iHeightFactor; + elseif(is_int($this->iHeightFactor) && $this->iHeightFactor>2 && $this->iHeightFactor < 200 ) + $vs = $this->iHeightFactor; + else { + JpGraphError::RaiseL(6028,$this->iHeightFactor); + // ("Specified height (".$this->iHeightFactor.") for gantt bar is out of range."); + } - $limst = max($st,$aScale->iStartDate); - $limen = min($en,$aScale->iEndDate); - - $xt = round($aScale->TranslateDate($limst)); - $xb = round($aScale->TranslateDate($limen)); - $yt = round($aScale->TranslateVertPos($this->iVPos)-$vs-($aScale->GetVertSpacing()/2-$vs/2)); - $yb = round($aScale->TranslateVertPos($this->iVPos)-($aScale->GetVertSpacing()/2-$vs/2)); - $middle = round($yt+($yb-$yt)/2); - $this->StrokeActInfo($aImg,$aScale,$middle); + // Clip date to min max dates to show + $st = $aScale->NormalizeDate($this->iStart); + $en = $aScale->NormalizeDate($this->iEnd); - // CSIM for title - if( ! empty($this->title->csimtarget) ) { - $colwidth = $this->title->GetColWidth($aImg); - $colstarts=array(); - $aScale->actinfo->GetColStart($aImg,$colstarts,true); - $n = min(count($colwidth),count($this->title->csimtarget)); - for( $i=0; $i < $n; ++$i ) { - $title_xt = $colstarts[$i]; - $title_xb = $title_xt + $colwidth[$i]; - $coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb"; + $limst = max($st,$aScale->iStartDate); + $limen = min($en,$aScale->iEndDate); - if( ! empty($this->title->csimtarget[$i]) ) { - $this->csimarea .= "title->csimtarget[$i]."\""; - - if( ! empty($this->title->csimwintarget[$i]) ) { - $this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\" "; - } - - if( ! empty($this->title->csimalt[$i]) ) { - $tmp = $this->title->csimalt[$i]; - $this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimarea .= " />\n"; - } - } - } - - // Check if the bar is totally outside the current scale range - if( $en < $aScale->iStartDate || $st > $aScale->iEndDate ) - return; - + $xt = round($aScale->TranslateDate($limst)); + $xb = round($aScale->TranslateDate($limen)); + $yt = round($aScale->TranslateVertPos($this->iVPos)-$vs-($aScale->GetVertSpacing()/2-$vs/2)); + $yb = round($aScale->TranslateVertPos($this->iVPos)-($aScale->GetVertSpacing()/2-$vs/2)); + $middle = round($yt+($yb-$yt)/2); + $this->StrokeActInfo($aImg,$aScale,$middle); - // Remember the positions for the bar - $this->SetConstrainPos($xt,$yt,$xb,$yb); - - $prect->ShowFrame(false); - $prect->SetBackground($this->iFillColor); - if( $this->iShadow ) { - $aImg->SetColor($this->iFrameColor); - $aImg->ShadowRectangle($xt,$yt,$xb,$yb,$this->iFillColor,$this->iShadowWidth,$this->iShadowColor); - $prect->SetPos(new Rectangle($xt+1,$yt+1,$xb-$xt-$this->iShadowWidth-2,$yb-$yt-$this->iShadowWidth-2)); - $prect->Stroke($aImg); - } - else { - $prect->SetPos(new Rectangle($xt,$yt,$xb-$xt+1,$yb-$yt+1)); - $prect->Stroke($aImg); - $aImg->SetColor($this->iFrameColor); - $aImg->Rectangle($xt,$yt,$xb,$yb); - } + // CSIM for title + if( ! empty($this->title->csimtarget) ) { + $colwidth = $this->title->GetColWidth($aImg); + $colstarts=array(); + $aScale->actinfo->GetColStart($aImg,$colstarts,true); + $n = min(count($colwidth),count($this->title->csimtarget)); + for( $i=0; $i < $n; ++$i ) { + $title_xt = $colstarts[$i]; + $title_xb = $title_xt + $colwidth[$i]; + $coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb"; - // CSIM for bar - if( ! empty($this->csimtarget) ) { + if( ! empty($this->title->csimtarget[$i]) ) { + $this->csimarea .= "title->csimtarget[$i]."\""; - $coords = "$xt,$yt,$xb,$yt,$xb,$yb,$xt,$yb"; - $this->csimarea .= "csimtarget."\""; - - if( !empty($this->csimwintarget) ) { - $this->csimarea .= " target=\"".$this->csimwintarget."\" "; - } + if( ! empty($this->title->csimwintarget[$i]) ) { + $this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\" "; + } - if( $this->csimalt != '' ) { - $tmp = $this->csimalt; - $this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimarea .= " />\n"; - } + if( ! empty($this->title->csimalt[$i]) ) { + $tmp = $this->title->csimalt[$i]; + $this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimarea .= " />\n"; + } + } + } - // Draw progress bar inside activity bar - if( $this->progress->iProgress > 0 ) { - - $xtp = $aScale->TranslateDate($st); - $xbp = $aScale->TranslateDate($en); - $len = ($xbp-$xtp)*$this->progress->iProgress; + // Check if the bar is totally outside the current scale range + if( $en < $aScale->iStartDate || $st > $aScale->iEndDate ) + return; - $endpos = $xtp+$len; - if( $endpos > $xt ) { - // Take away the length of the progress that is not visible (before the start date) - $len -= ($xt-$xtp); + // Remember the positions for the bar + $this->SetConstrainPos($xt,$yt,$xb,$yb); - // Is the the progress bar visible after the start date? - if( $xtp < $xt ) - $xtp = $xt; - - // Make sure that the progess bar doesn't extend over the end date - if( $xtp+$len-1 > $xb ) - $len = $xb - $xtp ; - - $prog = $factory->Create($this->progress->iPattern,$this->progress->iColor); - $prog->SetDensity($this->progress->iDensity); - $prog->SetBackground($this->progress->iFillColor); - $barheight = ($yb-$yt+1); - if( $this->iShadow ) - $barheight -= $this->iShadowWidth; - $progressheight = floor($barheight*$this->progress->iHeight); - $marg = ceil(($barheight-$progressheight)/2); - $pos = new Rectangle($xtp,$yt + $marg, $len,$barheight-2*$marg); - $prog->SetPos($pos); - $prog->Stroke($aImg); - } - } - - // We don't plot the end mark if the bar has been capped - if( $limst == $st ) { - $y = $middle; - // We treat the RIGHT and LEFT triangle mark a little bi - // special so that these marks are placed right under the - // bar. - if( $this->leftMark->GetType() == MARK_LEFTTRIANGLE ) { - $y = $yb ; - } - $this->leftMark->Stroke($aImg,$xt,$y); - } - if( $limen == $en ) { - $y = $middle; - // We treat the RIGHT and LEFT triangle mark a little bi - // special so that these marks are placed right under the - // bar. - if( $this->rightMark->GetType() == MARK_RIGHTTRIANGLE ) { - $y = $yb ; - } - $this->rightMark->Stroke($aImg,$xb,$y); - - $margin = $this->iCaptionMargin; - if( $this->rightMark->show ) - $margin += $this->rightMark->GetWidth(); - $this->caption->Stroke($aImg,$xb+$margin,$middle); - } + + + $prect->ShowFrame(false); + $prect->SetBackground($this->iFillColor); + if( $this->iBreakStyle ) { + $aImg->SetColor($this->iFrameColor); + $olds = $aImg->SetLineStyle($this->iBreakLineStyle); + $oldw = $aImg->SetLineWeight($this->iBreakLineWeight); + $aImg->StyleLine($xt,$yt,$xb,$yt); + $aImg->StyleLine($xt,$yb,$xb,$yb); + $aImg->SetLineStyle($olds); + $aImg->SetLineWeight($oldw); + } + else { + if( $this->iShadow ) { + $aImg->SetColor($this->iFrameColor); + $aImg->ShadowRectangle($xt,$yt,$xb,$yb,$this->iFillColor,$this->iShadowWidth,$this->iShadowColor); + $prect->SetPos(new Rectangle($xt+1,$yt+1,$xb-$xt-$this->iShadowWidth-2,$yb-$yt-$this->iShadowWidth-2)); + $prect->Stroke($aImg); + } + else { + $prect->SetPos(new Rectangle($xt,$yt,$xb-$xt+1,$yb-$yt+1)); + $prect->Stroke($aImg); + $aImg->SetColor($this->iFrameColor); + $aImg->Rectangle($xt,$yt,$xb,$yb); + } + } + // CSIM for bar + if( ! empty($this->csimtarget) ) { + + $coords = "$xt,$yt,$xb,$yt,$xb,$yb,$xt,$yb"; + $this->csimarea .= "csimtarget."\""; + + if( !empty($this->csimwintarget) ) { + $this->csimarea .= " target=\"".$this->csimwintarget."\" "; + } + + if( $this->csimalt != '' ) { + $tmp = $this->csimalt; + $this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimarea .= " />\n"; + } + + // Draw progress bar inside activity bar + if( $this->progress->iProgress > 0 ) { + + $xtp = $aScale->TranslateDate($st); + $xbp = $aScale->TranslateDate($en); + $len = ($xbp-$xtp)*$this->progress->iProgress; + + $endpos = $xtp+$len; + if( $endpos > $xt ) { + + // Take away the length of the progress that is not visible (before the start date) + $len -= ($xt-$xtp); + + // Is the the progress bar visible after the start date? + if( $xtp < $xt ) + $xtp = $xt; + + // Make sure that the progess bar doesn't extend over the end date + if( $xtp+$len-1 > $xb ) + $len = $xb - $xtp ; + + $prog = $factory->Create($this->progress->iPattern,$this->progress->iColor); + $prog->SetDensity($this->progress->iDensity); + $prog->SetBackground($this->progress->iFillColor); + $barheight = ($yb-$yt+1); + if( $this->iShadow ) + $barheight -= $this->iShadowWidth; + $progressheight = floor($barheight*$this->progress->iHeight); + $marg = ceil(($barheight-$progressheight)/2); + $pos = new Rectangle($xtp,$yt + $marg, $len,$barheight-2*$marg); + $prog->SetPos($pos); + $prog->Stroke($aImg); + } + } + + // We don't plot the end mark if the bar has been capped + if( $limst == $st ) { + $y = $middle; + // We treat the RIGHT and LEFT triangle mark a little bi + // special so that these marks are placed right under the + // bar. + if( $this->leftMark->GetType() == MARK_LEFTTRIANGLE ) { + $y = $yb ; + } + $this->leftMark->Stroke($aImg,$xt,$y); + } + if( $limen == $en ) { + $y = $middle; + // We treat the RIGHT and LEFT triangle mark a little bi + // special so that these marks are placed right under the + // bar. + if( $this->rightMark->GetType() == MARK_RIGHTTRIANGLE ) { + $y = $yb ; + } + $this->rightMark->Stroke($aImg,$xb,$y); + + $margin = $this->iCaptionMargin; + if( $this->rightMark->show ) + $margin += $this->rightMark->GetWidth(); + $this->caption->Stroke($aImg,$xb+$margin,$middle); + } } } @@ -3390,90 +3516,90 @@ class GanttBar extends GanttPlotObject { //=================================================== class MileStone extends GanttPlotObject { public $mark; - -//--------------- -// CONSTRUCTOR - function MileStone($aVPos,$aLabel,$aDate,$aCaption="") { - GanttPlotObject::GanttPlotObject(); - $this->caption->Set($aCaption); - $this->caption->Align("left","center"); - $this->caption->SetFont(FF_FONT1,FS_BOLD); - $this->title->Set($aLabel); - $this->title->SetColor("darkred"); - $this->mark = new PlotMark(); - $this->mark->SetWidth(10); - $this->mark->SetType(MARK_DIAMOND); - $this->mark->SetColor("darkred"); - $this->mark->SetFillColor("darkred"); - $this->iVPos = $aVPos; - $this->iStart = $aDate; + + //--------------- + // CONSTRUCTOR + function __construct($aVPos,$aLabel,$aDate,$aCaption="") { + GanttPlotObject::__construct(); + $this->caption->Set($aCaption); + $this->caption->Align("left","center"); + $this->caption->SetFont(FF_FONT1,FS_BOLD); + $this->title->Set($aLabel); + $this->title->SetColor("darkred"); + $this->mark = new PlotMark(); + $this->mark->SetWidth(10); + $this->mark->SetType(MARK_DIAMOND); + $this->mark->SetColor("darkred"); + $this->mark->SetFillColor("darkred"); + $this->iVPos = $aVPos; + $this->iStart = $aDate; } - -//--------------- -// PUBLIC METHODS - + + //--------------- + // PUBLIC METHODS + function GetAbsHeight($aImg) { - return max($this->title->GetHeight($aImg),$this->mark->GetWidth()); + return max($this->title->GetHeight($aImg),$this->mark->GetWidth()); } - + function Stroke($aImg,$aScale) { - // Put the mark in the middle at the middle of the day - $d = $aScale->NormalizeDate($this->iStart)+SECPERDAY/2; - $x = $aScale->TranslateDate($d); - $y = $aScale->TranslateVertPos($this->iVPos)-($aScale->GetVertSpacing()/2); + // Put the mark in the middle at the middle of the day + $d = $aScale->NormalizeDate($this->iStart)+SECPERDAY/2; + $x = $aScale->TranslateDate($d); + $y = $aScale->TranslateVertPos($this->iVPos)-($aScale->GetVertSpacing()/2); - $this->StrokeActInfo($aImg,$aScale,$y); + $this->StrokeActInfo($aImg,$aScale,$y); - // CSIM for title - if( ! empty($this->title->csimtarget) ) { - - $yt = round($y - $this->title->GetHeight($aImg)/2); - $yb = round($y + $this->title->GetHeight($aImg)/2); + // CSIM for title + if( ! empty($this->title->csimtarget) ) { - $colwidth = $this->title->GetColWidth($aImg); - $colstarts=array(); - $aScale->actinfo->GetColStart($aImg,$colstarts,true); - $n = min(count($colwidth),count($this->title->csimtarget)); - for( $i=0; $i < $n; ++$i ) { - $title_xt = $colstarts[$i]; - $title_xb = $title_xt + $colwidth[$i]; - $coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb"; - - if( !empty($this->title->csimtarget[$i]) ) { - - $this->csimarea .= "title->csimtarget[$i]."\""; - - if( !empty($this->title->csimwintarget[$i]) ) { - $this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\""; - } - - if( ! empty($this->title->csimalt[$i]) ) { - $tmp = $this->title->csimalt[$i]; - $this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimarea .= " />\n"; - } - } - } + $yt = round($y - $this->title->GetHeight($aImg)/2); + $yb = round($y + $this->title->GetHeight($aImg)/2); - if( $d < $aScale->iStartDate || $d > $aScale->iEndDate ) - return; + $colwidth = $this->title->GetColWidth($aImg); + $colstarts=array(); + $aScale->actinfo->GetColStart($aImg,$colstarts,true); + $n = min(count($colwidth),count($this->title->csimtarget)); + for( $i=0; $i < $n; ++$i ) { + $title_xt = $colstarts[$i]; + $title_xb = $title_xt + $colwidth[$i]; + $coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb"; - // Remember the coordinates for any constrains linking to - // this milestone - $w = $this->mark->GetWidth()/2; - $this->SetConstrainPos($x,round($y-$w),$x,round($y+$w)); - - // Setup CSIM - if( $this->csimtarget != '' ) { - $this->mark->SetCSIMTarget( $this->csimtarget ); - $this->mark->SetCSIMAlt( $this->csimalt ); - } - - $this->mark->Stroke($aImg,$x,$y); - $this->caption->Stroke($aImg,$x+$this->mark->width/2+$this->iCaptionMargin,$y); + if( !empty($this->title->csimtarget[$i]) ) { - $this->csimarea .= $this->mark->GetCSIMAreas(); + $this->csimarea .= "title->csimtarget[$i]."\""; + + if( !empty($this->title->csimwintarget[$i]) ) { + $this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\""; + } + + if( ! empty($this->title->csimalt[$i]) ) { + $tmp = $this->title->csimalt[$i]; + $this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimarea .= " />\n"; + } + } + } + + if( $d < $aScale->iStartDate || $d > $aScale->iEndDate ) + return; + + // Remember the coordinates for any constrains linking to + // this milestone + $w = $this->mark->GetWidth()/2; + $this->SetConstrainPos($x,round($y-$w),$x,round($y+$w)); + + // Setup CSIM + if( $this->csimtarget != '' ) { + $this->mark->SetCSIMTarget( $this->csimtarget ); + $this->mark->SetCSIMAlt( $this->csimalt ); + } + + $this->mark->Stroke($aImg,$x,$y); + $this->caption->Stroke($aImg,$x+$this->mark->width/2+$this->iCaptionMargin,$y); + + $this->csimarea .= $this->mark->GetCSIMAreas(); } } @@ -3484,131 +3610,157 @@ class MileStone extends GanttPlotObject { //=================================================== class TextPropertyBelow extends TextProperty { - function TextPropertyBelow($aTxt='') { - parent::TextProperty($aTxt); + function __construct($aTxt='') { + parent::__construct($aTxt); } function GetColWidth($aImg,$aMargin=0) { - // Since we are not stroking the title in the columns - // but rather under the graph we want this to return 0. - return array(0); + // Since we are not stroking the title in the columns + // but rather under the graph we want this to return 0. + return array(0); } } class GanttVLine extends GanttPlotObject { - private $iLine,$title_margin=3, $iDayOffset=1; - -//--------------- -// CONSTRUCTOR - function GanttVLine($aDate,$aTitle="",$aColor="black",$aWeight=3,$aStyle="dashed") { - GanttPlotObject::GanttPlotObject(); - $this->iLine = new LineProperty(); - $this->iLine->SetColor($aColor); - $this->iLine->SetWeight($aWeight); - $this->iLine->SetStyle($aStyle); - $this->iStart = $aDate; - $this->title = new TextPropertyBelow(); - $this->title->Set($aTitle); + private $iLine,$title_margin=3, $iDayOffset=0.5; + private $iStartRow = -1, $iEndRow = -1; + + //--------------- + // CONSTRUCTOR + function __construct($aDate,$aTitle="",$aColor="darkred",$aWeight=2,$aStyle="solid") { + GanttPlotObject::__construct(); + $this->iLine = new LineProperty(); + $this->iLine->SetColor($aColor); + $this->iLine->SetWeight($aWeight); + $this->iLine->SetStyle($aStyle); + $this->iStart = $aDate; + $this->title = new TextPropertyBelow(); + $this->title->Set($aTitle); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS + + // Set start and end rows for the VLine. By default the entire heigh of the + // Gantt chart is used + function SetRowSpan($aStart, $aEnd=-1) { + $this->iStartRow = $aStart; + $this->iEndRow = $aEnd; + } function SetDayOffset($aOff=0.5) { - if( $aOff < 0.0 || $aOff > 1.0 ) - JpGraphError::RaiseL(6029); -//("Offset for vertical line must be in range [0,1]"); - $this->iDayOffset = $aOff; + if( $aOff < 0.0 || $aOff > 1.0 ) { + JpGraphError::RaiseL(6029); + //("Offset for vertical line must be in range [0,1]"); + } + $this->iDayOffset = $aOff; } - + function SetTitleMargin($aMarg) { - $this->title_margin = $aMarg; + $this->title_margin = $aMarg; } - + + function SetWeight($aWeight) { + $this->iLine->SetWeight($aWeight); + } + function Stroke($aImg,$aScale) { - $d = $aScale->NormalizeDate($this->iStart); - if( $d < $aScale->iStartDate || $d > $aScale->iEndDate ) - return; - if($this->iDayOffset != 0.0) - $d += 24*60*60*$this->iDayOffset; - $x = $aScale->TranslateDate($d); - $y1 = $aScale->iVertHeaderSize+$aImg->top_margin; - $y2 = $aImg->height - $aImg->bottom_margin; - $this->iLine->Stroke($aImg,$x,$y1,$x,$y2); - $this->title->Align("center","top"); - $this->title->Stroke($aImg,$x,$y2+$this->title_margin); - } + $d = $aScale->NormalizeDate($this->iStart); + if( $d < $aScale->iStartDate || $d > $aScale->iEndDate ) + return; + if($this->iDayOffset != 0.0) + $d += 24*60*60*$this->iDayOffset; + $x = $aScale->TranslateDate($d);//d=1006858800, + + if( $this->iStartRow > -1 ) { + $y1 = $aScale->TranslateVertPos($this->iStartRow,true) ; + } + else { + $y1 = $aScale->iVertHeaderSize+$aImg->top_margin; + } + + if( $this->iEndRow > -1 ) { + $y2 = $aScale->TranslateVertPos($this->iEndRow); + } + else { + $y2 = $aImg->height - $aImg->bottom_margin; + } + + $this->iLine->Stroke($aImg,$x,$y1,$x,$y2); + $this->title->Align("center","top"); + $this->title->Stroke($aImg,$x,$y2+$this->title_margin); + } } //=================================================== // CLASS LinkArrow -// Handles the drawing of a an arrow +// Handles the drawing of a an arrow //=================================================== class LinkArrow { private $ix,$iy; private $isizespec = array( - array(2,3),array(3,5),array(3,8),array(6,15),array(8,22)); + array(2,3),array(3,5),array(3,8),array(6,15),array(8,22)); private $iDirection=ARROW_DOWN,$iType=ARROWT_SOLID,$iSize=ARROW_S2; private $iColor='black'; - function LinkArrow($x,$y,$aDirection,$aType=ARROWT_SOLID,$aSize=ARROW_S2) { - $this->iDirection = $aDirection; - $this->iType = $aType; - $this->iSize = $aSize; - $this->ix = $x; - $this->iy = $y; + function __construct($x,$y,$aDirection,$aType=ARROWT_SOLID,$aSize=ARROW_S2) { + $this->iDirection = $aDirection; + $this->iType = $aType; + $this->iSize = $aSize; + $this->ix = $x; + $this->iy = $y; } - + function SetColor($aColor) { - $this->iColor = $aColor; + $this->iColor = $aColor; } function SetSize($aSize) { - $this->iSize = $aSize; + $this->iSize = $aSize; } function SetType($aType) { - $this->iType = $aType; + $this->iType = $aType; } function Stroke($aImg) { - list($dx,$dy) = $this->isizespec[$this->iSize]; - $x = $this->ix; - $y = $this->iy; - switch ( $this->iDirection ) { - case ARROW_DOWN: - $c = array($x,$y,$x-$dx,$y-$dy,$x+$dx,$y-$dy,$x,$y); - break; - case ARROW_UP: - $c = array($x,$y,$x-$dx,$y+$dy,$x+$dx,$y+$dy,$x,$y); - break; - case ARROW_LEFT: - $c = array($x,$y,$x+$dy,$y-$dx,$x+$dy,$y+$dx,$x,$y); - break; - case ARROW_RIGHT: - $c = array($x,$y,$x-$dy,$y-$dx,$x-$dy,$y+$dx,$x,$y); - break; - default: - JpGraphError::RaiseL(6030); -//('Unknown arrow direction for link.'); - die(); - break; - } - $aImg->SetColor($this->iColor); - switch( $this->iType ) { - case ARROWT_SOLID: - $aImg->FilledPolygon($c); - break; - case ARROWT_OPEN: - $aImg->Polygon($c); - break; - default: - JpGraphError::RaiseL(6031); -//('Unknown arrow type for link.'); - die(); - break; - } + list($dx,$dy) = $this->isizespec[$this->iSize]; + $x = $this->ix; + $y = $this->iy; + switch ( $this->iDirection ) { + case ARROW_DOWN: + $c = array($x,$y,$x-$dx,$y-$dy,$x+$dx,$y-$dy,$x,$y); + break; + case ARROW_UP: + $c = array($x,$y,$x-$dx,$y+$dy,$x+$dx,$y+$dy,$x,$y); + break; + case ARROW_LEFT: + $c = array($x,$y,$x+$dy,$y-$dx,$x+$dy,$y+$dx,$x,$y); + break; + case ARROW_RIGHT: + $c = array($x,$y,$x-$dy,$y-$dx,$x-$dy,$y+$dx,$x,$y); + break; + default: + JpGraphError::RaiseL(6030); + //('Unknown arrow direction for link.'); + die(); + break; + } + $aImg->SetColor($this->iColor); + switch( $this->iType ) { + case ARROWT_SOLID: + $aImg->FilledPolygon($c); + break; + case ARROWT_OPEN: + $aImg->Polygon($c); + break; + default: + JpGraphError::RaiseL(6031); + //('Unknown arrow type for link.'); + die(); + break; + } } } @@ -3623,179 +3775,179 @@ class GanttLink { private $iColor='black',$iWeight=1; private $iArrowSize=ARROW_S2,$iArrowType=ARROWT_SOLID; - function GanttLink($x1=0,$y1=0,$x2=0,$y2=0) { - $this->ix1 = $x1; - $this->ix2 = $x2; - $this->iy1 = $y1; - $this->iy2 = $y2; + function __construct($x1=0,$y1=0,$x2=0,$y2=0) { + $this->ix1 = $x1; + $this->ix2 = $x2; + $this->iy1 = $y1; + $this->iy2 = $y2; } function SetPos($x1,$y1,$x2,$y2) { - $this->ix1 = $x1; - $this->ix2 = $x2; - $this->iy1 = $y1; - $this->iy2 = $y2; + $this->ix1 = $x1; + $this->ix2 = $x2; + $this->iy1 = $y1; + $this->iy2 = $y2; } function SetPath($aPath) { - $this->iPathType = $aPath; + $this->iPathType = $aPath; } function SetColor($aColor) { - $this->iColor = $aColor; + $this->iColor = $aColor; } function SetArrow($aSize,$aType=ARROWT_SOLID) { - $this->iArrowSize = $aSize; - $this->iArrowType = $aType; + $this->iArrowSize = $aSize; + $this->iArrowType = $aType; } - + function SetWeight($aWeight) { - $this->iWeight = $aWeight; + $this->iWeight = $aWeight; } function Stroke($aImg) { - // The way the path for the arrow is constructed is partly based - // on some heuristics. This is not an exact science but draws the - // path in a way that, for me, makes esthetic sence. For example - // if the start and end activities are very close we make a small - // detour to endter the target horixontally. If there are more - // space between axctivities then no suh detour is made and the - // target is "hit" directly vertical. I have tried to keep this - // simple. no doubt this could become almost infinitive complex - // and have some real AI. Feel free to modify this. - // This will no-doubt be tweaked as times go by. One design aim - // is to avoid having the user choose what types of arrow - // he wants. + // The way the path for the arrow is constructed is partly based + // on some heuristics. This is not an exact science but draws the + // path in a way that, for me, makes esthetic sence. For example + // if the start and end activities are very close we make a small + // detour to endter the target horixontally. If there are more + // space between axctivities then no suh detour is made and the + // target is "hit" directly vertical. I have tried to keep this + // simple. no doubt this could become almost infinitive complex + // and have some real AI. Feel free to modify this. + // This will no-doubt be tweaked as times go by. One design aim + // is to avoid having the user choose what types of arrow + // he wants. - // The arrow is drawn between (x1,y1) to (x2,y2) - $x1 = $this->ix1 ; - $x2 = $this->ix2 ; - $y1 = $this->iy1 ; - $y2 = $this->iy2 ; + // The arrow is drawn between (x1,y1) to (x2,y2) + $x1 = $this->ix1 ; + $x2 = $this->ix2 ; + $y1 = $this->iy1 ; + $y2 = $this->iy2 ; - // Depending on if the target is below or above we have to - // handle thi different. - if( $y2 > $y1 ) { - $arrowtype = ARROW_DOWN; - $midy = round(($y2-$y1)/2+$y1); - if( $x2 > $x1 ) { - switch ( $this->iPathType ) { - case 0: - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - break; - case 1: - case 2: - case 3: - $c = array($x1,$y1,$x2,$y1,$x2,$y2); - break; - default: - JpGraphError::RaiseL(6032,$this->iPathType); -//('Internal error: Unknown path type (='.$this->iPathType .') specified for link.'); - exit(1); - break; - } - } - else { - switch ( $this->iPathType ) { - case 0: - case 1: - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - break; - case 2: - // Always extend out horizontally a bit from the first point - // If we draw a link back in time (end to start) and the bars - // are very close we also change the path so it comes in from - // the left on the activity - $c = array($x1,$y1,$x1+$this->iPathExtend,$y1, - $x1+$this->iPathExtend,$midy, - $x2,$midy,$x2,$y2); - break; - case 3: - if( $y2-$midy < 6 ) { - $c = array($x1,$y1,$x1,$midy, - $x2-$this->iPathExtend,$midy, - $x2-$this->iPathExtend,$y2, - $x2,$y2); - $arrowtype = ARROW_RIGHT; - } - else { - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - } - break; - default: - JpGraphError::RaiseL(6032,$this->iPathType); -//('Internal error: Unknown path type specified for link.'); - exit(1); - break; - } - } - $arrow = new LinkArrow($x2,$y2,$arrowtype); - } - else { - // Y2 < Y1 - $arrowtype = ARROW_UP; - $midy = round(($y1-$y2)/2+$y2); - if( $x2 > $x1 ) { - switch ( $this->iPathType ) { - case 0: - case 1: - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - break; - case 3: - if( $midy-$y2 < 8 ) { - $arrowtype = ARROW_RIGHT; - $c = array($x1,$y1,$x1,$y2,$x2,$y2); - } - else { - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - } - break; - default: - JpGraphError::RaiseL(6032,$this->iPathType); -//('Internal error: Unknown path type specified for link.'); - break; - } - } - else { - switch ( $this->iPathType ) { - case 0: - case 1: - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - break; - case 2: - // Always extend out horizontally a bit from the first point - $c = array($x1,$y1,$x1+$this->iPathExtend,$y1, - $x1+$this->iPathExtend,$midy, - $x2,$midy,$x2,$y2); - break; - case 3: - if( $midy-$y2 < 16 ) { - $arrowtype = ARROW_RIGHT; - $c = array($x1,$y1,$x1,$midy,$x2-$this->iPathExtend,$midy, - $x2-$this->iPathExtend,$y2, - $x2,$y2); - } - else { - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - } - break; - default: - JpGraphError::RaiseL(6032,$this->iPathType); -//('Internal error: Unknown path type specified for link.'); - break; - } - } - $arrow = new LinkArrow($x2,$y2,$arrowtype); - } - $aImg->SetColor($this->iColor); - $aImg->SetLineWeight($this->iWeight); - $aImg->Polygon($c); - $aImg->SetLineWeight(1); - $arrow->SetColor($this->iColor); - $arrow->SetSize($this->iArrowSize); - $arrow->SetType($this->iArrowType); - $arrow->Stroke($aImg); + // Depending on if the target is below or above we have to + // handle thi different. + if( $y2 > $y1 ) { + $arrowtype = ARROW_DOWN; + $midy = round(($y2-$y1)/2+$y1); + if( $x2 > $x1 ) { + switch ( $this->iPathType ) { + case 0: + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + break; + case 1: + case 2: + case 3: + $c = array($x1,$y1,$x2,$y1,$x2,$y2); + break; + default: + JpGraphError::RaiseL(6032,$this->iPathType); + //('Internal error: Unknown path type (='.$this->iPathType .') specified for link.'); + exit(1); + break; + } + } + else { + switch ( $this->iPathType ) { + case 0: + case 1: + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + break; + case 2: + // Always extend out horizontally a bit from the first point + // If we draw a link back in time (end to start) and the bars + // are very close we also change the path so it comes in from + // the left on the activity + $c = array($x1,$y1,$x1+$this->iPathExtend,$y1, + $x1+$this->iPathExtend,$midy, + $x2,$midy,$x2,$y2); + break; + case 3: + if( $y2-$midy < 6 ) { + $c = array($x1,$y1,$x1,$midy, + $x2-$this->iPathExtend,$midy, + $x2-$this->iPathExtend,$y2, + $x2,$y2); + $arrowtype = ARROW_RIGHT; + } + else { + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + } + break; + default: + JpGraphError::RaiseL(6032,$this->iPathType); + //('Internal error: Unknown path type specified for link.'); + exit(1); + break; + } + } + $arrow = new LinkArrow($x2,$y2,$arrowtype); + } + else { + // Y2 < Y1 + $arrowtype = ARROW_UP; + $midy = round(($y1-$y2)/2+$y2); + if( $x2 > $x1 ) { + switch ( $this->iPathType ) { + case 0: + case 1: + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + break; + case 3: + if( $midy-$y2 < 8 ) { + $arrowtype = ARROW_RIGHT; + $c = array($x1,$y1,$x1,$y2,$x2,$y2); + } + else { + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + } + break; + default: + JpGraphError::RaiseL(6032,$this->iPathType); + //('Internal error: Unknown path type specified for link.'); + break; + } + } + else { + switch ( $this->iPathType ) { + case 0: + case 1: + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + break; + case 2: + // Always extend out horizontally a bit from the first point + $c = array($x1,$y1,$x1+$this->iPathExtend,$y1, + $x1+$this->iPathExtend,$midy, + $x2,$midy,$x2,$y2); + break; + case 3: + if( $midy-$y2 < 16 ) { + $arrowtype = ARROW_RIGHT; + $c = array($x1,$y1,$x1,$midy,$x2-$this->iPathExtend,$midy, + $x2-$this->iPathExtend,$y2, + $x2,$y2); + } + else { + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + } + break; + default: + JpGraphError::RaiseL(6032,$this->iPathType); + //('Internal error: Unknown path type specified for link.'); + break; + } + } + $arrow = new LinkArrow($x2,$y2,$arrowtype); + } + $aImg->SetColor($this->iColor); + $aImg->SetLineWeight($this->iWeight); + $aImg->Polygon($c); + $aImg->SetLineWeight(1); + $arrow->SetColor($this->iColor); + $arrow->SetSize($this->iArrowSize); + $arrow->SetType($this->iArrowType); + $arrow->Stroke($aImg); } } diff --git a/libs/jpgraph/jpgraph_gb2312.php b/libs/jpgraph/jpgraph_gb2312.php index 352ef53..bfaa58a 100644 --- a/libs/jpgraph/jpgraph_gb2312.php +++ b/libs/jpgraph/jpgraph_gb2312.php @@ -1,1552 +1,1552 @@ 12288, 8482 => 12289, 8483 => 12290, 8484 => 12539, 8485 => 713, - 8486 => 711, 8487 => 168, 8488 => 12291, 8489 => 12293, 8490 => 8213, - 8491 => 65374, 8492 => 8214, 8493 => 8230, 8494 => 8216, 8495 => 8217, - 8496 => 8220, 8497 => 8221, 8498 => 12308, 8499 => 12309, 8500 => 12296, - 8501 => 12297, 8502 => 12298, 8503 => 12299, 8504 => 12300, 8505 => 12301, - 8506 => 12302, 8507 => 12303, 8508 => 12310, 8509 => 12311, 8510 => 12304, - 8511 => 12305, 8512 => 177, 8513 => 215, 8514 => 247, 8515 => 8758, - 8516 => 8743, 8517 => 8744, 8518 => 8721, 8519 => 8719, 8520 => 8746, - 8521 => 8745, 8522 => 8712, 8523 => 8759, 8524 => 8730, 8525 => 8869, - 8526 => 8741, 8527 => 8736, 8528 => 8978, 8529 => 8857, 8530 => 8747, - 8531 => 8750, 8532 => 8801, 8533 => 8780, 8534 => 8776, 8535 => 8765, - 8536 => 8733, 8537 => 8800, 8538 => 8814, 8539 => 8815, 8540 => 8804, - 8541 => 8805, 8542 => 8734, 8543 => 8757, 8544 => 8756, 8545 => 9794, - 8546 => 9792, 8547 => 176, 8548 => 8242, 8549 => 8243, 8550 => 8451, - 8551 => 65284, 8552 => 164, 8553 => 65504, 8554 => 65505, 8555 => 8240, - 8556 => 167, 8557 => 8470, 8558 => 9734, 8559 => 9733, 8560 => 9675, - 8561 => 9679, 8562 => 9678, 8563 => 9671, 8564 => 9670, 8565 => 9633, - 8566 => 9632, 8567 => 9651, 8568 => 9650, 8569 => 8251, 8570 => 8594, - 8571 => 8592, 8572 => 8593, 8573 => 8595, 8574 => 12307, 8753 => 9352, - 8754 => 9353, 8755 => 9354, 8756 => 9355, 8757 => 9356, 8758 => 9357, - 8759 => 9358, 8760 => 9359, 8761 => 9360, 8762 => 9361, 8763 => 9362, - 8764 => 9363, 8765 => 9364, 8766 => 9365, 8767 => 9366, 8768 => 9367, - 8769 => 9368, 8770 => 9369, 8771 => 9370, 8772 => 9371, 8773 => 9332, - 8774 => 9333, 8775 => 9334, 8776 => 9335, 8777 => 9336, 8778 => 9337, - 8779 => 9338, 8780 => 9339, 8781 => 9340, 8782 => 9341, 8783 => 9342, - 8784 => 9343, 8785 => 9344, 8786 => 9345, 8787 => 9346, 8788 => 9347, - 8789 => 9348, 8790 => 9349, 8791 => 9350, 8792 => 9351, 8793 => 9312, - 8794 => 9313, 8795 => 9314, 8796 => 9315, 8797 => 9316, 8798 => 9317, - 8799 => 9318, 8800 => 9319, 8801 => 9320, 8802 => 9321, 8805 => 12832, - 8806 => 12833, 8807 => 12834, 8808 => 12835, 8809 => 12836, 8810 => 12837, - 8811 => 12838, 8812 => 12839, 8813 => 12840, 8814 => 12841, 8817 => 8544, - 8818 => 8545, 8819 => 8546, 8820 => 8547, 8821 => 8548, 8822 => 8549, - 8823 => 8550, 8824 => 8551, 8825 => 8552, 8826 => 8553, 8827 => 8554, - 8828 => 8555, 8993 => 65281, 8994 => 65282, 8995 => 65283, 8996 => 65509, - 8997 => 65285, 8998 => 65286, 8999 => 65287, 9000 => 65288, 9001 => 65289, - 9002 => 65290, 9003 => 65291, 9004 => 65292, 9005 => 65293, 9006 => 65294, - 9007 => 65295, 9008 => 65296, 9009 => 65297, 9010 => 65298, 9011 => 65299, - 9012 => 65300, 9013 => 65301, 9014 => 65302, 9015 => 65303, 9016 => 65304, - 9017 => 65305, 9018 => 65306, 9019 => 65307, 9020 => 65308, 9021 => 65309, - 9022 => 65310, 9023 => 65311, 9024 => 65312, 9025 => 65313, 9026 => 65314, - 9027 => 65315, 9028 => 65316, 9029 => 65317, 9030 => 65318, 9031 => 65319, - 9032 => 65320, 9033 => 65321, 9034 => 65322, 9035 => 65323, 9036 => 65324, - 9037 => 65325, 9038 => 65326, 9039 => 65327, 9040 => 65328, 9041 => 65329, - 9042 => 65330, 9043 => 65331, 9044 => 65332, 9045 => 65333, 9046 => 65334, - 9047 => 65335, 9048 => 65336, 9049 => 65337, 9050 => 65338, 9051 => 65339, - 9052 => 65340, 9053 => 65341, 9054 => 65342, 9055 => 65343, 9056 => 65344, - 9057 => 65345, 9058 => 65346, 9059 => 65347, 9060 => 65348, 9061 => 65349, - 9062 => 65350, 9063 => 65351, 9064 => 65352, 9065 => 65353, 9066 => 65354, - 9067 => 65355, 9068 => 65356, 9069 => 65357, 9070 => 65358, 9071 => 65359, - 9072 => 65360, 9073 => 65361, 9074 => 65362, 9075 => 65363, 9076 => 65364, - 9077 => 65365, 9078 => 65366, 9079 => 65367, 9080 => 65368, 9081 => 65369, - 9082 => 65370, 9083 => 65371, 9084 => 65372, 9085 => 65373, 9086 => 65507, - 9249 => 12353, 9250 => 12354, 9251 => 12355, 9252 => 12356, 9253 => 12357, - 9254 => 12358, 9255 => 12359, 9256 => 12360, 9257 => 12361, 9258 => 12362, - 9259 => 12363, 9260 => 12364, 9261 => 12365, 9262 => 12366, 9263 => 12367, - 9264 => 12368, 9265 => 12369, 9266 => 12370, 9267 => 12371, 9268 => 12372, - 9269 => 12373, 9270 => 12374, 9271 => 12375, 9272 => 12376, 9273 => 12377, - 9274 => 12378, 9275 => 12379, 9276 => 12380, 9277 => 12381, 9278 => 12382, - 9279 => 12383, 9280 => 12384, 9281 => 12385, 9282 => 12386, 9283 => 12387, - 9284 => 12388, 9285 => 12389, 9286 => 12390, 9287 => 12391, 9288 => 12392, - 9289 => 12393, 9290 => 12394, 9291 => 12395, 9292 => 12396, 9293 => 12397, - 9294 => 12398, 9295 => 12399, 9296 => 12400, 9297 => 12401, 9298 => 12402, - 9299 => 12403, 9300 => 12404, 9301 => 12405, 9302 => 12406, 9303 => 12407, - 9304 => 12408, 9305 => 12409, 9306 => 12410, 9307 => 12411, 9308 => 12412, - 9309 => 12413, 9310 => 12414, 9311 => 12415, 9312 => 12416, 9313 => 12417, - 9314 => 12418, 9315 => 12419, 9316 => 12420, 9317 => 12421, 9318 => 12422, - 9319 => 12423, 9320 => 12424, 9321 => 12425, 9322 => 12426, 9323 => 12427, - 9324 => 12428, 9325 => 12429, 9326 => 12430, 9327 => 12431, 9328 => 12432, - 9329 => 12433, 9330 => 12434, 9331 => 12435, 9505 => 12449, 9506 => 12450, - 9507 => 12451, 9508 => 12452, 9509 => 12453, 9510 => 12454, 9511 => 12455, - 9512 => 12456, 9513 => 12457, 9514 => 12458, 9515 => 12459, 9516 => 12460, - 9517 => 12461, 9518 => 12462, 9519 => 12463, 9520 => 12464, 9521 => 12465, - 9522 => 12466, 9523 => 12467, 9524 => 12468, 9525 => 12469, 9526 => 12470, - 9527 => 12471, 9528 => 12472, 9529 => 12473, 9530 => 12474, 9531 => 12475, - 9532 => 12476, 9533 => 12477, 9534 => 12478, 9535 => 12479, 9536 => 12480, - 9537 => 12481, 9538 => 12482, 9539 => 12483, 9540 => 12484, 9541 => 12485, - 9542 => 12486, 9543 => 12487, 9544 => 12488, 9545 => 12489, 9546 => 12490, - 9547 => 12491, 9548 => 12492, 9549 => 12493, 9550 => 12494, 9551 => 12495, - 9552 => 12496, 9553 => 12497, 9554 => 12498, 9555 => 12499, 9556 => 12500, - 9557 => 12501, 9558 => 12502, 9559 => 12503, 9560 => 12504, 9561 => 12505, - 9562 => 12506, 9563 => 12507, 9564 => 12508, 9565 => 12509, 9566 => 12510, - 9567 => 12511, 9568 => 12512, 9569 => 12513, 9570 => 12514, 9571 => 12515, - 9572 => 12516, 9573 => 12517, 9574 => 12518, 9575 => 12519, 9576 => 12520, - 9577 => 12521, 9578 => 12522, 9579 => 12523, 9580 => 12524, 9581 => 12525, - 9582 => 12526, 9583 => 12527, 9584 => 12528, 9585 => 12529, 9586 => 12530, - 9587 => 12531, 9588 => 12532, 9589 => 12533, 9590 => 12534, 9761 => 913, - 9762 => 914, 9763 => 915, 9764 => 916, 9765 => 917, 9766 => 918, - 9767 => 919, 9768 => 920, 9769 => 921, 9770 => 922, 9771 => 923, - 9772 => 924, 9773 => 925, 9774 => 926, 9775 => 927, 9776 => 928, - 9777 => 929, 9778 => 931, 9779 => 932, 9780 => 933, 9781 => 934, - 9782 => 935, 9783 => 936, 9784 => 937, 9793 => 945, 9794 => 946, - 9795 => 947, 9796 => 948, 9797 => 949, 9798 => 950, 9799 => 951, - 9800 => 952, 9801 => 953, 9802 => 954, 9803 => 955, 9804 => 956, - 9805 => 957, 9806 => 958, 9807 => 959, 9808 => 960, 9809 => 961, - 9810 => 963, 9811 => 964, 9812 => 965, 9813 => 966, 9814 => 967, - 9815 => 968, 9816 => 969, 10017 => 1040, 10018 => 1041, 10019 => 1042, - 10020 => 1043, 10021 => 1044, 10022 => 1045, 10023 => 1025, 10024 => 1046, - 10025 => 1047, 10026 => 1048, 10027 => 1049, 10028 => 1050, 10029 => 1051, - 10030 => 1052, 10031 => 1053, 10032 => 1054, 10033 => 1055, 10034 => 1056, - 10035 => 1057, 10036 => 1058, 10037 => 1059, 10038 => 1060, 10039 => 1061, - 10040 => 1062, 10041 => 1063, 10042 => 1064, 10043 => 1065, 10044 => 1066, - 10045 => 1067, 10046 => 1068, 10047 => 1069, 10048 => 1070, 10049 => 1071, - 10065 => 1072, 10066 => 1073, 10067 => 1074, 10068 => 1075, 10069 => 1076, - 10070 => 1077, 10071 => 1105, 10072 => 1078, 10073 => 1079, 10074 => 1080, - 10075 => 1081, 10076 => 1082, 10077 => 1083, 10078 => 1084, 10079 => 1085, - 10080 => 1086, 10081 => 1087, 10082 => 1088, 10083 => 1089, 10084 => 1090, - 10085 => 1091, 10086 => 1092, 10087 => 1093, 10088 => 1094, 10089 => 1095, - 10090 => 1096, 10091 => 1097, 10092 => 1098, 10093 => 1099, 10094 => 1100, - 10095 => 1101, 10096 => 1102, 10097 => 1103, 10273 => 257, 10274 => 225, - 10275 => 462, 10276 => 224, 10277 => 275, 10278 => 233, 10279 => 283, - 10280 => 232, 10281 => 299, 10282 => 237, 10283 => 464, 10284 => 236, - 10285 => 333, 10286 => 243, 10287 => 466, 10288 => 242, 10289 => 363, - 10290 => 250, 10291 => 468, 10292 => 249, 10293 => 470, 10294 => 472, - 10295 => 474, 10296 => 476, 10297 => 252, 10298 => 234, 10309 => 12549, - 10310 => 12550, 10311 => 12551, 10312 => 12552, 10313 => 12553, 10314 => 12554, - 10315 => 12555, 10316 => 12556, 10317 => 12557, 10318 => 12558, 10319 => 12559, - 10320 => 12560, 10321 => 12561, 10322 => 12562, 10323 => 12563, 10324 => 12564, - 10325 => 12565, 10326 => 12566, 10327 => 12567, 10328 => 12568, 10329 => 12569, - 10330 => 12570, 10331 => 12571, 10332 => 12572, 10333 => 12573, 10334 => 12574, - 10335 => 12575, 10336 => 12576, 10337 => 12577, 10338 => 12578, 10339 => 12579, - 10340 => 12580, 10341 => 12581, 10342 => 12582, 10343 => 12583, 10344 => 12584, - 10345 => 12585, 10532 => 9472, 10533 => 9473, 10534 => 9474, 10535 => 9475, - 10536 => 9476, 10537 => 9477, 10538 => 9478, 10539 => 9479, 10540 => 9480, - 10541 => 9481, 10542 => 9482, 10543 => 9483, 10544 => 9484, 10545 => 9485, - 10546 => 9486, 10547 => 9487, 10548 => 9488, 10549 => 9489, 10550 => 9490, - 10551 => 9491, 10552 => 9492, 10553 => 9493, 10554 => 9494, 10555 => 9495, - 10556 => 9496, 10557 => 9497, 10558 => 9498, 10559 => 9499, 10560 => 9500, - 10561 => 9501, 10562 => 9502, 10563 => 9503, 10564 => 9504, 10565 => 9505, - 10566 => 9506, 10567 => 9507, 10568 => 9508, 10569 => 9509, 10570 => 9510, - 10571 => 9511, 10572 => 9512, 10573 => 9513, 10574 => 9514, 10575 => 9515, - 10576 => 9516, 10577 => 9517, 10578 => 9518, 10579 => 9519, 10580 => 9520, - 10581 => 9521, 10582 => 9522, 10583 => 9523, 10584 => 9524, 10585 => 9525, - 10586 => 9526, 10587 => 9527, 10588 => 9528, 10589 => 9529, 10590 => 9530, - 10591 => 9531, 10592 => 9532, 10593 => 9533, 10594 => 9534, 10595 => 9535, - 10596 => 9536, 10597 => 9537, 10598 => 9538, 10599 => 9539, 10600 => 9540, - 10601 => 9541, 10602 => 9542, 10603 => 9543, 10604 => 9544, 10605 => 9545, - 10606 => 9546, 10607 => 9547, 12321 => 21834, 12322 => 38463, 12323 => 22467, - 12324 => 25384, 12325 => 21710, 12326 => 21769, 12327 => 21696, 12328 => 30353, - 12329 => 30284, 12330 => 34108, 12331 => 30702, 12332 => 33406, 12333 => 30861, - 12334 => 29233, 12335 => 38552, 12336 => 38797, 12337 => 27688, 12338 => 23433, - 12339 => 20474, 12340 => 25353, 12341 => 26263, 12342 => 23736, 12343 => 33018, - 12344 => 26696, 12345 => 32942, 12346 => 26114, 12347 => 30414, 12348 => 20985, - 12349 => 25942, 12350 => 29100, 12351 => 32753, 12352 => 34948, 12353 => 20658, - 12354 => 22885, 12355 => 25034, 12356 => 28595, 12357 => 33453, 12358 => 25420, - 12359 => 25170, 12360 => 21485, 12361 => 21543, 12362 => 31494, 12363 => 20843, - 12364 => 30116, 12365 => 24052, 12366 => 25300, 12367 => 36299, 12368 => 38774, - 12369 => 25226, 12370 => 32793, 12371 => 22365, 12372 => 38712, 12373 => 32610, - 12374 => 29240, 12375 => 30333, 12376 => 26575, 12377 => 30334, 12378 => 25670, - 12379 => 20336, 12380 => 36133, 12381 => 25308, 12382 => 31255, 12383 => 26001, - 12384 => 29677, 12385 => 25644, 12386 => 25203, 12387 => 33324, 12388 => 39041, - 12389 => 26495, 12390 => 29256, 12391 => 25198, 12392 => 25292, 12393 => 20276, - 12394 => 29923, 12395 => 21322, 12396 => 21150, 12397 => 32458, 12398 => 37030, - 12399 => 24110, 12400 => 26758, 12401 => 27036, 12402 => 33152, 12403 => 32465, - 12404 => 26834, 12405 => 30917, 12406 => 34444, 12407 => 38225, 12408 => 20621, - 12409 => 35876, 12410 => 33502, 12411 => 32990, 12412 => 21253, 12413 => 35090, - 12414 => 21093, 12577 => 34180, 12578 => 38649, 12579 => 20445, 12580 => 22561, - 12581 => 39281, 12582 => 23453, 12583 => 25265, 12584 => 25253, 12585 => 26292, - 12586 => 35961, 12587 => 40077, 12588 => 29190, 12589 => 26479, 12590 => 30865, - 12591 => 24754, 12592 => 21329, 12593 => 21271, 12594 => 36744, 12595 => 32972, - 12596 => 36125, 12597 => 38049, 12598 => 20493, 12599 => 29384, 12600 => 22791, - 12601 => 24811, 12602 => 28953, 12603 => 34987, 12604 => 22868, 12605 => 33519, - 12606 => 26412, 12607 => 31528, 12608 => 23849, 12609 => 32503, 12610 => 29997, - 12611 => 27893, 12612 => 36454, 12613 => 36856, 12614 => 36924, 12615 => 40763, - 12616 => 27604, 12617 => 37145, 12618 => 31508, 12619 => 24444, 12620 => 30887, - 12621 => 34006, 12622 => 34109, 12623 => 27605, 12624 => 27609, 12625 => 27606, - 12626 => 24065, 12627 => 24199, 12628 => 30201, 12629 => 38381, 12630 => 25949, - 12631 => 24330, 12632 => 24517, 12633 => 36767, 12634 => 22721, 12635 => 33218, - 12636 => 36991, 12637 => 38491, 12638 => 38829, 12639 => 36793, 12640 => 32534, - 12641 => 36140, 12642 => 25153, 12643 => 20415, 12644 => 21464, 12645 => 21342, - 12646 => 36776, 12647 => 36777, 12648 => 36779, 12649 => 36941, 12650 => 26631, - 12651 => 24426, 12652 => 33176, 12653 => 34920, 12654 => 40150, 12655 => 24971, - 12656 => 21035, 12657 => 30250, 12658 => 24428, 12659 => 25996, 12660 => 28626, - 12661 => 28392, 12662 => 23486, 12663 => 25672, 12664 => 20853, 12665 => 20912, - 12666 => 26564, 12667 => 19993, 12668 => 31177, 12669 => 39292, 12670 => 28851, - 12833 => 30149, 12834 => 24182, 12835 => 29627, 12836 => 33760, 12837 => 25773, - 12838 => 25320, 12839 => 38069, 12840 => 27874, 12841 => 21338, 12842 => 21187, - 12843 => 25615, 12844 => 38082, 12845 => 31636, 12846 => 20271, 12847 => 24091, - 12848 => 33334, 12849 => 33046, 12850 => 33162, 12851 => 28196, 12852 => 27850, - 12853 => 39539, 12854 => 25429, 12855 => 21340, 12856 => 21754, 12857 => 34917, - 12858 => 22496, 12859 => 19981, 12860 => 24067, 12861 => 27493, 12862 => 31807, - 12863 => 37096, 12864 => 24598, 12865 => 25830, 12866 => 29468, 12867 => 35009, - 12868 => 26448, 12869 => 25165, 12870 => 36130, 12871 => 30572, 12872 => 36393, - 12873 => 37319, 12874 => 24425, 12875 => 33756, 12876 => 34081, 12877 => 39184, - 12878 => 21442, 12879 => 34453, 12880 => 27531, 12881 => 24813, 12882 => 24808, - 12883 => 28799, 12884 => 33485, 12885 => 33329, 12886 => 20179, 12887 => 27815, - 12888 => 34255, 12889 => 25805, 12890 => 31961, 12891 => 27133, 12892 => 26361, - 12893 => 33609, 12894 => 21397, 12895 => 31574, 12896 => 20391, 12897 => 20876, - 12898 => 27979, 12899 => 23618, 12900 => 36461, 12901 => 25554, 12902 => 21449, - 12903 => 33580, 12904 => 33590, 12905 => 26597, 12906 => 30900, 12907 => 25661, - 12908 => 23519, 12909 => 23700, 12910 => 24046, 12911 => 35815, 12912 => 25286, - 12913 => 26612, 12914 => 35962, 12915 => 25600, 12916 => 25530, 12917 => 34633, - 12918 => 39307, 12919 => 35863, 12920 => 32544, 12921 => 38130, 12922 => 20135, - 12923 => 38416, 12924 => 39076, 12925 => 26124, 12926 => 29462, 13089 => 22330, - 13090 => 23581, 13091 => 24120, 13092 => 38271, 13093 => 20607, 13094 => 32928, - 13095 => 21378, 13096 => 25950, 13097 => 30021, 13098 => 21809, 13099 => 20513, - 13100 => 36229, 13101 => 25220, 13102 => 38046, 13103 => 26397, 13104 => 22066, - 13105 => 28526, 13106 => 24034, 13107 => 21557, 13108 => 28818, 13109 => 36710, - 13110 => 25199, 13111 => 25764, 13112 => 25507, 13113 => 24443, 13114 => 28552, - 13115 => 37108, 13116 => 33251, 13117 => 36784, 13118 => 23576, 13119 => 26216, - 13120 => 24561, 13121 => 27785, 13122 => 38472, 13123 => 36225, 13124 => 34924, - 13125 => 25745, 13126 => 31216, 13127 => 22478, 13128 => 27225, 13129 => 25104, - 13130 => 21576, 13131 => 20056, 13132 => 31243, 13133 => 24809, 13134 => 28548, - 13135 => 35802, 13136 => 25215, 13137 => 36894, 13138 => 39563, 13139 => 31204, -13140 => 21507, 13141 => 30196, 13142 => 25345, 13143 => 21273, 13144 => 27744, -13145 => 36831, 13146 => 24347, 13147 => 39536, 13148 => 32827, 13149 => 40831, -13150 => 20360, 13151 => 23610, 13152 => 36196, 13153 => 32709, 13154 => 26021, -13155 => 28861, 13156 => 20805, 13157 => 20914, 13158 => 34411, 13159 => 23815, -13160 => 23456, 13161 => 25277, 13162 => 37228, 13163 => 30068, 13164 => 36364, -13165 => 31264, 13166 => 24833, 13167 => 31609, 13168 => 20167, 13169 => 32504, -13170 => 30597, 13171 => 19985, 13172 => 33261, 13173 => 21021, 13174 => 20986, -13175 => 27249, 13176 => 21416, 13177 => 36487, 13178 => 38148, 13179 => 38607, -13180 => 28353, 13181 => 38500, 13182 => 26970, 13345 => 30784, 13346 => 20648, -13347 => 30679, 13348 => 25616, 13349 => 35302, 13350 => 22788, 13351 => 25571, -13352 => 24029, 13353 => 31359, 13354 => 26941, 13355 => 20256, 13356 => 33337, -13357 => 21912, 13358 => 20018, 13359 => 30126, 13360 => 31383, 13361 => 24162, -13362 => 24202, 13363 => 38383, 13364 => 21019, 13365 => 21561, 13366 => 28810, -13367 => 25462, 13368 => 38180, 13369 => 22402, 13370 => 26149, 13371 => 26943, -13372 => 37255, 13373 => 21767, 13374 => 28147, 13375 => 32431, 13376 => 34850, -13377 => 25139, 13378 => 32496, 13379 => 30133, 13380 => 33576, 13381 => 30913, -13382 => 38604, 13383 => 36766, 13384 => 24904, 13385 => 29943, 13386 => 35789, -13387 => 27492, 13388 => 21050, 13389 => 36176, 13390 => 27425, 13391 => 32874, -13392 => 33905, 13393 => 22257, 13394 => 21254, 13395 => 20174, 13396 => 19995, -13397 => 20945, 13398 => 31895, 13399 => 37259, 13400 => 31751, 13401 => 20419, -13402 => 36479, 13403 => 31713, 13404 => 31388, 13405 => 25703, 13406 => 23828, -13407 => 20652, 13408 => 33030, 13409 => 30209, 13410 => 31929, 13411 => 28140, -13412 => 32736, 13413 => 26449, 13414 => 23384, 13415 => 23544, 13416 => 30923, -13417 => 25774, 13418 => 25619, 13419 => 25514, 13420 => 25387, 13421 => 38169, -13422 => 25645, 13423 => 36798, 13424 => 31572, 13425 => 30249, 13426 => 25171, -13427 => 22823, 13428 => 21574, 13429 => 27513, 13430 => 20643, 13431 => 25140, -13432 => 24102, 13433 => 27526, 13434 => 20195, 13435 => 36151, 13436 => 34955, -13437 => 24453, 13438 => 36910, 13601 => 24608, 13602 => 32829, 13603 => 25285, -13604 => 20025, 13605 => 21333, 13606 => 37112, 13607 => 25528, 13608 => 32966, -13609 => 26086, 13610 => 27694, 13611 => 20294, 13612 => 24814, 13613 => 28129, -13614 => 35806, 13615 => 24377, 13616 => 34507, 13617 => 24403, 13618 => 25377, -13619 => 20826, 13620 => 33633, 13621 => 26723, 13622 => 20992, 13623 => 25443, -13624 => 36424, 13625 => 20498, 13626 => 23707, 13627 => 31095, 13628 => 23548, -13629 => 21040, 13630 => 31291, 13631 => 24764, 13632 => 36947, 13633 => 30423, -13634 => 24503, 13635 => 24471, 13636 => 30340, 13637 => 36460, 13638 => 28783, -13639 => 30331, 13640 => 31561, 13641 => 30634, 13642 => 20979, 13643 => 37011, -13644 => 22564, 13645 => 20302, 13646 => 28404, 13647 => 36842, 13648 => 25932, -13649 => 31515, 13650 => 29380, 13651 => 28068, 13652 => 32735, 13653 => 23265, -13654 => 25269, 13655 => 24213, 13656 => 22320, 13657 => 33922, 13658 => 31532, -13659 => 24093, 13660 => 24351, 13661 => 36882, 13662 => 32532, 13663 => 39072, -13664 => 25474, 13665 => 28359, 13666 => 30872, 13667 => 28857, 13668 => 20856, -13669 => 38747, 13670 => 22443, 13671 => 30005, 13672 => 20291, 13673 => 30008, -13674 => 24215, 13675 => 24806, 13676 => 22880, 13677 => 28096, 13678 => 27583, -13679 => 30857, 13680 => 21500, 13681 => 38613, 13682 => 20939, 13683 => 20993, -13684 => 25481, 13685 => 21514, 13686 => 38035, 13687 => 35843, 13688 => 36300, -13689 => 29241, 13690 => 30879, 13691 => 34678, 13692 => 36845, 13693 => 35853, -13694 => 21472, 13857 => 19969, 13858 => 30447, 13859 => 21486, 13860 => 38025, -13861 => 39030, 13862 => 40718, 13863 => 38189, 13864 => 23450, 13865 => 35746, -13866 => 20002, 13867 => 19996, 13868 => 20908, 13869 => 33891, 13870 => 25026, -13871 => 21160, 13872 => 26635, 13873 => 20375, 13874 => 24683, 13875 => 20923, -13876 => 27934, 13877 => 20828, 13878 => 25238, 13879 => 26007, 13880 => 38497, -13881 => 35910, 13882 => 36887, 13883 => 30168, 13884 => 37117, 13885 => 30563, -13886 => 27602, 13887 => 29322, 13888 => 29420, 13889 => 35835, 13890 => 22581, -13891 => 30585, 13892 => 36172, 13893 => 26460, 13894 => 38208, 13895 => 32922, -13896 => 24230, 13897 => 28193, 13898 => 22930, 13899 => 31471, 13900 => 30701, -13901 => 38203, 13902 => 27573, 13903 => 26029, 13904 => 32526, 13905 => 22534, -13906 => 20817, 13907 => 38431, 13908 => 23545, 13909 => 22697, 13910 => 21544, -13911 => 36466, 13912 => 25958, 13913 => 39039, 13914 => 22244, 13915 => 38045, -13916 => 30462, 13917 => 36929, 13918 => 25479, 13919 => 21702, 13920 => 22810, -13921 => 22842, 13922 => 22427, 13923 => 36530, 13924 => 26421, 13925 => 36346, -13926 => 33333, 13927 => 21057, 13928 => 24816, 13929 => 22549, 13930 => 34558, -13931 => 23784, 13932 => 40517, 13933 => 20420, 13934 => 39069, 13935 => 35769, -13936 => 23077, 13937 => 24694, 13938 => 21380, 13939 => 25212, 13940 => 36943, -13941 => 37122, 13942 => 39295, 13943 => 24681, 13944 => 32780, 13945 => 20799, -13946 => 32819, 13947 => 23572, 13948 => 39285, 13949 => 27953, 13950 => 20108, -14113 => 36144, 14114 => 21457, 14115 => 32602, 14116 => 31567, 14117 => 20240, -14118 => 20047, 14119 => 38400, 14120 => 27861, 14121 => 29648, 14122 => 34281, -14123 => 24070, 14124 => 30058, 14125 => 32763, 14126 => 27146, 14127 => 30718, -14128 => 38034, 14129 => 32321, 14130 => 20961, 14131 => 28902, 14132 => 21453, -14133 => 36820, 14134 => 33539, 14135 => 36137, 14136 => 29359, 14137 => 39277, -14138 => 27867, 14139 => 22346, 14140 => 33459, 14141 => 26041, 14142 => 32938, -14143 => 25151, 14144 => 38450, 14145 => 22952, 14146 => 20223, 14147 => 35775, -14148 => 32442, 14149 => 25918, 14150 => 33778, 14151 => 38750, 14152 => 21857, -14153 => 39134, 14154 => 32933, 14155 => 21290, 14156 => 35837, 14157 => 21536, -14158 => 32954, 14159 => 24223, 14160 => 27832, 14161 => 36153, 14162 => 33452, -14163 => 37210, 14164 => 21545, 14165 => 27675, 14166 => 20998, 14167 => 32439, -14168 => 22367, 14169 => 28954, 14170 => 27774, 14171 => 31881, 14172 => 22859, -14173 => 20221, 14174 => 24575, 14175 => 24868, 14176 => 31914, 14177 => 20016, -14178 => 23553, 14179 => 26539, 14180 => 34562, 14181 => 23792, 14182 => 38155, -14183 => 39118, 14184 => 30127, 14185 => 28925, 14186 => 36898, 14187 => 20911, -14188 => 32541, 14189 => 35773, 14190 => 22857, 14191 => 20964, 14192 => 20315, -14193 => 21542, 14194 => 22827, 14195 => 25975, 14196 => 32932, 14197 => 23413, -14198 => 25206, 14199 => 25282, 14200 => 36752, 14201 => 24133, 14202 => 27679, -14203 => 31526, 14204 => 20239, 14205 => 20440, 14206 => 26381, 14369 => 28014, -14370 => 28074, 14371 => 31119, 14372 => 34993, 14373 => 24343, 14374 => 29995, -14375 => 25242, 14376 => 36741, 14377 => 20463, 14378 => 37340, 14379 => 26023, -14380 => 33071, 14381 => 33105, 14382 => 24220, 14383 => 33104, 14384 => 36212, -14385 => 21103, 14386 => 35206, 14387 => 36171, 14388 => 22797, 14389 => 20613, -14390 => 20184, 14391 => 38428, 14392 => 29238, 14393 => 33145, 14394 => 36127, -14395 => 23500, 14396 => 35747, 14397 => 38468, 14398 => 22919, 14399 => 32538, -14400 => 21648, 14401 => 22134, 14402 => 22030, 14403 => 35813, 14404 => 25913, -14405 => 27010, 14406 => 38041, 14407 => 30422, 14408 => 28297, 14409 => 24178, -14410 => 29976, 14411 => 26438, 14412 => 26577, 14413 => 31487, 14414 => 32925, -14415 => 36214, 14416 => 24863, 14417 => 31174, 14418 => 25954, 14419 => 36195, -14420 => 20872, 14421 => 21018, 14422 => 38050, 14423 => 32568, 14424 => 32923, -14425 => 32434, 14426 => 23703, 14427 => 28207, 14428 => 26464, 14429 => 31705, -14430 => 30347, 14431 => 39640, 14432 => 33167, 14433 => 32660, 14434 => 31957, -14435 => 25630, 14436 => 38224, 14437 => 31295, 14438 => 21578, 14439 => 21733, -14440 => 27468, 14441 => 25601, 14442 => 25096, 14443 => 40509, 14444 => 33011, -14445 => 30105, 14446 => 21106, 14447 => 38761, 14448 => 33883, 14449 => 26684, -14450 => 34532, 14451 => 38401, 14452 => 38548, 14453 => 38124, 14454 => 20010, -14455 => 21508, 14456 => 32473, 14457 => 26681, 14458 => 36319, 14459 => 32789, -14460 => 26356, 14461 => 24218, 14462 => 32697, 14625 => 22466, 14626 => 32831, -14627 => 26775, 14628 => 24037, 14629 => 25915, 14630 => 21151, 14631 => 24685, -14632 => 40858, 14633 => 20379, 14634 => 36524, 14635 => 20844, 14636 => 23467, -14637 => 24339, 14638 => 24041, 14639 => 27742, 14640 => 25329, 14641 => 36129, -14642 => 20849, 14643 => 38057, 14644 => 21246, 14645 => 27807, 14646 => 33503, -14647 => 29399, 14648 => 22434, 14649 => 26500, 14650 => 36141, 14651 => 22815, -14652 => 36764, 14653 => 33735, 14654 => 21653, 14655 => 31629, 14656 => 20272, -14657 => 27837, 14658 => 23396, 14659 => 22993, 14660 => 40723, 14661 => 21476, -14662 => 34506, 14663 => 39592, 14664 => 35895, 14665 => 32929, 14666 => 25925, -14667 => 39038, 14668 => 22266, 14669 => 38599, 14670 => 21038, 14671 => 29916, -14672 => 21072, 14673 => 23521, 14674 => 25346, 14675 => 35074, 14676 => 20054, -14677 => 25296, 14678 => 24618, 14679 => 26874, 14680 => 20851, 14681 => 23448, -14682 => 20896, 14683 => 35266, 14684 => 31649, 14685 => 39302, 14686 => 32592, -14687 => 24815, 14688 => 28748, 14689 => 36143, 14690 => 20809, 14691 => 24191, -14692 => 36891, 14693 => 29808, 14694 => 35268, 14695 => 22317, 14696 => 30789, -14697 => 24402, 14698 => 40863, 14699 => 38394, 14700 => 36712, 14701 => 39740, -14702 => 35809, 14703 => 30328, 14704 => 26690, 14705 => 26588, 14706 => 36330, -14707 => 36149, 14708 => 21053, 14709 => 36746, 14710 => 28378, 14711 => 26829, -14712 => 38149, 14713 => 37101, 14714 => 22269, 14715 => 26524, 14716 => 35065, -14717 => 36807, 14718 => 21704, 14881 => 39608, 14882 => 23401, 14883 => 28023, -14884 => 27686, 14885 => 20133, 14886 => 23475, 14887 => 39559, 14888 => 37219, -14889 => 25000, 14890 => 37039, 14891 => 38889, 14892 => 21547, 14893 => 28085, -14894 => 23506, 14895 => 20989, 14896 => 21898, 14897 => 32597, 14898 => 32752, -14899 => 25788, 14900 => 25421, 14901 => 26097, 14902 => 25022, 14903 => 24717, -14904 => 28938, 14905 => 27735, 14906 => 27721, 14907 => 22831, 14908 => 26477, -14909 => 33322, 14910 => 22741, 14911 => 22158, 14912 => 35946, 14913 => 27627, -14914 => 37085, 14915 => 22909, 14916 => 32791, 14917 => 21495, 14918 => 28009, -14919 => 21621, 14920 => 21917, 14921 => 33655, 14922 => 33743, 14923 => 26680, -14924 => 31166, 14925 => 21644, 14926 => 20309, 14927 => 21512, 14928 => 30418, -14929 => 35977, 14930 => 38402, 14931 => 27827, 14932 => 28088, 14933 => 36203, -14934 => 35088, 14935 => 40548, 14936 => 36154, 14937 => 22079, 14938 => 40657, -14939 => 30165, 14940 => 24456, 14941 => 29408, 14942 => 24680, 14943 => 21756, -14944 => 20136, 14945 => 27178, 14946 => 34913, 14947 => 24658, 14948 => 36720, -14949 => 21700, 14950 => 28888, 14951 => 34425, 14952 => 40511, 14953 => 27946, -14954 => 23439, 14955 => 24344, 14956 => 32418, 14957 => 21897, 14958 => 20399, -14959 => 29492, 14960 => 21564, 14961 => 21402, 14962 => 20505, 14963 => 21518, -14964 => 21628, 14965 => 20046, 14966 => 24573, 14967 => 29786, 14968 => 22774, -14969 => 33899, 14970 => 32993, 14971 => 34676, 14972 => 29392, 14973 => 31946, -14974 => 28246, 15137 => 24359, 15138 => 34382, 15139 => 21804, 15140 => 25252, -15141 => 20114, 15142 => 27818, 15143 => 25143, 15144 => 33457, 15145 => 21719, -15146 => 21326, 15147 => 29502, 15148 => 28369, 15149 => 30011, 15150 => 21010, -15151 => 21270, 15152 => 35805, 15153 => 27088, 15154 => 24458, 15155 => 24576, -15156 => 28142, 15157 => 22351, 15158 => 27426, 15159 => 29615, 15160 => 26707, -15161 => 36824, 15162 => 32531, 15163 => 25442, 15164 => 24739, 15165 => 21796, -15166 => 30186, 15167 => 35938, 15168 => 28949, 15169 => 28067, 15170 => 23462, -15171 => 24187, 15172 => 33618, 15173 => 24908, 15174 => 40644, 15175 => 30970, -15176 => 34647, 15177 => 31783, 15178 => 30343, 15179 => 20976, 15180 => 24822, -15181 => 29004, 15182 => 26179, 15183 => 24140, 15184 => 24653, 15185 => 35854, -15186 => 28784, 15187 => 25381, 15188 => 36745, 15189 => 24509, 15190 => 24674, -15191 => 34516, 15192 => 22238, 15193 => 27585, 15194 => 24724, 15195 => 24935, -15196 => 21321, 15197 => 24800, 15198 => 26214, 15199 => 36159, 15200 => 31229, -15201 => 20250, 15202 => 28905, 15203 => 27719, 15204 => 35763, 15205 => 35826, -15206 => 32472, 15207 => 33636, 15208 => 26127, 15209 => 23130, 15210 => 39746, -15211 => 27985, 15212 => 28151, 15213 => 35905, 15214 => 27963, 15215 => 20249, -15216 => 28779, 15217 => 33719, 15218 => 25110, 15219 => 24785, 15220 => 38669, -15221 => 36135, 15222 => 31096, 15223 => 20987, 15224 => 22334, 15225 => 22522, -15226 => 26426, 15227 => 30072, 15228 => 31293, 15229 => 31215, 15230 => 31637, -15393 => 32908, 15394 => 39269, 15395 => 36857, 15396 => 28608, 15397 => 35749, -15398 => 40481, 15399 => 23020, 15400 => 32489, 15401 => 32521, 15402 => 21513, -15403 => 26497, 15404 => 26840, 15405 => 36753, 15406 => 31821, 15407 => 38598, -15408 => 21450, 15409 => 24613, 15410 => 30142, 15411 => 27762, 15412 => 21363, -15413 => 23241, 15414 => 32423, 15415 => 25380, 15416 => 20960, 15417 => 33034, -15418 => 24049, 15419 => 34015, 15420 => 25216, 15421 => 20864, 15422 => 23395, -15423 => 20238, 15424 => 31085, 15425 => 21058, 15426 => 24760, 15427 => 27982, -15428 => 23492, 15429 => 23490, 15430 => 35745, 15431 => 35760, 15432 => 26082, -15433 => 24524, 15434 => 38469, 15435 => 22931, 15436 => 32487, 15437 => 32426, -15438 => 22025, 15439 => 26551, 15440 => 22841, 15441 => 20339, 15442 => 23478, -15443 => 21152, 15444 => 33626, 15445 => 39050, 15446 => 36158, 15447 => 30002, -15448 => 38078, 15449 => 20551, 15450 => 31292, 15451 => 20215, 15452 => 26550, -15453 => 39550, 15454 => 23233, 15455 => 27516, 15456 => 30417, 15457 => 22362, -15458 => 23574, 15459 => 31546, 15460 => 38388, 15461 => 29006, 15462 => 20860, -15463 => 32937, 15464 => 33392, 15465 => 22904, 15466 => 32516, 15467 => 33575, -15468 => 26816, 15469 => 26604, 15470 => 30897, 15471 => 30839, 15472 => 25315, -15473 => 25441, 15474 => 31616, 15475 => 20461, 15476 => 21098, 15477 => 20943, -15478 => 33616, 15479 => 27099, 15480 => 37492, 15481 => 36341, 15482 => 36145, -15483 => 35265, 15484 => 38190, 15485 => 31661, 15486 => 20214, 15649 => 20581, -15650 => 33328, 15651 => 21073, 15652 => 39279, 15653 => 28176, 15654 => 28293, -15655 => 28071, 15656 => 24314, 15657 => 20725, 15658 => 23004, 15659 => 23558, -15660 => 27974, 15661 => 27743, 15662 => 30086, 15663 => 33931, 15664 => 26728, -15665 => 22870, 15666 => 35762, 15667 => 21280, 15668 => 37233, 15669 => 38477, -15670 => 34121, 15671 => 26898, 15672 => 30977, 15673 => 28966, 15674 => 33014, -15675 => 20132, 15676 => 37066, 15677 => 27975, 15678 => 39556, 15679 => 23047, -15680 => 22204, 15681 => 25605, 15682 => 38128, 15683 => 30699, 15684 => 20389, -15685 => 33050, 15686 => 29409, 15687 => 35282, 15688 => 39290, 15689 => 32564, -15690 => 32478, 15691 => 21119, 15692 => 25945, 15693 => 37237, 15694 => 36735, -15695 => 36739, 15696 => 21483, 15697 => 31382, 15698 => 25581, 15699 => 25509, -15700 => 30342, 15701 => 31224, 15702 => 34903, 15703 => 38454, 15704 => 25130, -15705 => 21163, 15706 => 33410, 15707 => 26708, 15708 => 26480, 15709 => 25463, -15710 => 30571, 15711 => 31469, 15712 => 27905, 15713 => 32467, 15714 => 35299, -15715 => 22992, 15716 => 25106, 15717 => 34249, 15718 => 33445, 15719 => 30028, -15720 => 20511, 15721 => 20171, 15722 => 30117, 15723 => 35819, 15724 => 23626, -15725 => 24062, 15726 => 31563, 15727 => 26020, 15728 => 37329, 15729 => 20170, -15730 => 27941, 15731 => 35167, 15732 => 32039, 15733 => 38182, 15734 => 20165, -15735 => 35880, 15736 => 36827, 15737 => 38771, 15738 => 26187, 15739 => 31105, -15740 => 36817, 15741 => 28908, 15742 => 28024, 15905 => 23613, 15906 => 21170, -15907 => 33606, 15908 => 20834, 15909 => 33550, 15910 => 30555, 15911 => 26230, -15912 => 40120, 15913 => 20140, 15914 => 24778, 15915 => 31934, 15916 => 31923, -15917 => 32463, 15918 => 20117, 15919 => 35686, 15920 => 26223, 15921 => 39048, -15922 => 38745, 15923 => 22659, 15924 => 25964, 15925 => 38236, 15926 => 24452, -15927 => 30153, 15928 => 38742, 15929 => 31455, 15930 => 31454, 15931 => 20928, -15932 => 28847, 15933 => 31384, 15934 => 25578, 15935 => 31350, 15936 => 32416, -15937 => 29590, 15938 => 38893, 15939 => 20037, 15940 => 28792, 15941 => 20061, -15942 => 37202, 15943 => 21417, 15944 => 25937, 15945 => 26087, 15946 => 33276, -15947 => 33285, 15948 => 21646, 15949 => 23601, 15950 => 30106, 15951 => 38816, -15952 => 25304, 15953 => 29401, 15954 => 30141, 15955 => 23621, 15956 => 39545, -15957 => 33738, 15958 => 23616, 15959 => 21632, 15960 => 30697, 15961 => 20030, -15962 => 27822, 15963 => 32858, 15964 => 25298, 15965 => 25454, 15966 => 24040, -15967 => 20855, 15968 => 36317, 15969 => 36382, 15970 => 38191, 15971 => 20465, -15972 => 21477, 15973 => 24807, 15974 => 28844, 15975 => 21095, 15976 => 25424, -15977 => 40515, 15978 => 23071, 15979 => 20518, 15980 => 30519, 15981 => 21367, -15982 => 32482, 15983 => 25733, 15984 => 25899, 15985 => 25225, 15986 => 25496, -15987 => 20500, 15988 => 29237, 15989 => 35273, 15990 => 20915, 15991 => 35776, -15992 => 32477, 15993 => 22343, 15994 => 33740, 15995 => 38055, 15996 => 20891, -15997 => 21531, 15998 => 23803, 16161 => 20426, 16162 => 31459, 16163 => 27994, -16164 => 37089, 16165 => 39567, 16166 => 21888, 16167 => 21654, 16168 => 21345, -16169 => 21679, 16170 => 24320, 16171 => 25577, 16172 => 26999, 16173 => 20975, -16174 => 24936, 16175 => 21002, 16176 => 22570, 16177 => 21208, 16178 => 22350, -16179 => 30733, 16180 => 30475, 16181 => 24247, 16182 => 24951, 16183 => 31968, -16184 => 25179, 16185 => 25239, 16186 => 20130, 16187 => 28821, 16188 => 32771, -16189 => 25335, 16190 => 28900, 16191 => 38752, 16192 => 22391, 16193 => 33499, -16194 => 26607, 16195 => 26869, 16196 => 30933, 16197 => 39063, 16198 => 31185, -16199 => 22771, 16200 => 21683, 16201 => 21487, 16202 => 28212, 16203 => 20811, -16204 => 21051, 16205 => 23458, 16206 => 35838, 16207 => 32943, 16208 => 21827, -16209 => 22438, 16210 => 24691, 16211 => 22353, 16212 => 21549, 16213 => 31354, -16214 => 24656, 16215 => 23380, 16216 => 25511, 16217 => 25248, 16218 => 21475, -16219 => 25187, 16220 => 23495, 16221 => 26543, 16222 => 21741, 16223 => 31391, -16224 => 33510, 16225 => 37239, 16226 => 24211, 16227 => 35044, 16228 => 22840, -16229 => 22446, 16230 => 25358, 16231 => 36328, 16232 => 33007, 16233 => 22359, -16234 => 31607, 16235 => 20393, 16236 => 24555, 16237 => 23485, 16238 => 27454, -16239 => 21281, 16240 => 31568, 16241 => 29378, 16242 => 26694, 16243 => 30719, -16244 => 30518, 16245 => 26103, 16246 => 20917, 16247 => 20111, 16248 => 30420, -16249 => 23743, 16250 => 31397, 16251 => 33909, 16252 => 22862, 16253 => 39745, -16254 => 20608, 16417 => 39304, 16418 => 24871, 16419 => 28291, 16420 => 22372, -16421 => 26118, 16422 => 25414, 16423 => 22256, 16424 => 25324, 16425 => 25193, -16426 => 24275, 16427 => 38420, 16428 => 22403, 16429 => 25289, 16430 => 21895, -16431 => 34593, 16432 => 33098, 16433 => 36771, 16434 => 21862, 16435 => 33713, -16436 => 26469, 16437 => 36182, 16438 => 34013, 16439 => 23146, 16440 => 26639, -16441 => 25318, 16442 => 31726, 16443 => 38417, 16444 => 20848, 16445 => 28572, -16446 => 35888, 16447 => 25597, 16448 => 35272, 16449 => 25042, 16450 => 32518, -16451 => 28866, 16452 => 28389, 16453 => 29701, 16454 => 27028, 16455 => 29436, -16456 => 24266, 16457 => 37070, 16458 => 26391, 16459 => 28010, 16460 => 25438, -16461 => 21171, 16462 => 29282, 16463 => 32769, 16464 => 20332, 16465 => 23013, -16466 => 37226, 16467 => 28889, 16468 => 28061, 16469 => 21202, 16470 => 20048, -16471 => 38647, 16472 => 38253, 16473 => 34174, 16474 => 30922, 16475 => 32047, -16476 => 20769, 16477 => 22418, 16478 => 25794, 16479 => 32907, 16480 => 31867, -16481 => 27882, 16482 => 26865, 16483 => 26974, 16484 => 20919, 16485 => 21400, -16486 => 26792, 16487 => 29313, 16488 => 40654, 16489 => 31729, 16490 => 29432, -16491 => 31163, 16492 => 28435, 16493 => 29702, 16494 => 26446, 16495 => 37324, -16496 => 40100, 16497 => 31036, 16498 => 33673, 16499 => 33620, 16500 => 21519, -16501 => 26647, 16502 => 20029, 16503 => 21385, 16504 => 21169, 16505 => 30782, -16506 => 21382, 16507 => 21033, 16508 => 20616, 16509 => 20363, 16510 => 20432, -16673 => 30178, 16674 => 31435, 16675 => 31890, 16676 => 27813, 16677 => 38582, -16678 => 21147, 16679 => 29827, 16680 => 21737, 16681 => 20457, 16682 => 32852, -16683 => 33714, 16684 => 36830, 16685 => 38256, 16686 => 24265, 16687 => 24604, -16688 => 28063, 16689 => 24088, 16690 => 25947, 16691 => 33080, 16692 => 38142, -16693 => 24651, 16694 => 28860, 16695 => 32451, 16696 => 31918, 16697 => 20937, -16698 => 26753, 16699 => 31921, 16700 => 33391, 16701 => 20004, 16702 => 36742, -16703 => 37327, 16704 => 26238, 16705 => 20142, 16706 => 35845, 16707 => 25769, -16708 => 32842, 16709 => 20698, 16710 => 30103, 16711 => 29134, 16712 => 23525, -16713 => 36797, 16714 => 28518, 16715 => 20102, 16716 => 25730, 16717 => 38243, -16718 => 24278, 16719 => 26009, 16720 => 21015, 16721 => 35010, 16722 => 28872, -16723 => 21155, 16724 => 29454, 16725 => 29747, 16726 => 26519, 16727 => 30967, -16728 => 38678, 16729 => 20020, 16730 => 37051, 16731 => 40158, 16732 => 28107, -16733 => 20955, 16734 => 36161, 16735 => 21533, 16736 => 25294, 16737 => 29618, -16738 => 33777, 16739 => 38646, 16740 => 40836, 16741 => 38083, 16742 => 20278, -16743 => 32666, 16744 => 20940, 16745 => 28789, 16746 => 38517, 16747 => 23725, -16748 => 39046, 16749 => 21478, 16750 => 20196, 16751 => 28316, 16752 => 29705, -16753 => 27060, 16754 => 30827, 16755 => 39311, 16756 => 30041, 16757 => 21016, -16758 => 30244, 16759 => 27969, 16760 => 26611, 16761 => 20845, 16762 => 40857, -16763 => 32843, 16764 => 21657, 16765 => 31548, 16766 => 31423, 16929 => 38534, -16930 => 22404, 16931 => 25314, 16932 => 38471, 16933 => 27004, 16934 => 23044, -16935 => 25602, 16936 => 31699, 16937 => 28431, 16938 => 38475, 16939 => 33446, -16940 => 21346, 16941 => 39045, 16942 => 24208, 16943 => 28809, 16944 => 25523, -16945 => 21348, 16946 => 34383, 16947 => 40065, 16948 => 40595, 16949 => 30860, -16950 => 38706, 16951 => 36335, 16952 => 36162, 16953 => 40575, 16954 => 28510, -16955 => 31108, 16956 => 24405, 16957 => 38470, 16958 => 25134, 16959 => 39540, -16960 => 21525, 16961 => 38109, 16962 => 20387, 16963 => 26053, 16964 => 23653, -16965 => 23649, 16966 => 32533, 16967 => 34385, 16968 => 27695, 16969 => 24459, -16970 => 29575, 16971 => 28388, 16972 => 32511, 16973 => 23782, 16974 => 25371, -16975 => 23402, 16976 => 28390, 16977 => 21365, 16978 => 20081, 16979 => 25504, -16980 => 30053, 16981 => 25249, 16982 => 36718, 16983 => 20262, 16984 => 20177, -16985 => 27814, 16986 => 32438, 16987 => 35770, 16988 => 33821, 16989 => 34746, -16990 => 32599, 16991 => 36923, 16992 => 38179, 16993 => 31657, 16994 => 39585, -16995 => 35064, 16996 => 33853, 16997 => 27931, 16998 => 39558, 16999 => 32476, -17000 => 22920, 17001 => 40635, 17002 => 29595, 17003 => 30721, 17004 => 34434, -17005 => 39532, 17006 => 39554, 17007 => 22043, 17008 => 21527, 17009 => 22475, -17010 => 20080, 17011 => 40614, 17012 => 21334, 17013 => 36808, 17014 => 33033, -17015 => 30610, 17016 => 39314, 17017 => 34542, 17018 => 28385, 17019 => 34067, -17020 => 26364, 17021 => 24930, 17022 => 28459, 17185 => 35881, 17186 => 33426, -17187 => 33579, 17188 => 30450, 17189 => 27667, 17190 => 24537, 17191 => 33725, -17192 => 29483, 17193 => 33541, 17194 => 38170, 17195 => 27611, 17196 => 30683, -17197 => 38086, 17198 => 21359, 17199 => 33538, 17200 => 20882, 17201 => 24125, -17202 => 35980, 17203 => 36152, 17204 => 20040, 17205 => 29611, 17206 => 26522, -17207 => 26757, 17208 => 37238, 17209 => 38665, 17210 => 29028, 17211 => 27809, -17212 => 30473, 17213 => 23186, 17214 => 38209, 17215 => 27599, 17216 => 32654, -17217 => 26151, 17218 => 23504, 17219 => 22969, 17220 => 23194, 17221 => 38376, -17222 => 38391, 17223 => 20204, 17224 => 33804, 17225 => 33945, 17226 => 27308, -17227 => 30431, 17228 => 38192, 17229 => 29467, 17230 => 26790, 17231 => 23391, -17232 => 30511, 17233 => 37274, 17234 => 38753, 17235 => 31964, 17236 => 36855, -17237 => 35868, 17238 => 24357, 17239 => 31859, 17240 => 31192, 17241 => 35269, -17242 => 27852, 17243 => 34588, 17244 => 23494, 17245 => 24130, 17246 => 26825, -17247 => 30496, 17248 => 32501, 17249 => 20885, 17250 => 20813, 17251 => 21193, -17252 => 23081, 17253 => 32517, 17254 => 38754, 17255 => 33495, 17256 => 25551, -17257 => 30596, 17258 => 34256, 17259 => 31186, 17260 => 28218, 17261 => 24217, -17262 => 22937, 17263 => 34065, 17264 => 28781, 17265 => 27665, 17266 => 25279, -17267 => 30399, 17268 => 25935, 17269 => 24751, 17270 => 38397, 17271 => 26126, -17272 => 34719, 17273 => 40483, 17274 => 38125, 17275 => 21517, 17276 => 21629, -17277 => 35884, 17278 => 25720, 17441 => 25721, 17442 => 34321, 17443 => 27169, -17444 => 33180, 17445 => 30952, 17446 => 25705, 17447 => 39764, 17448 => 25273, -17449 => 26411, 17450 => 33707, 17451 => 22696, 17452 => 40664, 17453 => 27819, -17454 => 28448, 17455 => 23518, 17456 => 38476, 17457 => 35851, 17458 => 29279, -17459 => 26576, 17460 => 25287, 17461 => 29281, 17462 => 20137, 17463 => 22982, -17464 => 27597, 17465 => 22675, 17466 => 26286, 17467 => 24149, 17468 => 21215, -17469 => 24917, 17470 => 26408, 17471 => 30446, 17472 => 30566, 17473 => 29287, -17474 => 31302, 17475 => 25343, 17476 => 21738, 17477 => 21584, 17478 => 38048, -17479 => 37027, 17480 => 23068, 17481 => 32435, 17482 => 27670, 17483 => 20035, -17484 => 22902, 17485 => 32784, 17486 => 22856, 17487 => 21335, 17488 => 30007, -17489 => 38590, 17490 => 22218, 17491 => 25376, 17492 => 33041, 17493 => 24700, -17494 => 38393, 17495 => 28118, 17496 => 21602, 17497 => 39297, 17498 => 20869, -17499 => 23273, 17500 => 33021, 17501 => 22958, 17502 => 38675, 17503 => 20522, -17504 => 27877, 17505 => 23612, 17506 => 25311, 17507 => 20320, 17508 => 21311, -17509 => 33147, 17510 => 36870, 17511 => 28346, 17512 => 34091, 17513 => 25288, -17514 => 24180, 17515 => 30910, 17516 => 25781, 17517 => 25467, 17518 => 24565, -17519 => 23064, 17520 => 37247, 17521 => 40479, 17522 => 23615, 17523 => 25423, -17524 => 32834, 17525 => 23421, 17526 => 21870, 17527 => 38218, 17528 => 38221, -17529 => 28037, 17530 => 24744, 17531 => 26592, 17532 => 29406, 17533 => 20957, -17534 => 23425, 17697 => 25319, 17698 => 27870, 17699 => 29275, 17700 => 25197, -17701 => 38062, 17702 => 32445, 17703 => 33043, 17704 => 27987, 17705 => 20892, -17706 => 24324, 17707 => 22900, 17708 => 21162, 17709 => 24594, 17710 => 22899, -17711 => 26262, 17712 => 34384, 17713 => 30111, 17714 => 25386, 17715 => 25062, -17716 => 31983, 17717 => 35834, 17718 => 21734, 17719 => 27431, 17720 => 40485, -17721 => 27572, 17722 => 34261, 17723 => 21589, 17724 => 20598, 17725 => 27812, -17726 => 21866, 17727 => 36276, 17728 => 29228, 17729 => 24085, 17730 => 24597, -17731 => 29750, 17732 => 25293, 17733 => 25490, 17734 => 29260, 17735 => 24472, -17736 => 28227, 17737 => 27966, 17738 => 25856, 17739 => 28504, 17740 => 30424, -17741 => 30928, 17742 => 30460, 17743 => 30036, 17744 => 21028, 17745 => 21467, -17746 => 20051, 17747 => 24222, 17748 => 26049, 17749 => 32810, 17750 => 32982, -17751 => 25243, 17752 => 21638, 17753 => 21032, 17754 => 28846, 17755 => 34957, -17756 => 36305, 17757 => 27873, 17758 => 21624, 17759 => 32986, 17760 => 22521, -17761 => 35060, 17762 => 36180, 17763 => 38506, 17764 => 37197, 17765 => 20329, -17766 => 27803, 17767 => 21943, 17768 => 30406, 17769 => 30768, 17770 => 25256, -17771 => 28921, 17772 => 28558, 17773 => 24429, 17774 => 34028, 17775 => 26842, -17776 => 30844, 17777 => 31735, 17778 => 33192, 17779 => 26379, 17780 => 40527, -17781 => 25447, 17782 => 30896, 17783 => 22383, 17784 => 30738, 17785 => 38713, -17786 => 25209, 17787 => 25259, 17788 => 21128, 17789 => 29749, 17790 => 27607, -17953 => 21860, 17954 => 33086, 17955 => 30130, 17956 => 30382, 17957 => 21305, -17958 => 30174, 17959 => 20731, 17960 => 23617, 17961 => 35692, 17962 => 31687, -17963 => 20559, 17964 => 29255, 17965 => 39575, 17966 => 39128, 17967 => 28418, -17968 => 29922, 17969 => 31080, 17970 => 25735, 17971 => 30629, 17972 => 25340, -17973 => 39057, 17974 => 36139, 17975 => 21697, 17976 => 32856, 17977 => 20050, -17978 => 22378, 17979 => 33529, 17980 => 33805, 17981 => 24179, 17982 => 20973, -17983 => 29942, 17984 => 35780, 17985 => 23631, 17986 => 22369, 17987 => 27900, -17988 => 39047, 17989 => 23110, 17990 => 30772, 17991 => 39748, 17992 => 36843, -17993 => 31893, 17994 => 21078, 17995 => 25169, 17996 => 38138, 17997 => 20166, -17998 => 33670, 17999 => 33889, 18000 => 33769, 18001 => 33970, 18002 => 22484, -18003 => 26420, 18004 => 22275, 18005 => 26222, 18006 => 28006, 18007 => 35889, -18008 => 26333, 18009 => 28689, 18010 => 26399, 18011 => 27450, 18012 => 26646, -18013 => 25114, 18014 => 22971, 18015 => 19971, 18016 => 20932, 18017 => 28422, -18018 => 26578, 18019 => 27791, 18020 => 20854, 18021 => 26827, 18022 => 22855, -18023 => 27495, 18024 => 30054, 18025 => 23822, 18026 => 33040, 18027 => 40784, -18028 => 26071, 18029 => 31048, 18030 => 31041, 18031 => 39569, 18032 => 36215, -18033 => 23682, 18034 => 20062, 18035 => 20225, 18036 => 21551, 18037 => 22865, -18038 => 30732, 18039 => 22120, 18040 => 27668, 18041 => 36804, 18042 => 24323, -18043 => 27773, 18044 => 27875, 18045 => 35755, 18046 => 25488, 18209 => 24688, -18210 => 27965, 18211 => 29301, 18212 => 25190, 18213 => 38030, 18214 => 38085, -18215 => 21315, 18216 => 36801, 18217 => 31614, 18218 => 20191, 18219 => 35878, -18220 => 20094, 18221 => 40660, 18222 => 38065, 18223 => 38067, 18224 => 21069, -18225 => 28508, 18226 => 36963, 18227 => 27973, 18228 => 35892, 18229 => 22545, -18230 => 23884, 18231 => 27424, 18232 => 27465, 18233 => 26538, 18234 => 21595, -18235 => 33108, 18236 => 32652, 18237 => 22681, 18238 => 34103, 18239 => 24378, -18240 => 25250, 18241 => 27207, 18242 => 38201, 18243 => 25970, 18244 => 24708, -18245 => 26725, 18246 => 30631, 18247 => 20052, 18248 => 20392, 18249 => 24039, -18250 => 38808, 18251 => 25772, 18252 => 32728, 18253 => 23789, 18254 => 20431, -18255 => 31373, 18256 => 20999, 18257 => 33540, 18258 => 19988, 18259 => 24623, -18260 => 31363, 18261 => 38054, 18262 => 20405, 18263 => 20146, 18264 => 31206, -18265 => 29748, 18266 => 21220, 18267 => 33465, 18268 => 25810, 18269 => 31165, -18270 => 23517, 18271 => 27777, 18272 => 38738, 18273 => 36731, 18274 => 27682, -18275 => 20542, 18276 => 21375, 18277 => 28165, 18278 => 25806, 18279 => 26228, -18280 => 27696, 18281 => 24773, 18282 => 39031, 18283 => 35831, 18284 => 24198, -18285 => 29756, 18286 => 31351, 18287 => 31179, 18288 => 19992, 18289 => 37041, -18290 => 29699, 18291 => 27714, 18292 => 22234, 18293 => 37195, 18294 => 27845, -18295 => 36235, 18296 => 21306, 18297 => 34502, 18298 => 26354, 18299 => 36527, -18300 => 23624, 18301 => 39537, 18302 => 28192, 18465 => 21462, 18466 => 23094, -18467 => 40843, 18468 => 36259, 18469 => 21435, 18470 => 22280, 18471 => 39079, -18472 => 26435, 18473 => 37275, 18474 => 27849, 18475 => 20840, 18476 => 30154, -18477 => 25331, 18478 => 29356, 18479 => 21048, 18480 => 21149, 18481 => 32570, -18482 => 28820, 18483 => 30264, 18484 => 21364, 18485 => 40522, 18486 => 27063, -18487 => 30830, 18488 => 38592, 18489 => 35033, 18490 => 32676, 18491 => 28982, -18492 => 29123, 18493 => 20873, 18494 => 26579, 18495 => 29924, 18496 => 22756, -18497 => 25880, 18498 => 22199, 18499 => 35753, 18500 => 39286, 18501 => 25200, -18502 => 32469, 18503 => 24825, 18504 => 28909, 18505 => 22764, 18506 => 20161, -18507 => 20154, 18508 => 24525, 18509 => 38887, 18510 => 20219, 18511 => 35748, -18512 => 20995, 18513 => 22922, 18514 => 32427, 18515 => 25172, 18516 => 20173, -18517 => 26085, 18518 => 25102, 18519 => 33592, 18520 => 33993, 18521 => 33635, -18522 => 34701, 18523 => 29076, 18524 => 28342, 18525 => 23481, 18526 => 32466, -18527 => 20887, 18528 => 25545, 18529 => 26580, 18530 => 32905, 18531 => 33593, -18532 => 34837, 18533 => 20754, 18534 => 23418, 18535 => 22914, 18536 => 36785, -18537 => 20083, 18538 => 27741, 18539 => 20837, 18540 => 35109, 18541 => 36719, -18542 => 38446, 18543 => 34122, 18544 => 29790, 18545 => 38160, 18546 => 38384, -18547 => 28070, 18548 => 33509, 18549 => 24369, 18550 => 25746, 18551 => 27922, -18552 => 33832, 18553 => 33134, 18554 => 40131, 18555 => 22622, 18556 => 36187, -18557 => 19977, 18558 => 21441, 18721 => 20254, 18722 => 25955, 18723 => 26705, -18724 => 21971, 18725 => 20007, 18726 => 25620, 18727 => 39578, 18728 => 25195, -18729 => 23234, 18730 => 29791, 18731 => 33394, 18732 => 28073, 18733 => 26862, -18734 => 20711, 18735 => 33678, 18736 => 30722, 18737 => 26432, 18738 => 21049, -18739 => 27801, 18740 => 32433, 18741 => 20667, 18742 => 21861, 18743 => 29022, -18744 => 31579, 18745 => 26194, 18746 => 29642, 18747 => 33515, 18748 => 26441, -18749 => 23665, 18750 => 21024, 18751 => 29053, 18752 => 34923, 18753 => 38378, -18754 => 38485, 18755 => 25797, 18756 => 36193, 18757 => 33203, 18758 => 21892, -18759 => 27733, 18760 => 25159, 18761 => 32558, 18762 => 22674, 18763 => 20260, -18764 => 21830, 18765 => 36175, 18766 => 26188, 18767 => 19978, 18768 => 23578, -18769 => 35059, 18770 => 26786, 18771 => 25422, 18772 => 31245, 18773 => 28903, -18774 => 33421, 18775 => 21242, 18776 => 38902, 18777 => 23569, 18778 => 21736, -18779 => 37045, 18780 => 32461, 18781 => 22882, 18782 => 36170, 18783 => 34503, -18784 => 33292, 18785 => 33293, 18786 => 36198, 18787 => 25668, 18788 => 23556, -18789 => 24913, 18790 => 28041, 18791 => 31038, 18792 => 35774, 18793 => 30775, -18794 => 30003, 18795 => 21627, 18796 => 20280, 18797 => 36523, 18798 => 28145, -18799 => 23072, 18800 => 32453, 18801 => 31070, 18802 => 27784, 18803 => 23457, -18804 => 23158, 18805 => 29978, 18806 => 32958, 18807 => 24910, 18808 => 28183, -18809 => 22768, 18810 => 29983, 18811 => 29989, 18812 => 29298, 18813 => 21319, -18814 => 32499, 18977 => 30465, 18978 => 30427, 18979 => 21097, 18980 => 32988, -18981 => 22307, 18982 => 24072, 18983 => 22833, 18984 => 29422, 18985 => 26045, -18986 => 28287, 18987 => 35799, 18988 => 23608, 18989 => 34417, 18990 => 21313, -18991 => 30707, 18992 => 25342, 18993 => 26102, 18994 => 20160, 18995 => 39135, -18996 => 34432, 18997 => 23454, 18998 => 35782, 18999 => 21490, 19000 => 30690, -19001 => 20351, 19002 => 23630, 19003 => 39542, 19004 => 22987, 19005 => 24335, -19006 => 31034, 19007 => 22763, 19008 => 19990, 19009 => 26623, 19010 => 20107, -19011 => 25325, 19012 => 35475, 19013 => 36893, 19014 => 21183, 19015 => 26159, -19016 => 21980, 19017 => 22124, 19018 => 36866, 19019 => 20181, 19020 => 20365, -19021 => 37322, 19022 => 39280, 19023 => 27663, 19024 => 24066, 19025 => 24643, -19026 => 23460, 19027 => 35270, 19028 => 35797, 19029 => 25910, 19030 => 25163, -19031 => 39318, 19032 => 23432, 19033 => 23551, 19034 => 25480, 19035 => 21806, -19036 => 21463, 19037 => 30246, 19038 => 20861, 19039 => 34092, 19040 => 26530, -19041 => 26803, 19042 => 27530, 19043 => 25234, 19044 => 36755, 19045 => 21460, -19046 => 33298, 19047 => 28113, 19048 => 30095, 19049 => 20070, 19050 => 36174, -19051 => 23408, 19052 => 29087, 19053 => 34223, 19054 => 26257, 19055 => 26329, -19056 => 32626, 19057 => 34560, 19058 => 40653, 19059 => 40736, 19060 => 23646, -19061 => 26415, 19062 => 36848, 19063 => 26641, 19064 => 26463, 19065 => 25101, -19066 => 31446, 19067 => 22661, 19068 => 24246, 19069 => 25968, 19070 => 28465, -19233 => 24661, 19234 => 21047, 19235 => 32781, 19236 => 25684, 19237 => 34928, -19238 => 29993, 19239 => 24069, 19240 => 26643, 19241 => 25332, 19242 => 38684, -19243 => 21452, 19244 => 29245, 19245 => 35841, 19246 => 27700, 19247 => 30561, -19248 => 31246, 19249 => 21550, 19250 => 30636, 19251 => 39034, 19252 => 33308, -19253 => 35828, 19254 => 30805, 19255 => 26388, 19256 => 28865, 19257 => 26031, -19258 => 25749, 19259 => 22070, 19260 => 24605, 19261 => 31169, 19262 => 21496, -19263 => 19997, 19264 => 27515, 19265 => 32902, 19266 => 23546, 19267 => 21987, -19268 => 22235, 19269 => 20282, 19270 => 20284, 19271 => 39282, 19272 => 24051, -19273 => 26494, 19274 => 32824, 19275 => 24578, 19276 => 39042, 19277 => 36865, -19278 => 23435, 19279 => 35772, 19280 => 35829, 19281 => 25628, 19282 => 33368, -19283 => 25822, 19284 => 22013, 19285 => 33487, 19286 => 37221, 19287 => 20439, -19288 => 32032, 19289 => 36895, 19290 => 31903, 19291 => 20723, 19292 => 22609, -19293 => 28335, 19294 => 23487, 19295 => 35785, 19296 => 32899, 19297 => 37240, -19298 => 33948, 19299 => 31639, 19300 => 34429, 19301 => 38539, 19302 => 38543, -19303 => 32485, 19304 => 39635, 19305 => 30862, 19306 => 23681, 19307 => 31319, -19308 => 36930, 19309 => 38567, 19310 => 31071, 19311 => 23385, 19312 => 25439, -19313 => 31499, 19314 => 34001, 19315 => 26797, 19316 => 21766, 19317 => 32553, -19318 => 29712, 19319 => 32034, 19320 => 38145, 19321 => 25152, 19322 => 22604, -19323 => 20182, 19324 => 23427, 19325 => 22905, 19326 => 22612, 19489 => 29549, -19490 => 25374, 19491 => 36427, 19492 => 36367, 19493 => 32974, 19494 => 33492, -19495 => 25260, 19496 => 21488, 19497 => 27888, 19498 => 37214, 19499 => 22826, -19500 => 24577, 19501 => 27760, 19502 => 22349, 19503 => 25674, 19504 => 36138, -19505 => 30251, 19506 => 28393, 19507 => 22363, 19508 => 27264, 19509 => 30192, -19510 => 28525, 19511 => 35885, 19512 => 35848, 19513 => 22374, 19514 => 27631, -19515 => 34962, 19516 => 30899, 19517 => 25506, 19518 => 21497, 19519 => 28845, -19520 => 27748, 19521 => 22616, 19522 => 25642, 19523 => 22530, 19524 => 26848, -19525 => 33179, 19526 => 21776, 19527 => 31958, 19528 => 20504, 19529 => 36538, -19530 => 28108, 19531 => 36255, 19532 => 28907, 19533 => 25487, 19534 => 28059, -19535 => 28372, 19536 => 32486, 19537 => 33796, 19538 => 26691, 19539 => 36867, -19540 => 28120, 19541 => 38518, 19542 => 35752, 19543 => 22871, 19544 => 29305, -19545 => 34276, 19546 => 33150, 19547 => 30140, 19548 => 35466, 19549 => 26799, -19550 => 21076, 19551 => 36386, 19552 => 38161, 19553 => 25552, 19554 => 39064, -19555 => 36420, 19556 => 21884, 19557 => 20307, 19558 => 26367, 19559 => 22159, -19560 => 24789, 19561 => 28053, 19562 => 21059, 19563 => 23625, 19564 => 22825, -19565 => 28155, 19566 => 22635, 19567 => 30000, 19568 => 29980, 19569 => 24684, -19570 => 33300, 19571 => 33094, 19572 => 25361, 19573 => 26465, 19574 => 36834, -19575 => 30522, 19576 => 36339, 19577 => 36148, 19578 => 38081, 19579 => 24086, -19580 => 21381, 19581 => 21548, 19582 => 28867, 19745 => 27712, 19746 => 24311, -19747 => 20572, 19748 => 20141, 19749 => 24237, 19750 => 25402, 19751 => 33351, -19752 => 36890, 19753 => 26704, 19754 => 37230, 19755 => 30643, 19756 => 21516, -19757 => 38108, 19758 => 24420, 19759 => 31461, 19760 => 26742, 19761 => 25413, -19762 => 31570, 19763 => 32479, 19764 => 30171, 19765 => 20599, 19766 => 25237, -19767 => 22836, 19768 => 36879, 19769 => 20984, 19770 => 31171, 19771 => 31361, -19772 => 22270, 19773 => 24466, 19774 => 36884, 19775 => 28034, 19776 => 23648, -19777 => 22303, 19778 => 21520, 19779 => 20820, 19780 => 28237, 19781 => 22242, -19782 => 25512, 19783 => 39059, 19784 => 33151, 19785 => 34581, 19786 => 35114, -19787 => 36864, 19788 => 21534, 19789 => 23663, 19790 => 33216, 19791 => 25302, -19792 => 25176, 19793 => 33073, 19794 => 40501, 19795 => 38464, 19796 => 39534, -19797 => 39548, 19798 => 26925, 19799 => 22949, 19800 => 25299, 19801 => 21822, -19802 => 25366, 19803 => 21703, 19804 => 34521, 19805 => 27964, 19806 => 23043, -19807 => 29926, 19808 => 34972, 19809 => 27498, 19810 => 22806, 19811 => 35916, -19812 => 24367, 19813 => 28286, 19814 => 29609, 19815 => 39037, 19816 => 20024, -19817 => 28919, 19818 => 23436, 19819 => 30871, 19820 => 25405, 19821 => 26202, -19822 => 30358, 19823 => 24779, 19824 => 23451, 19825 => 23113, 19826 => 19975, -19827 => 33109, 19828 => 27754, 19829 => 29579, 19830 => 20129, 19831 => 26505, -19832 => 32593, 19833 => 24448, 19834 => 26106, 19835 => 26395, 19836 => 24536, -19837 => 22916, 19838 => 23041, 20001 => 24013, 20002 => 24494, 20003 => 21361, -20004 => 38886, 20005 => 36829, 20006 => 26693, 20007 => 22260, 20008 => 21807, -20009 => 24799, 20010 => 20026, 20011 => 28493, 20012 => 32500, 20013 => 33479, -20014 => 33806, 20015 => 22996, 20016 => 20255, 20017 => 20266, 20018 => 23614, -20019 => 32428, 20020 => 26410, 20021 => 34074, 20022 => 21619, 20023 => 30031, -20024 => 32963, 20025 => 21890, 20026 => 39759, 20027 => 20301, 20028 => 28205, -20029 => 35859, 20030 => 23561, 20031 => 24944, 20032 => 21355, 20033 => 30239, -20034 => 28201, 20035 => 34442, 20036 => 25991, 20037 => 38395, 20038 => 32441, -20039 => 21563, 20040 => 31283, 20041 => 32010, 20042 => 38382, 20043 => 21985, -20044 => 32705, 20045 => 29934, 20046 => 25373, 20047 => 34583, 20048 => 28065, -20049 => 31389, 20050 => 25105, 20051 => 26017, 20052 => 21351, 20053 => 25569, -20054 => 27779, 20055 => 24043, 20056 => 21596, 20057 => 38056, 20058 => 20044, -20059 => 27745, 20060 => 35820, 20061 => 23627, 20062 => 26080, 20063 => 33436, -20064 => 26791, 20065 => 21566, 20066 => 21556, 20067 => 27595, 20068 => 27494, -20069 => 20116, 20070 => 25410, 20071 => 21320, 20072 => 33310, 20073 => 20237, -20074 => 20398, 20075 => 22366, 20076 => 25098, 20077 => 38654, 20078 => 26212, -20079 => 29289, 20080 => 21247, 20081 => 21153, 20082 => 24735, 20083 => 35823, -20084 => 26132, 20085 => 29081, 20086 => 26512, 20087 => 35199, 20088 => 30802, -20089 => 30717, 20090 => 26224, 20091 => 22075, 20092 => 21560, 20093 => 38177, -20094 => 29306, 20257 => 31232, 20258 => 24687, 20259 => 24076, 20260 => 24713, -20261 => 33181, 20262 => 22805, 20263 => 24796, 20264 => 29060, 20265 => 28911, -20266 => 28330, 20267 => 27728, 20268 => 29312, 20269 => 27268, 20270 => 34989, -20271 => 24109, 20272 => 20064, 20273 => 23219, 20274 => 21916, 20275 => 38115, -20276 => 27927, 20277 => 31995, 20278 => 38553, 20279 => 25103, 20280 => 32454, -20281 => 30606, 20282 => 34430, 20283 => 21283, 20284 => 38686, 20285 => 36758, -20286 => 26247, 20287 => 23777, 20288 => 20384, 20289 => 29421, 20290 => 19979, -20291 => 21414, 20292 => 22799, 20293 => 21523, 20294 => 25472, 20295 => 38184, -20296 => 20808, 20297 => 20185, 20298 => 40092, 20299 => 32420, 20300 => 21688, -20301 => 36132, 20302 => 34900, 20303 => 33335, 20304 => 38386, 20305 => 28046, -20306 => 24358, 20307 => 23244, 20308 => 26174, 20309 => 38505, 20310 => 29616, -20311 => 29486, 20312 => 21439, 20313 => 33146, 20314 => 39301, 20315 => 32673, -20316 => 23466, 20317 => 38519, 20318 => 38480, 20319 => 32447, 20320 => 30456, -20321 => 21410, 20322 => 38262, 20323 => 39321, 20324 => 31665, 20325 => 35140, -20326 => 28248, 20327 => 20065, 20328 => 32724, 20329 => 31077, 20330 => 35814, -20331 => 24819, 20332 => 21709, 20333 => 20139, 20334 => 39033, 20335 => 24055, -20336 => 27233, 20337 => 20687, 20338 => 21521, 20339 => 35937, 20340 => 33831, -20341 => 30813, 20342 => 38660, 20343 => 21066, 20344 => 21742, 20345 => 22179, -20346 => 38144, 20347 => 28040, 20348 => 23477, 20349 => 28102, 20350 => 26195, -20513 => 23567, 20514 => 23389, 20515 => 26657, 20516 => 32918, 20517 => 21880, -20518 => 31505, 20519 => 25928, 20520 => 26964, 20521 => 20123, 20522 => 27463, -20523 => 34638, 20524 => 38795, 20525 => 21327, 20526 => 25375, 20527 => 25658, -20528 => 37034, 20529 => 26012, 20530 => 32961, 20531 => 35856, 20532 => 20889, -20533 => 26800, 20534 => 21368, 20535 => 34809, 20536 => 25032, 20537 => 27844, -20538 => 27899, 20539 => 35874, 20540 => 23633, 20541 => 34218, 20542 => 33455, -20543 => 38156, 20544 => 27427, 20545 => 36763, 20546 => 26032, 20547 => 24571, -20548 => 24515, 20549 => 20449, 20550 => 34885, 20551 => 26143, 20552 => 33125, -20553 => 29481, 20554 => 24826, 20555 => 20852, 20556 => 21009, 20557 => 22411, -20558 => 24418, 20559 => 37026, 20560 => 34892, 20561 => 37266, 20562 => 24184, -20563 => 26447, 20564 => 24615, 20565 => 22995, 20566 => 20804, 20567 => 20982, -20568 => 33016, 20569 => 21256, 20570 => 27769, 20571 => 38596, 20572 => 29066, -20573 => 20241, 20574 => 20462, 20575 => 32670, 20576 => 26429, 20577 => 21957, -20578 => 38152, 20579 => 31168, 20580 => 34966, 20581 => 32483, 20582 => 22687, -20583 => 25100, 20584 => 38656, 20585 => 34394, 20586 => 22040, 20587 => 39035, -20588 => 24464, 20589 => 35768, 20590 => 33988, 20591 => 37207, 20592 => 21465, -20593 => 26093, 20594 => 24207, 20595 => 30044, 20596 => 24676, 20597 => 32110, -20598 => 23167, 20599 => 32490, 20600 => 32493, 20601 => 36713, 20602 => 21927, -20603 => 23459, 20604 => 24748, 20605 => 26059, 20606 => 29572, 20769 => 36873, -20770 => 30307, 20771 => 30505, 20772 => 32474, 20773 => 38772, 20774 => 34203, -20775 => 23398, 20776 => 31348, 20777 => 38634, 20778 => 34880, 20779 => 21195, -20780 => 29071, 20781 => 24490, 20782 => 26092, 20783 => 35810, 20784 => 23547, -20785 => 39535, 20786 => 24033, 20787 => 27529, 20788 => 27739, 20789 => 35757, -20790 => 35759, 20791 => 36874, 20792 => 36805, 20793 => 21387, 20794 => 25276, -20795 => 40486, 20796 => 40493, 20797 => 21568, 20798 => 20011, 20799 => 33469, -20800 => 29273, 20801 => 34460, 20802 => 23830, 20803 => 34905, 20804 => 28079, -20805 => 38597, 20806 => 21713, 20807 => 20122, 20808 => 35766, 20809 => 28937, -20810 => 21693, 20811 => 38409, 20812 => 28895, 20813 => 28153, 20814 => 30416, -20815 => 20005, 20816 => 30740, 20817 => 34578, 20818 => 23721, 20819 => 24310, -20820 => 35328, 20821 => 39068, 20822 => 38414, 20823 => 28814, 20824 => 27839, -20825 => 22852, 20826 => 25513, 20827 => 30524, 20828 => 34893, 20829 => 28436, -20830 => 33395, 20831 => 22576, 20832 => 29141, 20833 => 21388, 20834 => 30746, -20835 => 38593, 20836 => 21761, 20837 => 24422, 20838 => 28976, 20839 => 23476, -20840 => 35866, 20841 => 39564, 20842 => 27523, 20843 => 22830, 20844 => 40495, -20845 => 31207, 20846 => 26472, 20847 => 25196, 20848 => 20335, 20849 => 30113, -20850 => 32650, 20851 => 27915, 20852 => 38451, 20853 => 27687, 20854 => 20208, -20855 => 30162, 20856 => 20859, 20857 => 26679, 20858 => 28478, 20859 => 36992, -20860 => 33136, 20861 => 22934, 20862 => 29814, 21025 => 25671, 21026 => 23591, -21027 => 36965, 21028 => 31377, 21029 => 35875, 21030 => 23002, 21031 => 21676, -21032 => 33280, 21033 => 33647, 21034 => 35201, 21035 => 32768, 21036 => 26928, -21037 => 22094, 21038 => 32822, 21039 => 29239, 21040 => 37326, 21041 => 20918, -21042 => 20063, 21043 => 39029, 21044 => 25494, 21045 => 19994, 21046 => 21494, -21047 => 26355, 21048 => 33099, 21049 => 22812, 21050 => 28082, 21051 => 19968, -21052 => 22777, 21053 => 21307, 21054 => 25558, 21055 => 38129, 21056 => 20381, -21057 => 20234, 21058 => 34915, 21059 => 39056, 21060 => 22839, 21061 => 36951, -21062 => 31227, 21063 => 20202, 21064 => 33008, 21065 => 30097, 21066 => 27778, -21067 => 23452, 21068 => 23016, 21069 => 24413, 21070 => 26885, 21071 => 34433, -21072 => 20506, 21073 => 24050, 21074 => 20057, 21075 => 30691, 21076 => 20197, -21077 => 33402, 21078 => 25233, 21079 => 26131, 21080 => 37009, 21081 => 23673, -21082 => 20159, 21083 => 24441, 21084 => 33222, 21085 => 36920, 21086 => 32900, -21087 => 30123, 21088 => 20134, 21089 => 35028, 21090 => 24847, 21091 => 27589, -21092 => 24518, 21093 => 20041, 21094 => 30410, 21095 => 28322, 21096 => 35811, -21097 => 35758, 21098 => 35850, 21099 => 35793, 21100 => 24322, 21101 => 32764, -21102 => 32716, 21103 => 32462, 21104 => 33589, 21105 => 33643, 21106 => 22240, -21107 => 27575, 21108 => 38899, 21109 => 38452, 21110 => 23035, 21111 => 21535, -21112 => 38134, 21113 => 28139, 21114 => 23493, 21115 => 39278, 21116 => 23609, -21117 => 24341, 21118 => 38544, 21281 => 21360, 21282 => 33521, 21283 => 27185, -21284 => 23156, 21285 => 40560, 21286 => 24212, 21287 => 32552, 21288 => 33721, -21289 => 33828, 21290 => 33829, 21291 => 33639, 21292 => 34631, 21293 => 36814, -21294 => 36194, 21295 => 30408, 21296 => 24433, 21297 => 39062, 21298 => 30828, -21299 => 26144, 21300 => 21727, 21301 => 25317, 21302 => 20323, 21303 => 33219, -21304 => 30152, 21305 => 24248, 21306 => 38605, 21307 => 36362, 21308 => 34553, -21309 => 21647, 21310 => 27891, 21311 => 28044, 21312 => 27704, 21313 => 24703, -21314 => 21191, 21315 => 29992, 21316 => 24189, 21317 => 20248, 21318 => 24736, -21319 => 24551, 21320 => 23588, 21321 => 30001, 21322 => 37038, 21323 => 38080, -21324 => 29369, 21325 => 27833, 21326 => 28216, 21327 => 37193, 21328 => 26377, -21329 => 21451, 21330 => 21491, 21331 => 20305, 21332 => 37321, 21333 => 35825, -21334 => 21448, 21335 => 24188, 21336 => 36802, 21337 => 28132, 21338 => 20110, -21339 => 30402, 21340 => 27014, 21341 => 34398, 21342 => 24858, 21343 => 33286, -21344 => 20313, 21345 => 20446, 21346 => 36926, 21347 => 40060, 21348 => 24841, -21349 => 28189, 21350 => 28180, 21351 => 38533, 21352 => 20104, 21353 => 23089, -21354 => 38632, 21355 => 19982, 21356 => 23679, 21357 => 31161, 21358 => 23431, -21359 => 35821, 21360 => 32701, 21361 => 29577, 21362 => 22495, 21363 => 33419, -21364 => 37057, 21365 => 21505, 21366 => 36935, 21367 => 21947, 21368 => 23786, -21369 => 24481, 21370 => 24840, 21371 => 27442, 21372 => 29425, 21373 => 32946, -21374 => 35465, 21537 => 28020, 21538 => 23507, 21539 => 35029, 21540 => 39044, -21541 => 35947, 21542 => 39533, 21543 => 40499, 21544 => 28170, 21545 => 20900, -21546 => 20803, 21547 => 22435, 21548 => 34945, 21549 => 21407, 21550 => 25588, -21551 => 36757, 21552 => 22253, 21553 => 21592, 21554 => 22278, 21555 => 29503, -21556 => 28304, 21557 => 32536, 21558 => 36828, 21559 => 33489, 21560 => 24895, -21561 => 24616, 21562 => 38498, 21563 => 26352, 21564 => 32422, 21565 => 36234, -21566 => 36291, 21567 => 38053, 21568 => 23731, 21569 => 31908, 21570 => 26376, -21571 => 24742, 21572 => 38405, 21573 => 32792, 21574 => 20113, 21575 => 37095, -21576 => 21248, 21577 => 38504, 21578 => 20801, 21579 => 36816, 21580 => 34164, -21581 => 37213, 21582 => 26197, 21583 => 38901, 21584 => 23381, 21585 => 21277, -21586 => 30776, 21587 => 26434, 21588 => 26685, 21589 => 21705, 21590 => 28798, -21591 => 23472, 21592 => 36733, 21593 => 20877, 21594 => 22312, 21595 => 21681, -21596 => 25874, 21597 => 26242, 21598 => 36190, 21599 => 36163, 21600 => 33039, -21601 => 33900, 21602 => 36973, 21603 => 31967, 21604 => 20991, 21605 => 34299, -21606 => 26531, 21607 => 26089, 21608 => 28577, 21609 => 34468, 21610 => 36481, -21611 => 22122, 21612 => 36896, 21613 => 30338, 21614 => 28790, 21615 => 29157, -21616 => 36131, 21617 => 25321, 21618 => 21017, 21619 => 27901, 21620 => 36156, -21621 => 24590, 21622 => 22686, 21623 => 24974, 21624 => 26366, 21625 => 36192, -21626 => 25166, 21627 => 21939, 21628 => 28195, 21629 => 26413, 21630 => 36711, -21793 => 38113, 21794 => 38392, 21795 => 30504, 21796 => 26629, 21797 => 27048, -21798 => 21643, 21799 => 20045, 21800 => 28856, 21801 => 35784, 21802 => 25688, -21803 => 25995, 21804 => 23429, 21805 => 31364, 21806 => 20538, 21807 => 23528, -21808 => 30651, 21809 => 27617, 21810 => 35449, 21811 => 31896, 21812 => 27838, -21813 => 30415, 21814 => 26025, 21815 => 36759, 21816 => 23853, 21817 => 23637, -21818 => 34360, 21819 => 26632, 21820 => 21344, 21821 => 25112, 21822 => 31449, -21823 => 28251, 21824 => 32509, 21825 => 27167, 21826 => 31456, 21827 => 24432, -21828 => 28467, 21829 => 24352, 21830 => 25484, 21831 => 28072, 21832 => 26454, -21833 => 19976, 21834 => 24080, 21835 => 36134, 21836 => 20183, 21837 => 32960, -21838 => 30260, 21839 => 38556, 21840 => 25307, 21841 => 26157, 21842 => 25214, -21843 => 27836, 21844 => 36213, 21845 => 29031, 21846 => 32617, 21847 => 20806, -21848 => 32903, 21849 => 21484, 21850 => 36974, 21851 => 25240, 21852 => 21746, -21853 => 34544, 21854 => 36761, 21855 => 32773, 21856 => 38167, 21857 => 34071, -21858 => 36825, 21859 => 27993, 21860 => 29645, 21861 => 26015, 21862 => 30495, -21863 => 29956, 21864 => 30759, 21865 => 33275, 21866 => 36126, 21867 => 38024, -21868 => 20390, 21869 => 26517, 21870 => 30137, 21871 => 35786, 21872 => 38663, -21873 => 25391, 21874 => 38215, 21875 => 38453, 21876 => 33976, 21877 => 25379, -21878 => 30529, 21879 => 24449, 21880 => 29424, 21881 => 20105, 21882 => 24596, -21883 => 25972, 21884 => 25327, 21885 => 27491, 21886 => 25919, 22049 => 24103, -22050 => 30151, 22051 => 37073, 22052 => 35777, 22053 => 33437, 22054 => 26525, -22055 => 25903, 22056 => 21553, 22057 => 34584, 22058 => 30693, 22059 => 32930, -22060 => 33026, 22061 => 27713, 22062 => 20043, 22063 => 32455, 22064 => 32844, -22065 => 30452, 22066 => 26893, 22067 => 27542, 22068 => 25191, 22069 => 20540, -22070 => 20356, 22071 => 22336, 22072 => 25351, 22073 => 27490, 22074 => 36286, -22075 => 21482, 22076 => 26088, 22077 => 32440, 22078 => 24535, 22079 => 25370, -22080 => 25527, 22081 => 33267, 22082 => 33268, 22083 => 32622, 22084 => 24092, -22085 => 23769, 22086 => 21046, 22087 => 26234, 22088 => 31209, 22089 => 31258, -22090 => 36136, 22091 => 28825, 22092 => 30164, 22093 => 28382, 22094 => 27835, -22095 => 31378, 22096 => 20013, 22097 => 30405, 22098 => 24544, 22099 => 38047, -22100 => 34935, 22101 => 32456, 22102 => 31181, 22103 => 32959, 22104 => 37325, -22105 => 20210, 22106 => 20247, 22107 => 33311, 22108 => 21608, 22109 => 24030, -22110 => 27954, 22111 => 35788, 22112 => 31909, 22113 => 36724, 22114 => 32920, -22115 => 24090, 22116 => 21650, 22117 => 30385, 22118 => 23449, 22119 => 26172, -22120 => 39588, 22121 => 29664, 22122 => 26666, 22123 => 34523, 22124 => 26417, -22125 => 29482, 22126 => 35832, 22127 => 35803, 22128 => 36880, 22129 => 31481, -22130 => 28891, 22131 => 29038, 22132 => 25284, 22133 => 30633, 22134 => 22065, -22135 => 20027, 22136 => 33879, 22137 => 26609, 22138 => 21161, 22139 => 34496, -22140 => 36142, 22141 => 38136, 22142 => 31569, 22305 => 20303, 22306 => 27880, -22307 => 31069, 22308 => 39547, 22309 => 25235, 22310 => 29226, 22311 => 25341, -22312 => 19987, 22313 => 30742, 22314 => 36716, 22315 => 25776, 22316 => 36186, -22317 => 31686, 22318 => 26729, 22319 => 24196, 22320 => 35013, 22321 => 22918, -22322 => 25758, 22323 => 22766, 22324 => 29366, 22325 => 26894, 22326 => 38181, -22327 => 36861, 22328 => 36184, 22329 => 22368, 22330 => 32512, 22331 => 35846, -22332 => 20934, 22333 => 25417, 22334 => 25305, 22335 => 21331, 22336 => 26700, -22337 => 29730, 22338 => 33537, 22339 => 37196, 22340 => 21828, 22341 => 30528, -22342 => 28796, 22343 => 27978, 22344 => 20857, 22345 => 21672, 22346 => 36164, -22347 => 23039, 22348 => 28363, 22349 => 28100, 22350 => 23388, 22351 => 32043, -22352 => 20180, 22353 => 31869, 22354 => 28371, 22355 => 23376, 22356 => 33258, -22357 => 28173, 22358 => 23383, 22359 => 39683, 22360 => 26837, 22361 => 36394, -22362 => 23447, 22363 => 32508, 22364 => 24635, 22365 => 32437, 22366 => 37049, -22367 => 36208, 22368 => 22863, 22369 => 25549, 22370 => 31199, 22371 => 36275, -22372 => 21330, 22373 => 26063, 22374 => 31062, 22375 => 35781, 22376 => 38459, -22377 => 32452, 22378 => 38075, 22379 => 32386, 22380 => 22068, 22381 => 37257, -22382 => 26368, 22383 => 32618, 22384 => 23562, 22385 => 36981, 22386 => 26152, -22387 => 24038, 22388 => 20304, 22389 => 26590, 22390 => 20570, 22391 => 20316, -22392 => 22352, 22393 => 24231, 22561 => 20109, 22562 => 19980, 22563 => 20800, -22564 => 19984, 22565 => 24319, 22566 => 21317, 22567 => 19989, 22568 => 20120, -22569 => 19998, 22570 => 39730, 22571 => 23404, 22572 => 22121, 22573 => 20008, -22574 => 31162, 22575 => 20031, 22576 => 21269, 22577 => 20039, 22578 => 22829, -22579 => 29243, 22580 => 21358, 22581 => 27664, 22582 => 22239, 22583 => 32996, -22584 => 39319, 22585 => 27603, 22586 => 30590, 22587 => 40727, 22588 => 20022, -22589 => 20127, 22590 => 40720, 22591 => 20060, 22592 => 20073, 22593 => 20115, -22594 => 33416, 22595 => 23387, 22596 => 21868, 22597 => 22031, 22598 => 20164, -22599 => 21389, 22600 => 21405, 22601 => 21411, 22602 => 21413, 22603 => 21422, -22604 => 38757, 22605 => 36189, 22606 => 21274, 22607 => 21493, 22608 => 21286, -22609 => 21294, 22610 => 21310, 22611 => 36188, 22612 => 21350, 22613 => 21347, -22614 => 20994, 22615 => 21000, 22616 => 21006, 22617 => 21037, 22618 => 21043, -22619 => 21055, 22620 => 21056, 22621 => 21068, 22622 => 21086, 22623 => 21089, -22624 => 21084, 22625 => 33967, 22626 => 21117, 22627 => 21122, 22628 => 21121, -22629 => 21136, 22630 => 21139, 22631 => 20866, 22632 => 32596, 22633 => 20155, -22634 => 20163, 22635 => 20169, 22636 => 20162, 22637 => 20200, 22638 => 20193, -22639 => 20203, 22640 => 20190, 22641 => 20251, 22642 => 20211, 22643 => 20258, -22644 => 20324, 22645 => 20213, 22646 => 20261, 22647 => 20263, 22648 => 20233, -22649 => 20267, 22650 => 20318, 22651 => 20327, 22652 => 25912, 22653 => 20314, -22654 => 20317, 22817 => 20319, 22818 => 20311, 22819 => 20274, 22820 => 20285, -22821 => 20342, 22822 => 20340, 22823 => 20369, 22824 => 20361, 22825 => 20355, -22826 => 20367, 22827 => 20350, 22828 => 20347, 22829 => 20394, 22830 => 20348, -22831 => 20396, 22832 => 20372, 22833 => 20454, 22834 => 20456, 22835 => 20458, -22836 => 20421, 22837 => 20442, 22838 => 20451, 22839 => 20444, 22840 => 20433, -22841 => 20447, 22842 => 20472, 22843 => 20521, 22844 => 20556, 22845 => 20467, -22846 => 20524, 22847 => 20495, 22848 => 20526, 22849 => 20525, 22850 => 20478, -22851 => 20508, 22852 => 20492, 22853 => 20517, 22854 => 20520, 22855 => 20606, -22856 => 20547, 22857 => 20565, 22858 => 20552, 22859 => 20558, 22860 => 20588, -22861 => 20603, 22862 => 20645, 22863 => 20647, 22864 => 20649, 22865 => 20666, -22866 => 20694, 22867 => 20742, 22868 => 20717, 22869 => 20716, 22870 => 20710, -22871 => 20718, 22872 => 20743, 22873 => 20747, 22874 => 20189, 22875 => 27709, -22876 => 20312, 22877 => 20325, 22878 => 20430, 22879 => 40864, 22880 => 27718, -22881 => 31860, 22882 => 20846, 22883 => 24061, 22884 => 40649, 22885 => 39320, -22886 => 20865, 22887 => 22804, 22888 => 21241, 22889 => 21261, 22890 => 35335, -22891 => 21264, 22892 => 20971, 22893 => 22809, 22894 => 20821, 22895 => 20128, -22896 => 20822, 22897 => 20147, 22898 => 34926, 22899 => 34980, 22900 => 20149, -22901 => 33044, 22902 => 35026, 22903 => 31104, 22904 => 23348, 22905 => 34819, -22906 => 32696, 22907 => 20907, 22908 => 20913, 22909 => 20925, 22910 => 20924, -23073 => 20935, 23074 => 20886, 23075 => 20898, 23076 => 20901, 23077 => 35744, -23078 => 35750, 23079 => 35751, 23080 => 35754, 23081 => 35764, 23082 => 35765, -23083 => 35767, 23084 => 35778, 23085 => 35779, 23086 => 35787, 23087 => 35791, -23088 => 35790, 23089 => 35794, 23090 => 35795, 23091 => 35796, 23092 => 35798, -23093 => 35800, 23094 => 35801, 23095 => 35804, 23096 => 35807, 23097 => 35808, -23098 => 35812, 23099 => 35816, 23100 => 35817, 23101 => 35822, 23102 => 35824, -23103 => 35827, 23104 => 35830, 23105 => 35833, 23106 => 35836, 23107 => 35839, -23108 => 35840, 23109 => 35842, 23110 => 35844, 23111 => 35847, 23112 => 35852, -23113 => 35855, 23114 => 35857, 23115 => 35858, 23116 => 35860, 23117 => 35861, -23118 => 35862, 23119 => 35865, 23120 => 35867, 23121 => 35864, 23122 => 35869, -23123 => 35871, 23124 => 35872, 23125 => 35873, 23126 => 35877, 23127 => 35879, -23128 => 35882, 23129 => 35883, 23130 => 35886, 23131 => 35887, 23132 => 35890, -23133 => 35891, 23134 => 35893, 23135 => 35894, 23136 => 21353, 23137 => 21370, -23138 => 38429, 23139 => 38434, 23140 => 38433, 23141 => 38449, 23142 => 38442, -23143 => 38461, 23144 => 38460, 23145 => 38466, 23146 => 38473, 23147 => 38484, -23148 => 38495, 23149 => 38503, 23150 => 38508, 23151 => 38514, 23152 => 38516, -23153 => 38536, 23154 => 38541, 23155 => 38551, 23156 => 38576, 23157 => 37015, -23158 => 37019, 23159 => 37021, 23160 => 37017, 23161 => 37036, 23162 => 37025, -23163 => 37044, 23164 => 37043, 23165 => 37046, 23166 => 37050, 23329 => 37048, -23330 => 37040, 23331 => 37071, 23332 => 37061, 23333 => 37054, 23334 => 37072, -23335 => 37060, 23336 => 37063, 23337 => 37075, 23338 => 37094, 23339 => 37090, -23340 => 37084, 23341 => 37079, 23342 => 37083, 23343 => 37099, 23344 => 37103, -23345 => 37118, 23346 => 37124, 23347 => 37154, 23348 => 37150, 23349 => 37155, -23350 => 37169, 23351 => 37167, 23352 => 37177, 23353 => 37187, 23354 => 37190, -23355 => 21005, 23356 => 22850, 23357 => 21154, 23358 => 21164, 23359 => 21165, -23360 => 21182, 23361 => 21759, 23362 => 21200, 23363 => 21206, 23364 => 21232, -23365 => 21471, 23366 => 29166, 23367 => 30669, 23368 => 24308, 23369 => 20981, -23370 => 20988, 23371 => 39727, 23372 => 21430, 23373 => 24321, 23374 => 30042, -23375 => 24047, 23376 => 22348, 23377 => 22441, 23378 => 22433, 23379 => 22654, -23380 => 22716, 23381 => 22725, 23382 => 22737, 23383 => 22313, 23384 => 22316, -23385 => 22314, 23386 => 22323, 23387 => 22329, 23388 => 22318, 23389 => 22319, -23390 => 22364, 23391 => 22331, 23392 => 22338, 23393 => 22377, 23394 => 22405, -23395 => 22379, 23396 => 22406, 23397 => 22396, 23398 => 22395, 23399 => 22376, -23400 => 22381, 23401 => 22390, 23402 => 22387, 23403 => 22445, 23404 => 22436, -23405 => 22412, 23406 => 22450, 23407 => 22479, 23408 => 22439, 23409 => 22452, -23410 => 22419, 23411 => 22432, 23412 => 22485, 23413 => 22488, 23414 => 22490, -23415 => 22489, 23416 => 22482, 23417 => 22456, 23418 => 22516, 23419 => 22511, -23420 => 22520, 23421 => 22500, 23422 => 22493, 23585 => 22539, 23586 => 22541, -23587 => 22525, 23588 => 22509, 23589 => 22528, 23590 => 22558, 23591 => 22553, -23592 => 22596, 23593 => 22560, 23594 => 22629, 23595 => 22636, 23596 => 22657, -23597 => 22665, 23598 => 22682, 23599 => 22656, 23600 => 39336, 23601 => 40729, -23602 => 25087, 23603 => 33401, 23604 => 33405, 23605 => 33407, 23606 => 33423, -23607 => 33418, 23608 => 33448, 23609 => 33412, 23610 => 33422, 23611 => 33425, -23612 => 33431, 23613 => 33433, 23614 => 33451, 23615 => 33464, 23616 => 33470, -23617 => 33456, 23618 => 33480, 23619 => 33482, 23620 => 33507, 23621 => 33432, -23622 => 33463, 23623 => 33454, 23624 => 33483, 23625 => 33484, 23626 => 33473, -23627 => 33449, 23628 => 33460, 23629 => 33441, 23630 => 33450, 23631 => 33439, -23632 => 33476, 23633 => 33486, 23634 => 33444, 23635 => 33505, 23636 => 33545, -23637 => 33527, 23638 => 33508, 23639 => 33551, 23640 => 33543, 23641 => 33500, -23642 => 33524, 23643 => 33490, 23644 => 33496, 23645 => 33548, 23646 => 33531, -23647 => 33491, 23648 => 33553, 23649 => 33562, 23650 => 33542, 23651 => 33556, -23652 => 33557, 23653 => 33504, 23654 => 33493, 23655 => 33564, 23656 => 33617, -23657 => 33627, 23658 => 33628, 23659 => 33544, 23660 => 33682, 23661 => 33596, -23662 => 33588, 23663 => 33585, 23664 => 33691, 23665 => 33630, 23666 => 33583, -23667 => 33615, 23668 => 33607, 23669 => 33603, 23670 => 33631, 23671 => 33600, -23672 => 33559, 23673 => 33632, 23674 => 33581, 23675 => 33594, 23676 => 33587, -23677 => 33638, 23678 => 33637, 23841 => 33640, 23842 => 33563, 23843 => 33641, -23844 => 33644, 23845 => 33642, 23846 => 33645, 23847 => 33646, 23848 => 33712, -23849 => 33656, 23850 => 33715, 23851 => 33716, 23852 => 33696, 23853 => 33706, -23854 => 33683, 23855 => 33692, 23856 => 33669, 23857 => 33660, 23858 => 33718, -23859 => 33705, 23860 => 33661, 23861 => 33720, 23862 => 33659, 23863 => 33688, -23864 => 33694, 23865 => 33704, 23866 => 33722, 23867 => 33724, 23868 => 33729, -23869 => 33793, 23870 => 33765, 23871 => 33752, 23872 => 22535, 23873 => 33816, -23874 => 33803, 23875 => 33757, 23876 => 33789, 23877 => 33750, 23878 => 33820, -23879 => 33848, 23880 => 33809, 23881 => 33798, 23882 => 33748, 23883 => 33759, -23884 => 33807, 23885 => 33795, 23886 => 33784, 23887 => 33785, 23888 => 33770, -23889 => 33733, 23890 => 33728, 23891 => 33830, 23892 => 33776, 23893 => 33761, -23894 => 33884, 23895 => 33873, 23896 => 33882, 23897 => 33881, 23898 => 33907, -23899 => 33927, 23900 => 33928, 23901 => 33914, 23902 => 33929, 23903 => 33912, -23904 => 33852, 23905 => 33862, 23906 => 33897, 23907 => 33910, 23908 => 33932, -23909 => 33934, 23910 => 33841, 23911 => 33901, 23912 => 33985, 23913 => 33997, -23914 => 34000, 23915 => 34022, 23916 => 33981, 23917 => 34003, 23918 => 33994, -23919 => 33983, 23920 => 33978, 23921 => 34016, 23922 => 33953, 23923 => 33977, -23924 => 33972, 23925 => 33943, 23926 => 34021, 23927 => 34019, 23928 => 34060, -23929 => 29965, 23930 => 34104, 23931 => 34032, 23932 => 34105, 23933 => 34079, -23934 => 34106, 24097 => 34134, 24098 => 34107, 24099 => 34047, 24100 => 34044, -24101 => 34137, 24102 => 34120, 24103 => 34152, 24104 => 34148, 24105 => 34142, -24106 => 34170, 24107 => 30626, 24108 => 34115, 24109 => 34162, 24110 => 34171, -24111 => 34212, 24112 => 34216, 24113 => 34183, 24114 => 34191, 24115 => 34169, -24116 => 34222, 24117 => 34204, 24118 => 34181, 24119 => 34233, 24120 => 34231, -24121 => 34224, 24122 => 34259, 24123 => 34241, 24124 => 34268, 24125 => 34303, -24126 => 34343, 24127 => 34309, 24128 => 34345, 24129 => 34326, 24130 => 34364, -24131 => 24318, 24132 => 24328, 24133 => 22844, 24134 => 22849, 24135 => 32823, -24136 => 22869, 24137 => 22874, 24138 => 22872, 24139 => 21263, 24140 => 23586, -24141 => 23589, 24142 => 23596, 24143 => 23604, 24144 => 25164, 24145 => 25194, -24146 => 25247, 24147 => 25275, 24148 => 25290, 24149 => 25306, 24150 => 25303, -24151 => 25326, 24152 => 25378, 24153 => 25334, 24154 => 25401, 24155 => 25419, -24156 => 25411, 24157 => 25517, 24158 => 25590, 24159 => 25457, 24160 => 25466, -24161 => 25486, 24162 => 25524, 24163 => 25453, 24164 => 25516, 24165 => 25482, -24166 => 25449, 24167 => 25518, 24168 => 25532, 24169 => 25586, 24170 => 25592, -24171 => 25568, 24172 => 25599, 24173 => 25540, 24174 => 25566, 24175 => 25550, -24176 => 25682, 24177 => 25542, 24178 => 25534, 24179 => 25669, 24180 => 25665, -24181 => 25611, 24182 => 25627, 24183 => 25632, 24184 => 25612, 24185 => 25638, -24186 => 25633, 24187 => 25694, 24188 => 25732, 24189 => 25709, 24190 => 25750, -24353 => 25722, 24354 => 25783, 24355 => 25784, 24356 => 25753, 24357 => 25786, -24358 => 25792, 24359 => 25808, 24360 => 25815, 24361 => 25828, 24362 => 25826, -24363 => 25865, 24364 => 25893, 24365 => 25902, 24366 => 24331, 24367 => 24530, -24368 => 29977, 24369 => 24337, 24370 => 21343, 24371 => 21489, 24372 => 21501, -24373 => 21481, 24374 => 21480, 24375 => 21499, 24376 => 21522, 24377 => 21526, -24378 => 21510, 24379 => 21579, 24380 => 21586, 24381 => 21587, 24382 => 21588, -24383 => 21590, 24384 => 21571, 24385 => 21537, 24386 => 21591, 24387 => 21593, -24388 => 21539, 24389 => 21554, 24390 => 21634, 24391 => 21652, 24392 => 21623, -24393 => 21617, 24394 => 21604, 24395 => 21658, 24396 => 21659, 24397 => 21636, -24398 => 21622, 24399 => 21606, 24400 => 21661, 24401 => 21712, 24402 => 21677, -24403 => 21698, 24404 => 21684, 24405 => 21714, 24406 => 21671, 24407 => 21670, -24408 => 21715, 24409 => 21716, 24410 => 21618, 24411 => 21667, 24412 => 21717, -24413 => 21691, 24414 => 21695, 24415 => 21708, 24416 => 21721, 24417 => 21722, -24418 => 21724, 24419 => 21673, 24420 => 21674, 24421 => 21668, 24422 => 21725, -24423 => 21711, 24424 => 21726, 24425 => 21787, 24426 => 21735, 24427 => 21792, -24428 => 21757, 24429 => 21780, 24430 => 21747, 24431 => 21794, 24432 => 21795, -24433 => 21775, 24434 => 21777, 24435 => 21799, 24436 => 21802, 24437 => 21863, -24438 => 21903, 24439 => 21941, 24440 => 21833, 24441 => 21869, 24442 => 21825, -24443 => 21845, 24444 => 21823, 24445 => 21840, 24446 => 21820, 24609 => 21815, -24610 => 21846, 24611 => 21877, 24612 => 21878, 24613 => 21879, 24614 => 21811, -24615 => 21808, 24616 => 21852, 24617 => 21899, 24618 => 21970, 24619 => 21891, -24620 => 21937, 24621 => 21945, 24622 => 21896, 24623 => 21889, 24624 => 21919, -24625 => 21886, 24626 => 21974, 24627 => 21905, 24628 => 21883, 24629 => 21983, -24630 => 21949, 24631 => 21950, 24632 => 21908, 24633 => 21913, 24634 => 21994, -24635 => 22007, 24636 => 21961, 24637 => 22047, 24638 => 21969, 24639 => 21995, -24640 => 21996, 24641 => 21972, 24642 => 21990, 24643 => 21981, 24644 => 21956, -24645 => 21999, 24646 => 21989, 24647 => 22002, 24648 => 22003, 24649 => 21964, -24650 => 21965, 24651 => 21992, 24652 => 22005, 24653 => 21988, 24654 => 36756, -24655 => 22046, 24656 => 22024, 24657 => 22028, 24658 => 22017, 24659 => 22052, -24660 => 22051, 24661 => 22014, 24662 => 22016, 24663 => 22055, 24664 => 22061, -24665 => 22104, 24666 => 22073, 24667 => 22103, 24668 => 22060, 24669 => 22093, -24670 => 22114, 24671 => 22105, 24672 => 22108, 24673 => 22092, 24674 => 22100, -24675 => 22150, 24676 => 22116, 24677 => 22129, 24678 => 22123, 24679 => 22139, -24680 => 22140, 24681 => 22149, 24682 => 22163, 24683 => 22191, 24684 => 22228, -24685 => 22231, 24686 => 22237, 24687 => 22241, 24688 => 22261, 24689 => 22251, -24690 => 22265, 24691 => 22271, 24692 => 22276, 24693 => 22282, 24694 => 22281, -24695 => 22300, 24696 => 24079, 24697 => 24089, 24698 => 24084, 24699 => 24081, -24700 => 24113, 24701 => 24123, 24702 => 24124, 24865 => 24119, 24866 => 24132, -24867 => 24148, 24868 => 24155, 24869 => 24158, 24870 => 24161, 24871 => 23692, -24872 => 23674, 24873 => 23693, 24874 => 23696, 24875 => 23702, 24876 => 23688, -24877 => 23704, 24878 => 23705, 24879 => 23697, 24880 => 23706, 24881 => 23708, -24882 => 23733, 24883 => 23714, 24884 => 23741, 24885 => 23724, 24886 => 23723, -24887 => 23729, 24888 => 23715, 24889 => 23745, 24890 => 23735, 24891 => 23748, -24892 => 23762, 24893 => 23780, 24894 => 23755, 24895 => 23781, 24896 => 23810, -24897 => 23811, 24898 => 23847, 24899 => 23846, 24900 => 23854, 24901 => 23844, -24902 => 23838, 24903 => 23814, 24904 => 23835, 24905 => 23896, 24906 => 23870, -24907 => 23860, 24908 => 23869, 24909 => 23916, 24910 => 23899, 24911 => 23919, -24912 => 23901, 24913 => 23915, 24914 => 23883, 24915 => 23882, 24916 => 23913, -24917 => 23924, 24918 => 23938, 24919 => 23961, 24920 => 23965, 24921 => 35955, -24922 => 23991, 24923 => 24005, 24924 => 24435, 24925 => 24439, 24926 => 24450, -24927 => 24455, 24928 => 24457, 24929 => 24460, 24930 => 24469, 24931 => 24473, -24932 => 24476, 24933 => 24488, 24934 => 24493, 24935 => 24501, 24936 => 24508, -24937 => 34914, 24938 => 24417, 24939 => 29357, 24940 => 29360, 24941 => 29364, -24942 => 29367, 24943 => 29368, 24944 => 29379, 24945 => 29377, 24946 => 29390, -24947 => 29389, 24948 => 29394, 24949 => 29416, 24950 => 29423, 24951 => 29417, -24952 => 29426, 24953 => 29428, 24954 => 29431, 24955 => 29441, 24956 => 29427, -24957 => 29443, 24958 => 29434, 25121 => 29435, 25122 => 29463, 25123 => 29459, -25124 => 29473, 25125 => 29450, 25126 => 29470, 25127 => 29469, 25128 => 29461, -25129 => 29474, 25130 => 29497, 25131 => 29477, 25132 => 29484, 25133 => 29496, -25134 => 29489, 25135 => 29520, 25136 => 29517, 25137 => 29527, 25138 => 29536, -25139 => 29548, 25140 => 29551, 25141 => 29566, 25142 => 33307, 25143 => 22821, -25144 => 39143, 25145 => 22820, 25146 => 22786, 25147 => 39267, 25148 => 39271, -25149 => 39272, 25150 => 39273, 25151 => 39274, 25152 => 39275, 25153 => 39276, -25154 => 39284, 25155 => 39287, 25156 => 39293, 25157 => 39296, 25158 => 39300, -25159 => 39303, 25160 => 39306, 25161 => 39309, 25162 => 39312, 25163 => 39313, -25164 => 39315, 25165 => 39316, 25166 => 39317, 25167 => 24192, 25168 => 24209, -25169 => 24203, 25170 => 24214, 25171 => 24229, 25172 => 24224, 25173 => 24249, -25174 => 24245, 25175 => 24254, 25176 => 24243, 25177 => 36179, 25178 => 24274, -25179 => 24273, 25180 => 24283, 25181 => 24296, 25182 => 24298, 25183 => 33210, -25184 => 24516, 25185 => 24521, 25186 => 24534, 25187 => 24527, 25188 => 24579, -25189 => 24558, 25190 => 24580, 25191 => 24545, 25192 => 24548, 25193 => 24574, -25194 => 24581, 25195 => 24582, 25196 => 24554, 25197 => 24557, 25198 => 24568, -25199 => 24601, 25200 => 24629, 25201 => 24614, 25202 => 24603, 25203 => 24591, -25204 => 24589, 25205 => 24617, 25206 => 24619, 25207 => 24586, 25208 => 24639, -25209 => 24609, 25210 => 24696, 25211 => 24697, 25212 => 24699, 25213 => 24698, -25214 => 24642, 25377 => 24682, 25378 => 24701, 25379 => 24726, 25380 => 24730, -25381 => 24749, 25382 => 24733, 25383 => 24707, 25384 => 24722, 25385 => 24716, -25386 => 24731, 25387 => 24812, 25388 => 24763, 25389 => 24753, 25390 => 24797, -25391 => 24792, 25392 => 24774, 25393 => 24794, 25394 => 24756, 25395 => 24864, -25396 => 24870, 25397 => 24853, 25398 => 24867, 25399 => 24820, 25400 => 24832, -25401 => 24846, 25402 => 24875, 25403 => 24906, 25404 => 24949, 25405 => 25004, -25406 => 24980, 25407 => 24999, 25408 => 25015, 25409 => 25044, 25410 => 25077, -25411 => 24541, 25412 => 38579, 25413 => 38377, 25414 => 38379, 25415 => 38385, -25416 => 38387, 25417 => 38389, 25418 => 38390, 25419 => 38396, 25420 => 38398, -25421 => 38403, 25422 => 38404, 25423 => 38406, 25424 => 38408, 25425 => 38410, -25426 => 38411, 25427 => 38412, 25428 => 38413, 25429 => 38415, 25430 => 38418, -25431 => 38421, 25432 => 38422, 25433 => 38423, 25434 => 38425, 25435 => 38426, -25436 => 20012, 25437 => 29247, 25438 => 25109, 25439 => 27701, 25440 => 27732, -25441 => 27740, 25442 => 27722, 25443 => 27811, 25444 => 27781, 25445 => 27792, -25446 => 27796, 25447 => 27788, 25448 => 27752, 25449 => 27753, 25450 => 27764, -25451 => 27766, 25452 => 27782, 25453 => 27817, 25454 => 27856, 25455 => 27860, -25456 => 27821, 25457 => 27895, 25458 => 27896, 25459 => 27889, 25460 => 27863, -25461 => 27826, 25462 => 27872, 25463 => 27862, 25464 => 27898, 25465 => 27883, -25466 => 27886, 25467 => 27825, 25468 => 27859, 25469 => 27887, 25470 => 27902, -25633 => 27961, 25634 => 27943, 25635 => 27916, 25636 => 27971, 25637 => 27976, -25638 => 27911, 25639 => 27908, 25640 => 27929, 25641 => 27918, 25642 => 27947, -25643 => 27981, 25644 => 27950, 25645 => 27957, 25646 => 27930, 25647 => 27983, -25648 => 27986, 25649 => 27988, 25650 => 27955, 25651 => 28049, 25652 => 28015, -25653 => 28062, 25654 => 28064, 25655 => 27998, 25656 => 28051, 25657 => 28052, -25658 => 27996, 25659 => 28000, 25660 => 28028, 25661 => 28003, 25662 => 28186, -25663 => 28103, 25664 => 28101, 25665 => 28126, 25666 => 28174, 25667 => 28095, -25668 => 28128, 25669 => 28177, 25670 => 28134, 25671 => 28125, 25672 => 28121, -25673 => 28182, 25674 => 28075, 25675 => 28172, 25676 => 28078, 25677 => 28203, -25678 => 28270, 25679 => 28238, 25680 => 28267, 25681 => 28338, 25682 => 28255, -25683 => 28294, 25684 => 28243, 25685 => 28244, 25686 => 28210, 25687 => 28197, -25688 => 28228, 25689 => 28383, 25690 => 28337, 25691 => 28312, 25692 => 28384, -25693 => 28461, 25694 => 28386, 25695 => 28325, 25696 => 28327, 25697 => 28349, -25698 => 28347, 25699 => 28343, 25700 => 28375, 25701 => 28340, 25702 => 28367, -25703 => 28303, 25704 => 28354, 25705 => 28319, 25706 => 28514, 25707 => 28486, -25708 => 28487, 25709 => 28452, 25710 => 28437, 25711 => 28409, 25712 => 28463, -25713 => 28470, 25714 => 28491, 25715 => 28532, 25716 => 28458, 25717 => 28425, -25718 => 28457, 25719 => 28553, 25720 => 28557, 25721 => 28556, 25722 => 28536, -25723 => 28530, 25724 => 28540, 25725 => 28538, 25726 => 28625, 25889 => 28617, -25890 => 28583, 25891 => 28601, 25892 => 28598, 25893 => 28610, 25894 => 28641, -25895 => 28654, 25896 => 28638, 25897 => 28640, 25898 => 28655, 25899 => 28698, -25900 => 28707, 25901 => 28699, 25902 => 28729, 25903 => 28725, 25904 => 28751, -25905 => 28766, 25906 => 23424, 25907 => 23428, 25908 => 23445, 25909 => 23443, -25910 => 23461, 25911 => 23480, 25912 => 29999, 25913 => 39582, 25914 => 25652, -25915 => 23524, 25916 => 23534, 25917 => 35120, 25918 => 23536, 25919 => 36423, -25920 => 35591, 25921 => 36790, 25922 => 36819, 25923 => 36821, 25924 => 36837, -25925 => 36846, 25926 => 36836, 25927 => 36841, 25928 => 36838, 25929 => 36851, -25930 => 36840, 25931 => 36869, 25932 => 36868, 25933 => 36875, 25934 => 36902, -25935 => 36881, 25936 => 36877, 25937 => 36886, 25938 => 36897, 25939 => 36917, -25940 => 36918, 25941 => 36909, 25942 => 36911, 25943 => 36932, 25944 => 36945, -25945 => 36946, 25946 => 36944, 25947 => 36968, 25948 => 36952, 25949 => 36962, -25950 => 36955, 25951 => 26297, 25952 => 36980, 25953 => 36989, 25954 => 36994, -25955 => 37000, 25956 => 36995, 25957 => 37003, 25958 => 24400, 25959 => 24407, -25960 => 24406, 25961 => 24408, 25962 => 23611, 25963 => 21675, 25964 => 23632, -25965 => 23641, 25966 => 23409, 25967 => 23651, 25968 => 23654, 25969 => 32700, -25970 => 24362, 25971 => 24361, 25972 => 24365, 25973 => 33396, 25974 => 24380, -25975 => 39739, 25976 => 23662, 25977 => 22913, 25978 => 22915, 25979 => 22925, -25980 => 22953, 25981 => 22954, 25982 => 22947, 26145 => 22935, 26146 => 22986, -26147 => 22955, 26148 => 22942, 26149 => 22948, 26150 => 22994, 26151 => 22962, -26152 => 22959, 26153 => 22999, 26154 => 22974, 26155 => 23045, 26156 => 23046, -26157 => 23005, 26158 => 23048, 26159 => 23011, 26160 => 23000, 26161 => 23033, -26162 => 23052, 26163 => 23049, 26164 => 23090, 26165 => 23092, 26166 => 23057, -26167 => 23075, 26168 => 23059, 26169 => 23104, 26170 => 23143, 26171 => 23114, -26172 => 23125, 26173 => 23100, 26174 => 23138, 26175 => 23157, 26176 => 33004, -26177 => 23210, 26178 => 23195, 26179 => 23159, 26180 => 23162, 26181 => 23230, -26182 => 23275, 26183 => 23218, 26184 => 23250, 26185 => 23252, 26186 => 23224, -26187 => 23264, 26188 => 23267, 26189 => 23281, 26190 => 23254, 26191 => 23270, -26192 => 23256, 26193 => 23260, 26194 => 23305, 26195 => 23319, 26196 => 23318, -26197 => 23346, 26198 => 23351, 26199 => 23360, 26200 => 23573, 26201 => 23580, -26202 => 23386, 26203 => 23397, 26204 => 23411, 26205 => 23377, 26206 => 23379, -26207 => 23394, 26208 => 39541, 26209 => 39543, 26210 => 39544, 26211 => 39546, -26212 => 39551, 26213 => 39549, 26214 => 39552, 26215 => 39553, 26216 => 39557, -26217 => 39560, 26218 => 39562, 26219 => 39568, 26220 => 39570, 26221 => 39571, -26222 => 39574, 26223 => 39576, 26224 => 39579, 26225 => 39580, 26226 => 39581, -26227 => 39583, 26228 => 39584, 26229 => 39586, 26230 => 39587, 26231 => 39589, -26232 => 39591, 26233 => 32415, 26234 => 32417, 26235 => 32419, 26236 => 32421, -26237 => 32424, 26238 => 32425, 26401 => 32429, 26402 => 32432, 26403 => 32446, -26404 => 32448, 26405 => 32449, 26406 => 32450, 26407 => 32457, 26408 => 32459, -26409 => 32460, 26410 => 32464, 26411 => 32468, 26412 => 32471, 26413 => 32475, -26414 => 32480, 26415 => 32481, 26416 => 32488, 26417 => 32491, 26418 => 32494, -26419 => 32495, 26420 => 32497, 26421 => 32498, 26422 => 32525, 26423 => 32502, -26424 => 32506, 26425 => 32507, 26426 => 32510, 26427 => 32513, 26428 => 32514, -26429 => 32515, 26430 => 32519, 26431 => 32520, 26432 => 32523, 26433 => 32524, -26434 => 32527, 26435 => 32529, 26436 => 32530, 26437 => 32535, 26438 => 32537, -26439 => 32540, 26440 => 32539, 26441 => 32543, 26442 => 32545, 26443 => 32546, -26444 => 32547, 26445 => 32548, 26446 => 32549, 26447 => 32550, 26448 => 32551, -26449 => 32554, 26450 => 32555, 26451 => 32556, 26452 => 32557, 26453 => 32559, -26454 => 32560, 26455 => 32561, 26456 => 32562, 26457 => 32563, 26458 => 32565, -26459 => 24186, 26460 => 30079, 26461 => 24027, 26462 => 30014, 26463 => 37013, -26464 => 29582, 26465 => 29585, 26466 => 29614, 26467 => 29602, 26468 => 29599, -26469 => 29647, 26470 => 29634, 26471 => 29649, 26472 => 29623, 26473 => 29619, -26474 => 29632, 26475 => 29641, 26476 => 29640, 26477 => 29669, 26478 => 29657, -26479 => 39036, 26480 => 29706, 26481 => 29673, 26482 => 29671, 26483 => 29662, -26484 => 29626, 26485 => 29682, 26486 => 29711, 26487 => 29738, 26488 => 29787, -26489 => 29734, 26490 => 29733, 26491 => 29736, 26492 => 29744, 26493 => 29742, -26494 => 29740, 26657 => 29723, 26658 => 29722, 26659 => 29761, 26660 => 29788, -26661 => 29783, 26662 => 29781, 26663 => 29785, 26664 => 29815, 26665 => 29805, -26666 => 29822, 26667 => 29852, 26668 => 29838, 26669 => 29824, 26670 => 29825, -26671 => 29831, 26672 => 29835, 26673 => 29854, 26674 => 29864, 26675 => 29865, -26676 => 29840, 26677 => 29863, 26678 => 29906, 26679 => 29882, 26680 => 38890, -26681 => 38891, 26682 => 38892, 26683 => 26444, 26684 => 26451, 26685 => 26462, -26686 => 26440, 26687 => 26473, 26688 => 26533, 26689 => 26503, 26690 => 26474, -26691 => 26483, 26692 => 26520, 26693 => 26535, 26694 => 26485, 26695 => 26536, -26696 => 26526, 26697 => 26541, 26698 => 26507, 26699 => 26487, 26700 => 26492, -26701 => 26608, 26702 => 26633, 26703 => 26584, 26704 => 26634, 26705 => 26601, -26706 => 26544, 26707 => 26636, 26708 => 26585, 26709 => 26549, 26710 => 26586, -26711 => 26547, 26712 => 26589, 26713 => 26624, 26714 => 26563, 26715 => 26552, -26716 => 26594, 26717 => 26638, 26718 => 26561, 26719 => 26621, 26720 => 26674, -26721 => 26675, 26722 => 26720, 26723 => 26721, 26724 => 26702, 26725 => 26722, -26726 => 26692, 26727 => 26724, 26728 => 26755, 26729 => 26653, 26730 => 26709, -26731 => 26726, 26732 => 26689, 26733 => 26727, 26734 => 26688, 26735 => 26686, -26736 => 26698, 26737 => 26697, 26738 => 26665, 26739 => 26805, 26740 => 26767, -26741 => 26740, 26742 => 26743, 26743 => 26771, 26744 => 26731, 26745 => 26818, -26746 => 26990, 26747 => 26876, 26748 => 26911, 26749 => 26912, 26750 => 26873, -26913 => 26916, 26914 => 26864, 26915 => 26891, 26916 => 26881, 26917 => 26967, -26918 => 26851, 26919 => 26896, 26920 => 26993, 26921 => 26937, 26922 => 26976, -26923 => 26946, 26924 => 26973, 26925 => 27012, 26926 => 26987, 26927 => 27008, -26928 => 27032, 26929 => 27000, 26930 => 26932, 26931 => 27084, 26932 => 27015, -26933 => 27016, 26934 => 27086, 26935 => 27017, 26936 => 26982, 26937 => 26979, -26938 => 27001, 26939 => 27035, 26940 => 27047, 26941 => 27067, 26942 => 27051, -26943 => 27053, 26944 => 27092, 26945 => 27057, 26946 => 27073, 26947 => 27082, -26948 => 27103, 26949 => 27029, 26950 => 27104, 26951 => 27021, 26952 => 27135, -26953 => 27183, 26954 => 27117, 26955 => 27159, 26956 => 27160, 26957 => 27237, -26958 => 27122, 26959 => 27204, 26960 => 27198, 26961 => 27296, 26962 => 27216, -26963 => 27227, 26964 => 27189, 26965 => 27278, 26966 => 27257, 26967 => 27197, -26968 => 27176, 26969 => 27224, 26970 => 27260, 26971 => 27281, 26972 => 27280, -26973 => 27305, 26974 => 27287, 26975 => 27307, 26976 => 29495, 26977 => 29522, -26978 => 27521, 26979 => 27522, 26980 => 27527, 26981 => 27524, 26982 => 27538, -26983 => 27539, 26984 => 27533, 26985 => 27546, 26986 => 27547, 26987 => 27553, -26988 => 27562, 26989 => 36715, 26990 => 36717, 26991 => 36721, 26992 => 36722, -26993 => 36723, 26994 => 36725, 26995 => 36726, 26996 => 36728, 26997 => 36727, -26998 => 36729, 26999 => 36730, 27000 => 36732, 27001 => 36734, 27002 => 36737, -27003 => 36738, 27004 => 36740, 27005 => 36743, 27006 => 36747, 27169 => 36749, -27170 => 36750, 27171 => 36751, 27172 => 36760, 27173 => 36762, 27174 => 36558, -27175 => 25099, 27176 => 25111, 27177 => 25115, 27178 => 25119, 27179 => 25122, -27180 => 25121, 27181 => 25125, 27182 => 25124, 27183 => 25132, 27184 => 33255, -27185 => 29935, 27186 => 29940, 27187 => 29951, 27188 => 29967, 27189 => 29969, -27190 => 29971, 27191 => 25908, 27192 => 26094, 27193 => 26095, 27194 => 26096, -27195 => 26122, 27196 => 26137, 27197 => 26482, 27198 => 26115, 27199 => 26133, -27200 => 26112, 27201 => 28805, 27202 => 26359, 27203 => 26141, 27204 => 26164, -27205 => 26161, 27206 => 26166, 27207 => 26165, 27208 => 32774, 27209 => 26207, -27210 => 26196, 27211 => 26177, 27212 => 26191, 27213 => 26198, 27214 => 26209, -27215 => 26199, 27216 => 26231, 27217 => 26244, 27218 => 26252, 27219 => 26279, -27220 => 26269, 27221 => 26302, 27222 => 26331, 27223 => 26332, 27224 => 26342, -27225 => 26345, 27226 => 36146, 27227 => 36147, 27228 => 36150, 27229 => 36155, -27230 => 36157, 27231 => 36160, 27232 => 36165, 27233 => 36166, 27234 => 36168, -27235 => 36169, 27236 => 36167, 27237 => 36173, 27238 => 36181, 27239 => 36185, -27240 => 35271, 27241 => 35274, 27242 => 35275, 27243 => 35276, 27244 => 35278, -27245 => 35279, 27246 => 35280, 27247 => 35281, 27248 => 29294, 27249 => 29343, -27250 => 29277, 27251 => 29286, 27252 => 29295, 27253 => 29310, 27254 => 29311, -27255 => 29316, 27256 => 29323, 27257 => 29325, 27258 => 29327, 27259 => 29330, -27260 => 25352, 27261 => 25394, 27262 => 25520, 27425 => 25663, 27426 => 25816, -27427 => 32772, 27428 => 27626, 27429 => 27635, 27430 => 27645, 27431 => 27637, -27432 => 27641, 27433 => 27653, 27434 => 27655, 27435 => 27654, 27436 => 27661, -27437 => 27669, 27438 => 27672, 27439 => 27673, 27440 => 27674, 27441 => 27681, -27442 => 27689, 27443 => 27684, 27444 => 27690, 27445 => 27698, 27446 => 25909, -27447 => 25941, 27448 => 25963, 27449 => 29261, 27450 => 29266, 27451 => 29270, -27452 => 29232, 27453 => 34402, 27454 => 21014, 27455 => 32927, 27456 => 32924, -27457 => 32915, 27458 => 32956, 27459 => 26378, 27460 => 32957, 27461 => 32945, -27462 => 32939, 27463 => 32941, 27464 => 32948, 27465 => 32951, 27466 => 32999, -27467 => 33000, 27468 => 33001, 27469 => 33002, 27470 => 32987, 27471 => 32962, -27472 => 32964, 27473 => 32985, 27474 => 32973, 27475 => 32983, 27476 => 26384, -27477 => 32989, 27478 => 33003, 27479 => 33009, 27480 => 33012, 27481 => 33005, -27482 => 33037, 27483 => 33038, 27484 => 33010, 27485 => 33020, 27486 => 26389, -27487 => 33042, 27488 => 35930, 27489 => 33078, 27490 => 33054, 27491 => 33068, -27492 => 33048, 27493 => 33074, 27494 => 33096, 27495 => 33100, 27496 => 33107, -27497 => 33140, 27498 => 33113, 27499 => 33114, 27500 => 33137, 27501 => 33120, -27502 => 33129, 27503 => 33148, 27504 => 33149, 27505 => 33133, 27506 => 33127, -27507 => 22605, 27508 => 23221, 27509 => 33160, 27510 => 33154, 27511 => 33169, -27512 => 28373, 27513 => 33187, 27514 => 33194, 27515 => 33228, 27516 => 26406, -27517 => 33226, 27518 => 33211, 27681 => 33217, 27682 => 33190, 27683 => 27428, -27684 => 27447, 27685 => 27449, 27686 => 27459, 27687 => 27462, 27688 => 27481, -27689 => 39121, 27690 => 39122, 27691 => 39123, 27692 => 39125, 27693 => 39129, -27694 => 39130, 27695 => 27571, 27696 => 24384, 27697 => 27586, 27698 => 35315, -27699 => 26000, 27700 => 40785, 27701 => 26003, 27702 => 26044, 27703 => 26054, -27704 => 26052, 27705 => 26051, 27706 => 26060, 27707 => 26062, 27708 => 26066, -27709 => 26070, 27710 => 28800, 27711 => 28828, 27712 => 28822, 27713 => 28829, -27714 => 28859, 27715 => 28864, 27716 => 28855, 27717 => 28843, 27718 => 28849, -27719 => 28904, 27720 => 28874, 27721 => 28944, 27722 => 28947, 27723 => 28950, -27724 => 28975, 27725 => 28977, 27726 => 29043, 27727 => 29020, 27728 => 29032, -27729 => 28997, 27730 => 29042, 27731 => 29002, 27732 => 29048, 27733 => 29050, -27734 => 29080, 27735 => 29107, 27736 => 29109, 27737 => 29096, 27738 => 29088, -27739 => 29152, 27740 => 29140, 27741 => 29159, 27742 => 29177, 27743 => 29213, -27744 => 29224, 27745 => 28780, 27746 => 28952, 27747 => 29030, 27748 => 29113, -27749 => 25150, 27750 => 25149, 27751 => 25155, 27752 => 25160, 27753 => 25161, -27754 => 31035, 27755 => 31040, 27756 => 31046, 27757 => 31049, 27758 => 31067, -27759 => 31068, 27760 => 31059, 27761 => 31066, 27762 => 31074, 27763 => 31063, -27764 => 31072, 27765 => 31087, 27766 => 31079, 27767 => 31098, 27768 => 31109, -27769 => 31114, 27770 => 31130, 27771 => 31143, 27772 => 31155, 27773 => 24529, -27774 => 24528, 27937 => 24636, 27938 => 24669, 27939 => 24666, 27940 => 24679, -27941 => 24641, 27942 => 24665, 27943 => 24675, 27944 => 24747, 27945 => 24838, -27946 => 24845, 27947 => 24925, 27948 => 25001, 27949 => 24989, 27950 => 25035, -27951 => 25041, 27952 => 25094, 27953 => 32896, 27954 => 32895, 27955 => 27795, -27956 => 27894, 27957 => 28156, 27958 => 30710, 27959 => 30712, 27960 => 30720, -27961 => 30729, 27962 => 30743, 27963 => 30744, 27964 => 30737, 27965 => 26027, -27966 => 30765, 27967 => 30748, 27968 => 30749, 27969 => 30777, 27970 => 30778, -27971 => 30779, 27972 => 30751, 27973 => 30780, 27974 => 30757, 27975 => 30764, -27976 => 30755, 27977 => 30761, 27978 => 30798, 27979 => 30829, 27980 => 30806, -27981 => 30807, 27982 => 30758, 27983 => 30800, 27984 => 30791, 27985 => 30796, -27986 => 30826, 27987 => 30875, 27988 => 30867, 27989 => 30874, 27990 => 30855, -27991 => 30876, 27992 => 30881, 27993 => 30883, 27994 => 30898, 27995 => 30905, -27996 => 30885, 27997 => 30932, 27998 => 30937, 27999 => 30921, 28000 => 30956, -28001 => 30962, 28002 => 30981, 28003 => 30964, 28004 => 30995, 28005 => 31012, -28006 => 31006, 28007 => 31028, 28008 => 40859, 28009 => 40697, 28010 => 40699, -28011 => 40700, 28012 => 30449, 28013 => 30468, 28014 => 30477, 28015 => 30457, -28016 => 30471, 28017 => 30472, 28018 => 30490, 28019 => 30498, 28020 => 30489, -28021 => 30509, 28022 => 30502, 28023 => 30517, 28024 => 30520, 28025 => 30544, -28026 => 30545, 28027 => 30535, 28028 => 30531, 28029 => 30554, 28030 => 30568, -28193 => 30562, 28194 => 30565, 28195 => 30591, 28196 => 30605, 28197 => 30589, -28198 => 30592, 28199 => 30604, 28200 => 30609, 28201 => 30623, 28202 => 30624, -28203 => 30640, 28204 => 30645, 28205 => 30653, 28206 => 30010, 28207 => 30016, -28208 => 30030, 28209 => 30027, 28210 => 30024, 28211 => 30043, 28212 => 30066, -28213 => 30073, 28214 => 30083, 28215 => 32600, 28216 => 32609, 28217 => 32607, -28218 => 35400, 28219 => 32616, 28220 => 32628, 28221 => 32625, 28222 => 32633, -28223 => 32641, 28224 => 32638, 28225 => 30413, 28226 => 30437, 28227 => 34866, -28228 => 38021, 28229 => 38022, 28230 => 38023, 28231 => 38027, 28232 => 38026, -28233 => 38028, 28234 => 38029, 28235 => 38031, 28236 => 38032, 28237 => 38036, -28238 => 38039, 28239 => 38037, 28240 => 38042, 28241 => 38043, 28242 => 38044, -28243 => 38051, 28244 => 38052, 28245 => 38059, 28246 => 38058, 28247 => 38061, -28248 => 38060, 28249 => 38063, 28250 => 38064, 28251 => 38066, 28252 => 38068, -28253 => 38070, 28254 => 38071, 28255 => 38072, 28256 => 38073, 28257 => 38074, -28258 => 38076, 28259 => 38077, 28260 => 38079, 28261 => 38084, 28262 => 38088, -28263 => 38089, 28264 => 38090, 28265 => 38091, 28266 => 38092, 28267 => 38093, -28268 => 38094, 28269 => 38096, 28270 => 38097, 28271 => 38098, 28272 => 38101, -28273 => 38102, 28274 => 38103, 28275 => 38105, 28276 => 38104, 28277 => 38107, -28278 => 38110, 28279 => 38111, 28280 => 38112, 28281 => 38114, 28282 => 38116, -28283 => 38117, 28284 => 38119, 28285 => 38120, 28286 => 38122, 28449 => 38121, -28450 => 38123, 28451 => 38126, 28452 => 38127, 28453 => 38131, 28454 => 38132, -28455 => 38133, 28456 => 38135, 28457 => 38137, 28458 => 38140, 28459 => 38141, -28460 => 38143, 28461 => 38147, 28462 => 38146, 28463 => 38150, 28464 => 38151, -28465 => 38153, 28466 => 38154, 28467 => 38157, 28468 => 38158, 28469 => 38159, -28470 => 38162, 28471 => 38163, 28472 => 38164, 28473 => 38165, 28474 => 38166, -28475 => 38168, 28476 => 38171, 28477 => 38173, 28478 => 38174, 28479 => 38175, -28480 => 38178, 28481 => 38186, 28482 => 38187, 28483 => 38185, 28484 => 38188, -28485 => 38193, 28486 => 38194, 28487 => 38196, 28488 => 38198, 28489 => 38199, -28490 => 38200, 28491 => 38204, 28492 => 38206, 28493 => 38207, 28494 => 38210, -28495 => 38197, 28496 => 38212, 28497 => 38213, 28498 => 38214, 28499 => 38217, -28500 => 38220, 28501 => 38222, 28502 => 38223, 28503 => 38226, 28504 => 38227, -28505 => 38228, 28506 => 38230, 28507 => 38231, 28508 => 38232, 28509 => 38233, -28510 => 38235, 28511 => 38238, 28512 => 38239, 28513 => 38237, 28514 => 38241, -28515 => 38242, 28516 => 38244, 28517 => 38245, 28518 => 38246, 28519 => 38247, -28520 => 38248, 28521 => 38249, 28522 => 38250, 28523 => 38251, 28524 => 38252, -28525 => 38255, 28526 => 38257, 28527 => 38258, 28528 => 38259, 28529 => 38202, -28530 => 30695, 28531 => 30700, 28532 => 38601, 28533 => 31189, 28534 => 31213, -28535 => 31203, 28536 => 31211, 28537 => 31238, 28538 => 23879, 28539 => 31235, -28540 => 31234, 28541 => 31262, 28542 => 31252, 28705 => 31289, 28706 => 31287, -28707 => 31313, 28708 => 40655, 28709 => 39333, 28710 => 31344, 28711 => 30344, -28712 => 30350, 28713 => 30355, 28714 => 30361, 28715 => 30372, 28716 => 29918, -28717 => 29920, 28718 => 29996, 28719 => 40480, 28720 => 40482, 28721 => 40488, -28722 => 40489, 28723 => 40490, 28724 => 40491, 28725 => 40492, 28726 => 40498, -28727 => 40497, 28728 => 40502, 28729 => 40504, 28730 => 40503, 28731 => 40505, -28732 => 40506, 28733 => 40510, 28734 => 40513, 28735 => 40514, 28736 => 40516, -28737 => 40518, 28738 => 40519, 28739 => 40520, 28740 => 40521, 28741 => 40523, -28742 => 40524, 28743 => 40526, 28744 => 40529, 28745 => 40533, 28746 => 40535, -28747 => 40538, 28748 => 40539, 28749 => 40540, 28750 => 40542, 28751 => 40547, -28752 => 40550, 28753 => 40551, 28754 => 40552, 28755 => 40553, 28756 => 40554, -28757 => 40555, 28758 => 40556, 28759 => 40561, 28760 => 40557, 28761 => 40563, -28762 => 30098, 28763 => 30100, 28764 => 30102, 28765 => 30112, 28766 => 30109, -28767 => 30124, 28768 => 30115, 28769 => 30131, 28770 => 30132, 28771 => 30136, -28772 => 30148, 28773 => 30129, 28774 => 30128, 28775 => 30147, 28776 => 30146, -28777 => 30166, 28778 => 30157, 28779 => 30179, 28780 => 30184, 28781 => 30182, -28782 => 30180, 28783 => 30187, 28784 => 30183, 28785 => 30211, 28786 => 30193, -28787 => 30204, 28788 => 30207, 28789 => 30224, 28790 => 30208, 28791 => 30213, -28792 => 30220, 28793 => 30231, 28794 => 30218, 28795 => 30245, 28796 => 30232, -28797 => 30229, 28798 => 30233, 28961 => 30235, 28962 => 30268, 28963 => 30242, -28964 => 30240, 28965 => 30272, 28966 => 30253, 28967 => 30256, 28968 => 30271, -28969 => 30261, 28970 => 30275, 28971 => 30270, 28972 => 30259, 28973 => 30285, -28974 => 30302, 28975 => 30292, 28976 => 30300, 28977 => 30294, 28978 => 30315, -28979 => 30319, 28980 => 32714, 28981 => 31462, 28982 => 31352, 28983 => 31353, -28984 => 31360, 28985 => 31366, 28986 => 31368, 28987 => 31381, 28988 => 31398, -28989 => 31392, 28990 => 31404, 28991 => 31400, 28992 => 31405, 28993 => 31411, -28994 => 34916, 28995 => 34921, 28996 => 34930, 28997 => 34941, 28998 => 34943, -28999 => 34946, 29000 => 34978, 29001 => 35014, 29002 => 34999, 29003 => 35004, -29004 => 35017, 29005 => 35042, 29006 => 35022, 29007 => 35043, 29008 => 35045, -29009 => 35057, 29010 => 35098, 29011 => 35068, 29012 => 35048, 29013 => 35070, -29014 => 35056, 29015 => 35105, 29016 => 35097, 29017 => 35091, 29018 => 35099, -29019 => 35082, 29020 => 35124, 29021 => 35115, 29022 => 35126, 29023 => 35137, -29024 => 35174, 29025 => 35195, 29026 => 30091, 29027 => 32997, 29028 => 30386, -29029 => 30388, 29030 => 30684, 29031 => 32786, 29032 => 32788, 29033 => 32790, -29034 => 32796, 29035 => 32800, 29036 => 32802, 29037 => 32805, 29038 => 32806, -29039 => 32807, 29040 => 32809, 29041 => 32808, 29042 => 32817, 29043 => 32779, -29044 => 32821, 29045 => 32835, 29046 => 32838, 29047 => 32845, 29048 => 32850, -29049 => 32873, 29050 => 32881, 29051 => 35203, 29052 => 39032, 29053 => 39040, -29054 => 39043, 29217 => 39049, 29218 => 39052, 29219 => 39053, 29220 => 39055, -29221 => 39060, 29222 => 39066, 29223 => 39067, 29224 => 39070, 29225 => 39071, -29226 => 39073, 29227 => 39074, 29228 => 39077, 29229 => 39078, 29230 => 34381, -29231 => 34388, 29232 => 34412, 29233 => 34414, 29234 => 34431, 29235 => 34426, -29236 => 34428, 29237 => 34427, 29238 => 34472, 29239 => 34445, 29240 => 34443, -29241 => 34476, 29242 => 34461, 29243 => 34471, 29244 => 34467, 29245 => 34474, -29246 => 34451, 29247 => 34473, 29248 => 34486, 29249 => 34500, 29250 => 34485, -29251 => 34510, 29252 => 34480, 29253 => 34490, 29254 => 34481, 29255 => 34479, -29256 => 34505, 29257 => 34511, 29258 => 34484, 29259 => 34537, 29260 => 34545, -29261 => 34546, 29262 => 34541, 29263 => 34547, 29264 => 34512, 29265 => 34579, -29266 => 34526, 29267 => 34548, 29268 => 34527, 29269 => 34520, 29270 => 34513, -29271 => 34563, 29272 => 34567, 29273 => 34552, 29274 => 34568, 29275 => 34570, -29276 => 34573, 29277 => 34569, 29278 => 34595, 29279 => 34619, 29280 => 34590, -29281 => 34597, 29282 => 34606, 29283 => 34586, 29284 => 34622, 29285 => 34632, -29286 => 34612, 29287 => 34609, 29288 => 34601, 29289 => 34615, 29290 => 34623, -29291 => 34690, 29292 => 34594, 29293 => 34685, 29294 => 34686, 29295 => 34683, -29296 => 34656, 29297 => 34672, 29298 => 34636, 29299 => 34670, 29300 => 34699, -29301 => 34643, 29302 => 34659, 29303 => 34684, 29304 => 34660, 29305 => 34649, -29306 => 34661, 29307 => 34707, 29308 => 34735, 29309 => 34728, 29310 => 34770, -29473 => 34758, 29474 => 34696, 29475 => 34693, 29476 => 34733, 29477 => 34711, -29478 => 34691, 29479 => 34731, 29480 => 34789, 29481 => 34732, 29482 => 34741, -29483 => 34739, 29484 => 34763, 29485 => 34771, 29486 => 34749, 29487 => 34769, -29488 => 34752, 29489 => 34762, 29490 => 34779, 29491 => 34794, 29492 => 34784, -29493 => 34798, 29494 => 34838, 29495 => 34835, 29496 => 34814, 29497 => 34826, -29498 => 34843, 29499 => 34849, 29500 => 34873, 29501 => 34876, 29502 => 32566, -29503 => 32578, 29504 => 32580, 29505 => 32581, 29506 => 33296, 29507 => 31482, -29508 => 31485, 29509 => 31496, 29510 => 31491, 29511 => 31492, 29512 => 31509, -29513 => 31498, 29514 => 31531, 29515 => 31503, 29516 => 31559, 29517 => 31544, -29518 => 31530, 29519 => 31513, 29520 => 31534, 29521 => 31537, 29522 => 31520, -29523 => 31525, 29524 => 31524, 29525 => 31539, 29526 => 31550, 29527 => 31518, -29528 => 31576, 29529 => 31578, 29530 => 31557, 29531 => 31605, 29532 => 31564, -29533 => 31581, 29534 => 31584, 29535 => 31598, 29536 => 31611, 29537 => 31586, -29538 => 31602, 29539 => 31601, 29540 => 31632, 29541 => 31654, 29542 => 31655, -29543 => 31672, 29544 => 31660, 29545 => 31645, 29546 => 31656, 29547 => 31621, -29548 => 31658, 29549 => 31644, 29550 => 31650, 29551 => 31659, 29552 => 31668, -29553 => 31697, 29554 => 31681, 29555 => 31692, 29556 => 31709, 29557 => 31706, -29558 => 31717, 29559 => 31718, 29560 => 31722, 29561 => 31756, 29562 => 31742, -29563 => 31740, 29564 => 31759, 29565 => 31766, 29566 => 31755, 29729 => 31775, -29730 => 31786, 29731 => 31782, 29732 => 31800, 29733 => 31809, 29734 => 31808, -29735 => 33278, 29736 => 33281, 29737 => 33282, 29738 => 33284, 29739 => 33260, -29740 => 34884, 29741 => 33313, 29742 => 33314, 29743 => 33315, 29744 => 33325, -29745 => 33327, 29746 => 33320, 29747 => 33323, 29748 => 33336, 29749 => 33339, -29750 => 33331, 29751 => 33332, 29752 => 33342, 29753 => 33348, 29754 => 33353, -29755 => 33355, 29756 => 33359, 29757 => 33370, 29758 => 33375, 29759 => 33384, -29760 => 34942, 29761 => 34949, 29762 => 34952, 29763 => 35032, 29764 => 35039, -29765 => 35166, 29766 => 32669, 29767 => 32671, 29768 => 32679, 29769 => 32687, -29770 => 32688, 29771 => 32690, 29772 => 31868, 29773 => 25929, 29774 => 31889, -29775 => 31901, 29776 => 31900, 29777 => 31902, 29778 => 31906, 29779 => 31922, -29780 => 31932, 29781 => 31933, 29782 => 31937, 29783 => 31943, 29784 => 31948, -29785 => 31949, 29786 => 31944, 29787 => 31941, 29788 => 31959, 29789 => 31976, -29790 => 33390, 29791 => 26280, 29792 => 32703, 29793 => 32718, 29794 => 32725, -29795 => 32741, 29796 => 32737, 29797 => 32742, 29798 => 32745, 29799 => 32750, -29800 => 32755, 29801 => 31992, 29802 => 32119, 29803 => 32166, 29804 => 32174, -29805 => 32327, 29806 => 32411, 29807 => 40632, 29808 => 40628, 29809 => 36211, -29810 => 36228, 29811 => 36244, 29812 => 36241, 29813 => 36273, 29814 => 36199, -29815 => 36205, 29816 => 35911, 29817 => 35913, 29818 => 37194, 29819 => 37200, -29820 => 37198, 29821 => 37199, 29822 => 37220, 29985 => 37218, 29986 => 37217, -29987 => 37232, 29988 => 37225, 29989 => 37231, 29990 => 37245, 29991 => 37246, -29992 => 37234, 29993 => 37236, 29994 => 37241, 29995 => 37260, 29996 => 37253, -29997 => 37264, 29998 => 37261, 29999 => 37265, 30000 => 37282, 30001 => 37283, -30002 => 37290, 30003 => 37293, 30004 => 37294, 30005 => 37295, 30006 => 37301, -30007 => 37300, 30008 => 37306, 30009 => 35925, 30010 => 40574, 30011 => 36280, -30012 => 36331, 30013 => 36357, 30014 => 36441, 30015 => 36457, 30016 => 36277, -30017 => 36287, 30018 => 36284, 30019 => 36282, 30020 => 36292, 30021 => 36310, -30022 => 36311, 30023 => 36314, 30024 => 36318, 30025 => 36302, 30026 => 36303, -30027 => 36315, 30028 => 36294, 30029 => 36332, 30030 => 36343, 30031 => 36344, -30032 => 36323, 30033 => 36345, 30034 => 36347, 30035 => 36324, 30036 => 36361, -30037 => 36349, 30038 => 36372, 30039 => 36381, 30040 => 36383, 30041 => 36396, -30042 => 36398, 30043 => 36387, 30044 => 36399, 30045 => 36410, 30046 => 36416, -30047 => 36409, 30048 => 36405, 30049 => 36413, 30050 => 36401, 30051 => 36425, -30052 => 36417, 30053 => 36418, 30054 => 36433, 30055 => 36434, 30056 => 36426, -30057 => 36464, 30058 => 36470, 30059 => 36476, 30060 => 36463, 30061 => 36468, -30062 => 36485, 30063 => 36495, 30064 => 36500, 30065 => 36496, 30066 => 36508, -30067 => 36510, 30068 => 35960, 30069 => 35970, 30070 => 35978, 30071 => 35973, -30072 => 35992, 30073 => 35988, 30074 => 26011, 30075 => 35286, 30076 => 35294, -30077 => 35290, 30078 => 35292, 30241 => 35301, 30242 => 35307, 30243 => 35311, -30244 => 35390, 30245 => 35622, 30246 => 38739, 30247 => 38633, 30248 => 38643, -30249 => 38639, 30250 => 38662, 30251 => 38657, 30252 => 38664, 30253 => 38671, -30254 => 38670, 30255 => 38698, 30256 => 38701, 30257 => 38704, 30258 => 38718, -30259 => 40832, 30260 => 40835, 30261 => 40837, 30262 => 40838, 30263 => 40839, -30264 => 40840, 30265 => 40841, 30266 => 40842, 30267 => 40844, 30268 => 40702, -30269 => 40715, 30270 => 40717, 30271 => 38585, 30272 => 38588, 30273 => 38589, -30274 => 38606, 30275 => 38610, 30276 => 30655, 30277 => 38624, 30278 => 37518, -30279 => 37550, 30280 => 37576, 30281 => 37694, 30282 => 37738, 30283 => 37834, -30284 => 37775, 30285 => 37950, 30286 => 37995, 30287 => 40063, 30288 => 40066, -30289 => 40069, 30290 => 40070, 30291 => 40071, 30292 => 40072, 30293 => 31267, -30294 => 40075, 30295 => 40078, 30296 => 40080, 30297 => 40081, 30298 => 40082, -30299 => 40084, 30300 => 40085, 30301 => 40090, 30302 => 40091, 30303 => 40094, -30304 => 40095, 30305 => 40096, 30306 => 40097, 30307 => 40098, 30308 => 40099, -30309 => 40101, 30310 => 40102, 30311 => 40103, 30312 => 40104, 30313 => 40105, -30314 => 40107, 30315 => 40109, 30316 => 40110, 30317 => 40112, 30318 => 40113, -30319 => 40114, 30320 => 40115, 30321 => 40116, 30322 => 40117, 30323 => 40118, -30324 => 40119, 30325 => 40122, 30326 => 40123, 30327 => 40124, 30328 => 40125, -30329 => 40132, 30330 => 40133, 30331 => 40134, 30332 => 40135, 30333 => 40138, -30334 => 40139, 30497 => 40140, 30498 => 40141, 30499 => 40142, 30500 => 40143, -30501 => 40144, 30502 => 40147, 30503 => 40148, 30504 => 40149, 30505 => 40151, -30506 => 40152, 30507 => 40153, 30508 => 40156, 30509 => 40157, 30510 => 40159, -30511 => 40162, 30512 => 38780, 30513 => 38789, 30514 => 38801, 30515 => 38802, -30516 => 38804, 30517 => 38831, 30518 => 38827, 30519 => 38819, 30520 => 38834, -30521 => 38836, 30522 => 39601, 30523 => 39600, 30524 => 39607, 30525 => 40536, -30526 => 39606, 30527 => 39610, 30528 => 39612, 30529 => 39617, 30530 => 39616, -30531 => 39621, 30532 => 39618, 30533 => 39627, 30534 => 39628, 30535 => 39633, -30536 => 39749, 30537 => 39747, 30538 => 39751, 30539 => 39753, 30540 => 39752, -30541 => 39757, 30542 => 39761, 30543 => 39144, 30544 => 39181, 30545 => 39214, -30546 => 39253, 30547 => 39252, 30548 => 39647, 30549 => 39649, 30550 => 39654, -30551 => 39663, 30552 => 39659, 30553 => 39675, 30554 => 39661, 30555 => 39673, -30556 => 39688, 30557 => 39695, 30558 => 39699, 30559 => 39711, 30560 => 39715, -30561 => 40637, 30562 => 40638, 30563 => 32315, 30564 => 40578, 30565 => 40583, -30566 => 40584, 30567 => 40587, 30568 => 40594, 30569 => 37846, 30570 => 40605, -30571 => 40607, 30572 => 40667, 30573 => 40668, 30574 => 40669, 30575 => 40672, -30576 => 40671, 30577 => 40674, 30578 => 40681, 30579 => 40679, 30580 => 40677, -30581 => 40682, 30582 => 40687, 30583 => 40738, 30584 => 40748, 30585 => 40751, -30586 => 40761, 30587 => 40759, 30588 => 40765, 30589 => 40766, 30590 => 40772, -0 => 0 ); + // -------------------------------------------------------------------- + // This code table is used to translate GB2312 code (key) to + // it's corresponding Unicode value (data) + // -------------------------------------------------------------------- + private $codetable = array( + 8481 => 12288, 8482 => 12289, 8483 => 12290, 8484 => 12539, 8485 => 713, + 8486 => 711, 8487 => 168, 8488 => 12291, 8489 => 12293, 8490 => 8213, + 8491 => 65374, 8492 => 8214, 8493 => 8230, 8494 => 8216, 8495 => 8217, + 8496 => 8220, 8497 => 8221, 8498 => 12308, 8499 => 12309, 8500 => 12296, + 8501 => 12297, 8502 => 12298, 8503 => 12299, 8504 => 12300, 8505 => 12301, + 8506 => 12302, 8507 => 12303, 8508 => 12310, 8509 => 12311, 8510 => 12304, + 8511 => 12305, 8512 => 177, 8513 => 215, 8514 => 247, 8515 => 8758, + 8516 => 8743, 8517 => 8744, 8518 => 8721, 8519 => 8719, 8520 => 8746, + 8521 => 8745, 8522 => 8712, 8523 => 8759, 8524 => 8730, 8525 => 8869, + 8526 => 8741, 8527 => 8736, 8528 => 8978, 8529 => 8857, 8530 => 8747, + 8531 => 8750, 8532 => 8801, 8533 => 8780, 8534 => 8776, 8535 => 8765, + 8536 => 8733, 8537 => 8800, 8538 => 8814, 8539 => 8815, 8540 => 8804, + 8541 => 8805, 8542 => 8734, 8543 => 8757, 8544 => 8756, 8545 => 9794, + 8546 => 9792, 8547 => 176, 8548 => 8242, 8549 => 8243, 8550 => 8451, + 8551 => 65284, 8552 => 164, 8553 => 65504, 8554 => 65505, 8555 => 8240, + 8556 => 167, 8557 => 8470, 8558 => 9734, 8559 => 9733, 8560 => 9675, + 8561 => 9679, 8562 => 9678, 8563 => 9671, 8564 => 9670, 8565 => 9633, + 8566 => 9632, 8567 => 9651, 8568 => 9650, 8569 => 8251, 8570 => 8594, + 8571 => 8592, 8572 => 8593, 8573 => 8595, 8574 => 12307, 8753 => 9352, + 8754 => 9353, 8755 => 9354, 8756 => 9355, 8757 => 9356, 8758 => 9357, + 8759 => 9358, 8760 => 9359, 8761 => 9360, 8762 => 9361, 8763 => 9362, + 8764 => 9363, 8765 => 9364, 8766 => 9365, 8767 => 9366, 8768 => 9367, + 8769 => 9368, 8770 => 9369, 8771 => 9370, 8772 => 9371, 8773 => 9332, + 8774 => 9333, 8775 => 9334, 8776 => 9335, 8777 => 9336, 8778 => 9337, + 8779 => 9338, 8780 => 9339, 8781 => 9340, 8782 => 9341, 8783 => 9342, + 8784 => 9343, 8785 => 9344, 8786 => 9345, 8787 => 9346, 8788 => 9347, + 8789 => 9348, 8790 => 9349, 8791 => 9350, 8792 => 9351, 8793 => 9312, + 8794 => 9313, 8795 => 9314, 8796 => 9315, 8797 => 9316, 8798 => 9317, + 8799 => 9318, 8800 => 9319, 8801 => 9320, 8802 => 9321, 8805 => 12832, + 8806 => 12833, 8807 => 12834, 8808 => 12835, 8809 => 12836, 8810 => 12837, + 8811 => 12838, 8812 => 12839, 8813 => 12840, 8814 => 12841, 8817 => 8544, + 8818 => 8545, 8819 => 8546, 8820 => 8547, 8821 => 8548, 8822 => 8549, + 8823 => 8550, 8824 => 8551, 8825 => 8552, 8826 => 8553, 8827 => 8554, + 8828 => 8555, 8993 => 65281, 8994 => 65282, 8995 => 65283, 8996 => 65509, + 8997 => 65285, 8998 => 65286, 8999 => 65287, 9000 => 65288, 9001 => 65289, + 9002 => 65290, 9003 => 65291, 9004 => 65292, 9005 => 65293, 9006 => 65294, + 9007 => 65295, 9008 => 65296, 9009 => 65297, 9010 => 65298, 9011 => 65299, + 9012 => 65300, 9013 => 65301, 9014 => 65302, 9015 => 65303, 9016 => 65304, + 9017 => 65305, 9018 => 65306, 9019 => 65307, 9020 => 65308, 9021 => 65309, + 9022 => 65310, 9023 => 65311, 9024 => 65312, 9025 => 65313, 9026 => 65314, + 9027 => 65315, 9028 => 65316, 9029 => 65317, 9030 => 65318, 9031 => 65319, + 9032 => 65320, 9033 => 65321, 9034 => 65322, 9035 => 65323, 9036 => 65324, + 9037 => 65325, 9038 => 65326, 9039 => 65327, 9040 => 65328, 9041 => 65329, + 9042 => 65330, 9043 => 65331, 9044 => 65332, 9045 => 65333, 9046 => 65334, + 9047 => 65335, 9048 => 65336, 9049 => 65337, 9050 => 65338, 9051 => 65339, + 9052 => 65340, 9053 => 65341, 9054 => 65342, 9055 => 65343, 9056 => 65344, + 9057 => 65345, 9058 => 65346, 9059 => 65347, 9060 => 65348, 9061 => 65349, + 9062 => 65350, 9063 => 65351, 9064 => 65352, 9065 => 65353, 9066 => 65354, + 9067 => 65355, 9068 => 65356, 9069 => 65357, 9070 => 65358, 9071 => 65359, + 9072 => 65360, 9073 => 65361, 9074 => 65362, 9075 => 65363, 9076 => 65364, + 9077 => 65365, 9078 => 65366, 9079 => 65367, 9080 => 65368, 9081 => 65369, + 9082 => 65370, 9083 => 65371, 9084 => 65372, 9085 => 65373, 9086 => 65507, + 9249 => 12353, 9250 => 12354, 9251 => 12355, 9252 => 12356, 9253 => 12357, + 9254 => 12358, 9255 => 12359, 9256 => 12360, 9257 => 12361, 9258 => 12362, + 9259 => 12363, 9260 => 12364, 9261 => 12365, 9262 => 12366, 9263 => 12367, + 9264 => 12368, 9265 => 12369, 9266 => 12370, 9267 => 12371, 9268 => 12372, + 9269 => 12373, 9270 => 12374, 9271 => 12375, 9272 => 12376, 9273 => 12377, + 9274 => 12378, 9275 => 12379, 9276 => 12380, 9277 => 12381, 9278 => 12382, + 9279 => 12383, 9280 => 12384, 9281 => 12385, 9282 => 12386, 9283 => 12387, + 9284 => 12388, 9285 => 12389, 9286 => 12390, 9287 => 12391, 9288 => 12392, + 9289 => 12393, 9290 => 12394, 9291 => 12395, 9292 => 12396, 9293 => 12397, + 9294 => 12398, 9295 => 12399, 9296 => 12400, 9297 => 12401, 9298 => 12402, + 9299 => 12403, 9300 => 12404, 9301 => 12405, 9302 => 12406, 9303 => 12407, + 9304 => 12408, 9305 => 12409, 9306 => 12410, 9307 => 12411, 9308 => 12412, + 9309 => 12413, 9310 => 12414, 9311 => 12415, 9312 => 12416, 9313 => 12417, + 9314 => 12418, 9315 => 12419, 9316 => 12420, 9317 => 12421, 9318 => 12422, + 9319 => 12423, 9320 => 12424, 9321 => 12425, 9322 => 12426, 9323 => 12427, + 9324 => 12428, 9325 => 12429, 9326 => 12430, 9327 => 12431, 9328 => 12432, + 9329 => 12433, 9330 => 12434, 9331 => 12435, 9505 => 12449, 9506 => 12450, + 9507 => 12451, 9508 => 12452, 9509 => 12453, 9510 => 12454, 9511 => 12455, + 9512 => 12456, 9513 => 12457, 9514 => 12458, 9515 => 12459, 9516 => 12460, + 9517 => 12461, 9518 => 12462, 9519 => 12463, 9520 => 12464, 9521 => 12465, + 9522 => 12466, 9523 => 12467, 9524 => 12468, 9525 => 12469, 9526 => 12470, + 9527 => 12471, 9528 => 12472, 9529 => 12473, 9530 => 12474, 9531 => 12475, + 9532 => 12476, 9533 => 12477, 9534 => 12478, 9535 => 12479, 9536 => 12480, + 9537 => 12481, 9538 => 12482, 9539 => 12483, 9540 => 12484, 9541 => 12485, + 9542 => 12486, 9543 => 12487, 9544 => 12488, 9545 => 12489, 9546 => 12490, + 9547 => 12491, 9548 => 12492, 9549 => 12493, 9550 => 12494, 9551 => 12495, + 9552 => 12496, 9553 => 12497, 9554 => 12498, 9555 => 12499, 9556 => 12500, + 9557 => 12501, 9558 => 12502, 9559 => 12503, 9560 => 12504, 9561 => 12505, + 9562 => 12506, 9563 => 12507, 9564 => 12508, 9565 => 12509, 9566 => 12510, + 9567 => 12511, 9568 => 12512, 9569 => 12513, 9570 => 12514, 9571 => 12515, + 9572 => 12516, 9573 => 12517, 9574 => 12518, 9575 => 12519, 9576 => 12520, + 9577 => 12521, 9578 => 12522, 9579 => 12523, 9580 => 12524, 9581 => 12525, + 9582 => 12526, 9583 => 12527, 9584 => 12528, 9585 => 12529, 9586 => 12530, + 9587 => 12531, 9588 => 12532, 9589 => 12533, 9590 => 12534, 9761 => 913, + 9762 => 914, 9763 => 915, 9764 => 916, 9765 => 917, 9766 => 918, + 9767 => 919, 9768 => 920, 9769 => 921, 9770 => 922, 9771 => 923, + 9772 => 924, 9773 => 925, 9774 => 926, 9775 => 927, 9776 => 928, + 9777 => 929, 9778 => 931, 9779 => 932, 9780 => 933, 9781 => 934, + 9782 => 935, 9783 => 936, 9784 => 937, 9793 => 945, 9794 => 946, + 9795 => 947, 9796 => 948, 9797 => 949, 9798 => 950, 9799 => 951, + 9800 => 952, 9801 => 953, 9802 => 954, 9803 => 955, 9804 => 956, + 9805 => 957, 9806 => 958, 9807 => 959, 9808 => 960, 9809 => 961, + 9810 => 963, 9811 => 964, 9812 => 965, 9813 => 966, 9814 => 967, + 9815 => 968, 9816 => 969, 10017 => 1040, 10018 => 1041, 10019 => 1042, + 10020 => 1043, 10021 => 1044, 10022 => 1045, 10023 => 1025, 10024 => 1046, + 10025 => 1047, 10026 => 1048, 10027 => 1049, 10028 => 1050, 10029 => 1051, + 10030 => 1052, 10031 => 1053, 10032 => 1054, 10033 => 1055, 10034 => 1056, + 10035 => 1057, 10036 => 1058, 10037 => 1059, 10038 => 1060, 10039 => 1061, + 10040 => 1062, 10041 => 1063, 10042 => 1064, 10043 => 1065, 10044 => 1066, + 10045 => 1067, 10046 => 1068, 10047 => 1069, 10048 => 1070, 10049 => 1071, + 10065 => 1072, 10066 => 1073, 10067 => 1074, 10068 => 1075, 10069 => 1076, + 10070 => 1077, 10071 => 1105, 10072 => 1078, 10073 => 1079, 10074 => 1080, + 10075 => 1081, 10076 => 1082, 10077 => 1083, 10078 => 1084, 10079 => 1085, + 10080 => 1086, 10081 => 1087, 10082 => 1088, 10083 => 1089, 10084 => 1090, + 10085 => 1091, 10086 => 1092, 10087 => 1093, 10088 => 1094, 10089 => 1095, + 10090 => 1096, 10091 => 1097, 10092 => 1098, 10093 => 1099, 10094 => 1100, + 10095 => 1101, 10096 => 1102, 10097 => 1103, 10273 => 257, 10274 => 225, + 10275 => 462, 10276 => 224, 10277 => 275, 10278 => 233, 10279 => 283, + 10280 => 232, 10281 => 299, 10282 => 237, 10283 => 464, 10284 => 236, + 10285 => 333, 10286 => 243, 10287 => 466, 10288 => 242, 10289 => 363, + 10290 => 250, 10291 => 468, 10292 => 249, 10293 => 470, 10294 => 472, + 10295 => 474, 10296 => 476, 10297 => 252, 10298 => 234, 10309 => 12549, + 10310 => 12550, 10311 => 12551, 10312 => 12552, 10313 => 12553, 10314 => 12554, + 10315 => 12555, 10316 => 12556, 10317 => 12557, 10318 => 12558, 10319 => 12559, + 10320 => 12560, 10321 => 12561, 10322 => 12562, 10323 => 12563, 10324 => 12564, + 10325 => 12565, 10326 => 12566, 10327 => 12567, 10328 => 12568, 10329 => 12569, + 10330 => 12570, 10331 => 12571, 10332 => 12572, 10333 => 12573, 10334 => 12574, + 10335 => 12575, 10336 => 12576, 10337 => 12577, 10338 => 12578, 10339 => 12579, + 10340 => 12580, 10341 => 12581, 10342 => 12582, 10343 => 12583, 10344 => 12584, + 10345 => 12585, 10532 => 9472, 10533 => 9473, 10534 => 9474, 10535 => 9475, + 10536 => 9476, 10537 => 9477, 10538 => 9478, 10539 => 9479, 10540 => 9480, + 10541 => 9481, 10542 => 9482, 10543 => 9483, 10544 => 9484, 10545 => 9485, + 10546 => 9486, 10547 => 9487, 10548 => 9488, 10549 => 9489, 10550 => 9490, + 10551 => 9491, 10552 => 9492, 10553 => 9493, 10554 => 9494, 10555 => 9495, + 10556 => 9496, 10557 => 9497, 10558 => 9498, 10559 => 9499, 10560 => 9500, + 10561 => 9501, 10562 => 9502, 10563 => 9503, 10564 => 9504, 10565 => 9505, + 10566 => 9506, 10567 => 9507, 10568 => 9508, 10569 => 9509, 10570 => 9510, + 10571 => 9511, 10572 => 9512, 10573 => 9513, 10574 => 9514, 10575 => 9515, + 10576 => 9516, 10577 => 9517, 10578 => 9518, 10579 => 9519, 10580 => 9520, + 10581 => 9521, 10582 => 9522, 10583 => 9523, 10584 => 9524, 10585 => 9525, + 10586 => 9526, 10587 => 9527, 10588 => 9528, 10589 => 9529, 10590 => 9530, + 10591 => 9531, 10592 => 9532, 10593 => 9533, 10594 => 9534, 10595 => 9535, + 10596 => 9536, 10597 => 9537, 10598 => 9538, 10599 => 9539, 10600 => 9540, + 10601 => 9541, 10602 => 9542, 10603 => 9543, 10604 => 9544, 10605 => 9545, + 10606 => 9546, 10607 => 9547, 12321 => 21834, 12322 => 38463, 12323 => 22467, + 12324 => 25384, 12325 => 21710, 12326 => 21769, 12327 => 21696, 12328 => 30353, + 12329 => 30284, 12330 => 34108, 12331 => 30702, 12332 => 33406, 12333 => 30861, + 12334 => 29233, 12335 => 38552, 12336 => 38797, 12337 => 27688, 12338 => 23433, + 12339 => 20474, 12340 => 25353, 12341 => 26263, 12342 => 23736, 12343 => 33018, + 12344 => 26696, 12345 => 32942, 12346 => 26114, 12347 => 30414, 12348 => 20985, + 12349 => 25942, 12350 => 29100, 12351 => 32753, 12352 => 34948, 12353 => 20658, + 12354 => 22885, 12355 => 25034, 12356 => 28595, 12357 => 33453, 12358 => 25420, + 12359 => 25170, 12360 => 21485, 12361 => 21543, 12362 => 31494, 12363 => 20843, + 12364 => 30116, 12365 => 24052, 12366 => 25300, 12367 => 36299, 12368 => 38774, + 12369 => 25226, 12370 => 32793, 12371 => 22365, 12372 => 38712, 12373 => 32610, + 12374 => 29240, 12375 => 30333, 12376 => 26575, 12377 => 30334, 12378 => 25670, + 12379 => 20336, 12380 => 36133, 12381 => 25308, 12382 => 31255, 12383 => 26001, + 12384 => 29677, 12385 => 25644, 12386 => 25203, 12387 => 33324, 12388 => 39041, + 12389 => 26495, 12390 => 29256, 12391 => 25198, 12392 => 25292, 12393 => 20276, + 12394 => 29923, 12395 => 21322, 12396 => 21150, 12397 => 32458, 12398 => 37030, + 12399 => 24110, 12400 => 26758, 12401 => 27036, 12402 => 33152, 12403 => 32465, + 12404 => 26834, 12405 => 30917, 12406 => 34444, 12407 => 38225, 12408 => 20621, + 12409 => 35876, 12410 => 33502, 12411 => 32990, 12412 => 21253, 12413 => 35090, + 12414 => 21093, 12577 => 34180, 12578 => 38649, 12579 => 20445, 12580 => 22561, + 12581 => 39281, 12582 => 23453, 12583 => 25265, 12584 => 25253, 12585 => 26292, + 12586 => 35961, 12587 => 40077, 12588 => 29190, 12589 => 26479, 12590 => 30865, + 12591 => 24754, 12592 => 21329, 12593 => 21271, 12594 => 36744, 12595 => 32972, + 12596 => 36125, 12597 => 38049, 12598 => 20493, 12599 => 29384, 12600 => 22791, + 12601 => 24811, 12602 => 28953, 12603 => 34987, 12604 => 22868, 12605 => 33519, + 12606 => 26412, 12607 => 31528, 12608 => 23849, 12609 => 32503, 12610 => 29997, + 12611 => 27893, 12612 => 36454, 12613 => 36856, 12614 => 36924, 12615 => 40763, + 12616 => 27604, 12617 => 37145, 12618 => 31508, 12619 => 24444, 12620 => 30887, + 12621 => 34006, 12622 => 34109, 12623 => 27605, 12624 => 27609, 12625 => 27606, + 12626 => 24065, 12627 => 24199, 12628 => 30201, 12629 => 38381, 12630 => 25949, + 12631 => 24330, 12632 => 24517, 12633 => 36767, 12634 => 22721, 12635 => 33218, + 12636 => 36991, 12637 => 38491, 12638 => 38829, 12639 => 36793, 12640 => 32534, + 12641 => 36140, 12642 => 25153, 12643 => 20415, 12644 => 21464, 12645 => 21342, + 12646 => 36776, 12647 => 36777, 12648 => 36779, 12649 => 36941, 12650 => 26631, + 12651 => 24426, 12652 => 33176, 12653 => 34920, 12654 => 40150, 12655 => 24971, + 12656 => 21035, 12657 => 30250, 12658 => 24428, 12659 => 25996, 12660 => 28626, + 12661 => 28392, 12662 => 23486, 12663 => 25672, 12664 => 20853, 12665 => 20912, + 12666 => 26564, 12667 => 19993, 12668 => 31177, 12669 => 39292, 12670 => 28851, + 12833 => 30149, 12834 => 24182, 12835 => 29627, 12836 => 33760, 12837 => 25773, + 12838 => 25320, 12839 => 38069, 12840 => 27874, 12841 => 21338, 12842 => 21187, + 12843 => 25615, 12844 => 38082, 12845 => 31636, 12846 => 20271, 12847 => 24091, + 12848 => 33334, 12849 => 33046, 12850 => 33162, 12851 => 28196, 12852 => 27850, + 12853 => 39539, 12854 => 25429, 12855 => 21340, 12856 => 21754, 12857 => 34917, + 12858 => 22496, 12859 => 19981, 12860 => 24067, 12861 => 27493, 12862 => 31807, + 12863 => 37096, 12864 => 24598, 12865 => 25830, 12866 => 29468, 12867 => 35009, + 12868 => 26448, 12869 => 25165, 12870 => 36130, 12871 => 30572, 12872 => 36393, + 12873 => 37319, 12874 => 24425, 12875 => 33756, 12876 => 34081, 12877 => 39184, + 12878 => 21442, 12879 => 34453, 12880 => 27531, 12881 => 24813, 12882 => 24808, + 12883 => 28799, 12884 => 33485, 12885 => 33329, 12886 => 20179, 12887 => 27815, + 12888 => 34255, 12889 => 25805, 12890 => 31961, 12891 => 27133, 12892 => 26361, + 12893 => 33609, 12894 => 21397, 12895 => 31574, 12896 => 20391, 12897 => 20876, + 12898 => 27979, 12899 => 23618, 12900 => 36461, 12901 => 25554, 12902 => 21449, + 12903 => 33580, 12904 => 33590, 12905 => 26597, 12906 => 30900, 12907 => 25661, + 12908 => 23519, 12909 => 23700, 12910 => 24046, 12911 => 35815, 12912 => 25286, + 12913 => 26612, 12914 => 35962, 12915 => 25600, 12916 => 25530, 12917 => 34633, + 12918 => 39307, 12919 => 35863, 12920 => 32544, 12921 => 38130, 12922 => 20135, + 12923 => 38416, 12924 => 39076, 12925 => 26124, 12926 => 29462, 13089 => 22330, + 13090 => 23581, 13091 => 24120, 13092 => 38271, 13093 => 20607, 13094 => 32928, + 13095 => 21378, 13096 => 25950, 13097 => 30021, 13098 => 21809, 13099 => 20513, + 13100 => 36229, 13101 => 25220, 13102 => 38046, 13103 => 26397, 13104 => 22066, + 13105 => 28526, 13106 => 24034, 13107 => 21557, 13108 => 28818, 13109 => 36710, + 13110 => 25199, 13111 => 25764, 13112 => 25507, 13113 => 24443, 13114 => 28552, + 13115 => 37108, 13116 => 33251, 13117 => 36784, 13118 => 23576, 13119 => 26216, + 13120 => 24561, 13121 => 27785, 13122 => 38472, 13123 => 36225, 13124 => 34924, + 13125 => 25745, 13126 => 31216, 13127 => 22478, 13128 => 27225, 13129 => 25104, + 13130 => 21576, 13131 => 20056, 13132 => 31243, 13133 => 24809, 13134 => 28548, + 13135 => 35802, 13136 => 25215, 13137 => 36894, 13138 => 39563, 13139 => 31204, + 13140 => 21507, 13141 => 30196, 13142 => 25345, 13143 => 21273, 13144 => 27744, + 13145 => 36831, 13146 => 24347, 13147 => 39536, 13148 => 32827, 13149 => 40831, + 13150 => 20360, 13151 => 23610, 13152 => 36196, 13153 => 32709, 13154 => 26021, + 13155 => 28861, 13156 => 20805, 13157 => 20914, 13158 => 34411, 13159 => 23815, + 13160 => 23456, 13161 => 25277, 13162 => 37228, 13163 => 30068, 13164 => 36364, + 13165 => 31264, 13166 => 24833, 13167 => 31609, 13168 => 20167, 13169 => 32504, + 13170 => 30597, 13171 => 19985, 13172 => 33261, 13173 => 21021, 13174 => 20986, + 13175 => 27249, 13176 => 21416, 13177 => 36487, 13178 => 38148, 13179 => 38607, + 13180 => 28353, 13181 => 38500, 13182 => 26970, 13345 => 30784, 13346 => 20648, + 13347 => 30679, 13348 => 25616, 13349 => 35302, 13350 => 22788, 13351 => 25571, + 13352 => 24029, 13353 => 31359, 13354 => 26941, 13355 => 20256, 13356 => 33337, + 13357 => 21912, 13358 => 20018, 13359 => 30126, 13360 => 31383, 13361 => 24162, + 13362 => 24202, 13363 => 38383, 13364 => 21019, 13365 => 21561, 13366 => 28810, + 13367 => 25462, 13368 => 38180, 13369 => 22402, 13370 => 26149, 13371 => 26943, + 13372 => 37255, 13373 => 21767, 13374 => 28147, 13375 => 32431, 13376 => 34850, + 13377 => 25139, 13378 => 32496, 13379 => 30133, 13380 => 33576, 13381 => 30913, + 13382 => 38604, 13383 => 36766, 13384 => 24904, 13385 => 29943, 13386 => 35789, + 13387 => 27492, 13388 => 21050, 13389 => 36176, 13390 => 27425, 13391 => 32874, + 13392 => 33905, 13393 => 22257, 13394 => 21254, 13395 => 20174, 13396 => 19995, + 13397 => 20945, 13398 => 31895, 13399 => 37259, 13400 => 31751, 13401 => 20419, + 13402 => 36479, 13403 => 31713, 13404 => 31388, 13405 => 25703, 13406 => 23828, + 13407 => 20652, 13408 => 33030, 13409 => 30209, 13410 => 31929, 13411 => 28140, + 13412 => 32736, 13413 => 26449, 13414 => 23384, 13415 => 23544, 13416 => 30923, + 13417 => 25774, 13418 => 25619, 13419 => 25514, 13420 => 25387, 13421 => 38169, + 13422 => 25645, 13423 => 36798, 13424 => 31572, 13425 => 30249, 13426 => 25171, + 13427 => 22823, 13428 => 21574, 13429 => 27513, 13430 => 20643, 13431 => 25140, + 13432 => 24102, 13433 => 27526, 13434 => 20195, 13435 => 36151, 13436 => 34955, + 13437 => 24453, 13438 => 36910, 13601 => 24608, 13602 => 32829, 13603 => 25285, + 13604 => 20025, 13605 => 21333, 13606 => 37112, 13607 => 25528, 13608 => 32966, + 13609 => 26086, 13610 => 27694, 13611 => 20294, 13612 => 24814, 13613 => 28129, + 13614 => 35806, 13615 => 24377, 13616 => 34507, 13617 => 24403, 13618 => 25377, + 13619 => 20826, 13620 => 33633, 13621 => 26723, 13622 => 20992, 13623 => 25443, + 13624 => 36424, 13625 => 20498, 13626 => 23707, 13627 => 31095, 13628 => 23548, + 13629 => 21040, 13630 => 31291, 13631 => 24764, 13632 => 36947, 13633 => 30423, + 13634 => 24503, 13635 => 24471, 13636 => 30340, 13637 => 36460, 13638 => 28783, + 13639 => 30331, 13640 => 31561, 13641 => 30634, 13642 => 20979, 13643 => 37011, + 13644 => 22564, 13645 => 20302, 13646 => 28404, 13647 => 36842, 13648 => 25932, + 13649 => 31515, 13650 => 29380, 13651 => 28068, 13652 => 32735, 13653 => 23265, + 13654 => 25269, 13655 => 24213, 13656 => 22320, 13657 => 33922, 13658 => 31532, + 13659 => 24093, 13660 => 24351, 13661 => 36882, 13662 => 32532, 13663 => 39072, + 13664 => 25474, 13665 => 28359, 13666 => 30872, 13667 => 28857, 13668 => 20856, + 13669 => 38747, 13670 => 22443, 13671 => 30005, 13672 => 20291, 13673 => 30008, + 13674 => 24215, 13675 => 24806, 13676 => 22880, 13677 => 28096, 13678 => 27583, + 13679 => 30857, 13680 => 21500, 13681 => 38613, 13682 => 20939, 13683 => 20993, + 13684 => 25481, 13685 => 21514, 13686 => 38035, 13687 => 35843, 13688 => 36300, + 13689 => 29241, 13690 => 30879, 13691 => 34678, 13692 => 36845, 13693 => 35853, + 13694 => 21472, 13857 => 19969, 13858 => 30447, 13859 => 21486, 13860 => 38025, + 13861 => 39030, 13862 => 40718, 13863 => 38189, 13864 => 23450, 13865 => 35746, + 13866 => 20002, 13867 => 19996, 13868 => 20908, 13869 => 33891, 13870 => 25026, + 13871 => 21160, 13872 => 26635, 13873 => 20375, 13874 => 24683, 13875 => 20923, + 13876 => 27934, 13877 => 20828, 13878 => 25238, 13879 => 26007, 13880 => 38497, + 13881 => 35910, 13882 => 36887, 13883 => 30168, 13884 => 37117, 13885 => 30563, + 13886 => 27602, 13887 => 29322, 13888 => 29420, 13889 => 35835, 13890 => 22581, + 13891 => 30585, 13892 => 36172, 13893 => 26460, 13894 => 38208, 13895 => 32922, + 13896 => 24230, 13897 => 28193, 13898 => 22930, 13899 => 31471, 13900 => 30701, + 13901 => 38203, 13902 => 27573, 13903 => 26029, 13904 => 32526, 13905 => 22534, + 13906 => 20817, 13907 => 38431, 13908 => 23545, 13909 => 22697, 13910 => 21544, + 13911 => 36466, 13912 => 25958, 13913 => 39039, 13914 => 22244, 13915 => 38045, + 13916 => 30462, 13917 => 36929, 13918 => 25479, 13919 => 21702, 13920 => 22810, + 13921 => 22842, 13922 => 22427, 13923 => 36530, 13924 => 26421, 13925 => 36346, + 13926 => 33333, 13927 => 21057, 13928 => 24816, 13929 => 22549, 13930 => 34558, + 13931 => 23784, 13932 => 40517, 13933 => 20420, 13934 => 39069, 13935 => 35769, + 13936 => 23077, 13937 => 24694, 13938 => 21380, 13939 => 25212, 13940 => 36943, + 13941 => 37122, 13942 => 39295, 13943 => 24681, 13944 => 32780, 13945 => 20799, + 13946 => 32819, 13947 => 23572, 13948 => 39285, 13949 => 27953, 13950 => 20108, + 14113 => 36144, 14114 => 21457, 14115 => 32602, 14116 => 31567, 14117 => 20240, + 14118 => 20047, 14119 => 38400, 14120 => 27861, 14121 => 29648, 14122 => 34281, + 14123 => 24070, 14124 => 30058, 14125 => 32763, 14126 => 27146, 14127 => 30718, + 14128 => 38034, 14129 => 32321, 14130 => 20961, 14131 => 28902, 14132 => 21453, + 14133 => 36820, 14134 => 33539, 14135 => 36137, 14136 => 29359, 14137 => 39277, + 14138 => 27867, 14139 => 22346, 14140 => 33459, 14141 => 26041, 14142 => 32938, + 14143 => 25151, 14144 => 38450, 14145 => 22952, 14146 => 20223, 14147 => 35775, + 14148 => 32442, 14149 => 25918, 14150 => 33778, 14151 => 38750, 14152 => 21857, + 14153 => 39134, 14154 => 32933, 14155 => 21290, 14156 => 35837, 14157 => 21536, + 14158 => 32954, 14159 => 24223, 14160 => 27832, 14161 => 36153, 14162 => 33452, + 14163 => 37210, 14164 => 21545, 14165 => 27675, 14166 => 20998, 14167 => 32439, + 14168 => 22367, 14169 => 28954, 14170 => 27774, 14171 => 31881, 14172 => 22859, + 14173 => 20221, 14174 => 24575, 14175 => 24868, 14176 => 31914, 14177 => 20016, + 14178 => 23553, 14179 => 26539, 14180 => 34562, 14181 => 23792, 14182 => 38155, + 14183 => 39118, 14184 => 30127, 14185 => 28925, 14186 => 36898, 14187 => 20911, + 14188 => 32541, 14189 => 35773, 14190 => 22857, 14191 => 20964, 14192 => 20315, + 14193 => 21542, 14194 => 22827, 14195 => 25975, 14196 => 32932, 14197 => 23413, + 14198 => 25206, 14199 => 25282, 14200 => 36752, 14201 => 24133, 14202 => 27679, + 14203 => 31526, 14204 => 20239, 14205 => 20440, 14206 => 26381, 14369 => 28014, + 14370 => 28074, 14371 => 31119, 14372 => 34993, 14373 => 24343, 14374 => 29995, + 14375 => 25242, 14376 => 36741, 14377 => 20463, 14378 => 37340, 14379 => 26023, + 14380 => 33071, 14381 => 33105, 14382 => 24220, 14383 => 33104, 14384 => 36212, + 14385 => 21103, 14386 => 35206, 14387 => 36171, 14388 => 22797, 14389 => 20613, + 14390 => 20184, 14391 => 38428, 14392 => 29238, 14393 => 33145, 14394 => 36127, + 14395 => 23500, 14396 => 35747, 14397 => 38468, 14398 => 22919, 14399 => 32538, + 14400 => 21648, 14401 => 22134, 14402 => 22030, 14403 => 35813, 14404 => 25913, + 14405 => 27010, 14406 => 38041, 14407 => 30422, 14408 => 28297, 14409 => 24178, + 14410 => 29976, 14411 => 26438, 14412 => 26577, 14413 => 31487, 14414 => 32925, + 14415 => 36214, 14416 => 24863, 14417 => 31174, 14418 => 25954, 14419 => 36195, + 14420 => 20872, 14421 => 21018, 14422 => 38050, 14423 => 32568, 14424 => 32923, + 14425 => 32434, 14426 => 23703, 14427 => 28207, 14428 => 26464, 14429 => 31705, + 14430 => 30347, 14431 => 39640, 14432 => 33167, 14433 => 32660, 14434 => 31957, + 14435 => 25630, 14436 => 38224, 14437 => 31295, 14438 => 21578, 14439 => 21733, + 14440 => 27468, 14441 => 25601, 14442 => 25096, 14443 => 40509, 14444 => 33011, + 14445 => 30105, 14446 => 21106, 14447 => 38761, 14448 => 33883, 14449 => 26684, + 14450 => 34532, 14451 => 38401, 14452 => 38548, 14453 => 38124, 14454 => 20010, + 14455 => 21508, 14456 => 32473, 14457 => 26681, 14458 => 36319, 14459 => 32789, + 14460 => 26356, 14461 => 24218, 14462 => 32697, 14625 => 22466, 14626 => 32831, + 14627 => 26775, 14628 => 24037, 14629 => 25915, 14630 => 21151, 14631 => 24685, + 14632 => 40858, 14633 => 20379, 14634 => 36524, 14635 => 20844, 14636 => 23467, + 14637 => 24339, 14638 => 24041, 14639 => 27742, 14640 => 25329, 14641 => 36129, + 14642 => 20849, 14643 => 38057, 14644 => 21246, 14645 => 27807, 14646 => 33503, + 14647 => 29399, 14648 => 22434, 14649 => 26500, 14650 => 36141, 14651 => 22815, + 14652 => 36764, 14653 => 33735, 14654 => 21653, 14655 => 31629, 14656 => 20272, + 14657 => 27837, 14658 => 23396, 14659 => 22993, 14660 => 40723, 14661 => 21476, + 14662 => 34506, 14663 => 39592, 14664 => 35895, 14665 => 32929, 14666 => 25925, + 14667 => 39038, 14668 => 22266, 14669 => 38599, 14670 => 21038, 14671 => 29916, + 14672 => 21072, 14673 => 23521, 14674 => 25346, 14675 => 35074, 14676 => 20054, + 14677 => 25296, 14678 => 24618, 14679 => 26874, 14680 => 20851, 14681 => 23448, + 14682 => 20896, 14683 => 35266, 14684 => 31649, 14685 => 39302, 14686 => 32592, + 14687 => 24815, 14688 => 28748, 14689 => 36143, 14690 => 20809, 14691 => 24191, + 14692 => 36891, 14693 => 29808, 14694 => 35268, 14695 => 22317, 14696 => 30789, + 14697 => 24402, 14698 => 40863, 14699 => 38394, 14700 => 36712, 14701 => 39740, + 14702 => 35809, 14703 => 30328, 14704 => 26690, 14705 => 26588, 14706 => 36330, + 14707 => 36149, 14708 => 21053, 14709 => 36746, 14710 => 28378, 14711 => 26829, + 14712 => 38149, 14713 => 37101, 14714 => 22269, 14715 => 26524, 14716 => 35065, + 14717 => 36807, 14718 => 21704, 14881 => 39608, 14882 => 23401, 14883 => 28023, + 14884 => 27686, 14885 => 20133, 14886 => 23475, 14887 => 39559, 14888 => 37219, + 14889 => 25000, 14890 => 37039, 14891 => 38889, 14892 => 21547, 14893 => 28085, + 14894 => 23506, 14895 => 20989, 14896 => 21898, 14897 => 32597, 14898 => 32752, + 14899 => 25788, 14900 => 25421, 14901 => 26097, 14902 => 25022, 14903 => 24717, + 14904 => 28938, 14905 => 27735, 14906 => 27721, 14907 => 22831, 14908 => 26477, + 14909 => 33322, 14910 => 22741, 14911 => 22158, 14912 => 35946, 14913 => 27627, + 14914 => 37085, 14915 => 22909, 14916 => 32791, 14917 => 21495, 14918 => 28009, + 14919 => 21621, 14920 => 21917, 14921 => 33655, 14922 => 33743, 14923 => 26680, + 14924 => 31166, 14925 => 21644, 14926 => 20309, 14927 => 21512, 14928 => 30418, + 14929 => 35977, 14930 => 38402, 14931 => 27827, 14932 => 28088, 14933 => 36203, + 14934 => 35088, 14935 => 40548, 14936 => 36154, 14937 => 22079, 14938 => 40657, + 14939 => 30165, 14940 => 24456, 14941 => 29408, 14942 => 24680, 14943 => 21756, + 14944 => 20136, 14945 => 27178, 14946 => 34913, 14947 => 24658, 14948 => 36720, + 14949 => 21700, 14950 => 28888, 14951 => 34425, 14952 => 40511, 14953 => 27946, + 14954 => 23439, 14955 => 24344, 14956 => 32418, 14957 => 21897, 14958 => 20399, + 14959 => 29492, 14960 => 21564, 14961 => 21402, 14962 => 20505, 14963 => 21518, + 14964 => 21628, 14965 => 20046, 14966 => 24573, 14967 => 29786, 14968 => 22774, + 14969 => 33899, 14970 => 32993, 14971 => 34676, 14972 => 29392, 14973 => 31946, + 14974 => 28246, 15137 => 24359, 15138 => 34382, 15139 => 21804, 15140 => 25252, + 15141 => 20114, 15142 => 27818, 15143 => 25143, 15144 => 33457, 15145 => 21719, + 15146 => 21326, 15147 => 29502, 15148 => 28369, 15149 => 30011, 15150 => 21010, + 15151 => 21270, 15152 => 35805, 15153 => 27088, 15154 => 24458, 15155 => 24576, + 15156 => 28142, 15157 => 22351, 15158 => 27426, 15159 => 29615, 15160 => 26707, + 15161 => 36824, 15162 => 32531, 15163 => 25442, 15164 => 24739, 15165 => 21796, + 15166 => 30186, 15167 => 35938, 15168 => 28949, 15169 => 28067, 15170 => 23462, + 15171 => 24187, 15172 => 33618, 15173 => 24908, 15174 => 40644, 15175 => 30970, + 15176 => 34647, 15177 => 31783, 15178 => 30343, 15179 => 20976, 15180 => 24822, + 15181 => 29004, 15182 => 26179, 15183 => 24140, 15184 => 24653, 15185 => 35854, + 15186 => 28784, 15187 => 25381, 15188 => 36745, 15189 => 24509, 15190 => 24674, + 15191 => 34516, 15192 => 22238, 15193 => 27585, 15194 => 24724, 15195 => 24935, + 15196 => 21321, 15197 => 24800, 15198 => 26214, 15199 => 36159, 15200 => 31229, + 15201 => 20250, 15202 => 28905, 15203 => 27719, 15204 => 35763, 15205 => 35826, + 15206 => 32472, 15207 => 33636, 15208 => 26127, 15209 => 23130, 15210 => 39746, + 15211 => 27985, 15212 => 28151, 15213 => 35905, 15214 => 27963, 15215 => 20249, + 15216 => 28779, 15217 => 33719, 15218 => 25110, 15219 => 24785, 15220 => 38669, + 15221 => 36135, 15222 => 31096, 15223 => 20987, 15224 => 22334, 15225 => 22522, + 15226 => 26426, 15227 => 30072, 15228 => 31293, 15229 => 31215, 15230 => 31637, + 15393 => 32908, 15394 => 39269, 15395 => 36857, 15396 => 28608, 15397 => 35749, + 15398 => 40481, 15399 => 23020, 15400 => 32489, 15401 => 32521, 15402 => 21513, + 15403 => 26497, 15404 => 26840, 15405 => 36753, 15406 => 31821, 15407 => 38598, + 15408 => 21450, 15409 => 24613, 15410 => 30142, 15411 => 27762, 15412 => 21363, + 15413 => 23241, 15414 => 32423, 15415 => 25380, 15416 => 20960, 15417 => 33034, + 15418 => 24049, 15419 => 34015, 15420 => 25216, 15421 => 20864, 15422 => 23395, + 15423 => 20238, 15424 => 31085, 15425 => 21058, 15426 => 24760, 15427 => 27982, + 15428 => 23492, 15429 => 23490, 15430 => 35745, 15431 => 35760, 15432 => 26082, + 15433 => 24524, 15434 => 38469, 15435 => 22931, 15436 => 32487, 15437 => 32426, + 15438 => 22025, 15439 => 26551, 15440 => 22841, 15441 => 20339, 15442 => 23478, + 15443 => 21152, 15444 => 33626, 15445 => 39050, 15446 => 36158, 15447 => 30002, + 15448 => 38078, 15449 => 20551, 15450 => 31292, 15451 => 20215, 15452 => 26550, + 15453 => 39550, 15454 => 23233, 15455 => 27516, 15456 => 30417, 15457 => 22362, + 15458 => 23574, 15459 => 31546, 15460 => 38388, 15461 => 29006, 15462 => 20860, + 15463 => 32937, 15464 => 33392, 15465 => 22904, 15466 => 32516, 15467 => 33575, + 15468 => 26816, 15469 => 26604, 15470 => 30897, 15471 => 30839, 15472 => 25315, + 15473 => 25441, 15474 => 31616, 15475 => 20461, 15476 => 21098, 15477 => 20943, + 15478 => 33616, 15479 => 27099, 15480 => 37492, 15481 => 36341, 15482 => 36145, + 15483 => 35265, 15484 => 38190, 15485 => 31661, 15486 => 20214, 15649 => 20581, + 15650 => 33328, 15651 => 21073, 15652 => 39279, 15653 => 28176, 15654 => 28293, + 15655 => 28071, 15656 => 24314, 15657 => 20725, 15658 => 23004, 15659 => 23558, + 15660 => 27974, 15661 => 27743, 15662 => 30086, 15663 => 33931, 15664 => 26728, + 15665 => 22870, 15666 => 35762, 15667 => 21280, 15668 => 37233, 15669 => 38477, + 15670 => 34121, 15671 => 26898, 15672 => 30977, 15673 => 28966, 15674 => 33014, + 15675 => 20132, 15676 => 37066, 15677 => 27975, 15678 => 39556, 15679 => 23047, + 15680 => 22204, 15681 => 25605, 15682 => 38128, 15683 => 30699, 15684 => 20389, + 15685 => 33050, 15686 => 29409, 15687 => 35282, 15688 => 39290, 15689 => 32564, + 15690 => 32478, 15691 => 21119, 15692 => 25945, 15693 => 37237, 15694 => 36735, + 15695 => 36739, 15696 => 21483, 15697 => 31382, 15698 => 25581, 15699 => 25509, + 15700 => 30342, 15701 => 31224, 15702 => 34903, 15703 => 38454, 15704 => 25130, + 15705 => 21163, 15706 => 33410, 15707 => 26708, 15708 => 26480, 15709 => 25463, + 15710 => 30571, 15711 => 31469, 15712 => 27905, 15713 => 32467, 15714 => 35299, + 15715 => 22992, 15716 => 25106, 15717 => 34249, 15718 => 33445, 15719 => 30028, + 15720 => 20511, 15721 => 20171, 15722 => 30117, 15723 => 35819, 15724 => 23626, + 15725 => 24062, 15726 => 31563, 15727 => 26020, 15728 => 37329, 15729 => 20170, + 15730 => 27941, 15731 => 35167, 15732 => 32039, 15733 => 38182, 15734 => 20165, + 15735 => 35880, 15736 => 36827, 15737 => 38771, 15738 => 26187, 15739 => 31105, + 15740 => 36817, 15741 => 28908, 15742 => 28024, 15905 => 23613, 15906 => 21170, + 15907 => 33606, 15908 => 20834, 15909 => 33550, 15910 => 30555, 15911 => 26230, + 15912 => 40120, 15913 => 20140, 15914 => 24778, 15915 => 31934, 15916 => 31923, + 15917 => 32463, 15918 => 20117, 15919 => 35686, 15920 => 26223, 15921 => 39048, + 15922 => 38745, 15923 => 22659, 15924 => 25964, 15925 => 38236, 15926 => 24452, + 15927 => 30153, 15928 => 38742, 15929 => 31455, 15930 => 31454, 15931 => 20928, + 15932 => 28847, 15933 => 31384, 15934 => 25578, 15935 => 31350, 15936 => 32416, + 15937 => 29590, 15938 => 38893, 15939 => 20037, 15940 => 28792, 15941 => 20061, + 15942 => 37202, 15943 => 21417, 15944 => 25937, 15945 => 26087, 15946 => 33276, + 15947 => 33285, 15948 => 21646, 15949 => 23601, 15950 => 30106, 15951 => 38816, + 15952 => 25304, 15953 => 29401, 15954 => 30141, 15955 => 23621, 15956 => 39545, + 15957 => 33738, 15958 => 23616, 15959 => 21632, 15960 => 30697, 15961 => 20030, + 15962 => 27822, 15963 => 32858, 15964 => 25298, 15965 => 25454, 15966 => 24040, + 15967 => 20855, 15968 => 36317, 15969 => 36382, 15970 => 38191, 15971 => 20465, + 15972 => 21477, 15973 => 24807, 15974 => 28844, 15975 => 21095, 15976 => 25424, + 15977 => 40515, 15978 => 23071, 15979 => 20518, 15980 => 30519, 15981 => 21367, + 15982 => 32482, 15983 => 25733, 15984 => 25899, 15985 => 25225, 15986 => 25496, + 15987 => 20500, 15988 => 29237, 15989 => 35273, 15990 => 20915, 15991 => 35776, + 15992 => 32477, 15993 => 22343, 15994 => 33740, 15995 => 38055, 15996 => 20891, + 15997 => 21531, 15998 => 23803, 16161 => 20426, 16162 => 31459, 16163 => 27994, + 16164 => 37089, 16165 => 39567, 16166 => 21888, 16167 => 21654, 16168 => 21345, + 16169 => 21679, 16170 => 24320, 16171 => 25577, 16172 => 26999, 16173 => 20975, + 16174 => 24936, 16175 => 21002, 16176 => 22570, 16177 => 21208, 16178 => 22350, + 16179 => 30733, 16180 => 30475, 16181 => 24247, 16182 => 24951, 16183 => 31968, + 16184 => 25179, 16185 => 25239, 16186 => 20130, 16187 => 28821, 16188 => 32771, + 16189 => 25335, 16190 => 28900, 16191 => 38752, 16192 => 22391, 16193 => 33499, + 16194 => 26607, 16195 => 26869, 16196 => 30933, 16197 => 39063, 16198 => 31185, + 16199 => 22771, 16200 => 21683, 16201 => 21487, 16202 => 28212, 16203 => 20811, + 16204 => 21051, 16205 => 23458, 16206 => 35838, 16207 => 32943, 16208 => 21827, + 16209 => 22438, 16210 => 24691, 16211 => 22353, 16212 => 21549, 16213 => 31354, + 16214 => 24656, 16215 => 23380, 16216 => 25511, 16217 => 25248, 16218 => 21475, + 16219 => 25187, 16220 => 23495, 16221 => 26543, 16222 => 21741, 16223 => 31391, + 16224 => 33510, 16225 => 37239, 16226 => 24211, 16227 => 35044, 16228 => 22840, + 16229 => 22446, 16230 => 25358, 16231 => 36328, 16232 => 33007, 16233 => 22359, + 16234 => 31607, 16235 => 20393, 16236 => 24555, 16237 => 23485, 16238 => 27454, + 16239 => 21281, 16240 => 31568, 16241 => 29378, 16242 => 26694, 16243 => 30719, + 16244 => 30518, 16245 => 26103, 16246 => 20917, 16247 => 20111, 16248 => 30420, + 16249 => 23743, 16250 => 31397, 16251 => 33909, 16252 => 22862, 16253 => 39745, + 16254 => 20608, 16417 => 39304, 16418 => 24871, 16419 => 28291, 16420 => 22372, + 16421 => 26118, 16422 => 25414, 16423 => 22256, 16424 => 25324, 16425 => 25193, + 16426 => 24275, 16427 => 38420, 16428 => 22403, 16429 => 25289, 16430 => 21895, + 16431 => 34593, 16432 => 33098, 16433 => 36771, 16434 => 21862, 16435 => 33713, + 16436 => 26469, 16437 => 36182, 16438 => 34013, 16439 => 23146, 16440 => 26639, + 16441 => 25318, 16442 => 31726, 16443 => 38417, 16444 => 20848, 16445 => 28572, + 16446 => 35888, 16447 => 25597, 16448 => 35272, 16449 => 25042, 16450 => 32518, + 16451 => 28866, 16452 => 28389, 16453 => 29701, 16454 => 27028, 16455 => 29436, + 16456 => 24266, 16457 => 37070, 16458 => 26391, 16459 => 28010, 16460 => 25438, + 16461 => 21171, 16462 => 29282, 16463 => 32769, 16464 => 20332, 16465 => 23013, + 16466 => 37226, 16467 => 28889, 16468 => 28061, 16469 => 21202, 16470 => 20048, + 16471 => 38647, 16472 => 38253, 16473 => 34174, 16474 => 30922, 16475 => 32047, + 16476 => 20769, 16477 => 22418, 16478 => 25794, 16479 => 32907, 16480 => 31867, + 16481 => 27882, 16482 => 26865, 16483 => 26974, 16484 => 20919, 16485 => 21400, + 16486 => 26792, 16487 => 29313, 16488 => 40654, 16489 => 31729, 16490 => 29432, + 16491 => 31163, 16492 => 28435, 16493 => 29702, 16494 => 26446, 16495 => 37324, + 16496 => 40100, 16497 => 31036, 16498 => 33673, 16499 => 33620, 16500 => 21519, + 16501 => 26647, 16502 => 20029, 16503 => 21385, 16504 => 21169, 16505 => 30782, + 16506 => 21382, 16507 => 21033, 16508 => 20616, 16509 => 20363, 16510 => 20432, + 16673 => 30178, 16674 => 31435, 16675 => 31890, 16676 => 27813, 16677 => 38582, + 16678 => 21147, 16679 => 29827, 16680 => 21737, 16681 => 20457, 16682 => 32852, + 16683 => 33714, 16684 => 36830, 16685 => 38256, 16686 => 24265, 16687 => 24604, + 16688 => 28063, 16689 => 24088, 16690 => 25947, 16691 => 33080, 16692 => 38142, + 16693 => 24651, 16694 => 28860, 16695 => 32451, 16696 => 31918, 16697 => 20937, + 16698 => 26753, 16699 => 31921, 16700 => 33391, 16701 => 20004, 16702 => 36742, + 16703 => 37327, 16704 => 26238, 16705 => 20142, 16706 => 35845, 16707 => 25769, + 16708 => 32842, 16709 => 20698, 16710 => 30103, 16711 => 29134, 16712 => 23525, + 16713 => 36797, 16714 => 28518, 16715 => 20102, 16716 => 25730, 16717 => 38243, + 16718 => 24278, 16719 => 26009, 16720 => 21015, 16721 => 35010, 16722 => 28872, + 16723 => 21155, 16724 => 29454, 16725 => 29747, 16726 => 26519, 16727 => 30967, + 16728 => 38678, 16729 => 20020, 16730 => 37051, 16731 => 40158, 16732 => 28107, + 16733 => 20955, 16734 => 36161, 16735 => 21533, 16736 => 25294, 16737 => 29618, + 16738 => 33777, 16739 => 38646, 16740 => 40836, 16741 => 38083, 16742 => 20278, + 16743 => 32666, 16744 => 20940, 16745 => 28789, 16746 => 38517, 16747 => 23725, + 16748 => 39046, 16749 => 21478, 16750 => 20196, 16751 => 28316, 16752 => 29705, + 16753 => 27060, 16754 => 30827, 16755 => 39311, 16756 => 30041, 16757 => 21016, + 16758 => 30244, 16759 => 27969, 16760 => 26611, 16761 => 20845, 16762 => 40857, + 16763 => 32843, 16764 => 21657, 16765 => 31548, 16766 => 31423, 16929 => 38534, + 16930 => 22404, 16931 => 25314, 16932 => 38471, 16933 => 27004, 16934 => 23044, + 16935 => 25602, 16936 => 31699, 16937 => 28431, 16938 => 38475, 16939 => 33446, + 16940 => 21346, 16941 => 39045, 16942 => 24208, 16943 => 28809, 16944 => 25523, + 16945 => 21348, 16946 => 34383, 16947 => 40065, 16948 => 40595, 16949 => 30860, + 16950 => 38706, 16951 => 36335, 16952 => 36162, 16953 => 40575, 16954 => 28510, + 16955 => 31108, 16956 => 24405, 16957 => 38470, 16958 => 25134, 16959 => 39540, + 16960 => 21525, 16961 => 38109, 16962 => 20387, 16963 => 26053, 16964 => 23653, + 16965 => 23649, 16966 => 32533, 16967 => 34385, 16968 => 27695, 16969 => 24459, + 16970 => 29575, 16971 => 28388, 16972 => 32511, 16973 => 23782, 16974 => 25371, + 16975 => 23402, 16976 => 28390, 16977 => 21365, 16978 => 20081, 16979 => 25504, + 16980 => 30053, 16981 => 25249, 16982 => 36718, 16983 => 20262, 16984 => 20177, + 16985 => 27814, 16986 => 32438, 16987 => 35770, 16988 => 33821, 16989 => 34746, + 16990 => 32599, 16991 => 36923, 16992 => 38179, 16993 => 31657, 16994 => 39585, + 16995 => 35064, 16996 => 33853, 16997 => 27931, 16998 => 39558, 16999 => 32476, + 17000 => 22920, 17001 => 40635, 17002 => 29595, 17003 => 30721, 17004 => 34434, + 17005 => 39532, 17006 => 39554, 17007 => 22043, 17008 => 21527, 17009 => 22475, + 17010 => 20080, 17011 => 40614, 17012 => 21334, 17013 => 36808, 17014 => 33033, + 17015 => 30610, 17016 => 39314, 17017 => 34542, 17018 => 28385, 17019 => 34067, + 17020 => 26364, 17021 => 24930, 17022 => 28459, 17185 => 35881, 17186 => 33426, + 17187 => 33579, 17188 => 30450, 17189 => 27667, 17190 => 24537, 17191 => 33725, + 17192 => 29483, 17193 => 33541, 17194 => 38170, 17195 => 27611, 17196 => 30683, + 17197 => 38086, 17198 => 21359, 17199 => 33538, 17200 => 20882, 17201 => 24125, + 17202 => 35980, 17203 => 36152, 17204 => 20040, 17205 => 29611, 17206 => 26522, + 17207 => 26757, 17208 => 37238, 17209 => 38665, 17210 => 29028, 17211 => 27809, + 17212 => 30473, 17213 => 23186, 17214 => 38209, 17215 => 27599, 17216 => 32654, + 17217 => 26151, 17218 => 23504, 17219 => 22969, 17220 => 23194, 17221 => 38376, + 17222 => 38391, 17223 => 20204, 17224 => 33804, 17225 => 33945, 17226 => 27308, + 17227 => 30431, 17228 => 38192, 17229 => 29467, 17230 => 26790, 17231 => 23391, + 17232 => 30511, 17233 => 37274, 17234 => 38753, 17235 => 31964, 17236 => 36855, + 17237 => 35868, 17238 => 24357, 17239 => 31859, 17240 => 31192, 17241 => 35269, + 17242 => 27852, 17243 => 34588, 17244 => 23494, 17245 => 24130, 17246 => 26825, + 17247 => 30496, 17248 => 32501, 17249 => 20885, 17250 => 20813, 17251 => 21193, + 17252 => 23081, 17253 => 32517, 17254 => 38754, 17255 => 33495, 17256 => 25551, + 17257 => 30596, 17258 => 34256, 17259 => 31186, 17260 => 28218, 17261 => 24217, + 17262 => 22937, 17263 => 34065, 17264 => 28781, 17265 => 27665, 17266 => 25279, + 17267 => 30399, 17268 => 25935, 17269 => 24751, 17270 => 38397, 17271 => 26126, + 17272 => 34719, 17273 => 40483, 17274 => 38125, 17275 => 21517, 17276 => 21629, + 17277 => 35884, 17278 => 25720, 17441 => 25721, 17442 => 34321, 17443 => 27169, + 17444 => 33180, 17445 => 30952, 17446 => 25705, 17447 => 39764, 17448 => 25273, + 17449 => 26411, 17450 => 33707, 17451 => 22696, 17452 => 40664, 17453 => 27819, + 17454 => 28448, 17455 => 23518, 17456 => 38476, 17457 => 35851, 17458 => 29279, + 17459 => 26576, 17460 => 25287, 17461 => 29281, 17462 => 20137, 17463 => 22982, + 17464 => 27597, 17465 => 22675, 17466 => 26286, 17467 => 24149, 17468 => 21215, + 17469 => 24917, 17470 => 26408, 17471 => 30446, 17472 => 30566, 17473 => 29287, + 17474 => 31302, 17475 => 25343, 17476 => 21738, 17477 => 21584, 17478 => 38048, + 17479 => 37027, 17480 => 23068, 17481 => 32435, 17482 => 27670, 17483 => 20035, + 17484 => 22902, 17485 => 32784, 17486 => 22856, 17487 => 21335, 17488 => 30007, + 17489 => 38590, 17490 => 22218, 17491 => 25376, 17492 => 33041, 17493 => 24700, + 17494 => 38393, 17495 => 28118, 17496 => 21602, 17497 => 39297, 17498 => 20869, + 17499 => 23273, 17500 => 33021, 17501 => 22958, 17502 => 38675, 17503 => 20522, + 17504 => 27877, 17505 => 23612, 17506 => 25311, 17507 => 20320, 17508 => 21311, + 17509 => 33147, 17510 => 36870, 17511 => 28346, 17512 => 34091, 17513 => 25288, + 17514 => 24180, 17515 => 30910, 17516 => 25781, 17517 => 25467, 17518 => 24565, + 17519 => 23064, 17520 => 37247, 17521 => 40479, 17522 => 23615, 17523 => 25423, + 17524 => 32834, 17525 => 23421, 17526 => 21870, 17527 => 38218, 17528 => 38221, + 17529 => 28037, 17530 => 24744, 17531 => 26592, 17532 => 29406, 17533 => 20957, + 17534 => 23425, 17697 => 25319, 17698 => 27870, 17699 => 29275, 17700 => 25197, + 17701 => 38062, 17702 => 32445, 17703 => 33043, 17704 => 27987, 17705 => 20892, + 17706 => 24324, 17707 => 22900, 17708 => 21162, 17709 => 24594, 17710 => 22899, + 17711 => 26262, 17712 => 34384, 17713 => 30111, 17714 => 25386, 17715 => 25062, + 17716 => 31983, 17717 => 35834, 17718 => 21734, 17719 => 27431, 17720 => 40485, + 17721 => 27572, 17722 => 34261, 17723 => 21589, 17724 => 20598, 17725 => 27812, + 17726 => 21866, 17727 => 36276, 17728 => 29228, 17729 => 24085, 17730 => 24597, + 17731 => 29750, 17732 => 25293, 17733 => 25490, 17734 => 29260, 17735 => 24472, + 17736 => 28227, 17737 => 27966, 17738 => 25856, 17739 => 28504, 17740 => 30424, + 17741 => 30928, 17742 => 30460, 17743 => 30036, 17744 => 21028, 17745 => 21467, + 17746 => 20051, 17747 => 24222, 17748 => 26049, 17749 => 32810, 17750 => 32982, + 17751 => 25243, 17752 => 21638, 17753 => 21032, 17754 => 28846, 17755 => 34957, + 17756 => 36305, 17757 => 27873, 17758 => 21624, 17759 => 32986, 17760 => 22521, + 17761 => 35060, 17762 => 36180, 17763 => 38506, 17764 => 37197, 17765 => 20329, + 17766 => 27803, 17767 => 21943, 17768 => 30406, 17769 => 30768, 17770 => 25256, + 17771 => 28921, 17772 => 28558, 17773 => 24429, 17774 => 34028, 17775 => 26842, + 17776 => 30844, 17777 => 31735, 17778 => 33192, 17779 => 26379, 17780 => 40527, + 17781 => 25447, 17782 => 30896, 17783 => 22383, 17784 => 30738, 17785 => 38713, + 17786 => 25209, 17787 => 25259, 17788 => 21128, 17789 => 29749, 17790 => 27607, + 17953 => 21860, 17954 => 33086, 17955 => 30130, 17956 => 30382, 17957 => 21305, + 17958 => 30174, 17959 => 20731, 17960 => 23617, 17961 => 35692, 17962 => 31687, + 17963 => 20559, 17964 => 29255, 17965 => 39575, 17966 => 39128, 17967 => 28418, + 17968 => 29922, 17969 => 31080, 17970 => 25735, 17971 => 30629, 17972 => 25340, + 17973 => 39057, 17974 => 36139, 17975 => 21697, 17976 => 32856, 17977 => 20050, + 17978 => 22378, 17979 => 33529, 17980 => 33805, 17981 => 24179, 17982 => 20973, + 17983 => 29942, 17984 => 35780, 17985 => 23631, 17986 => 22369, 17987 => 27900, + 17988 => 39047, 17989 => 23110, 17990 => 30772, 17991 => 39748, 17992 => 36843, + 17993 => 31893, 17994 => 21078, 17995 => 25169, 17996 => 38138, 17997 => 20166, + 17998 => 33670, 17999 => 33889, 18000 => 33769, 18001 => 33970, 18002 => 22484, + 18003 => 26420, 18004 => 22275, 18005 => 26222, 18006 => 28006, 18007 => 35889, + 18008 => 26333, 18009 => 28689, 18010 => 26399, 18011 => 27450, 18012 => 26646, + 18013 => 25114, 18014 => 22971, 18015 => 19971, 18016 => 20932, 18017 => 28422, + 18018 => 26578, 18019 => 27791, 18020 => 20854, 18021 => 26827, 18022 => 22855, + 18023 => 27495, 18024 => 30054, 18025 => 23822, 18026 => 33040, 18027 => 40784, + 18028 => 26071, 18029 => 31048, 18030 => 31041, 18031 => 39569, 18032 => 36215, + 18033 => 23682, 18034 => 20062, 18035 => 20225, 18036 => 21551, 18037 => 22865, + 18038 => 30732, 18039 => 22120, 18040 => 27668, 18041 => 36804, 18042 => 24323, + 18043 => 27773, 18044 => 27875, 18045 => 35755, 18046 => 25488, 18209 => 24688, + 18210 => 27965, 18211 => 29301, 18212 => 25190, 18213 => 38030, 18214 => 38085, + 18215 => 21315, 18216 => 36801, 18217 => 31614, 18218 => 20191, 18219 => 35878, + 18220 => 20094, 18221 => 40660, 18222 => 38065, 18223 => 38067, 18224 => 21069, + 18225 => 28508, 18226 => 36963, 18227 => 27973, 18228 => 35892, 18229 => 22545, + 18230 => 23884, 18231 => 27424, 18232 => 27465, 18233 => 26538, 18234 => 21595, + 18235 => 33108, 18236 => 32652, 18237 => 22681, 18238 => 34103, 18239 => 24378, + 18240 => 25250, 18241 => 27207, 18242 => 38201, 18243 => 25970, 18244 => 24708, + 18245 => 26725, 18246 => 30631, 18247 => 20052, 18248 => 20392, 18249 => 24039, + 18250 => 38808, 18251 => 25772, 18252 => 32728, 18253 => 23789, 18254 => 20431, + 18255 => 31373, 18256 => 20999, 18257 => 33540, 18258 => 19988, 18259 => 24623, + 18260 => 31363, 18261 => 38054, 18262 => 20405, 18263 => 20146, 18264 => 31206, + 18265 => 29748, 18266 => 21220, 18267 => 33465, 18268 => 25810, 18269 => 31165, + 18270 => 23517, 18271 => 27777, 18272 => 38738, 18273 => 36731, 18274 => 27682, + 18275 => 20542, 18276 => 21375, 18277 => 28165, 18278 => 25806, 18279 => 26228, + 18280 => 27696, 18281 => 24773, 18282 => 39031, 18283 => 35831, 18284 => 24198, + 18285 => 29756, 18286 => 31351, 18287 => 31179, 18288 => 19992, 18289 => 37041, + 18290 => 29699, 18291 => 27714, 18292 => 22234, 18293 => 37195, 18294 => 27845, + 18295 => 36235, 18296 => 21306, 18297 => 34502, 18298 => 26354, 18299 => 36527, + 18300 => 23624, 18301 => 39537, 18302 => 28192, 18465 => 21462, 18466 => 23094, + 18467 => 40843, 18468 => 36259, 18469 => 21435, 18470 => 22280, 18471 => 39079, + 18472 => 26435, 18473 => 37275, 18474 => 27849, 18475 => 20840, 18476 => 30154, + 18477 => 25331, 18478 => 29356, 18479 => 21048, 18480 => 21149, 18481 => 32570, + 18482 => 28820, 18483 => 30264, 18484 => 21364, 18485 => 40522, 18486 => 27063, + 18487 => 30830, 18488 => 38592, 18489 => 35033, 18490 => 32676, 18491 => 28982, + 18492 => 29123, 18493 => 20873, 18494 => 26579, 18495 => 29924, 18496 => 22756, + 18497 => 25880, 18498 => 22199, 18499 => 35753, 18500 => 39286, 18501 => 25200, + 18502 => 32469, 18503 => 24825, 18504 => 28909, 18505 => 22764, 18506 => 20161, + 18507 => 20154, 18508 => 24525, 18509 => 38887, 18510 => 20219, 18511 => 35748, + 18512 => 20995, 18513 => 22922, 18514 => 32427, 18515 => 25172, 18516 => 20173, + 18517 => 26085, 18518 => 25102, 18519 => 33592, 18520 => 33993, 18521 => 33635, + 18522 => 34701, 18523 => 29076, 18524 => 28342, 18525 => 23481, 18526 => 32466, + 18527 => 20887, 18528 => 25545, 18529 => 26580, 18530 => 32905, 18531 => 33593, + 18532 => 34837, 18533 => 20754, 18534 => 23418, 18535 => 22914, 18536 => 36785, + 18537 => 20083, 18538 => 27741, 18539 => 20837, 18540 => 35109, 18541 => 36719, + 18542 => 38446, 18543 => 34122, 18544 => 29790, 18545 => 38160, 18546 => 38384, + 18547 => 28070, 18548 => 33509, 18549 => 24369, 18550 => 25746, 18551 => 27922, + 18552 => 33832, 18553 => 33134, 18554 => 40131, 18555 => 22622, 18556 => 36187, + 18557 => 19977, 18558 => 21441, 18721 => 20254, 18722 => 25955, 18723 => 26705, + 18724 => 21971, 18725 => 20007, 18726 => 25620, 18727 => 39578, 18728 => 25195, + 18729 => 23234, 18730 => 29791, 18731 => 33394, 18732 => 28073, 18733 => 26862, + 18734 => 20711, 18735 => 33678, 18736 => 30722, 18737 => 26432, 18738 => 21049, + 18739 => 27801, 18740 => 32433, 18741 => 20667, 18742 => 21861, 18743 => 29022, + 18744 => 31579, 18745 => 26194, 18746 => 29642, 18747 => 33515, 18748 => 26441, + 18749 => 23665, 18750 => 21024, 18751 => 29053, 18752 => 34923, 18753 => 38378, + 18754 => 38485, 18755 => 25797, 18756 => 36193, 18757 => 33203, 18758 => 21892, + 18759 => 27733, 18760 => 25159, 18761 => 32558, 18762 => 22674, 18763 => 20260, + 18764 => 21830, 18765 => 36175, 18766 => 26188, 18767 => 19978, 18768 => 23578, + 18769 => 35059, 18770 => 26786, 18771 => 25422, 18772 => 31245, 18773 => 28903, + 18774 => 33421, 18775 => 21242, 18776 => 38902, 18777 => 23569, 18778 => 21736, + 18779 => 37045, 18780 => 32461, 18781 => 22882, 18782 => 36170, 18783 => 34503, + 18784 => 33292, 18785 => 33293, 18786 => 36198, 18787 => 25668, 18788 => 23556, + 18789 => 24913, 18790 => 28041, 18791 => 31038, 18792 => 35774, 18793 => 30775, + 18794 => 30003, 18795 => 21627, 18796 => 20280, 18797 => 36523, 18798 => 28145, + 18799 => 23072, 18800 => 32453, 18801 => 31070, 18802 => 27784, 18803 => 23457, + 18804 => 23158, 18805 => 29978, 18806 => 32958, 18807 => 24910, 18808 => 28183, + 18809 => 22768, 18810 => 29983, 18811 => 29989, 18812 => 29298, 18813 => 21319, + 18814 => 32499, 18977 => 30465, 18978 => 30427, 18979 => 21097, 18980 => 32988, + 18981 => 22307, 18982 => 24072, 18983 => 22833, 18984 => 29422, 18985 => 26045, + 18986 => 28287, 18987 => 35799, 18988 => 23608, 18989 => 34417, 18990 => 21313, + 18991 => 30707, 18992 => 25342, 18993 => 26102, 18994 => 20160, 18995 => 39135, + 18996 => 34432, 18997 => 23454, 18998 => 35782, 18999 => 21490, 19000 => 30690, + 19001 => 20351, 19002 => 23630, 19003 => 39542, 19004 => 22987, 19005 => 24335, + 19006 => 31034, 19007 => 22763, 19008 => 19990, 19009 => 26623, 19010 => 20107, + 19011 => 25325, 19012 => 35475, 19013 => 36893, 19014 => 21183, 19015 => 26159, + 19016 => 21980, 19017 => 22124, 19018 => 36866, 19019 => 20181, 19020 => 20365, + 19021 => 37322, 19022 => 39280, 19023 => 27663, 19024 => 24066, 19025 => 24643, + 19026 => 23460, 19027 => 35270, 19028 => 35797, 19029 => 25910, 19030 => 25163, + 19031 => 39318, 19032 => 23432, 19033 => 23551, 19034 => 25480, 19035 => 21806, + 19036 => 21463, 19037 => 30246, 19038 => 20861, 19039 => 34092, 19040 => 26530, + 19041 => 26803, 19042 => 27530, 19043 => 25234, 19044 => 36755, 19045 => 21460, + 19046 => 33298, 19047 => 28113, 19048 => 30095, 19049 => 20070, 19050 => 36174, + 19051 => 23408, 19052 => 29087, 19053 => 34223, 19054 => 26257, 19055 => 26329, + 19056 => 32626, 19057 => 34560, 19058 => 40653, 19059 => 40736, 19060 => 23646, + 19061 => 26415, 19062 => 36848, 19063 => 26641, 19064 => 26463, 19065 => 25101, + 19066 => 31446, 19067 => 22661, 19068 => 24246, 19069 => 25968, 19070 => 28465, + 19233 => 24661, 19234 => 21047, 19235 => 32781, 19236 => 25684, 19237 => 34928, + 19238 => 29993, 19239 => 24069, 19240 => 26643, 19241 => 25332, 19242 => 38684, + 19243 => 21452, 19244 => 29245, 19245 => 35841, 19246 => 27700, 19247 => 30561, + 19248 => 31246, 19249 => 21550, 19250 => 30636, 19251 => 39034, 19252 => 33308, + 19253 => 35828, 19254 => 30805, 19255 => 26388, 19256 => 28865, 19257 => 26031, + 19258 => 25749, 19259 => 22070, 19260 => 24605, 19261 => 31169, 19262 => 21496, + 19263 => 19997, 19264 => 27515, 19265 => 32902, 19266 => 23546, 19267 => 21987, + 19268 => 22235, 19269 => 20282, 19270 => 20284, 19271 => 39282, 19272 => 24051, + 19273 => 26494, 19274 => 32824, 19275 => 24578, 19276 => 39042, 19277 => 36865, + 19278 => 23435, 19279 => 35772, 19280 => 35829, 19281 => 25628, 19282 => 33368, + 19283 => 25822, 19284 => 22013, 19285 => 33487, 19286 => 37221, 19287 => 20439, + 19288 => 32032, 19289 => 36895, 19290 => 31903, 19291 => 20723, 19292 => 22609, + 19293 => 28335, 19294 => 23487, 19295 => 35785, 19296 => 32899, 19297 => 37240, + 19298 => 33948, 19299 => 31639, 19300 => 34429, 19301 => 38539, 19302 => 38543, + 19303 => 32485, 19304 => 39635, 19305 => 30862, 19306 => 23681, 19307 => 31319, + 19308 => 36930, 19309 => 38567, 19310 => 31071, 19311 => 23385, 19312 => 25439, + 19313 => 31499, 19314 => 34001, 19315 => 26797, 19316 => 21766, 19317 => 32553, + 19318 => 29712, 19319 => 32034, 19320 => 38145, 19321 => 25152, 19322 => 22604, + 19323 => 20182, 19324 => 23427, 19325 => 22905, 19326 => 22612, 19489 => 29549, + 19490 => 25374, 19491 => 36427, 19492 => 36367, 19493 => 32974, 19494 => 33492, + 19495 => 25260, 19496 => 21488, 19497 => 27888, 19498 => 37214, 19499 => 22826, + 19500 => 24577, 19501 => 27760, 19502 => 22349, 19503 => 25674, 19504 => 36138, + 19505 => 30251, 19506 => 28393, 19507 => 22363, 19508 => 27264, 19509 => 30192, + 19510 => 28525, 19511 => 35885, 19512 => 35848, 19513 => 22374, 19514 => 27631, + 19515 => 34962, 19516 => 30899, 19517 => 25506, 19518 => 21497, 19519 => 28845, + 19520 => 27748, 19521 => 22616, 19522 => 25642, 19523 => 22530, 19524 => 26848, + 19525 => 33179, 19526 => 21776, 19527 => 31958, 19528 => 20504, 19529 => 36538, + 19530 => 28108, 19531 => 36255, 19532 => 28907, 19533 => 25487, 19534 => 28059, + 19535 => 28372, 19536 => 32486, 19537 => 33796, 19538 => 26691, 19539 => 36867, + 19540 => 28120, 19541 => 38518, 19542 => 35752, 19543 => 22871, 19544 => 29305, + 19545 => 34276, 19546 => 33150, 19547 => 30140, 19548 => 35466, 19549 => 26799, + 19550 => 21076, 19551 => 36386, 19552 => 38161, 19553 => 25552, 19554 => 39064, + 19555 => 36420, 19556 => 21884, 19557 => 20307, 19558 => 26367, 19559 => 22159, + 19560 => 24789, 19561 => 28053, 19562 => 21059, 19563 => 23625, 19564 => 22825, + 19565 => 28155, 19566 => 22635, 19567 => 30000, 19568 => 29980, 19569 => 24684, + 19570 => 33300, 19571 => 33094, 19572 => 25361, 19573 => 26465, 19574 => 36834, + 19575 => 30522, 19576 => 36339, 19577 => 36148, 19578 => 38081, 19579 => 24086, + 19580 => 21381, 19581 => 21548, 19582 => 28867, 19745 => 27712, 19746 => 24311, + 19747 => 20572, 19748 => 20141, 19749 => 24237, 19750 => 25402, 19751 => 33351, + 19752 => 36890, 19753 => 26704, 19754 => 37230, 19755 => 30643, 19756 => 21516, + 19757 => 38108, 19758 => 24420, 19759 => 31461, 19760 => 26742, 19761 => 25413, + 19762 => 31570, 19763 => 32479, 19764 => 30171, 19765 => 20599, 19766 => 25237, + 19767 => 22836, 19768 => 36879, 19769 => 20984, 19770 => 31171, 19771 => 31361, + 19772 => 22270, 19773 => 24466, 19774 => 36884, 19775 => 28034, 19776 => 23648, + 19777 => 22303, 19778 => 21520, 19779 => 20820, 19780 => 28237, 19781 => 22242, + 19782 => 25512, 19783 => 39059, 19784 => 33151, 19785 => 34581, 19786 => 35114, + 19787 => 36864, 19788 => 21534, 19789 => 23663, 19790 => 33216, 19791 => 25302, + 19792 => 25176, 19793 => 33073, 19794 => 40501, 19795 => 38464, 19796 => 39534, + 19797 => 39548, 19798 => 26925, 19799 => 22949, 19800 => 25299, 19801 => 21822, + 19802 => 25366, 19803 => 21703, 19804 => 34521, 19805 => 27964, 19806 => 23043, + 19807 => 29926, 19808 => 34972, 19809 => 27498, 19810 => 22806, 19811 => 35916, + 19812 => 24367, 19813 => 28286, 19814 => 29609, 19815 => 39037, 19816 => 20024, + 19817 => 28919, 19818 => 23436, 19819 => 30871, 19820 => 25405, 19821 => 26202, + 19822 => 30358, 19823 => 24779, 19824 => 23451, 19825 => 23113, 19826 => 19975, + 19827 => 33109, 19828 => 27754, 19829 => 29579, 19830 => 20129, 19831 => 26505, + 19832 => 32593, 19833 => 24448, 19834 => 26106, 19835 => 26395, 19836 => 24536, + 19837 => 22916, 19838 => 23041, 20001 => 24013, 20002 => 24494, 20003 => 21361, + 20004 => 38886, 20005 => 36829, 20006 => 26693, 20007 => 22260, 20008 => 21807, + 20009 => 24799, 20010 => 20026, 20011 => 28493, 20012 => 32500, 20013 => 33479, + 20014 => 33806, 20015 => 22996, 20016 => 20255, 20017 => 20266, 20018 => 23614, + 20019 => 32428, 20020 => 26410, 20021 => 34074, 20022 => 21619, 20023 => 30031, + 20024 => 32963, 20025 => 21890, 20026 => 39759, 20027 => 20301, 20028 => 28205, + 20029 => 35859, 20030 => 23561, 20031 => 24944, 20032 => 21355, 20033 => 30239, + 20034 => 28201, 20035 => 34442, 20036 => 25991, 20037 => 38395, 20038 => 32441, + 20039 => 21563, 20040 => 31283, 20041 => 32010, 20042 => 38382, 20043 => 21985, + 20044 => 32705, 20045 => 29934, 20046 => 25373, 20047 => 34583, 20048 => 28065, + 20049 => 31389, 20050 => 25105, 20051 => 26017, 20052 => 21351, 20053 => 25569, + 20054 => 27779, 20055 => 24043, 20056 => 21596, 20057 => 38056, 20058 => 20044, + 20059 => 27745, 20060 => 35820, 20061 => 23627, 20062 => 26080, 20063 => 33436, + 20064 => 26791, 20065 => 21566, 20066 => 21556, 20067 => 27595, 20068 => 27494, + 20069 => 20116, 20070 => 25410, 20071 => 21320, 20072 => 33310, 20073 => 20237, + 20074 => 20398, 20075 => 22366, 20076 => 25098, 20077 => 38654, 20078 => 26212, + 20079 => 29289, 20080 => 21247, 20081 => 21153, 20082 => 24735, 20083 => 35823, + 20084 => 26132, 20085 => 29081, 20086 => 26512, 20087 => 35199, 20088 => 30802, + 20089 => 30717, 20090 => 26224, 20091 => 22075, 20092 => 21560, 20093 => 38177, + 20094 => 29306, 20257 => 31232, 20258 => 24687, 20259 => 24076, 20260 => 24713, + 20261 => 33181, 20262 => 22805, 20263 => 24796, 20264 => 29060, 20265 => 28911, + 20266 => 28330, 20267 => 27728, 20268 => 29312, 20269 => 27268, 20270 => 34989, + 20271 => 24109, 20272 => 20064, 20273 => 23219, 20274 => 21916, 20275 => 38115, + 20276 => 27927, 20277 => 31995, 20278 => 38553, 20279 => 25103, 20280 => 32454, + 20281 => 30606, 20282 => 34430, 20283 => 21283, 20284 => 38686, 20285 => 36758, + 20286 => 26247, 20287 => 23777, 20288 => 20384, 20289 => 29421, 20290 => 19979, + 20291 => 21414, 20292 => 22799, 20293 => 21523, 20294 => 25472, 20295 => 38184, + 20296 => 20808, 20297 => 20185, 20298 => 40092, 20299 => 32420, 20300 => 21688, + 20301 => 36132, 20302 => 34900, 20303 => 33335, 20304 => 38386, 20305 => 28046, + 20306 => 24358, 20307 => 23244, 20308 => 26174, 20309 => 38505, 20310 => 29616, + 20311 => 29486, 20312 => 21439, 20313 => 33146, 20314 => 39301, 20315 => 32673, + 20316 => 23466, 20317 => 38519, 20318 => 38480, 20319 => 32447, 20320 => 30456, + 20321 => 21410, 20322 => 38262, 20323 => 39321, 20324 => 31665, 20325 => 35140, + 20326 => 28248, 20327 => 20065, 20328 => 32724, 20329 => 31077, 20330 => 35814, + 20331 => 24819, 20332 => 21709, 20333 => 20139, 20334 => 39033, 20335 => 24055, + 20336 => 27233, 20337 => 20687, 20338 => 21521, 20339 => 35937, 20340 => 33831, + 20341 => 30813, 20342 => 38660, 20343 => 21066, 20344 => 21742, 20345 => 22179, + 20346 => 38144, 20347 => 28040, 20348 => 23477, 20349 => 28102, 20350 => 26195, + 20513 => 23567, 20514 => 23389, 20515 => 26657, 20516 => 32918, 20517 => 21880, + 20518 => 31505, 20519 => 25928, 20520 => 26964, 20521 => 20123, 20522 => 27463, + 20523 => 34638, 20524 => 38795, 20525 => 21327, 20526 => 25375, 20527 => 25658, + 20528 => 37034, 20529 => 26012, 20530 => 32961, 20531 => 35856, 20532 => 20889, + 20533 => 26800, 20534 => 21368, 20535 => 34809, 20536 => 25032, 20537 => 27844, + 20538 => 27899, 20539 => 35874, 20540 => 23633, 20541 => 34218, 20542 => 33455, + 20543 => 38156, 20544 => 27427, 20545 => 36763, 20546 => 26032, 20547 => 24571, + 20548 => 24515, 20549 => 20449, 20550 => 34885, 20551 => 26143, 20552 => 33125, + 20553 => 29481, 20554 => 24826, 20555 => 20852, 20556 => 21009, 20557 => 22411, + 20558 => 24418, 20559 => 37026, 20560 => 34892, 20561 => 37266, 20562 => 24184, + 20563 => 26447, 20564 => 24615, 20565 => 22995, 20566 => 20804, 20567 => 20982, + 20568 => 33016, 20569 => 21256, 20570 => 27769, 20571 => 38596, 20572 => 29066, + 20573 => 20241, 20574 => 20462, 20575 => 32670, 20576 => 26429, 20577 => 21957, + 20578 => 38152, 20579 => 31168, 20580 => 34966, 20581 => 32483, 20582 => 22687, + 20583 => 25100, 20584 => 38656, 20585 => 34394, 20586 => 22040, 20587 => 39035, + 20588 => 24464, 20589 => 35768, 20590 => 33988, 20591 => 37207, 20592 => 21465, + 20593 => 26093, 20594 => 24207, 20595 => 30044, 20596 => 24676, 20597 => 32110, + 20598 => 23167, 20599 => 32490, 20600 => 32493, 20601 => 36713, 20602 => 21927, + 20603 => 23459, 20604 => 24748, 20605 => 26059, 20606 => 29572, 20769 => 36873, + 20770 => 30307, 20771 => 30505, 20772 => 32474, 20773 => 38772, 20774 => 34203, + 20775 => 23398, 20776 => 31348, 20777 => 38634, 20778 => 34880, 20779 => 21195, + 20780 => 29071, 20781 => 24490, 20782 => 26092, 20783 => 35810, 20784 => 23547, + 20785 => 39535, 20786 => 24033, 20787 => 27529, 20788 => 27739, 20789 => 35757, + 20790 => 35759, 20791 => 36874, 20792 => 36805, 20793 => 21387, 20794 => 25276, + 20795 => 40486, 20796 => 40493, 20797 => 21568, 20798 => 20011, 20799 => 33469, + 20800 => 29273, 20801 => 34460, 20802 => 23830, 20803 => 34905, 20804 => 28079, + 20805 => 38597, 20806 => 21713, 20807 => 20122, 20808 => 35766, 20809 => 28937, + 20810 => 21693, 20811 => 38409, 20812 => 28895, 20813 => 28153, 20814 => 30416, + 20815 => 20005, 20816 => 30740, 20817 => 34578, 20818 => 23721, 20819 => 24310, + 20820 => 35328, 20821 => 39068, 20822 => 38414, 20823 => 28814, 20824 => 27839, + 20825 => 22852, 20826 => 25513, 20827 => 30524, 20828 => 34893, 20829 => 28436, + 20830 => 33395, 20831 => 22576, 20832 => 29141, 20833 => 21388, 20834 => 30746, + 20835 => 38593, 20836 => 21761, 20837 => 24422, 20838 => 28976, 20839 => 23476, + 20840 => 35866, 20841 => 39564, 20842 => 27523, 20843 => 22830, 20844 => 40495, + 20845 => 31207, 20846 => 26472, 20847 => 25196, 20848 => 20335, 20849 => 30113, + 20850 => 32650, 20851 => 27915, 20852 => 38451, 20853 => 27687, 20854 => 20208, + 20855 => 30162, 20856 => 20859, 20857 => 26679, 20858 => 28478, 20859 => 36992, + 20860 => 33136, 20861 => 22934, 20862 => 29814, 21025 => 25671, 21026 => 23591, + 21027 => 36965, 21028 => 31377, 21029 => 35875, 21030 => 23002, 21031 => 21676, + 21032 => 33280, 21033 => 33647, 21034 => 35201, 21035 => 32768, 21036 => 26928, + 21037 => 22094, 21038 => 32822, 21039 => 29239, 21040 => 37326, 21041 => 20918, + 21042 => 20063, 21043 => 39029, 21044 => 25494, 21045 => 19994, 21046 => 21494, + 21047 => 26355, 21048 => 33099, 21049 => 22812, 21050 => 28082, 21051 => 19968, + 21052 => 22777, 21053 => 21307, 21054 => 25558, 21055 => 38129, 21056 => 20381, + 21057 => 20234, 21058 => 34915, 21059 => 39056, 21060 => 22839, 21061 => 36951, + 21062 => 31227, 21063 => 20202, 21064 => 33008, 21065 => 30097, 21066 => 27778, + 21067 => 23452, 21068 => 23016, 21069 => 24413, 21070 => 26885, 21071 => 34433, + 21072 => 20506, 21073 => 24050, 21074 => 20057, 21075 => 30691, 21076 => 20197, + 21077 => 33402, 21078 => 25233, 21079 => 26131, 21080 => 37009, 21081 => 23673, + 21082 => 20159, 21083 => 24441, 21084 => 33222, 21085 => 36920, 21086 => 32900, + 21087 => 30123, 21088 => 20134, 21089 => 35028, 21090 => 24847, 21091 => 27589, + 21092 => 24518, 21093 => 20041, 21094 => 30410, 21095 => 28322, 21096 => 35811, + 21097 => 35758, 21098 => 35850, 21099 => 35793, 21100 => 24322, 21101 => 32764, + 21102 => 32716, 21103 => 32462, 21104 => 33589, 21105 => 33643, 21106 => 22240, + 21107 => 27575, 21108 => 38899, 21109 => 38452, 21110 => 23035, 21111 => 21535, + 21112 => 38134, 21113 => 28139, 21114 => 23493, 21115 => 39278, 21116 => 23609, + 21117 => 24341, 21118 => 38544, 21281 => 21360, 21282 => 33521, 21283 => 27185, + 21284 => 23156, 21285 => 40560, 21286 => 24212, 21287 => 32552, 21288 => 33721, + 21289 => 33828, 21290 => 33829, 21291 => 33639, 21292 => 34631, 21293 => 36814, + 21294 => 36194, 21295 => 30408, 21296 => 24433, 21297 => 39062, 21298 => 30828, + 21299 => 26144, 21300 => 21727, 21301 => 25317, 21302 => 20323, 21303 => 33219, + 21304 => 30152, 21305 => 24248, 21306 => 38605, 21307 => 36362, 21308 => 34553, + 21309 => 21647, 21310 => 27891, 21311 => 28044, 21312 => 27704, 21313 => 24703, + 21314 => 21191, 21315 => 29992, 21316 => 24189, 21317 => 20248, 21318 => 24736, + 21319 => 24551, 21320 => 23588, 21321 => 30001, 21322 => 37038, 21323 => 38080, + 21324 => 29369, 21325 => 27833, 21326 => 28216, 21327 => 37193, 21328 => 26377, + 21329 => 21451, 21330 => 21491, 21331 => 20305, 21332 => 37321, 21333 => 35825, + 21334 => 21448, 21335 => 24188, 21336 => 36802, 21337 => 28132, 21338 => 20110, + 21339 => 30402, 21340 => 27014, 21341 => 34398, 21342 => 24858, 21343 => 33286, + 21344 => 20313, 21345 => 20446, 21346 => 36926, 21347 => 40060, 21348 => 24841, + 21349 => 28189, 21350 => 28180, 21351 => 38533, 21352 => 20104, 21353 => 23089, + 21354 => 38632, 21355 => 19982, 21356 => 23679, 21357 => 31161, 21358 => 23431, + 21359 => 35821, 21360 => 32701, 21361 => 29577, 21362 => 22495, 21363 => 33419, + 21364 => 37057, 21365 => 21505, 21366 => 36935, 21367 => 21947, 21368 => 23786, + 21369 => 24481, 21370 => 24840, 21371 => 27442, 21372 => 29425, 21373 => 32946, + 21374 => 35465, 21537 => 28020, 21538 => 23507, 21539 => 35029, 21540 => 39044, + 21541 => 35947, 21542 => 39533, 21543 => 40499, 21544 => 28170, 21545 => 20900, + 21546 => 20803, 21547 => 22435, 21548 => 34945, 21549 => 21407, 21550 => 25588, + 21551 => 36757, 21552 => 22253, 21553 => 21592, 21554 => 22278, 21555 => 29503, + 21556 => 28304, 21557 => 32536, 21558 => 36828, 21559 => 33489, 21560 => 24895, + 21561 => 24616, 21562 => 38498, 21563 => 26352, 21564 => 32422, 21565 => 36234, + 21566 => 36291, 21567 => 38053, 21568 => 23731, 21569 => 31908, 21570 => 26376, + 21571 => 24742, 21572 => 38405, 21573 => 32792, 21574 => 20113, 21575 => 37095, + 21576 => 21248, 21577 => 38504, 21578 => 20801, 21579 => 36816, 21580 => 34164, + 21581 => 37213, 21582 => 26197, 21583 => 38901, 21584 => 23381, 21585 => 21277, + 21586 => 30776, 21587 => 26434, 21588 => 26685, 21589 => 21705, 21590 => 28798, + 21591 => 23472, 21592 => 36733, 21593 => 20877, 21594 => 22312, 21595 => 21681, + 21596 => 25874, 21597 => 26242, 21598 => 36190, 21599 => 36163, 21600 => 33039, + 21601 => 33900, 21602 => 36973, 21603 => 31967, 21604 => 20991, 21605 => 34299, + 21606 => 26531, 21607 => 26089, 21608 => 28577, 21609 => 34468, 21610 => 36481, + 21611 => 22122, 21612 => 36896, 21613 => 30338, 21614 => 28790, 21615 => 29157, + 21616 => 36131, 21617 => 25321, 21618 => 21017, 21619 => 27901, 21620 => 36156, + 21621 => 24590, 21622 => 22686, 21623 => 24974, 21624 => 26366, 21625 => 36192, + 21626 => 25166, 21627 => 21939, 21628 => 28195, 21629 => 26413, 21630 => 36711, + 21793 => 38113, 21794 => 38392, 21795 => 30504, 21796 => 26629, 21797 => 27048, + 21798 => 21643, 21799 => 20045, 21800 => 28856, 21801 => 35784, 21802 => 25688, + 21803 => 25995, 21804 => 23429, 21805 => 31364, 21806 => 20538, 21807 => 23528, + 21808 => 30651, 21809 => 27617, 21810 => 35449, 21811 => 31896, 21812 => 27838, + 21813 => 30415, 21814 => 26025, 21815 => 36759, 21816 => 23853, 21817 => 23637, + 21818 => 34360, 21819 => 26632, 21820 => 21344, 21821 => 25112, 21822 => 31449, + 21823 => 28251, 21824 => 32509, 21825 => 27167, 21826 => 31456, 21827 => 24432, + 21828 => 28467, 21829 => 24352, 21830 => 25484, 21831 => 28072, 21832 => 26454, + 21833 => 19976, 21834 => 24080, 21835 => 36134, 21836 => 20183, 21837 => 32960, + 21838 => 30260, 21839 => 38556, 21840 => 25307, 21841 => 26157, 21842 => 25214, + 21843 => 27836, 21844 => 36213, 21845 => 29031, 21846 => 32617, 21847 => 20806, + 21848 => 32903, 21849 => 21484, 21850 => 36974, 21851 => 25240, 21852 => 21746, + 21853 => 34544, 21854 => 36761, 21855 => 32773, 21856 => 38167, 21857 => 34071, + 21858 => 36825, 21859 => 27993, 21860 => 29645, 21861 => 26015, 21862 => 30495, + 21863 => 29956, 21864 => 30759, 21865 => 33275, 21866 => 36126, 21867 => 38024, + 21868 => 20390, 21869 => 26517, 21870 => 30137, 21871 => 35786, 21872 => 38663, + 21873 => 25391, 21874 => 38215, 21875 => 38453, 21876 => 33976, 21877 => 25379, + 21878 => 30529, 21879 => 24449, 21880 => 29424, 21881 => 20105, 21882 => 24596, + 21883 => 25972, 21884 => 25327, 21885 => 27491, 21886 => 25919, 22049 => 24103, + 22050 => 30151, 22051 => 37073, 22052 => 35777, 22053 => 33437, 22054 => 26525, + 22055 => 25903, 22056 => 21553, 22057 => 34584, 22058 => 30693, 22059 => 32930, + 22060 => 33026, 22061 => 27713, 22062 => 20043, 22063 => 32455, 22064 => 32844, + 22065 => 30452, 22066 => 26893, 22067 => 27542, 22068 => 25191, 22069 => 20540, + 22070 => 20356, 22071 => 22336, 22072 => 25351, 22073 => 27490, 22074 => 36286, + 22075 => 21482, 22076 => 26088, 22077 => 32440, 22078 => 24535, 22079 => 25370, + 22080 => 25527, 22081 => 33267, 22082 => 33268, 22083 => 32622, 22084 => 24092, + 22085 => 23769, 22086 => 21046, 22087 => 26234, 22088 => 31209, 22089 => 31258, + 22090 => 36136, 22091 => 28825, 22092 => 30164, 22093 => 28382, 22094 => 27835, + 22095 => 31378, 22096 => 20013, 22097 => 30405, 22098 => 24544, 22099 => 38047, + 22100 => 34935, 22101 => 32456, 22102 => 31181, 22103 => 32959, 22104 => 37325, + 22105 => 20210, 22106 => 20247, 22107 => 33311, 22108 => 21608, 22109 => 24030, + 22110 => 27954, 22111 => 35788, 22112 => 31909, 22113 => 36724, 22114 => 32920, + 22115 => 24090, 22116 => 21650, 22117 => 30385, 22118 => 23449, 22119 => 26172, + 22120 => 39588, 22121 => 29664, 22122 => 26666, 22123 => 34523, 22124 => 26417, + 22125 => 29482, 22126 => 35832, 22127 => 35803, 22128 => 36880, 22129 => 31481, + 22130 => 28891, 22131 => 29038, 22132 => 25284, 22133 => 30633, 22134 => 22065, + 22135 => 20027, 22136 => 33879, 22137 => 26609, 22138 => 21161, 22139 => 34496, + 22140 => 36142, 22141 => 38136, 22142 => 31569, 22305 => 20303, 22306 => 27880, + 22307 => 31069, 22308 => 39547, 22309 => 25235, 22310 => 29226, 22311 => 25341, + 22312 => 19987, 22313 => 30742, 22314 => 36716, 22315 => 25776, 22316 => 36186, + 22317 => 31686, 22318 => 26729, 22319 => 24196, 22320 => 35013, 22321 => 22918, + 22322 => 25758, 22323 => 22766, 22324 => 29366, 22325 => 26894, 22326 => 38181, + 22327 => 36861, 22328 => 36184, 22329 => 22368, 22330 => 32512, 22331 => 35846, + 22332 => 20934, 22333 => 25417, 22334 => 25305, 22335 => 21331, 22336 => 26700, + 22337 => 29730, 22338 => 33537, 22339 => 37196, 22340 => 21828, 22341 => 30528, + 22342 => 28796, 22343 => 27978, 22344 => 20857, 22345 => 21672, 22346 => 36164, + 22347 => 23039, 22348 => 28363, 22349 => 28100, 22350 => 23388, 22351 => 32043, + 22352 => 20180, 22353 => 31869, 22354 => 28371, 22355 => 23376, 22356 => 33258, + 22357 => 28173, 22358 => 23383, 22359 => 39683, 22360 => 26837, 22361 => 36394, + 22362 => 23447, 22363 => 32508, 22364 => 24635, 22365 => 32437, 22366 => 37049, + 22367 => 36208, 22368 => 22863, 22369 => 25549, 22370 => 31199, 22371 => 36275, + 22372 => 21330, 22373 => 26063, 22374 => 31062, 22375 => 35781, 22376 => 38459, + 22377 => 32452, 22378 => 38075, 22379 => 32386, 22380 => 22068, 22381 => 37257, + 22382 => 26368, 22383 => 32618, 22384 => 23562, 22385 => 36981, 22386 => 26152, + 22387 => 24038, 22388 => 20304, 22389 => 26590, 22390 => 20570, 22391 => 20316, + 22392 => 22352, 22393 => 24231, 22561 => 20109, 22562 => 19980, 22563 => 20800, + 22564 => 19984, 22565 => 24319, 22566 => 21317, 22567 => 19989, 22568 => 20120, + 22569 => 19998, 22570 => 39730, 22571 => 23404, 22572 => 22121, 22573 => 20008, + 22574 => 31162, 22575 => 20031, 22576 => 21269, 22577 => 20039, 22578 => 22829, + 22579 => 29243, 22580 => 21358, 22581 => 27664, 22582 => 22239, 22583 => 32996, + 22584 => 39319, 22585 => 27603, 22586 => 30590, 22587 => 40727, 22588 => 20022, + 22589 => 20127, 22590 => 40720, 22591 => 20060, 22592 => 20073, 22593 => 20115, + 22594 => 33416, 22595 => 23387, 22596 => 21868, 22597 => 22031, 22598 => 20164, + 22599 => 21389, 22600 => 21405, 22601 => 21411, 22602 => 21413, 22603 => 21422, + 22604 => 38757, 22605 => 36189, 22606 => 21274, 22607 => 21493, 22608 => 21286, + 22609 => 21294, 22610 => 21310, 22611 => 36188, 22612 => 21350, 22613 => 21347, + 22614 => 20994, 22615 => 21000, 22616 => 21006, 22617 => 21037, 22618 => 21043, + 22619 => 21055, 22620 => 21056, 22621 => 21068, 22622 => 21086, 22623 => 21089, + 22624 => 21084, 22625 => 33967, 22626 => 21117, 22627 => 21122, 22628 => 21121, + 22629 => 21136, 22630 => 21139, 22631 => 20866, 22632 => 32596, 22633 => 20155, + 22634 => 20163, 22635 => 20169, 22636 => 20162, 22637 => 20200, 22638 => 20193, + 22639 => 20203, 22640 => 20190, 22641 => 20251, 22642 => 20211, 22643 => 20258, + 22644 => 20324, 22645 => 20213, 22646 => 20261, 22647 => 20263, 22648 => 20233, + 22649 => 20267, 22650 => 20318, 22651 => 20327, 22652 => 25912, 22653 => 20314, + 22654 => 20317, 22817 => 20319, 22818 => 20311, 22819 => 20274, 22820 => 20285, + 22821 => 20342, 22822 => 20340, 22823 => 20369, 22824 => 20361, 22825 => 20355, + 22826 => 20367, 22827 => 20350, 22828 => 20347, 22829 => 20394, 22830 => 20348, + 22831 => 20396, 22832 => 20372, 22833 => 20454, 22834 => 20456, 22835 => 20458, + 22836 => 20421, 22837 => 20442, 22838 => 20451, 22839 => 20444, 22840 => 20433, + 22841 => 20447, 22842 => 20472, 22843 => 20521, 22844 => 20556, 22845 => 20467, + 22846 => 20524, 22847 => 20495, 22848 => 20526, 22849 => 20525, 22850 => 20478, + 22851 => 20508, 22852 => 20492, 22853 => 20517, 22854 => 20520, 22855 => 20606, + 22856 => 20547, 22857 => 20565, 22858 => 20552, 22859 => 20558, 22860 => 20588, + 22861 => 20603, 22862 => 20645, 22863 => 20647, 22864 => 20649, 22865 => 20666, + 22866 => 20694, 22867 => 20742, 22868 => 20717, 22869 => 20716, 22870 => 20710, + 22871 => 20718, 22872 => 20743, 22873 => 20747, 22874 => 20189, 22875 => 27709, + 22876 => 20312, 22877 => 20325, 22878 => 20430, 22879 => 40864, 22880 => 27718, + 22881 => 31860, 22882 => 20846, 22883 => 24061, 22884 => 40649, 22885 => 39320, + 22886 => 20865, 22887 => 22804, 22888 => 21241, 22889 => 21261, 22890 => 35335, + 22891 => 21264, 22892 => 20971, 22893 => 22809, 22894 => 20821, 22895 => 20128, + 22896 => 20822, 22897 => 20147, 22898 => 34926, 22899 => 34980, 22900 => 20149, + 22901 => 33044, 22902 => 35026, 22903 => 31104, 22904 => 23348, 22905 => 34819, + 22906 => 32696, 22907 => 20907, 22908 => 20913, 22909 => 20925, 22910 => 20924, + 23073 => 20935, 23074 => 20886, 23075 => 20898, 23076 => 20901, 23077 => 35744, + 23078 => 35750, 23079 => 35751, 23080 => 35754, 23081 => 35764, 23082 => 35765, + 23083 => 35767, 23084 => 35778, 23085 => 35779, 23086 => 35787, 23087 => 35791, + 23088 => 35790, 23089 => 35794, 23090 => 35795, 23091 => 35796, 23092 => 35798, + 23093 => 35800, 23094 => 35801, 23095 => 35804, 23096 => 35807, 23097 => 35808, + 23098 => 35812, 23099 => 35816, 23100 => 35817, 23101 => 35822, 23102 => 35824, + 23103 => 35827, 23104 => 35830, 23105 => 35833, 23106 => 35836, 23107 => 35839, + 23108 => 35840, 23109 => 35842, 23110 => 35844, 23111 => 35847, 23112 => 35852, + 23113 => 35855, 23114 => 35857, 23115 => 35858, 23116 => 35860, 23117 => 35861, + 23118 => 35862, 23119 => 35865, 23120 => 35867, 23121 => 35864, 23122 => 35869, + 23123 => 35871, 23124 => 35872, 23125 => 35873, 23126 => 35877, 23127 => 35879, + 23128 => 35882, 23129 => 35883, 23130 => 35886, 23131 => 35887, 23132 => 35890, + 23133 => 35891, 23134 => 35893, 23135 => 35894, 23136 => 21353, 23137 => 21370, + 23138 => 38429, 23139 => 38434, 23140 => 38433, 23141 => 38449, 23142 => 38442, + 23143 => 38461, 23144 => 38460, 23145 => 38466, 23146 => 38473, 23147 => 38484, + 23148 => 38495, 23149 => 38503, 23150 => 38508, 23151 => 38514, 23152 => 38516, + 23153 => 38536, 23154 => 38541, 23155 => 38551, 23156 => 38576, 23157 => 37015, + 23158 => 37019, 23159 => 37021, 23160 => 37017, 23161 => 37036, 23162 => 37025, + 23163 => 37044, 23164 => 37043, 23165 => 37046, 23166 => 37050, 23329 => 37048, + 23330 => 37040, 23331 => 37071, 23332 => 37061, 23333 => 37054, 23334 => 37072, + 23335 => 37060, 23336 => 37063, 23337 => 37075, 23338 => 37094, 23339 => 37090, + 23340 => 37084, 23341 => 37079, 23342 => 37083, 23343 => 37099, 23344 => 37103, + 23345 => 37118, 23346 => 37124, 23347 => 37154, 23348 => 37150, 23349 => 37155, + 23350 => 37169, 23351 => 37167, 23352 => 37177, 23353 => 37187, 23354 => 37190, + 23355 => 21005, 23356 => 22850, 23357 => 21154, 23358 => 21164, 23359 => 21165, + 23360 => 21182, 23361 => 21759, 23362 => 21200, 23363 => 21206, 23364 => 21232, + 23365 => 21471, 23366 => 29166, 23367 => 30669, 23368 => 24308, 23369 => 20981, + 23370 => 20988, 23371 => 39727, 23372 => 21430, 23373 => 24321, 23374 => 30042, + 23375 => 24047, 23376 => 22348, 23377 => 22441, 23378 => 22433, 23379 => 22654, + 23380 => 22716, 23381 => 22725, 23382 => 22737, 23383 => 22313, 23384 => 22316, + 23385 => 22314, 23386 => 22323, 23387 => 22329, 23388 => 22318, 23389 => 22319, + 23390 => 22364, 23391 => 22331, 23392 => 22338, 23393 => 22377, 23394 => 22405, + 23395 => 22379, 23396 => 22406, 23397 => 22396, 23398 => 22395, 23399 => 22376, + 23400 => 22381, 23401 => 22390, 23402 => 22387, 23403 => 22445, 23404 => 22436, + 23405 => 22412, 23406 => 22450, 23407 => 22479, 23408 => 22439, 23409 => 22452, + 23410 => 22419, 23411 => 22432, 23412 => 22485, 23413 => 22488, 23414 => 22490, + 23415 => 22489, 23416 => 22482, 23417 => 22456, 23418 => 22516, 23419 => 22511, + 23420 => 22520, 23421 => 22500, 23422 => 22493, 23585 => 22539, 23586 => 22541, + 23587 => 22525, 23588 => 22509, 23589 => 22528, 23590 => 22558, 23591 => 22553, + 23592 => 22596, 23593 => 22560, 23594 => 22629, 23595 => 22636, 23596 => 22657, + 23597 => 22665, 23598 => 22682, 23599 => 22656, 23600 => 39336, 23601 => 40729, + 23602 => 25087, 23603 => 33401, 23604 => 33405, 23605 => 33407, 23606 => 33423, + 23607 => 33418, 23608 => 33448, 23609 => 33412, 23610 => 33422, 23611 => 33425, + 23612 => 33431, 23613 => 33433, 23614 => 33451, 23615 => 33464, 23616 => 33470, + 23617 => 33456, 23618 => 33480, 23619 => 33482, 23620 => 33507, 23621 => 33432, + 23622 => 33463, 23623 => 33454, 23624 => 33483, 23625 => 33484, 23626 => 33473, + 23627 => 33449, 23628 => 33460, 23629 => 33441, 23630 => 33450, 23631 => 33439, + 23632 => 33476, 23633 => 33486, 23634 => 33444, 23635 => 33505, 23636 => 33545, + 23637 => 33527, 23638 => 33508, 23639 => 33551, 23640 => 33543, 23641 => 33500, + 23642 => 33524, 23643 => 33490, 23644 => 33496, 23645 => 33548, 23646 => 33531, + 23647 => 33491, 23648 => 33553, 23649 => 33562, 23650 => 33542, 23651 => 33556, + 23652 => 33557, 23653 => 33504, 23654 => 33493, 23655 => 33564, 23656 => 33617, + 23657 => 33627, 23658 => 33628, 23659 => 33544, 23660 => 33682, 23661 => 33596, + 23662 => 33588, 23663 => 33585, 23664 => 33691, 23665 => 33630, 23666 => 33583, + 23667 => 33615, 23668 => 33607, 23669 => 33603, 23670 => 33631, 23671 => 33600, + 23672 => 33559, 23673 => 33632, 23674 => 33581, 23675 => 33594, 23676 => 33587, + 23677 => 33638, 23678 => 33637, 23841 => 33640, 23842 => 33563, 23843 => 33641, + 23844 => 33644, 23845 => 33642, 23846 => 33645, 23847 => 33646, 23848 => 33712, + 23849 => 33656, 23850 => 33715, 23851 => 33716, 23852 => 33696, 23853 => 33706, + 23854 => 33683, 23855 => 33692, 23856 => 33669, 23857 => 33660, 23858 => 33718, + 23859 => 33705, 23860 => 33661, 23861 => 33720, 23862 => 33659, 23863 => 33688, + 23864 => 33694, 23865 => 33704, 23866 => 33722, 23867 => 33724, 23868 => 33729, + 23869 => 33793, 23870 => 33765, 23871 => 33752, 23872 => 22535, 23873 => 33816, + 23874 => 33803, 23875 => 33757, 23876 => 33789, 23877 => 33750, 23878 => 33820, + 23879 => 33848, 23880 => 33809, 23881 => 33798, 23882 => 33748, 23883 => 33759, + 23884 => 33807, 23885 => 33795, 23886 => 33784, 23887 => 33785, 23888 => 33770, + 23889 => 33733, 23890 => 33728, 23891 => 33830, 23892 => 33776, 23893 => 33761, + 23894 => 33884, 23895 => 33873, 23896 => 33882, 23897 => 33881, 23898 => 33907, + 23899 => 33927, 23900 => 33928, 23901 => 33914, 23902 => 33929, 23903 => 33912, + 23904 => 33852, 23905 => 33862, 23906 => 33897, 23907 => 33910, 23908 => 33932, + 23909 => 33934, 23910 => 33841, 23911 => 33901, 23912 => 33985, 23913 => 33997, + 23914 => 34000, 23915 => 34022, 23916 => 33981, 23917 => 34003, 23918 => 33994, + 23919 => 33983, 23920 => 33978, 23921 => 34016, 23922 => 33953, 23923 => 33977, + 23924 => 33972, 23925 => 33943, 23926 => 34021, 23927 => 34019, 23928 => 34060, + 23929 => 29965, 23930 => 34104, 23931 => 34032, 23932 => 34105, 23933 => 34079, + 23934 => 34106, 24097 => 34134, 24098 => 34107, 24099 => 34047, 24100 => 34044, + 24101 => 34137, 24102 => 34120, 24103 => 34152, 24104 => 34148, 24105 => 34142, + 24106 => 34170, 24107 => 30626, 24108 => 34115, 24109 => 34162, 24110 => 34171, + 24111 => 34212, 24112 => 34216, 24113 => 34183, 24114 => 34191, 24115 => 34169, + 24116 => 34222, 24117 => 34204, 24118 => 34181, 24119 => 34233, 24120 => 34231, + 24121 => 34224, 24122 => 34259, 24123 => 34241, 24124 => 34268, 24125 => 34303, + 24126 => 34343, 24127 => 34309, 24128 => 34345, 24129 => 34326, 24130 => 34364, + 24131 => 24318, 24132 => 24328, 24133 => 22844, 24134 => 22849, 24135 => 32823, + 24136 => 22869, 24137 => 22874, 24138 => 22872, 24139 => 21263, 24140 => 23586, + 24141 => 23589, 24142 => 23596, 24143 => 23604, 24144 => 25164, 24145 => 25194, + 24146 => 25247, 24147 => 25275, 24148 => 25290, 24149 => 25306, 24150 => 25303, + 24151 => 25326, 24152 => 25378, 24153 => 25334, 24154 => 25401, 24155 => 25419, + 24156 => 25411, 24157 => 25517, 24158 => 25590, 24159 => 25457, 24160 => 25466, + 24161 => 25486, 24162 => 25524, 24163 => 25453, 24164 => 25516, 24165 => 25482, + 24166 => 25449, 24167 => 25518, 24168 => 25532, 24169 => 25586, 24170 => 25592, + 24171 => 25568, 24172 => 25599, 24173 => 25540, 24174 => 25566, 24175 => 25550, + 24176 => 25682, 24177 => 25542, 24178 => 25534, 24179 => 25669, 24180 => 25665, + 24181 => 25611, 24182 => 25627, 24183 => 25632, 24184 => 25612, 24185 => 25638, + 24186 => 25633, 24187 => 25694, 24188 => 25732, 24189 => 25709, 24190 => 25750, + 24353 => 25722, 24354 => 25783, 24355 => 25784, 24356 => 25753, 24357 => 25786, + 24358 => 25792, 24359 => 25808, 24360 => 25815, 24361 => 25828, 24362 => 25826, + 24363 => 25865, 24364 => 25893, 24365 => 25902, 24366 => 24331, 24367 => 24530, + 24368 => 29977, 24369 => 24337, 24370 => 21343, 24371 => 21489, 24372 => 21501, + 24373 => 21481, 24374 => 21480, 24375 => 21499, 24376 => 21522, 24377 => 21526, + 24378 => 21510, 24379 => 21579, 24380 => 21586, 24381 => 21587, 24382 => 21588, + 24383 => 21590, 24384 => 21571, 24385 => 21537, 24386 => 21591, 24387 => 21593, + 24388 => 21539, 24389 => 21554, 24390 => 21634, 24391 => 21652, 24392 => 21623, + 24393 => 21617, 24394 => 21604, 24395 => 21658, 24396 => 21659, 24397 => 21636, + 24398 => 21622, 24399 => 21606, 24400 => 21661, 24401 => 21712, 24402 => 21677, + 24403 => 21698, 24404 => 21684, 24405 => 21714, 24406 => 21671, 24407 => 21670, + 24408 => 21715, 24409 => 21716, 24410 => 21618, 24411 => 21667, 24412 => 21717, + 24413 => 21691, 24414 => 21695, 24415 => 21708, 24416 => 21721, 24417 => 21722, + 24418 => 21724, 24419 => 21673, 24420 => 21674, 24421 => 21668, 24422 => 21725, + 24423 => 21711, 24424 => 21726, 24425 => 21787, 24426 => 21735, 24427 => 21792, + 24428 => 21757, 24429 => 21780, 24430 => 21747, 24431 => 21794, 24432 => 21795, + 24433 => 21775, 24434 => 21777, 24435 => 21799, 24436 => 21802, 24437 => 21863, + 24438 => 21903, 24439 => 21941, 24440 => 21833, 24441 => 21869, 24442 => 21825, + 24443 => 21845, 24444 => 21823, 24445 => 21840, 24446 => 21820, 24609 => 21815, + 24610 => 21846, 24611 => 21877, 24612 => 21878, 24613 => 21879, 24614 => 21811, + 24615 => 21808, 24616 => 21852, 24617 => 21899, 24618 => 21970, 24619 => 21891, + 24620 => 21937, 24621 => 21945, 24622 => 21896, 24623 => 21889, 24624 => 21919, + 24625 => 21886, 24626 => 21974, 24627 => 21905, 24628 => 21883, 24629 => 21983, + 24630 => 21949, 24631 => 21950, 24632 => 21908, 24633 => 21913, 24634 => 21994, + 24635 => 22007, 24636 => 21961, 24637 => 22047, 24638 => 21969, 24639 => 21995, + 24640 => 21996, 24641 => 21972, 24642 => 21990, 24643 => 21981, 24644 => 21956, + 24645 => 21999, 24646 => 21989, 24647 => 22002, 24648 => 22003, 24649 => 21964, + 24650 => 21965, 24651 => 21992, 24652 => 22005, 24653 => 21988, 24654 => 36756, + 24655 => 22046, 24656 => 22024, 24657 => 22028, 24658 => 22017, 24659 => 22052, + 24660 => 22051, 24661 => 22014, 24662 => 22016, 24663 => 22055, 24664 => 22061, + 24665 => 22104, 24666 => 22073, 24667 => 22103, 24668 => 22060, 24669 => 22093, + 24670 => 22114, 24671 => 22105, 24672 => 22108, 24673 => 22092, 24674 => 22100, + 24675 => 22150, 24676 => 22116, 24677 => 22129, 24678 => 22123, 24679 => 22139, + 24680 => 22140, 24681 => 22149, 24682 => 22163, 24683 => 22191, 24684 => 22228, + 24685 => 22231, 24686 => 22237, 24687 => 22241, 24688 => 22261, 24689 => 22251, + 24690 => 22265, 24691 => 22271, 24692 => 22276, 24693 => 22282, 24694 => 22281, + 24695 => 22300, 24696 => 24079, 24697 => 24089, 24698 => 24084, 24699 => 24081, + 24700 => 24113, 24701 => 24123, 24702 => 24124, 24865 => 24119, 24866 => 24132, + 24867 => 24148, 24868 => 24155, 24869 => 24158, 24870 => 24161, 24871 => 23692, + 24872 => 23674, 24873 => 23693, 24874 => 23696, 24875 => 23702, 24876 => 23688, + 24877 => 23704, 24878 => 23705, 24879 => 23697, 24880 => 23706, 24881 => 23708, + 24882 => 23733, 24883 => 23714, 24884 => 23741, 24885 => 23724, 24886 => 23723, + 24887 => 23729, 24888 => 23715, 24889 => 23745, 24890 => 23735, 24891 => 23748, + 24892 => 23762, 24893 => 23780, 24894 => 23755, 24895 => 23781, 24896 => 23810, + 24897 => 23811, 24898 => 23847, 24899 => 23846, 24900 => 23854, 24901 => 23844, + 24902 => 23838, 24903 => 23814, 24904 => 23835, 24905 => 23896, 24906 => 23870, + 24907 => 23860, 24908 => 23869, 24909 => 23916, 24910 => 23899, 24911 => 23919, + 24912 => 23901, 24913 => 23915, 24914 => 23883, 24915 => 23882, 24916 => 23913, + 24917 => 23924, 24918 => 23938, 24919 => 23961, 24920 => 23965, 24921 => 35955, + 24922 => 23991, 24923 => 24005, 24924 => 24435, 24925 => 24439, 24926 => 24450, + 24927 => 24455, 24928 => 24457, 24929 => 24460, 24930 => 24469, 24931 => 24473, + 24932 => 24476, 24933 => 24488, 24934 => 24493, 24935 => 24501, 24936 => 24508, + 24937 => 34914, 24938 => 24417, 24939 => 29357, 24940 => 29360, 24941 => 29364, + 24942 => 29367, 24943 => 29368, 24944 => 29379, 24945 => 29377, 24946 => 29390, + 24947 => 29389, 24948 => 29394, 24949 => 29416, 24950 => 29423, 24951 => 29417, + 24952 => 29426, 24953 => 29428, 24954 => 29431, 24955 => 29441, 24956 => 29427, + 24957 => 29443, 24958 => 29434, 25121 => 29435, 25122 => 29463, 25123 => 29459, + 25124 => 29473, 25125 => 29450, 25126 => 29470, 25127 => 29469, 25128 => 29461, + 25129 => 29474, 25130 => 29497, 25131 => 29477, 25132 => 29484, 25133 => 29496, + 25134 => 29489, 25135 => 29520, 25136 => 29517, 25137 => 29527, 25138 => 29536, + 25139 => 29548, 25140 => 29551, 25141 => 29566, 25142 => 33307, 25143 => 22821, + 25144 => 39143, 25145 => 22820, 25146 => 22786, 25147 => 39267, 25148 => 39271, + 25149 => 39272, 25150 => 39273, 25151 => 39274, 25152 => 39275, 25153 => 39276, + 25154 => 39284, 25155 => 39287, 25156 => 39293, 25157 => 39296, 25158 => 39300, + 25159 => 39303, 25160 => 39306, 25161 => 39309, 25162 => 39312, 25163 => 39313, + 25164 => 39315, 25165 => 39316, 25166 => 39317, 25167 => 24192, 25168 => 24209, + 25169 => 24203, 25170 => 24214, 25171 => 24229, 25172 => 24224, 25173 => 24249, + 25174 => 24245, 25175 => 24254, 25176 => 24243, 25177 => 36179, 25178 => 24274, + 25179 => 24273, 25180 => 24283, 25181 => 24296, 25182 => 24298, 25183 => 33210, + 25184 => 24516, 25185 => 24521, 25186 => 24534, 25187 => 24527, 25188 => 24579, + 25189 => 24558, 25190 => 24580, 25191 => 24545, 25192 => 24548, 25193 => 24574, + 25194 => 24581, 25195 => 24582, 25196 => 24554, 25197 => 24557, 25198 => 24568, + 25199 => 24601, 25200 => 24629, 25201 => 24614, 25202 => 24603, 25203 => 24591, + 25204 => 24589, 25205 => 24617, 25206 => 24619, 25207 => 24586, 25208 => 24639, + 25209 => 24609, 25210 => 24696, 25211 => 24697, 25212 => 24699, 25213 => 24698, + 25214 => 24642, 25377 => 24682, 25378 => 24701, 25379 => 24726, 25380 => 24730, + 25381 => 24749, 25382 => 24733, 25383 => 24707, 25384 => 24722, 25385 => 24716, + 25386 => 24731, 25387 => 24812, 25388 => 24763, 25389 => 24753, 25390 => 24797, + 25391 => 24792, 25392 => 24774, 25393 => 24794, 25394 => 24756, 25395 => 24864, + 25396 => 24870, 25397 => 24853, 25398 => 24867, 25399 => 24820, 25400 => 24832, + 25401 => 24846, 25402 => 24875, 25403 => 24906, 25404 => 24949, 25405 => 25004, + 25406 => 24980, 25407 => 24999, 25408 => 25015, 25409 => 25044, 25410 => 25077, + 25411 => 24541, 25412 => 38579, 25413 => 38377, 25414 => 38379, 25415 => 38385, + 25416 => 38387, 25417 => 38389, 25418 => 38390, 25419 => 38396, 25420 => 38398, + 25421 => 38403, 25422 => 38404, 25423 => 38406, 25424 => 38408, 25425 => 38410, + 25426 => 38411, 25427 => 38412, 25428 => 38413, 25429 => 38415, 25430 => 38418, + 25431 => 38421, 25432 => 38422, 25433 => 38423, 25434 => 38425, 25435 => 38426, + 25436 => 20012, 25437 => 29247, 25438 => 25109, 25439 => 27701, 25440 => 27732, + 25441 => 27740, 25442 => 27722, 25443 => 27811, 25444 => 27781, 25445 => 27792, + 25446 => 27796, 25447 => 27788, 25448 => 27752, 25449 => 27753, 25450 => 27764, + 25451 => 27766, 25452 => 27782, 25453 => 27817, 25454 => 27856, 25455 => 27860, + 25456 => 27821, 25457 => 27895, 25458 => 27896, 25459 => 27889, 25460 => 27863, + 25461 => 27826, 25462 => 27872, 25463 => 27862, 25464 => 27898, 25465 => 27883, + 25466 => 27886, 25467 => 27825, 25468 => 27859, 25469 => 27887, 25470 => 27902, + 25633 => 27961, 25634 => 27943, 25635 => 27916, 25636 => 27971, 25637 => 27976, + 25638 => 27911, 25639 => 27908, 25640 => 27929, 25641 => 27918, 25642 => 27947, + 25643 => 27981, 25644 => 27950, 25645 => 27957, 25646 => 27930, 25647 => 27983, + 25648 => 27986, 25649 => 27988, 25650 => 27955, 25651 => 28049, 25652 => 28015, + 25653 => 28062, 25654 => 28064, 25655 => 27998, 25656 => 28051, 25657 => 28052, + 25658 => 27996, 25659 => 28000, 25660 => 28028, 25661 => 28003, 25662 => 28186, + 25663 => 28103, 25664 => 28101, 25665 => 28126, 25666 => 28174, 25667 => 28095, + 25668 => 28128, 25669 => 28177, 25670 => 28134, 25671 => 28125, 25672 => 28121, + 25673 => 28182, 25674 => 28075, 25675 => 28172, 25676 => 28078, 25677 => 28203, + 25678 => 28270, 25679 => 28238, 25680 => 28267, 25681 => 28338, 25682 => 28255, + 25683 => 28294, 25684 => 28243, 25685 => 28244, 25686 => 28210, 25687 => 28197, + 25688 => 28228, 25689 => 28383, 25690 => 28337, 25691 => 28312, 25692 => 28384, + 25693 => 28461, 25694 => 28386, 25695 => 28325, 25696 => 28327, 25697 => 28349, + 25698 => 28347, 25699 => 28343, 25700 => 28375, 25701 => 28340, 25702 => 28367, + 25703 => 28303, 25704 => 28354, 25705 => 28319, 25706 => 28514, 25707 => 28486, + 25708 => 28487, 25709 => 28452, 25710 => 28437, 25711 => 28409, 25712 => 28463, + 25713 => 28470, 25714 => 28491, 25715 => 28532, 25716 => 28458, 25717 => 28425, + 25718 => 28457, 25719 => 28553, 25720 => 28557, 25721 => 28556, 25722 => 28536, + 25723 => 28530, 25724 => 28540, 25725 => 28538, 25726 => 28625, 25889 => 28617, + 25890 => 28583, 25891 => 28601, 25892 => 28598, 25893 => 28610, 25894 => 28641, + 25895 => 28654, 25896 => 28638, 25897 => 28640, 25898 => 28655, 25899 => 28698, + 25900 => 28707, 25901 => 28699, 25902 => 28729, 25903 => 28725, 25904 => 28751, + 25905 => 28766, 25906 => 23424, 25907 => 23428, 25908 => 23445, 25909 => 23443, + 25910 => 23461, 25911 => 23480, 25912 => 29999, 25913 => 39582, 25914 => 25652, + 25915 => 23524, 25916 => 23534, 25917 => 35120, 25918 => 23536, 25919 => 36423, + 25920 => 35591, 25921 => 36790, 25922 => 36819, 25923 => 36821, 25924 => 36837, + 25925 => 36846, 25926 => 36836, 25927 => 36841, 25928 => 36838, 25929 => 36851, + 25930 => 36840, 25931 => 36869, 25932 => 36868, 25933 => 36875, 25934 => 36902, + 25935 => 36881, 25936 => 36877, 25937 => 36886, 25938 => 36897, 25939 => 36917, + 25940 => 36918, 25941 => 36909, 25942 => 36911, 25943 => 36932, 25944 => 36945, + 25945 => 36946, 25946 => 36944, 25947 => 36968, 25948 => 36952, 25949 => 36962, + 25950 => 36955, 25951 => 26297, 25952 => 36980, 25953 => 36989, 25954 => 36994, + 25955 => 37000, 25956 => 36995, 25957 => 37003, 25958 => 24400, 25959 => 24407, + 25960 => 24406, 25961 => 24408, 25962 => 23611, 25963 => 21675, 25964 => 23632, + 25965 => 23641, 25966 => 23409, 25967 => 23651, 25968 => 23654, 25969 => 32700, + 25970 => 24362, 25971 => 24361, 25972 => 24365, 25973 => 33396, 25974 => 24380, + 25975 => 39739, 25976 => 23662, 25977 => 22913, 25978 => 22915, 25979 => 22925, + 25980 => 22953, 25981 => 22954, 25982 => 22947, 26145 => 22935, 26146 => 22986, + 26147 => 22955, 26148 => 22942, 26149 => 22948, 26150 => 22994, 26151 => 22962, + 26152 => 22959, 26153 => 22999, 26154 => 22974, 26155 => 23045, 26156 => 23046, + 26157 => 23005, 26158 => 23048, 26159 => 23011, 26160 => 23000, 26161 => 23033, + 26162 => 23052, 26163 => 23049, 26164 => 23090, 26165 => 23092, 26166 => 23057, + 26167 => 23075, 26168 => 23059, 26169 => 23104, 26170 => 23143, 26171 => 23114, + 26172 => 23125, 26173 => 23100, 26174 => 23138, 26175 => 23157, 26176 => 33004, + 26177 => 23210, 26178 => 23195, 26179 => 23159, 26180 => 23162, 26181 => 23230, + 26182 => 23275, 26183 => 23218, 26184 => 23250, 26185 => 23252, 26186 => 23224, + 26187 => 23264, 26188 => 23267, 26189 => 23281, 26190 => 23254, 26191 => 23270, + 26192 => 23256, 26193 => 23260, 26194 => 23305, 26195 => 23319, 26196 => 23318, + 26197 => 23346, 26198 => 23351, 26199 => 23360, 26200 => 23573, 26201 => 23580, + 26202 => 23386, 26203 => 23397, 26204 => 23411, 26205 => 23377, 26206 => 23379, + 26207 => 23394, 26208 => 39541, 26209 => 39543, 26210 => 39544, 26211 => 39546, + 26212 => 39551, 26213 => 39549, 26214 => 39552, 26215 => 39553, 26216 => 39557, + 26217 => 39560, 26218 => 39562, 26219 => 39568, 26220 => 39570, 26221 => 39571, + 26222 => 39574, 26223 => 39576, 26224 => 39579, 26225 => 39580, 26226 => 39581, + 26227 => 39583, 26228 => 39584, 26229 => 39586, 26230 => 39587, 26231 => 39589, + 26232 => 39591, 26233 => 32415, 26234 => 32417, 26235 => 32419, 26236 => 32421, + 26237 => 32424, 26238 => 32425, 26401 => 32429, 26402 => 32432, 26403 => 32446, + 26404 => 32448, 26405 => 32449, 26406 => 32450, 26407 => 32457, 26408 => 32459, + 26409 => 32460, 26410 => 32464, 26411 => 32468, 26412 => 32471, 26413 => 32475, + 26414 => 32480, 26415 => 32481, 26416 => 32488, 26417 => 32491, 26418 => 32494, + 26419 => 32495, 26420 => 32497, 26421 => 32498, 26422 => 32525, 26423 => 32502, + 26424 => 32506, 26425 => 32507, 26426 => 32510, 26427 => 32513, 26428 => 32514, + 26429 => 32515, 26430 => 32519, 26431 => 32520, 26432 => 32523, 26433 => 32524, + 26434 => 32527, 26435 => 32529, 26436 => 32530, 26437 => 32535, 26438 => 32537, + 26439 => 32540, 26440 => 32539, 26441 => 32543, 26442 => 32545, 26443 => 32546, + 26444 => 32547, 26445 => 32548, 26446 => 32549, 26447 => 32550, 26448 => 32551, + 26449 => 32554, 26450 => 32555, 26451 => 32556, 26452 => 32557, 26453 => 32559, + 26454 => 32560, 26455 => 32561, 26456 => 32562, 26457 => 32563, 26458 => 32565, + 26459 => 24186, 26460 => 30079, 26461 => 24027, 26462 => 30014, 26463 => 37013, + 26464 => 29582, 26465 => 29585, 26466 => 29614, 26467 => 29602, 26468 => 29599, + 26469 => 29647, 26470 => 29634, 26471 => 29649, 26472 => 29623, 26473 => 29619, + 26474 => 29632, 26475 => 29641, 26476 => 29640, 26477 => 29669, 26478 => 29657, + 26479 => 39036, 26480 => 29706, 26481 => 29673, 26482 => 29671, 26483 => 29662, + 26484 => 29626, 26485 => 29682, 26486 => 29711, 26487 => 29738, 26488 => 29787, + 26489 => 29734, 26490 => 29733, 26491 => 29736, 26492 => 29744, 26493 => 29742, + 26494 => 29740, 26657 => 29723, 26658 => 29722, 26659 => 29761, 26660 => 29788, + 26661 => 29783, 26662 => 29781, 26663 => 29785, 26664 => 29815, 26665 => 29805, + 26666 => 29822, 26667 => 29852, 26668 => 29838, 26669 => 29824, 26670 => 29825, + 26671 => 29831, 26672 => 29835, 26673 => 29854, 26674 => 29864, 26675 => 29865, + 26676 => 29840, 26677 => 29863, 26678 => 29906, 26679 => 29882, 26680 => 38890, + 26681 => 38891, 26682 => 38892, 26683 => 26444, 26684 => 26451, 26685 => 26462, + 26686 => 26440, 26687 => 26473, 26688 => 26533, 26689 => 26503, 26690 => 26474, + 26691 => 26483, 26692 => 26520, 26693 => 26535, 26694 => 26485, 26695 => 26536, + 26696 => 26526, 26697 => 26541, 26698 => 26507, 26699 => 26487, 26700 => 26492, + 26701 => 26608, 26702 => 26633, 26703 => 26584, 26704 => 26634, 26705 => 26601, + 26706 => 26544, 26707 => 26636, 26708 => 26585, 26709 => 26549, 26710 => 26586, + 26711 => 26547, 26712 => 26589, 26713 => 26624, 26714 => 26563, 26715 => 26552, + 26716 => 26594, 26717 => 26638, 26718 => 26561, 26719 => 26621, 26720 => 26674, + 26721 => 26675, 26722 => 26720, 26723 => 26721, 26724 => 26702, 26725 => 26722, + 26726 => 26692, 26727 => 26724, 26728 => 26755, 26729 => 26653, 26730 => 26709, + 26731 => 26726, 26732 => 26689, 26733 => 26727, 26734 => 26688, 26735 => 26686, + 26736 => 26698, 26737 => 26697, 26738 => 26665, 26739 => 26805, 26740 => 26767, + 26741 => 26740, 26742 => 26743, 26743 => 26771, 26744 => 26731, 26745 => 26818, + 26746 => 26990, 26747 => 26876, 26748 => 26911, 26749 => 26912, 26750 => 26873, + 26913 => 26916, 26914 => 26864, 26915 => 26891, 26916 => 26881, 26917 => 26967, + 26918 => 26851, 26919 => 26896, 26920 => 26993, 26921 => 26937, 26922 => 26976, + 26923 => 26946, 26924 => 26973, 26925 => 27012, 26926 => 26987, 26927 => 27008, + 26928 => 27032, 26929 => 27000, 26930 => 26932, 26931 => 27084, 26932 => 27015, + 26933 => 27016, 26934 => 27086, 26935 => 27017, 26936 => 26982, 26937 => 26979, + 26938 => 27001, 26939 => 27035, 26940 => 27047, 26941 => 27067, 26942 => 27051, + 26943 => 27053, 26944 => 27092, 26945 => 27057, 26946 => 27073, 26947 => 27082, + 26948 => 27103, 26949 => 27029, 26950 => 27104, 26951 => 27021, 26952 => 27135, + 26953 => 27183, 26954 => 27117, 26955 => 27159, 26956 => 27160, 26957 => 27237, + 26958 => 27122, 26959 => 27204, 26960 => 27198, 26961 => 27296, 26962 => 27216, + 26963 => 27227, 26964 => 27189, 26965 => 27278, 26966 => 27257, 26967 => 27197, + 26968 => 27176, 26969 => 27224, 26970 => 27260, 26971 => 27281, 26972 => 27280, + 26973 => 27305, 26974 => 27287, 26975 => 27307, 26976 => 29495, 26977 => 29522, + 26978 => 27521, 26979 => 27522, 26980 => 27527, 26981 => 27524, 26982 => 27538, + 26983 => 27539, 26984 => 27533, 26985 => 27546, 26986 => 27547, 26987 => 27553, + 26988 => 27562, 26989 => 36715, 26990 => 36717, 26991 => 36721, 26992 => 36722, + 26993 => 36723, 26994 => 36725, 26995 => 36726, 26996 => 36728, 26997 => 36727, + 26998 => 36729, 26999 => 36730, 27000 => 36732, 27001 => 36734, 27002 => 36737, + 27003 => 36738, 27004 => 36740, 27005 => 36743, 27006 => 36747, 27169 => 36749, + 27170 => 36750, 27171 => 36751, 27172 => 36760, 27173 => 36762, 27174 => 36558, + 27175 => 25099, 27176 => 25111, 27177 => 25115, 27178 => 25119, 27179 => 25122, + 27180 => 25121, 27181 => 25125, 27182 => 25124, 27183 => 25132, 27184 => 33255, + 27185 => 29935, 27186 => 29940, 27187 => 29951, 27188 => 29967, 27189 => 29969, + 27190 => 29971, 27191 => 25908, 27192 => 26094, 27193 => 26095, 27194 => 26096, + 27195 => 26122, 27196 => 26137, 27197 => 26482, 27198 => 26115, 27199 => 26133, + 27200 => 26112, 27201 => 28805, 27202 => 26359, 27203 => 26141, 27204 => 26164, + 27205 => 26161, 27206 => 26166, 27207 => 26165, 27208 => 32774, 27209 => 26207, + 27210 => 26196, 27211 => 26177, 27212 => 26191, 27213 => 26198, 27214 => 26209, + 27215 => 26199, 27216 => 26231, 27217 => 26244, 27218 => 26252, 27219 => 26279, + 27220 => 26269, 27221 => 26302, 27222 => 26331, 27223 => 26332, 27224 => 26342, + 27225 => 26345, 27226 => 36146, 27227 => 36147, 27228 => 36150, 27229 => 36155, + 27230 => 36157, 27231 => 36160, 27232 => 36165, 27233 => 36166, 27234 => 36168, + 27235 => 36169, 27236 => 36167, 27237 => 36173, 27238 => 36181, 27239 => 36185, + 27240 => 35271, 27241 => 35274, 27242 => 35275, 27243 => 35276, 27244 => 35278, + 27245 => 35279, 27246 => 35280, 27247 => 35281, 27248 => 29294, 27249 => 29343, + 27250 => 29277, 27251 => 29286, 27252 => 29295, 27253 => 29310, 27254 => 29311, + 27255 => 29316, 27256 => 29323, 27257 => 29325, 27258 => 29327, 27259 => 29330, + 27260 => 25352, 27261 => 25394, 27262 => 25520, 27425 => 25663, 27426 => 25816, + 27427 => 32772, 27428 => 27626, 27429 => 27635, 27430 => 27645, 27431 => 27637, + 27432 => 27641, 27433 => 27653, 27434 => 27655, 27435 => 27654, 27436 => 27661, + 27437 => 27669, 27438 => 27672, 27439 => 27673, 27440 => 27674, 27441 => 27681, + 27442 => 27689, 27443 => 27684, 27444 => 27690, 27445 => 27698, 27446 => 25909, + 27447 => 25941, 27448 => 25963, 27449 => 29261, 27450 => 29266, 27451 => 29270, + 27452 => 29232, 27453 => 34402, 27454 => 21014, 27455 => 32927, 27456 => 32924, + 27457 => 32915, 27458 => 32956, 27459 => 26378, 27460 => 32957, 27461 => 32945, + 27462 => 32939, 27463 => 32941, 27464 => 32948, 27465 => 32951, 27466 => 32999, + 27467 => 33000, 27468 => 33001, 27469 => 33002, 27470 => 32987, 27471 => 32962, + 27472 => 32964, 27473 => 32985, 27474 => 32973, 27475 => 32983, 27476 => 26384, + 27477 => 32989, 27478 => 33003, 27479 => 33009, 27480 => 33012, 27481 => 33005, + 27482 => 33037, 27483 => 33038, 27484 => 33010, 27485 => 33020, 27486 => 26389, + 27487 => 33042, 27488 => 35930, 27489 => 33078, 27490 => 33054, 27491 => 33068, + 27492 => 33048, 27493 => 33074, 27494 => 33096, 27495 => 33100, 27496 => 33107, + 27497 => 33140, 27498 => 33113, 27499 => 33114, 27500 => 33137, 27501 => 33120, + 27502 => 33129, 27503 => 33148, 27504 => 33149, 27505 => 33133, 27506 => 33127, + 27507 => 22605, 27508 => 23221, 27509 => 33160, 27510 => 33154, 27511 => 33169, + 27512 => 28373, 27513 => 33187, 27514 => 33194, 27515 => 33228, 27516 => 26406, + 27517 => 33226, 27518 => 33211, 27681 => 33217, 27682 => 33190, 27683 => 27428, + 27684 => 27447, 27685 => 27449, 27686 => 27459, 27687 => 27462, 27688 => 27481, + 27689 => 39121, 27690 => 39122, 27691 => 39123, 27692 => 39125, 27693 => 39129, + 27694 => 39130, 27695 => 27571, 27696 => 24384, 27697 => 27586, 27698 => 35315, + 27699 => 26000, 27700 => 40785, 27701 => 26003, 27702 => 26044, 27703 => 26054, + 27704 => 26052, 27705 => 26051, 27706 => 26060, 27707 => 26062, 27708 => 26066, + 27709 => 26070, 27710 => 28800, 27711 => 28828, 27712 => 28822, 27713 => 28829, + 27714 => 28859, 27715 => 28864, 27716 => 28855, 27717 => 28843, 27718 => 28849, + 27719 => 28904, 27720 => 28874, 27721 => 28944, 27722 => 28947, 27723 => 28950, + 27724 => 28975, 27725 => 28977, 27726 => 29043, 27727 => 29020, 27728 => 29032, + 27729 => 28997, 27730 => 29042, 27731 => 29002, 27732 => 29048, 27733 => 29050, + 27734 => 29080, 27735 => 29107, 27736 => 29109, 27737 => 29096, 27738 => 29088, + 27739 => 29152, 27740 => 29140, 27741 => 29159, 27742 => 29177, 27743 => 29213, + 27744 => 29224, 27745 => 28780, 27746 => 28952, 27747 => 29030, 27748 => 29113, + 27749 => 25150, 27750 => 25149, 27751 => 25155, 27752 => 25160, 27753 => 25161, + 27754 => 31035, 27755 => 31040, 27756 => 31046, 27757 => 31049, 27758 => 31067, + 27759 => 31068, 27760 => 31059, 27761 => 31066, 27762 => 31074, 27763 => 31063, + 27764 => 31072, 27765 => 31087, 27766 => 31079, 27767 => 31098, 27768 => 31109, + 27769 => 31114, 27770 => 31130, 27771 => 31143, 27772 => 31155, 27773 => 24529, + 27774 => 24528, 27937 => 24636, 27938 => 24669, 27939 => 24666, 27940 => 24679, + 27941 => 24641, 27942 => 24665, 27943 => 24675, 27944 => 24747, 27945 => 24838, + 27946 => 24845, 27947 => 24925, 27948 => 25001, 27949 => 24989, 27950 => 25035, + 27951 => 25041, 27952 => 25094, 27953 => 32896, 27954 => 32895, 27955 => 27795, + 27956 => 27894, 27957 => 28156, 27958 => 30710, 27959 => 30712, 27960 => 30720, + 27961 => 30729, 27962 => 30743, 27963 => 30744, 27964 => 30737, 27965 => 26027, + 27966 => 30765, 27967 => 30748, 27968 => 30749, 27969 => 30777, 27970 => 30778, + 27971 => 30779, 27972 => 30751, 27973 => 30780, 27974 => 30757, 27975 => 30764, + 27976 => 30755, 27977 => 30761, 27978 => 30798, 27979 => 30829, 27980 => 30806, + 27981 => 30807, 27982 => 30758, 27983 => 30800, 27984 => 30791, 27985 => 30796, + 27986 => 30826, 27987 => 30875, 27988 => 30867, 27989 => 30874, 27990 => 30855, + 27991 => 30876, 27992 => 30881, 27993 => 30883, 27994 => 30898, 27995 => 30905, + 27996 => 30885, 27997 => 30932, 27998 => 30937, 27999 => 30921, 28000 => 30956, + 28001 => 30962, 28002 => 30981, 28003 => 30964, 28004 => 30995, 28005 => 31012, + 28006 => 31006, 28007 => 31028, 28008 => 40859, 28009 => 40697, 28010 => 40699, + 28011 => 40700, 28012 => 30449, 28013 => 30468, 28014 => 30477, 28015 => 30457, + 28016 => 30471, 28017 => 30472, 28018 => 30490, 28019 => 30498, 28020 => 30489, + 28021 => 30509, 28022 => 30502, 28023 => 30517, 28024 => 30520, 28025 => 30544, + 28026 => 30545, 28027 => 30535, 28028 => 30531, 28029 => 30554, 28030 => 30568, + 28193 => 30562, 28194 => 30565, 28195 => 30591, 28196 => 30605, 28197 => 30589, + 28198 => 30592, 28199 => 30604, 28200 => 30609, 28201 => 30623, 28202 => 30624, + 28203 => 30640, 28204 => 30645, 28205 => 30653, 28206 => 30010, 28207 => 30016, + 28208 => 30030, 28209 => 30027, 28210 => 30024, 28211 => 30043, 28212 => 30066, + 28213 => 30073, 28214 => 30083, 28215 => 32600, 28216 => 32609, 28217 => 32607, + 28218 => 35400, 28219 => 32616, 28220 => 32628, 28221 => 32625, 28222 => 32633, + 28223 => 32641, 28224 => 32638, 28225 => 30413, 28226 => 30437, 28227 => 34866, + 28228 => 38021, 28229 => 38022, 28230 => 38023, 28231 => 38027, 28232 => 38026, + 28233 => 38028, 28234 => 38029, 28235 => 38031, 28236 => 38032, 28237 => 38036, + 28238 => 38039, 28239 => 38037, 28240 => 38042, 28241 => 38043, 28242 => 38044, + 28243 => 38051, 28244 => 38052, 28245 => 38059, 28246 => 38058, 28247 => 38061, + 28248 => 38060, 28249 => 38063, 28250 => 38064, 28251 => 38066, 28252 => 38068, + 28253 => 38070, 28254 => 38071, 28255 => 38072, 28256 => 38073, 28257 => 38074, + 28258 => 38076, 28259 => 38077, 28260 => 38079, 28261 => 38084, 28262 => 38088, + 28263 => 38089, 28264 => 38090, 28265 => 38091, 28266 => 38092, 28267 => 38093, + 28268 => 38094, 28269 => 38096, 28270 => 38097, 28271 => 38098, 28272 => 38101, + 28273 => 38102, 28274 => 38103, 28275 => 38105, 28276 => 38104, 28277 => 38107, + 28278 => 38110, 28279 => 38111, 28280 => 38112, 28281 => 38114, 28282 => 38116, + 28283 => 38117, 28284 => 38119, 28285 => 38120, 28286 => 38122, 28449 => 38121, + 28450 => 38123, 28451 => 38126, 28452 => 38127, 28453 => 38131, 28454 => 38132, + 28455 => 38133, 28456 => 38135, 28457 => 38137, 28458 => 38140, 28459 => 38141, + 28460 => 38143, 28461 => 38147, 28462 => 38146, 28463 => 38150, 28464 => 38151, + 28465 => 38153, 28466 => 38154, 28467 => 38157, 28468 => 38158, 28469 => 38159, + 28470 => 38162, 28471 => 38163, 28472 => 38164, 28473 => 38165, 28474 => 38166, + 28475 => 38168, 28476 => 38171, 28477 => 38173, 28478 => 38174, 28479 => 38175, + 28480 => 38178, 28481 => 38186, 28482 => 38187, 28483 => 38185, 28484 => 38188, + 28485 => 38193, 28486 => 38194, 28487 => 38196, 28488 => 38198, 28489 => 38199, + 28490 => 38200, 28491 => 38204, 28492 => 38206, 28493 => 38207, 28494 => 38210, + 28495 => 38197, 28496 => 38212, 28497 => 38213, 28498 => 38214, 28499 => 38217, + 28500 => 38220, 28501 => 38222, 28502 => 38223, 28503 => 38226, 28504 => 38227, + 28505 => 38228, 28506 => 38230, 28507 => 38231, 28508 => 38232, 28509 => 38233, + 28510 => 38235, 28511 => 38238, 28512 => 38239, 28513 => 38237, 28514 => 38241, + 28515 => 38242, 28516 => 38244, 28517 => 38245, 28518 => 38246, 28519 => 38247, + 28520 => 38248, 28521 => 38249, 28522 => 38250, 28523 => 38251, 28524 => 38252, + 28525 => 38255, 28526 => 38257, 28527 => 38258, 28528 => 38259, 28529 => 38202, + 28530 => 30695, 28531 => 30700, 28532 => 38601, 28533 => 31189, 28534 => 31213, + 28535 => 31203, 28536 => 31211, 28537 => 31238, 28538 => 23879, 28539 => 31235, + 28540 => 31234, 28541 => 31262, 28542 => 31252, 28705 => 31289, 28706 => 31287, + 28707 => 31313, 28708 => 40655, 28709 => 39333, 28710 => 31344, 28711 => 30344, + 28712 => 30350, 28713 => 30355, 28714 => 30361, 28715 => 30372, 28716 => 29918, + 28717 => 29920, 28718 => 29996, 28719 => 40480, 28720 => 40482, 28721 => 40488, + 28722 => 40489, 28723 => 40490, 28724 => 40491, 28725 => 40492, 28726 => 40498, + 28727 => 40497, 28728 => 40502, 28729 => 40504, 28730 => 40503, 28731 => 40505, + 28732 => 40506, 28733 => 40510, 28734 => 40513, 28735 => 40514, 28736 => 40516, + 28737 => 40518, 28738 => 40519, 28739 => 40520, 28740 => 40521, 28741 => 40523, + 28742 => 40524, 28743 => 40526, 28744 => 40529, 28745 => 40533, 28746 => 40535, + 28747 => 40538, 28748 => 40539, 28749 => 40540, 28750 => 40542, 28751 => 40547, + 28752 => 40550, 28753 => 40551, 28754 => 40552, 28755 => 40553, 28756 => 40554, + 28757 => 40555, 28758 => 40556, 28759 => 40561, 28760 => 40557, 28761 => 40563, + 28762 => 30098, 28763 => 30100, 28764 => 30102, 28765 => 30112, 28766 => 30109, + 28767 => 30124, 28768 => 30115, 28769 => 30131, 28770 => 30132, 28771 => 30136, + 28772 => 30148, 28773 => 30129, 28774 => 30128, 28775 => 30147, 28776 => 30146, + 28777 => 30166, 28778 => 30157, 28779 => 30179, 28780 => 30184, 28781 => 30182, + 28782 => 30180, 28783 => 30187, 28784 => 30183, 28785 => 30211, 28786 => 30193, + 28787 => 30204, 28788 => 30207, 28789 => 30224, 28790 => 30208, 28791 => 30213, + 28792 => 30220, 28793 => 30231, 28794 => 30218, 28795 => 30245, 28796 => 30232, + 28797 => 30229, 28798 => 30233, 28961 => 30235, 28962 => 30268, 28963 => 30242, + 28964 => 30240, 28965 => 30272, 28966 => 30253, 28967 => 30256, 28968 => 30271, + 28969 => 30261, 28970 => 30275, 28971 => 30270, 28972 => 30259, 28973 => 30285, + 28974 => 30302, 28975 => 30292, 28976 => 30300, 28977 => 30294, 28978 => 30315, + 28979 => 30319, 28980 => 32714, 28981 => 31462, 28982 => 31352, 28983 => 31353, + 28984 => 31360, 28985 => 31366, 28986 => 31368, 28987 => 31381, 28988 => 31398, + 28989 => 31392, 28990 => 31404, 28991 => 31400, 28992 => 31405, 28993 => 31411, + 28994 => 34916, 28995 => 34921, 28996 => 34930, 28997 => 34941, 28998 => 34943, + 28999 => 34946, 29000 => 34978, 29001 => 35014, 29002 => 34999, 29003 => 35004, + 29004 => 35017, 29005 => 35042, 29006 => 35022, 29007 => 35043, 29008 => 35045, + 29009 => 35057, 29010 => 35098, 29011 => 35068, 29012 => 35048, 29013 => 35070, + 29014 => 35056, 29015 => 35105, 29016 => 35097, 29017 => 35091, 29018 => 35099, + 29019 => 35082, 29020 => 35124, 29021 => 35115, 29022 => 35126, 29023 => 35137, + 29024 => 35174, 29025 => 35195, 29026 => 30091, 29027 => 32997, 29028 => 30386, + 29029 => 30388, 29030 => 30684, 29031 => 32786, 29032 => 32788, 29033 => 32790, + 29034 => 32796, 29035 => 32800, 29036 => 32802, 29037 => 32805, 29038 => 32806, + 29039 => 32807, 29040 => 32809, 29041 => 32808, 29042 => 32817, 29043 => 32779, + 29044 => 32821, 29045 => 32835, 29046 => 32838, 29047 => 32845, 29048 => 32850, + 29049 => 32873, 29050 => 32881, 29051 => 35203, 29052 => 39032, 29053 => 39040, + 29054 => 39043, 29217 => 39049, 29218 => 39052, 29219 => 39053, 29220 => 39055, + 29221 => 39060, 29222 => 39066, 29223 => 39067, 29224 => 39070, 29225 => 39071, + 29226 => 39073, 29227 => 39074, 29228 => 39077, 29229 => 39078, 29230 => 34381, + 29231 => 34388, 29232 => 34412, 29233 => 34414, 29234 => 34431, 29235 => 34426, + 29236 => 34428, 29237 => 34427, 29238 => 34472, 29239 => 34445, 29240 => 34443, + 29241 => 34476, 29242 => 34461, 29243 => 34471, 29244 => 34467, 29245 => 34474, + 29246 => 34451, 29247 => 34473, 29248 => 34486, 29249 => 34500, 29250 => 34485, + 29251 => 34510, 29252 => 34480, 29253 => 34490, 29254 => 34481, 29255 => 34479, + 29256 => 34505, 29257 => 34511, 29258 => 34484, 29259 => 34537, 29260 => 34545, + 29261 => 34546, 29262 => 34541, 29263 => 34547, 29264 => 34512, 29265 => 34579, + 29266 => 34526, 29267 => 34548, 29268 => 34527, 29269 => 34520, 29270 => 34513, + 29271 => 34563, 29272 => 34567, 29273 => 34552, 29274 => 34568, 29275 => 34570, + 29276 => 34573, 29277 => 34569, 29278 => 34595, 29279 => 34619, 29280 => 34590, + 29281 => 34597, 29282 => 34606, 29283 => 34586, 29284 => 34622, 29285 => 34632, + 29286 => 34612, 29287 => 34609, 29288 => 34601, 29289 => 34615, 29290 => 34623, + 29291 => 34690, 29292 => 34594, 29293 => 34685, 29294 => 34686, 29295 => 34683, + 29296 => 34656, 29297 => 34672, 29298 => 34636, 29299 => 34670, 29300 => 34699, + 29301 => 34643, 29302 => 34659, 29303 => 34684, 29304 => 34660, 29305 => 34649, + 29306 => 34661, 29307 => 34707, 29308 => 34735, 29309 => 34728, 29310 => 34770, + 29473 => 34758, 29474 => 34696, 29475 => 34693, 29476 => 34733, 29477 => 34711, + 29478 => 34691, 29479 => 34731, 29480 => 34789, 29481 => 34732, 29482 => 34741, + 29483 => 34739, 29484 => 34763, 29485 => 34771, 29486 => 34749, 29487 => 34769, + 29488 => 34752, 29489 => 34762, 29490 => 34779, 29491 => 34794, 29492 => 34784, + 29493 => 34798, 29494 => 34838, 29495 => 34835, 29496 => 34814, 29497 => 34826, + 29498 => 34843, 29499 => 34849, 29500 => 34873, 29501 => 34876, 29502 => 32566, + 29503 => 32578, 29504 => 32580, 29505 => 32581, 29506 => 33296, 29507 => 31482, + 29508 => 31485, 29509 => 31496, 29510 => 31491, 29511 => 31492, 29512 => 31509, + 29513 => 31498, 29514 => 31531, 29515 => 31503, 29516 => 31559, 29517 => 31544, + 29518 => 31530, 29519 => 31513, 29520 => 31534, 29521 => 31537, 29522 => 31520, + 29523 => 31525, 29524 => 31524, 29525 => 31539, 29526 => 31550, 29527 => 31518, + 29528 => 31576, 29529 => 31578, 29530 => 31557, 29531 => 31605, 29532 => 31564, + 29533 => 31581, 29534 => 31584, 29535 => 31598, 29536 => 31611, 29537 => 31586, + 29538 => 31602, 29539 => 31601, 29540 => 31632, 29541 => 31654, 29542 => 31655, + 29543 => 31672, 29544 => 31660, 29545 => 31645, 29546 => 31656, 29547 => 31621, + 29548 => 31658, 29549 => 31644, 29550 => 31650, 29551 => 31659, 29552 => 31668, + 29553 => 31697, 29554 => 31681, 29555 => 31692, 29556 => 31709, 29557 => 31706, + 29558 => 31717, 29559 => 31718, 29560 => 31722, 29561 => 31756, 29562 => 31742, + 29563 => 31740, 29564 => 31759, 29565 => 31766, 29566 => 31755, 29729 => 31775, + 29730 => 31786, 29731 => 31782, 29732 => 31800, 29733 => 31809, 29734 => 31808, + 29735 => 33278, 29736 => 33281, 29737 => 33282, 29738 => 33284, 29739 => 33260, + 29740 => 34884, 29741 => 33313, 29742 => 33314, 29743 => 33315, 29744 => 33325, + 29745 => 33327, 29746 => 33320, 29747 => 33323, 29748 => 33336, 29749 => 33339, + 29750 => 33331, 29751 => 33332, 29752 => 33342, 29753 => 33348, 29754 => 33353, + 29755 => 33355, 29756 => 33359, 29757 => 33370, 29758 => 33375, 29759 => 33384, + 29760 => 34942, 29761 => 34949, 29762 => 34952, 29763 => 35032, 29764 => 35039, + 29765 => 35166, 29766 => 32669, 29767 => 32671, 29768 => 32679, 29769 => 32687, + 29770 => 32688, 29771 => 32690, 29772 => 31868, 29773 => 25929, 29774 => 31889, + 29775 => 31901, 29776 => 31900, 29777 => 31902, 29778 => 31906, 29779 => 31922, + 29780 => 31932, 29781 => 31933, 29782 => 31937, 29783 => 31943, 29784 => 31948, + 29785 => 31949, 29786 => 31944, 29787 => 31941, 29788 => 31959, 29789 => 31976, + 29790 => 33390, 29791 => 26280, 29792 => 32703, 29793 => 32718, 29794 => 32725, + 29795 => 32741, 29796 => 32737, 29797 => 32742, 29798 => 32745, 29799 => 32750, + 29800 => 32755, 29801 => 31992, 29802 => 32119, 29803 => 32166, 29804 => 32174, + 29805 => 32327, 29806 => 32411, 29807 => 40632, 29808 => 40628, 29809 => 36211, + 29810 => 36228, 29811 => 36244, 29812 => 36241, 29813 => 36273, 29814 => 36199, + 29815 => 36205, 29816 => 35911, 29817 => 35913, 29818 => 37194, 29819 => 37200, + 29820 => 37198, 29821 => 37199, 29822 => 37220, 29985 => 37218, 29986 => 37217, + 29987 => 37232, 29988 => 37225, 29989 => 37231, 29990 => 37245, 29991 => 37246, + 29992 => 37234, 29993 => 37236, 29994 => 37241, 29995 => 37260, 29996 => 37253, + 29997 => 37264, 29998 => 37261, 29999 => 37265, 30000 => 37282, 30001 => 37283, + 30002 => 37290, 30003 => 37293, 30004 => 37294, 30005 => 37295, 30006 => 37301, + 30007 => 37300, 30008 => 37306, 30009 => 35925, 30010 => 40574, 30011 => 36280, + 30012 => 36331, 30013 => 36357, 30014 => 36441, 30015 => 36457, 30016 => 36277, + 30017 => 36287, 30018 => 36284, 30019 => 36282, 30020 => 36292, 30021 => 36310, + 30022 => 36311, 30023 => 36314, 30024 => 36318, 30025 => 36302, 30026 => 36303, + 30027 => 36315, 30028 => 36294, 30029 => 36332, 30030 => 36343, 30031 => 36344, + 30032 => 36323, 30033 => 36345, 30034 => 36347, 30035 => 36324, 30036 => 36361, + 30037 => 36349, 30038 => 36372, 30039 => 36381, 30040 => 36383, 30041 => 36396, + 30042 => 36398, 30043 => 36387, 30044 => 36399, 30045 => 36410, 30046 => 36416, + 30047 => 36409, 30048 => 36405, 30049 => 36413, 30050 => 36401, 30051 => 36425, + 30052 => 36417, 30053 => 36418, 30054 => 36433, 30055 => 36434, 30056 => 36426, + 30057 => 36464, 30058 => 36470, 30059 => 36476, 30060 => 36463, 30061 => 36468, + 30062 => 36485, 30063 => 36495, 30064 => 36500, 30065 => 36496, 30066 => 36508, + 30067 => 36510, 30068 => 35960, 30069 => 35970, 30070 => 35978, 30071 => 35973, + 30072 => 35992, 30073 => 35988, 30074 => 26011, 30075 => 35286, 30076 => 35294, + 30077 => 35290, 30078 => 35292, 30241 => 35301, 30242 => 35307, 30243 => 35311, + 30244 => 35390, 30245 => 35622, 30246 => 38739, 30247 => 38633, 30248 => 38643, + 30249 => 38639, 30250 => 38662, 30251 => 38657, 30252 => 38664, 30253 => 38671, + 30254 => 38670, 30255 => 38698, 30256 => 38701, 30257 => 38704, 30258 => 38718, + 30259 => 40832, 30260 => 40835, 30261 => 40837, 30262 => 40838, 30263 => 40839, + 30264 => 40840, 30265 => 40841, 30266 => 40842, 30267 => 40844, 30268 => 40702, + 30269 => 40715, 30270 => 40717, 30271 => 38585, 30272 => 38588, 30273 => 38589, + 30274 => 38606, 30275 => 38610, 30276 => 30655, 30277 => 38624, 30278 => 37518, + 30279 => 37550, 30280 => 37576, 30281 => 37694, 30282 => 37738, 30283 => 37834, + 30284 => 37775, 30285 => 37950, 30286 => 37995, 30287 => 40063, 30288 => 40066, + 30289 => 40069, 30290 => 40070, 30291 => 40071, 30292 => 40072, 30293 => 31267, + 30294 => 40075, 30295 => 40078, 30296 => 40080, 30297 => 40081, 30298 => 40082, + 30299 => 40084, 30300 => 40085, 30301 => 40090, 30302 => 40091, 30303 => 40094, + 30304 => 40095, 30305 => 40096, 30306 => 40097, 30307 => 40098, 30308 => 40099, + 30309 => 40101, 30310 => 40102, 30311 => 40103, 30312 => 40104, 30313 => 40105, + 30314 => 40107, 30315 => 40109, 30316 => 40110, 30317 => 40112, 30318 => 40113, + 30319 => 40114, 30320 => 40115, 30321 => 40116, 30322 => 40117, 30323 => 40118, + 30324 => 40119, 30325 => 40122, 30326 => 40123, 30327 => 40124, 30328 => 40125, + 30329 => 40132, 30330 => 40133, 30331 => 40134, 30332 => 40135, 30333 => 40138, + 30334 => 40139, 30497 => 40140, 30498 => 40141, 30499 => 40142, 30500 => 40143, + 30501 => 40144, 30502 => 40147, 30503 => 40148, 30504 => 40149, 30505 => 40151, + 30506 => 40152, 30507 => 40153, 30508 => 40156, 30509 => 40157, 30510 => 40159, + 30511 => 40162, 30512 => 38780, 30513 => 38789, 30514 => 38801, 30515 => 38802, + 30516 => 38804, 30517 => 38831, 30518 => 38827, 30519 => 38819, 30520 => 38834, + 30521 => 38836, 30522 => 39601, 30523 => 39600, 30524 => 39607, 30525 => 40536, + 30526 => 39606, 30527 => 39610, 30528 => 39612, 30529 => 39617, 30530 => 39616, + 30531 => 39621, 30532 => 39618, 30533 => 39627, 30534 => 39628, 30535 => 39633, + 30536 => 39749, 30537 => 39747, 30538 => 39751, 30539 => 39753, 30540 => 39752, + 30541 => 39757, 30542 => 39761, 30543 => 39144, 30544 => 39181, 30545 => 39214, + 30546 => 39253, 30547 => 39252, 30548 => 39647, 30549 => 39649, 30550 => 39654, + 30551 => 39663, 30552 => 39659, 30553 => 39675, 30554 => 39661, 30555 => 39673, + 30556 => 39688, 30557 => 39695, 30558 => 39699, 30559 => 39711, 30560 => 39715, + 30561 => 40637, 30562 => 40638, 30563 => 32315, 30564 => 40578, 30565 => 40583, + 30566 => 40584, 30567 => 40587, 30568 => 40594, 30569 => 37846, 30570 => 40605, + 30571 => 40607, 30572 => 40667, 30573 => 40668, 30574 => 40669, 30575 => 40672, + 30576 => 40671, 30577 => 40674, 30578 => 40681, 30579 => 40679, 30580 => 40677, + 30581 => 40682, 30582 => 40687, 30583 => 40738, 30584 => 40748, 30585 => 40751, + 30586 => 40761, 30587 => 40759, 30588 => 40765, 30589 => 40766, 30590 => 40772, + 0 => 0 ); function gb2utf8($gb) { - if( !trim($gb) ) return $gb; - $utf8=''; - while($gb) { - if( ord(substr($gb,0,1)) > 127 ) { - $t=substr($gb,0,2); - $gb=substr($gb,2); - $utf8 .= $this->u2utf8($this->codetable[hexdec(bin2hex($t))-0x8080]); - } - else { - $t=substr($gb,0,1); - $gb=substr($gb,1); - $utf8 .= $this->u2utf8($t); - } - } - return $utf8; - } - - function u2utf8($c) { - $str=''; - if ($c < 0x80) { - $str.=$c; - } - else if ($c < 0x800) { - $str.=chr(0xC0 | $c>>6); - $str.=chr(0x80 | $c & 0x3F); - } - else if ($c < 0x10000) { - $str.=chr(0xE0 | $c>>12); - $str.=chr(0x80 | $c>>6 & 0x3F); - $str.=chr(0x80 | $c & 0x3F); - } - else if ($c < 0x200000) { - $str.=chr(0xF0 | $c>>18); - $str.=chr(0x80 | $c>>12 & 0x3F); - $str.=chr(0x80 | $c>>6 & 0x3F); - $str.=chr(0x80 | $c & 0x3F); - } - return $str; + if( !trim($gb) ) return $gb; + $utf8=''; + while($gb) { + if( ord(substr($gb,0,1)) > 127 ) { + $t=substr($gb,0,2); + $gb=substr($gb,2); + $utf8 .= $this->u2utf8($this->codetable[hexdec(bin2hex($t))-0x8080]); + } + else { + $t=substr($gb,0,1); + $gb=substr($gb,1); + $utf8 .= $this->u2utf8($t); + } + } + return $utf8; } -} // END Class + function u2utf8($c) { + $str=''; + if ($c < 0x80) { + $str.=$c; + } + else if ($c < 0x800) { + $str.=chr(0xC0 | $c>>6); + $str.=chr(0x80 | $c & 0x3F); + } + else if ($c < 0x10000) { + $str.=chr(0xE0 | $c>>12); + $str.=chr(0x80 | $c>>6 & 0x3F); + $str.=chr(0x80 | $c & 0x3F); + } + else if ($c < 0x200000) { + $str.=chr(0xF0 | $c>>18); + $str.=chr(0x80 | $c>>12 & 0x3F); + $str.=chr(0x80 | $c>>6 & 0x3F); + $str.=chr(0x80 | $c & 0x3F); + } + return $str; + } + +} // END Class ?> diff --git a/libs/jpgraph/jpgraph_gradient.php b/libs/jpgraph/jpgraph_gradient.php index 40a0d42..a990b9f 100644 --- a/libs/jpgraph/jpgraph_gradient.php +++ b/libs/jpgraph/jpgraph_gradient.php @@ -1,28 +1,28 @@ img = $img; + //--------------- + // CONSTRUCTOR + function __construct(&$img) { + $this->img = $img; } function SetNumColors($aNum) { - $this->numcolors=$aNum; + $this->numcolors=$aNum; } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS // Produce a gradient filled rectangle with a smooth transition between // two colors. - // ($xl,$yt) Top left corner - // ($xr,$yb) Bottom right - // $from_color Starting color in gradient - // $to_color End color in the gradient - // $style Which way is the gradient oriented? + // ($xl,$yt) Top left corner + // ($xr,$yb) Bottom right + // $from_color Starting color in gradient + // $to_color End color in the gradient + // $style Which way is the gradient oriented? function FilledRectangle($xl,$yt,$xr,$yb,$from_color,$to_color,$style=1) { - switch( $style ) { - case GRAD_VER: - $steps = ceil(abs($xr-$xl)); - $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); - for( $i=0, $x=$xl; $i < $steps; ++$i ) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yt,$x,$yb); - $x += $delta; - } - break; + $this->img->SetLineWeight(1); + switch( $style ) { + case GRAD_VER: + $steps = ceil(abs($xr-$xl)+1); + $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); + for( $i=0, $x=$xl; $i < $steps; ++$i ) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yt,$x,$yb); + $x += $delta; + } + break; - case GRAD_HOR: - $steps = ceil(abs($yb-$yt)); - $delta = $yb>=$yt ? 1 : -1; - $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); - for($i=0,$y=$yt; $i < $steps; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl,$y,$xr,$y); - $y += $delta; - } - break; + case GRAD_HOR: + $steps = ceil(abs($yb-$yt)+1); + $delta = $yb >= $yt ? 1 : -1; + $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); + for($i=0,$y=$yt; $i < $steps; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl,$y,$xr,$y); + $y += $delta; + } + break; - case GRAD_MIDHOR: - $steps = ceil(abs($yb-$yt)/2); - $delta = $yb >= $yt ? 1 : -1; - $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); - for($y=$yt, $i=0; $i < $steps; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl,$y,$xr,$y); - $y += $delta; - } - --$i; - if( abs($yb-$yt) % 2 == 1 ) --$steps; - for($j=0; $j < $steps; ++$j, --$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl,$y,$xr,$y); - $y += $delta; - } - $this->img->Line($xl,$y,$xr,$y); - break; + case GRAD_MIDHOR: + $steps = ceil(abs($yb-$yt)/2); + $delta = $yb >= $yt ? 1 : -1; + $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); + for($y=$yt, $i=0; $i < $steps; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl,$y,$xr,$y); + $y += $delta; + } + --$i; + if( abs($yb-$yt) % 2 == 1 ) { + --$steps; + } + for($j=0; $j < $steps; ++$j, --$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl,$y,$xr,$y); + $y += $delta; + } + $this->img->Line($xl,$y,$xr,$y); + break; - case GRAD_MIDVER: - $steps = ceil(abs($xr-$xl)/2); - $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); - for($x=$xl, $i=0; $i < $steps; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - --$i; - if( abs($xr-$xl) % 2 == 1 ) --$steps; - for($j=0; $j < $steps; ++$j, --$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - $this->img->Line($x,$yb,$x,$yt); - break; + case GRAD_MIDVER: + $steps = ceil(abs($xr-$xl)/2); + $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); + for($x=$xl, $i=0; $i < $steps; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + --$i; + if( abs($xr-$xl) % 2 == 1 ) { + --$steps; + } + for($j=0; $j < $steps; ++$j, --$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + $this->img->Line($x,$yb,$x,$yt); + break; - case GRAD_WIDE_MIDVER: - $diff = ceil(abs($xr-$xl)); - $steps = floor(abs($diff)/3); - $firststep = $diff - 2*$steps ; - $delta = $xr >= $xl ? 1 : -1; - $this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors); - for($x=$xl, $i=0; $i < $firststep; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - --$i; - $this->img->current_color = $colors[$i]; - for($j=0; $j< $steps; ++$j) { - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - - for($j=0; $j < $steps; ++$j, --$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - break; + case GRAD_WIDE_MIDVER: + $diff = ceil(abs($xr-$xl)); + $steps = floor(abs($diff)/3); + $firststep = $diff - 2*$steps ; + $delta = $xr >= $xl ? 1 : -1; + $this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors); + for($x=$xl, $i=0; $i < $firststep; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + --$i; + $this->img->current_color = $colors[$i]; + for($j=0; $j< $steps; ++$j) { + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } - case GRAD_WIDE_MIDHOR: - $diff = ceil(abs($yb-$yt)); - $steps = floor(abs($diff)/3); - $firststep = $diff - 2*$steps ; - $delta = $yb >= $yt? 1 : -1; - $this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors); - for($y=$yt, $i=0; $i < $firststep; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl,$y,$xr,$y); - $y += $delta; - } - --$i; - $this->img->current_color = $colors[$i]; - for($j=0; $j < $steps; ++$j) { - $this->img->Line($xl,$y,$xr,$y); - $y += $delta; - } - for($j=0; $j < $steps; ++$j, --$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl,$y,$xr,$y); - $y += $delta; - } - break; + for($j=0; $j < $steps; ++$j, --$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + break; - case GRAD_LEFT_REFLECTION: - $steps1 = ceil(0.3*abs($xr-$xl)); - $delta = $xr>=$xl ? 1 : -1; + case GRAD_WIDE_MIDHOR: + $diff = ceil(abs($yb-$yt)); + $steps = floor(abs($diff)/3); + $firststep = $diff - 2*$steps ; + $delta = $yb >= $yt? 1 : -1; + $this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors); + for($y=$yt, $i=0; $i < $firststep; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl,$y,$xr,$y); + $y += $delta; + } + --$i; + $this->img->current_color = $colors[$i]; + for($j=0; $j < $steps; ++$j) { + $this->img->Line($xl,$y,$xr,$y); + $y += $delta; + } + for($j=0; $j < $steps; ++$j, --$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl,$y,$xr,$y); + $y += $delta; + } + break; - $from_color = $this->img->rgb->Color($from_color); - $adj = 1.4; - $m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2])))); - $from_color2 = array(min(255,$from_color[0]+$m), - min(255,$from_color[1]+$m), min(255,$from_color[2]+$m)); + case GRAD_LEFT_REFLECTION: + $steps1 = ceil(0.3*abs($xr-$xl)); + $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($from_color2,$to_color,$steps1,$colors,$this->numcolors); - $n = count($colors); - for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - $steps2 = max(1,ceil(0.08*abs($xr-$xl))); - $this->img->SetColor($to_color); - for($j=0; $j< $steps2; ++$j) { - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - $steps = abs($xr-$xl)-$steps1-$steps2; - $this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors); - $n = count($colors); - for($i=0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - break; + $from_color = $this->img->rgb->Color($from_color); + $adj = 1.4; + $m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2])))); + $from_color2 = array(min(255,$from_color[0]+$m), + min(255,$from_color[1]+$m), min(255,$from_color[2]+$m)); - case GRAD_RIGHT_REFLECTION: - $steps1 = ceil(0.7*abs($xr-$xl)); - $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($from_color2,$to_color,$steps1,$colors,$this->numcolors); + $n = count($colors); + for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + $steps2 = max(1,ceil(0.08*abs($xr-$xl))); + $this->img->SetColor($to_color); + for($j=0; $j< $steps2; ++$j) { + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + $steps = abs($xr-$xl)-$steps1-$steps2; + $this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors); + $n = count($colors); + for($i=0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + break; - $this->GetColArray($from_color,$to_color,$steps1,$colors,$this->numcolors); - $n = count($colors); - for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - $steps2 = max(1,ceil(0.08*abs($xr-$xl))); - $this->img->SetColor($to_color); - for($j=0; $j< $steps2; ++$j) { - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } + case GRAD_RIGHT_REFLECTION: + $steps1 = ceil(0.7*abs($xr-$xl)); + $delta = $xr>=$xl ? 1 : -1; - $from_color = $this->img->rgb->Color($from_color); - $adj = 1.4; - $m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2])))); - $from_color = array(min(255,$from_color[0]+$m), - min(255,$from_color[1]+$m), min(255,$from_color[2]+$m)); + $this->GetColArray($from_color,$to_color,$steps1,$colors,$this->numcolors); + $n = count($colors); + for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + $steps2 = max(1,ceil(0.08*abs($xr-$xl))); + $this->img->SetColor($to_color); + for($j=0; $j< $steps2; ++$j) { + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } - $steps = abs($xr-$xl)-$steps1-$steps2; - $this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors); - $n = count($colors); - for($i=0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - break; + $from_color = $this->img->rgb->Color($from_color); + $adj = 1.4; + $m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2])))); + $from_color = array(min(255,$from_color[0]+$m), + min(255,$from_color[1]+$m), min(255,$from_color[2]+$m)); - case GRAD_CENTER: - $steps = ceil(min(($yb-$yt)+1,($xr-$xl)+1)/2); - $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); - $dx = ($xr-$xl)/2; - $dy = ($yb-$yt)/2; - $x=$xl;$y=$yt;$x2=$xr;$y2=$yb; - $n = count($colors); - for($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Rectangle($x,$y,$x2,$y2); - } - $this->img->Line($x,$y,$x2,$y2); - break; - - case GRAD_RAISED_PANEL: - // right to left - $steps1 = $xr-$xl; - $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($to_color,$from_color,$steps1,$colors,$this->numcolors); - $n = count($colors); - for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - - // left to right - $xr -= 3; - $xl += 3; - $yb -= 3; - $yt += 3; - $steps2 = $xr-$xl; - $delta = $xr>=$xl ? 1 : -1; - for($x=$xl, $j=$steps2; $j >= 0; --$j) { - $this->img->current_color = $colors[$j]; - $this->img->Line($x,$yb,$x,$yt); - $x += $delta; - } - break; + $steps = abs($xr-$xl)-$steps1-$steps2; + $this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors); + $n = count($colors); + for($i=0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + break; - case GRAD_DIAGONAL: - // use the longer dimension to determine the required number of steps. - // first loop draws from one corner to the mid-diagonal and the second - // loop draws from the mid-diagonal to the opposing corner. - if($xr-$xl > $yb - $yt) { - // width is greater than height -> use x-dimension for steps - $steps = $xr-$xl; - $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors); - $n = count($colors); + case GRAD_CENTER: + $steps = ceil(min(($yb-$yt)+1,($xr-$xl)+1)/2); + $this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors); + $dx = ($xr-$xl)/2; + $dy = ($yb-$yt)/2; + $x=$xl;$y=$yt;$x2=$xr;$y2=$yb; + $n = count($colors); + for($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Rectangle($x,$y,$x2,$y2); + } + $this->img->Line($x,$y,$x2,$y2); + break; - for($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $y = $yt+($i/$steps)*($yb-$yt)*$delta; - $this->img->Line($x,$yt,$xl,$y); - $x += $delta; - } + case GRAD_RAISED_PANEL: + // right to left + $steps1 = $xr-$xl; + $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($to_color,$from_color,$steps1,$colors,$this->numcolors); + $n = count($colors); + for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } - for($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$steps+$i]; - $y = $yt+($i/$steps)*($yb-$yt)*$delta; - $this->img->Line($x,$yb,$xr,$y); - $x += $delta; - } - } else { - // height is greater than width -> use y-dimension for steps - $steps = $yb-$yt; - $delta = $yb>=$yt ? 1 : -1; - $this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors); - $n = count($colors); - - for($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $x = $xl+($i/$steps)*($xr-$xl)*$delta; - $this->img->Line($x,$yt,$xl,$y); - $y += $delta; - } + // left to right + $xr -= 3; + $xl += 3; + $yb -= 3; + $yt += 3; + $steps2 = $xr-$xl; + $delta = $xr>=$xl ? 1 : -1; + for($x=$xl, $j=$steps2; $j >= 0; --$j) { + $this->img->current_color = $colors[$j]; + $this->img->Line($x,$yb,$x,$yt); + $x += $delta; + } + break; - for($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$steps+$i]; - $x = $xl+($i/$steps)*($xr-$xl)*$delta; - $this->img->Line($x,$yb,$xr,$y); - $x += $delta; - } + case GRAD_DIAGONAL: + // use the longer dimension to determine the required number of steps. + // first loop draws from one corner to the mid-diagonal and the second + // loop draws from the mid-diagonal to the opposing corner. + if($xr-$xl > $yb - $yt) { + // width is greater than height -> use x-dimension for steps + $steps = $xr-$xl; + $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors); + $n = count($colors); - } - break; + for($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $y = $yt+($i/$steps)*($yb-$yt)*$delta; + $this->img->Line($x,$yt,$xl,$y); + $x += $delta; + } - default: - JpGraphError::RaiseL(7001,$style); -//("Unknown gradient style (=$style)."); - break; - } + for($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$steps+$i]; + $y = $yt+($i/$steps)*($yb-$yt)*$delta; + $this->img->Line($x,$yb,$xr,$y); + $x += $delta; + } + } else { + // height is greater than width -> use y-dimension for steps + $steps = $yb-$yt; + $delta = $yb>=$yt ? 1 : -1; + $this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors); + $n = count($colors); + + for($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $x = $xl+($i/$steps)*($xr-$xl)*$delta; + $this->img->Line($x,$yt,$xl,$y); + $y += $delta; + } + + for($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$steps+$i]; + $x = $xl+($i/$steps)*($xr-$xl)*$delta; + $this->img->Line($x,$yb,$xr,$y); + $x += $delta; + } + + } + break; + + default: + JpGraphError::RaiseL(7001,$style); + //("Unknown gradient style (=$style)."); + break; + } } // Fill a special case of a polygon with a flat bottom @@ -328,96 +333,102 @@ class Gradient { // routine. It assumes that the bottom is flat (like a drawing // of a mountain) function FilledFlatPolygon($pts,$from_color,$to_color) { - if( count($pts) == 0 ) return; - - $maxy=$pts[1]; - $miny=$pts[1]; - $n = count($pts) ; - for( $i=0, $idx=0; $i < $n; $i += 2) { - $x = round($pts[$i]); - $y = round($pts[$i+1]); - $miny = min($miny,$y); - $maxy = max($maxy,$y); - } - - $colors = array(); - $this->GetColArray($from_color,$to_color,abs($maxy-$miny)+1,$colors,$this->numcolors); - for($i=$miny, $idx=0; $i <= $maxy; ++$i ) { - $colmap[$i] = $colors[$idx++]; - } + if( count($pts) == 0 ) return; - $n = count($pts)/2 ; - $idx = 0 ; - while( $idx < $n-1 ) { - $p1 = array(round($pts[$idx*2]),round($pts[$idx*2+1])); - $p2 = array(round($pts[++$idx*2]),round($pts[$idx*2+1])); - - // Find the largest rectangle we can fill - $y = max($p1[1],$p2[1]) ; - for($yy=$maxy; $yy > $y; --$yy) { - $this->img->current_color = $colmap[$yy]; - $this->img->Line($p1[0],$yy,$p2[0]-1,$yy); - } - - if( $p1[1] == $p2[1] ) continue; + $maxy=$pts[1]; + $miny=$pts[1]; + $n = count($pts) ; + for( $i=0, $idx=0; $i < $n; $i += 2) { + $x = round($pts[$i]); + $y = round($pts[$i+1]); + $miny = min($miny,$y); + $maxy = max($maxy,$y); + } - // Fill the rest using lines (slow...) - $slope = ($p2[0]-$p1[0])/($p1[1]-$p2[1]); - $x1 = $p1[0]; - $x2 = $p2[0]-1; - $start = $y; - if( $p1[1] > $p2[1] ) { - while( $y >= $p2[1] ) { - $x1=$slope*($start-$y)+$p1[0]; - $this->img->current_color = $colmap[$y]; - $this->img->Line($x1,$y,$x2,$y); - --$y; - } - } - else { - while( $y >= $p1[1] ) { - $x2=$p2[0]+$slope*($start-$y); - $this->img->current_color = $colmap[$y]; - $this->img->Line($x1,$y,$x2,$y); - --$y; - } - } - } + $colors = array(); + $this->GetColArray($from_color,$to_color,abs($maxy-$miny)+1,$colors,$this->numcolors); + for($i=$miny, $idx=0; $i <= $maxy; ++$i ) { + $colmap[$i] = $colors[$idx++]; + } + + $n = count($pts)/2 ; + $idx = 0 ; + while( $idx < $n-1 ) { + $p1 = array(round($pts[$idx*2]),round($pts[$idx*2+1])); + $p2 = array(round($pts[++$idx*2]),round($pts[$idx*2+1])); + + // Find the largest rectangle we can fill + $y = max($p1[1],$p2[1]) ; + for($yy=$maxy; $yy > $y; --$yy) { + $this->img->current_color = $colmap[$yy]; + $this->img->Line($p1[0],$yy,$p2[0]-1,$yy); + } + + if( $p1[1] == $p2[1] ) { + continue; + } + + // Fill the rest using lines (slow...) + $slope = ($p2[0]-$p1[0])/($p1[1]-$p2[1]); + $x1 = $p1[0]; + $x2 = $p2[0]-1; + $start = $y; + if( $p1[1] > $p2[1] ) { + while( $y >= $p2[1] ) { + $x1=$slope*($start-$y)+$p1[0]; + $this->img->current_color = $colmap[$y]; + $this->img->Line($x1,$y,$x2,$y); + --$y; + } + } + else { + while( $y >= $p1[1] ) { + $x2=$p2[0]+$slope*($start-$y); + $this->img->current_color = $colmap[$y]; + $this->img->Line($x1,$y,$x2,$y); + --$y; + } + } + } } -//--------------- -// PRIVATE METHODS + //--------------- + // PRIVATE METHODS // Add to the image color map the necessary colors to do the transition // between the two colors using $numcolors intermediate colors function GetColArray($from_color,$to_color,$arr_size,&$colors,$numcols=100) { - if( $arr_size==0 ) return; - // If color is given as text get it's corresponding r,g,b values - $from_color = $this->img->rgb->Color($from_color); - $to_color = $this->img->rgb->Color($to_color); - - $rdelta=($to_color[0]-$from_color[0])/$numcols; - $gdelta=($to_color[1]-$from_color[1])/$numcols; - $bdelta=($to_color[2]-$from_color[2])/$numcols; - $colorsperstep = $numcols/$arr_size; - $prevcolnum = -1; - $from_alpha = $from_color[3]; - $to_alpha = $to_color[3]; - $adelta = ( $to_alpha - $from_alpha ) / $numcols ; - for ($i=0; $i < $arr_size; ++$i) { - $colnum = floor($colorsperstep*$i); - if ( $colnum == $prevcolnum ) - $colors[$i] = $colidx; - else { - $r = floor($from_color[0] + $colnum*$rdelta); - $g = floor($from_color[1] + $colnum*$gdelta); - $b = floor($from_color[2] + $colnum*$bdelta); - $alpha = $from_alpha + $colnum*$adelta; - $colidx = $this->img->rgb->Allocate(sprintf("#%02x%02x%02x",$r,$g,$b),$alpha); - $colors[$i] = $colidx; - } - $prevcolnum = $colnum; - } - } + if( $arr_size==0 ) { + return; + } + + // If color is given as text get it's corresponding r,g,b values + $from_color = $this->img->rgb->Color($from_color); + $to_color = $this->img->rgb->Color($to_color); + + $rdelta=($to_color[0]-$from_color[0])/$numcols; + $gdelta=($to_color[1]-$from_color[1])/$numcols; + $bdelta=($to_color[2]-$from_color[2])/$numcols; + $colorsperstep = $numcols/$arr_size; + $prevcolnum = -1; + $from_alpha = $from_color[3]; + $to_alpha = $to_color[3]; + $adelta = ( $to_alpha - $from_alpha ) / $numcols ; + for ($i=0; $i < $arr_size; ++$i) { + $colnum = floor($colorsperstep*$i); + if ( $colnum == $prevcolnum ) { + $colors[$i] = $colidx; + } + else { + $r = floor($from_color[0] + $colnum*$rdelta); + $g = floor($from_color[1] + $colnum*$gdelta); + $b = floor($from_color[2] + $colnum*$bdelta); + $alpha = $from_alpha + $colnum*$adelta; + $colidx = $this->img->rgb->Allocate(sprintf("#%02x%02x%02x",$r,$g,$b),$alpha); + $colors[$i] = $colidx; + } + $prevcolnum = $colnum; + } + } } // Class ?> diff --git a/libs/jpgraph/jpgraph_iconplot.php b/libs/jpgraph/jpgraph_iconplot.php index 6bdf7c0..ca62231 100644 --- a/libs/jpgraph/jpgraph_iconplot.php +++ b/libs/jpgraph/jpgraph_iconplot.php @@ -1,9 +1,9 @@ iFile = $aFile; - $this->iX=$aX; - $this->iY=$aY; - $this->iScale= $aScale; - if( $aMix < 0 || $aMix > 100 ) { - JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.'); - } - $this->iMix = $aMix ; + function __construct($aFile="",$aX=0,$aY=0,$aScale=1.0,$aMix=100) { + $this->iFile = $aFile; + $this->iX=$aX; + $this->iY=$aY; + $this->iScale= $aScale; + if( $aMix < 0 || $aMix > 100 ) { + JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.'); + } + $this->iMix = $aMix ; } function SetCountryFlag($aFlag,$aX=0,$aY=0,$aScale=1.0,$aMix=100,$aStdSize=3) { - $this->iCountryFlag = $aFlag; - $this->iX=$aX; - $this->iY=$aY; - $this->iScale= $aScale; - if( $aMix < 0 || $aMix > 100 ) { - JpGraphError::RaiseL(8001);//'Mix value for icon must be between 0 and 100.'); - } - $this->iMix = $aMix; - $this->iCountryStdSize = $aStdSize; + $this->iCountryFlag = $aFlag; + $this->iX=$aX; + $this->iY=$aY; + $this->iScale= $aScale; + if( $aMix < 0 || $aMix > 100 ) { + JpGraphError::RaiseL(8001);//'Mix value for icon must be between 0 and 100.'); + } + $this->iMix = $aMix; + $this->iCountryStdSize = $aStdSize; } function SetPos($aX,$aY) { - $this->iX=$aX; - $this->iY=$aY; + $this->iX=$aX; + $this->iY=$aY; } function CreateFromString($aStr) { - $this->iImgString = $aStr; + $this->iImgString = $aStr; } function SetScalePos($aX,$aY) { - $this->iScalePosX = $aX; - $this->iScalePosY = $aY; + $this->iScalePosX = $aX; + $this->iScalePosY = $aY; } function SetScale($aScale) { - $this->iScale = $aScale; + $this->iScale = $aScale; } function SetMix($aMix) { - if( $aMix < 0 || $aMix > 100 ) { - JpGraphError::RaiseL(8001);//('Mix value for icon must be between 0 and 100.'); - } - $this->iMix = $aMix ; + if( $aMix < 0 || $aMix > 100 ) { + JpGraphError::RaiseL(8001);//('Mix value for icon must be between 0 and 100.'); + } + $this->iMix = $aMix ; } function SetAnchor($aXAnchor='left',$aYAnchor='center') { - if( !in_array($aXAnchor,$this->iAnchors) || - !in_array($aYAnchor,$this->iAnchors) ) { - JpGraphError::RaiseL(8002);//("Anchor position for icons must be one of 'top', 'bottom', 'left', 'right' or 'center'"); - } - $this->iHorAnchor=$aXAnchor; - $this->iVertAnchor=$aYAnchor; + if( !in_array($aXAnchor,$this->iAnchors) || + !in_array($aYAnchor,$this->iAnchors) ) { + JpGraphError::RaiseL(8002);//("Anchor position for icons must be one of 'top', 'bottom', 'left', 'right' or 'center'"); + } + $this->iHorAnchor=$aXAnchor; + $this->iVertAnchor=$aYAnchor; } - + function PreStrokeAdjust($aGraph) { - // Nothing to do ... + // Nothing to do ... } function DoLegend($aGraph) { - // Nothing to do ... + // Nothing to do ... } function Max() { - return array(false,false); + return array(false,false); } @@ -104,86 +104,86 @@ class IconPlot { function Min() { - return array(false,false); + return array(false,false); } function StrokeMargin(&$aImg) { - return true; + return true; } - function Stroke($aImg,$axscale,$ayscale) { - $this->StrokeWithScale($aImg,$axscale,$ayscale); + function Stroke($aImg,$axscale=null,$ayscale=null) { + $this->StrokeWithScale($aImg,$axscale,$ayscale); } function StrokeWithScale($aImg,$axscale,$ayscale) { - if( $this->iScalePosX === null || - $this->iScalePosY === null ) { - $this->_Stroke($aImg); - } - else { - $this->_Stroke($aImg, - round($axscale->Translate($this->iScalePosX)), - round($ayscale->Translate($this->iScalePosY))); - } + if( $this->iScalePosX === null || $this->iScalePosY === null || + $axscale === null || $ayscale === null ) { + $this->_Stroke($aImg); + } + else { + $this->_Stroke($aImg, + round($axscale->Translate($this->iScalePosX)), + round($ayscale->Translate($this->iScalePosY))); + } } function GetWidthHeight() { - $dummy=0; - return $this->_Stroke($dummy,null,null,true); + $dummy=0; + return $this->_Stroke($dummy,null,null,true); } function _Stroke($aImg,$x=null,$y=null,$aReturnWidthHeight=false) { - if( $this->iFile != '' && $this->iCountryFlag != '' ) { - JpGraphError::RaiseL(8003);//('It is not possible to specify both an image file and a country flag for the same icon.'); - } - if( $this->iFile != '' ) { - $gdimg = Graph::LoadBkgImage('',$this->iFile); - } - elseif( $this->iImgString != '') { - $gdimg = Image::CreateFromString($this->iImgString); - } + if( $this->iFile != '' && $this->iCountryFlag != '' ) { + JpGraphError::RaiseL(8003);//('It is not possible to specify both an image file and a country flag for the same icon.'); + } + if( $this->iFile != '' ) { + $gdimg = Graph::LoadBkgImage('',$this->iFile); + } + elseif( $this->iImgString != '') { + $gdimg = Image::CreateFromString($this->iImgString); + } - else { - if( ! class_exists('FlagImages',false) ) { - JpGraphError::RaiseL(8004);//('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.'); - } - $fobj = new FlagImages($this->iCountryStdSize); - $dummy=''; - $gdimg = $fobj->GetImgByName($this->iCountryFlag,$dummy); - } + else { + if( ! class_exists('FlagImages',false) ) { + JpGraphError::RaiseL(8004);//('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.'); + } + $fobj = new FlagImages($this->iCountryStdSize); + $dummy=''; + $gdimg = $fobj->GetImgByName($this->iCountryFlag,$dummy); + } - $iconw = imagesx($gdimg); - $iconh = imagesy($gdimg); - - if( $aReturnWidthHeight ) { - return array(round($iconw*$this->iScale),round($iconh*$this->iScale)); - } + $iconw = imagesx($gdimg); + $iconh = imagesy($gdimg); - if( $x !== null && $y !== null ) { - $this->iX = $x; $this->iY = $y; - } - if( $this->iX >= 0 && $this->iX <= 1.0 ) { - $w = imagesx($aImg->img); - $this->iX = round($w*$this->iX); - } - if( $this->iY >= 0 && $this->iY <= 1.0 ) { - $h = imagesy($aImg->img); - $this->iY = round($h*$this->iY); - } + if( $aReturnWidthHeight ) { + return array(round($iconw*$this->iScale),round($iconh*$this->iScale)); + } - if( $this->iHorAnchor == 'center' ) - $this->iX -= round($iconw*$this->iScale/2); - if( $this->iHorAnchor == 'right' ) - $this->iX -= round($iconw*$this->iScale); - if( $this->iVertAnchor == 'center' ) - $this->iY -= round($iconh*$this->iScale/2); - if( $this->iVertAnchor == 'bottom' ) - $this->iY -= round($iconh*$this->iScale); + if( $x !== null && $y !== null ) { + $this->iX = $x; $this->iY = $y; + } + if( $this->iX >= 0 && $this->iX <= 1.0 ) { + $w = imagesx($aImg->img); + $this->iX = round($w*$this->iX); + } + if( $this->iY >= 0 && $this->iY <= 1.0 ) { + $h = imagesy($aImg->img); + $this->iY = round($h*$this->iY); + } - $aImg->CopyMerge($gdimg,$this->iX,$this->iY,0,0, - round($iconw*$this->iScale),round($iconh*$this->iScale), - $iconw,$iconh, - $this->iMix); + if( $this->iHorAnchor == 'center' ) + $this->iX -= round($iconw*$this->iScale/2); + if( $this->iHorAnchor == 'right' ) + $this->iX -= round($iconw*$this->iScale); + if( $this->iVertAnchor == 'center' ) + $this->iY -= round($iconh*$this->iScale/2); + if( $this->iVertAnchor == 'bottom' ) + $this->iY -= round($iconh*$this->iScale); + + $aImg->CopyMerge($gdimg,$this->iX,$this->iY,0,0, + round($iconw*$this->iScale),round($iconh*$this->iScale), + $iconw,$iconh, + $this->iMix); } } diff --git a/libs/jpgraph/jpgraph_imgtrans.php b/libs/jpgraph/jpgraph_imgtrans.php index f324b51..6f0cc07 100644 --- a/libs/jpgraph/jpgraph_imgtrans.php +++ b/libs/jpgraph/jpgraph_imgtrans.php @@ -1,177 +1,177 @@ gdImg = $aGdImg; + function __construct($aGdImg) { + // Constructor + $this->gdImg = $aGdImg; } // -------------------------------------------------------------------- - // _TransVert3D() and _TransHor3D() are helper methods to - // Skew3D(). + // _TransVert3D() and _TransHor3D() are helper methods to + // Skew3D(). // -------------------------------------------------------------------- function _TransVert3D($aGdImg,$aHorizon=100,$aSkewDist=120,$aDir=SKEW3D_DOWN,$aMinSize=true,$aFillColor='#FFFFFF',$aQuality=false,$aBorder=false,$aHorizonPos=0.5) { - // Parameter check - if( $aHorizonPos < 0 || $aHorizonPos > 1.0 ) { - JpGraphError::RaiseL(9001); -//("Value for image transformation out of bounds.\nVanishing point on horizon must be specified as a value between 0 and 1."); - } + // Parameter check + if( $aHorizonPos < 0 || $aHorizonPos > 1.0 ) { + JpGraphError::RaiseL(9001); + //("Value for image transformation out of bounds.\nVanishing point on horizon must be specified as a value between 0 and 1."); + } - $w = imagesx($aGdImg); - $h = imagesy($aGdImg); + $w = imagesx($aGdImg); + $h = imagesy($aGdImg); - // Create new image - $ww = $w; - if( $aMinSize ) - $hh = ceil($h * $aHorizon / ($aSkewDist+$h)); - else - $hh = $h; - - $newgdh = imagecreatetruecolor($ww,$hh); - $crgb = new RGB( $newgdh ); - $fillColor = $crgb->Allocate($aFillColor); - imagefilledrectangle($newgdh,0,0,$ww-1,$hh-1,$fillColor); + // Create new image + $ww = $w; + if( $aMinSize ) + $hh = ceil($h * $aHorizon / ($aSkewDist+$h)); + else + $hh = $h; - if( $aBorder ) { - $colidx = $crgb->Allocate($aBorder); - imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx); - } + $newgdh = imagecreatetruecolor($ww,$hh); + $crgb = new RGB( $newgdh ); + $fillColor = $crgb->Allocate($aFillColor); + imagefilledrectangle($newgdh,0,0,$ww-1,$hh-1,$fillColor); - $mid = round($w * $aHorizonPos); - - $last=$h; - for($y=0; $y < $h; ++$y) { + if( $aBorder ) { + $colidx = $crgb->Allocate($aBorder); + imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx); + } - $yp = $h-$y-1; - $yt = floor($yp * $aHorizon / ($aSkewDist + $yp)); + $mid = round($w * $aHorizonPos); - if( !$aQuality ) { - if( $last <= $yt ) continue ; - $last = $yt; - } + $last=$h; + for($y=0; $y < $h; ++$y) { - for($x=0; $x < $w; ++$x) { - $xt = ($x-$mid) * $aSkewDist / ($aSkewDist + $yp); - if( $aDir == SKEW3D_UP ) - $rgb = imagecolorat($aGdImg,$x,$h-$y-1); - else - $rgb = imagecolorat($aGdImg,$x,$y); - $r = ($rgb >> 16) & 0xFF; - $g = ($rgb >> 8) & 0xFF; - $b = $rgb & 0xFF; - $colidx = imagecolorallocate($newgdh,$r,$g,$b); - $xt = round($xt+$mid); - if( $aDir == SKEW3D_UP ) { - $syt = $yt; - } - else { - $syt = $hh-$yt-1; - } + $yp = $h-$y-1; + $yt = floor($yp * $aHorizon / ($aSkewDist + $yp)); - if( !empty($set[$yt]) ) { - $nrgb = imagecolorat($newgdh,$xt,$syt); - $nr = ($nrgb >> 16) & 0xFF; - $ng = ($nrgb >> 8) & 0xFF; - $nb = $nrgb & 0xFF; - $colidx = imagecolorallocate($newgdh,floor(($r+$nr)/2), - floor(($g+$ng)/2),floor(($b+$nb)/2)); - } + if( !$aQuality ) { + if( $last <= $yt ) continue ; + $last = $yt; + } - imagesetpixel($newgdh,$xt,$syt,$colidx); - } + for($x=0; $x < $w; ++$x) { + $xt = ($x-$mid) * $aSkewDist / ($aSkewDist + $yp); + if( $aDir == SKEW3D_UP ) + $rgb = imagecolorat($aGdImg,$x,$h-$y-1); + else + $rgb = imagecolorat($aGdImg,$x,$y); + $r = ($rgb >> 16) & 0xFF; + $g = ($rgb >> 8) & 0xFF; + $b = $rgb & 0xFF; + $colidx = imagecolorallocate($newgdh,$r,$g,$b); + $xt = round($xt+$mid); + if( $aDir == SKEW3D_UP ) { + $syt = $yt; + } + else { + $syt = $hh-$yt-1; + } - $set[$yt] = true; - } + if( !empty($set[$yt]) ) { + $nrgb = imagecolorat($newgdh,$xt,$syt); + $nr = ($nrgb >> 16) & 0xFF; + $ng = ($nrgb >> 8) & 0xFF; + $nb = $nrgb & 0xFF; + $colidx = imagecolorallocate($newgdh,floor(($r+$nr)/2), + floor(($g+$ng)/2),floor(($b+$nb)/2)); + } - return $newgdh; + imagesetpixel($newgdh,$xt,$syt,$colidx); + } + + $set[$yt] = true; + } + + return $newgdh; } // -------------------------------------------------------------------- - // _TransVert3D() and _TransHor3D() are helper methods to - // Skew3D(). + // _TransVert3D() and _TransHor3D() are helper methods to + // Skew3D(). // -------------------------------------------------------------------- function _TransHor3D($aGdImg,$aHorizon=100,$aSkewDist=120,$aDir=SKEW3D_LEFT,$aMinSize=true,$aFillColor='#FFFFFF',$aQuality=false,$aBorder=false,$aHorizonPos=0.5) { - $w = imagesx($aGdImg); - $h = imagesy($aGdImg); + $w = imagesx($aGdImg); + $h = imagesy($aGdImg); - // Create new image - $hh = $h; - if( $aMinSize ) - $ww = ceil($w * $aHorizon / ($aSkewDist+$w)); - else - $ww = $w; - - $newgdh = imagecreatetruecolor($ww,$hh); - $crgb = new RGB( $newgdh ); - $fillColor = $crgb->Allocate($aFillColor); - imagefilledrectangle($newgdh,0,0,$ww-1,$hh-1,$fillColor); + // Create new image + $hh = $h; + if( $aMinSize ) + $ww = ceil($w * $aHorizon / ($aSkewDist+$w)); + else + $ww = $w; - if( $aBorder ) { - $colidx = $crgb->Allocate($aBorder); - imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx); - } + $newgdh = imagecreatetruecolor($ww,$hh); + $crgb = new RGB( $newgdh ); + $fillColor = $crgb->Allocate($aFillColor); + imagefilledrectangle($newgdh,0,0,$ww-1,$hh-1,$fillColor); - $mid = round($h * $aHorizonPos); + if( $aBorder ) { + $colidx = $crgb->Allocate($aBorder); + imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx); + } - $last = -1; - for($x=0; $x < $w-1; ++$x) { - $xt = floor($x * $aHorizon / ($aSkewDist + $x)); - if( !$aQuality ) { - if( $last >= $xt ) continue ; - $last = $xt; - } + $mid = round($h * $aHorizonPos); - for($y=0; $y < $h; ++$y) { - $yp = $h-$y-1; - $yt = ($yp-$mid) * $aSkewDist / ($aSkewDist + $x); + $last = -1; + for($x=0; $x < $w-1; ++$x) { + $xt = floor($x * $aHorizon / ($aSkewDist + $x)); + if( !$aQuality ) { + if( $last >= $xt ) continue ; + $last = $xt; + } - if( $aDir == SKEW3D_RIGHT ) - $rgb = imagecolorat($aGdImg,$w-$x-1,$y); - else - $rgb = imagecolorat($aGdImg,$x,$y); - $r = ($rgb >> 16) & 0xFF; - $g = ($rgb >> 8) & 0xFF; - $b = $rgb & 0xFF; - $colidx = imagecolorallocate($newgdh,$r,$g,$b); - $yt = floor($hh-$yt-$mid-1); - if( $aDir == SKEW3D_RIGHT ) { - $sxt = $ww-$xt-1; - } - else - $sxt = $xt ; + for($y=0; $y < $h; ++$y) { + $yp = $h-$y-1; + $yt = ($yp-$mid) * $aSkewDist / ($aSkewDist + $x); - if( !empty($set[$xt]) ) { - $nrgb = imagecolorat($newgdh,$sxt,$yt); - $nr = ($nrgb >> 16) & 0xFF; - $ng = ($nrgb >> 8) & 0xFF; - $nb = $nrgb & 0xFF; - $colidx = imagecolorallocate($newgdh,floor(($r+$nr)/2), - floor(($g+$ng)/2),floor(($b+$nb)/2)); - } - imagesetpixel($newgdh,$sxt,$yt,$colidx); - } + if( $aDir == SKEW3D_RIGHT ) + $rgb = imagecolorat($aGdImg,$w-$x-1,$y); + else + $rgb = imagecolorat($aGdImg,$x,$y); + $r = ($rgb >> 16) & 0xFF; + $g = ($rgb >> 8) & 0xFF; + $b = $rgb & 0xFF; + $colidx = imagecolorallocate($newgdh,$r,$g,$b); + $yt = floor($hh-$yt-$mid-1); + if( $aDir == SKEW3D_RIGHT ) { + $sxt = $ww-$xt-1; + } + else + $sxt = $xt ; - $set[$xt] = true; - } + if( !empty($set[$xt]) ) { + $nrgb = imagecolorat($newgdh,$sxt,$yt); + $nr = ($nrgb >> 16) & 0xFF; + $ng = ($nrgb >> 8) & 0xFF; + $nb = $nrgb & 0xFF; + $colidx = imagecolorallocate($newgdh,floor(($r+$nr)/2), + floor(($g+$ng)/2),floor(($b+$nb)/2)); + } + imagesetpixel($newgdh,$sxt,$yt,$colidx); + } - return $newgdh; + $set[$xt] = true; + } + + return $newgdh; } // -------------------------------------------------------------------- @@ -179,7 +179,7 @@ class ImgTrans { // This transforms an image into a 3D-skewed version // of the image. The transformation is specified by giving the height // of the artificial horizon and specifying a "skew" factor which - // is the distance on the horizon line between the point of + // is the distance on the horizon line between the point of // convergence and perspective line. // // The function returns the GD handle of the transformed image @@ -187,11 +187,11 @@ class ImgTrans { // // Parameters: // * $aGdImg, GD handle to the image to be transformed - // * $aHorizon, Distance to the horizon + // * $aHorizon, Distance to the horizon // * $aSkewDist, Distance from the horizon point of convergence - // on the horizon line to the perspective points. A larger + // on the horizon line to the perspective points. A larger // value will fore-shorten the image more - // * $aDir, parameter specifies type of convergence. This of this + // * $aDir, parameter specifies type of convergence. This of this // as the walls in a room you are looking at. This specifies if the // image should be applied on the left,right,top or bottom walls. // * $aMinSize, true=make the new image just as big as needed, @@ -201,22 +201,22 @@ class ImgTrans { // the image quality but at the expense of performace. Enabling // high quality will have a dramatic effect on the time it takes // to transform an image. - // * $aBorder, if set to anything besides false this will draw a + // * $aBorder, if set to anything besides false this will draw a // a border of the speciied color around the image // -------------------------------------------------------------------- function Skew3D($aHorizon=120,$aSkewDist=150,$aDir=SKEW3D_DOWN,$aHiQuality=false,$aMinSize=true,$aFillColor='#FFFFFF',$aBorder=false) { - return $this->_Skew3D($this->gdImg,$aHorizon,$aSkewDist,$aDir,$aHiQuality, - $aMinSize,$aFillColor,$aBorder); + return $this->_Skew3D($this->gdImg,$aHorizon,$aSkewDist,$aDir,$aHiQuality, + $aMinSize,$aFillColor,$aBorder); } function _Skew3D($aGdImg,$aHorizon=120,$aSkewDist=150,$aDir=SKEW3D_DOWN,$aHiQuality=false,$aMinSize=true,$aFillColor='#FFFFFF',$aBorder=false) { - if( $aDir == SKEW3D_DOWN || $aDir == SKEW3D_UP ) - return $this->_TransVert3D($aGdImg,$aHorizon,$aSkewDist,$aDir,$aMinSize,$aFillColor,$aHiQuality,$aBorder); - else - return $this->_TransHor3D($aGdImg,$aHorizon,$aSkewDist,$aDir,$aMinSize,$aFillColor,$aHiQuality,$aBorder); + if( $aDir == SKEW3D_DOWN || $aDir == SKEW3D_UP ) + return $this->_TransVert3D($aGdImg,$aHorizon,$aSkewDist,$aDir,$aMinSize,$aFillColor,$aHiQuality,$aBorder); + else + return $this->_TransHor3D($aGdImg,$aHorizon,$aSkewDist,$aDir,$aMinSize,$aFillColor,$aHiQuality,$aBorder); } - + } diff --git a/libs/jpgraph/jpgraph_led.php b/libs/jpgraph/jpgraph_led.php index 7fa3ba8..45cda1b 100644 --- a/libs/jpgraph/jpgraph_led.php +++ b/libs/jpgraph/jpgraph_led.php @@ -1,53 +1,16 @@ 'L', Cyrilic, other symbols and special symbols for -// simulation some latin and cyrilic chars. -// Added: New Color schemas. -// Deleted: Some minor bugs (StrokeNumber first parameter may be eq empty string, -// false or null - added check see line 294; -// change color schema check for easy maintenance: 291; -// change check on key exist in chars array: moved from StrokeNumber -// function to _GetLED: 251; -// //======================================================================== -// Samples for troubled chars: "Ô¡ Ø\r Ù\r Û| ÞÎ Ì\r >\n< W\r" -// Ô Ø Ù Û Þ Ì Æ W - -//---------------------------------------------------------------------------- -// Each character is encoded line by line with the "On"-LEDs corresponding to -// a '1' in the bianry mask of 4 bits. -// -// 4-bit mask: -// -// 0 ____ -// 1 ___x -// 2 __x_ -// 3 __xx -// 4 _x__ -// 5 _x_x -// 6 _xx_ -// 7 _xxx -// 8 x___ -// 9 x__x -// 10 x_x_ -// 11 x_xx -// 12 xx__ -// 13 xx_x -// 14 xxx_ -// 15 xxxx -//---------------------------------------------------------------------------- - -// Constants for color schema. See definition of iColorSchema below +// Constants for color schema DEFINE('LEDC_RED', 0); DEFINE('LEDC_GREEN', 1); DEFINE('LEDC_BLUE', 2); @@ -64,11 +27,17 @@ DEFINE('LEDC_TEAL', 12); DEFINE('LEDC_STEELBLUE', 13); DEFINE('LEDC_NAVY', 14); DEFINE('LEDC_INVERTGRAY', 15); -// ! It correlate with two-dimensional array $iColorSchema + +// Check that mb_strlen() is available +if( ! function_exists('mb_strlen') ) { + JpGraphError::RaiseL(25500); + //'Multibyte strings must be enabled in the PHP installation in order to run the LED module + // so that the function mb_strlen() is available. See PHP documentation for more information.' +} //======================================================================== // CLASS DigitalLED74 -// Description: +// Description: // Construct a number as an image that looks like LED numbers in a // 7x4 digital matrix //======================================================================== @@ -76,241 +45,267 @@ class DigitalLED74 { private $iLED_X = 4, $iLED_Y=7, - // fg-up, fg-down, bg - $iColorSchema = array( - LEDC_RED => array('red','darkred:0.9','red:0.3'),// 0 - LEDC_GREEN => array('green','darkgreen','green:0.3'),// 1 - LEDC_BLUE => array('lightblue:0.9','darkblue:0.85','darkblue:0.7'),// 2 - LEDC_YELLOW => array('yellow','yellow:0.4','yellow:0.3'),// 3 - LEDC_GRAY => array('gray:1.4','darkgray:0.85','darkgray:0.7'), - LEDC_CHOCOLATE => array('chocolate','chocolate:0.7','chocolate:0.5'), - LEDC_PERU => array('peru:0.95','peru:0.6','peru:0.5'), - LEDC_GOLDENROD => array('goldenrod','goldenrod:0.6','goldenrod:0.5'), - LEDC_KHAKI => array('khaki:0.7','khaki:0.4','khaki:0.3'), - LEDC_OLIVE => array('#808000','#808000:0.7','#808000:0.6'), - LEDC_LIMEGREEN => array('limegreen:0.9','limegreen:0.5','limegreen:0.4'), - LEDC_FORESTGREEN => array('forestgreen','forestgreen:0.7','forestgreen:0.5'), - LEDC_TEAL => array('teal','teal:0.7','teal:0.5'), - LEDC_STEELBLUE => array('steelblue','steelblue:0.65','steelblue:0.5'), - LEDC_NAVY => array('navy:1.3','navy:0.95','navy:0.8'),//14 - LEDC_INVERTGRAY => array('darkgray','lightgray:1.5','white')//15 - ), + // fg-up, fg-down, bg + $iColorSchema = array( + LEDC_RED => array('red','darkred:0.9','red:0.3'),// 0 + LEDC_GREEN => array('green','darkgreen','green:0.3'),// 1 + LEDC_BLUE => array('lightblue:0.9','darkblue:0.85','darkblue:0.7'),// 2 + LEDC_YELLOW => array('yellow','yellow:0.4','yellow:0.3'),// 3 + LEDC_GRAY => array('gray:1.4','darkgray:0.85','darkgray:0.7'), + LEDC_CHOCOLATE => array('chocolate','chocolate:0.7','chocolate:0.5'), + LEDC_PERU => array('peru:0.95','peru:0.6','peru:0.5'), + LEDC_GOLDENROD => array('goldenrod','goldenrod:0.6','goldenrod:0.5'), + LEDC_KHAKI => array('khaki:0.7','khaki:0.4','khaki:0.3'), + LEDC_OLIVE => array('#808000','#808000:0.7','#808000:0.6'), + LEDC_LIMEGREEN => array('limegreen:0.9','limegreen:0.5','limegreen:0.4'), + LEDC_FORESTGREEN => array('forestgreen','forestgreen:0.7','forestgreen:0.5'), + LEDC_TEAL => array('teal','teal:0.7','teal:0.5'), + LEDC_STEELBLUE => array('steelblue','steelblue:0.65','steelblue:0.5'), + LEDC_NAVY => array('navy:1.3','navy:0.95','navy:0.8'),//14 + LEDC_INVERTGRAY => array('darkgray','lightgray:1.5','white')//15 + ), - $iLEDSpec = array( - 0 => array(6,9,11,15,13,9,6), - //0 => array(6,9,9,9,9,9,6), - //0 => array(15,9,9,9,9,9,15), - 1 => array(2,6,10,2,2,2,2), - 2 => array(6,9,1,2,4,8,15), - 3 => array(6,9,1,6,1,9,6), - 4 => array(1,3,5,9,15,1,1), - 5 => array(15,8,8,14,1,9,6), - 6 => array(6,8,8,14,9,9,6), - 7 => array(15,1,1,2,4,4,4), - 8 => array(6,9,9,6,9,9,6), - 9 => array(6,9,9,7,1,1,6), - '!' => array(4,4,4,4,4,0,4), - '?' => array(6,9,1,2,2,0,2), - '#' => array(0,9,15,9,15,9,0), - '@' => array(6,9,11,11,10,9,6), - '-' => array(0,0,0,15,0,0,0), - '_' => array(0,0,0,0,0,0,15), - '=' => array(0,0,15,0,15,0,0), - '+' => array(0,0,4,14,4,0,0), - '|' => array(4,4,4,4,4,4,4), //vertical line, used for simulate rus 'Û' - ',' => array(0,0,0,0,0,12,4), - '.' => array(0,0,0,0,0,12,12), - ':' => array(12,12,0,0,0,12,12), - ';' => array(12,12,0,0,0,12,4), - '[' => array(3,2,2,2,2,2,3), - ']' => array(12,4,4,4,4,4,12), - '(' => array(1,2,2,2,2,2,1), - ')' => array(8,4,4,4,4,4,8), - '{' => array(3,2,2,6,2,2,3), - '}' => array(12,4,4,6,4,4,12), - '<' => array(1,2,4,8,4,2,1), - '>' => array(8,4,2,1,2,4,8), - '*' => array(9,6,15,6,9,0,0), - '"' => array(10,10,0,0,0,0,0), - '\'' => array(4,4,0,0,0,0,0), - '`' => array(4,2,0,0,0,0,0), - '~' => array(13,11,0,0,0,0,0), - '^' => array(4,10,0,0,0,0,0), - '\\' => array(8,8,4,6,2,1,1), - '/' => array(1,1,2,6,4,8,8), - '%' => array(1,9,2,6,4,9,8), - '&' => array(0,4,10,4,11,10,5), - '$' => array(2,7,8,6,1,14,4), - ' ' => array(0,0,0,0,0,0,0), - '•' => array(0,0,6,6,0,0,0), //149 - '°' => array(14,10,14,0,0,0,0), //176 - '†' => array(4,4,14,4,4,4,4), //134 - '‡' => array(4,4,14,4,14,4,4), //135 - '±' => array(0,4,14,4,0,14,0), //177 - '‰' => array(0,4,2,15,2,4,0), //137 show right arrow - '™' => array(0,2,4,15,4,2,0), //156 show left arrow - '¡' => array(0,0,8,8,0,0,0), //159 show small hi-stick - that need for simulate rus 'Ô' - "\t" => array(8,8,8,0,0,0,0), //show hi-stick - that need for simulate rus 'Ó' - "\r" => array(8,8,8,8,8,8,8), //vertical line - that need for simulate 'M', 'W' and rus 'Ì','Ø' ,'Ù' - "\n" => array(15,15,15,15,15,15,15), //fill up - that need for simulate rus 'Æ' - "¥" => array(10,5,10,5,10,5,10), //chess - "µ" => array(15,0,15,0,15,0,15), //4 horizontal lines -// latin - 'A' => array(6,9,9,15,9,9,9), - 'B' => array(14,9,9,14,9,9,14), - 'C' => array(6,9,8,8,8,9,6), - 'D' => array(14,9,9,9,9,9,14), - 'E' => array(15,8,8,14,8,8,15), - 'F' => array(15,8,8,14,8,8,8), - 'G' => array(6,9,8,8,11,9,6), - 'H' => array(9,9,9,15,9,9,9), - 'I' => array(14,4,4,4,4,4,14), - 'J' => array(15,1,1,1,1,9,6), - 'K' => array(8,9,10,12,12,10,9), - 'L' => array(8,8,8,8,8,8,15), - 'M' => array(8,13,10,8,8,8,8),// need to add \r - 'N' => array(9,9,13,11,9,9,9), - //'O' => array(0,6,9,9,9,9,6), - 'O' => array(6,9,9,9,9,9,6), - 'P' => array(14,9,9,14,8,8,8), - 'Q' => array(6,9,9,9,13,11,6), - 'R' => array(14,9,9,14,12,10,9), - 'S' => array(6,9,8,6,1,9,6), - 'T' => array(14,4,4,4,4,4,4), - 'U' => array(9,9,9,9,9,9,6), - 'V' => array(0,0,0,10,10,10,4), - 'W' => array(8,8,8,8,10,13,8),// need to add \r - 'X' => array(9,9,6,6,6,9,9), - //'Y' => array(9,9,9,9,6,6,6), - 'Y' => array(10,10,10,10,4,4,4), - 'Z' => array(15,1,2,6,4,8,15), -// russian cp1251 - 'À' => array(6,9,9,15,9,9,9), - 'Á' => array(14,8,8,14,9,9,14), - 'Â' => array(14,9,9,14,9,9,14), - 'Ã' => array(15,8,8,8,8,8,8), - 'Ä' => array(14,9,9,9,9,9,14), - 'Å' => array(15,8,8,14,8,8,15), - '¨' => array(6,15,8,14,8,8,15), - //Æ is combine: >\n< - 'Ç' => array(6,9,1,2,1,9,6), - 'È' => array(9,9,9,11,13,9,9), - 'É' => array(13,9,9,11,13,9,9), - 'Ê' => array(9,10,12,10,9,9,9), - 'Ë' => array(7,9,9,9,9,9,9), - 'Ì' => array(8,13,10,8,8,8,8),// need to add \r - 'Í' => array(9,9,9,15,9,9,9), - 'Î' => array(6,9,9,9,9,9,6), - 'Ï' => array(15,9,9,9,9,9,9), - 'Ð' => array(14,9,9,14,8,8,8), - 'Ñ' => array(6,9,8,8,8,9,6), - 'Ò' => array(14,4,4,4,4,4,4), - 'Ó' => array(9,9,9,7,1,9,6), - 'Ô' => array(2,7,10,10,7,2,2),// need to add ¡ - 'Õ' => array(9,9,6,6,6,9,9), - 'Ö' => array(10,10,10,10,10,15,1), - '×' => array(9,9,9,7,1,1,1), - 'Ø' => array(10,10,10,10,10,10,15),// \r - 'Ù' => array(10,10,10,10,10,15,0),// need to add \r - 'Ú' => array(12,4,4,6,5,5,6), - 'Û' => array(8,8,8,14,9,9,14),// need to add | - 'Ü' => array(8,8,8,14,9,9,14), - 'Ý' => array(6,9,1,7,1,9,6), - 'Þ' => array(2,2,2,3,2,2,2),// need to add O - 'ß' => array(7,9,9,7,3,5,9) - ), + /* Each line of the character is encoded as a 4 bit value + 0 ____ + 1 ___x + 2 __x_ + 3 __xx + 4 _x__ + 5 _x_x + 6 _xx_ + 7 _xxx + 8 x___ + 9 x__x + 10 x_x_ + 11 x_xx + 12 xx__ + 13 xx_x + 14 xxx_ + 15 xxxx + */ - $iSuperSampling = 3, $iMarg = 1, $iRad = 4; - - function DigitalLED74($aRadius = 2, $aMargin= 0.6) { - $this->iRad = $aRadius; - $this->iMarg = $aMargin; - } - - function SetSupersampling($aSuperSampling = 2) { - $this->iSuperSampling = $aSuperSampling; + $iLEDSpec = array( + 0 => array(6,9,11,15,13,9,6), + 1 => array(2,6,10,2,2,2,2), + 2 => array(6,9,1,2,4,8,15), + 3 => array(6,9,1,6,1,9,6), + 4 => array(1,3,5,9,15,1,1), + 5 => array(15,8,8,14,1,9,6), + 6 => array(6,8,8,14,9,9,6), + 7 => array(15,1,1,2,4,4,4), + 8 => array(6,9,9,6,9,9,6), + 9 => array(6,9,9,7,1,1,6), + '!' => array(4,4,4,4,4,0,4), + '?' => array(6,9,1,2,2,0,2), + '#' => array(0,9,15,9,15,9,0), + '@' => array(6,9,11,11,10,9,6), + '-' => array(0,0,0,15,0,0,0), + '_' => array(0,0,0,0,0,0,15), + '=' => array(0,0,15,0,15,0,0), + '+' => array(0,0,4,14,4,0,0), + '|' => array(4,4,4,4,4,4,4), //vertical line, used for simulate rus 'Ы' + ',' => array(0,0,0,0,0,12,4), + '.' => array(0,0,0,0,0,12,12), + ':' => array(12,12,0,0,0,12,12), + ';' => array(12,12,0,0,0,12,4), + '[' => array(3,2,2,2,2,2,3), + ']' => array(12,4,4,4,4,4,12), + '(' => array(1,2,2,2,2,2,1), + ')' => array(8,4,4,4,4,4,8), + '{' => array(3,2,2,6,2,2,3), + '}' => array(12,4,4,6,4,4,12), + '<' => array(1,2,4,8,4,2,1), + '>' => array(8,4,2,1,2,4,8), + '*' => array(9,6,15,6,9,0,0), + '"' => array(10,10,0,0,0,0,0), + '\'' => array(4,4,0,0,0,0,0), + '`' => array(4,2,0,0,0,0,0), + '~' => array(13,11,0,0,0,0,0), + '^' => array(4,10,0,0,0,0,0), + '\\' => array(8,8,4,6,2,1,1), + '/' => array(1,1,2,6,4,8,8), + '%' => array(1,9,2,6,4,9,8), + '&' => array(0,4,10,4,11,10,5), + '$' => array(2,7,8,6,1,14,4), + ' ' => array(0,0,0,0,0,0,0), + '•' => array(0,0,6,6,0,0,0), //149 + '°' => array(14,10,14,0,0,0,0), //176 + '†' => array(4,4,14,4,4,4,4), //134 + '‡' => array(4,4,14,4,14,4,4), //135 + '±' => array(0,4,14,4,0,14,0), //177 + '‰' => array(0,4,2,15,2,4,0), //137 show right arrow + 'â„¢' => array(0,2,4,15,4,2,0), //156 show left arrow + 'ÐŽ' => array(0,0,8,8,0,0,0), //159 show small hi-stick - that need for simulate rus 'Ф' + "\t" => array(8,8,8,0,0,0,0), //show hi-stick - that need for simulate rus 'У' + "\r" => array(8,8,8,8,8,8,8), //vertical line - that need for simulate 'M', 'W' and rus 'Ðœ','Ш' ,'Щ' + "\n" => array(15,15,15,15,15,15,15), //fill up - that need for simulate rus 'Ж' + "Ò" => array(10,5,10,5,10,5,10), //chess + "µ" => array(15,0,15,0,15,0,15), //4 horizontal lines + // latin + 'A' => array(6,9,9,15,9,9,9), + 'B' => array(14,9,9,14,9,9,14), + 'C' => array(6,9,8,8,8,9,6), + 'D' => array(14,9,9,9,9,9,14), + 'E' => array(15,8,8,14,8,8,15), + 'F' => array(15,8,8,14,8,8,8), + 'G' => array(6,9,8,8,11,9,6), + 'H' => array(9,9,9,15,9,9,9), + 'I' => array(14,4,4,4,4,4,14), + 'J' => array(15,1,1,1,1,9,6), + 'K' => array(8,9,10,12,12,10,9), + 'L' => array(8,8,8,8,8,8,15), + 'M' => array(8,13,10,8,8,8,8),// need to add \r + 'N' => array(9,9,13,11,9,9,9), + 'O' => array(6,9,9,9,9,9,6), + 'P' => array(14,9,9,14,8,8,8), + 'Q' => array(6,9,9,9,13,11,6), + 'R' => array(14,9,9,14,12,10,9), + 'S' => array(6,9,8,6,1,9,6), + 'T' => array(14,4,4,4,4,4,4), + 'U' => array(9,9,9,9,9,9,6), + 'V' => array(0,0,0,10,10,10,4), + 'W' => array(8,8,8,8,10,13,8),// need to add \r + 'X' => array(9,9,6,6,6,9,9), + 'Y' => array(10,10,10,10,4,4,4), + 'Z' => array(15,1,2,6,4,8,15), + // russian utf-8 + 'Ð' => array(6,9,9,15,9,9,9), + 'Б' => array(14,8,8,14,9,9,14), + 'Ð’' => array(14,9,9,14,9,9,14), + 'Г' => array(15,8,8,8,8,8,8), + 'Д' => array(14,9,9,9,9,9,14), + 'Е' => array(15,8,8,14,8,8,15), + 'Ð' => array(6,15,8,14,8,8,15), + //Ж is combine: >\n< + 'З' => array(6,9,1,2,1,9,6), + 'И' => array(9,9,9,11,13,9,9), + 'Й' => array(13,9,9,11,13,9,9), + 'К' => array(9,10,12,10,9,9,9), + 'Л' => array(7,9,9,9,9,9,9), + 'Ðœ' => array(8,13,10,8,8,8,8),// need to add \r + 'Ð' => array(9,9,9,15,9,9,9), + 'О' => array(6,9,9,9,9,9,6), + 'П' => array(15,9,9,9,9,9,9), + 'Р' => array(14,9,9,14,8,8,8), + 'С' => array(6,9,8,8,8,9,6), + 'Т' => array(14,4,4,4,4,4,4), + 'У' => array(9,9,9,7,1,9,6), + 'Ф' => array(2,7,10,10,7,2,2),// need to add ÐŽ + 'Ð¥' => array(9,9,6,6,6,9,9), + 'Ц' => array(10,10,10,10,10,15,1), + 'Ч' => array(9,9,9,7,1,1,1), + 'Ш' => array(10,10,10,10,10,10,15),// \r + 'Щ' => array(10,10,10,10,10,15,0),// need to add \r + 'Ъ' => array(12,4,4,6,5,5,6), + 'Ы' => array(8,8,8,14,9,9,14),// need to add | + 'Ь' => array(8,8,8,14,9,9,14), + 'Э' => array(6,9,1,7,1,9,6), + 'Ю' => array(2,2,2,3,2,2,2),// need to add O + 'Я' => array(7,9,9,7,3,5,9) + ), + + $iSuperSampling = 3, $iMarg = 1, $iRad = 4; + + function __construct($aRadius = 2, $aMargin= 0.6) { + $this->iRad = $aRadius; + $this->iMarg = $aMargin; } - function _GetLED($aLedIdx, $aColor = 0) { - $width= $this->iLED_X*$this->iRad*2 + ($this->iLED_X+1)*$this->iMarg + $this->iRad ; - $height= $this->iLED_Y*$this->iRad*2 + ($this->iLED_Y)*$this->iMarg + $this->iRad * 2; - - // Adjust radious for supersampling - $rad = $this->iRad * $this->iSuperSampling; - - // Margin in between "Led" dots - $marg = $this->iMarg * $this->iSuperSampling; - - $swidth = $width*$this->iSuperSampling; - $sheight = $height*$this->iSuperSampling; - - $simg = new RotImage($swidth, $sheight, 0, DEFAULT_GFORMAT, false); - $simg->SetColor($this->iColorSchema[$aColor][2]); - $simg->FilledRectangle(0, 0, $swidth-1, $sheight-1); - - if(array_key_exists($aLedIdx, $this->iLEDSpec)) { - $d = $this->iLEDSpec[$aLedIdx]; - } - else { - $d = array(0,0,0,0,0,0,0); - } - - for($r = 0; $r < 7; ++$r) { - $dr = $d[$r]; - for($c = 0; $c < 4; ++$c) { - if( ($dr & pow(2,3-$c)) !== 0 ) { - $color = $this->iColorSchema[$aColor][0]; - } - else { - $color = $this->iColorSchema[$aColor][1]; - } - - $x = 2*$rad*$c+$rad + ($c+1)*$marg + $rad ; - $y = 2*$rad*$r+$rad + ($r+1)*$marg + $rad ; - - $simg->SetColor($color); - $simg->FilledCircle($x,$y,$rad); - } - } - - $img = new Image($width, $height, DEFAULT_GFORMAT, false); - $img->Copy($simg->img, 0, 0, 0, 0, $width, $height, $swidth, $sheight); - $simg->Destroy(); - unset($simg); - return $img; + function SetSupersampling($aSuperSampling = 2) { + $this->iSuperSampling = $aSuperSampling; } - function StrokeNumber($aValStr, $aColor = 0) { - if($aColor < 0 || $aColor >= sizeof($this->iColorSchema)) - $aColor = 0; + function _GetLED($aLedIdx, $aColor = 0) { + $width= $this->iLED_X*$this->iRad*2 + ($this->iLED_X+1)*$this->iMarg + $this->iRad ; + $height= $this->iLED_Y*$this->iRad*2 + ($this->iLED_Y)*$this->iMarg + $this->iRad * 2; - if(($n = strlen($aValStr)) == 0) { - $aValStr = ' '; - $n = 1; - } + // Adjust radious for supersampling + $rad = $this->iRad * $this->iSuperSampling; - for($i = 0; $i < $n; ++$i) { - $d = substr($aValStr, $i, 1); - if( $d >= '0' && $d <= '9' ) { - $d = (int)$d; - } - else { - $d = strtoupper($d); - } - $digit_img[$i] = $this->_GetLED($d, $aColor); - } + // Margin in between "Led" dots + $marg = $this->iMarg * $this->iSuperSampling; - $w = imagesx($digit_img[0]->img); - $h = imagesy($digit_img[0]->img); + $swidth = $width*$this->iSuperSampling; + $sheight = $height*$this->iSuperSampling; - $number_img = new Image($w*$n, $h, DEFAULT_GFORMAT, false); + $simg = new RotImage($swidth, $sheight, 0, DEFAULT_GFORMAT, false); + $simg->SetColor($this->iColorSchema[$aColor][2]); + $simg->FilledRectangle(0, 0, $swidth-1, $sheight-1); - for($i = 0; $i < $n; ++$i) { - $number_img->Copy($digit_img[$i]->img, $i*$w, 0, 0, 0, $w, $h, $w, $h); - } + if( array_key_exists($aLedIdx, $this->iLEDSpec) ) { + $d = $this->iLEDSpec[$aLedIdx]; + } + else { + $d = array(0,0,0,0,0,0,0); + } - $number_img->Headers(); - $number_img->Stream(); + for($r = 0; $r < 7; ++$r) { + $dr = $d[$r]; + for($c = 0; $c < 4; ++$c) { + if( ($dr & pow(2,3-$c)) !== 0 ) { + $color = $this->iColorSchema[$aColor][0]; + } + else { + $color = $this->iColorSchema[$aColor][1]; + } + + $x = 2*$rad*$c+$rad + ($c+1)*$marg + $rad ; + $y = 2*$rad*$r+$rad + ($r+1)*$marg + $rad ; + + $simg->SetColor($color); + $simg->FilledCircle($x,$y,$rad); + } + } + + $img = new Image($width, $height, DEFAULT_GFORMAT, false); + $img->Copy($simg->img, 0, 0, 0, 0, $width, $height, $swidth, $sheight); + $simg->Destroy(); + unset($simg); + return $img; + } + + + function Stroke($aValStr, $aColor = 0, $aFileName = '') { + $this->StrokeNumber($aValStr, $aColor, $aFileName); + } + + + function StrokeNumber($aValStr, $aColor = 0, $aFileName = '') { + if( $aColor < 0 || $aColor >= sizeof($this->iColorSchema) ) { + $aColor = 0; + } + + if(($n = mb_strlen($aValStr,'utf8')) == 0) { + $aValStr = ' '; + $n = 1; + } + + for($i = 0; $i < $n; ++$i) { + $d = mb_substr($aValStr, $i, 1, 'utf8'); + if( ctype_digit($d) ) { + $d = (int)$d; + } + else { + $d = strtoupper($d); + } + $digit_img[$i] = $this->_GetLED($d, $aColor); + } + + $w = imagesx($digit_img[0]->img); + $h = imagesy($digit_img[0]->img); + + $number_img = new Image($w*$n, $h, DEFAULT_GFORMAT, false); + + for($i = 0; $i < $n; ++$i) { + $number_img->Copy($digit_img[$i]->img, $i*$w, 0, 0, 0, $w, $h, $w, $h); + } + + if( $aFileName != '' ) { + $number_img->Stream($aFileName); + } else { + $number_img->Headers(); + $number_img->Stream(); + } } } ?> diff --git a/libs/jpgraph/jpgraph_legend.inc.php b/libs/jpgraph/jpgraph_legend.inc.php new file mode 100644 index 0000000..0a8c97c --- /dev/null +++ b/libs/jpgraph/jpgraph_legend.inc.php @@ -0,0 +1,420 @@ +hide=$aHide; + } + + function SetHColMargin($aXMarg) { + $this->xmargin = $aXMarg; + } + + function SetVColMargin($aSpacing) { + $this->ymargin = $aSpacing ; + } + + function SetLeftMargin($aXMarg) { + $this->xlmargin = $aXMarg; + } + + // Synonym + function SetLineSpacing($aSpacing) { + $this->ymargin = $aSpacing ; + } + + function SetShadow($aShow='gray',$aWidth=2) { + if( is_string($aShow) ) { + $this->shadow_color = $aShow; + $this->shadow=true; + } + else + $this->shadow=$aShow; + $this->shadow_width=$aWidth; + } + + function SetMarkAbsSize($aSize) { + $this->mark_abs_vsize = $aSize ; + $this->mark_abs_hsize = $aSize ; + } + + function SetMarkAbsVSize($aSize) { + $this->mark_abs_vsize = $aSize ; + } + + function SetMarkAbsHSize($aSize) { + $this->mark_abs_hsize = $aSize ; + } + + function SetLineWeight($aWeight) { + $this->weight = $aWeight; + } + + function SetFrameWeight($aWeight) { + $this->frameweight = $aWeight; + } + + function SetLayout($aDirection=LEGEND_VERT) { + $this->layout_n = $aDirection==LEGEND_VERT ? 1 : 99 ; + } + + function SetColumns($aCols) { + $this->layout_n = $aCols ; + } + + function SetReverse($f=true) { + $this->reverse = $f ; + } + + // Set color on frame around box + function SetColor($aFontColor,$aColor='black') { + $this->font_color=$aFontColor; + $this->color=$aColor; + } + + function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) { + $this->font_family = $aFamily; + $this->font_style = $aStyle; + $this->font_size = $aSize; + } + + function SetPos($aX,$aY,$aHAlign='right',$aVAlign='top') { + $this->Pos($aX,$aY,$aHAlign,$aVAlign); + } + + function SetAbsPos($aX,$aY,$aHAlign='right',$aVAlign='top') { + $this->xabspos=$aX; + $this->yabspos=$aY; + $this->halign=$aHAlign; + $this->valign=$aVAlign; + } + + + function Pos($aX,$aY,$aHAlign='right',$aVAlign='top') { + if( !($aX<1 && $aY<1) ) + JpGraphError::RaiseL(25120);//(" Position for legend must be given as percentage in range 0-1"); + $this->xpos=$aX; + $this->ypos=$aY; + $this->halign=$aHAlign; + $this->valign=$aVAlign; + } + + function SetFillColor($aColor) { + $this->fill_color=$aColor; + } + + function Clear() { + $this->txtcol = array(); + } + + function Add($aTxt,$aColor,$aPlotmark='',$aLinestyle=0,$csimtarget='',$csimalt='',$csimwintarget='') { + $this->txtcol[]=array($aTxt,$aColor,$aPlotmark,$aLinestyle,$csimtarget,$csimalt,$csimwintarget); + } + + function GetCSIMAreas() { + return $this->csimareas; + } + + function Stroke(&$aImg) { + // Constant + $fillBoxFrameWeight=1; + + if( $this->hide ) return; + + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + + if( $this->reverse ) { + $this->txtcol = array_reverse($this->txtcol); + } + + $n=count($this->txtcol); + if( $n == 0 ) return; + + // Find out the max width and height of each column to be able + // to size the legend box. + $numcolumns = ($n > $this->layout_n ? $this->layout_n : $n); + for( $i=0; $i < $numcolumns; ++$i ) { + $colwidth[$i] = $aImg->GetTextWidth($this->txtcol[$i][0]) + + 2*$this->xmargin + 2*$this->mark_abs_hsize; + $colheight[$i] = 0; + + } + + // Find our maximum height in each row + $rows = 0 ; $rowheight[0] = 0; + for( $i=0; $i < $n; ++$i ) { + $h = max($this->mark_abs_vsize,$aImg->GetTextHeight($this->txtcol[$i][0]))+$this->ymargin; + // Makes sure we always have a minimum of 1/4 (1/2 on each side) of the mark as space + // between two vertical legend entries + $h = round(max($h,$this->mark_abs_vsize+$this->mark_abs_vsize/2)); + //echo "Textheight:".$aImg->GetTextHeight($this->txtcol[$i][0]).', '; + //echo "h=$h ({$this->mark_abs_vsize},{$this->ymargin})
"; + if( $i % $numcolumns == 0 ) { + $rows++; + $rowheight[$rows-1] = 0; + } + $rowheight[$rows-1] = max($rowheight[$rows-1],$h); + } + + $abs_height = 0; + for( $i=0; $i < $rows; ++$i ) { + $abs_height += $rowheight[$i] ; + } + + // Make sure that the height is at least as high as mark size + ymargin + // We add 1.5 y-margin to add some space at the top+bottom part of the + // legend. + $abs_height = max($abs_height,$this->mark_abs_vsize); + $abs_height += 3*$this->ymargin; + + // Find out the maximum width in each column + for( $i=$numcolumns; $i < $n; ++$i ) { + $colwidth[$i % $numcolumns] = max( + $aImg->GetTextWidth($this->txtcol[$i][0])+2*$this->xmargin+2*$this->mark_abs_hsize, + $colwidth[$i % $numcolumns]); + } + + + // Get the total width + $mtw = 0; + for( $i=0; $i < $numcolumns; ++$i ) { + $mtw += $colwidth[$i] ; + } + + // Find out maximum width we need for legend box + $abs_width = $mtw+$this->xlmargin; + + if( $this->xabspos === -1 && $this->yabspos === -1 ) { + $this->xabspos = $this->xpos*$aImg->width ; + $this->yabspos = $this->ypos*$aImg->height ; + } + + // Positioning of the legend box + if( $this->halign == 'left' ) { + $xp = $this->xabspos; + } + elseif( $this->halign == 'center' ) { + $xp = $this->xabspos - $abs_width/2; + } + else { + $xp = $aImg->width - $this->xabspos - $abs_width; + } + + $yp=$this->yabspos; + if( $this->valign == 'center' ) { + $yp-=$abs_height/2; + } + elseif( $this->valign == 'bottom' ) { + $yp-=$abs_height; + } + + // Stroke legend box + $aImg->SetColor($this->color); + $aImg->SetLineWeight($this->frameweight); + $aImg->SetLineStyle('solid'); + + if( $this->shadow ) { + $aImg->ShadowRectangle($xp,$yp,$xp+$abs_width+$this->shadow_width, + $yp+$abs_height+$this->shadow_width, + $this->fill_color,$this->shadow_width,$this->shadow_color); + } + else { + $aImg->SetColor($this->fill_color); + $aImg->FilledRectangle($xp,$yp,$xp+$abs_width,$yp+$abs_height); + $aImg->SetColor($this->color); + $aImg->Rectangle($xp,$yp,$xp+$abs_width,$yp+$abs_height); + } + + // x1,y1 is the position for the legend mark + $x1=$xp+round($this->mark_abs_hsize/2)+$this->xlmargin; + $y1=$yp + $this->ymargin; + + // Remember 1/2 of the font height since we need that later + // as a minimum value for correctly position the markers + $f2 = round($aImg->GetTextHeight('X')/2); + + $grad = new Gradient($aImg); + $patternFactory = null; + + // Now stroke each legend in turn + // Each plot has added the following information to the legend + // p[0] = Legend text + // p[1] = Color, + // p[2] = For markers a reference to the PlotMark object + // p[3] = For lines the line style, for gradient the negative gradient style + // p[4] = CSIM target + // p[5] = CSIM Alt text + $i = 1 ; $row = 0; + foreach($this->txtcol as $p) { + + // STROKE DEBUG BOX + if( _JPG_DEBUG ) { + $aImg->SetLineWeight(1); + $aImg->SetColor('red'); + $aImg->SetLineStyle('solid'); + $aImg->Rectangle($xp,$y1,$xp+$abs_width,$y1+$rowheight[$row]); + } + + $aImg->SetLineWeight($this->weight); + $x1 = round($x1); $y1=round($y1); + if ( !empty($p[2]) && $p[2]->GetType() > -1 ) { + // Make a plot mark legend + $aImg->SetColor($p[1]); + if( is_string($p[3]) || $p[3]>0 ) { + $aImg->SetLineStyle($p[3]); + $aImg->StyleLine($x1-$this->mark_abs_hsize,$y1+$f2,$x1+$this->mark_abs_hsize,$y1+$f2); + } + // Stroke a mark with the standard size + // (As long as it is not an image mark ) + if( $p[2]->GetType() != MARK_IMG ) { + + // Clear any user callbacks since we ont want them called for + // the legend marks + $p[2]->iFormatCallback = ''; + $p[2]->iFormatCallback2 = ''; + + // Since size for circles is specified as the radius + // this means that we must half the size to make the total + // width behave as the other marks + if( $p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE ) { + $p[2]->SetSize(min($this->mark_abs_vsize,$this->mark_abs_hsize)/2); + $p[2]->Stroke($aImg,$x1,$y1+$f2); + } + else { + $p[2]->SetSize(min($this->mark_abs_vsize,$this->mark_abs_hsize)); + $p[2]->Stroke($aImg,$x1,$y1+$f2); + } + } + } + elseif ( !empty($p[2]) && (is_string($p[3]) || $p[3]>0 ) ) { + // Draw a styled line + $aImg->SetColor($p[1]); + $aImg->SetLineStyle($p[3]); + $aImg->StyleLine($x1-1,$y1+$f2,$x1+$this->mark_abs_hsize,$y1+$f2); + $aImg->StyleLine($x1-1,$y1+$f2+1,$x1+$this->mark_abs_hsize,$y1+$f2+1); + } + else { + // Draw a colored box + $color = $p[1] ; + + // We make boxes slightly larger to better show + $boxsize = max($this->mark_abs_vsize,$this->mark_abs_hsize) + 2 ; + + // $y1 is the top border of the "box" we have to draw the marker + // and legend text in. We position the marker in the vertical center + // of this box + $ym = $y1 + round($rowheight[$row]/2)-round($this->mark_abs_vsize/2); + + // We either need to plot a gradient or a + // pattern. To differentiate we use a kludge. + // Patterns have a p[3] value of < -100 + if( $p[3] < -100 ) { + // p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity + if( $patternFactory == null ) { + $patternFactory = new RectPatternFactory(); + } + $prect = $patternFactory->Create($p[1][0],$p[1][1],1); + $prect->SetBackground($p[1][3]); + $prect->SetDensity($p[1][2]+1); + $prect->SetPos(new Rectangle($x1,$ym,$boxsize,$boxsize)); + $prect->Stroke($aImg); + $prect=null; + } + else { + if( is_array($color) && count($color)==2 ) { + // The client want a gradient color + $grad->FilledRectangle($x1,$ym, + $x1+$boxsize,$ym+$boxsize, + $color[0],$color[1],-$p[3]); + } + else { + $aImg->SetColor($p[1]); + $aImg->FilledRectangle($x1,$ym,$x1+$boxsize,$ym+$boxsize); + } + $aImg->SetColor($this->color); + $aImg->SetLineWeight($fillBoxFrameWeight); + $aImg->Rectangle($x1,$ym,$x1+$boxsize,$ym+$boxsize); + } + } + $aImg->SetColor($this->font_color); + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $aImg->SetTextAlign('left','center'); + $aImg->StrokeText(round($x1+$this->mark_abs_hsize+$this->xmargin), + $y1+round($rowheight[$row]/2),$p[0]); + + // Add CSIM for Legend if defined + if( !empty($p[4]) ) { + + $xe = $x1 + $this->xmargin+$this->mark_abs_hsize+$aImg->GetTextWidth($p[0]); + $ye = $y1 + max($this->mark_abs_vsize,$aImg->GetTextHeight($p[0])); + $coords = "$x1,$y1,$xe,$y1,$xe,$ye,$x1,$ye"; + if( ! empty($p[4]) ) { + $this->csimareas .= "csimareas .= " target=\"".$p[6]."\""; + } + + if( !empty($p[5]) ) { + $tmp=sprintf($p[5],$p[0]); + $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimareas .= " />\n"; + } + } + if( $i >= $this->layout_n ) { + $x1 = $xp+round($this->mark_abs_hsize/2)+$this->xlmargin; + $y1 += $rowheight[$row++]; + $i = 1; + } + else { + $x1 += $colwidth[($i-1) % $numcolumns] ; + ++$i; + } + } + } +} // Class + +?> diff --git a/libs/jpgraph/jpgraph_line.php b/libs/jpgraph/jpgraph_line.php index 26eb622..b7b7939 100644 --- a/libs/jpgraph/jpgraph_line.php +++ b/libs/jpgraph/jpgraph_line.php @@ -1,13 +1,13 @@ Plot($datay,$datax); - $this->mark = new PlotMark() ; + parent::__construct($datay,$datax); + $this->mark = new PlotMark() ; + $this->color = ColorFactory::getColor(); + $this->fill_color = $this->color; } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS - // Set style, filled or open - function SetFilled($aFlag=true) { - JpGraphError::RaiseL(10001);//('LinePlot::SetFilled() is deprecated. Use SetFillColor()'); + function SetFilled($aFlg=true) { + $this->filled = $aFlg; } - + function SetBarCenter($aFlag=true) { - $this->barcenter=$aFlag; + $this->barcenter=$aFlag; } function SetStyle($aStyle) { - $this->line_style=$aStyle; + $this->line_style=$aStyle; } - + function SetStepStyle($aFlag=true) { - $this->step_style = $aFlag; + $this->step_style = $aFlag; } - + function SetColor($aColor) { - parent::SetColor($aColor); + parent::SetColor($aColor); } - + function SetFillFromYMin($f=true) { - $this->fillFromMin = $f ; + $this->fillFromMin = $f ; } - + + function SetFillFromYMax($f=true) { + $this->fillFromMax = $f ; + } + function SetFillColor($aColor,$aFilled=true) { - $this->fill_color=$aColor; - $this->filled=$aFilled; + $this->color = $aColor; + $this->fill_color=$aColor; + $this->filled=$aFilled; } function SetFillGradient($aFromColor,$aToColor,$aNumColors=100,$aFilled=true) { - $this->fillgrad_fromcolor = $aFromColor; - $this->fillgrad_tocolor = $aToColor; - $this->fillgrad_numcolors = $aNumColors; - $this->filled = $aFilled; - $this->fillgrad = true; + $this->fillgrad_fromcolor = $aFromColor; + $this->fillgrad_tocolor = $aToColor; + $this->fillgrad_numcolors = $aNumColors; + $this->filled = $aFilled; + $this->fillgrad = true; } - + function Legend($graph) { - if( $this->legend!="" ) { - if( $this->filled && !$this->fillgrad ) { - $graph->legend->Add($this->legend, - $this->fill_color,$this->mark,0, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - elseif( $this->fillgrad ) { - $color=array($this->fillgrad_fromcolor,$this->fillgrad_tocolor); - // In order to differentiate between gradients and cooors specified as an RGB triple - $graph->legend->Add($this->legend,$color,"",-2 /* -GRAD_HOR */, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } else { - $graph->legend->Add($this->legend, - $this->color,$this->mark,$this->line_style, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - } + if( $this->legend!="" ) { + if( $this->filled && !$this->fillgrad ) { + $graph->legend->Add($this->legend, + $this->fill_color,$this->mark,0, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + elseif( $this->fillgrad ) { + $color=array($this->fillgrad_fromcolor,$this->fillgrad_tocolor); + // In order to differentiate between gradients and cooors specified as an RGB triple + $graph->legend->Add($this->legend,$color,"",-2 /* -GRAD_HOR */, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } else { + $graph->legend->Add($this->legend, + $this->color,$this->mark,$this->line_style, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + } } function AddArea($aMin=0,$aMax=0,$aFilled=LP_AREA_NOT_FILLED,$aColor="gray9",$aBorder=LP_AREA_BORDER) { - if($aMin > $aMax) { - // swap - $tmp = $aMin; - $aMin = $aMax; - $aMax = $tmp; - } - $this->filledAreas[] = array($aMin,$aMax,$aColor,$aFilled,$aBorder); + if($aMin > $aMax) { + // swap + $tmp = $aMin; + $aMin = $aMax; + $aMax = $tmp; + } + $this->filledAreas[] = array($aMin,$aMax,$aColor,$aFilled,$aBorder); } - + // Gets called before any axis are stroked function PreStrokeAdjust($graph) { - // If another plot type have already adjusted the - // offset we don't touch it. - // (We check for empty in case the scale is a log scale - // and hence doesn't contain any xlabel_offset) - if( empty($graph->xaxis->scale->ticks->xlabel_offset) || - $graph->xaxis->scale->ticks->xlabel_offset == 0 ) { - if( $this->center ) { - ++$this->numpoints; - $a=0.5; $b=0.5; - } else { - $a=0; $b=0; - } - $graph->xaxis->scale->ticks->SetXLabelOffset($a); - $graph->SetTextScaleOff($b); - //$graph->xaxis->scale->ticks->SupressMinorTickMarks(); - } + // If another plot type have already adjusted the + // offset we don't touch it. + // (We check for empty in case the scale is a log scale + // and hence doesn't contain any xlabel_offset) + if( empty($graph->xaxis->scale->ticks->xlabel_offset) || $graph->xaxis->scale->ticks->xlabel_offset == 0 ) { + if( $this->center ) { + ++$this->numpoints; + $a=0.5; $b=0.5; + } else { + $a=0; $b=0; + } + $graph->xaxis->scale->ticks->SetXLabelOffset($a); + $graph->SetTextScaleOff($b); + //$graph->xaxis->scale->ticks->SupressMinorTickMarks(); + } } - + function SetFastStroke($aFlg=true) { - $this->iFastStroke = $aFlg; + $this->iFastStroke = $aFlg; } function FastStroke($img,$xscale,$yscale,$aStartPoint=0,$exist_x=true) { - // An optimized stroke for many data points with no extra - // features but 60% faster. You can't have values or line styles, or null - // values in plots. - $numpoints=count($this->coords[0]); - if( $this->barcenter ) - $textadj = 0.5-$xscale->text_scale_off; - else - $textadj = 0; + // An optimized stroke for many data points with no extra + // features but 60% faster. You can't have values or line styles, or null + // values in plots. + $numpoints=count($this->coords[0]); + if( $this->barcenter ) { + $textadj = 0.5-$xscale->text_scale_off; + } + else { + $textadj = 0; + } - $img->SetColor($this->color); - $img->SetLineWeight($this->weight); - $pnts=$aStartPoint; - while( $pnts < $numpoints ) { - if( $exist_x ) $x=$this->coords[1][$pnts]; - else $x=$pnts+$textadj; - $xt = $xscale->Translate($x); - $y=$this->coords[0][$pnts]; - $yt = $yscale->Translate($y); - if( is_numeric($y) ) { - $cord[] = $xt; - $cord[] = $yt; - } - elseif( $y == '-' && $pnts > 0 ) { - // Just ignore - } - else { - JpGraphError::RaiseL(10002);//('Plot too complicated for fast line Stroke. Use standard Stroke()'); - } - ++$pnts; - } // WHILE + $img->SetColor($this->color); + $img->SetLineWeight($this->weight); + $pnts=$aStartPoint; + while( $pnts < $numpoints ) { + if( $exist_x ) { + $x=$this->coords[1][$pnts]; + } + else { + $x=$pnts+$textadj; + } + $xt = $xscale->Translate($x); + $y=$this->coords[0][$pnts]; + $yt = $yscale->Translate($y); + if( is_numeric($y) ) { + $cord[] = $xt; + $cord[] = $yt; + } + elseif( $y == '-' && $pnts > 0 ) { + // Just ignore + } + else { + JpGraphError::RaiseL(10002);//('Plot too complicated for fast line Stroke. Use standard Stroke()'); + } + ++$pnts; + } // WHILE - $img->Polygon($cord,false,true); + $img->Polygon($cord,false,true); } - + function Stroke($img,$xscale,$yscale) { - $idx=0; - $numpoints=count($this->coords[0]); - if( isset($this->coords[1]) ) { - if( count($this->coords[1])!=$numpoints ) - JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints); -//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); - else - $exist_x = true; - } - else - $exist_x = false; + $idx=0; + $numpoints=count($this->coords[0]); + if( isset($this->coords[1]) ) { + if( count($this->coords[1])!=$numpoints ) { + JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints); + //("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); + } + else { + $exist_x = true; + } + } + else { + $exist_x = false; + } - if( $this->barcenter ) - $textadj = 0.5-$xscale->text_scale_off; - else - $textadj = 0; + if( $this->barcenter ) { + $textadj = 0.5-$xscale->text_scale_off; + } + else { + $textadj = 0; + } - // Find the first numeric data point - $startpoint=0; - while( $startpoint < $numpoints && !is_numeric($this->coords[0][$startpoint]) ) - ++$startpoint; + // Find the first numeric data point + $startpoint=0; + while( $startpoint < $numpoints && !is_numeric($this->coords[0][$startpoint]) ) { + ++$startpoint; + } - // Bail out if no data points - if( $startpoint == $numpoints ) - return; + // Bail out if no data points + if( $startpoint == $numpoints ) return; - if( $this->iFastStroke ) { - $this->FastStroke($img,$xscale,$yscale,$startpoint,$exist_x); - return; - } + if( $this->iFastStroke ) { + $this->FastStroke($img,$xscale,$yscale,$startpoint,$exist_x); + return; + } - if( $exist_x ) - $xs=$this->coords[1][$startpoint]; - else - $xs= $textadj+$startpoint; + if( $exist_x ) { + $xs=$this->coords[1][$startpoint]; + } + else { + $xs= $textadj+$startpoint; + } - $img->SetStartPoint($xscale->Translate($xs), - $yscale->Translate($this->coords[0][$startpoint])); + $img->SetStartPoint($xscale->Translate($xs), + $yscale->Translate($this->coords[0][$startpoint])); - - if( $this->filled ) { - $min = $yscale->GetMinVal(); - if( $min > 0 || $this->fillFromMin ) - $fillmin = $yscale->scale_abs[0];//Translate($min); - else - $fillmin = $yscale->Translate(0); + if( $this->filled ) { + if( $this->fillFromMax ) { + //$max = $yscale->GetMaxVal(); + $cord[$idx++] = $xscale->Translate($xs); + $cord[$idx++] = $yscale->scale_abs[1]; + } + else { + $min = $yscale->GetMinVal(); + if( $min > 0 || $this->fillFromMin ) { + $fillmin = $yscale->scale_abs[0];//Translate($min); + } + else { + $fillmin = $yscale->Translate(0); + } - $cord[$idx++] = $xscale->Translate($xs); - $cord[$idx++] = $fillmin; - } - $xt = $xscale->Translate($xs); - $yt = $yscale->Translate($this->coords[0][$startpoint]); - $cord[$idx++] = $xt; - $cord[$idx++] = $yt; - $yt_old = $yt; - $xt_old = $xt; - $y_old = $this->coords[0][$startpoint]; + $cord[$idx++] = $xscale->Translate($xs); + $cord[$idx++] = $fillmin; + } + } + $xt = $xscale->Translate($xs); + $yt = $yscale->Translate($this->coords[0][$startpoint]); + $cord[$idx++] = $xt; + $cord[$idx++] = $yt; + $yt_old = $yt; + $xt_old = $xt; + $y_old = $this->coords[0][$startpoint]; - $this->value->Stroke($img,$this->coords[0][$startpoint],$xt,$yt); + $this->value->Stroke($img,$this->coords[0][$startpoint],$xt,$yt); - $img->SetColor($this->color); - $img->SetLineWeight($this->weight); - $img->SetLineStyle($this->line_style); - $pnts=$startpoint+1; - $firstnonumeric = false; + $img->SetColor($this->color); + $img->SetLineWeight($this->weight); + $img->SetLineStyle($this->line_style); + $pnts=$startpoint+1; + $firstnonumeric = false; - while( $pnts < $numpoints ) { - - if( $exist_x ) $x=$this->coords[1][$pnts]; - else $x=$pnts+$textadj; - $xt = $xscale->Translate($x); - $yt = $yscale->Translate($this->coords[0][$pnts]); - - $y=$this->coords[0][$pnts]; - if( $this->step_style ) { - // To handle null values within step style we need to record the - // first non numeric value so we know from where to start if the - // non value is '-'. - if( is_numeric($y) ) { - $firstnonumeric = false; - if( is_numeric($y_old) ) { - $img->StyleLine($xt_old,$yt_old,$xt,$yt_old); - $img->StyleLine($xt,$yt_old,$xt,$yt); - } - elseif( $y_old == '-' ) { - $img->StyleLine($xt_first,$yt_first,$xt,$yt_first); - $img->StyleLine($xt,$yt_first,$xt,$yt); - } - else { - $yt_old = $yt; - $xt_old = $xt; - } - $cord[$idx++] = $xt; - $cord[$idx++] = $yt_old; - $cord[$idx++] = $xt; - $cord[$idx++] = $yt; - } - elseif( $firstnonumeric==false ) { - $firstnonumeric = true; - $yt_first = $yt_old; - $xt_first = $xt_old; - } - } - else { - $tmp1=$y; - $prev=$this->coords[0][$pnts-1]; - if( $tmp1==='' || $tmp1===NULL || $tmp1==='X' ) $tmp1 = 'x'; - if( $prev==='' || $prev===null || $prev==='X' ) $prev = 'x'; + while( $pnts < $numpoints ) { - if( is_numeric($y) || (is_string($y) && $y != '-') ) { - if( is_numeric($y) && (is_numeric($prev) || $prev === '-' ) ) { - $img->StyleLineTo($xt,$yt); - } - else { - $img->SetStartPoint($xt,$yt); - } - } - if( $this->filled && $tmp1 !== '-' ) { - if( $tmp1 === 'x' ) { - $cord[$idx++] = $cord[$idx-3]; - $cord[$idx++] = $fillmin; - } - elseif( $prev === 'x' ) { - $cord[$idx++] = $xt; - $cord[$idx++] = $fillmin; - $cord[$idx++] = $xt; - $cord[$idx++] = $yt; - } - else { - $cord[$idx++] = $xt; - $cord[$idx++] = $yt; - } - } - else { - if( is_numeric($tmp1) && (is_numeric($prev) || $prev === '-' ) ) { - $cord[$idx++] = $xt; - $cord[$idx++] = $yt; - } - } - } - $yt_old = $yt; - $xt_old = $xt; - $y_old = $y; + if( $exist_x ) { + $x=$this->coords[1][$pnts]; + } + else { + $x=$pnts+$textadj; + } + $xt = $xscale->Translate($x); + $yt = $yscale->Translate($this->coords[0][$pnts]); - $this->StrokeDataValue($img,$this->coords[0][$pnts],$xt,$yt); + $y=$this->coords[0][$pnts]; + if( $this->step_style ) { + // To handle null values within step style we need to record the + // first non numeric value so we know from where to start if the + // non value is '-'. + if( is_numeric($y) ) { + $firstnonumeric = false; + if( is_numeric($y_old) ) { + $img->StyleLine($xt_old,$yt_old,$xt,$yt_old); + $img->StyleLine($xt,$yt_old,$xt,$yt); + } + elseif( $y_old == '-' ) { + $img->StyleLine($xt_first,$yt_first,$xt,$yt_first); + $img->StyleLine($xt,$yt_first,$xt,$yt); + } + else { + $yt_old = $yt; + $xt_old = $xt; + } + $cord[$idx++] = $xt; + $cord[$idx++] = $yt_old; + $cord[$idx++] = $xt; + $cord[$idx++] = $yt; + } + elseif( $firstnonumeric==false ) { + $firstnonumeric = true; + $yt_first = $yt_old; + $xt_first = $xt_old; + } + } + else { + $tmp1=$y; + $prev=$this->coords[0][$pnts-1]; + if( $tmp1==='' || $tmp1===NULL || $tmp1==='X' ) $tmp1 = 'x'; + if( $prev==='' || $prev===null || $prev==='X' ) $prev = 'x'; - ++$pnts; - } + if( is_numeric($y) || (is_string($y) && $y != '-') ) { + if( is_numeric($y) && (is_numeric($prev) || $prev === '-' ) ) { + $img->StyleLineTo($xt,$yt); + } + else { + $img->SetStartPoint($xt,$yt); + } + } + if( $this->filled && $tmp1 !== '-' ) { + if( $tmp1 === 'x' ) { + $cord[$idx++] = $cord[$idx-3]; + $cord[$idx++] = $fillmin; + } + elseif( $prev === 'x' ) { + $cord[$idx++] = $xt; + $cord[$idx++] = $fillmin; + $cord[$idx++] = $xt; + $cord[$idx++] = $yt; + } + else { + $cord[$idx++] = $xt; + $cord[$idx++] = $yt; + } + } + else { + if( is_numeric($tmp1) && (is_numeric($prev) || $prev === '-' ) ) { + $cord[$idx++] = $xt; + $cord[$idx++] = $yt; + } + } + } + $yt_old = $yt; + $xt_old = $xt; + $y_old = $y; - if( $this->filled ) { - $cord[$idx++] = $xt; - if( $min > 0 || $this->fillFromMin ) - $cord[$idx++] = $yscale->Translate($min); - else - $cord[$idx++] = $yscale->Translate(0); - if( $this->fillgrad ) { - $img->SetLineWeight(1); - $grad = new Gradient($img); - $grad->SetNumColors($this->fillgrad_numcolors); - $grad->FilledFlatPolygon($cord,$this->fillgrad_fromcolor,$this->fillgrad_tocolor); - $img->SetLineWeight($this->weight); - } - else { - $img->SetColor($this->fill_color); - $img->FilledPolygon($cord); - } - if( $this->line_weight > 0 ) { - $img->SetColor($this->color); - $img->Polygon($cord); - } - } + $this->StrokeDataValue($img,$this->coords[0][$pnts],$xt,$yt); - if(!empty($this->filledAreas)) { + ++$pnts; + } - $minY = $yscale->Translate($yscale->GetMinVal()); - $factor = ($this->step_style ? 4 : 2); + if( $this->filled ) { + $cord[$idx++] = $xt; + if( $this->fillFromMax ) { + $cord[$idx++] = $yscale->scale_abs[1]; + } + else { + if( $min > 0 || $this->fillFromMin ) { + $cord[$idx++] = $yscale->Translate($min); + } + else { + $cord[$idx++] = $yscale->Translate(0); + } + } + if( $this->fillgrad ) { + $img->SetLineWeight(1); + $grad = new Gradient($img); + $grad->SetNumColors($this->fillgrad_numcolors); + $grad->FilledFlatPolygon($cord,$this->fillgrad_fromcolor,$this->fillgrad_tocolor); + $img->SetLineWeight($this->weight); + } + else { + $img->SetColor($this->fill_color); + $img->FilledPolygon($cord); + } + if( $this->line_weight > 0 ) { + $img->SetColor($this->color); + $img->Polygon($cord); + } + } - for($i = 0; $i < sizeof($this->filledAreas); ++$i) { - // go through all filled area elements ordered by insertion - // fill polygon array - $areaCoords[] = $cord[$this->filledAreas[$i][0] * $factor]; - $areaCoords[] = $minY; + if(!empty($this->filledAreas)) { - $areaCoords = - array_merge($areaCoords, - array_slice($cord, - $this->filledAreas[$i][0] * $factor, - ($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor)); - $areaCoords[] = $areaCoords[sizeof($areaCoords)-2]; // last x - $areaCoords[] = $minY; // last y - - if($this->filledAreas[$i][3]) { - $img->SetColor($this->filledAreas[$i][2]); - $img->FilledPolygon($areaCoords); - $img->SetColor($this->color); - } - // Check if we should draw the frame. - // If not we still re-draw the line since it might have been - // partially overwritten by the filled area and it doesn't look - // very good. - // TODO: The behaviour is undefined if the line does not have - // any line at the position of the area. - if( $this->filledAreas[$i][4] ) - $img->Polygon($areaCoords); - else - $img->Polygon($cord); + $minY = $yscale->Translate($yscale->GetMinVal()); + $factor = ($this->step_style ? 4 : 2); - $areaCoords = array(); - } - } + for($i = 0; $i < sizeof($this->filledAreas); ++$i) { + // go through all filled area elements ordered by insertion + // fill polygon array + $areaCoords[] = $cord[$this->filledAreas[$i][0] * $factor]; + $areaCoords[] = $minY; - if( $this->mark->type == -1 || $this->mark->show == false ) - return; + $areaCoords = + array_merge($areaCoords, + array_slice($cord, + $this->filledAreas[$i][0] * $factor, + ($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor)); + $areaCoords[] = $areaCoords[sizeof($areaCoords)-2]; // last x + $areaCoords[] = $minY; // last y - for( $pnts=0; $pnts<$numpoints; ++$pnts) { + if($this->filledAreas[$i][3]) { + $img->SetColor($this->filledAreas[$i][2]); + $img->FilledPolygon($areaCoords); + $img->SetColor($this->color); + } + // Check if we should draw the frame. + // If not we still re-draw the line since it might have been + // partially overwritten by the filled area and it doesn't look + // very good. + if( $this->filledAreas[$i][4] ) { + $img->Polygon($areaCoords); + } + else { + $img->Polygon($cord); + } - if( $exist_x ) $x=$this->coords[1][$pnts]; - else $x=$pnts+$textadj; - $xt = $xscale->Translate($x); - $yt = $yscale->Translate($this->coords[0][$pnts]); + $areaCoords = array(); + } + } - if( is_numeric($this->coords[0][$pnts]) ) { - if( !empty($this->csimtargets[$pnts]) ) { - if( !empty($this->csimwintargets[$pnts]) ) { - $this->mark->SetCSIMTarget($this->csimtargets[$pnts],$this->csimwintargets[$pnts]); - } - else { - $this->mark->SetCSIMTarget($this->csimtargets[$pnts]); - } - $this->mark->SetCSIMAlt($this->csimalts[$pnts]); - } - if( $exist_x ) - $x=$this->coords[1][$pnts]; - else - $x=$pnts; - $this->mark->SetCSIMAltVal($this->coords[0][$pnts],$x); - $this->mark->Stroke($img,$xt,$yt); - $this->csimareas .= $this->mark->GetCSIMAreas(); - } - } + if( $this->mark->type == -1 || $this->mark->show == false ) + return; + + for( $pnts=0; $pnts<$numpoints; ++$pnts) { + + if( $exist_x ) { + $x=$this->coords[1][$pnts]; + } + else { + $x=$pnts+$textadj; + } + $xt = $xscale->Translate($x); + $yt = $yscale->Translate($this->coords[0][$pnts]); + + if( is_numeric($this->coords[0][$pnts]) ) { + if( !empty($this->csimtargets[$pnts]) ) { + if( !empty($this->csimwintargets[$pnts]) ) { + $this->mark->SetCSIMTarget($this->csimtargets[$pnts],$this->csimwintargets[$pnts]); + } + else { + $this->mark->SetCSIMTarget($this->csimtargets[$pnts]); + } + $this->mark->SetCSIMAlt($this->csimalts[$pnts]); + } + if( $exist_x ) { + $x=$this->coords[1][$pnts]; + } + else { + $x=$pnts; + } + $this->mark->SetCSIMAltVal($this->coords[0][$pnts],$x); + $this->mark->Stroke($img,$xt,$yt); + $this->csimareas .= $this->mark->GetCSIMAreas(); + } + } } } // Class //=================================================== // CLASS AccLinePlot -// Description: +// Description: //=================================================== class AccLinePlot extends Plot { protected $plots=null,$nbrplots=0; private $iStartEndZero=true; -//--------------- -// CONSTRUCTOR - function AccLinePlot($plots) { + //--------------- + // CONSTRUCTOR + function __construct($plots) { $this->plots = $plots; - $this->nbrplots = count($plots); - $this->numpoints = $plots[0]->numpoints; + $this->nbrplots = count($plots); + $this->numpoints = $plots[0]->numpoints; - // Verify that all plots have the same number of data points - for( $i=1; $i < $this->nbrplots; ++$i ) { - if( $plots[$i]->numpoints != $this->numpoints ) { - JpGraphError::RaiseL(10003);//('Each plot in an accumulated lineplot must have the same number of data points',0) - } - } + // Verify that all plots have the same number of data points + for( $i=1; $i < $this->nbrplots; ++$i ) { + if( $plots[$i]->numpoints != $this->numpoints ) { + JpGraphError::RaiseL(10003);//('Each plot in an accumulated lineplot must have the same number of data points',0) + } + } - for($i=0; $i < $this->nbrplots; ++$i ) { - $this->LineInterpolate($this->plots[$i]->coords[0]); - } + for($i=0; $i < $this->nbrplots; ++$i ) { + $this->LineInterpolate($this->plots[$i]->coords[0]); + } } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function Legend($graph) { - foreach( $this->plots as $p ) - $p->DoLegend($graph); + foreach( $this->plots as $p ) { + $p->DoLegend($graph); + } } - + function Max() { - list($xmax) = $this->plots[0]->Max(); - $nmax=0; - $n = count($this->plots); - for($i=0; $i < $n; ++$i) { - $nc = count($this->plots[$i]->coords[0]); - $nmax = max($nmax,$nc); - list($x) = $this->plots[$i]->Max(); - $xmax = Max($xmax,$x); - } - for( $i = 0; $i < $nmax; $i++ ) { - // Get y-value for line $i by adding the - // individual bars from all the plots added. - // It would be wrong to just add the - // individual plots max y-value since that - // would in most cases give to large y-value. - $y=$this->plots[0]->coords[0][$i]; - for( $j = 1; $j < $this->nbrplots; $j++ ) { - $y += $this->plots[ $j ]->coords[0][$i]; - } - $ymax[$i] = $y; - } - $ymax = max($ymax); - return array($xmax,$ymax); - } + list($xmax) = $this->plots[0]->Max(); + $nmax=0; + $n = count($this->plots); + for($i=0; $i < $n; ++$i) { + $nc = count($this->plots[$i]->coords[0]); + $nmax = max($nmax,$nc); + list($x) = $this->plots[$i]->Max(); + $xmax = Max($xmax,$x); + } + for( $i = 0; $i < $nmax; $i++ ) { + // Get y-value for line $i by adding the + // individual bars from all the plots added. + // It would be wrong to just add the + // individual plots max y-value since that + // would in most cases give to large y-value. + $y=$this->plots[0]->coords[0][$i]; + for( $j = 1; $j < $this->nbrplots; $j++ ) { + $y += $this->plots[ $j ]->coords[0][$i]; + } + $ymax[$i] = $y; + } + $ymax = max($ymax); + return array($xmax,$ymax); + } function Min() { - $nmax=0; - list($xmin,$ysetmin) = $this->plots[0]->Min(); - $n = count($this->plots); - for($i=0; $i < $n; ++$i) { - $nc = count($this->plots[$i]->coords[0]); - $nmax = max($nmax,$nc); - list($x,$y) = $this->plots[$i]->Min(); - $xmin = Min($xmin,$x); - $ysetmin = Min($y,$ysetmin); - } - for( $i = 0; $i < $nmax; $i++ ) { - // Get y-value for line $i by adding the - // individual bars from all the plots added. - // It would be wrong to just add the - // individual plots min y-value since that - // would in most cases give to small y-value. - $y=$this->plots[0]->coords[0][$i]; - for( $j = 1; $j < $this->nbrplots; $j++ ) { - $y += $this->plots[ $j ]->coords[0][$i]; - } - $ymin[$i] = $y; - } - $ymin = Min($ysetmin,Min($ymin)); - return array($xmin,$ymin); + $nmax=0; + list($xmin,$ysetmin) = $this->plots[0]->Min(); + $n = count($this->plots); + for($i=0; $i < $n; ++$i) { + $nc = count($this->plots[$i]->coords[0]); + $nmax = max($nmax,$nc); + list($x,$y) = $this->plots[$i]->Min(); + $xmin = Min($xmin,$x); + $ysetmin = Min($y,$ysetmin); + } + for( $i = 0; $i < $nmax; $i++ ) { + // Get y-value for line $i by adding the + // individual bars from all the plots added. + // It would be wrong to just add the + // individual plots min y-value since that + // would in most cases give to small y-value. + $y=$this->plots[0]->coords[0][$i]; + for( $j = 1; $j < $this->nbrplots; $j++ ) { + $y += $this->plots[ $j ]->coords[0][$i]; + } + $ymin[$i] = $y; + } + $ymin = Min($ysetmin,Min($ymin)); + return array($xmin,$ymin); } // Gets called before any axis are stroked function PreStrokeAdjust($graph) { - // If another plot type have already adjusted the - // offset we don't touch it. - // (We check for empty in case the scale is a log scale - // and hence doesn't contain any xlabel_offset) - - if( empty($graph->xaxis->scale->ticks->xlabel_offset) || - $graph->xaxis->scale->ticks->xlabel_offset == 0 ) { - if( $this->center ) { - ++$this->numpoints; - $a=0.5; $b=0.5; - } else { - $a=0; $b=0; - } - $graph->xaxis->scale->ticks->SetXLabelOffset($a); - $graph->SetTextScaleOff($b); - $graph->xaxis->scale->ticks->SupressMinorTickMarks(); - } - + // If another plot type have already adjusted the + // offset we don't touch it. + // (We check for empty in case the scale is a log scale + // and hence doesn't contain any xlabel_offset) + + if( empty($graph->xaxis->scale->ticks->xlabel_offset) || + $graph->xaxis->scale->ticks->xlabel_offset == 0 ) { + if( $this->center ) { + ++$this->numpoints; + $a=0.5; $b=0.5; + } else { + $a=0; $b=0; + } + $graph->xaxis->scale->ticks->SetXLabelOffset($a); + $graph->SetTextScaleOff($b); + $graph->xaxis->scale->ticks->SupressMinorTickMarks(); + } + } function SetInterpolateMode($aIntMode) { - $this->iStartEndZero=$aIntMode; + $this->iStartEndZero=$aIntMode; } // Replace all '-' with an interpolated value. We use straightforward @@ -534,66 +578,67 @@ class AccLinePlot extends Plot { // will be replaced by the the first valid data point function LineInterpolate(&$aData) { - $n=count($aData); - $i=0; - - // If first point is undefined we will set it to the same as the first - // valid data - if( $aData[$i]==='-' ) { - // Find the first valid data - while( $i < $n && $aData[$i]==='-' ) { - ++$i; - } - if( $i < $n ) { - for($j=0; $j < $i; ++$j ) { - if( $this->iStartEndZero ) - $aData[$i] = 0; - else - $aData[$j] = $aData[$i]; - } - } - else { - // All '-' => Error - return false; - } - } + $n=count($aData); + $i=0; - while($i < $n) { - while( $i < $n && $aData[$i] !== '-' ) { - ++$i; - } - if( $i < $n ) { - $pstart=$i-1; + // If first point is undefined we will set it to the same as the first + // valid data + if( $aData[$i]==='-' ) { + // Find the first valid data + while( $i < $n && $aData[$i]==='-' ) { + ++$i; + } + if( $i < $n ) { + for($j=0; $j < $i; ++$j ) { + if( $this->iStartEndZero ) + $aData[$i] = 0; + else + $aData[$j] = $aData[$i]; + } + } + else { + // All '-' => Error + return false; + } + } - // Now see how long this segment of '-' are - while( $i < $n && $aData[$i] === '-' ) - ++$i; - if( $i < $n ) { - $pend=$i; - $size=$pend-$pstart; - $k=($aData[$pend]-$aData[$pstart])/$size; - // Replace the segment of '-' with a linear interpolated value. - for($j=1; $j < $size; ++$j ) { - $aData[$pstart+$j] = $aData[$pstart] + $j*$k ; - } - } - else { - // There are no valid end point. The '-' goes all the way to the end - // In that case we just set all the remaining values the the same as the - // last valid data point. - for( $j=$pstart+1; $j < $n; ++$j ) - if( $this->iStartEndZero ) - $aData[$j] = 0; - else - $aData[$j] = $aData[$pstart] ; - } - } - } - return true; + while($i < $n) { + while( $i < $n && $aData[$i] !== '-' ) { + ++$i; + } + if( $i < $n ) { + $pstart=$i-1; + + // Now see how long this segment of '-' are + while( $i < $n && $aData[$i] === '-' ) { + ++$i; + } + if( $i < $n ) { + $pend=$i; + $size=$pend-$pstart; + $k=($aData[$pend]-$aData[$pstart])/$size; + // Replace the segment of '-' with a linear interpolated value. + for($j=1; $j < $size; ++$j ) { + $aData[$pstart+$j] = $aData[$pstart] + $j*$k ; + } + } + else { + // There are no valid end point. The '-' goes all the way to the end + // In that case we just set all the remaining values the the same as the + // last valid data point. + for( $j=$pstart+1; $j < $n; ++$j ) + if( $this->iStartEndZero ) { + $aData[$j] = 0; + } + else { + $aData[$j] = $aData[$pstart] ; + } + } + } + } + return true; } - - // To avoid duplicate of line drawing code here we just // change the y-values for each plot and then restore it // after we have made the stroke. We must do this copy since @@ -601,29 +646,30 @@ class AccLinePlot extends Plot { // with the same graphs, i.e AccLinePlot(array($pl,$pl,$pl)); // since this method would have a side effect. function Stroke($img,$xscale,$yscale) { - $img->SetLineWeight($this->weight); - $this->numpoints = count($this->plots[0]->coords[0]); - // Allocate array - $coords[$this->nbrplots][$this->numpoints]=0; - for($i=0; $i<$this->numpoints; $i++) { - $coords[0][$i]=$this->plots[0]->coords[0][$i]; - $accy=$coords[0][$i]; - for($j=1; $j<$this->nbrplots; ++$j ) { - $coords[$j][$i] = $this->plots[$j]->coords[0][$i]+$accy; - $accy = $coords[$j][$i]; - } - } - for($j=$this->nbrplots-1; $j>=0; --$j) { - $p=$this->plots[$j]; - for( $i=0; $i<$this->numpoints; ++$i) { - $tmp[$i]=$p->coords[0][$i]; - $p->coords[0][$i]=$coords[$j][$i]; - } - $p->Stroke($img,$xscale,$yscale); - for( $i=0; $i<$this->numpoints; ++$i) - $p->coords[0][$i]=$tmp[$i]; - $p->coords[0][]=$tmp; - } + $img->SetLineWeight($this->weight); + $this->numpoints = count($this->plots[0]->coords[0]); + // Allocate array + $coords[$this->nbrplots][$this->numpoints]=0; + for($i=0; $i<$this->numpoints; $i++) { + $coords[0][$i]=$this->plots[0]->coords[0][$i]; + $accy=$coords[0][$i]; + for($j=1; $j<$this->nbrplots; ++$j ) { + $coords[$j][$i] = $this->plots[$j]->coords[0][$i]+$accy; + $accy = $coords[$j][$i]; + } + } + for($j=$this->nbrplots-1; $j>=0; --$j) { + $p=$this->plots[$j]; + for( $i=0; $i<$this->numpoints; ++$i) { + $tmp[$i]=$p->coords[0][$i]; + $p->coords[0][$i]=$coords[$j][$i]; + } + $p->Stroke($img,$xscale,$yscale); + for( $i=0; $i<$this->numpoints; ++$i) { + $p->coords[0][$i]=$tmp[$i]; + } + $p->coords[0][]=$tmp; + } } } // Class diff --git a/libs/jpgraph/jpgraph_log.php b/libs/jpgraph/jpgraph_log.php index 381a0ee..58628c4 100644 --- a/libs/jpgraph/jpgraph_log.php +++ b/libs/jpgraph/jpgraph_log.php @@ -1,13 +1,13 @@ LinearScale($min,$max,$type); - $this->ticks = new LogTicks(); - $this->name = 'log'; + function __construct($min,$max,$type="y") { + parent::__construct($min,$max,$type); + $this->ticks = new LogTicks(); + $this->name = 'log'; } -//---------------- -// PUBLIC METHODS + //---------------- + // PUBLIC METHODS // Translate between world and screen function Translate($a) { - if( !is_numeric($a) ) { - if( $a != '' && $a != '-' && $a != 'x' ) - JpGraphError::RaiseL(11001); -//('Your data contains non-numeric values.'); - return 1; - } - if( $a < 0 ) { - JpGraphError::RaiseL(11002); -//("Negative data values can not be used in a log scale."); - exit(1); - } - if( $a==0 ) $a=1; - $a=log10($a); - return ceil($this->off + ($a*1.0 - $this->scale[0]) * $this->scale_factor); + if( !is_numeric($a) ) { + if( $a != '' && $a != '-' && $a != 'x' ) { + JpGraphError::RaiseL(11001); + // ('Your data contains non-numeric values.'); + } + return 1; + } + if( $a < 0 ) { + JpGraphError::RaiseL(11002); + //("Negative data values can not be used in a log scale."); + exit(1); + } + if( $a==0 ) $a=1; + $a=log10($a); + return ceil($this->off + ($a*1.0 - $this->scale[0]) * $this->scale_factor); } // Relative translate (don't include offset) usefull when we just want - // to know the relative position (in pixels) on the axis + // to know the relative position (in pixels) on the axis function RelTranslate($a) { - if( !is_numeric($a) ) { - if( $a != '' && $a != '-' && $a != 'x' ) - JpGraphError::RaiseL(11001); -//('Your data contains non-numeric values.'); - return 1; - } - if( $a==0 ) $a=1; - $a=log10($a); - return round(($a*1.0 - $this->scale[0]) * $this->scale_factor); + if( !is_numeric($a) ) { + if( $a != '' && $a != '-' && $a != 'x' ) { + JpGraphError::RaiseL(11001); + //('Your data contains non-numeric values.'); + } + return 1; + } + if( $a==0 ) { + $a=1; + } + $a=log10($a); + return round(($a*1.0 - $this->scale[0]) * $this->scale_factor); } - + // Use bcpow() for increased precision function GetMinVal() { - if( function_exists("bcpow") ) - return round(bcpow(10,$this->scale[0],15),14); - else - return round(pow(10,$this->scale[0]),14); + if( function_exists("bcpow") ) { + return round(bcpow(10,$this->scale[0],15),14); + } + else { + return round(pow(10,$this->scale[0]),14); + } } - + function GetMaxVal() { - if( function_exists("bcpow") ) - return round(bcpow(10,$this->scale[1],15),14); - else - return round(pow(10,$this->scale[1]),14); + if( function_exists("bcpow") ) { + return round(bcpow(10,$this->scale[1],15),14); + } + else { + return round(pow(10,$this->scale[1]),14); + } } - + // Logarithmic autoscaling is much simplier since we just // set the min and max to logs of the min and max values. // Note that for log autoscale the "maxstep" the fourth argument // isn't used. This is just included to give the method the same // signature as the linear counterpart. function AutoScale($img,$min,$max,$maxsteps,$majend=true) { - if( $min==0 ) $min=1; - - if( $max <= 0 ) { - JpGraphError::RaiseL(11004); -//('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.'); - } - if( is_numeric($this->autoscale_min) ) { - $smin = round($this->autoscale_min); - $smax = ceil(log10($max)); - if( $min >= $max ) { - JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.'); - } - } - else { - $smin = floor(log10($min)); - if( is_numeric($this->autoscale_max) ) { - $smax = round($this->autoscale_max); - if( $smin >= $smax ) { - JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.'); - } - } - else - $smax = ceil(log10($max)); - } + if( $min==0 ) $min=1; - $this->Update($img,$smin,$smax); + if( $max <= 0 ) { + JpGraphError::RaiseL(11004); + //('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.'); + } + if( is_numeric($this->autoscale_min) ) { + $smin = round($this->autoscale_min); + $smax = ceil(log10($max)); + if( $min >= $max ) { + JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.'); + } + } + else { + $smin = floor(log10($min)); + if( is_numeric($this->autoscale_max) ) { + $smax = round($this->autoscale_max); + if( $smin >= $smax ) { + JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.'); + } + } + else + $smax = ceil(log10($max)); + } + + $this->Update($img,$smin,$smax); } -//--------------- -// PRIVATE METHODS + //--------------- + // PRIVATE METHODS } // Class //=================================================== // CLASS LogTicks -// Description: +// Description: //=================================================== class LogTicks extends Ticks{ private $label_logtype=LOGLABELS_MAGNITUDE; private $ticklabels_pos = array(); -//--------------- -// CONSTRUCTOR + //--------------- + // CONSTRUCTOR function LogTicks() { } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function IsSpecified() { - return true; + return true; } function SetLabelLogType($aType) { - $this->label_logtype = $aType; + $this->label_logtype = $aType; } - + // For log scale it's meaningless to speak about a major step // We just return -1 to make the framework happy (specifically // StrokeLabels() ) function GetMajor() { - return -1; + return -1; } function SetTextLabelStart($aStart) { - JpGraphError::RaiseL(11005); -//('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.'); + JpGraphError::RaiseL(11005); + //('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.'); } function SetXLabelOffset($dummy) { - // For log scales we dont care about XLabel offset + // For log scales we dont care about XLabel offset } // Draw ticks on image "img" using scale "scale". The axis absolute @@ -156,127 +164,141 @@ class LogTicks extends Ticks{ // it specifies the absolute y-coord and for Y-ticks it specified the // absolute x-position. function Stroke($img,$scale,$pos) { - $start = $scale->GetMinVal(); - $limit = $scale->GetMaxVal(); - $nextMajor = 10*$start; - $step = $nextMajor / 10.0; - - - $img->SetLineWeight($this->weight); - - if( $scale->type == "y" ) { - // member direction specified if the ticks should be on - // left or right side. - $a=$pos + $this->direction*$this->GetMinTickAbsSize(); - $a2=$pos + $this->direction*$this->GetMajTickAbsSize(); - - $count=1; - $this->maj_ticks_pos[0]=$scale->Translate($start); - $this->maj_ticklabels_pos[0]=$scale->Translate($start); - if( $this->supress_first ) - $this->maj_ticks_label[0]=""; - else { - if( $this->label_formfunc != '' ) { - $f = $this->label_formfunc; - $this->maj_ticks_label[0]=call_user_func($f,$start); - } - elseif( $this->label_logtype == LOGLABELS_PLAIN ) - $this->maj_ticks_label[0]=$start; - else - $this->maj_ticks_label[0]='10^'.round(log10($start)); - } - $i=1; - for($y=$start; $y<=$limit; $y+=$step,++$count ) { - $ys=$scale->Translate($y); - $this->ticks_pos[]=$ys; - $this->ticklabels_pos[]=$ys; - if( $count % 10 == 0 ) { - if( !$this->supress_tickmarks ) { - if( $this->majcolor!="" ) { - $img->PushColor($this->majcolor); - $img->Line($pos,$ys,$a2,$ys); - $img->PopColor(); - } - else - $img->Line($pos,$ys,$a2,$ys); - } + $start = $scale->GetMinVal(); + $limit = $scale->GetMaxVal(); + $nextMajor = 10*$start; + $step = $nextMajor / 10.0; - $this->maj_ticks_pos[$i]=$ys; - $this->maj_ticklabels_pos[$i]=$ys; - - if( $this->label_formfunc != '' ) { - $f = $this->label_formfunc; - $this->maj_ticks_label[$i]=call_user_func($f,$nextMajor); - } - elseif( $this->label_logtype == 0 ) - $this->maj_ticks_label[$i]=$nextMajor; - else - $this->maj_ticks_label[$i]='10^'.round(log10($nextMajor)); - ++$i; - $nextMajor *= 10; - $step *= 10; - $count=1; - } - else { - if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) { - if( $this->mincolor!="" ) $img->PushColor($this->mincolor); - $img->Line($pos,$ys,$a,$ys); - if( $this->mincolor!="" ) $img->PopColor(); - } - } - } - } - else { - $a=$pos - $this->direction*$this->GetMinTickAbsSize(); - $a2=$pos - $this->direction*$this->GetMajTickAbsSize(); - $count=1; - $this->maj_ticks_pos[0]=$scale->Translate($start); - $this->maj_ticklabels_pos[0]=$scale->Translate($start); - if( $this->supress_first ) - $this->maj_ticks_label[0]=""; - else { - if( $this->label_formfunc != '' ) { - $f = $this->label_formfunc; - $this->maj_ticks_label[0]=call_user_func($f,$start); - } - elseif( $this->label_logtype == 0 ) - $this->maj_ticks_label[0]=$start; - else - $this->maj_ticks_label[0]='10^'.round(log10($start)); - } - $i=1; - for($x=$start; $x<=$limit; $x+=$step,++$count ) { - $xs=$scale->Translate($x); - $this->ticks_pos[]=$xs; - $this->ticklabels_pos[]=$xs; - if( $count % 10 == 0 ) { - if( !$this->supress_tickmarks ) { - $img->Line($xs,$pos,$xs,$a2); - } - $this->maj_ticks_pos[$i]=$xs; - $this->maj_ticklabels_pos[$i]=$xs; - if( $this->label_formfunc != '' ) { - $f = $this->label_formfunc; - $this->maj_ticks_label[$i]=call_user_func($f,$nextMajor); - } - elseif( $this->label_logtype == 0 ) - $this->maj_ticks_label[$i]=$nextMajor; - else - $this->maj_ticks_label[$i]='10^'.round(log10($nextMajor)); - ++$i; - $nextMajor *= 10; - $step *= 10; - $count=1; - } - else { - if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) { - $img->Line($xs,$pos,$xs,$a); - } - } - } - } - return true; + $img->SetLineWeight($this->weight); + + if( $scale->type == "y" ) { + // member direction specified if the ticks should be on + // left or right side. + $a=$pos + $this->direction*$this->GetMinTickAbsSize(); + $a2=$pos + $this->direction*$this->GetMajTickAbsSize(); + + $count=1; + $this->maj_ticks_pos[0]=$scale->Translate($start); + $this->maj_ticklabels_pos[0]=$scale->Translate($start); + if( $this->supress_first ) + $this->maj_ticks_label[0]=""; + else { + if( $this->label_formfunc != '' ) { + $f = $this->label_formfunc; + $this->maj_ticks_label[0]=call_user_func($f,$start); + } + elseif( $this->label_logtype == LOGLABELS_PLAIN ) { + $this->maj_ticks_label[0]=$start; + } + else { + $this->maj_ticks_label[0]='10^'.round(log10($start)); + } + } + $i=1; + for($y=$start; $y<=$limit; $y+=$step,++$count ) { + $ys=$scale->Translate($y); + $this->ticks_pos[]=$ys; + $this->ticklabels_pos[]=$ys; + if( $count % 10 == 0 ) { + if( !$this->supress_tickmarks ) { + if( $this->majcolor!="" ) { + $img->PushColor($this->majcolor); + $img->Line($pos,$ys,$a2,$ys); + $img->PopColor(); + } + else { + $img->Line($pos,$ys,$a2,$ys); + } + } + + $this->maj_ticks_pos[$i]=$ys; + $this->maj_ticklabels_pos[$i]=$ys; + + if( $this->label_formfunc != '' ) { + $f = $this->label_formfunc; + $this->maj_ticks_label[$i]=call_user_func($f,$nextMajor); + } + elseif( $this->label_logtype == 0 ) { + $this->maj_ticks_label[$i]=$nextMajor; + } + else { + $this->maj_ticks_label[$i]='10^'.round(log10($nextMajor)); + } + ++$i; + $nextMajor *= 10; + $step *= 10; + $count=1; + } + else { + if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) { + if( $this->mincolor!="" ) { + $img->PushColor($this->mincolor); + } + $img->Line($pos,$ys,$a,$ys); + if( $this->mincolor!="" ) { + $img->PopColor(); + } + } + } + } + } + else { + $a=$pos - $this->direction*$this->GetMinTickAbsSize(); + $a2=$pos - $this->direction*$this->GetMajTickAbsSize(); + $count=1; + $this->maj_ticks_pos[0]=$scale->Translate($start); + $this->maj_ticklabels_pos[0]=$scale->Translate($start); + if( $this->supress_first ) { + $this->maj_ticks_label[0]=""; + } + else { + if( $this->label_formfunc != '' ) { + $f = $this->label_formfunc; + $this->maj_ticks_label[0]=call_user_func($f,$start); + } + elseif( $this->label_logtype == 0 ) { + $this->maj_ticks_label[0]=$start; + } + else { + $this->maj_ticks_label[0]='10^'.round(log10($start)); + } + } + $i=1; + for($x=$start; $x<=$limit; $x+=$step,++$count ) { + $xs=$scale->Translate($x); + $this->ticks_pos[]=$xs; + $this->ticklabels_pos[]=$xs; + if( $count % 10 == 0 ) { + if( !$this->supress_tickmarks ) { + $img->Line($xs,$pos,$xs,$a2); + } + $this->maj_ticks_pos[$i]=$xs; + $this->maj_ticklabels_pos[$i]=$xs; + + if( $this->label_formfunc != '' ) { + $f = $this->label_formfunc; + $this->maj_ticks_label[$i]=call_user_func($f,$nextMajor); + } + elseif( $this->label_logtype == 0 ) { + $this->maj_ticks_label[$i]=$nextMajor; + } + else { + $this->maj_ticks_label[$i]='10^'.round(log10($nextMajor)); + } + ++$i; + $nextMajor *= 10; + $step *= 10; + $count=1; + } + else { + if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) { + $img->Line($xs,$pos,$xs,$a); + } + } + } + } + return true; } } // Class /* EOF */ diff --git a/libs/jpgraph/jpgraph_meshinterpolate.inc.php b/libs/jpgraph/jpgraph_meshinterpolate.inc.php new file mode 100644 index 0000000..bc9d6f0 --- /dev/null +++ b/libs/jpgraph/jpgraph_meshinterpolate.inc.php @@ -0,0 +1,105 @@ +Linear($aData,$aFactor); +} + +/** + * Utility class to interpolate a given data matrix + * + */ +class MeshInterpolate { + private $data = array(); + + /** + * Calculate the mid points of the given rectangle which has its top left + * corner at $row,$col. The $aFactordecides how many spliots should be done. + * i.e. how many more divisions should be done recursively + * + * @param $row Top left corner of square to work with + * @param $col Top left corner of square to work with + * $param $aFactor In how many subsquare should we split this square. A value of 1 indicates that no action + */ + function IntSquare( $aRow, $aCol, $aFactor ) { + if ( $aFactor <= 1 ) + return; + + $step = pow( 2, $aFactor-1 ); + + $v0 = $this->data[$aRow][$aCol]; + $v1 = $this->data[$aRow][$aCol + $step]; + $v2 = $this->data[$aRow + $step][$aCol]; + $v3 = $this->data[$aRow + $step][$aCol + $step]; + + $this->data[$aRow][$aCol + $step / 2] = ( $v0 + $v1 ) / 2; + $this->data[$aRow + $step / 2][$aCol] = ( $v0 + $v2 ) / 2; + $this->data[$aRow + $step][$aCol + $step / 2] = ( $v2 + $v3 ) / 2; + $this->data[$aRow + $step / 2][$aCol + $step] = ( $v1 + $v3 ) / 2; + $this->data[$aRow + $step / 2][$aCol + $step / 2] = ( $v0 + $v1 + $v2 + $v3 ) / 4; + + $this->IntSquare( $aRow, $aCol, $aFactor-1 ); + $this->IntSquare( $aRow, $aCol + $step / 2, $aFactor-1 ); + $this->IntSquare( $aRow + $step / 2, $aCol, $aFactor-1 ); + $this->IntSquare( $aRow + $step / 2, $aCol + $step / 2, $aFactor-1 ); + } + + /** + * Interpolate values in a matrice so that the total number of data points + * in vert and horizontal axis are $aIntNbr more. For example $aIntNbr=2 will + * make the data matrice have tiwce as many vertical and horizontal dta points. + * + * Note: This will blow up the matrcide in memory size in the order of $aInNbr^2 + * + * @param $ &$aData The original data matricde + * @param $aInNbr Interpolation factor + * @return the interpolated matrice + */ + function Linear( &$aData, $aIntFactor ) { + $step = pow( 2, $aIntFactor-1 ); + + $orig_cols = count( $aData[0] ); + $orig_rows = count( $aData ); + // Number of new columns/rows + // N = (a-1) * 2^(f-1) + 1 + $p = pow( 2, $aIntFactor-1 ); + $new_cols = $p * ( $orig_cols - 1 ) + 1; + $new_rows = $p * ( $orig_rows - 1 ) + 1; + + $this->data = array_fill( 0, $new_rows, array_fill( 0, $new_cols, 0 ) ); + // Initialize the new matrix with the values that we know + for ( $i = 0; $i < $new_rows; $i++ ) { + for ( $j = 0; $j < $new_cols; $j++ ) { + $v = 0 ; + if ( ( $i % $step == 0 ) && ( $j % $step == 0 ) ) { + $v = $aData[$i / $step][$j / $step]; + } + $this->data[$i][$j] = $v; + } + } + + for ( $i = 0; $i < $new_rows-1; $i += $step ) { + for ( $j = 0; $j < $new_cols-1; $j += $step ) { + $this->IntSquare( $i, $j, $aIntFactor ); + } + } + + return $this->data; + } +} + +?> diff --git a/libs/jpgraph/jpgraph_mgraph.php b/libs/jpgraph/jpgraph_mgraph.php index d701371..fbd8f5d 100644 --- a/libs/jpgraph/jpgraph_mgraph.php +++ b/libs/jpgraph/jpgraph_mgraph.php @@ -1,387 +1,345 @@ iWidth = $aWidth; - $this->iHeight = $aHeight; + function __construct($aWidth=NULL,$aHeight=NULL,$aCachedName='',$aTimeOut=0,$aInline=true) { + $this->iWidth = $aWidth; + $this->iHeight = $aHeight; + + // If the cached version exist just read it directly from the + // cache, stream it back to browser and exit + if( $aCachedName!='' && READ_CACHE && $aInline ) { + $this->cache = new ImgStreamCache(); + $this->cache->SetTimeOut($aTimeOut); + $image = new Image(); + if( $this->cache->GetAndStream($image,$aCachedName) ) { + exit(); + } + } + $this->inline = $aInline; + $this->cache_name = $aCachedName; + + $this->title = new Text(); + $this->title->ParagraphAlign('center'); + $this->title->SetFont(FF_FONT2,FS_BOLD); + $this->title->SetMargin(3); + $this->title->SetAlign('center'); + + $this->subtitle = new Text(); + $this->subtitle->ParagraphAlign('center'); + $this->subtitle->SetFont(FF_FONT1,FS_BOLD); + $this->subtitle->SetMargin(3); + $this->subtitle->SetAlign('center'); + + $this->subsubtitle = new Text(); + $this->subsubtitle->ParagraphAlign('center'); + $this->subsubtitle->SetFont(FF_FONT1,FS_NORMAL); + $this->subsubtitle->SetMargin(3); + $this->subsubtitle->SetAlign('center'); + + $this->footer = new Footer(); + } // Specify background fill color for the combined graph function SetFillColor($aColor) { - $this->iFillColor = $aColor; + $this->iFillColor = $aColor; } // Add a frame around the combined graph function SetFrame($aFlg,$aColor='black',$aWeight=1) { - $this->iDoFrame = $aFlg; - $this->iFrameColor = $aColor; - $this->iFrameWeight = $aWeight; + $this->iDoFrame = $aFlg; + $this->iFrameColor = $aColor; + $this->iFrameWeight = $aWeight; } - // Specify a background image blend + // Specify a background image blend function SetBackgroundImageMix($aMix) { - $this->background_image_mix = $aMix ; + $this->background_image_mix = $aMix ; } // Specify a background image function SetBackgroundImage($aFileName,$aCenter_aX=NULL,$aY=NULL) { - // Second argument can be either a boolean value or - // a numeric - $aCenter=TRUE; - $aX=NULL; + // Second argument can be either a boolean value or + // a numeric + $aCenter=TRUE; + $aX=NULL; - if( $GLOBALS['gd2'] && !USE_TRUECOLOR ) { - JpGraphError::RaiseL(12001); -//("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x you must enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts."); - } - if( is_numeric($aCenter_aX) ) { - $aX=$aCenter_aX; - } + if( is_numeric($aCenter_aX) ) { + $aX=$aCenter_aX; + } - // Get extension to determine image type - $e = explode('.',$aFileName); - if( !$e ) { - JpGraphError::RaiseL(12002,$aFileName); -//('Incorrect file name for MGraph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type'); - } - - $valid_formats = array('png', 'jpg', 'gif'); - $aImgFormat = strtolower($e[count($e)-1]); - if ($aImgFormat == 'jpeg') { - $aImgFormat = 'jpg'; - } - elseif (!in_array($aImgFormat, $valid_formats) ) { - JpGraphError::RaiseL(12003,$aImgFormat,$aFileName); -//('Unknown file extension ($aImgFormat) in MGraph::SetBackgroundImage() for filename: '.$aFileName); - } + // Get extension to determine image type + $e = explode('.',$aFileName); + if( !$e ) { + JpGraphError::RaiseL(12002,$aFileName); + //('Incorrect file name for MGraph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type'); + } - $this->background_image = $aFileName; - $this->background_image_center=$aCenter; - $this->background_image_format=$aImgFormat; - $this->background_image_x = $aX; - $this->background_image_y = $aY; + $valid_formats = array('png', 'jpg', 'gif'); + $aImgFormat = strtolower($e[count($e)-1]); + if ($aImgFormat == 'jpeg') { + $aImgFormat = 'jpg'; + } + elseif (!in_array($aImgFormat, $valid_formats) ) { + JpGraphError::RaiseL(12003,$aImgFormat,$aFileName); + //('Unknown file extension ($aImgFormat) in MGraph::SetBackgroundImage() for filename: '.$aFileName); + } + + $this->background_image = $aFileName; + $this->background_image_center=$aCenter; + $this->background_image_format=$aImgFormat; + $this->background_image_x = $aX; + $this->background_image_y = $aY; } - - // Private helper function for backgound image - function _loadBkgImage($aFile='') { - if( $aFile == '' ) - $aFile = $this->background_image; - - // Remove case sensitivity and setup appropriate function to create image - // Get file extension. This should be the LAST '.' separated part of the filename - $e = explode('.',$aFile); - $ext = strtolower($e[count($e)-1]); - if ($ext == "jpeg") { - $ext = "jpg"; - } - - if( trim($ext) == '' ) - $ext = 'png'; // Assume PNG if no extension specified - - $supported = imagetypes(); - if( ( $ext == 'jpg' && !($supported & IMG_JPG) ) || - ( $ext == 'gif' && !($supported & IMG_GIF) ) || - ( $ext == 'png' && !($supported & IMG_PNG) ) ) { - JpGraphError::RaiseL(12004,$aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. '); - } - - if( $ext == "jpg" || $ext == "jpeg") { - $f = "imagecreatefromjpeg"; - $ext = "jpg"; - } - else { - $f = "imagecreatefrom".$ext; - } - - $img = @$f($aFile); - if( !$img ) { - JpGraphError::RaiseL(12005,$aFile); -//(" Can't read background image: '".$aFile."'"); - } - return $img; - } - function _strokeBackgroundImage() { - if( $this->background_image == '' ) - return; + if( $this->background_image == '' ) return; - $bkgimg = $this->_loadBkgImage(); - // Background width & Heoght - $bw = imagesx($bkgimg); - $bh = imagesy($bkgimg); - // Canvas width and height - $cw = imagesx($this->img); - $ch = imagesy($this->img); + $bkgimg = Graph::LoadBkgImage('',$this->background_image); - if( $this->background_image_x === NULL || $this->background_image_y === NULL ) { - if( $this->background_image_center ) { - // Center original image in the plot area - $x = round($cw/2-$bw/2); $y = round($ch/2-$bh/2); - } - else { - // Just copy the image from left corner, no resizing - $x=0; $y=0; - } - } - else { - $x = $this->background_image_x; - $y = $this->background_image_y; - } - $this->_imageCp($bkgimg,$x,$y,0,0,$bw,$bh,$this->background_image_mix); - } + // Background width & Heoght + $bw = imagesx($bkgimg); + $bh = imagesy($bkgimg); - function _imageCp($aSrcImg,$x,$y,$fx,$fy,$w,$h,$mix=100) { - imagecopymerge($this->img,$aSrcImg,$x,$y,$fx,$fy,$w,$h,$mix); - } + // Canvas width and height + $cw = imagesx($this->img); + $ch = imagesy($this->img); - function _imageCreate($aWidth,$aHeight) { - if( $aWidth <= 1 || $aHeight <= 1 ) { - JpGraphError::RaiseL(12006,$aWidth,$aHeight); -//("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)"); - } - if( @$GLOBALS['gd2']==true && USE_TRUECOLOR ) { - $this->img = @imagecreatetruecolor($aWidth, $aHeight); - if( $this->img < 1 ) { - JpGraphError::RaiseL(12011); -// die("JpGraph Error: Can't create truecolor image. Check that you really have GD2 library installed."); - } - ImageAlphaBlending($this->img,true); - } else { - $this->img = @imagecreate($aWidth, $aHeight); - if( $this->img < 1 ) { - JpGraphError::RaiseL(12012); -// die("JpGraph Error: Can't create image. Check that you really have the GD library installed."); - } - } - } + if( $this->doshadow ) { + $cw -= $this->shadow_width; + $ch -= $this->shadow_width; + } - function _polygon($p,$closed=FALSE) { - if( $this->iLineWeight==0 ) return; - $n=count($p); - $oldx = $p[0]; - $oldy = $p[1]; - for( $i=2; $i < $n; $i+=2 ) { - imageline($this->img,$oldx,$oldy,$p[$i],$p[$i+1],$this->iCurrentColor); - $oldx = $p[$i]; - $oldy = $p[$i+1]; - } - if( $closed ) { - imageline($this->img,$p[$n*2-2],$p[$n*2-1],$p[0],$p[1],$this->iCurrentColor); - } - } - - function _filledPolygon($pts) { - $n=count($pts); - for($i=0; $i < $n; ++$i) - $pts[$i] = round($pts[$i]); - imagefilledpolygon($this->img,$pts,count($pts)/2,$this->iCurrentColor); - } - - function _rectangle($xl,$yu,$xr,$yl) { - for($i=0; $i < $this->iLineWeight; ++$i ) - $this->_polygon(array($xl+$i,$yu+$i,$xr-$i,$yu+$i, - $xr-$i,$yl-$i,$xl+$i,$yl-$i, - $xl+$i,$yu+$i)); - } - - function _filledRectangle($xl,$yu,$xr,$yl) { - $this->_filledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl)); - } - - function _setColor($aColor) { - $this->iCurrentColor = $this->iRGB->Allocate($aColor); + if( $this->background_image_x === NULL || $this->background_image_y === NULL ) { + if( $this->background_image_center ) { + // Center original image in the plot area + $x = round($cw/2-$bw/2); $y = round($ch/2-$bh/2); + } + else { + // Just copy the image from left corner, no resizing + $x=0; $y=0; + } + } + else { + $x = $this->background_image_x; + $y = $this->background_image_y; + } + imagecopymerge($this->img,$bkgimg,$x,$y,0,0,$bw,$bh,$this->background_image_mix); } function AddMix($aGraph,$x=0,$y=0,$mix=100,$fx=0,$fy=0,$w=0,$h=0) { - $this->_gdImgHandle($aGraph->Stroke( _IMG_HANDLER),$x,$y,$fx=0,$fy=0,$w,$h,$mix); + $this->_gdImgHandle($aGraph->Stroke( _IMG_HANDLER),$x,$y,$fx=0,$fy=0,$w,$h,$mix); } - + function Add($aGraph,$x=0,$y=0,$fx=0,$fy=0,$w=0,$h=0) { - $this->_gdImgHandle($aGraph->Stroke( _IMG_HANDLER),$x,$y,$fx=0,$fy=0,$w,$h); + $this->_gdImgHandle($aGraph->Stroke( _IMG_HANDLER),$x,$y,$fx=0,$fy=0,$w,$h); } function _gdImgHandle($agdCanvas,$x,$y,$fx=0,$fy=0,$w=0,$h=0,$mix=100) { - if( $w == 0 ) $w = @imagesx($agdCanvas); - if( $w === NULL ) { - JpGraphError::RaiseL(12007); -//('Argument to MGraph::Add() is not a valid GD image handle.'); - return; - } - if( $h == 0 ) $h = @imagesy($agdCanvas); - $this->iGraphs[$this->iCnt++] = array($agdCanvas,$x,$y,$fx,$fy,$w,$h,$mix); + if( $w == 0 ) { + $w = @imagesx($agdCanvas); + } + if( $w === NULL ) { + JpGraphError::RaiseL(12007); + //('Argument to MGraph::Add() is not a valid GD image handle.'); + return; + } + if( $h == 0 ) { + $h = @imagesy($agdCanvas); + } + $this->iGraphs[$this->iCnt++] = array($agdCanvas,$x,$y,$fx,$fy,$w,$h,$mix); } function SetMargin($lm,$rm,$tm,$bm) { - $this->lm = $lm; - $this->rm = $rm; - $this->tm = $tm; - $this->bm = $bm; + $this->lm = $lm; + $this->rm = $rm; + $this->tm = $tm; + $this->bm = $bm; } function SetExpired($aFlg=true) { - $this->expired = $aFlg; - } - - // Generate image header - function Headers() { - - // In case we are running from the command line with the client version of - // PHP we can't send any headers. - $sapi = php_sapi_name(); - if( $sapi == 'cli' ) - return; - - if( headers_sent() ) { - - echo "
JpGraph Error: -HTTP headers have already been sent.
Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it's image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).

Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser.

For example it is a common mistake to leave a blank line before the opening \"<?php\".

"; - - die(); - - } - - if ($this->expired) { - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); - header("Cache-Control: no-cache, must-revalidate"); - header("Pragma: no-cache"); - } - header("Content-type: image/$this->img_format"); + $this->expired = $aFlg; } function SetImgFormat($aFormat,$aQuality=75) { - $this->image_quality = $aQuality; - $aFormat = strtolower($aFormat); - $tst = true; - $supported = imagetypes(); - if( $aFormat=="auto" ) { - if( $supported & IMG_PNG ) - $this->img_format="png"; - elseif( $supported & IMG_JPG ) - $this->img_format="jpeg"; - elseif( $supported & IMG_GIF ) - $this->img_format="gif"; - else - JpGraphError::RaiseL(12008); -//(" Your PHP (and GD-lib) installation does not appear to support any known graphic formats.". - return true; - } - else { - if( $aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif" ) { - if( $aFormat=="jpeg" && !($supported & IMG_JPG) ) - $tst=false; - elseif( $aFormat=="png" && !($supported & IMG_PNG) ) - $tst=false; - elseif( $aFormat=="gif" && !($supported & IMG_GIF) ) - $tst=false; - else { - $this->img_format=$aFormat; - return true; - } - } - else - $tst=false; - if( !$tst ) - JpGraphError::RaiseL(12009,$aFormat); -//(" Your PHP installation does not support the chosen graphic format: $aFormat"); - } + $this->image_format = $aFormat; + $this->image_quality = $aQuality; } - // Stream image to browser or to file - function Stream($aFile="") { - $func="image".$this->img_format; - if( $this->img_format=="jpeg" && $this->image_quality != null ) { - $res = @$func($this->img,$aFile,$this->image_quality); - } - else { - if( $aFile != "" ) { - $res = @$func($this->img,$aFile); - } - else - $res = @$func($this->img); - } - if( !$res ) - JpGraphError::RaiseL(12010,$aFile); -//("Can't create or stream image to file $aFile Check that PHP has enough permission to write a file to the current directory."); + // Set the shadow around the whole image + function SetShadow($aShowShadow=true,$aShadowWidth=4,$aShadowColor='gray@0.3') { + $this->doshadow = $aShowShadow; + $this->shadow_color = $aShadowColor; + $this->shadow_width = $aShadowWidth; + $this->footer->iBottomMargin += $aShadowWidth; + $this->footer->iRightMargin += $aShadowWidth; + } + + function StrokeTitle($image,$w,$h) { + // Stroke title + if( $this->title->t !== '' ) { + + $margin = 3; + + $y = $this->title->margin; + if( $this->title->halign == 'center' ) { + $this->title->Center(0,$w,$y); + } + elseif( $this->title->halign == 'left' ) { + $this->title->SetPos($this->title->margin+2,$y); + } + elseif( $this->title->halign == 'right' ) { + $indent = 0; + if( $this->doshadow ) { + $indent = $this->shadow_width+2; + } + $this->title->SetPos($w-$this->title->margin-$indent,$y,'right'); + } + $this->title->Stroke($image); + + // ... and subtitle + $y += $this->title->GetTextHeight($image) + $margin + $this->subtitle->margin; + if( $this->subtitle->halign == 'center' ) { + $this->subtitle->Center(0,$w,$y); + } + elseif( $this->subtitle->halign == 'left' ) { + $this->subtitle->SetPos($this->subtitle->margin+2,$y); + } + elseif( $this->subtitle->halign == 'right' ) { + $indent = 0; + if( $this->doshadow ) { + $indent = $this->shadow_width+2; + } + $this->subtitle->SetPos($this->img->width-$this->subtitle->margin-$indent,$y,'right'); + } + $this->subtitle->Stroke($image); + + // ... and subsubtitle + $y += $this->subtitle->GetTextHeight($image) + $margin + $this->subsubtitle->margin; + if( $this->subsubtitle->halign == 'center' ) { + $this->subsubtitle->Center(0,$w,$y); + } + elseif( $this->subsubtitle->halign == 'left' ) { + $this->subsubtitle->SetPos($this->subsubtitle->margin+2,$y); + } + elseif( $this->subsubtitle->halign == 'right' ) { + $indent = 0; + if( $this->doshadow ) { + $indent = $this->shadow_width+2; + } + $this->subsubtitle->SetPos($w-$this->subsubtitle->margin-$indent,$y,'right'); + } + $this->subsubtitle->Stroke($image); + + } } function Stroke($aFileName='') { - // Find out the necessary size for the container image - $w=0; $h=0; - for($i=0; $i < $this->iCnt; ++$i ) { - $maxw = $this->iGraphs[$i][1]+$this->iGraphs[$i][5]; - $maxh = $this->iGraphs[$i][2]+$this->iGraphs[$i][6]; - $w = max( $w, $maxw ); - $h = max( $h, $maxh ); - } - $w += $this->lm+$this->rm; - $h += $this->tm+$this->bm; + // Find out the necessary size for the container image + $w=0; $h=0; + for($i=0; $i < $this->iCnt; ++$i ) { + $maxw = $this->iGraphs[$i][1]+$this->iGraphs[$i][5]; + $maxh = $this->iGraphs[$i][2]+$this->iGraphs[$i][6]; + $w = max( $w, $maxw ); + $h = max( $h, $maxh ); + } + $w += $this->lm+$this->rm; + $h += $this->tm+$this->bm; - // User specified width,height overrides - if( $this->iWidth !== NULL ) $w = $this->iWidth; - if( $this->iHeight!== NULL ) $h = $this->iHeight; + // User specified width,height overrides + if( $this->iWidth !== NULL && $this->iWidth !== 0 ) $w = $this->iWidth; + if( $this->iHeight!== NULL && $this->iHeight !== 0) $h = $this->iHeight; - $this->_imageCreate($w,$h); - $this->iRGB = new RGB($this->img); + if( $this->doshadow ) { + $w += $this->shadow_width; + $h += $this->shadow_width; + } - $this->_setcolor($this->iFillColor); - $this->_filledRectangle(0,0,$w-1,$h-1); + $image = new Image($w,$h); + $image->SetImgFormat( $this->image_format,$this->image_quality); - $this->_strokeBackgroundImage(); + if( $this->doshadow ) { + $image->SetColor($this->iFrameColor); + $image->ShadowRectangle(0,0,$w-1,$h-1,$this->iFillColor,$this->shadow_width,$this->shadow_color); + $w -= $this->shadow_width; + $h -= $this->shadow_width; + } + else { + $image->SetColor($this->iFillColor); + $image->FilledRectangle(0,0,$w-1,$h-1); + } + $image->SetExpired($this->expired); - if( $this->iDoFrame ) { - $this->_setColor($this->iFrameColor); - $this->iLineWeight=$this->iFrameWeight; - $this->_rectangle(0,0,$w-1,$h-1); - } + $this->img = $image->img; + $this->_strokeBackgroundImage(); - // Copy all sub graphs to the container - for($i=0; $i < $this->iCnt; ++$i ) { - $this->_imageCp($this->iGraphs[$i][0], - $this->iGraphs[$i][1]+$this->lm,$this->iGraphs[$i][2]+$this->tm, - $this->iGraphs[$i][3],$this->iGraphs[$i][4], - $this->iGraphs[$i][5],$this->iGraphs[$i][6], - $this->iGraphs[$i][7]); - } + if( $this->iDoFrame && ! $this->doshadow ) { + $image->SetColor($this->iFrameColor); + $image->SetLineWeight($this->iFrameWeight); + $image->Rectangle(0,0,$w-1,$h-1); + } - // Output image - if( $aFileName == _IMG_HANDLER ) { - return $this->img; - } - else { - $this->Headers(); - $this->Stream($aFileName); - } + // Copy all sub graphs to the container + for($i=0; $i < $this->iCnt; ++$i ) { + $image->CopyMerge($this->iGraphs[$i][0], + $this->iGraphs[$i][1]+$this->lm,$this->iGraphs[$i][2]+$this->tm, + $this->iGraphs[$i][3],$this->iGraphs[$i][4], + $this->iGraphs[$i][5],$this->iGraphs[$i][6], + -1,-1, /* Full from width and height */ + $this->iGraphs[$i][7]); + + + } + + $this->StrokeTitle($image,$w,$h); + $this->footer->Stroke($image); + + // Output image + if( $aFileName == _IMG_HANDLER ) { + return $image->img; + } + else { + //Finally stream the generated picture + $this->cache = new ImgStreamCache(); + $this->cache->PutAndStream($image,$this->cache_name,$this->inline,$aFileName); + } } } +// EOF + ?> diff --git a/libs/jpgraph/jpgraph_pie.php b/libs/jpgraph/jpgraph_pie.php index 0a9c57d..e0aa651 100644 --- a/libs/jpgraph/jpgraph_pie.php +++ b/libs/jpgraph/jpgraph_pie.php @@ -1,21 +1,21 @@ array(136,34,40,45,46,62,63,134,74,10,120,136,141,168,180,77,209,218,346,395,89,430), - "pastel" => array(27,415,128,59,66,79,105,110,42,147,152,230,236,240,331,337,405,38), - "water" => array(8,370,24,40,335,56,213,237,268,14,326,387,10,388), - "sand" => array(27,168,34,170,19,50,65,72,131,209,46,393)); + "earth" => array(136,34,40,45,46,62,63,134,74,10,120,136,141,168,180,77,209,218,346,395,89,430), + "pastel" => array(27,415,128,59,66,79,105,110,42,147,152,230,236,240,331,337,405,38), + "water" => array(8,370,24,40,335,56,213,237,268,14,326,387,10,388), + "sand" => array(27,168,34,170,19,50,65,72,131,209,46,393)); protected $theme="earth"; protected $setslicecolors=array(); protected $labeltype=0; // Default to percentage @@ -53,1149 +53,1164 @@ class PiePlot { protected $guidelinemargin=10,$iShowGuideLineForSingle = false; protected $iGuideLineCurve = false,$iGuideVFactor=1.4,$iGuideLineRFactor=0.8; protected $la = array(); // Holds the exact angle for each label - -//--------------- -// CONSTRUCTOR - function PiePlot($data) { - $this->data = array_reverse($data); - $this->title = new Text(""); - $this->title->SetFont(FF_FONT1,FS_BOLD); - $this->value = new DisplayValue(); - $this->value->Show(); - $this->value->SetFormat('%.1f%%'); - $this->guideline = new LineProperty(); + + //--------------- + // CONSTRUCTOR + function __construct($data) { + $this->data = array_reverse($data); + $this->title = new Text(""); + $this->title->SetFont(FF_FONT1,FS_BOLD); + $this->value = new DisplayValue(); + $this->value->Show(); + $this->value->SetFormat('%.1f%%'); + $this->guideline = new LineProperty(); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function SetCenter($x,$y=0.5) { - $this->posx = $x; - $this->posy = $y; + $this->posx = $x; + $this->posy = $y; } // Enable guideline and set drwaing policy function SetGuideLines($aFlg=true,$aCurved=true,$aAlways=false) { - $this->guideline->Show($aFlg); - $this->iShowGuideLineForSingle = $aAlways; - $this->iGuideLineCurve = $aCurved; + $this->guideline->Show($aFlg); + $this->iShowGuideLineForSingle = $aAlways; + $this->iGuideLineCurve = $aCurved; } // Adjuste the distance between labels and labels and pie function SetGuideLinesAdjust($aVFactor,$aRFactor=0.8) { - $this->iGuideVFactor=$aVFactor; - $this->iGuideLineRFactor=$aRFactor; + $this->iGuideVFactor=$aVFactor; + $this->iGuideLineRFactor=$aRFactor; } function SetColor($aColor) { - $this->color = $aColor; + $this->color = $aColor; } - + function SetSliceColors($aColors) { - $this->setslicecolors = $aColors; + $this->setslicecolors = $aColors; } - + function SetShadow($aColor='darkgray',$aDropWidth=4) { - $this->ishadowcolor = $aColor; - $this->ishadowdrop = $aDropWidth; + $this->ishadowcolor = $aColor; + $this->ishadowdrop = $aDropWidth; } function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') { - $this->csimtargets=array_reverse($aTargets); - if( is_array($aWinTargets) ) - $this->csimwintargets=array_reverse($aWinTargets); - if( is_array($aAlts) ) - $this->csimalts=array_reverse($aAlts); + $this->csimtargets=array_reverse($aTargets); + if( is_array($aWinTargets) ) + $this->csimwintargets=array_reverse($aWinTargets); + if( is_array($aAlts) ) + $this->csimalts=array_reverse($aAlts); } - + function GetCSIMareas() { - return $this->csimareas; + return $this->csimareas; } - function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) { + function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) { //Slice number, ellipse centre (x,y), height, width, start angle, end angle - while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI; - while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI; + while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI; + while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI; - $sa = 2*M_PI - $sa; - $ea = 2*M_PI - $ea; + $sa = 2*M_PI - $sa; + $ea = 2*M_PI - $ea; - // Special case when we have only one slice since then both start and end - // angle will be == 0 - if( abs($sa - $ea) < 0.0001 ) { - $sa=2*M_PI; $ea=0; - } + // Special case when we have only one slice since then both start and end + // angle will be == 0 + if( abs($sa - $ea) < 0.0001 ) { + $sa=2*M_PI; $ea=0; + } - //add coordinates of the centre to the map - $xc = floor($xc);$yc=floor($yc); - $coords = "$xc, $yc"; + //add coordinates of the centre to the map + $xc = floor($xc);$yc=floor($yc); + $coords = "$xc, $yc"; - //add coordinates of the first point on the arc to the map - $xp = floor(($radius*cos($ea))+$xc); - $yp = floor($yc-$radius*sin($ea)); - $coords.= ", $xp, $yp"; - - //add coordinates every 0.2 radians - $a=$ea+0.2; + //add coordinates of the first point on the arc to the map + $xp = floor(($radius*cos($ea))+$xc); + $yp = floor($yc-$radius*sin($ea)); + $coords.= ", $xp, $yp"; - // If we cross the 360-limit with a slice we need to handle - // the fact that end angle is smaller than start - if( $sa < $ea ) { - while ($a <= 2*M_PI) { - $xp = floor($radius*cos($a)+$xc); - $yp = floor($yc-$radius*sin($a)); - $coords.= ", $xp, $yp"; - $a += 0.2; - } - $a -= 2*M_PI; - } + //add coordinates every 0.2 radians + $a=$ea+0.2; + + // If we cross the 360-limit with a slice we need to handle + // the fact that end angle is smaller than start + if( $sa < $ea ) { + while ($a <= 2*M_PI) { + $xp = floor($radius*cos($a)+$xc); + $yp = floor($yc-$radius*sin($a)); + $coords.= ", $xp, $yp"; + $a += 0.2; + } + $a -= 2*M_PI; + } - while ($a < $sa) { - $xp = floor($radius*cos($a)+$xc); - $yp = floor($yc-$radius*sin($a)); - $coords.= ", $xp, $yp"; - $a += 0.2; - } - - //Add the last point on the arc - $xp = floor($radius*cos($sa)+$xc); - $yp = floor($yc-$radius*sin($sa)); - $coords.= ", $xp, $yp"; - if( !empty($this->csimtargets[$i]) ) { - $this->csimareas .= "csimtargets[$i]."\""; - $tmp=""; - if( !empty($this->csimwintargets[$i]) ) { - $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; - } - if( !empty($this->csimalts[$i]) ) { - $tmp=sprintf($this->csimalts[$i],$this->data[$i]); - $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimareas .= " />\n"; - } + while ($a < $sa) { + $xp = floor($radius*cos($a)+$xc); + $yp = floor($yc-$radius*sin($a)); + $coords.= ", $xp, $yp"; + $a += 0.2; + } + + //Add the last point on the arc + $xp = floor($radius*cos($sa)+$xc); + $yp = floor($yc-$radius*sin($sa)); + $coords.= ", $xp, $yp"; + if( !empty($this->csimtargets[$i]) ) { + $this->csimareas .= "csimtargets[$i]."\""; + $tmp=""; + if( !empty($this->csimwintargets[$i]) ) { + $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; + } + if( !empty($this->csimalts[$i]) ) { + $tmp=sprintf($this->csimalts[$i],$this->data[$i]); + $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimareas .= " />\n"; + } } - + function SetTheme($aTheme) { - if( in_array($aTheme,array_keys($this->themearr)) ) - $this->theme = $aTheme; - else - JpGraphError::RaiseL(15001,$aTheme);//("PiePLot::SetTheme() Unknown theme: $aTheme"); + if( in_array($aTheme,array_keys($this->themearr)) ) + $this->theme = $aTheme; + else + JpGraphError::RaiseL(15001,$aTheme);//("PiePLot::SetTheme() Unknown theme: $aTheme"); } - + function ExplodeSlice($e,$radius=20) { - if( ! is_integer($e) ) - JpGraphError::RaiseL(15002);//('Argument to PiePlot::ExplodeSlice() must be an integer'); - $this->explode_radius[$e]=$radius; + if( ! is_integer($e) ) + JpGraphError::RaiseL(15002);//('Argument to PiePlot::ExplodeSlice() must be an integer'); + $this->explode_radius[$e]=$radius; } function ExplodeAll($radius=20) { - $this->explode_all=true; - $this->explode_r = $radius; + $this->explode_all=true; + $this->explode_r = $radius; } function Explode($aExplodeArr) { - if( !is_array($aExplodeArr) ) { - JpGraphError::RaiseL(15003); -//("Argument to PiePlot::Explode() must be an array with integer distances."); - } - $this->explode_radius = $aExplodeArr; + if( !is_array($aExplodeArr) ) { + JpGraphError::RaiseL(15003); + //("Argument to PiePlot::Explode() must be an array with integer distances."); + } + $this->explode_radius = $aExplodeArr; } function SetStartAngle($aStart) { - if( $aStart < 0 || $aStart > 360 ) { - JpGraphError::RaiseL(15004);//('Slice start angle must be between 0 and 360 degrees.'); - } - $this->startangle = 360-$aStart; - $this->startangle *= M_PI/180; - } - - function SetFont($family,$style=FS_NORMAL,$size=10) { - JpGraphError::RaiseL(15005);//('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.'); - } - - // Size in percentage - function SetSize($aSize) { - if( ($aSize>0 && $aSize<=0.5) || ($aSize>10 && $aSize<1000) ) - $this->radius = $aSize; - else - JpGraphError::RaiseL(15006); -//("PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]"); - } - - function SetFontColor($aColor) { - JpGraphError::RaiseL(15007); -//('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.'); - } - - // Set label arrays - function SetLegends($aLegend) { - $this->legends = $aLegend; + if( $aStart < 0 || $aStart > 360 ) { + JpGraphError::RaiseL(15004);//('Slice start angle must be between 0 and 360 degrees.'); + } + if( $aStart == 0 ) { + $this->startangle = 0; + } + else { + $this->startangle = 360-$aStart; + $this->startangle *= M_PI/180; + } } - // Set text labels for slices + // Size in percentage + function SetSize($aSize) { + if( ($aSize>0 && $aSize<=0.5) || ($aSize>10 && $aSize<1000) ) + $this->radius = $aSize; + else + JpGraphError::RaiseL(15006); + //("PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]"); + } + + // Set label arrays + function SetLegends($aLegend) { + $this->legends = $aLegend; + } + + // Set text labels for slices function SetLabels($aLabels,$aLblPosAdj="auto") { - $this->labels = array_reverse($aLabels); - $this->ilabelposadj=$aLblPosAdj; + $this->labels = array_reverse($aLabels); + $this->ilabelposadj=$aLblPosAdj; } function SetLabelPos($aLblPosAdj) { - $this->ilabelposadj=$aLblPosAdj; - } - - // Should we display actual value or percentage? - function SetLabelType($t) { - if( $t < 0 || $t > 2 ) - JpGraphError::RaiseL(15008,$t); -//("PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not $t)."); - $this->labeltype=$t; + $this->ilabelposadj=$aLblPosAdj; } - // Deprecated. + // Should we display actual value or percentage? + function SetLabelType($aType) { + if( $aType < 0 || $aType > 2 ) + JpGraphError::RaiseL(15008,$aType); + //("PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not $t)."); + $this->labeltype = $aType; + } + + // Deprecated. function SetValueType($aType) { - $this->SetLabelType($aType); + $this->SetLabelType($aType); } // Should the circle around a pie plot be displayed function ShowBorder($exterior=true,$interior=true) { - $this->pie_border = $exterior; - $this->pie_interior_border = $interior; + $this->pie_border = $exterior; + $this->pie_interior_border = $interior; } - + // Setup the legends function Legend($graph) { - $colors = array_keys($graph->img->rgb->rgb_table); - sort($colors); - $ta=$this->themearr[$this->theme]; - $n = count($this->data); + $colors = array_keys($graph->img->rgb->rgb_table); + sort($colors); + $ta=$this->themearr[$this->theme]; + $n = count($this->data); - if( $this->setslicecolors==null ) { - $numcolors=count($ta); - if( class_exists('PiePlot3D',false) && ($this instanceof PiePlot3D) ) { - $ta = array_reverse(array_slice($ta,0,$n)); - } - } - else { - $this->setslicecolors = array_slice($this->setslicecolors,0,$n); - $numcolors=count($this->setslicecolors); - if( $graph->pieaa && !($this instanceof PiePlot3D) ) { - $this->setslicecolors = array_reverse($this->setslicecolors); - } - } - - $sum=0; - for($i=0; $i < $n; ++$i) - $sum += $this->data[$i]; + if( $this->setslicecolors==null ) { + $numcolors=count($ta); + if( class_exists('PiePlot3D',false) && ($this instanceof PiePlot3D) ) { + $ta = array_reverse(array_slice($ta,0,$n)); + } + } + else { + $this->setslicecolors = array_slice($this->setslicecolors,0,$n); + $numcolors=count($this->setslicecolors); + if( $graph->pieaa && !($this instanceof PiePlot3D) ) { + $this->setslicecolors = array_reverse($this->setslicecolors); + } + } - // Bail out with error if the sum is 0 - if( $sum==0 ) - JpGraphError::RaiseL(15009);//("Illegal pie plot. Sum of all data is zero for Pie!"); + $sum=0; + for($i=0; $i < $n; ++$i) + $sum += $this->data[$i]; - // Make sure we don't plot more values than data points - // (in case the user added more legends than data points) - $n = min(count($this->legends),count($this->data)); - if( $this->legends != "" ) { - $this->legends = array_reverse(array_slice($this->legends,0,$n)); - } - for( $i=$n-1; $i >= 0; --$i ) { - $l = $this->legends[$i]; - // Replace possible format with actual values - if( count($this->csimalts) > $i ) { - $fmt = $this->csimalts[$i]; - } - else { - $fmt = "%d"; // Deafult Alt if no other has been specified - } - if( $this->labeltype==0 ) { - $l = sprintf($l,100*$this->data[$i]/$sum); - $alt = sprintf($fmt,$this->data[$i]); - - } - elseif( $this->labeltype == 1) { - $l = sprintf($l,$this->data[$i]); - $alt = sprintf($fmt,$this->data[$i]); - - } - else { - $l = sprintf($l,$this->adjusted_data[$i]); - $alt = sprintf($fmt,$this->adjusted_data[$i]); - } + // Bail out with error if the sum is 0 + if( $sum==0 ) + JpGraphError::RaiseL(15009);//("Illegal pie plot. Sum of all data is zero for Pie!"); - if( empty($this->csimwintargets[$i]) ) { - $wintarg = ''; - } - else { - $wintarg = $this->csimwintargets[$i]; - } + // Make sure we don't plot more values than data points + // (in case the user added more legends than data points) + $n = min(count($this->legends),count($this->data)); + if( $this->legends != "" ) { + $this->legends = array_reverse(array_slice($this->legends,0,$n)); + } + for( $i=$n-1; $i >= 0; --$i ) { + $l = $this->legends[$i]; + // Replace possible format with actual values + if( count($this->csimalts) > $i ) { + $fmt = $this->csimalts[$i]; + } + else { + $fmt = "%d"; // Deafult Alt if no other has been specified + } + if( $this->labeltype==0 ) { + $l = sprintf($l,100*$this->data[$i]/$sum); + $alt = sprintf($fmt,$this->data[$i]); - if( $this->setslicecolors==null ) { - $graph->legend->Add($l,$colors[$ta[$i%$numcolors]],"",0,$this->csimtargets[$i],$alt,$wintarg); - } - else { - $graph->legend->Add($l,$this->setslicecolors[$i%$numcolors],"",0,$this->csimtargets[$i],$alt,$wintarg); - } - } + } + elseif( $this->labeltype == 1) { + $l = sprintf($l,$this->data[$i]); + $alt = sprintf($fmt,$this->data[$i]); + + } + else { + $l = sprintf($l,$this->adjusted_data[$i]); + $alt = sprintf($fmt,$this->adjusted_data[$i]); + } + + if( empty($this->csimwintargets[$i]) ) { + $wintarg = ''; + } + else { + $wintarg = $this->csimwintargets[$i]; + } + + if( $this->setslicecolors==null ) { + $graph->legend->Add($l,$colors[$ta[$i%$numcolors]],"",0,$this->csimtargets[$i],$alt,$wintarg); + } + else { + $graph->legend->Add($l,$this->setslicecolors[$i%$numcolors],"",0,$this->csimtargets[$i],$alt,$wintarg); + } + } } - + // Adjust the rounded percetage value so that the sum of // of the pie slices are always 100% // Using the Hare/Niemeyer method function AdjPercentage($aData,$aPrec=0) { - $mul=100; - if( $aPrec > 0 && $aPrec < 3 ) { - if( $aPrec == 1 ) - $mul=1000; - else - $mul=10000; - } - - $tmp = array(); - $result = array(); - $quote_sum=0; - $n = count($aData) ; - for( $i=0, $sum=0; $i < $n; ++$i ) - $sum+=$aData[$i]; - foreach($aData as $index => $value) { - $tmp_percentage=$value/$sum*$mul; - $result[$index]=floor($tmp_percentage); - $tmp[$index]=$tmp_percentage-$result[$index]; - $quote_sum+=$result[$index]; - } - if( $quote_sum == $mul) { - if( $mul > 100 ) { - $tmp = $mul / 100; - for( $i=0; $i < $n; ++$i ) { - $result[$i] /= $tmp ; - } - } - return $result; - } - arsort($tmp,SORT_NUMERIC); - reset($tmp); - for($i=0; $i < $mul-$quote_sum; $i++) - { - $result[key($tmp)]++; - next($tmp); - } - if( $mul > 100 ) { - $tmp = $mul / 100; - for( $i=0; $i < $n; ++$i ) { - $result[$i] /= $tmp ; - } - } - return $result; + $mul=100; + if( $aPrec > 0 && $aPrec < 3 ) { + if( $aPrec == 1 ) + $mul=1000; + else + $mul=10000; + } + + $tmp = array(); + $result = array(); + $quote_sum=0; + $n = count($aData) ; + for( $i=0, $sum=0; $i < $n; ++$i ) + $sum+=$aData[$i]; + foreach($aData as $index => $value) { + $tmp_percentage=$value/$sum*$mul; + $result[$index]=floor($tmp_percentage); + $tmp[$index]=$tmp_percentage-$result[$index]; + $quote_sum+=$result[$index]; + } + if( $quote_sum == $mul) { + if( $mul > 100 ) { + $tmp = $mul / 100; + for( $i=0; $i < $n; ++$i ) { + $result[$i] /= $tmp ; + } + } + return $result; + } + arsort($tmp,SORT_NUMERIC); + reset($tmp); + for($i=0; $i < $mul-$quote_sum; $i++) + { + $result[key($tmp)]++; + next($tmp); + } + if( $mul > 100 ) { + $tmp = $mul / 100; + for( $i=0; $i < $n; ++$i ) { + $result[$i] /= $tmp ; + } + } + return $result; } function Stroke($img,$aaoption=0) { - // aaoption is used to handle antialias - // aaoption == 0 a normal pie - // aaoption == 1 just the body - // aaoption == 2 just the values + // aaoption is used to handle antialias + // aaoption == 0 a normal pie + // aaoption == 1 just the body + // aaoption == 2 just the values - // Explode scaling. If anti anti alias we scale the image - // twice and we also need to scale the exploding distance - $expscale = $aaoption === 1 ? 2 : 1; + // Explode scaling. If anti alias we scale the image + // twice and we also need to scale the exploding distance + $expscale = $aaoption === 1 ? 2 : 1; - if( $this->labeltype == 2 ) { - // Adjust the data so that it will add up to 100% - $this->adjusted_data = $this->AdjPercentage($this->data); - } + if( $this->labeltype == 2 ) { + // Adjust the data so that it will add up to 100% + $this->adjusted_data = $this->AdjPercentage($this->data); + } - $colors = array_keys($img->rgb->rgb_table); - sort($colors); - $ta=$this->themearr[$this->theme]; - $n = count($this->data); - - if( $this->setslicecolors==null ) { - $numcolors=count($ta); - } - else { - // We need to create an array of colors as long as the data - // since we need to reverse it to get the colors in the right order - $numcolors=count($this->setslicecolors); - $i = 2*$numcolors; - while( $n > $i ) { - $this->setslicecolors = array_merge($this->setslicecolors,$this->setslicecolors); - $i += $n; - } - $tt = array_slice($this->setslicecolors,0,$n % $numcolors); - $this->setslicecolors = array_merge($this->setslicecolors,$tt); - $this->setslicecolors = array_reverse($this->setslicecolors); - } + $colors = array_keys($img->rgb->rgb_table); + sort($colors); + $ta=$this->themearr[$this->theme]; + $n = count($this->data); - // Draw the slices - $sum=0; - for($i=0; $i < $n; ++$i) - $sum += $this->data[$i]; - - // Bail out with error if the sum is 0 - if( $sum==0 ) - JpGraphError::RaiseL(15009);//("Sum of all data is 0 for Pie."); - - // Set up the pie-circle - if( $this->radius <= 1 ) - $radius = floor($this->radius*min($img->width,$img->height)); - else { - $radius = $aaoption === 1 ? $this->radius*2 : $this->radius; - } + if( $this->setslicecolors==null ) { + $numcolors=count($ta); + } + else { + // We need to create an array of colors as long as the data + // since we need to reverse it to get the colors in the right order + $numcolors=count($this->setslicecolors); + $i = 2*$numcolors; + while( $n > $i ) { + $this->setslicecolors = array_merge($this->setslicecolors,$this->setslicecolors); + $i += $n; + } + $tt = array_slice($this->setslicecolors,0,$n % $numcolors); + $this->setslicecolors = array_merge($this->setslicecolors,$tt); + $this->setslicecolors = array_reverse($this->setslicecolors); + } - if( $this->posx <= 1 && $this->posx > 0 ) - $xc = round($this->posx*$img->width); - else - $xc = $this->posx ; - - if( $this->posy <= 1 && $this->posy > 0 ) - $yc = round($this->posy*$img->height); - else - $yc = $this->posy ; - - $n = count($this->data); + // Draw the slices + $sum=0; + for($i=0; $i < $n; ++$i) + $sum += $this->data[$i]; - if( $this->explode_all ) - for($i=0; $i < $n; ++$i) - $this->explode_radius[$i]=$this->explode_r; + // Bail out with error if the sum is 0 + if( $sum==0 ) { + JpGraphError::RaiseL(15009);//("Sum of all data is 0 for Pie."); + } - // If we have a shadow and not just drawing the labels - if( $this->ishadowcolor != "" && $aaoption !== 2) { - $accsum=0; - $angle2 = $this->startangle; - $img->SetColor($this->ishadowcolor); - for($i=0; $sum > 0 && $i < $n; ++$i) { - $j = $n-$i-1; - $d = $this->data[$i]; - $angle1 = $angle2; - $accsum += $d; - $angle2 = $this->startangle+2*M_PI*$accsum/$sum; - if( empty($this->explode_radius[$j]) ) - $this->explode_radius[$j]=0; + // Set up the pie-circle + if( $this->radius <= 1 ) { + $radius = floor($this->radius*min($img->width,$img->height)); + } + else { + $radius = $aaoption === 1 ? $this->radius*2 : $this->radius; + } - if( $d < 0.00001 ) continue; + if( $this->posx <= 1 && $this->posx > 0 ) { + $xc = round($this->posx*$img->width); + } + else { + $xc = $this->posx ; + } - $la = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1); + if( $this->posy <= 1 && $this->posy > 0 ) { + $yc = round($this->posy*$img->height); + } + else { + $yc = $this->posy ; + } - $xcm = $xc + $this->explode_radius[$j]*cos($la)*$expscale; - $ycm = $yc - $this->explode_radius[$j]*sin($la)*$expscale; - - $xcm += $this->ishadowdrop*$expscale; - $ycm += $this->ishadowdrop*$expscale; + $n = count($this->data); - $_sa = round($angle1*180/M_PI); - $_ea = round($angle2*180/M_PI); + if( $this->explode_all ) { + for($i=0; $i < $n; ++$i) { + $this->explode_radius[$i]=$this->explode_r; + } + } - // The CakeSlice method draws a full circle in case of start angle = end angle - // for pie slices we don't want this behaviour unless we only have one - // slice in the pie in case it is the wanted behaviour - if( $_ea-$_sa > 0.1 || $n==1 ) { - $img->CakeSlice($xcm,$ycm,$radius-1,$radius-1, - $angle1*180/M_PI,$angle2*180/M_PI,$slicecolor,$arccolor); - } - } - } + // If we have a shadow and not just drawing the labels + if( $this->ishadowcolor != "" && $aaoption !== 2) { + $accsum=0; + $angle2 = $this->startangle; + $img->SetColor($this->ishadowcolor); + for($i=0; $sum > 0 && $i < $n; ++$i) { + $j = $n-$i-1; + $d = $this->data[$i]; + $angle1 = $angle2; + $accsum += $d; + $angle2 = $this->startangle+2*M_PI*$accsum/$sum; + if( empty($this->explode_radius[$j]) ) { + $this->explode_radius[$j]=0; + } - //-------------------------------------------------------------------------------- - // This is the main loop to draw each cake slice - //-------------------------------------------------------------------------------- + if( $d < 0.00001 ) continue; - // Set up the accumulated sum, start angle for first slice and border color - $accsum=0; - $angle2 = $this->startangle; - $img->SetColor($this->color); + $la = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1); - // Loop though all the slices if there is a pie to draw (sum>0) - // There are n slices in total - for($i=0; $sum>0 && $i < $n; ++$i) { + $xcm = $xc + $this->explode_radius[$j]*cos($la)*$expscale; + $ycm = $yc - $this->explode_radius[$j]*sin($la)*$expscale; - // $j is the actual index used for the slice - $j = $n-$i-1; + $xcm += $this->ishadowdrop*$expscale; + $ycm += $this->ishadowdrop*$expscale; - // Make sure we havea valid distance to explode the slice - if( empty($this->explode_radius[$j]) ) - $this->explode_radius[$j]=0; + $_sa = round($angle1*180/M_PI); + $_ea = round($angle2*180/M_PI); - // The actual numeric value for the slice - $d = $this->data[$i]; + // The CakeSlice method draws a full circle in case of start angle = end angle + // for pie slices we don't want this behaviour unless we only have one + // slice in the pie in case it is the wanted behaviour + if( $_ea-$_sa > 0.1 || $n==1 ) { + $img->CakeSlice($xcm,$ycm,$radius-1,$radius-1, + $angle1*180/M_PI,$angle2*180/M_PI,$this->ishadowcolor); + } + } + } - $angle1 = $angle2; + //-------------------------------------------------------------------------------- + // This is the main loop to draw each cake slice + //-------------------------------------------------------------------------------- - // Accumlate the sum - $accsum += $d; + // Set up the accumulated sum, start angle for first slice and border color + $accsum=0; + $angle2 = $this->startangle; + $img->SetColor($this->color); - // The new angle when we add the "size" of this slice - // angle1 is then the start and angle2 the end of this slice - $angle2 = $this->NormAngle($this->startangle+2*M_PI*$accsum/$sum); + // Loop though all the slices if there is a pie to draw (sum>0) + // There are n slices in total + for($i=0; $sum>0 && $i < $n; ++$i) { - // We avoid some trouble by not allowing end angle to be 0, in that case - // we translate to 360 + // $j is the actual index used for the slice + $j = $n-$i-1; + + // Make sure we havea valid distance to explode the slice + if( empty($this->explode_radius[$j]) ) { + $this->explode_radius[$j]=0; + } + + // The actual numeric value for the slice + $d = $this->data[$i]; + + $angle1 = $angle2; + + // Accumlate the sum + $accsum += $d; + + // The new angle when we add the "size" of this slice + // angle1 is then the start and angle2 the end of this slice + $angle2 = $this->NormAngle($this->startangle+2*M_PI*$accsum/$sum); + + // We avoid some trouble by not allowing end angle to be 0, in that case + // we translate to 360 + + // la is used to hold the label angle, which is centered on the slice + if( $angle2 < 0.0001 && $angle1 > 0.0001 ) { + $this->la[$i] = 2*M_PI - (abs(2*M_PI-$angle1)/2.0+$angle1); + } + elseif( $angle1 > $angle2 ) { + // The case where the slice crosses the 3 a'clock line + // Remember that the slices are counted clockwise and + // labels are counted counter clockwise so we need to revert with 2 PI + $this->la[$i] = 2*M_PI-$this->NormAngle($angle1 + ((2*M_PI - $angle1)+$angle2)/2); + } + else { + $this->la[$i] = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1); + } + + // Too avoid rounding problems we skip the slice if it is too small + if( $d < 0.00001 ) continue; + + // If the user has specified an array of colors for each slice then use + // that a color otherwise use the theme array (ta) of colors + if( $this->setslicecolors==null ) { + $slicecolor=$colors[$ta[$i%$numcolors]]; + } + else { + $slicecolor=$this->setslicecolors[$i%$numcolors]; + } + +// $_sa = round($angle1*180/M_PI); +// $_ea = round($angle2*180/M_PI); +// $_la = round($this->la[$i]*180/M_PI); +// echo "Slice#$i: ang1=$_sa , ang2=$_ea, la=$_la, color=$slicecolor
"; - // la is used to hold the label angle, which is centered on the slice - if( $angle2 < 0.0001 && $angle1 > 0.0001 ) { - $this->la[$i] = 2*M_PI - (abs(2*M_PI-$angle1)/2.0+$angle1); - } - else - $this->la[$i] = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1); + // If we have enabled antialias then we don't draw any border so + // make the bordedr color the same as the slice color + if( $this->pie_interior_border && $aaoption===0 ) { + $img->SetColor($this->color); + } + else { + $img->SetColor($slicecolor); + } + $arccolor = $this->pie_border && $aaoption===0 ? $this->color : ""; - $_sa = round($angle1*180/M_PI); - $_ea = round($angle2*180/M_PI); - $_la = round($this->la[$i]*180/M_PI); - //echo "ang1=$_sa , ang2=$_ea - la=$_la
"; + // Calculate the x,y coordinates for the base of this slice taking + // the exploded distance into account. Here we use the mid angle as the + // ray of extension and we have the mid angle handy as it is also the + // label angle + $xcm = $xc + $this->explode_radius[$j]*cos($this->la[$i])*$expscale; + $ycm = $yc - $this->explode_radius[$j]*sin($this->la[$i])*$expscale; - // Too avoid rounding problems we skip the slice if it is too small - if( $d < 0.00001 ) continue; + // If we are not just drawing the labels then draw this cake slice + if( $aaoption !== 2 ) { - // If the user has specified an array of colors for each slice then use - // that a color otherwise use the theme array (ta) of colors - if( $this->setslicecolors==null ) - $slicecolor=$colors[$ta[$i%$numcolors]]; - else - $slicecolor=$this->setslicecolors[$i%$numcolors]; - - // If we have enabled antialias then we don't draw any border so - // make the bordedr color the same as the slice color - if( $this->pie_interior_border && $aaoption===0 ) - $img->SetColor($this->color); - else - $img->SetColor($slicecolor); - $arccolor = $this->pie_border && $aaoption===0 ? $this->color : ""; + $_sa = round($angle1*180/M_PI); + $_ea = round($angle2*180/M_PI); + $_la = round($this->la[$i]*180/M_PI); + //echo "[$i] sa=$_sa, ea=$_ea, la[$i]=$_la, (color=$slicecolor)
"; - // Calculate the x,y coordinates for the base of this slice taking - // the exploded distance into account. Here we use the mid angle as the - // ray of extension and we have the mid angle handy as it is also the - // label angle - $xcm = $xc + $this->explode_radius[$j]*cos($this->la[$i])*$expscale; - $ycm = $yc - $this->explode_radius[$j]*sin($this->la[$i])*$expscale; + // The CakeSlice method draws a full circle in case of start angle = end angle + // for pie slices we want this in case the slice have a value larger than 99% of the + // total sum + if( abs($_ea-$_sa) > 0.1 || $d > 0 ) { + $img->CakeSlice($xcm,$ycm,$radius-1,$radius-1,$_sa,$_ea,$slicecolor,$arccolor); + } + } - // If we are not just drawing the labels then draw this cake slice - if( $aaoption !== 2 ) { + // If the CSIM is used then make sure we register a CSIM area for this slice as well + if( $this->csimtargets && $aaoption !== 1 ) { + $this->AddSliceToCSIM($i,$xcm,$ycm,$radius,$angle1,$angle2); + } + } - - $_sa = round($angle1*180/M_PI); - $_ea = round($angle2*180/M_PI); - $_la = round($this->la[$i]*180/M_PI); - //echo "[$i] sa=$_sa, ea=$_ea, la[$i]=$_la, (color=$slicecolor)
"; - + // Format the titles for each slice + if( $aaoption !== 2 ) { + for( $i=0; $i < $n; ++$i) { + if( $this->labeltype==0 ) { + if( $sum != 0 ) + $l = 100.0*$this->data[$i]/$sum; + else + $l = 0.0; + } + elseif( $this->labeltype==1 ) { + $l = $this->data[$i]*1.0; + } + else { + $l = $this->adjusted_data[$i]; + } + if( isset($this->labels[$i]) && is_string($this->labels[$i]) ) + $this->labels[$i]=sprintf($this->labels[$i],$l); + else + $this->labels[$i]=$l; + } + } - // The CakeSlice method draws a full circle in case of start angle = end angle - // for pie slices we don't want this behaviour unless we only have one - // slice in the pie in case it is the wanted behaviour - if( abs($_ea-$_sa) > 0.1 || $n==1 ) { - $img->CakeSlice($xcm,$ycm,$radius-1,$radius-1,$_sa,$_ea,$slicecolor,$arccolor); - } - } + if( $this->value->show && $aaoption !== 1 ) { + $this->StrokeAllLabels($img,$xc,$yc,$radius); + } - // If the CSIM is used then make sure we register a CSIM area for this slice as well - if( $this->csimtargets && $aaoption !== 1 ) { - $this->AddSliceToCSIM($i,$xcm,$ycm,$radius,$angle1,$angle2); - } - } - - // Format the titles for each slice - if( $aaoption !== 2 ) { - for( $i=0; $i < $n; ++$i) { - if( $this->labeltype==0 ) { - if( $sum != 0 ) - $l = 100.0*$this->data[$i]/$sum; - else - $l = 0.0; - } - elseif( $this->labeltype==1 ) { - $l = $this->data[$i]*1.0; - } - else { - $l = $this->adjusted_data[$i]; - } - if( isset($this->labels[$i]) && is_string($this->labels[$i]) ) - $this->labels[$i]=sprintf($this->labels[$i],$l); - else - $this->labels[$i]=$l; - } - } - - if( $this->value->show && $aaoption !== 1 ) { - $this->StrokeAllLabels($img,$xc,$yc,$radius); - } - - // Adjust title position - if( $aaoption !== 1 ) { - $this->title->SetPos($xc, - $yc-$this->title->GetFontHeight($img)-$radius-$this->title->margin, - "center","bottom"); - $this->title->Stroke($img); - } + // Adjust title position + if( $aaoption !== 1 ) { + $this->title->SetPos($xc, + $yc-$this->title->GetFontHeight($img)-$radius-$this->title->margin, + "center","bottom"); + $this->title->Stroke($img); + } } -//--------------- -// PRIVATE METHODS + //--------------- + // PRIVATE METHODS function NormAngle($a) { - while( $a < 0 ) $a += 2*M_PI; - while( $a > 2*M_PI ) $a -= 2*M_PI; - return $a; + while( $a < 0 ) $a += 2*M_PI; + while( $a > 2*M_PI ) $a -= 2*M_PI; + return $a; } function Quadrant($a) { - $a=$this->NormAngle($a); - if( $a > 0 && $a <= M_PI/2 ) - return 0; - if( $a > M_PI/2 && $a <= M_PI ) - return 1; - if( $a > M_PI && $a <= 1.5*M_PI ) - return 2; - if( $a > 1.5*M_PI ) - return 3; + $a=$this->NormAngle($a); + if( $a > 0 && $a <= M_PI/2 ) + return 0; + if( $a > M_PI/2 && $a <= M_PI ) + return 1; + if( $a > M_PI && $a <= 1.5*M_PI ) + return 2; + if( $a > 1.5*M_PI ) + return 3; } function StrokeGuideLabels($img,$xc,$yc,$radius) { - $n = count($this->labels); + $n = count($this->labels); - //----------------------------------------------------------------------- - // Step 1 of the algorithm is to construct a number of clusters - // a cluster is defined as all slices within the same quadrant (almost) - // that has an angular distance less than the treshold - //----------------------------------------------------------------------- - $tresh_hold=25 * M_PI/180; // 25 degrees difference to be in a cluster - $incluster=false; // flag if we are currently in a cluster or not - $clusters = array(); // array of clusters - $cidx=-1; // running cluster index + //----------------------------------------------------------------------- + // Step 1 of the algorithm is to construct a number of clusters + // a cluster is defined as all slices within the same quadrant (almost) + // that has an angular distance less than the treshold + //----------------------------------------------------------------------- + $tresh_hold=25 * M_PI/180; // 25 degrees difference to be in a cluster + $incluster=false; // flag if we are currently in a cluster or not + $clusters = array(); // array of clusters + $cidx=-1; // running cluster index - // Go through all the labels and construct a number of clusters - for($i=0; $i < $n-1; ++$i) { - // Calc the angle distance between two consecutive slices - $a1=$this->la[$i]; - $a2=$this->la[$i+1]; - $q1 = $this->Quadrant($a1); - $q2 = $this->Quadrant($a2); - $diff = abs($a1-$a2); - if( $diff < $tresh_hold ) { - if( $incluster ) { - $clusters[$cidx][1]++; - // Each cluster can only cover one quadrant - // Do we cross a quadrant ( and must break the cluster) - if( $q1 != $q2 ) { - // If we cross a quadrant boundary we normally start a - // new cluster. However we need to take the 12'a clock - // and 6'a clock positions into a special consideration. - // Case 1: WE go from q=1 to q=2 if the last slice on - // the cluster for q=1 is close to 12'a clock and the - // first slice in q=0 is small we extend the previous - // cluster - if( $q1 == 1 && $q2 == 0 && $a2 > (90-15)*M_PI/180 ) { - if( $i < $n-2 ) { - $a3 = $this->la[$i+2]; - // If there isn't a cluster coming up with the next-next slice - // we extend the previous cluster to cover this slice as well - if( abs($a3-$a2) >= $tresh_hold ) { - $clusters[$cidx][1]++; - $i++; - } - } - } - elseif( $q1 == 3 && $q2 == 2 && $a2 > (270-15)*M_PI/180 ) { - if( $i < $n-2 ) { - $a3 = $this->la[$i+2]; - // If there isn't a cluster coming up with the next-next slice - // we extend the previous cluster to cover this slice as well - if( abs($a3-$a2) >= $tresh_hold ) { - $clusters[$cidx][1]++; - $i++; - } - } - } + // Go through all the labels and construct a number of clusters + for($i=0; $i < $n-1; ++$i) { + // Calc the angle distance between two consecutive slices + $a1=$this->la[$i]; + $a2=$this->la[$i+1]; + $q1 = $this->Quadrant($a1); + $q2 = $this->Quadrant($a2); + $diff = abs($a1-$a2); + if( $diff < $tresh_hold ) { + if( $incluster ) { + $clusters[$cidx][1]++; + // Each cluster can only cover one quadrant + // Do we cross a quadrant ( and must break the cluster) + if( $q1 != $q2 ) { + // If we cross a quadrant boundary we normally start a + // new cluster. However we need to take the 12'a clock + // and 6'a clock positions into a special consideration. + // Case 1: WE go from q=1 to q=2 if the last slice on + // the cluster for q=1 is close to 12'a clock and the + // first slice in q=0 is small we extend the previous + // cluster + if( $q1 == 1 && $q2 == 0 && $a2 > (90-15)*M_PI/180 ) { + if( $i < $n-2 ) { + $a3 = $this->la[$i+2]; + // If there isn't a cluster coming up with the next-next slice + // we extend the previous cluster to cover this slice as well + if( abs($a3-$a2) >= $tresh_hold ) { + $clusters[$cidx][1]++; + $i++; + } + } + } + elseif( $q1 == 3 && $q2 == 2 && $a2 > (270-15)*M_PI/180 ) { + if( $i < $n-2 ) { + $a3 = $this->la[$i+2]; + // If there isn't a cluster coming up with the next-next slice + // we extend the previous cluster to cover this slice as well + if( abs($a3-$a2) >= $tresh_hold ) { + $clusters[$cidx][1]++; + $i++; + } + } + } - if( $q1==2 && $q2==1 && $a2 > (180-15)*M_PI/180 ) { - $clusters[$cidx][1]++; - $i++; - } - - $incluster = false; - } - } - elseif( $q1 == $q2) { - $incluster = true; - // Now we have a special case for quadrant 0. If we previously - // have a cluster of one in quadrant 0 we just extend that - // cluster. If we don't do this then we risk that the label - // for the cluster of one will cross the guide-line - if( $q1 == 0 && $cidx > -1 && - $clusters[$cidx][1] == 1 && - $this->Quadrant($this->la[$clusters[$cidx][0]]) == 0 ) { - $clusters[$cidx][1]++; - } - else { - $cidx++; - $clusters[$cidx][0] = $i; - $clusters[$cidx][1] = 1; - } - } - else { - // Create a "cluster" of one since we are just crossing - // a quadrant - $cidx++; - $clusters[$cidx][0] = $i; - $clusters[$cidx][1] = 1; - } - } - else { - if( $incluster ) { - // Add the last slice - $clusters[$cidx][1]++; - $incluster = false; - } - else { // Create a "cluster" of one - $cidx++; - $clusters[$cidx][0] = $i; - $clusters[$cidx][1] = 1; - } - } - } - // Handle the very last slice - if( $incluster ) { - $clusters[$cidx][1]++; - } - else { // Create a "cluster" of one - $cidx++; - $clusters[$cidx][0] = $i; - $clusters[$cidx][1] = 1; - } + if( $q1==2 && $q2==1 && $a2 > (180-15)*M_PI/180 ) { + $clusters[$cidx][1]++; + $i++; + } - /* - if( true ) { - // Debug printout in labels - for( $i=0; $i <= $cidx; ++$i ) { - for( $j=0; $j < $clusters[$i][1]; ++$j ) { - $a = $this->la[$clusters[$i][0]+$j]; - $aa = round($a*180/M_PI); - $q = $this->Quadrant($a); - $this->labels[$clusters[$i][0]+$j]="[$q:$aa] $i:$j"; - } - } - } - */ + $incluster = false; + } + } + elseif( $q1 == $q2) { + $incluster = true; + // Now we have a special case for quadrant 0. If we previously + // have a cluster of one in quadrant 0 we just extend that + // cluster. If we don't do this then we risk that the label + // for the cluster of one will cross the guide-line + if( $q1 == 0 && $cidx > -1 && + $clusters[$cidx][1] == 1 && + $this->Quadrant($this->la[$clusters[$cidx][0]]) == 0 ) { + $clusters[$cidx][1]++; + } + else { + $cidx++; + $clusters[$cidx][0] = $i; + $clusters[$cidx][1] = 1; + } + } + else { + // Create a "cluster" of one since we are just crossing + // a quadrant + $cidx++; + $clusters[$cidx][0] = $i; + $clusters[$cidx][1] = 1; + } + } + else { + if( $incluster ) { + // Add the last slice + $clusters[$cidx][1]++; + $incluster = false; + } + else { // Create a "cluster" of one + $cidx++; + $clusters[$cidx][0] = $i; + $clusters[$cidx][1] = 1; + } + } + } + // Handle the very last slice + if( $incluster ) { + $clusters[$cidx][1]++; + } + else { // Create a "cluster" of one + $cidx++; + $clusters[$cidx][0] = $i; + $clusters[$cidx][1] = 1; + } - //----------------------------------------------------------------------- - // Step 2 of the algorithm is use the clusters and draw the labels - // and guidelines - //----------------------------------------------------------------------- + /* + if( true ) { + // Debug printout in labels + for( $i=0; $i <= $cidx; ++$i ) { + for( $j=0; $j < $clusters[$i][1]; ++$j ) { + $a = $this->la[$clusters[$i][0]+$j]; + $aa = round($a*180/M_PI); + $q = $this->Quadrant($a); + $this->labels[$clusters[$i][0]+$j]="[$q:$aa] $i:$j"; + } + } + } + */ - // We use the font height as the base factor for how far we need to - // spread the labels in the Y-direction. - $this->value->ApplyFont($img); - $fh = $img->GetFontHeight(); - $origvstep=$fh*$this->iGuideVFactor; - $this->value->SetMargin(0); + //----------------------------------------------------------------------- + // Step 2 of the algorithm is use the clusters and draw the labels + // and guidelines + //----------------------------------------------------------------------- - // Number of clusters found - $nc = count($clusters); + // We use the font height as the base factor for how far we need to + // spread the labels in the Y-direction. + $this->value->ApplyFont($img); + $fh = $img->GetFontHeight(); + $origvstep=$fh*$this->iGuideVFactor; + $this->value->SetMargin(0); - // Walk through all the clusters - for($i=0; $i < $nc; ++$i) { + // Number of clusters found + $nc = count($clusters); - // Start angle and number of slices in this cluster - $csize = $clusters[$i][1]; - $a = $this->la[$clusters[$i][0]]; - $q = $this->Quadrant($a); + // Walk through all the clusters + for($i=0; $i < $nc; ++$i) { - // Now set up the start and end conditions to make sure that - // in each cluster we walk through the all the slices starting with the slice - // closest to the equator. Since all slices are numbered clockwise from "3'a clock" - // we have different conditions depending on in which quadrant the slice lies within. - if( $q == 0 ) { - $start = $csize-1; $idx = $start; $step = -1; $vstep = -$origvstep; - } - elseif( $q == 1 ) { - $start = 0; $idx = $start; $step = 1; $vstep = -$origvstep; - } - elseif( $q == 2 ) { - $start = $csize-1; $idx = $start; $step = -1; $vstep = $origvstep; - } - elseif( $q == 3 ) { - $start = 0; $idx = $start; $step = 1; $vstep = $origvstep; - } + // Start angle and number of slices in this cluster + $csize = $clusters[$i][1]; + $a = $this->la[$clusters[$i][0]]; + $q = $this->Quadrant($a); - // Walk through all slices within this cluster - for($j=0; $j < $csize; ++$j) { - // Now adjust the position of the labels in each cluster starting - // with the slice that is closest to the equator of the pie - $a = $this->la[$clusters[$i][0]+$idx]; - - // Guide line start in the center of the arc of the slice - $r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)]; - $x = round($r*cos($a)+$xc); - $y = round($yc-$r*sin($a)); - - // The distance from the arc depends on chosen font and the "R-Factor" - $r += $fh*$this->iGuideLineRFactor; + // Now set up the start and end conditions to make sure that + // in each cluster we walk through the all the slices starting with the slice + // closest to the equator. Since all slices are numbered clockwise from "3'a clock" + // we have different conditions depending on in which quadrant the slice lies within. + if( $q == 0 ) { + $start = $csize-1; $idx = $start; $step = -1; $vstep = -$origvstep; + } + elseif( $q == 1 ) { + $start = 0; $idx = $start; $step = 1; $vstep = -$origvstep; + } + elseif( $q == 2 ) { + $start = $csize-1; $idx = $start; $step = -1; $vstep = $origvstep; + } + elseif( $q == 3 ) { + $start = 0; $idx = $start; $step = 1; $vstep = $origvstep; + } - // Should the labels be placed curved along the pie or in straight columns - // outside the pie? - if( $this->iGuideLineCurve ) - $xt=round($r*cos($a)+$xc); + // Walk through all slices within this cluster + for($j=0; $j < $csize; ++$j) { + // Now adjust the position of the labels in each cluster starting + // with the slice that is closest to the equator of the pie + $a = $this->la[$clusters[$i][0]+$idx]; - // If this is the first slice in the cluster we need some first time - // proessing - if( $idx == $start ) { - if( ! $this->iGuideLineCurve ) - $xt=round($r*cos($a)+$xc); - $yt=round($yc-$r*sin($a)); + // Guide line start in the center of the arc of the slice + $r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)]; + $x = round($r*cos($a)+$xc); + $y = round($yc-$r*sin($a)); - // Some special consideration in case this cluster starts - // in quadrant 1 or 3 very close to the "equator" (< 20 degrees) - // and the previous clusters last slice is within the tolerance. - // In that case we add a font height to this labels Y-position - // so it doesn't collide with - // the slice in the previous cluster - $prevcluster = ($i + ($nc-1) ) % $nc; - $previdx=$clusters[$prevcluster][0]+$clusters[$prevcluster][1]-1; - if( $q == 1 && $a > 160*M_PI/180 ) { - // Get the angle for the previous clusters last slice - $diff = abs($a-$this->la[$previdx]); - if( $diff < $tresh_hold ) { - $yt -= $fh; - } - } - elseif( $q == 3 && $a > 340*M_PI/180 ) { - // We need to subtract 360 to compare angle distance between - // q=0 and q=3 - $diff = abs($a-$this->la[$previdx]-360*M_PI/180); - if( $diff < $tresh_hold ) { - $yt += $fh; - } - } + // The distance from the arc depends on chosen font and the "R-Factor" + $r += $fh*$this->iGuideLineRFactor; - } - else { - // The step is at minimum $vstep but if the slices are relatively large - // we make sure that we add at least a step that corresponds to the vertical - // distance between the centers at the arc on the slice - $prev_a = $this->la[$clusters[$i][0]+($idx-$step)]; - $dy = abs($radius*(sin($a)-sin($prev_a))*1.2); - if( $vstep > 0 ) - $yt += max($vstep,$dy); - else - $yt += min($vstep,-$dy); - } + // Should the labels be placed curved along the pie or in straight columns + // outside the pie? + if( $this->iGuideLineCurve ) + $xt=round($r*cos($a)+$xc); - $label = $this->labels[$clusters[$i][0]+$idx]; + // If this is the first slice in the cluster we need some first time + // proessing + if( $idx == $start ) { + if( ! $this->iGuideLineCurve ) + $xt=round($r*cos($a)+$xc); + $yt=round($yc-$r*sin($a)); - if( $csize == 1 ) { - // A "meta" cluster with only one slice - $r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)]; - $rr = $r+$img->GetFontHeight()/2; - $xt=round($rr*cos($a)+$xc); - $yt=round($yc-$rr*sin($a)); - $this->StrokeLabel($label,$img,$xc,$yc,$a,$r); - if( $this->iShowGuideLineForSingle ) - $this->guideline->Stroke($img,$x,$y,$xt,$yt); - } - else { - $this->guideline->Stroke($img,$x,$y,$xt,$yt); - if( $q==1 || $q==2 ) { - // Left side of Pie - $this->guideline->Stroke($img,$xt,$yt,$xt-$this->guidelinemargin,$yt); - $lbladj = -$this->guidelinemargin-5; - $this->value->halign = "right"; - $this->value->valign = "center"; - } - else { - // Right side of pie - $this->guideline->Stroke($img,$xt,$yt,$xt+$this->guidelinemargin,$yt); - $lbladj = $this->guidelinemargin+5; - $this->value->halign = "left"; - $this->value->valign = "center"; - } - $this->value->Stroke($img,$label,$xt+$lbladj,$yt); - } + // Some special consideration in case this cluster starts + // in quadrant 1 or 3 very close to the "equator" (< 20 degrees) + // and the previous clusters last slice is within the tolerance. + // In that case we add a font height to this labels Y-position + // so it doesn't collide with + // the slice in the previous cluster + $prevcluster = ($i + ($nc-1) ) % $nc; + $previdx=$clusters[$prevcluster][0]+$clusters[$prevcluster][1]-1; + if( $q == 1 && $a > 160*M_PI/180 ) { + // Get the angle for the previous clusters last slice + $diff = abs($a-$this->la[$previdx]); + if( $diff < $tresh_hold ) { + $yt -= $fh; + } + } + elseif( $q == 3 && $a > 340*M_PI/180 ) { + // We need to subtract 360 to compare angle distance between + // q=0 and q=3 + $diff = abs($a-$this->la[$previdx]-360*M_PI/180); + if( $diff < $tresh_hold ) { + $yt += $fh; + } + } - // Udate idx to point to next slice in the cluster to process - $idx += $step; - } - } + } + else { + // The step is at minimum $vstep but if the slices are relatively large + // we make sure that we add at least a step that corresponds to the vertical + // distance between the centers at the arc on the slice + $prev_a = $this->la[$clusters[$i][0]+($idx-$step)]; + $dy = abs($radius*(sin($a)-sin($prev_a))*1.2); + if( $vstep > 0 ) + $yt += max($vstep,$dy); + else + $yt += min($vstep,-$dy); + } + + $label = $this->labels[$clusters[$i][0]+$idx]; + + if( $csize == 1 ) { + // A "meta" cluster with only one slice + $r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)]; + $rr = $r+$img->GetFontHeight()/2; + $xt=round($rr*cos($a)+$xc); + $yt=round($yc-$rr*sin($a)); + $this->StrokeLabel($label,$img,$xc,$yc,$a,$r); + if( $this->iShowGuideLineForSingle ) + $this->guideline->Stroke($img,$x,$y,$xt,$yt); + } + else { + $this->guideline->Stroke($img,$x,$y,$xt,$yt); + if( $q==1 || $q==2 ) { + // Left side of Pie + $this->guideline->Stroke($img,$xt,$yt,$xt-$this->guidelinemargin,$yt); + $lbladj = -$this->guidelinemargin-5; + $this->value->halign = "right"; + $this->value->valign = "center"; + } + else { + // Right side of pie + $this->guideline->Stroke($img,$xt,$yt,$xt+$this->guidelinemargin,$yt); + $lbladj = $this->guidelinemargin+5; + $this->value->halign = "left"; + $this->value->valign = "center"; + } + $this->value->Stroke($img,$label,$xt+$lbladj,$yt); + } + + // Udate idx to point to next slice in the cluster to process + $idx += $step; + } + } } function StrokeAllLabels($img,$xc,$yc,$radius) { - // First normalize all angles for labels - $n = count($this->la); - for($i=0; $i < $n; ++$i) { - $this->la[$i] = $this->NormAngle($this->la[$i]); - } - if( $this->guideline->iShow ) { - $this->StrokeGuideLabels($img,$xc,$yc,$radius); - } - else { - $n = count($this->labels); - for($i=0; $i < $n; ++$i) { - $this->StrokeLabel($this->labels[$i],$img,$xc,$yc, - $this->la[$i], - $radius + $this->explode_radius[$n-1-$i]); - } - } + // First normalize all angles for labels + $n = count($this->la); + for($i=0; $i < $n; ++$i) { + $this->la[$i] = $this->NormAngle($this->la[$i]); + } + if( $this->guideline->iShow ) { + $this->StrokeGuideLabels($img,$xc,$yc,$radius); + } + else { + $n = count($this->labels); + for($i=0; $i < $n; ++$i) { + $this->StrokeLabel($this->labels[$i],$img,$xc,$yc, + $this->la[$i], + $radius + $this->explode_radius[$n-1-$i]); + } + } } // Position the labels of each slice function StrokeLabel($label,$img,$xc,$yc,$a,$r) { - // Default value - if( $this->ilabelposadj === 'auto' ) - $this->ilabelposadj = 0.65; + // Default value + if( $this->ilabelposadj === 'auto' ) + $this->ilabelposadj = 0.65; - // We position the values diferently depending on if they are inside - // or outside the pie - if( $this->ilabelposadj < 1.0 ) { + // We position the values diferently depending on if they are inside + // or outside the pie + if( $this->ilabelposadj < 1.0 ) { - $this->value->SetAlign('center','center'); - $this->value->margin = 0; - - $xt=round($this->ilabelposadj*$r*cos($a)+$xc); - $yt=round($yc-$this->ilabelposadj*$r*sin($a)); - - $this->value->Stroke($img,$label,$xt,$yt); - } - else { + $this->value->SetAlign('center','center'); + $this->value->margin = 0; - $this->value->halign = "left"; - $this->value->valign = "top"; - $this->value->margin = 0; - - // Position the axis title. - // dx, dy is the offset from the top left corner of the bounding box that sorrounds the text - // that intersects with the extension of the corresponding axis. The code looks a little - // bit messy but this is really the only way of having a reasonable position of the - // axis titles. - $this->value->ApplyFont($img); - $h=$img->GetTextHeight($label); - // For numeric values the format of the display value - // must be taken into account - if( is_numeric($label) ) { - if( $label > 0 ) - $w=$img->GetTextWidth(sprintf($this->value->format,$label)); - else - $w=$img->GetTextWidth(sprintf($this->value->negformat,$label)); - } - else - $w=$img->GetTextWidth($label); + $xt=round($this->ilabelposadj*$r*cos($a)+$xc); + $yt=round($yc-$this->ilabelposadj*$r*sin($a)); - if( $this->ilabelposadj > 1.0 && $this->ilabelposadj < 5.0) { - $r *= $this->ilabelposadj; - } - - $r += $img->GetFontHeight()/1.5; + $this->value->Stroke($img,$label,$xt,$yt); + } + else { - $xt=round($r*cos($a)+$xc); - $yt=round($yc-$r*sin($a)); + $this->value->halign = "left"; + $this->value->valign = "top"; + $this->value->margin = 0; - // Normalize angle - while( $a < 0 ) $a += 2*M_PI; - while( $a > 2*M_PI ) $a -= 2*M_PI; + // Position the axis title. + // dx, dy is the offset from the top left corner of the bounding box that sorrounds the text + // that intersects with the extension of the corresponding axis. The code looks a little + // bit messy but this is really the only way of having a reasonable position of the + // axis titles. + $this->value->ApplyFont($img); + $h=$img->GetTextHeight($label); + // For numeric values the format of the display value + // must be taken into account + if( is_numeric($label) ) { + if( $label > 0 ) + $w=$img->GetTextWidth(sprintf($this->value->format,$label)); + else + $w=$img->GetTextWidth(sprintf($this->value->negformat,$label)); + } + else + $w=$img->GetTextWidth($label); - if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0; - if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI; - if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1; - if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI); - - if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI; - if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI); - if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1; - if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI); - if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0; - - $this->value->Stroke($img,$label,$xt-$dx*$w,$yt-$dy*$h); - } - } + if( $this->ilabelposadj > 1.0 && $this->ilabelposadj < 5.0) { + $r *= $this->ilabelposadj; + } + + $r += $img->GetFontHeight()/1.5; + + $xt=round($r*cos($a)+$xc); + $yt=round($yc-$r*sin($a)); + + // Normalize angle + while( $a < 0 ) $a += 2*M_PI; + while( $a > 2*M_PI ) $a -= 2*M_PI; + + if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0; + if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI; + if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1; + if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI); + + if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI; + if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI); + if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1; + if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI); + if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0; + + $this->value->Stroke($img,$label,$xt-$dx*$w,$yt-$dy*$h); + } + } } // Class //=================================================== // CLASS PiePlotC -// Description: Same as a normal pie plot but with a +// Description: Same as a normal pie plot but with a // filled circle in the center //=================================================== class PiePlotC extends PiePlot { - private $imidsize=0.5; // Fraction of total width + private $imidsize=0.5; // Fraction of total width private $imidcolor='white'; public $midtitle=''; private $middlecsimtarget='',$middlecsimwintarget='',$middlecsimalt=''; - function PiePlotC($data,$aCenterTitle='') { - parent::PiePlot($data); - $this->midtitle = new Text(); - $this->midtitle->ParagraphAlign('center'); + function __construct($data,$aCenterTitle='') { + parent::__construct($data); + $this->midtitle = new Text(); + $this->midtitle->ParagraphAlign('center'); } function SetMid($aTitle,$aColor='white',$aSize=0.5) { - $this->midtitle->Set($aTitle); + $this->midtitle->Set($aTitle); - $this->imidsize = $aSize ; - $this->imidcolor = $aColor ; + $this->imidsize = $aSize ; + $this->imidcolor = $aColor ; } function SetMidTitle($aTitle) { - $this->midtitle->Set($aTitle); + $this->midtitle->Set($aTitle); } function SetMidSize($aSize) { - $this->imidsize = $aSize ; + $this->imidsize = $aSize ; } function SetMidColor($aColor) { - $this->imidcolor = $aColor ; + $this->imidcolor = $aColor ; } function SetMidCSIM($aTarget,$aAlt='',$aWinTarget='') { - $this->middlecsimtarget = $aTarget; - $this->middlecsimwintarget = $aWinTarget; - $this->middlecsimalt = $aAlt; + $this->middlecsimtarget = $aTarget; + $this->middlecsimwintarget = $aWinTarget; + $this->middlecsimalt = $aAlt; } - function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) { + function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) { //Slice number, ellipse centre (x,y), radius, start angle, end angle - while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI; - while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI; + while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI; + while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI; - $sa = 2*M_PI - $sa; - $ea = 2*M_PI - $ea; + $sa = 2*M_PI - $sa; + $ea = 2*M_PI - $ea; - // Special case when we have only one slice since then both start and end - // angle will be == 0 - if( abs($sa - $ea) < 0.0001 ) { - $sa=2*M_PI; $ea=0; - } + // Special case when we have only one slice since then both start and end + // angle will be == 0 + if( abs($sa - $ea) < 0.0001 ) { + $sa=2*M_PI; $ea=0; + } - // Add inner circle first point - $xp = floor(($this->imidsize*$radius*cos($ea))+$xc); - $yp = floor($yc-($this->imidsize*$radius*sin($ea))); - $coords = "$xp, $yp"; - - //add coordinates every 0.25 radians - $a=$ea+0.25; + // Add inner circle first point + $xp = floor(($this->imidsize*$radius*cos($ea))+$xc); + $yp = floor($yc-($this->imidsize*$radius*sin($ea))); + $coords = "$xp, $yp"; - // If we cross the 360-limit with a slice we need to handle - // the fact that end angle is smaller than start - if( $sa < $ea ) { - while ($a <= 2*M_PI) { - $xp = floor($radius*cos($a)+$xc); - $yp = floor($yc-$radius*sin($a)); - $coords.= ", $xp, $yp"; - $a += 0.25; - } - $a -= 2*M_PI; - } + //add coordinates every 0.25 radians + $a=$ea+0.25; - while ($a < $sa) { - $xp = floor(($this->imidsize*$radius*cos($a)+$xc)); - $yp = floor($yc-($this->imidsize*$radius*sin($a))); - $coords.= ", $xp, $yp"; - $a += 0.25; - } + // If we cross the 360-limit with a slice we need to handle + // the fact that end angle is smaller than start + if( $sa < $ea ) { + while ($a <= 2*M_PI) { + $xp = floor($radius*cos($a)+$xc); + $yp = floor($yc-$radius*sin($a)); + $coords.= ", $xp, $yp"; + $a += 0.25; + } + $a -= 2*M_PI; + } - // Make sure we end at the last point - $xp = floor(($this->imidsize*$radius*cos($sa)+$xc)); - $yp = floor($yc-($this->imidsize*$radius*sin($sa))); - $coords.= ", $xp, $yp"; + while ($a < $sa) { + $xp = floor(($this->imidsize*$radius*cos($a)+$xc)); + $yp = floor($yc-($this->imidsize*$radius*sin($a))); + $coords.= ", $xp, $yp"; + $a += 0.25; + } - // Straight line to outer circle - $xp = floor($radius*cos($sa)+$xc); - $yp = floor($yc-$radius*sin($sa)); - $coords.= ", $xp, $yp"; + // Make sure we end at the last point + $xp = floor(($this->imidsize*$radius*cos($sa)+$xc)); + $yp = floor($yc-($this->imidsize*$radius*sin($sa))); + $coords.= ", $xp, $yp"; - //add coordinates every 0.25 radians - $a=$sa - 0.25; - while ($a > $ea) { - $xp = floor($radius*cos($a)+$xc); - $yp = floor($yc-$radius*sin($a)); - $coords.= ", $xp, $yp"; - $a -= 0.25; - } - - //Add the last point on the arc - $xp = floor($radius*cos($ea)+$xc); - $yp = floor($yc-$radius*sin($ea)); - $coords.= ", $xp, $yp"; + // Straight line to outer circle + $xp = floor($radius*cos($sa)+$xc); + $yp = floor($yc-$radius*sin($sa)); + $coords.= ", $xp, $yp"; - // Close the arc - $xp = floor(($this->imidsize*$radius*cos($ea))+$xc); - $yp = floor($yc-($this->imidsize*$radius*sin($ea))); - $coords .= ", $xp, $yp"; + //add coordinates every 0.25 radians + $a=$sa - 0.25; + while ($a > $ea) { + $xp = floor($radius*cos($a)+$xc); + $yp = floor($yc-$radius*sin($a)); + $coords.= ", $xp, $yp"; + $a -= 0.25; + } - if( !empty($this->csimtargets[$i]) ) { - $this->csimareas .= "csimtargets[$i]."\""; - if( !empty($this->csimwintargets[$i]) ) { - $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; - } - if( !empty($this->csimalts[$i]) ) { - $tmp=sprintf($this->csimalts[$i],$this->data[$i]); - $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimareas .= " />\n"; - } + //Add the last point on the arc + $xp = floor($radius*cos($ea)+$xc); + $yp = floor($yc-$radius*sin($ea)); + $coords.= ", $xp, $yp"; + + // Close the arc + $xp = floor(($this->imidsize*$radius*cos($ea))+$xc); + $yp = floor($yc-($this->imidsize*$radius*sin($ea))); + $coords .= ", $xp, $yp"; + + if( !empty($this->csimtargets[$i]) ) { + $this->csimareas .= "csimtargets[$i]."\""; + if( !empty($this->csimwintargets[$i]) ) { + $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; + } + if( !empty($this->csimalts[$i]) ) { + $tmp=sprintf($this->csimalts[$i],$this->data[$i]); + $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimareas .= " />\n"; + } } function Stroke($img,$aaoption=0) { - // Stroke the pie but don't stroke values - $tmp = $this->value->show; - $this->value->show = false; - parent::Stroke($img,$aaoption); - $this->value->show = $tmp; + // Stroke the pie but don't stroke values + $tmp = $this->value->show; + $this->value->show = false; + parent::Stroke($img,$aaoption); + $this->value->show = $tmp; - $xc = round($this->posx*$img->width); - $yc = round($this->posy*$img->height); + $xc = round($this->posx*$img->width); + $yc = round($this->posy*$img->height); - $radius = floor($this->radius * min($img->width,$img->height)) ; + $radius = floor($this->radius * min($img->width,$img->height)) ; - if( $this->imidsize > 0 && $aaoption !== 2 ) { + if( $this->imidsize > 0 && $aaoption !== 2 ) { - if( $this->ishadowcolor != "" ) { - $img->SetColor($this->ishadowcolor); - $img->FilledCircle($xc+$this->ishadowdrop,$yc+$this->ishadowdrop, - round($radius*$this->imidsize)); - } + if( $this->ishadowcolor != "" ) { + $img->SetColor($this->ishadowcolor); + $img->FilledCircle($xc+$this->ishadowdrop,$yc+$this->ishadowdrop, + round($radius*$this->imidsize)); + } - $img->SetColor($this->imidcolor); - $img->FilledCircle($xc,$yc,round($radius*$this->imidsize)); + $img->SetColor($this->imidcolor); + $img->FilledCircle($xc,$yc,round($radius*$this->imidsize)); - if( $this->pie_border && $aaoption === 0 ) { - $img->SetColor($this->color); - $img->Circle($xc,$yc,round($radius*$this->imidsize)); - } + if( $this->pie_border && $aaoption === 0 ) { + $img->SetColor($this->color); + $img->Circle($xc,$yc,round($radius*$this->imidsize)); + } - if( !empty($this->middlecsimtarget) ) - $this->AddMiddleCSIM($xc,$yc,round($radius*$this->imidsize)); + if( !empty($this->middlecsimtarget) ) + $this->AddMiddleCSIM($xc,$yc,round($radius*$this->imidsize)); - } + } - if( $this->value->show && $aaoption !== 1) { - $this->StrokeAllLabels($img,$xc,$yc,$radius); - $this->midtitle->SetPos($xc,$yc,'center','center'); - $this->midtitle->Stroke($img); - } + if( $this->value->show && $aaoption !== 1) { + $this->StrokeAllLabels($img,$xc,$yc,$radius); + $this->midtitle->SetPos($xc,$yc,'center','center'); + $this->midtitle->Stroke($img); + } } function AddMiddleCSIM($xc,$yc,$r) { - $xc=round($xc);$yc=round($yc);$r=round($r); - $this->csimareas .= "middlecsimtarget."\""; - if( !empty($this->middlecsimwintarget) ) { - $this->csimareas .= " target=\"".$this->middlecsimwintarget."\""; - } - if( !empty($this->middlecsimalt) ) { - $tmp = $this->middlecsimalt; - $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimareas .= " />\n"; + $xc=round($xc);$yc=round($yc);$r=round($r); + $this->csimareas .= "middlecsimtarget."\""; + if( !empty($this->middlecsimwintarget) ) { + $this->csimareas .= " target=\"".$this->middlecsimwintarget."\""; + } + if( !empty($this->middlecsimalt) ) { + $tmp = $this->middlecsimalt; + $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimareas .= " />\n"; } function StrokeLabel($label,$img,$xc,$yc,$a,$r) { - if( $this->ilabelposadj === 'auto' ) - $this->ilabelposadj = (1-$this->imidsize)/2+$this->imidsize; + if( $this->ilabelposadj === 'auto' ) + $this->ilabelposadj = (1-$this->imidsize)/2+$this->imidsize; - parent::StrokeLabel($label,$img,$xc,$yc,$a,$r); + parent::StrokeLabel($label,$img,$xc,$yc,$a,$r); } @@ -1204,234 +1219,241 @@ class PiePlotC extends PiePlot { //=================================================== // CLASS PieGraph -// Description: +// Description: //=================================================== class PieGraph extends Graph { - private $posx, $posy, $radius; - private $legends=array(); + private $posx, $posy, $radius; + private $legends=array(); public $plots=array(); public $pieaa = false ; -//--------------- -// CONSTRUCTOR - function PieGraph($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) { - $this->Graph($width,$height,$cachedName,$timeout,$inline); - $this->posx=$width/2; - $this->posy=$height/2; - $this->SetColor(array(255,255,255)); + //--------------- + // CONSTRUCTOR + function __construct($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) { + parent::__construct($width,$height,$cachedName,$timeout,$inline); + $this->posx=$width/2; + $this->posy=$height/2; + $this->SetColor(array(255,255,255)); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function Add($aObj) { - if( is_array($aObj) && count($aObj) > 0 ) - $cl = $aObj[0]; - else - $cl = $aObj; + if( is_array($aObj) && count($aObj) > 0 ) + $cl = $aObj[0]; + else + $cl = $aObj; - if( $cl instanceof Text ) - $this->AddText($aObj); - elseif( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) - $this->AddIcon($aObj); - else { - if( is_array($aObj) ) { - $n = count($aObj); - for($i=0; $i < $n; ++$i ) { - $this->plots[] = $aObj[$i]; - } - } - else { - $this->plots[] = $aObj; - } - } + if( $cl instanceof Text ) + $this->AddText($aObj); + elseif( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) + $this->AddIcon($aObj); + else { + if( is_array($aObj) ) { + $n = count($aObj); + for($i=0; $i < $n; ++$i ) { + $this->plots[] = $aObj[$i]; + } + } + else { + $this->plots[] = $aObj; + } + } } function SetAntiAliasing($aFlg=true) { - $this->pieaa = $aFlg; + $this->pieaa = $aFlg; } - + function SetColor($c) { - $this->SetMarginColor($c); + $this->SetMarginColor($c); } function DisplayCSIMAreas() { - $csim=""; - foreach($this->plots as $p ) { - $csim .= $p->GetCSIMareas(); - } - //$csim.= $this->legend->GetCSIMareas(); - if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) { - $this->img->SetColor($this->csimcolor); - $n = count($coords[0]); - for ($i=0; $i < $n; $i++) { - if ($coords[1][$i]=="poly") { - preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts); - $this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]); - $m = count($pts[0]); - for ($j=0; $j < $m; $j++) { - $this->img->LineTo($pts[1][$j],$pts[2][$j]); - } - } else if ($coords[1][$i]=="rect") { - $pts = preg_split('/,/', $coords[2][$i]); - $this->img->SetStartPoint($pts[0],$pts[1]); - $this->img->LineTo($pts[2],$pts[1]); - $this->img->LineTo($pts[2],$pts[3]); - $this->img->LineTo($pts[0],$pts[3]); - $this->img->LineTo($pts[0],$pts[1]); - - } - } - } + $csim=""; + foreach($this->plots as $p ) { + $csim .= $p->GetCSIMareas(); + } + //$csim.= $this->legend->GetCSIMareas(); + if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) { + $this->img->SetColor($this->csimcolor); + $n = count($coords[0]); + for ($i=0; $i < $n; $i++) { + if ($coords[1][$i]=="poly") { + preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts); + $this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]); + $m = count($pts[0]); + for ($j=0; $j < $m; $j++) { + $this->img->LineTo($pts[1][$j],$pts[2][$j]); + } + } else if ($coords[1][$i]=="rect") { + $pts = preg_split('/,/', $coords[2][$i]); + $this->img->SetStartPoint($pts[0],$pts[1]); + $this->img->LineTo($pts[2],$pts[1]); + $this->img->LineTo($pts[2],$pts[3]); + $this->img->LineTo($pts[0],$pts[3]); + $this->img->LineTo($pts[0],$pts[1]); + + } + } + } } // Method description function Stroke($aStrokeFileName="") { - // If the filename is the predefined value = '_csim_special_' - // we assume that the call to stroke only needs to do enough - // to correctly generate the CSIM maps. - // We use this variable to skip things we don't strictly need - // to do to generate the image map to improve performance - // a best we can. Therefor you will see a lot of tests !$_csim in the - // code below. - $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); + // If the filename is the predefined value = '_csim_special_' + // we assume that the call to stroke only needs to do enough + // to correctly generate the CSIM maps. + // We use this variable to skip things we don't strictly need + // to do to generate the image map to improve performance + // a best we can. Therefor you will see a lot of tests !$_csim in the + // code below. + $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); - // We need to know if we have stroked the plot in the - // GetCSIMareas. Otherwise the CSIM hasn't been generated - // and in the case of GetCSIM called before stroke to generate - // CSIM without storing an image to disk GetCSIM must call Stroke. - $this->iHasStroked = true; + // If we are called the second time (perhaps the user has called GetHTMLImageMap() + // himself then the legends have alsready been populated once in order to get the + // CSIM coordinats. Since we do not want the legends to be populated a second time + // we clear the legends + $this->legend->Clear(); - $n = count($this->plots); + // We need to know if we have stroked the plot in the + // GetCSIMareas. Otherwise the CSIM hasn't been generated + // and in the case of GetCSIM called before stroke to generate + // CSIM without storing an image to disk GetCSIM must call Stroke. + $this->iHasStroked = true; - if( $this->pieaa ) { + $n = count($this->plots); - if( !$_csim ) { - if( $this->background_image != "" ) { - $this->StrokeFrameBackground(); - } - else { - $this->StrokeFrame(); - $this->StrokeBackgroundGrad(); - } - } + if( $this->pieaa ) { + + if( !$_csim ) { + if( $this->background_image != "" ) { + $this->StrokeFrameBackground(); + } + else { + $this->StrokeFrame(); + $this->StrokeBackgroundGrad(); + } + } - $w = $this->img->width; - $h = $this->img->height; - $oldimg = $this->img->img; + $w = $this->img->width; + $h = $this->img->height; + $oldimg = $this->img->img; - $this->img->CreateImgCanvas(2*$w,2*$h); - - $this->img->SetColor( $this->margin_color ); - $this->img->FilledRectangle(0,0,2*$w-1,2*$h-1); + $this->img->CreateImgCanvas(2*$w,2*$h); - // Make all icons *2 i size since we will be scaling down the - // imahe to do the anti aliasing - $ni = count($this->iIcons); - for($i=0; $i < $ni; ++$i) { - $this->iIcons[$i]->iScale *= 2 ; - if( $this->iIcons[$i]->iX > 1 ) - $this->iIcons[$i]->iX *= 2 ; - if( $this->iIcons[$i]->iY > 1 ) - $this->iIcons[$i]->iY *= 2 ; - } + $this->img->SetColor( $this->margin_color ); + $this->img->FilledRectangle(0,0,2*$w-1,2*$h-1); - $this->StrokeIcons(); + // Make all icons *2 i size since we will be scaling down the + // imahe to do the anti aliasing + $ni = count($this->iIcons); + for($i=0; $i < $ni; ++$i) { + $this->iIcons[$i]->iScale *= 2 ; + if( $this->iIcons[$i]->iX > 1 ) + $this->iIcons[$i]->iX *= 2 ; + if( $this->iIcons[$i]->iY > 1 ) + $this->iIcons[$i]->iY *= 2 ; + } - for($i=0; $i < $n; ++$i) { - if( $this->plots[$i]->posx > 1 ) - $this->plots[$i]->posx *= 2 ; - if( $this->plots[$i]->posy > 1 ) - $this->plots[$i]->posy *= 2 ; + $this->StrokeIcons(); - $this->plots[$i]->Stroke($this->img,1); + for($i=0; $i < $n; ++$i) { + if( $this->plots[$i]->posx > 1 ) + $this->plots[$i]->posx *= 2 ; + if( $this->plots[$i]->posy > 1 ) + $this->plots[$i]->posy *= 2 ; - if( $this->plots[$i]->posx > 1 ) - $this->plots[$i]->posx /= 2 ; - if( $this->plots[$i]->posy > 1 ) - $this->plots[$i]->posy /= 2 ; - } + $this->plots[$i]->Stroke($this->img,1); - $indent = $this->doframe ? ($this->frame_weight + ($this->doshadow ? $this->shadow_width : 0 )) : 0 ; - $indent += $this->framebevel ? $this->framebeveldepth + 1 : 0 ; - $this->img->CopyCanvasH($oldimg,$this->img->img,$indent,$indent,$indent,$indent, - $w-2*$indent,$h-2*$indent,2*($w-$indent),2*($h-$indent)); + if( $this->plots[$i]->posx > 1 ) + $this->plots[$i]->posx /= 2 ; + if( $this->plots[$i]->posy > 1 ) + $this->plots[$i]->posy /= 2 ; + } - $this->img->img = $oldimg ; - $this->img->width = $w ; - $this->img->height = $h ; + $indent = $this->doframe ? ($this->frame_weight + ($this->doshadow ? $this->shadow_width : 0 )) : 0 ; + $indent += $this->framebevel ? $this->framebeveldepth + 1 : 0 ; + $this->img->CopyCanvasH($oldimg,$this->img->img,$indent,$indent,$indent,$indent, + $w-2*$indent,$h-2*$indent,2*($w-$indent),2*($h-$indent)); - for($i=0; $i < $n; ++$i) { - $this->plots[$i]->Stroke($this->img,2); // Stroke labels - $this->plots[$i]->Legend($this); - } + $this->img->img = $oldimg ; + $this->img->width = $w ; + $this->img->height = $h ; - } - else { + for($i=0; $i < $n; ++$i) { + $this->plots[$i]->Stroke($this->img,2); // Stroke labels + $this->plots[$i]->Legend($this); + } - if( !$_csim ) { - if( $this->background_image != "" ) { - $this->StrokeFrameBackground(); - } - else { - $this->StrokeFrame(); - } - } + } + else { - $this->StrokeIcons(); + if( !$_csim ) { + if( $this->background_image != "" ) { + $this->StrokeFrameBackground(); + } + else { + $this->StrokeFrame(); + $this->StrokeBackgroundGrad(); + } + } - for($i=0; $i < $n; ++$i) { - $this->plots[$i]->Stroke($this->img); - $this->plots[$i]->Legend($this); - } - } + $this->StrokeIcons(); - $this->legend->Stroke($this->img); - $this->footer->Stroke($this->img); - $this->StrokeTitles(); + for($i=0; $i < $n; ++$i) { + $this->plots[$i]->Stroke($this->img); + $this->plots[$i]->Legend($this); + } + } - if( !$_csim ) { + $this->legend->Stroke($this->img); + $this->footer->Stroke($this->img); + $this->StrokeTitles(); - // Stroke texts - if( $this->texts != null ) { - $n = count($this->texts); - for($i=0; $i < $n; ++$i ) { - $this->texts[$i]->Stroke($this->img); - } - } + if( !$_csim ) { - if( _JPG_DEBUG ) { - $this->DisplayCSIMAreas(); - } + // Stroke texts + if( $this->texts != null ) { + $n = count($this->texts); + for($i=0; $i < $n; ++$i ) { + $this->texts[$i]->Stroke($this->img); + } + } - // Should we do any final image transformation - if( $this->iImgTrans ) { - if( !class_exists('ImgTrans',false) ) { - require_once('jpgraph_imgtrans.php'); - //JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.'); - } - - $tform = new ImgTrans($this->img->img); - $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, - $this->iImgTransDirection,$this->iImgTransHighQ, - $this->iImgTransMinSize,$this->iImgTransFillColor, - $this->iImgTransBorder); - } + if( _JPG_DEBUG ) { + $this->DisplayCSIMAreas(); + } + + // Should we do any final image transformation + if( $this->iImgTrans ) { + if( !class_exists('ImgTrans',false) ) { + require_once('jpgraph_imgtrans.php'); + //JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.'); + } + + $tform = new ImgTrans($this->img->img); + $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, + $this->iImgTransDirection,$this->iImgTransHighQ, + $this->iImgTransMinSize,$this->iImgTransFillColor, + $this->iImgTransBorder); + } - // If the filename is given as the special "__handle" - // then the image handler is returned and the image is NOT - // streamed back - if( $aStrokeFileName == _IMG_HANDLER ) { - return $this->img->img; - } - else { - // Finally stream the generated picture - $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline, - $aStrokeFileName); - } - } + // If the filename is given as the special "__handle" + // then the image handler is returned and the image is NOT + // streamed back + if( $aStrokeFileName == _IMG_HANDLER ) { + return $this->img->img; + } + else { + // Finally stream the generated picture + $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline, + $aStrokeFileName); + } + } } } // Class diff --git a/libs/jpgraph/jpgraph_pie3d.php b/libs/jpgraph/jpgraph_pie3d.php index 8b6c1f4..45cb2b2 100644 --- a/libs/jpgraph/jpgraph_pie3d.php +++ b/libs/jpgraph/jpgraph_pie3d.php @@ -1,922 +1,932 @@ radius = 0.5; - $this->data = $data; - $this->title = new Text(""); - $this->title->SetFont(FF_FONT1,FS_BOLD); - $this->value = new DisplayValue(); - $this->value->Show(); - $this->value->SetFormat('%.0f%%'); + + //--------------- + // CONSTRUCTOR + function __construct($data) { + $this->radius = 0.5; + $this->data = $data; + $this->title = new Text(""); + $this->title->SetFont(FF_FONT1,FS_BOLD); + $this->value = new DisplayValue(); + $this->value->Show(); + $this->value->SetFormat('%.0f%%'); } -//--------------- -// PUBLIC METHODS - + //--------------- + // PUBLIC METHODS + // Set label arrays function SetLegends($aLegend) { - $this->legends = array_reverse(array_slice($aLegend,0,count($this->data))); + $this->legends = array_reverse(array_slice($aLegend,0,count($this->data))); } function SetSliceColors($aColors) { - $this->setslicecolors = $aColors; + $this->setslicecolors = $aColors; } function Legend($aGraph) { - parent::Legend($aGraph); - $aGraph->legend->txtcol = array_reverse($aGraph->legend->txtcol); + parent::Legend($aGraph); + $aGraph->legend->txtcol = array_reverse($aGraph->legend->txtcol); } function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') { - $this->csimtargets = $aTargets; - $this->csimwintargets = $aWinTargets; - $this->csimalts = $aAlts; + $this->csimtargets = $aTargets; + $this->csimwintargets = $aWinTargets; + $this->csimalts = $aAlts; } // Should the slices be separated by a line? If color is specified as "" no line // will be used to separate pie slices. function SetEdge($aColor='black',$aWeight=1) { - $this->edgecolor = $aColor; - $this->edgeweight = $aWeight; - } - - // Dummy function to make Pie3D behave in a similair way to 2D - function ShowBorder($exterior=true,$interior=true) { - JpGraphError::RaiseL(14001); -//('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.'); + $this->edgecolor = $aColor; + $this->edgeweight = $aWeight; } // Specify projection angle for 3D in degrees // Must be between 20 and 70 degrees function SetAngle($a) { - if( $a<5 || $a>90 ) - JpGraphError::RaiseL(14002); -//("PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees."); - else - $this->angle = $a; + if( $a<5 || $a>90 ) { + JpGraphError::RaiseL(14002); + //("PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees."); + } + else { + $this->angle = $a; + } } function Add3DSliceToCSIM($i,$xc,$yc,$height,$width,$thick,$sa,$ea) { //Slice number, ellipse centre (x,y), height, width, start angle, end angle - $sa *= M_PI/180; - $ea *= M_PI/180; + $sa *= M_PI/180; + $ea *= M_PI/180; - //add coordinates of the centre to the map - $coords = "$xc, $yc"; + //add coordinates of the centre to the map + $coords = "$xc, $yc"; - //add coordinates of the first point on the arc to the map - $xp = floor($width*cos($sa)/2+$xc); - $yp = floor($yc-$height*sin($sa)/2); - $coords.= ", $xp, $yp"; + //add coordinates of the first point on the arc to the map + $xp = floor($width*cos($sa)/2+$xc); + $yp = floor($yc-$height*sin($sa)/2); + $coords.= ", $xp, $yp"; - //If on the front half, add the thickness offset - if ($sa >= M_PI && $sa <= 2*M_PI*1.01) { - $yp = floor($yp+$thick); - $coords.= ", $xp, $yp"; - } - - //add coordinates every 0.2 radians - $a=$sa+0.2; - while ($a<$ea) { - $xp = floor($width*cos($a)/2+$xc); - if ($a >= M_PI && $a <= 2*M_PI*1.01) { - $yp = floor($yc-($height*sin($a)/2)+$thick); - } else { - $yp = floor($yc-$height*sin($a)/2); - } - $coords.= ", $xp, $yp"; - $a += 0.2; - } - - //Add the last point on the arc - $xp = floor($width*cos($ea)/2+$xc); - $yp = floor($yc-$height*sin($ea)/2); + //If on the front half, add the thickness offset + if ($sa >= M_PI && $sa <= 2*M_PI*1.01) { + $yp = floor($yp+$thick); + $coords.= ", $xp, $yp"; + } + + //add coordinates every 0.2 radians + $a=$sa+0.2; + while ($a<$ea) { + $xp = floor($width*cos($a)/2+$xc); + if ($a >= M_PI && $a <= 2*M_PI*1.01) { + $yp = floor($yc-($height*sin($a)/2)+$thick); + } else { + $yp = floor($yc-$height*sin($a)/2); + } + $coords.= ", $xp, $yp"; + $a += 0.2; + } + + //Add the last point on the arc + $xp = floor($width*cos($ea)/2+$xc); + $yp = floor($yc-$height*sin($ea)/2); - if ($ea >= M_PI && $ea <= 2*M_PI*1.01) { - $coords.= ", $xp, ".floor($yp+$thick); - } - $coords.= ", $xp, $yp"; - $alt=''; + if ($ea >= M_PI && $ea <= 2*M_PI*1.01) { + $coords.= ", $xp, ".floor($yp+$thick); + } + $coords.= ", $xp, $yp"; + $alt=''; - if( !empty($this->csimtargets[$i]) ) { - $this->csimareas .= "csimtargets[$i]."\""; - - if( !empty($this->csimwintargets[$i]) ) { - $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; - } - - if( !empty($this->csimalts[$i]) ) { - $tmp=sprintf($this->csimalts[$i],$this->data[$i]); - $this->csimareas .= "alt=\"$tmp\" title=\"$tmp\" "; - } - $this->csimareas .= " />\n"; - } + if( !empty($this->csimtargets[$i]) ) { + $this->csimareas .= "csimtargets[$i]."\""; + + if( !empty($this->csimwintargets[$i]) ) { + $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; + } + + if( !empty($this->csimalts[$i]) ) { + $tmp=sprintf($this->csimalts[$i],$this->data[$i]); + $this->csimareas .= "alt=\"$tmp\" title=\"$tmp\" "; + } + $this->csimareas .= " />\n"; + } } function SetLabels($aLabels,$aLblPosAdj="auto") { - $this->labels = $aLabels; - $this->ilabelposadj=$aLblPosAdj; + $this->labels = $aLabels; + $this->ilabelposadj=$aLblPosAdj; } - + // Distance from the pie to the labels function SetLabelMargin($m) { - $this->value->SetMargin($m); + $this->value->SetMargin($m); } - + // Show a thin line from the pie to the label for a specific slice function ShowLabelHint($f=true) { - $this->showlabelhint=$f; + $this->showlabelhint=$f; } - + // Set color of hint line to label for each slice function SetLabelHintColor($c) { - $this->labelhintcolor=$c; + $this->labelhintcolor=$c; } function SetHeight($aHeight) { - $this->iThickness = $aHeight; + $this->iThickness = $aHeight; } -// Normalize Angle between 0-360 + // Normalize Angle between 0-360 function NormAngle($a) { - // Normalize anle to 0 to 2M_PI - // - if( $a > 0 ) { - while($a > 360) $a -= 360; - } - else { - while($a < 0) $a += 360; - } - if( $a < 0 ) - $a = 360 + $a; + // Normalize anle to 0 to 2M_PI + // + if( $a > 0 ) { + while($a > 360) $a -= 360; + } + else { + while($a < 0) $a += 360; + } + if( $a < 0 ) + $a = 360 + $a; - if( $a == 360 ) $a=0; - return $a; + if( $a == 360 ) $a=0; + return $a; } - -// Draw one 3D pie slice at position ($xc,$yc) with height $z + + // Draw one 3D pie slice at position ($xc,$yc) with height $z function Pie3DSlice($img,$xc,$yc,$w,$h,$sa,$ea,$z,$fillcolor,$shadow=0.65) { - - // Due to the way the 3D Pie algorithm works we are - // guaranteed that any slice we get into this method - // belongs to either the left or right side of the - // pie ellipse. Hence, no slice will cross 90 or 270 - // point. - if( ($sa < 90 && $ea > 90) || ( ($sa > 90 && $sa < 270) && $ea > 270) ) { - JpGraphError::RaiseL(14003);//('Internal assertion failed. Pie3D::Pie3DSlice'); - exit(1); - } - $p[] = array(); + // Due to the way the 3D Pie algorithm works we are + // guaranteed that any slice we get into this method + // belongs to either the left or right side of the + // pie ellipse. Hence, no slice will cross 90 or 270 + // point. + if( ($sa < 90 && $ea > 90) || ( ($sa > 90 && $sa < 270) && $ea > 270) ) { + JpGraphError::RaiseL(14003);//('Internal assertion failed. Pie3D::Pie3DSlice'); + exit(1); + } - // Setup pre-calculated values - $rsa = $sa/180*M_PI; // to Rad - $rea = $ea/180*M_PI; // to Rad - $sinsa = sin($rsa); - $cossa = cos($rsa); - $sinea = sin($rea); - $cosea = cos($rea); + $p[] = array(); - // p[] is the points for the overall slice and - // pt[] is the points for the top pie + // Setup pre-calculated values + $rsa = $sa/180*M_PI; // to Rad + $rea = $ea/180*M_PI; // to Rad + $sinsa = sin($rsa); + $cossa = cos($rsa); + $sinea = sin($rea); + $cosea = cos($rea); - // Angular step when approximating the arc with a polygon train. - $step = 0.05; + // p[] is the points for the overall slice and + // pt[] is the points for the top pie - if( $sa >= 270 ) { - if( $ea > 360 || ($ea > 0 && $ea <= 90) ) { - if( $ea > 0 && $ea <= 90 ) { - // Adjust angle to simplify conditions in loops - $rea += 2*M_PI; - } + // Angular step when approximating the arc with a polygon train. + $step = 0.05; - $p = array($xc,$yc,$xc,$yc+$z, - $xc+$w*$cossa,$z+$yc-$h*$sinsa); - $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); + if( $sa >= 270 ) { + if( $ea > 360 || ($ea > 0 && $ea <= 90) ) { + if( $ea > 0 && $ea <= 90 ) { + // Adjust angle to simplify conditions in loops + $rea += 2*M_PI; + } - for( $a=$rsa; $a < 2*M_PI; $a += $step ) { - $tca = cos($a); - $tsa = sin($a); - $p[] = $xc+$w*$tca; - $p[] = $z+$yc-$h*$tsa; - $pt[] = $xc+$w*$tca; - $pt[] = $yc-$h*$tsa; - } + $p = array($xc,$yc,$xc,$yc+$z, + $xc+$w*$cossa,$z+$yc-$h*$sinsa); + $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); - $pt[] = $xc+$w; - $pt[] = $yc; + for( $a=$rsa; $a < 2*M_PI; $a += $step ) { + $tca = cos($a); + $tsa = sin($a); + $p[] = $xc+$w*$tca; + $p[] = $z+$yc-$h*$tsa; + $pt[] = $xc+$w*$tca; + $pt[] = $yc-$h*$tsa; + } - $p[] = $xc+$w; - $p[] = $z+$yc; - $p[] = $xc+$w; - $p[] = $yc; - $p[] = $xc; - $p[] = $yc; + $pt[] = $xc+$w; + $pt[] = $yc; - for( $a=2*M_PI+$step; $a < $rea; $a += $step ) { - $pt[] = $xc + $w*cos($a); - $pt[] = $yc - $h*sin($a); - } - - $pt[] = $xc+$w*$cosea; - $pt[] = $yc-$h*$sinea; - $pt[] = $xc; - $pt[] = $yc; + $p[] = $xc+$w; + $p[] = $z+$yc; + $p[] = $xc+$w; + $p[] = $yc; + $p[] = $xc; + $p[] = $yc; - } - else { - $p = array($xc,$yc,$xc,$yc+$z, - $xc+$w*$cossa,$z+$yc-$h*$sinsa); - $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); - - $rea = $rea == 0.0 ? 2*M_PI : $rea; - for( $a=$rsa; $a < $rea; $a += $step ) { - $tca = cos($a); - $tsa = sin($a); - $p[] = $xc+$w*$tca; - $p[] = $z+$yc-$h*$tsa; - $pt[] = $xc+$w*$tca; - $pt[] = $yc-$h*$tsa; - } + for( $a=2*M_PI+$step; $a < $rea; $a += $step ) { + $pt[] = $xc + $w*cos($a); + $pt[] = $yc - $h*sin($a); + } - $pt[] = $xc+$w*$cosea; - $pt[] = $yc-$h*$sinea; - $pt[] = $xc; - $pt[] = $yc; - - $p[] = $xc+$w*$cosea; - $p[] = $z+$yc-$h*$sinea; - $p[] = $xc+$w*$cosea; - $p[] = $yc-$h*$sinea; - $p[] = $xc; - $p[] = $yc; - } - } - elseif( $sa >= 180 ) { - $p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea); - $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea); - - for( $a=$rea; $a>$rsa; $a -= $step ) { - $tca = cos($a); - $tsa = sin($a); - $p[] = $xc+$w*$tca; - $p[] = $z+$yc-$h*$tsa; - $pt[] = $xc+$w*$tca; - $pt[] = $yc-$h*$tsa; - } + $pt[] = $xc+$w*$cosea; + $pt[] = $yc-$h*$sinea; + $pt[] = $xc; + $pt[] = $yc; - $pt[] = $xc+$w*$cossa; - $pt[] = $yc-$h*$sinsa; - $pt[] = $xc; - $pt[] = $yc; - - $p[] = $xc+$w*$cossa; - $p[] = $z+$yc-$h*$sinsa; - $p[] = $xc+$w*$cossa; - $p[] = $yc-$h*$sinsa; - $p[] = $xc; - $p[] = $yc; - - } - elseif( $sa >= 90 ) { - if( $ea > 180 ) { - $p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea); - $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea); + } + else { + $p = array($xc,$yc,$xc,$yc+$z, + $xc+$w*$cossa,$z+$yc-$h*$sinsa); + $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); - for( $a=$rea; $a > M_PI; $a -= $step ) { - $tca = cos($a); - $tsa = sin($a); - $p[] = $xc+$w*$tca; - $p[] = $z + $yc - $h*$tsa; - $pt[] = $xc+$w*$tca; - $pt[] = $yc-$h*$tsa; - } + $rea = $rea == 0.0 ? 2*M_PI : $rea; + for( $a=$rsa; $a < $rea; $a += $step ) { + $tca = cos($a); + $tsa = sin($a); + $p[] = $xc+$w*$tca; + $p[] = $z+$yc-$h*$tsa; + $pt[] = $xc+$w*$tca; + $pt[] = $yc-$h*$tsa; + } - $p[] = $xc-$w; - $p[] = $z+$yc; - $p[] = $xc-$w; - $p[] = $yc; - $p[] = $xc; - $p[] = $yc; + $pt[] = $xc+$w*$cosea; + $pt[] = $yc-$h*$sinea; + $pt[] = $xc; + $pt[] = $yc; - $pt[] = $xc-$w; - $pt[] = $z+$yc; - $pt[] = $xc-$w; - $pt[] = $yc; + $p[] = $xc+$w*$cosea; + $p[] = $z+$yc-$h*$sinea; + $p[] = $xc+$w*$cosea; + $p[] = $yc-$h*$sinea; + $p[] = $xc; + $p[] = $yc; + } + } + elseif( $sa >= 180 ) { + $p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea); + $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea); - for( $a=M_PI-$step; $a > $rsa; $a -= $step ) { - $pt[] = $xc + $w*cos($a); - $pt[] = $yc - $h*sin($a); - } + for( $a=$rea; $a>$rsa; $a -= $step ) { + $tca = cos($a); + $tsa = sin($a); + $p[] = $xc+$w*$tca; + $p[] = $z+$yc-$h*$tsa; + $pt[] = $xc+$w*$tca; + $pt[] = $yc-$h*$tsa; + } - $pt[] = $xc+$w*$cossa; - $pt[] = $yc-$h*$sinsa; - $pt[] = $xc; - $pt[] = $yc; + $pt[] = $xc+$w*$cossa; + $pt[] = $yc-$h*$sinsa; + $pt[] = $xc; + $pt[] = $yc; - } - else { // $sa >= 90 && $ea <= 180 - $p = array($xc,$yc,$xc,$yc+$z, - $xc+$w*$cosea,$z+$yc-$h*$sinea, - $xc+$w*$cosea,$yc-$h*$sinea, - $xc,$yc); + $p[] = $xc+$w*$cossa; + $p[] = $z+$yc-$h*$sinsa; + $p[] = $xc+$w*$cossa; + $p[] = $yc-$h*$sinsa; + $p[] = $xc; + $p[] = $yc; - $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea); + } + elseif( $sa >= 90 ) { + if( $ea > 180 ) { + $p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea); + $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea); - for( $a=$rea; $a>$rsa; $a -= $step ) { - $pt[] = $xc + $w*cos($a); - $pt[] = $yc - $h*sin($a); - } + for( $a=$rea; $a > M_PI; $a -= $step ) { + $tca = cos($a); + $tsa = sin($a); + $p[] = $xc+$w*$tca; + $p[] = $z + $yc - $h*$tsa; + $pt[] = $xc+$w*$tca; + $pt[] = $yc-$h*$tsa; + } - $pt[] = $xc+$w*$cossa; - $pt[] = $yc-$h*$sinsa; - $pt[] = $xc; - $pt[] = $yc; + $p[] = $xc-$w; + $p[] = $z+$yc; + $p[] = $xc-$w; + $p[] = $yc; + $p[] = $xc; + $p[] = $yc; - } - } - else { // sa > 0 && ea < 90 + $pt[] = $xc-$w; + $pt[] = $z+$yc; + $pt[] = $xc-$w; + $pt[] = $yc; - $p = array($xc,$yc,$xc,$yc+$z, - $xc+$w*$cossa,$z+$yc-$h*$sinsa, - $xc+$w*$cossa,$yc-$h*$sinsa, - $xc,$yc); + for( $a=M_PI-$step; $a > $rsa; $a -= $step ) { + $pt[] = $xc + $w*cos($a); + $pt[] = $yc - $h*sin($a); + } - $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); + $pt[] = $xc+$w*$cossa; + $pt[] = $yc-$h*$sinsa; + $pt[] = $xc; + $pt[] = $yc; - for( $a=$rsa; $a < $rea; $a += $step ) { - $pt[] = $xc + $w*cos($a); - $pt[] = $yc - $h*sin($a); - } + } + else { // $sa >= 90 && $ea <= 180 + $p = array($xc,$yc,$xc,$yc+$z, + $xc+$w*$cosea,$z+$yc-$h*$sinea, + $xc+$w*$cosea,$yc-$h*$sinea, + $xc,$yc); - $pt[] = $xc+$w*$cosea; - $pt[] = $yc-$h*$sinea; - $pt[] = $xc; - $pt[] = $yc; - } - - $img->PushColor($fillcolor.":".$shadow); - $img->FilledPolygon($p); - $img->PopColor(); + $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea); - $img->PushColor($fillcolor); - $img->FilledPolygon($pt); - $img->PopColor(); + for( $a=$rea; $a>$rsa; $a -= $step ) { + $pt[] = $xc + $w*cos($a); + $pt[] = $yc - $h*sin($a); + } + + $pt[] = $xc+$w*$cossa; + $pt[] = $yc-$h*$sinsa; + $pt[] = $xc; + $pt[] = $yc; + + } + } + else { // sa > 0 && ea < 90 + + $p = array($xc,$yc,$xc,$yc+$z, + $xc+$w*$cossa,$z+$yc-$h*$sinsa, + $xc+$w*$cossa,$yc-$h*$sinsa, + $xc,$yc); + + $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); + + for( $a=$rsa; $a < $rea; $a += $step ) { + $pt[] = $xc + $w*cos($a); + $pt[] = $yc - $h*sin($a); + } + + $pt[] = $xc+$w*$cosea; + $pt[] = $yc-$h*$sinea; + $pt[] = $xc; + $pt[] = $yc; + } + + $img->PushColor($fillcolor.":".$shadow); + $img->FilledPolygon($p); + $img->PopColor(); + + $img->PushColor($fillcolor); + $img->FilledPolygon($pt); + $img->PopColor(); } function SetStartAngle($aStart) { - if( $aStart < 0 || $aStart > 360 ) { - JpGraphError::RaiseL(14004);//('Slice start angle must be between 0 and 360 degrees.'); - } - $this->startangle = $aStart; + if( $aStart < 0 || $aStart > 360 ) { + JpGraphError::RaiseL(14004);//('Slice start angle must be between 0 and 360 degrees.'); + } + $this->startangle = $aStart; } - -// Draw a 3D Pie + + // Draw a 3D Pie function Pie3D($aaoption,$img,$data,$colors,$xc,$yc,$d,$angle,$z, - $shadow=0.65,$startangle=0,$edgecolor="",$edgeweight=1) { + $shadow=0.65,$startangle=0,$edgecolor="",$edgeweight=1) { - //--------------------------------------------------------------------------- - // As usual the algorithm get more complicated than I originally - // envisioned. I believe that this is as simple as it is possible - // to do it with the features I want. It's a good exercise to start - // thinking on how to do this to convince your self that all this - // is really needed for the general case. - // - // The algorithm two draw 3D pies without "real 3D" is done in - // two steps. - // First imagine the pie cut in half through a thought line between - // 12'a clock and 6'a clock. It now easy to imagine that we can plot - // the individual slices for each half by starting with the topmost - // pie slice and continue down to 6'a clock. - // - // In the algortithm this is done in three principal steps - // Step 1. Do the knife cut to ensure by splitting slices that extends - // over the cut line. This is done by splitting the original slices into - // upto 3 subslices. - // Step 2. Find the top slice for each half - // Step 3. Draw the slices from top to bottom - // - // The thing that slightly complicates this scheme with all the - // angle comparisons below is that we can have an arbitrary start - // angle so we must take into account the different equivalence classes. - // For the same reason we must walk through the angle array in a - // modulo fashion. - // - // Limitations of algorithm: - // * A small exploded slice which crosses the 270 degree point - // will get slightly nagged close to the center due to the fact that - // we print the slices in Z-order and that the slice left part - // get printed first and might get slightly nagged by a larger - // slice on the right side just before the right part of the small - // slice. Not a major problem though. - //--------------------------------------------------------------------------- - - - // Determine the height of the ellippse which gives an - // indication of the inclination angle - $h = ($angle/90.0)*$d; - $sum = 0; - for($i=0; $ilabeltype == 2 ) { - $this->adjusted_data = $this->AdjPercentage($data); - } - - // Setup the start - $accsum = 0; - $a = $startangle; - $a = $this->NormAngle($a); - - // - // Step 1 . Split all slices that crosses 90 or 270 - // - $idx=0; - $adjexplode=array(); - $numcolors = count($colors); - for($i=0; $iexplode_radius[$i]) ) - $this->explode_radius[$i]=0; - - $expscale=1; - if( $aaoption == 1 ) - $expscale=2; - - $la = $a + $da/2; - $explode = array( $xc + $this->explode_radius[$i]*cos($la*M_PI/180)*$expscale, - $yc - $this->explode_radius[$i]*sin($la*M_PI/180) * ($h/$d) *$expscale ); - $adjexplode[$idx] = $explode; - $labeldata[$i] = array($la,$explode[0],$explode[1]); - $originalangles[$i] = array($a,$a+$da); - - $ne = $this->NormAngle($a+$da); - if( $da <= 180 ) { - // If the slice size is <= 90 it can at maximum cut across - // one boundary (either 90 or 270) where it needs to be split - $split=-1; // no split - if( ($da<=90 && ($a <= 90 && $ne > 90)) || - (($da <= 180 && $da >90) && (($a < 90 || $a >= 270) && $ne > 90)) ) { - $split = 90; - } - elseif( ($da<=90 && ($a <= 270 && $ne > 270)) || - (($da<=180 && $da>90) && ($a >= 90 && $a < 270 && ($a+$da) > 270 )) ) { - $split = 270; - } - if( $split > 0 ) { // split in two - $angles[$idx] = array($a,$split); - $adjcolors[$idx] = $colors[$i % $numcolors]; - $adjexplode[$idx] = $explode; - $angles[++$idx] = array($split,$ne); - $adjcolors[$idx] = $colors[$i % $numcolors]; - $adjexplode[$idx] = $explode; - } - else { // no split - $angles[$idx] = array($a,$ne); - $adjcolors[$idx] = $colors[$i % $numcolors]; - $adjexplode[$idx] = $explode; - } - } - else { - // da>180 - // Slice may, depending on position, cross one or two - // bonudaries - - if( $a < 90 ) - $split = 90; - elseif( $a <= 270 ) - $split = 270; - else - $split = 90; - - $angles[$idx] = array($a,$split); - $adjcolors[$idx] = $colors[$i % $numcolors]; - $adjexplode[$idx] = $explode; - //if( $a+$da > 360-$split ) { - // For slices larger than 270 degrees we might cross - // another boundary as well. This means that we must - // split the slice further. The comparison gets a little - // bit complicated since we must take into accound that - // a pie might have a startangle >0 and hence a slice might - // wrap around the 0 angle. - // Three cases: - // a) Slice starts before 90 and hence gets a split=90, but - // we must also check if we need to split at 270 - // b) Slice starts after 90 but before 270 and slices - // crosses 90 (after a wrap around of 0) - // c) If start is > 270 (hence the firstr split is at 90) - // and the slice is so large that it goes all the way - // around 270. - if( ($a < 90 && ($a+$da > 270)) || - ($a > 90 && $a<=270 && ($a+$da>360+90) ) || - ($a > 270 && $this->NormAngle($a+$da)>270) ) { - $angles[++$idx] = array($split,360-$split); - $adjcolors[$idx] = $colors[$i % $numcolors]; - $adjexplode[$idx] = $explode; - $angles[++$idx] = array(360-$split,$ne); - $adjcolors[$idx] = $colors[$i % $numcolors]; - $adjexplode[$idx] = $explode; - } - else { - // Just a simple split to the previous decided - // angle. - $angles[++$idx] = array($split,$ne); - $adjcolors[$idx] = $colors[$i % $numcolors]; - $adjexplode[$idx] = $explode; - } - } - $a += $da; - $a = $this->NormAngle($a); - } - - // Total number of slices - $n = count($angles); - - for($i=0; $i<$n; ++$i) { - list($dbgs,$dbge) = $angles[$i]; - } - - // - // Step 2. Find start index (first pie that starts in upper left quadrant) - // - $minval = $angles[0][0]; - $min = 0; - for( $i=0; $i<$n; ++$i ) { - if( $angles[$i][0] < $minval ) { - $minval = $angles[$i][0]; - $min = $i; - } - } - $j = $min; - $cnt = 0; - while( $angles[$j][1] <= 90 ) { - $j++; - if( $j>=$n) { - $j=0; - } - if( $cnt > $n ) { - JpGraphError::RaiseL(14005); -//("Pie3D Internal error (#1). Trying to wrap twice when looking for start index"); - } - ++$cnt; - } - $start = $j; - - // - // Step 3. Print slices in z-order - // - $cnt = 0; - - // First stroke all the slices between 90 and 270 (left half circle) - // counterclockwise - - while( $angles[$j][0] < 270 && $aaoption !== 2 ) { - - list($x,$y) = $adjexplode[$j]; - - $this->Pie3DSlice($img,$x,$y,$d,$h,$angles[$j][0],$angles[$j][1], - $z,$adjcolors[$j],$shadow); - - $last = array($x,$y,$j); - - $j++; - if( $j >= $n ) $j=0; - if( $cnt > $n ) { - JpGraphError::RaiseL(14006); -//("Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking."); - } - ++$cnt; - } - - $slice_left = $n-$cnt; - $j=$start-1; - if($j<0) $j=$n-1; - $cnt = 0; - - // The stroke all slices from 90 to -90 (right half circle) - // clockwise - while( $cnt < $slice_left && $aaoption !== 2 ) { - - list($x,$y) = $adjexplode[$j]; - - $this->Pie3DSlice($img,$x,$y,$d,$h,$angles[$j][0],$angles[$j][1], - $z,$adjcolors[$j],$shadow); - $j--; - if( $cnt > $n ) { - JpGraphError::RaiseL(14006); -//("Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking."); - } - if($j<0) $j=$n-1; - $cnt++; - } - - // Now do a special thing. Stroke the last slice on the left - // halfcircle one more time. This is needed in the case where - // the slice close to 270 have been exploded. In that case the - // part of the slice close to the center of the pie might be - // slightly nagged. - if( $aaoption !== 2 ) - $this->Pie3DSlice($img,$last[0],$last[1],$d,$h,$angles[$last[2]][0], - $angles[$last[2]][1],$z,$adjcolors[$last[2]],$shadow); + //--------------------------------------------------------------------------- + // As usual the algorithm get more complicated than I originally + // envisioned. I believe that this is as simple as it is possible + // to do it with the features I want. It's a good exercise to start + // thinking on how to do this to convince your self that all this + // is really needed for the general case. + // + // The algorithm two draw 3D pies without "real 3D" is done in + // two steps. + // First imagine the pie cut in half through a thought line between + // 12'a clock and 6'a clock. It now easy to imagine that we can plot + // the individual slices for each half by starting with the topmost + // pie slice and continue down to 6'a clock. + // + // In the algortithm this is done in three principal steps + // Step 1. Do the knife cut to ensure by splitting slices that extends + // over the cut line. This is done by splitting the original slices into + // upto 3 subslices. + // Step 2. Find the top slice for each half + // Step 3. Draw the slices from top to bottom + // + // The thing that slightly complicates this scheme with all the + // angle comparisons below is that we can have an arbitrary start + // angle so we must take into account the different equivalence classes. + // For the same reason we must walk through the angle array in a + // modulo fashion. + // + // Limitations of algorithm: + // * A small exploded slice which crosses the 270 degree point + // will get slightly nagged close to the center due to the fact that + // we print the slices in Z-order and that the slice left part + // get printed first and might get slightly nagged by a larger + // slice on the right side just before the right part of the small + // slice. Not a major problem though. + //--------------------------------------------------------------------------- - if( $aaoption !== 1 ) { - // Now print possible labels and add csim - $this->value->ApplyFont($img); - $margin = $img->GetFontHeight()/2 + $this->value->margin ; - for($i=0; $i < count($data); ++$i ) { - $la = $labeldata[$i][0]; - $x = $labeldata[$i][1] + cos($la*M_PI/180)*($d+$margin)*$this->ilabelposadj; - $y = $labeldata[$i][2] - sin($la*M_PI/180)*($h+$margin)*$this->ilabelposadj; - if( $this->ilabelposadj >= 1.0 ) { - if( $la > 180 && $la < 360 ) $y += $z; - } - if( $this->labeltype == 0 ) { - if( $sum > 0 ) - $l = 100*$data[$i]/$sum; - else - $l = 0; - } - elseif( $this->labeltype == 1 ) { - $l = $data[$i]; - } - else { - $l = $this->adjusted_data[$i]; - } - if( isset($this->labels[$i]) && is_string($this->labels[$i]) ) - $l=sprintf($this->labels[$i],$l); + // Determine the height of the ellippse which gives an + // indication of the inclination angle + $h = ($angle/90.0)*$d; + $sum = 0; + for($i=0; $iStrokeLabels($l,$img,$labeldata[$i][0]*M_PI/180,$x,$y,$z); - - $this->Add3DSliceToCSIM($i,$labeldata[$i][1],$labeldata[$i][2],$h*2,$d*2,$z, - $originalangles[$i][0],$originalangles[$i][1]); - } - } + // Special optimization + if( $sum==0 ) return; - // - // Finally add potential lines in pie - // + if( $this->labeltype == 2 ) { + $this->adjusted_data = $this->AdjPercentage($data); + } - if( $edgecolor=="" || $aaoption !== 0 ) return; + // Setup the start + $accsum = 0; + $a = $startangle; + $a = $this->NormAngle($a); - $accsum = 0; - $a = $startangle; - $a = $this->NormAngle($a); + // + // Step 1 . Split all slices that crosses 90 or 270 + // + $idx=0; + $adjexplode=array(); + $numcolors = count($colors); + for($i=0; $iexplode_radius[$i]) ) { + $this->explode_radius[$i]=0; + } - $idx=0; - $img->PushColor($edgecolor); - $img->SetLineWeight($edgeweight); - - $fulledge = true; - for($i=0; $i < count($data) && $fulledge; ++$i ) { - if( empty($this->explode_radius[$i]) ) - $this->explode_radius[$i]=0; - if( $this->explode_radius[$i] > 0 ) { - $fulledge = false; - } - } - + $expscale=1; + if( $aaoption == 1 ) { + $expscale=2; + } - for($i=0; $i < count($data); ++$i, ++$idx ) { + $la = $a + $da/2; + $explode = array( $xc + $this->explode_radius[$i]*cos($la*M_PI/180)*$expscale, + $yc - $this->explode_radius[$i]*sin($la*M_PI/180) * ($h/$d) *$expscale ); + $adjexplode[$idx] = $explode; + $labeldata[$i] = array($la,$explode[0],$explode[1]); + $originalangles[$i] = array($a,$a+$da); - $da = $data[$i]/$sum * 2*M_PI; - $this->StrokeFullSliceFrame($img,$xc,$yc,$a,$a+$da,$d,$h,$z,$edgecolor, - $this->explode_radius[$i],$fulledge); - $a += $da; - } - $img->PopColor(); + $ne = $this->NormAngle($a+$da); + if( $da <= 180 ) { + // If the slice size is <= 90 it can at maximum cut across + // one boundary (either 90 or 270) where it needs to be split + $split=-1; // no split + if( ($da<=90 && ($a <= 90 && $ne > 90)) || + (($da <= 180 && $da >90) && (($a < 90 || $a >= 270) && $ne > 90)) ) { + $split = 90; + } + elseif( ($da<=90 && ($a <= 270 && $ne > 270)) || + (($da<=180 && $da>90) && ($a >= 90 && $a < 270 && ($a+$da) > 270 )) ) { + $split = 270; + } + if( $split > 0 ) { // split in two + $angles[$idx] = array($a,$split); + $adjcolors[$idx] = $colors[$i % $numcolors]; + $adjexplode[$idx] = $explode; + $angles[++$idx] = array($split,$ne); + $adjcolors[$idx] = $colors[$i % $numcolors]; + $adjexplode[$idx] = $explode; + } + else { // no split + $angles[$idx] = array($a,$ne); + $adjcolors[$idx] = $colors[$i % $numcolors]; + $adjexplode[$idx] = $explode; + } + } + else { + // da>180 + // Slice may, depending on position, cross one or two + // bonudaries + + if( $a < 90 ) $split = 90; + elseif( $a <= 270 ) $split = 270; + else $split = 90; + + $angles[$idx] = array($a,$split); + $adjcolors[$idx] = $colors[$i % $numcolors]; + $adjexplode[$idx] = $explode; + //if( $a+$da > 360-$split ) { + // For slices larger than 270 degrees we might cross + // another boundary as well. This means that we must + // split the slice further. The comparison gets a little + // bit complicated since we must take into accound that + // a pie might have a startangle >0 and hence a slice might + // wrap around the 0 angle. + // Three cases: + // a) Slice starts before 90 and hence gets a split=90, but + // we must also check if we need to split at 270 + // b) Slice starts after 90 but before 270 and slices + // crosses 90 (after a wrap around of 0) + // c) If start is > 270 (hence the firstr split is at 90) + // and the slice is so large that it goes all the way + // around 270. + if( ($a < 90 && ($a+$da > 270)) || ($a > 90 && $a<=270 && ($a+$da>360+90) ) || ($a > 270 && $this->NormAngle($a+$da)>270) ) { + $angles[++$idx] = array($split,360-$split); + $adjcolors[$idx] = $colors[$i % $numcolors]; + $adjexplode[$idx] = $explode; + $angles[++$idx] = array(360-$split,$ne); + $adjcolors[$idx] = $colors[$i % $numcolors]; + $adjexplode[$idx] = $explode; + } + else { + // Just a simple split to the previous decided + // angle. + $angles[++$idx] = array($split,$ne); + $adjcolors[$idx] = $colors[$i % $numcolors]; + $adjexplode[$idx] = $explode; + } + } + $a += $da; + $a = $this->NormAngle($a); + } + + // Total number of slices + $n = count($angles); + + for($i=0; $i<$n; ++$i) { + list($dbgs,$dbge) = $angles[$i]; + } + + // + // Step 2. Find start index (first pie that starts in upper left quadrant) + // + $minval = $angles[0][0]; + $min = 0; + for( $i=0; $i<$n; ++$i ) { + if( $angles[$i][0] < $minval ) { + $minval = $angles[$i][0]; + $min = $i; + } + } + $j = $min; + $cnt = 0; + while( $angles[$j][1] <= 90 ) { + $j++; + if( $j>=$n) { + $j=0; + } + if( $cnt > $n ) { + JpGraphError::RaiseL(14005); + //("Pie3D Internal error (#1). Trying to wrap twice when looking for start index"); + } + ++$cnt; + } + $start = $j; + + // + // Step 3. Print slices in z-order + // + $cnt = 0; + + // First stroke all the slices between 90 and 270 (left half circle) + // counterclockwise + + while( $angles[$j][0] < 270 && $aaoption !== 2 ) { + + list($x,$y) = $adjexplode[$j]; + + $this->Pie3DSlice($img,$x,$y,$d,$h,$angles[$j][0],$angles[$j][1], + $z,$adjcolors[$j],$shadow); + + $last = array($x,$y,$j); + + $j++; + if( $j >= $n ) $j=0; + if( $cnt > $n ) { + JpGraphError::RaiseL(14006); + //("Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking."); + } + ++$cnt; + } + + $slice_left = $n-$cnt; + $j=$start-1; + if($j<0) $j=$n-1; + $cnt = 0; + + // The stroke all slices from 90 to -90 (right half circle) + // clockwise + while( $cnt < $slice_left && $aaoption !== 2 ) { + + list($x,$y) = $adjexplode[$j]; + + $this->Pie3DSlice($img,$x,$y,$d,$h,$angles[$j][0],$angles[$j][1], + $z,$adjcolors[$j],$shadow); + $j--; + if( $cnt > $n ) { + JpGraphError::RaiseL(14006); + //("Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking."); + } + if($j<0) $j=$n-1; + $cnt++; + } + + // Now do a special thing. Stroke the last slice on the left + // halfcircle one more time. This is needed in the case where + // the slice close to 270 have been exploded. In that case the + // part of the slice close to the center of the pie might be + // slightly nagged. + if( $aaoption !== 2 ) + $this->Pie3DSlice($img,$last[0],$last[1],$d,$h,$angles[$last[2]][0], + $angles[$last[2]][1],$z,$adjcolors[$last[2]],$shadow); + + + if( $aaoption !== 1 ) { + // Now print possible labels and add csim + $this->value->ApplyFont($img); + $margin = $img->GetFontHeight()/2 + $this->value->margin ; + for($i=0; $i < count($data); ++$i ) { + $la = $labeldata[$i][0]; + $x = $labeldata[$i][1] + cos($la*M_PI/180)*($d+$margin)*$this->ilabelposadj; + $y = $labeldata[$i][2] - sin($la*M_PI/180)*($h+$margin)*$this->ilabelposadj; + if( $this->ilabelposadj >= 1.0 ) { + if( $la > 180 && $la < 360 ) $y += $z; + } + if( $this->labeltype == 0 ) { + if( $sum > 0 ) $l = 100*$data[$i]/$sum; + else $l = 0; + } + elseif( $this->labeltype == 1 ) { + $l = $data[$i]; + } + else { + $l = $this->adjusted_data[$i]; + } + if( isset($this->labels[$i]) && is_string($this->labels[$i]) ) { + $l=sprintf($this->labels[$i],$l); + } + + $this->StrokeLabels($l,$img,$labeldata[$i][0]*M_PI/180,$x,$y,$z); + + $this->Add3DSliceToCSIM($i,$labeldata[$i][1],$labeldata[$i][2],$h*2,$d*2,$z, + $originalangles[$i][0],$originalangles[$i][1]); + } + } + + // + // Finally add potential lines in pie + // + + if( $edgecolor=="" || $aaoption !== 0 ) return; + + $accsum = 0; + $a = $startangle; + $a = $this->NormAngle($a); + + $a *= M_PI/180.0; + + $idx=0; + $img->PushColor($edgecolor); + $img->SetLineWeight($edgeweight); + + $fulledge = true; + for($i=0; $i < count($data) && $fulledge; ++$i ) { + if( empty($this->explode_radius[$i]) ) { + $this->explode_radius[$i]=0; + } + if( $this->explode_radius[$i] > 0 ) { + $fulledge = false; + } + } + + + for($i=0; $i < count($data); ++$i, ++$idx ) { + + $da = $data[$i]/$sum * 2*M_PI; + $this->StrokeFullSliceFrame($img,$xc,$yc,$a,$a+$da,$d,$h,$z,$edgecolor, + $this->explode_radius[$i],$fulledge); + $a += $da; + } + $img->PopColor(); } function StrokeFullSliceFrame($img,$xc,$yc,$sa,$ea,$w,$h,$z,$edgecolor,$exploderadius,$fulledge) { - $step = 0.02; + $step = 0.02; - if( $exploderadius > 0 ) { - $la = ($sa+$ea)/2; - $xc += $exploderadius*cos($la); - $yc -= $exploderadius*sin($la) * ($h/$w) ; - - } + if( $exploderadius > 0 ) { + $la = ($sa+$ea)/2; + $xc += $exploderadius*cos($la); + $yc -= $exploderadius*sin($la) * ($h/$w) ; + + } - $p = array($xc,$yc,$xc+$w*cos($sa),$yc-$h*sin($sa)); + $p = array($xc,$yc,$xc+$w*cos($sa),$yc-$h*sin($sa)); - for($a=$sa; $a < $ea; $a += $step ) { - $p[] = $xc + $w*cos($a); - $p[] = $yc - $h*sin($a); - } + for($a=$sa; $a < $ea; $a += $step ) { + $p[] = $xc + $w*cos($a); + $p[] = $yc - $h*sin($a); + } - $p[] = $xc+$w*cos($ea); - $p[] = $yc-$h*sin($ea); - $p[] = $xc; - $p[] = $yc; + $p[] = $xc+$w*cos($ea); + $p[] = $yc-$h*sin($ea); + $p[] = $xc; + $p[] = $yc; - $img->SetColor($edgecolor); - $img->Polygon($p); + $img->SetColor($edgecolor); + $img->Polygon($p); - // Unfortunately we can't really draw the full edge around the whole of - // of the slice if any of the slices are exploded. The reason is that - // this algorithm is to simply. There are cases where the edges will - // "overwrite" other slices when they have been exploded. - // Doing the full, proper 3D hidden lines stiff is actually quite - // tricky. So for exploded pies we only draw the top edge. Not perfect - // but the "real" solution is much more complicated. - if( $fulledge && !( $sa > 0 && $sa < M_PI && $ea < M_PI) ) { + // Unfortunately we can't really draw the full edge around the whole of + // of the slice if any of the slices are exploded. The reason is that + // this algorithm is to simply. There are cases where the edges will + // "overwrite" other slices when they have been exploded. + // Doing the full, proper 3D hidden lines stiff is actually quite + // tricky. So for exploded pies we only draw the top edge. Not perfect + // but the "real" solution is much more complicated. + if( $fulledge && !( $sa > 0 && $sa < M_PI && $ea < M_PI) ) { - if($sa < M_PI && $ea > M_PI) - $sa = M_PI; - - if($sa < 2*M_PI && (($ea >= 2*M_PI) || ($ea > 0 && $ea < $sa ) ) ) - $ea = 2*M_PI; + if($sa < M_PI && $ea > M_PI) { + $sa = M_PI; + } - if( $sa >= M_PI && $ea <= 2*M_PI ) { - $p = array($xc + $w*cos($sa),$yc - $h*sin($sa), - $xc + $w*cos($sa),$z + $yc - $h*sin($sa)); - - for($a=$sa+$step; $a < $ea; $a += $step ) { - $p[] = $xc + $w*cos($a); - $p[] = $z + $yc - $h*sin($a); - } - $p[] = $xc + $w*cos($ea); - $p[] = $z + $yc - $h*sin($ea); - $p[] = $xc + $w*cos($ea); - $p[] = $yc - $h*sin($ea); - $img->SetColor($edgecolor); - $img->Polygon($p); - } - } + if($sa < 2*M_PI && (($ea >= 2*M_PI) || ($ea > 0 && $ea < $sa ) ) ) { + $ea = 2*M_PI; + } + + if( $sa >= M_PI && $ea <= 2*M_PI ) { + $p = array($xc + $w*cos($sa),$yc - $h*sin($sa), + $xc + $w*cos($sa),$z + $yc - $h*sin($sa)); + + for($a=$sa+$step; $a < $ea; $a += $step ) { + $p[] = $xc + $w*cos($a); + $p[] = $z + $yc - $h*sin($a); + } + $p[] = $xc + $w*cos($ea); + $p[] = $z + $yc - $h*sin($ea); + $p[] = $xc + $w*cos($ea); + $p[] = $yc - $h*sin($ea); + $img->SetColor($edgecolor); + $img->Polygon($p); + } + } } function Stroke($img,$aaoption=0) { - $n = count($this->data); + $n = count($this->data); - // If user hasn't set the colors use the theme array - if( $this->setslicecolors==null ) { - $colors = array_keys($img->rgb->rgb_table); - sort($colors); - $idx_a=$this->themearr[$this->theme]; - $ca = array(); - $m = count($idx_a); - for($i=0; $i < $m; ++$i) - $ca[$i] = $colors[$idx_a[$i]]; - $ca = array_reverse(array_slice($ca,0,$n)); - } - else { - $ca = $this->setslicecolors; - } - + // If user hasn't set the colors use the theme array + if( $this->setslicecolors==null ) { + $colors = array_keys($img->rgb->rgb_table); + sort($colors); + $idx_a=$this->themearr[$this->theme]; + $ca = array(); + $m = count($idx_a); + for($i=0; $i < $m; ++$i) { + $ca[$i] = $colors[$idx_a[$i]]; + } + $ca = array_reverse(array_slice($ca,0,$n)); + } + else { + $ca = $this->setslicecolors; + } - if( $this->posx <= 1 && $this->posx > 0 ) - $xc = round($this->posx*$img->width); - else - $xc = $this->posx ; - - if( $this->posy <= 1 && $this->posy > 0 ) - $yc = round($this->posy*$img->height); - else - $yc = $this->posy ; - - if( $this->radius <= 1 ) { - $width = floor($this->radius*min($img->width,$img->height)); - // Make sure that the pie doesn't overflow the image border - // The 0.9 factor is simply an extra margin to leave some space - // between the pie an the border of the image. - $width = min($width,min($xc*0.9,($yc*90/$this->angle-$width/4)*0.9)); - } - else { - $width = $this->radius * ($aaoption === 1 ? 2 : 1 ) ; - } - // Add a sanity check for width - if( $width < 1 ) { - JpGraphError::RaiseL(14007);//("Width for 3D Pie is 0. Specify a size > 0"); - } + if( $this->posx <= 1 && $this->posx > 0 ) { + $xc = round($this->posx*$img->width); + } + else { + $xc = $this->posx ; + } - // Establish a thickness. By default the thickness is a fifth of the - // pie slice width (=pie radius) but since the perspective depends - // on the inclination angle we use some heuristics to make the edge - // slightly thicker the less the angle. - - // Has user specified an absolute thickness? In that case use - // that instead + if( $this->posy <= 1 && $this->posy > 0 ) { + $yc = round($this->posy*$img->height); + } + else { + $yc = $this->posy ; + } - if( $this->iThickness ) { - $thick = $this->iThickness; - $thick *= ($aaoption === 1 ? 2 : 1 ); - } - else - $thick = $width/12; - $a = $this->angle; - if( $a <= 30 ) $thick *= 1.6; - elseif( $a <= 40 ) $thick *= 1.4; - elseif( $a <= 50 ) $thick *= 1.2; - elseif( $a <= 60 ) $thick *= 1.0; - elseif( $a <= 70 ) $thick *= 0.8; - elseif( $a <= 80 ) $thick *= 0.7; - else $thick *= 0.6; + if( $this->radius <= 1 ) { + $width = floor($this->radius*min($img->width,$img->height)); + // Make sure that the pie doesn't overflow the image border + // The 0.9 factor is simply an extra margin to leave some space + // between the pie an the border of the image. + $width = min($width,min($xc*0.9,($yc*90/$this->angle-$width/4)*0.9)); + } + else { + $width = $this->radius * ($aaoption === 1 ? 2 : 1 ) ; + } - $thick = floor($thick); + // Add a sanity check for width + if( $width < 1 ) { + JpGraphError::RaiseL(14007);//("Width for 3D Pie is 0. Specify a size > 0"); + } - if( $this->explode_all ) - for($i=0; $i < $n; ++$i) - $this->explode_radius[$i]=$this->explode_r; + // Establish a thickness. By default the thickness is a fifth of the + // pie slice width (=pie radius) but since the perspective depends + // on the inclination angle we use some heuristics to make the edge + // slightly thicker the less the angle. - $this->Pie3D($aaoption,$img,$this->data, $ca, $xc, $yc, $width, $this->angle, - $thick, 0.65, $this->startangle, $this->edgecolor, $this->edgeweight); + // Has user specified an absolute thickness? In that case use + // that instead - // Adjust title position - if( $aaoption != 1 ) { - $this->title->SetPos($xc,$yc-$this->title->GetFontHeight($img)-$width/2-$this->title->margin, "center","bottom"); - $this->title->Stroke($img); - } + if( $this->iThickness ) { + $thick = $this->iThickness; + $thick *= ($aaoption === 1 ? 2 : 1 ); + } + else { + $thick = $width/12; + } + $a = $this->angle; + + if( $a <= 30 ) $thick *= 1.6; + elseif( $a <= 40 ) $thick *= 1.4; + elseif( $a <= 50 ) $thick *= 1.2; + elseif( $a <= 60 ) $thick *= 1.0; + elseif( $a <= 70 ) $thick *= 0.8; + elseif( $a <= 80 ) $thick *= 0.7; + else $thick *= 0.6; + + $thick = floor($thick); + + if( $this->explode_all ) { + for($i=0; $i < $n; ++$i) + $this->explode_radius[$i]=$this->explode_r; + } + + $this->Pie3D($aaoption,$img,$this->data, $ca, $xc, $yc, $width, $this->angle, + $thick, 0.65, $this->startangle, $this->edgecolor, $this->edgeweight); + + // Adjust title position + if( $aaoption != 1 ) { + $this->title->SetPos($xc,$yc-$this->title->GetFontHeight($img)-$width/2-$this->title->margin, "center","bottom"); + $this->title->Stroke($img); + } } -//--------------- -// PRIVATE METHODS + //--------------- + // PRIVATE METHODS // Position the labels of each slice function StrokeLabels($label,$img,$a,$xp,$yp,$z) { - $this->value->halign="left"; - $this->value->valign="top"; + $this->value->halign="left"; + $this->value->valign="top"; - // Position the axis title. - // dx, dy is the offset from the top left corner of the bounding box that sorrounds the text - // that intersects with the extension of the corresponding axis. The code looks a little - // bit messy but this is really the only way of having a reasonable position of the - // axis titles. - $this->value->ApplyFont($img); - $h=$img->GetTextHeight($label); - // For numeric values the format of the display value - // must be taken into account - if( is_numeric($label) ) { - if( $label >= 0 ) - $w=$img->GetTextWidth(sprintf($this->value->format,$label)); - else - $w=$img->GetTextWidth(sprintf($this->value->negformat,$label)); - } - else - $w=$img->GetTextWidth($label); - while( $a > 2*M_PI ) $a -= 2*M_PI; - if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0; - if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI; - if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1; - if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI); - - if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI; - if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI); - if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1; - if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI); - if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0; - - $x = round($xp-$dx*$w); - $y = round($yp-$dy*$h); + // Position the axis title. + // dx, dy is the offset from the top left corner of the bounding box that sorrounds the text + // that intersects with the extension of the corresponding axis. The code looks a little + // bit messy but this is really the only way of having a reasonable position of the + // axis titles. + $this->value->ApplyFont($img); + $h=$img->GetTextHeight($label); + // For numeric values the format of the display value + // must be taken into account + if( is_numeric($label) ) { + if( $label >= 0 ) { + $w=$img->GetTextWidth(sprintf($this->value->format,$label)); + } + else { + $w=$img->GetTextWidth(sprintf($this->value->negformat,$label)); + } + } + else { + $w=$img->GetTextWidth($label); + } + + while( $a > 2*M_PI ) { + $a -= 2*M_PI; + } + + if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0; + if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI; + if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1; + if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI); - - // Mark anchor point for debugging - /* - $img->SetColor('red'); - $img->Line($xp-10,$yp,$xp+10,$yp); - $img->Line($xp,$yp-10,$xp,$yp+10); - */ - $oldmargin = $this->value->margin; - $this->value->margin=0; - $this->value->Stroke($img,$label,$x,$y); - $this->value->margin=$oldmargin; + if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI; + if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI); + if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1; + if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI); + if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0; - } + $x = round($xp-$dx*$w); + $y = round($yp-$dy*$h); + + // Mark anchor point for debugging + /* + $img->SetColor('red'); + $img->Line($xp-10,$yp,$xp+10,$yp); + $img->Line($xp,$yp-10,$xp,$yp+10); + */ + + $oldmargin = $this->value->margin; + $this->value->margin=0; + $this->value->Stroke($img,$label,$x,$y); + $this->value->margin=$oldmargin; + + } } // Class /* EOF */ diff --git a/libs/jpgraph/jpgraph_plotband.php b/libs/jpgraph/jpgraph_plotband.php index 5c6fc29..1c78d33 100644 --- a/libs/jpgraph/jpgraph_plotband.php +++ b/libs/jpgraph/jpgraph_plotband.php @@ -1,35 +1,35 @@ x=$aX; - $this->y=$aY; - $this->w=$aWidth; - $this->h=$aHeight; - $this->xe=$aX+$aWidth-1; - $this->ye=$aY+$aHeight-1; + function __construct($aX,$aY,$aWidth,$aHeight) { + $this->x=$aX; + $this->y=$aY; + $this->w=$aWidth; + $this->h=$aHeight; + $this->xe=$aX+$aWidth-1; + $this->ye=$aY+$aHeight-1; } } @@ -45,55 +45,55 @@ class RectPattern { protected $weight; protected $rect=null; protected $doframe=true; - protected $linespacing; // Line spacing in pixels + protected $linespacing; // Line spacing in pixels protected $iBackgroundColor=-1; // Default is no background fill - - function RectPattern($aColor,$aWeight=1) { - $this->color = $aColor; - $this->weight = $aWeight; + + function __construct($aColor,$aWeight=1) { + $this->color = $aColor; + $this->weight = $aWeight; } function SetBackground($aBackgroundColor) { - $this->iBackgroundColor=$aBackgroundColor; + $this->iBackgroundColor=$aBackgroundColor; } function SetPos($aRect) { - $this->rect = $aRect; + $this->rect = $aRect; } - + function ShowFrame($aShow=true) { - $this->doframe=$aShow; + $this->doframe=$aShow; } function SetDensity($aDens) { - if( $aDens < 1 || $aDens > 100 ) - JpGraphError::RaiseL(16001,$aDens); -//(" Desity for pattern must be between 1 and 100. (You tried $aDens)"); - // 1% corresponds to linespacing=50 - // 100 % corresponds to linespacing 1 - $this->linespacing = floor(((100-$aDens)/100.0)*50)+1; + if( $aDens < 1 || $aDens > 100 ) + JpGraphError::RaiseL(16001,$aDens); + //(" Desity for pattern must be between 1 and 100. (You tried $aDens)"); + // 1% corresponds to linespacing=50 + // 100 % corresponds to linespacing 1 + $this->linespacing = floor(((100-$aDens)/100.0)*50)+1; } function Stroke($aImg) { - if( $this->rect == null ) - JpGraphError::RaiseL(16002); -//(" No positions specified for pattern."); + if( $this->rect == null ) + JpGraphError::RaiseL(16002); + //(" No positions specified for pattern."); - if( !(is_numeric($this->iBackgroundColor) && $this->iBackgroundColor==-1) ) { - $aImg->SetColor($this->iBackgroundColor); - $aImg->FilledRectangle($this->rect->x,$this->rect->y,$this->rect->xe,$this->rect->ye); - } + if( !(is_numeric($this->iBackgroundColor) && $this->iBackgroundColor==-1) ) { + $aImg->SetColor($this->iBackgroundColor); + $aImg->FilledRectangle($this->rect->x,$this->rect->y,$this->rect->xe,$this->rect->ye); + } - $aImg->SetColor($this->color); - $aImg->SetLineWeight($this->weight); + $aImg->SetColor($this->color); + $aImg->SetLineWeight($this->weight); - // Virtual function implemented by subclass - $this->DoPattern($aImg); + // Virtual function implemented by subclass + $this->DoPattern($aImg); - // Frame around the pattern area - if( $this->doframe ) - $aImg->Rectangle($this->rect->x,$this->rect->y,$this->rect->xe,$this->rect->ye); + // Frame around the pattern area + if( $this->doframe ) + $aImg->Rectangle($this->rect->x,$this->rect->y,$this->rect->xe,$this->rect->ye); } } @@ -105,14 +105,14 @@ class RectPattern { //===================================================================== class RectPatternSolid extends RectPattern { - function RectPatternSolid($aColor="black",$aWeight=1) { - parent::RectPattern($aColor,$aWeight); + function __construct($aColor="black",$aWeight=1) { + parent::__construct($aColor,$aWeight); } function DoPattern($aImg) { - $aImg->SetColor($this->color); - $aImg->FilledRectangle($this->rect->x,$this->rect->y, - $this->rect->xe,$this->rect->ye); + $aImg->SetColor($this->color); + $aImg->FilledRectangle($this->rect->x,$this->rect->y, + $this->rect->xe,$this->rect->ye); } } @@ -121,20 +121,20 @@ class RectPatternSolid extends RectPattern { // Implements horizontal line pattern //===================================================================== class RectPatternHor extends RectPattern { - - function RectPatternHor($aColor="black",$aWeight=1,$aLineSpacing=7) { - parent::RectPattern($aColor,$aWeight); - $this->linespacing = $aLineSpacing; + + function __construct($aColor="black",$aWeight=1,$aLineSpacing=7) { + parent::__construct($aColor,$aWeight); + $this->linespacing = $aLineSpacing; } - + function DoPattern($aImg) { - $x0 = $this->rect->x; - $x1 = $this->rect->xe; - $y = $this->rect->y; - while( $y < $this->rect->ye ) { - $aImg->Line($x0,$y,$x1,$y); - $y += $this->linespacing; - } + $x0 = $this->rect->x; + $x1 = $this->rect->xe; + $y = $this->rect->y; + while( $y < $this->rect->ye ) { + $aImg->Line($x0,$y,$x1,$y); + $y += $this->linespacing; + } } } @@ -143,23 +143,23 @@ class RectPatternHor extends RectPattern { // Implements vertical line pattern //===================================================================== class RectPatternVert extends RectPattern { - - function RectPatternVert($aColor="black",$aWeight=1,$aLineSpacing=7) { - parent::RectPattern($aColor,$aWeight); - $this->linespacing = $aLineSpacing; + + function __construct($aColor="black",$aWeight=1,$aLineSpacing=7) { + parent::__construct($aColor,$aWeight); + $this->linespacing = $aLineSpacing; } //-------------------- // Private methods // function DoPattern($aImg) { - $x = $this->rect->x; - $y0 = $this->rect->y; - $y1 = $this->rect->ye; - while( $x < $this->rect->xe ) { - $aImg->Line($x,$y0,$x,$y1); - $x += $this->linespacing; - } + $x = $this->rect->x; + $y0 = $this->rect->y; + $y1 = $this->rect->ye; + while( $x < $this->rect->xe ) { + $aImg->Line($x,$y0,$x,$y1); + $x += $this->linespacing; + } } } @@ -169,131 +169,131 @@ class RectPatternVert extends RectPattern { // Implements right diagonal pattern //===================================================================== class RectPatternRDiag extends RectPattern { - - function RectPatternRDiag($aColor="black",$aWeight=1,$aLineSpacing=12) { - parent::RectPattern($aColor,$aWeight); - $this->linespacing = $aLineSpacing; + + function __construct($aColor="black",$aWeight=1,$aLineSpacing=12) { + parent::__construct($aColor,$aWeight); + $this->linespacing = $aLineSpacing; } function DoPattern($aImg) { - // -------------------- - // | / / / / /| - // |/ / / / / | - // | / / / / | - // -------------------- - $xe = $this->rect->xe; - $ye = $this->rect->ye; - $x0 = $this->rect->x + round($this->linespacing/2); - $y0 = $this->rect->y; - $x1 = $this->rect->x; - $y1 = $this->rect->y + round($this->linespacing/2); + // -------------------- + // | / / / / /| + // |/ / / / / | + // | / / / / | + // -------------------- + $xe = $this->rect->xe; + $ye = $this->rect->ye; + $x0 = $this->rect->x + round($this->linespacing/2); + $y0 = $this->rect->y; + $x1 = $this->rect->x; + $y1 = $this->rect->y + round($this->linespacing/2); - while($x0<=$xe && $y1<=$ye) { - $aImg->Line($x0,$y0,$x1,$y1); - $x0 += $this->linespacing; - $y1 += $this->linespacing; - } + while($x0<=$xe && $y1<=$ye) { + $aImg->Line($x0,$y0,$x1,$y1); + $x0 += $this->linespacing; + $y1 += $this->linespacing; + } - if( $xe-$x1 > $ye-$y0 ) { - // Width larger than height - $x1 = $this->rect->x + ($y1-$ye); - $y1 = $ye; - $y0 = $this->rect->y; - while( $x0 <= $xe ) { - $aImg->Line($x0,$y0,$x1,$y1); - $x0 += $this->linespacing; - $x1 += $this->linespacing; - } - - $y0=$this->rect->y + ($x0-$xe); - $x0=$xe; - } - else { - // Height larger than width - $diff = $x0-$xe; - $y0 = $diff+$this->rect->y; - $x0 = $xe; - $x1 = $this->rect->x; - while( $y1 <= $ye ) { - $aImg->Line($x0,$y0,$x1,$y1); - $y1 += $this->linespacing; - $y0 += $this->linespacing; - } - - $diff = $y1-$ye; - $y1 = $ye; - $x1 = $diff + $this->rect->x; - } + if( $xe-$x1 > $ye-$y0 ) { + // Width larger than height + $x1 = $this->rect->x + ($y1-$ye); + $y1 = $ye; + $y0 = $this->rect->y; + while( $x0 <= $xe ) { + $aImg->Line($x0,$y0,$x1,$y1); + $x0 += $this->linespacing; + $x1 += $this->linespacing; + } + + $y0=$this->rect->y + ($x0-$xe); + $x0=$xe; + } + else { + // Height larger than width + $diff = $x0-$xe; + $y0 = $diff+$this->rect->y; + $x0 = $xe; + $x1 = $this->rect->x; + while( $y1 <= $ye ) { + $aImg->Line($x0,$y0,$x1,$y1); + $y1 += $this->linespacing; + $y0 += $this->linespacing; + } + + $diff = $y1-$ye; + $y1 = $ye; + $x1 = $diff + $this->rect->x; + } - while( $y0 <= $ye ) { - $aImg->Line($x0,$y0,$x1,$y1); - $y0 += $this->linespacing; - $x1 += $this->linespacing; - } + while( $y0 <= $ye ) { + $aImg->Line($x0,$y0,$x1,$y1); + $y0 += $this->linespacing; + $x1 += $this->linespacing; + } } } - + //===================================================================== // Class RectPatternLDiag // Implements left diagonal pattern //===================================================================== class RectPatternLDiag extends RectPattern { - - function RectPatternLDiag($aColor="black",$aWeight=1,$aLineSpacing=12) { - $this->linespacing = $aLineSpacing; - parent::RectPattern($aColor,$aWeight); + + function __construct($aColor="black",$aWeight=1,$aLineSpacing=12) { + $this->linespacing = $aLineSpacing; + parent::__construct($aColor,$aWeight); } function DoPattern($aImg) { - // -------------------- - // |\ \ \ \ \ | - // | \ \ \ \ \| - // | \ \ \ \ | - // |------------------| - $xe = $this->rect->xe; - $ye = $this->rect->ye; - $x0 = $this->rect->x + round($this->linespacing/2); - $y0 = $this->rect->ye; - $x1 = $this->rect->x; - $y1 = $this->rect->ye - round($this->linespacing/2); + // -------------------- + // |\ \ \ \ \ | + // | \ \ \ \ \| + // | \ \ \ \ | + // |------------------| + $xe = $this->rect->xe; + $ye = $this->rect->ye; + $x0 = $this->rect->x + round($this->linespacing/2); + $y0 = $this->rect->ye; + $x1 = $this->rect->x; + $y1 = $this->rect->ye - round($this->linespacing/2); - while($x0<=$xe && $y1>=$this->rect->y) { - $aImg->Line($x0,$y0,$x1,$y1); - $x0 += $this->linespacing; - $y1 -= $this->linespacing; - } - if( $xe-$x1 > $ye-$this->rect->y ) { - // Width larger than height - $x1 = $this->rect->x + ($this->rect->y-$y1); - $y0=$ye; $y1=$this->rect->y; - while( $x0 <= $xe ) { - $aImg->Line($x0,$y0,$x1,$y1); - $x0 += $this->linespacing; - $x1 += $this->linespacing; - } - - $y0=$this->rect->ye - ($x0-$xe); - $x0=$xe; - } - else { - // Height larger than width - $diff = $x0-$xe; - $y0 = $ye-$diff; - $x0 = $xe; - while( $y1 >= $this->rect->y ) { - $aImg->Line($x0,$y0,$x1,$y1); - $y0 -= $this->linespacing; - $y1 -= $this->linespacing; - } - $diff = $this->rect->y - $y1; - $x1 = $this->rect->x + $diff; - $y1 = $this->rect->y; - } - while( $y0 >= $this->rect->y ) { - $aImg->Line($x0,$y0,$x1,$y1); - $y0 -= $this->linespacing; - $x1 += $this->linespacing; - } + while($x0<=$xe && $y1>=$this->rect->y) { + $aImg->Line($x0,$y0,$x1,$y1); + $x0 += $this->linespacing; + $y1 -= $this->linespacing; + } + if( $xe-$x1 > $ye-$this->rect->y ) { + // Width larger than height + $x1 = $this->rect->x + ($this->rect->y-$y1); + $y0=$ye; $y1=$this->rect->y; + while( $x0 <= $xe ) { + $aImg->Line($x0,$y0,$x1,$y1); + $x0 += $this->linespacing; + $x1 += $this->linespacing; + } + + $y0=$this->rect->ye - ($x0-$xe); + $x0=$xe; + } + else { + // Height larger than width + $diff = $x0-$xe; + $y0 = $ye-$diff; + $x0 = $xe; + while( $y1 >= $this->rect->y ) { + $aImg->Line($x0,$y0,$x1,$y1); + $y0 -= $this->linespacing; + $y1 -= $this->linespacing; + } + $diff = $this->rect->y - $y1; + $x1 = $this->rect->x + $diff; + $y1 = $this->rect->y; + } + while( $y0 >= $this->rect->y ) { + $aImg->Line($x0,$y0,$x1,$y1); + $y0 -= $this->linespacing; + $x1 += $this->linespacing; + } } } @@ -307,110 +307,110 @@ class RectPattern3DPlane extends RectPattern { // top of the band. Specifies how fast the lines // converge. - function RectPattern3DPlane($aColor="black",$aWeight=1) { - parent::RectPattern($aColor,$aWeight); - $this->SetDensity(10); // Slightly larger default + function __construct($aColor="black",$aWeight=1) { + parent::__construct($aColor,$aWeight); + $this->SetDensity(10); // Slightly larger default } function SetHorizon($aHorizon) { - $this->alpha=$aHorizon; + $this->alpha=$aHorizon; } - + function DoPattern($aImg) { - // "Fake" a nice 3D grid-effect. - $x0 = $this->rect->x + $this->rect->w/2; - $y0 = $this->rect->y; - $x1 = $x0; - $y1 = $this->rect->ye; - $x0_right = $x0; - $x1_right = $x1; + // "Fake" a nice 3D grid-effect. + $x0 = $this->rect->x + $this->rect->w/2; + $y0 = $this->rect->y; + $x1 = $x0; + $y1 = $this->rect->ye; + $x0_right = $x0; + $x1_right = $x1; - // BTW "apa" means monkey in Swedish but is really a shortform for - // "alpha+a" which was the labels I used on paper when I derived the - // geometric to get the 3D perspective right. - // $apa is the height of the bounding rectangle plus the distance to the - // artifical horizon (alpha) - $apa = $this->rect->h + $this->alpha; + // BTW "apa" means monkey in Swedish but is really a shortform for + // "alpha+a" which was the labels I used on paper when I derived the + // geometric to get the 3D perspective right. + // $apa is the height of the bounding rectangle plus the distance to the + // artifical horizon (alpha) + $apa = $this->rect->h + $this->alpha; - // Three cases and three loops - // 1) The endpoint of the line ends on the bottom line - // 2) The endpoint ends on the side - // 3) Horizontal lines + // Three cases and three loops + // 1) The endpoint of the line ends on the bottom line + // 2) The endpoint ends on the side + // 3) Horizontal lines - // Endpoint falls on bottom line - $middle=$this->rect->x + $this->rect->w/2; - $dist=$this->linespacing; - $factor=$this->alpha /($apa); - while($x1>$this->rect->x) { - $aImg->Line($x0,$y0,$x1,$y1); - $aImg->Line($x0_right,$y0,$x1_right,$y1); - $x1 = $middle - $dist; - $x0 = $middle - $dist * $factor; - $x1_right = $middle + $dist; - $x0_right = $middle + $dist * $factor; - $dist += $this->linespacing; - } + // Endpoint falls on bottom line + $middle=$this->rect->x + $this->rect->w/2; + $dist=$this->linespacing; + $factor=$this->alpha /($apa); + while($x1>$this->rect->x) { + $aImg->Line($x0,$y0,$x1,$y1); + $aImg->Line($x0_right,$y0,$x1_right,$y1); + $x1 = $middle - $dist; + $x0 = $middle - $dist * $factor; + $x1_right = $middle + $dist; + $x0_right = $middle + $dist * $factor; + $dist += $this->linespacing; + } - // Endpoint falls on sides - $dist -= $this->linespacing; - $d=$this->rect->w/2; - $c = $apa - $d*$apa/$dist; - while( $x0>$this->rect->x ) { - $aImg->Line($x0,$y0,$this->rect->x,$this->rect->ye-$c); - $aImg->Line($x0_right,$y0,$this->rect->xe,$this->rect->ye-$c); - $dist += $this->linespacing; - $x0 = $middle - $dist * $factor; - $x1 = $middle - $dist; - $x0_right = $middle + $dist * $factor; - $c = $apa - $d*$apa/$dist; - } - - // Horizontal lines - // They need some serious consideration since they are a function - // of perspective depth (alpha) and density (linespacing) - $x0=$this->rect->x; - $x1=$this->rect->xe; - $y=$this->rect->ye; - - // The first line is drawn directly. Makes the loop below slightly - // more readable. - $aImg->Line($x0,$y,$x1,$y); - $hls = $this->linespacing; - - // A correction factor for vertical "brick" line spacing to account for - // a) the difference in number of pixels hor vs vert - // b) visual apperance to make the first layer of "bricks" look more - // square. - $vls = $this->linespacing*0.6; - - $ds = $hls*($apa-$vls)/$apa; - // Get the slope for the "perspective line" going from bottom right - // corner to top left corner of the "first" brick. - - // Uncomment the following lines if you want to get a visual understanding - // of what this helpline does. BTW this mimics the way you would get the - // perspective right when drawing on paper. - /* - $x0 = $middle; - $y0 = $this->rect->ye; - $len=floor(($this->rect->ye-$this->rect->y)/$vls); - $x1 = $middle+round($len*$ds); - $y1 = $this->rect->ye-$len*$vls; - $aImg->PushColor("red"); - $aImg->Line($x0,$y0,$x1,$y1); - $aImg->PopColor(); - */ - - $y -= $vls; - $k=($this->rect->ye-($this->rect->ye-$vls))/($middle-($middle-$ds)); - $dist = $hls; - while( $y>$this->rect->y ) { - $aImg->Line($this->rect->x,$y,$this->rect->xe,$y); - $adj = $k*$dist/(1+$dist*$k/$apa); - if( $adj < 2 ) $adj=1; - $y = $this->rect->ye - round($adj); - $dist += $hls; - } + // Endpoint falls on sides + $dist -= $this->linespacing; + $d=$this->rect->w/2; + $c = $apa - $d*$apa/$dist; + while( $x0>$this->rect->x ) { + $aImg->Line($x0,$y0,$this->rect->x,$this->rect->ye-$c); + $aImg->Line($x0_right,$y0,$this->rect->xe,$this->rect->ye-$c); + $dist += $this->linespacing; + $x0 = $middle - $dist * $factor; + $x1 = $middle - $dist; + $x0_right = $middle + $dist * $factor; + $c = $apa - $d*$apa/$dist; + } + + // Horizontal lines + // They need some serious consideration since they are a function + // of perspective depth (alpha) and density (linespacing) + $x0=$this->rect->x; + $x1=$this->rect->xe; + $y=$this->rect->ye; + + // The first line is drawn directly. Makes the loop below slightly + // more readable. + $aImg->Line($x0,$y,$x1,$y); + $hls = $this->linespacing; + + // A correction factor for vertical "brick" line spacing to account for + // a) the difference in number of pixels hor vs vert + // b) visual apperance to make the first layer of "bricks" look more + // square. + $vls = $this->linespacing*0.6; + + $ds = $hls*($apa-$vls)/$apa; + // Get the slope for the "perspective line" going from bottom right + // corner to top left corner of the "first" brick. + + // Uncomment the following lines if you want to get a visual understanding + // of what this helpline does. BTW this mimics the way you would get the + // perspective right when drawing on paper. + /* + $x0 = $middle; + $y0 = $this->rect->ye; + $len=floor(($this->rect->ye-$this->rect->y)/$vls); + $x1 = $middle+round($len*$ds); + $y1 = $this->rect->ye-$len*$vls; + $aImg->PushColor("red"); + $aImg->Line($x0,$y0,$x1,$y1); + $aImg->PopColor(); + */ + + $y -= $vls; + $k=($this->rect->ye-($this->rect->ye-$vls))/($middle-($middle-$ds)); + $dist = $hls; + while( $y>$this->rect->y ) { + $aImg->Line($this->rect->x,$y,$this->rect->xe,$y); + $adj = $k*$dist/(1+$dist*$k/$apa); + if( $adj < 2 ) $adj=1; + $y = $this->rect->ye - round($adj); + $dist += $hls; + } } } @@ -421,31 +421,31 @@ class RectPattern3DPlane extends RectPattern { class RectPatternCross extends RectPattern { private $vert=null; private $hor=null; - function RectPatternCross($aColor="black",$aWeight=1) { - parent::RectPattern($aColor,$aWeight); - $this->vert = new RectPatternVert($aColor,$aWeight); - $this->hor = new RectPatternHor($aColor,$aWeight); + function __construct($aColor="black",$aWeight=1) { + parent::__construct($aColor,$aWeight); + $this->vert = new RectPatternVert($aColor,$aWeight); + $this->hor = new RectPatternHor($aColor,$aWeight); } function SetOrder($aDepth) { - $this->vert->SetOrder($aDepth); - $this->hor->SetOrder($aDepth); + $this->vert->SetOrder($aDepth); + $this->hor->SetOrder($aDepth); } function SetPos($aRect) { - parent::SetPos($aRect); - $this->vert->SetPos($aRect); - $this->hor->SetPos($aRect); + parent::SetPos($aRect); + $this->vert->SetPos($aRect); + $this->hor->SetPos($aRect); } function SetDensity($aDens) { - $this->vert->SetDensity($aDens); - $this->hor->SetDensity($aDens); + $this->vert->SetDensity($aDens); + $this->hor->SetDensity($aDens); } function DoPattern($aImg) { - $this->vert->DoPattern($aImg); - $this->hor->DoPattern($aImg); + $this->vert->DoPattern($aImg); + $this->hor->DoPattern($aImg); } } @@ -457,74 +457,74 @@ class RectPatternCross extends RectPattern { class RectPatternDiagCross extends RectPattern { private $left=null; private $right=null; - function RectPatternDiagCross($aColor="black",$aWeight=1) { - parent::RectPattern($aColor,$aWeight); - $this->right = new RectPatternRDiag($aColor,$aWeight); - $this->left = new RectPatternLDiag($aColor,$aWeight); + function __construct($aColor="black",$aWeight=1) { + parent::__construct($aColor,$aWeight); + $this->right = new RectPatternRDiag($aColor,$aWeight); + $this->left = new RectPatternLDiag($aColor,$aWeight); } function SetOrder($aDepth) { - $this->left->SetOrder($aDepth); - $this->right->SetOrder($aDepth); + $this->left->SetOrder($aDepth); + $this->right->SetOrder($aDepth); } function SetPos($aRect) { - parent::SetPos($aRect); - $this->left->SetPos($aRect); - $this->right->SetPos($aRect); + parent::SetPos($aRect); + $this->left->SetPos($aRect); + $this->right->SetPos($aRect); } function SetDensity($aDens) { - $this->left->SetDensity($aDens); - $this->right->SetDensity($aDens); + $this->left->SetDensity($aDens); + $this->right->SetDensity($aDens); } function DoPattern($aImg) { - $this->left->DoPattern($aImg); - $this->right->DoPattern($aImg); + $this->left->DoPattern($aImg); + $this->right->DoPattern($aImg); } } //===================================================================== // Class RectPatternFactory -// Factory class for rectangular pattern +// Factory class for rectangular pattern //===================================================================== class RectPatternFactory { - function RectPatternFactory() { - // Empty + function __construct() { + // Empty } function Create($aPattern,$aColor,$aWeight=1) { - switch($aPattern) { - case BAND_RDIAG: - $obj = new RectPatternRDiag($aColor,$aWeight); - break; - case BAND_LDIAG: - $obj = new RectPatternLDiag($aColor,$aWeight); - break; - case BAND_SOLID: - $obj = new RectPatternSolid($aColor,$aWeight); - break; - case BAND_VLINE: - $obj = new RectPatternVert($aColor,$aWeight); - break; - case BAND_HLINE: - $obj = new RectPatternHor($aColor,$aWeight); - break; - case BAND_3DPLANE: - $obj = new RectPattern3DPlane($aColor,$aWeight); - break; - case BAND_HVCROSS: - $obj = new RectPatternCross($aColor,$aWeight); - break; - case BAND_DIAGCROSS: - $obj = new RectPatternDiagCross($aColor,$aWeight); - break; - default: - JpGraphError::RaiseL(16003,$aPattern); -//(" Unknown pattern specification ($aPattern)"); - } - return $obj; + switch($aPattern) { + case BAND_RDIAG: + $obj = new RectPatternRDiag($aColor,$aWeight); + break; + case BAND_LDIAG: + $obj = new RectPatternLDiag($aColor,$aWeight); + break; + case BAND_SOLID: + $obj = new RectPatternSolid($aColor,$aWeight); + break; + case BAND_VLINE: + $obj = new RectPatternVert($aColor,$aWeight); + break; + case BAND_HLINE: + $obj = new RectPatternHor($aColor,$aWeight); + break; + case BAND_3DPLANE: + $obj = new RectPattern3DPlane($aColor,$aWeight); + break; + case BAND_HVCROSS: + $obj = new RectPatternCross($aColor,$aWeight); + break; + case BAND_DIAGCROSS: + $obj = new RectPatternDiagCross($aColor,$aWeight); + break; + default: + JpGraphError::RaiseL(16003,$aPattern); + //(" Unknown pattern specification ($aPattern)"); + } + return $obj; } } @@ -540,94 +540,94 @@ class PlotBand { private $prect=null; private $dir, $min, $max; - function PlotBand($aDir,$aPattern,$aMin,$aMax,$aColor="black",$aWeight=1,$aDepth=DEPTH_BACK) { - $f = new RectPatternFactory(); - $this->prect = $f->Create($aPattern,$aColor,$aWeight); - if( is_numeric($aMin) && is_numeric($aMax) && ($aMin > $aMax) ) - JpGraphError::RaiseL(16004); -//('Min value for plotband is larger than specified max value. Please correct.'); - $this->dir = $aDir; - $this->min = $aMin; - $this->max = $aMax; - $this->depth=$aDepth; + function __construct($aDir,$aPattern,$aMin,$aMax,$aColor="black",$aWeight=1,$aDepth=DEPTH_BACK) { + $f = new RectPatternFactory(); + $this->prect = $f->Create($aPattern,$aColor,$aWeight); + if( is_numeric($aMin) && is_numeric($aMax) && ($aMin > $aMax) ) + JpGraphError::RaiseL(16004); + //('Min value for plotband is larger than specified max value. Please correct.'); + $this->dir = $aDir; + $this->min = $aMin; + $this->max = $aMax; + $this->depth=$aDepth; } - + // Set position. aRect contains absolute image coordinates function SetPos($aRect) { - assert( $this->prect != null ) ; - $this->prect->SetPos($aRect); + assert( $this->prect != null ) ; + $this->prect->SetPos($aRect); } - + function ShowFrame($aFlag=true) { - $this->prect->ShowFrame($aFlag); + $this->prect->ShowFrame($aFlag); } // Set z-order. In front of pplot or in the back function SetOrder($aDepth) { - $this->depth=$aDepth; + $this->depth=$aDepth; } - + function SetDensity($aDens) { - $this->prect->SetDensity($aDens); + $this->prect->SetDensity($aDens); } - + function GetDir() { - return $this->dir; + return $this->dir; } - + function GetMin() { - return $this->min; + return $this->min; } - + function GetMax() { - return $this->max; + return $this->max; } function PreStrokeAdjust($aGraph) { - // Nothing to do + // Nothing to do } - + // Display band function Stroke($aImg,$aXScale,$aYScale) { - assert( $this->prect != null ) ; - if( $this->dir == HORIZONTAL ) { - if( $this->min === 'min' ) $this->min = $aYScale->GetMinVal(); - if( $this->max === 'max' ) $this->max = $aYScale->GetMaxVal(); + assert( $this->prect != null ) ; + if( $this->dir == HORIZONTAL ) { + if( $this->min === 'min' ) $this->min = $aYScale->GetMinVal(); + if( $this->max === 'max' ) $this->max = $aYScale->GetMaxVal(); // Only draw the bar if it actually appears in the range if ($this->min < $aYScale->GetMaxVal() && $this->max > $aYScale->GetMinVal()) { - - // Trucate to limit of axis - $this->min = max($this->min, $aYScale->GetMinVal()); - $this->max = min($this->max, $aYScale->GetMaxVal()); + + // Trucate to limit of axis + $this->min = max($this->min, $aYScale->GetMinVal()); + $this->max = min($this->max, $aYScale->GetMaxVal()); - $x=$aXScale->scale_abs[0]; - $y=$aYScale->Translate($this->max); - $width=$aXScale->scale_abs[1]-$aXScale->scale_abs[0]+1; - $height=abs($y-$aYScale->Translate($this->min))+1; - $this->prect->SetPos(new Rectangle($x,$y,$width,$height)); - $this->prect->Stroke($aImg); + $x=$aXScale->scale_abs[0]; + $y=$aYScale->Translate($this->max); + $width=$aXScale->scale_abs[1]-$aXScale->scale_abs[0]+1; + $height=abs($y-$aYScale->Translate($this->min))+1; + $this->prect->SetPos(new Rectangle($x,$y,$width,$height)); + $this->prect->Stroke($aImg); } - } - else { // VERTICAL - if( $this->min === 'min' ) $this->min = $aXScale->GetMinVal(); - if( $this->max === 'max' ) $this->max = $aXScale->GetMaxVal(); - + } + else { // VERTICAL + if( $this->min === 'min' ) $this->min = $aXScale->GetMinVal(); + if( $this->max === 'max' ) $this->max = $aXScale->GetMaxVal(); + // Only draw the bar if it actually appears in the range - if ($this->min < $aXScale->GetMaxVal() && $this->max > $aXScale->GetMinVal()) { - - // Trucate to limit of axis - $this->min = max($this->min, $aXScale->GetMinVal()); - $this->max = min($this->max, $aXScale->GetMaxVal()); + if ($this->min < $aXScale->GetMaxVal() && $this->max > $aXScale->GetMinVal()) { + + // Trucate to limit of axis + $this->min = max($this->min, $aXScale->GetMinVal()); + $this->max = min($this->max, $aXScale->GetMaxVal()); - $y=$aYScale->scale_abs[1]; - $x=$aXScale->Translate($this->min); - $height=abs($aYScale->scale_abs[1]-$aYScale->scale_abs[0]); - $width=abs($x-$aXScale->Translate($this->max)); - $this->prect->SetPos(new Rectangle($x,$y,$width,$height)); - $this->prect->Stroke($aImg); + $y=$aYScale->scale_abs[1]; + $x=$aXScale->Translate($this->min); + $height=abs($aYScale->scale_abs[1]-$aYScale->scale_abs[0]); + $width=abs($x-$aXScale->Translate($this->max)); + $this->prect->SetPos(new Rectangle($x,$y,$width,$height)); + $this->prect->Stroke($aImg); } - } + } } } diff --git a/libs/jpgraph/jpgraph_plotline.php b/libs/jpgraph/jpgraph_plotline.php new file mode 100644 index 0000000..0967e78 --- /dev/null +++ b/libs/jpgraph/jpgraph_plotline.php @@ -0,0 +1,130 @@ +direction = $aDir; + $this->color=$aColor; + $this->weight=$aWeight; + $this->scaleposition=$aPos; + } + + function SetLegend($aLegend,$aCSIM='',$aCSIMAlt='',$aCSIMWinTarget='') { + $this->legend = $aLegend; + $this->legendcsimtarget = $aCSIM; + $this->legendcsimwintarget = $aCSIMWinTarget; + $this->legendcsimalt = $aCSIMAlt; + } + + function HideLegend($f=true) { + $this->hidelegend = $f; + } + + function SetPosition($aScalePosition) { + $this->scaleposition=$aScalePosition; + } + + function SetDirection($aDir) { + $this->direction = $aDir; + } + + function SetColor($aColor) { + $this->color=$aColor; + } + + function SetWeight($aWeight) { + $this->weight=$aWeight; + } + + function SetLineStyle($aStyle) { + $this->iLineStyle = $aStyle; + } + + //--------------- + // PRIVATE METHODS + + function DoLegend($graph) { + if( !$this->hidelegend ) $this->Legend($graph); + } + + // Framework function the chance for each plot class to set a legend + function Legend($aGraph) { + if( $this->legend != '' ) { + $dummyPlotMark = new PlotMark(); + $lineStyle = 1; + $aGraph->legend->Add($this->legend,$this->color,$dummyPlotMark,$lineStyle, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + } + + function PreStrokeAdjust($aGraph) { + // Nothing to do + } + + // Called by framework to allow the object to draw + // optional information in the margin area + function StrokeMargin($aImg) { + // Nothing to do + } + + // Framework function to allow the object to adjust the scale + function PrescaleSetup($aGraph) { + // Nothing to do + } + + function Min() { + return array(null,null); + } + + function Max() { + return array(null,null); + } + + + function Stroke($aImg,$aXScale,$aYScale) { + $aImg->SetColor($this->color); + $aImg->SetLineWeight($this->weight); + $oldStyle = $aImg->SetLineStyle($this->iLineStyle); + if( $this->direction == VERTICAL ) { + $ymin_abs=$aYScale->Translate($aYScale->GetMinVal()); + $ymax_abs=$aYScale->Translate($aYScale->GetMaxVal()); + $xpos_abs=$aXScale->Translate($this->scaleposition); + $aImg->StyleLine($xpos_abs, $ymin_abs, $xpos_abs, $ymax_abs); + } + elseif( $this->direction == HORIZONTAL ) { + //$xmin_abs=$aXScale->Translate($aXScale->GetMinVal()); + $xmin_abs=$aImg->left_margin; + //$xmax_abs=$aXScale->Translate($aXScale->GetMaxVal()); + $xmax_abs=$aImg->width-$aImg->right_margin; + $ypos_abs=$aYScale->Translate($this->scaleposition); + $aImg->StyleLine($xmin_abs, $ypos_abs, $xmax_abs, $ypos_abs); + } + else { + JpGraphError::RaiseL(25125);//(" Illegal direction for static line"); + } + $aImg->SetLineStyle($oldStyle); + } +} + + +?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_plotmark.inc.php b/libs/jpgraph/jpgraph_plotmark.inc.php index c8a381a..78a08cf 100644 --- a/libs/jpgraph/jpgraph_plotmark.inc.php +++ b/libs/jpgraph/jpgraph_plotmark.inc.php @@ -1,9 +1,9 @@ title = new Text(); - $this->title->Hide(); - $this->csimareas = ''; - $this->type=-1; + //-------------- + // CONSTRUCTOR + function __construct() { + $this->title = new Text(); + $this->title->Hide(); + $this->csimareas = ''; + $this->type=-1; } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function SetType($aType,$aFileName='',$aScale=1.0) { - $this->type = $aType; - if( $aType == MARK_IMG && $aFileName=='' ) { - JpGraphError::RaiseL(23003);//('A filename must be specified if you set the mark type to MARK_IMG.'); - } - $this->iFileName = $aFileName; - $this->iScale = $aScale; + $this->type = $aType; + if( $aType == MARK_IMG && $aFileName=='' ) { + JpGraphError::RaiseL(23003);//('A filename must be specified if you set the mark type to MARK_IMG.'); + } + $this->iFileName = $aFileName; + $this->iScale = $aScale; } - + function SetCallback($aFunc) { - $this->iFormatCallback = $aFunc; + $this->iFormatCallback = $aFunc; } function SetCallbackYX($aFunc) { - $this->iFormatCallback2 = $aFunc; + $this->iFormatCallback2 = $aFunc; } - + function GetType() { - return $this->type; + return $this->type; } - + function SetColor($aColor) { - $this->color=$aColor; + $this->color=$aColor; } - + function SetFillColor($aFillColor) { - $this->fill_color = $aFillColor; + $this->fill_color = $aFillColor; } function SetWeight($aWeight) { - $this->weight = $aWeight; + $this->weight = $aWeight; } // Synonym for SetWidth() function SetSize($aWidth) { - $this->width=$aWidth; + $this->width=$aWidth; } - + function SetWidth($aWidth) { - $this->width=$aWidth; + $this->width=$aWidth; } function SetDefaultWidth() { - switch( $this->type ) { - case MARK_CIRCLE: - case MARK_FILLEDCIRCLE: - $this->width=4; - break; - default: - $this->width=7; - } + switch( $this->type ) { + case MARK_CIRCLE: + case MARK_FILLEDCIRCLE: + $this->width=4; + break; + default: + $this->width=7; + } } - + function GetWidth() { - return $this->width; + return $this->width; } - + function Hide($aHide=true) { - $this->show = !$aHide; + $this->show = !$aHide; } - + function Show($aShow=true) { - $this->show = $aShow; + $this->show = $aShow; } function SetCSIMAltVal($aY,$aX='') { - $this->yvalue=$aY; - $this->xvalue=$aX; + $this->yvalue=$aY; + $this->xvalue=$aX; } - + function SetCSIMTarget($aTarget,$aWinTarget='') { $this->csimtarget=$aTarget; $this->csimwintarget=$aWinTarget; } - + function SetCSIMAlt($aAlt) { $this->csimalt=$aAlt; } - + function GetCSIMAreas(){ return $this->csimareas; } - + function AddCSIMPoly($aPts) { $coords = round($aPts[0]).", ".round($aPts[1]); $n = count($aPts)/2; for( $i=1; $i < $n; ++$i){ $coords .= ", ".round($aPts[2*$i]).", ".round($aPts[2*$i+1]); } - $this->csimareas=""; + $this->csimareas=""; if( !empty($this->csimtarget) ) { - $this->csimareas .= "csimtarget)."\""; + $this->csimareas .= "csimtarget)."\""; - if( !empty($this->csimwintarget) ) { - $this->csimareas .= " target=\"".$this->csimwintarget."\" "; - } + if( !empty($this->csimwintarget) ) { + $this->csimareas .= " target=\"".$this->csimwintarget."\" "; + } - if( !empty($this->csimalt) ) { - $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue); - $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\""; - } - $this->csimareas .= " />\n"; - } - } - - function AddCSIMCircle($x,$y,$r) { - $x = round($x); $y=round($y); $r=round($r); - $this->csimareas=""; - if( !empty($this->csimtarget) ) { - $this->csimareas .= "csimtarget)."\""; - - if( !empty($this->csimwintarget) ) { - $this->csimareas .= " target=\"".$this->csimwintarget."\" "; - } - - if( !empty($this->csimalt) ) { - $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue); - $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimareas .= " />\n"; + if( !empty($this->csimalt) ) { + $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue); + $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\""; + } + $this->csimareas .= " />\n"; } } - + + function AddCSIMCircle($x,$y,$r) { + $x = round($x); $y=round($y); $r=round($r); + $this->csimareas=""; + if( !empty($this->csimtarget) ) { + $this->csimareas .= "csimtarget)."\""; + + if( !empty($this->csimwintarget) ) { + $this->csimareas .= " target=\"".$this->csimwintarget."\" "; + } + + if( !empty($this->csimalt) ) { + $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue); + $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimareas .= " />\n"; + } + } + function Stroke($img,$x,$y) { - if( !$this->show ) return; + if( !$this->show ) return; - if( $this->iFormatCallback != '' || $this->iFormatCallback2 != '' ) { + if( $this->iFormatCallback != '' || $this->iFormatCallback2 != '' ) { - if( $this->iFormatCallback != '' ) { - $f = $this->iFormatCallback; - list($width,$color,$fcolor) = call_user_func($f,$this->yvalue); - $filename = $this->iFileName; - $imgscale = $this->iScale; - } - else { - $f = $this->iFormatCallback2; - list($width,$color,$fcolor,$filename,$imgscale) = call_user_func($f,$this->yvalue,$this->xvalue); - if( $filename=="" ) $filename = $this->iFileName; - if( $imgscale=="" ) $imgscale = $this->iScale; - } + if( $this->iFormatCallback != '' ) { + $f = $this->iFormatCallback; + list($width,$color,$fcolor) = call_user_func($f,$this->yvalue); + $filename = $this->iFileName; + $imgscale = $this->iScale; + } + else { + $f = $this->iFormatCallback2; + list($width,$color,$fcolor,$filename,$imgscale) = call_user_func($f,$this->yvalue,$this->xvalue); + if( $filename=="" ) $filename = $this->iFileName; + if( $imgscale=="" ) $imgscale = $this->iScale; + } - if( $width=="" ) $width = $this->width; - if( $color=="" ) $color = $this->color; - if( $fcolor=="" ) $fcolor = $this->fill_color; + if( $width=="" ) $width = $this->width; + if( $color=="" ) $color = $this->color; + if( $fcolor=="" ) $fcolor = $this->fill_color; - } - else { - $fcolor = $this->fill_color; - $color = $this->color; - $width = $this->width; - $filename = $this->iFileName; - $imgscale = $this->iScale; - } + } + else { + $fcolor = $this->fill_color; + $color = $this->color; + $width = $this->width; + $filename = $this->iFileName; + $imgscale = $this->iScale; + } - if( $this->type == MARK_IMG || - ($this->type >= MARK_FLAG1 && $this->type <= MARK_FLAG4 ) || - $this->type >= MARK_IMG_PUSHPIN ) { + if( $this->type == MARK_IMG || + ($this->type >= MARK_FLAG1 && $this->type <= MARK_FLAG4 ) || + $this->type >= MARK_IMG_PUSHPIN ) { - // Note: For the builtin images we use the "filename" parameter - // to denote the color - $anchor_x = 0.5; - $anchor_y = 0.5; - switch( $this->type ) { - case MARK_FLAG1: - case MARK_FLAG2: - case MARK_FLAG3: - case MARK_FLAG4: - $this->markimg = FlagCache::GetFlagImgByName($this->type-MARK_FLAG1+1,$filename); - break; + // Note: For the builtin images we use the "filename" parameter + // to denote the color + $anchor_x = 0.5; + $anchor_y = 0.5; + switch( $this->type ) { + case MARK_FLAG1: + case MARK_FLAG2: + case MARK_FLAG3: + case MARK_FLAG4: + $this->markimg = FlagCache::GetFlagImgByName($this->type-MARK_FLAG1+1,$filename); + break; - case MARK_IMG : - // Load an image and use that as a marker - // Small optimization, if we have already read an image don't - // waste time reading it again. - if( $this->markimg == '' || !($this->oldfilename === $filename) ) { - $this->markimg = Graph::LoadBkgImage('',$filename); - $this->oldfilename = $filename ; - } - break; + case MARK_IMG : + // Load an image and use that as a marker + // Small optimization, if we have already read an image don't + // waste time reading it again. + if( $this->markimg == '' || !($this->oldfilename === $filename) ) { + $this->markimg = Graph::LoadBkgImage('',$filename); + $this->oldfilename = $filename ; + } + break; - case MARK_IMG_PUSHPIN: - case MARK_IMG_SPUSHPIN: - case MARK_IMG_LPUSHPIN: - if( $this->imgdata_pushpins == null ) { - require_once 'imgdata_pushpins.inc.php'; - $this->imgdata_pushpins = new ImgData_PushPins(); - } - $this->markimg = $this->imgdata_pushpins->GetImg($this->type,$filename); - list($anchor_x,$anchor_y) = $this->imgdata_pushpins->GetAnchor(); - break; + case MARK_IMG_PUSHPIN: + case MARK_IMG_SPUSHPIN: + case MARK_IMG_LPUSHPIN: + if( $this->imgdata_pushpins == null ) { + require_once 'imgdata_pushpins.inc.php'; + $this->imgdata_pushpins = new ImgData_PushPins(); + } + $this->markimg = $this->imgdata_pushpins->GetImg($this->type,$filename); + list($anchor_x,$anchor_y) = $this->imgdata_pushpins->GetAnchor(); + break; - case MARK_IMG_SQUARE: - if( $this->imgdata_squares == null ) { - require_once 'imgdata_squares.inc.php'; - $this->imgdata_squares = new ImgData_Squares(); - } - $this->markimg = $this->imgdata_squares->GetImg($this->type,$filename); - list($anchor_x,$anchor_y) = $this->imgdata_squares->GetAnchor(); - break; + case MARK_IMG_SQUARE: + if( $this->imgdata_squares == null ) { + require_once 'imgdata_squares.inc.php'; + $this->imgdata_squares = new ImgData_Squares(); + } + $this->markimg = $this->imgdata_squares->GetImg($this->type,$filename); + list($anchor_x,$anchor_y) = $this->imgdata_squares->GetAnchor(); + break; - case MARK_IMG_STAR: - if( $this->imgdata_stars == null ) { - require_once 'imgdata_stars.inc.php'; - $this->imgdata_stars = new ImgData_Stars(); - } - $this->markimg = $this->imgdata_stars->GetImg($this->type,$filename); - list($anchor_x,$anchor_y) = $this->imgdata_stars->GetAnchor(); - break; + case MARK_IMG_STAR: + if( $this->imgdata_stars == null ) { + require_once 'imgdata_stars.inc.php'; + $this->imgdata_stars = new ImgData_Stars(); + } + $this->markimg = $this->imgdata_stars->GetImg($this->type,$filename); + list($anchor_x,$anchor_y) = $this->imgdata_stars->GetAnchor(); + break; - case MARK_IMG_BEVEL: - if( $this->imgdata_bevels == null ) { - require_once 'imgdata_bevels.inc.php'; - $this->imgdata_bevels = new ImgData_Bevels(); - } - $this->markimg = $this->imgdata_bevels->GetImg($this->type,$filename); - list($anchor_x,$anchor_y) = $this->imgdata_bevels->GetAnchor(); - break; + case MARK_IMG_BEVEL: + if( $this->imgdata_bevels == null ) { + require_once 'imgdata_bevels.inc.php'; + $this->imgdata_bevels = new ImgData_Bevels(); + } + $this->markimg = $this->imgdata_bevels->GetImg($this->type,$filename); + list($anchor_x,$anchor_y) = $this->imgdata_bevels->GetAnchor(); + break; - case MARK_IMG_DIAMOND: - if( $this->imgdata_diamonds == null ) { - require_once 'imgdata_diamonds.inc.php'; - $this->imgdata_diamonds = new ImgData_Diamonds(); - } - $this->markimg = $this->imgdata_diamonds->GetImg($this->type,$filename); - list($anchor_x,$anchor_y) = $this->imgdata_diamonds->GetAnchor(); - break; + case MARK_IMG_DIAMOND: + if( $this->imgdata_diamonds == null ) { + require_once 'imgdata_diamonds.inc.php'; + $this->imgdata_diamonds = new ImgData_Diamonds(); + } + $this->markimg = $this->imgdata_diamonds->GetImg($this->type,$filename); + list($anchor_x,$anchor_y) = $this->imgdata_diamonds->GetAnchor(); + break; - case MARK_IMG_BALL: - case MARK_IMG_SBALL: - case MARK_IMG_MBALL: - case MARK_IMG_LBALL: - if( $this->imgdata_balls == null ) { - require_once 'imgdata_balls.inc.php'; - $this->imgdata_balls = new ImgData_Balls(); - } - $this->markimg = $this->imgdata_balls->GetImg($this->type,$filename); - list($anchor_x,$anchor_y) = $this->imgdata_balls->GetAnchor(); - break; - } + case MARK_IMG_BALL: + case MARK_IMG_SBALL: + case MARK_IMG_MBALL: + case MARK_IMG_LBALL: + if( $this->imgdata_balls == null ) { + require_once 'imgdata_balls.inc.php'; + $this->imgdata_balls = new ImgData_Balls(); + } + $this->markimg = $this->imgdata_balls->GetImg($this->type,$filename); + list($anchor_x,$anchor_y) = $this->imgdata_balls->GetAnchor(); + break; + } - $w = $img->GetWidth($this->markimg); - $h = $img->GetHeight($this->markimg); - - $dw = round($imgscale * $w ); - $dh = round($imgscale * $h ); + $w = $img->GetWidth($this->markimg); + $h = $img->GetHeight($this->markimg); + + $dw = round($imgscale * $w ); + $dh = round($imgscale * $h ); - // Do potential rotation - list($x,$y) = $img->Rotate($x,$y); + // Do potential rotation + list($x,$y) = $img->Rotate($x,$y); - $dx = round($x-$dw*$anchor_x); - $dy = round($y-$dh*$anchor_y); - - $this->width = max($dx,$dy); - - $img->Copy($this->markimg,$dx,$dy,0,0,$dw,$dh,$w,$h); - if( !empty($this->csimtarget) ) { - $this->csimareas = "csimtarget)."\""; - - if( !empty($this->csimwintarget) ) { - $this->csimareas .= " target=\"".$this->csimwintarget."\" "; - } + $dx = round($x-$dw*$anchor_x); + $dy = round($y-$dh*$anchor_y); + + $this->width = max($dx,$dy); + + $img->Copy($this->markimg,$dx,$dy,0,0,$dw,$dh,$w,$h); + if( !empty($this->csimtarget) ) { + $this->csimareas = "csimtarget)."\""; - if( !empty($this->csimalt) ) { - $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue); - $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimareas .= " />\n"; - } - - // Stroke title - $this->title->Align("center","top"); - $this->title->Stroke($img,$x,$y+round($dh/2)); - return; - } + if( !empty($this->csimwintarget) ) { + $this->csimareas .= " target=\"".$this->csimwintarget."\" "; + } - $weight = $this->weight; - $dx=round($width/2,0); - $dy=round($width/2,0); - $pts=0; + if( !empty($this->csimalt) ) { + $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue); + $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimareas .= " />\n"; + } + + // Stroke title + $this->title->Align("center","top"); + $this->title->Stroke($img,$x,$y+round($dh/2)); + return; + } - switch( $this->type ) { - case MARK_SQUARE: - $c[]=$x-$dx;$c[]=$y-$dy; - $c[]=$x+$dx;$c[]=$y-$dy; - $c[]=$x+$dx;$c[]=$y+$dy; - $c[]=$x-$dx;$c[]=$y+$dy; - $c[]=$x-$dx;$c[]=$y-$dy; - $pts=5; - break; - case MARK_UTRIANGLE: - ++$dx;++$dy; - $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx - $c[]=$x;$c[]=$y-0.87*$dy; - $c[]=$x+$dx;$c[]=$y+0.87*$dy; - $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx - $pts=4; - break; - case MARK_DTRIANGLE: - ++$dx;++$dy; - $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx - $c[]=$x-$dx;$c[]=$y-0.87*$dy; - $c[]=$x+$dx;$c[]=$y-0.87*$dy; - $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx - $pts=4; - break; - case MARK_DIAMOND: - $c[]=$x;$c[]=$y+$dy; - $c[]=$x-$dx;$c[]=$y; - $c[]=$x;$c[]=$y-$dy; - $c[]=$x+$dx;$c[]=$y; - $c[]=$x;$c[]=$y+$dy; - $pts=5; - break; - case MARK_LEFTTRIANGLE: - $c[]=$x;$c[]=$y; - $c[]=$x;$c[]=$y+2*$dy; - $c[]=$x+$dx*2;$c[]=$y; - $c[]=$x;$c[]=$y; - $pts=4; - break; - case MARK_RIGHTTRIANGLE: - $c[]=$x-$dx*2;$c[]=$y; - $c[]=$x;$c[]=$y+2*$dy; - $c[]=$x;$c[]=$y; - $c[]=$x-$dx*2;$c[]=$y; - $pts=4; - break; - case MARK_FLASH: - $dy *= 2; - $c[]=$x+$dx/2; $c[]=$y-$dy; - $c[]=$x-$dx+$dx/2; $c[]=$y+$dy*0.7-$dy; - $c[]=$x+$dx/2; $c[]=$y+$dy*1.3-$dy; - $c[]=$x-$dx+$dx/2; $c[]=$y+2*$dy-$dy; - $img->SetLineWeight($weight); - $img->SetColor($color); - $img->Polygon($c); - $img->SetLineWeight(1); - $this->AddCSIMPoly($c); - break; - } + $weight = $this->weight; + $dx=round($width/2,0); + $dy=round($width/2,0); + $pts=0; - if( $pts>0 ) { - $this->AddCSIMPoly($c); - $img->SetLineWeight($weight); - $img->SetColor($fcolor); - $img->FilledPolygon($c); - $img->SetColor($color); - $img->Polygon($c); - $img->SetLineWeight(1); - } - elseif( $this->type==MARK_CIRCLE ) { - $img->SetColor($color); - $img->Circle($x,$y,$width); - $this->AddCSIMCircle($x,$y,$width); - } - elseif( $this->type==MARK_FILLEDCIRCLE ) { - $img->SetColor($fcolor); - $img->FilledCircle($x,$y,$width); - $img->SetColor($color); - $img->Circle($x,$y,$width); - $this->AddCSIMCircle($x,$y,$width); - } - elseif( $this->type==MARK_CROSS ) { - // Oversize by a pixel to match the X - $img->SetColor($color); - $img->SetLineWeight($weight); - $img->Line($x,$y+$dy+1,$x,$y-$dy-1); - $img->Line($x-$dx-1,$y,$x+$dx+1,$y); - $this->AddCSIMCircle($x,$y,$dx); - } - elseif( $this->type==MARK_X ) { - $img->SetColor($color); - $img->SetLineWeight($weight); - $img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy); - $img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy); - $this->AddCSIMCircle($x,$y,$dx+$dy); - } - elseif( $this->type==MARK_STAR ) { - $img->SetColor($color); - $img->SetLineWeight($weight); - $img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy); - $img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy); - // Oversize by a pixel to match the X - $img->Line($x,$y+$dy+1,$x,$y-$dy-1); - $img->Line($x-$dx-1,$y,$x+$dx+1,$y); - $this->AddCSIMCircle($x,$y,$dx+$dy); - } - - // Stroke title - $this->title->Align("center","center"); - $this->title->Stroke($img,$x,$y); + switch( $this->type ) { + case MARK_SQUARE: + $c[]=$x-$dx;$c[]=$y-$dy; + $c[]=$x+$dx;$c[]=$y-$dy; + $c[]=$x+$dx;$c[]=$y+$dy; + $c[]=$x-$dx;$c[]=$y+$dy; + $c[]=$x-$dx;$c[]=$y-$dy; + $pts=5; + break; + case MARK_UTRIANGLE: + ++$dx;++$dy; + $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx + $c[]=$x;$c[]=$y-0.87*$dy; + $c[]=$x+$dx;$c[]=$y+0.87*$dy; + $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx + $pts=4; + break; + case MARK_DTRIANGLE: + ++$dx;++$dy; + $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx + $c[]=$x-$dx;$c[]=$y-0.87*$dy; + $c[]=$x+$dx;$c[]=$y-0.87*$dy; + $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx + $pts=4; + break; + case MARK_DIAMOND: + $c[]=$x;$c[]=$y+$dy; + $c[]=$x-$dx;$c[]=$y; + $c[]=$x;$c[]=$y-$dy; + $c[]=$x+$dx;$c[]=$y; + $c[]=$x;$c[]=$y+$dy; + $pts=5; + break; + case MARK_LEFTTRIANGLE: + $c[]=$x;$c[]=$y; + $c[]=$x;$c[]=$y+2*$dy; + $c[]=$x+$dx*2;$c[]=$y; + $c[]=$x;$c[]=$y; + $pts=4; + break; + case MARK_RIGHTTRIANGLE: + $c[]=$x-$dx*2;$c[]=$y; + $c[]=$x;$c[]=$y+2*$dy; + $c[]=$x;$c[]=$y; + $c[]=$x-$dx*2;$c[]=$y; + $pts=4; + break; + case MARK_FLASH: + $dy *= 2; + $c[]=$x+$dx/2; $c[]=$y-$dy; + $c[]=$x-$dx+$dx/2; $c[]=$y+$dy*0.7-$dy; + $c[]=$x+$dx/2; $c[]=$y+$dy*1.3-$dy; + $c[]=$x-$dx+$dx/2; $c[]=$y+2*$dy-$dy; + $img->SetLineWeight($weight); + $img->SetColor($color); + $img->Polygon($c); + $img->SetLineWeight(1); + $this->AddCSIMPoly($c); + break; + } + + if( $pts>0 ) { + $this->AddCSIMPoly($c); + $img->SetLineWeight($weight); + $img->SetColor($fcolor); + $img->FilledPolygon($c); + $img->SetColor($color); + $img->Polygon($c); + $img->SetLineWeight(1); + } + elseif( $this->type==MARK_CIRCLE ) { + $img->SetColor($color); + $img->Circle($x,$y,$width); + $this->AddCSIMCircle($x,$y,$width); + } + elseif( $this->type==MARK_FILLEDCIRCLE ) { + $img->SetColor($fcolor); + $img->FilledCircle($x,$y,$width); + $img->SetColor($color); + $img->Circle($x,$y,$width); + $this->AddCSIMCircle($x,$y,$width); + } + elseif( $this->type==MARK_CROSS ) { + // Oversize by a pixel to match the X + $img->SetColor($color); + $img->SetLineWeight($weight); + $img->Line($x,$y+$dy+1,$x,$y-$dy-1); + $img->Line($x-$dx-1,$y,$x+$dx+1,$y); + $this->AddCSIMCircle($x,$y,$dx); + } + elseif( $this->type==MARK_X ) { + $img->SetColor($color); + $img->SetLineWeight($weight); + $img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy); + $img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy); + $this->AddCSIMCircle($x,$y,$dx+$dy); + } + elseif( $this->type==MARK_STAR ) { + $img->SetColor($color); + $img->SetLineWeight($weight); + $img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy); + $img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy); + // Oversize by a pixel to match the X + $img->Line($x,$y+$dy+1,$x,$y-$dy-1); + $img->Line($x-$dx-1,$y,$x+$dx+1,$y); + $this->AddCSIMCircle($x,$y,$dx+$dy); + } + + // Stroke title + $this->title->Align("center","center"); + $this->title->Stroke($img,$x,$y); } } // Class @@ -440,57 +440,64 @@ class PlotMark { //======================================================================== // CLASS ImgData -// Description: Base class for all image data classes that contains the +// Description: Base class for all image data classes that contains the // real image data. //======================================================================== class ImgData { - protected $name = ''; // Each subclass gives a name - protected $an = array(); // Data array names - protected $colors = array(); // Available colors - protected $index = array(); // Index for colors - protected $maxidx = 0 ; // Max color index + protected $name = ''; // Each subclass gives a name + protected $an = array(); // Data array names + protected $colors = array(); // Available colors + protected $index = array(); // Index for colors + protected $maxidx = 0 ; // Max color index protected $anchor_x=0.5, $anchor_y=0.5 ; // Where is the center of the image + + function __construct() { + // Empty + } + // Create a GD image from the data and return a GD handle function GetImg($aMark,$aIdx) { - $n = $this->an[$aMark]; - if( is_string($aIdx) ) { - if( !in_array($aIdx,$this->colors) ) { - JpGraphError::RaiseL(23001,$this->name,$aIdx);//('This marker "'.($this->name).'" does not exist in color: '.$aIdx); - } - $idx = $this->index[$aIdx]; - } - elseif( !is_integer($aIdx) || - (is_integer($aIdx) && $aIdx > $this->maxidx ) ) { - JpGraphError::RaiseL(23002,$this->name);//('Mark color index too large for marker "'.($this->name).'"'); - } - else - $idx = $aIdx ; - return Image::CreateFromString(base64_decode($this->{$n}[$idx][1])); + $n = $this->an[$aMark]; + if( is_string($aIdx) ) { + if( !in_array($aIdx,$this->colors) ) { + JpGraphError::RaiseL(23001,$this->name,$aIdx);//('This marker "'.($this->name).'" does not exist in color: '.$aIdx); + } + $idx = $this->index[$aIdx]; + } + elseif( !is_integer($aIdx) || + (is_integer($aIdx) && $aIdx > $this->maxidx ) ) { + JpGraphError::RaiseL(23002,$this->name);//('Mark color index too large for marker "'.($this->name).'"'); + } + else + $idx = $aIdx ; + return Image::CreateFromString(base64_decode($this->{$n}[$idx][1])); } + function GetAnchor() { - return array($this->anchor_x,$this->anchor_y); + return array($this->anchor_x,$this->anchor_y); } } // Keep a global flag cache to reduce memory usage $_gFlagCache=array( - 1 => null, - 2 => null, - 3 => null, - 4 => null, +1 => null, +2 => null, +3 => null, +4 => null, ); // Only supposed to b called as statics class FlagCache { + static function GetFlagImgByName($aSize,$aName) { - global $_gFlagCache; - require_once('jpgraph_flags.php'); - if( $_gFlagCache[$aSize] === null ) { - $_gFlagCache[$aSize] = new FlagImages($aSize); - } - $f = $_gFlagCache[$aSize]; - $idx = $f->GetIdxByName($aName,$aFullName); - return $f->GetImgByIdx($idx); + global $_gFlagCache; + require_once('jpgraph_flags.php'); + if( $_gFlagCache[$aSize] === null ) { + $_gFlagCache[$aSize] = new FlagImages($aSize); + } + $f = $_gFlagCache[$aSize]; + $idx = $f->GetIdxByName($aName,$aFullName); + return $f->GetImgByIdx($idx); } } diff --git a/libs/jpgraph/jpgraph_polar.php b/libs/jpgraph/jpgraph_polar.php index d0398fb..af3c88b 100644 --- a/libs/jpgraph/jpgraph_polar.php +++ b/libs/jpgraph/jpgraph_polar.php @@ -1,20 +1,20 @@ numpoints = $n/2; - $this->coord = $aData; - $this->mark = new PlotMark(); + function __construct($aData) { + $n = count($aData); + if( $n & 1 ) { + JpGraphError::RaiseL(17001); + //('Polar plots must have an even number of data point. Each data point is a tuple (angle,radius).'); + } + $this->numpoints = $n/2; + $this->coord = $aData; + $this->mark = new PlotMark(); } function SetWeight($aWeight) { - $this->iLineWeight = $aWeight; + $this->iLineWeight = $aWeight; } function SetColor($aColor){ - $this->iColor = $aColor; + $this->iColor = $aColor; } function SetFillColor($aColor){ - $this->iFillColor = $aColor; + $this->iFillColor = $aColor; } function Max() { - $m = $this->coord[1]; - $i=1; - while( $i < $this->numpoints ) { - $m = max($m,$this->coord[2*$i+1]); - ++$i; - } - return $m; + $m = $this->coord[1]; + $i=1; + while( $i < $this->numpoints ) { + $m = max($m,$this->coord[2*$i+1]); + ++$i; + } + return $m; } - // Set href targets for CSIM + // Set href targets for CSIM function SetCSIMTargets($aTargets,$aAlts=null) { - $this->csimtargets=$aTargets; - $this->csimalts=$aAlts; + $this->csimtargets=$aTargets; + $this->csimalts=$aAlts; } - + // Get all created areas function GetCSIMareas() { - return $this->csimareas; - } - + return $this->csimareas; + } + function SetLegend($aLegend,$aCSIM="",$aCSIMAlt="") { - $this->legend = $aLegend; - $this->legendcsimtarget = $aCSIM; - $this->legendcsimalt = $aCSIMAlt; + $this->legend = $aLegend; + $this->legendcsimtarget = $aCSIM; + $this->legendcsimalt = $aCSIMAlt; } // Private methods function Legend($aGraph) { - $color = $this->iColor ; - if( $this->legend != "" ) { - if( $this->iFillColor!='' ) { - $color = $this->iFillColor; - $aGraph->legend->Add($this->legend,$color,$this->mark,0, - $this->legendcsimtarget,$this->legendcsimalt); - } - else { - $aGraph->legend->Add($this->legend,$color,$this->mark,$this->line_style, - $this->legendcsimtarget,$this->legendcsimalt); - } - } + $color = $this->iColor ; + if( $this->legend != "" ) { + if( $this->iFillColor!='' ) { + $color = $this->iFillColor; + $aGraph->legend->Add($this->legend,$color,$this->mark,0, + $this->legendcsimtarget,$this->legendcsimalt); + } + else { + $aGraph->legend->Add($this->legend,$color,$this->mark,$this->line_style, + $this->legendcsimtarget,$this->legendcsimalt); + } + } } function Stroke($img,$scale) { - $i=0; - $p=array(); - $this->csimareas=''; - while($i < $this->numpoints) { - list($x1,$y1) = $scale->PTranslate($this->coord[2*$i],$this->coord[2*$i+1]); - $p[2*$i] = $x1; - $p[2*$i+1] = $y1; - - if( isset($this->csimtargets[$i]) ) { - $this->mark->SetCSIMTarget($this->csimtargets[$i]); - $this->mark->SetCSIMAlt($this->csimalts[$i]); - $this->mark->SetCSIMAltVal($this->coord[2*$i], $this->coord[2*$i+1]); - $this->mark->Stroke($img,$x1,$y1); - $this->csimareas .= $this->mark->GetCSIMAreas(); - } - else - $this->mark->Stroke($img,$x1,$y1); + $i=0; + $p=array(); + $this->csimareas=''; + while($i < $this->numpoints) { + list($x1,$y1) = $scale->PTranslate($this->coord[2*$i],$this->coord[2*$i+1]); + $p[2*$i] = $x1; + $p[2*$i+1] = $y1; - ++$i; - } + if( isset($this->csimtargets[$i]) ) { + $this->mark->SetCSIMTarget($this->csimtargets[$i]); + $this->mark->SetCSIMAlt($this->csimalts[$i]); + $this->mark->SetCSIMAltVal($this->coord[2*$i], $this->coord[2*$i+1]); + $this->mark->Stroke($img,$x1,$y1); + $this->csimareas .= $this->mark->GetCSIMAreas(); + } + else { + $this->mark->Stroke($img,$x1,$y1); + } - if( $this->iFillColor != '' ) { - $img->SetColor($this->iFillColor); - $img->FilledPolygon($p); - } - $img->SetLineWeight($this->iLineWeight); - $img->SetColor($this->iColor); - $img->Polygon($p,$this->iFillColor!=''); + ++$i; + } + + if( $this->iFillColor != '' ) { + $img->SetColor($this->iFillColor); + $img->FilledPolygon($p); + } + $img->SetLineWeight($this->iLineWeight); + $img->SetColor($this->iColor); + $img->Polygon($p,$this->iFillColor!=''); } } @@ -158,481 +159,520 @@ class PolarAxis extends Axis { private $show_angle_tick=true; private $radius_tick_color='black'; - function PolarAxis($img,$aScale) { - parent::Axis($img,$aScale); + function __construct($img,$aScale) { + parent::__construct($img,$aScale); } function ShowAngleDegreeMark($aFlg=true) { - $this->show_angle_mark = $aFlg; + $this->show_angle_mark = $aFlg; } function SetAngleStep($aStep) { - $this->angle_step=$aStep; + $this->angle_step=$aStep; } function HideTicks($aFlg=true,$aAngleFlg=true) { - parent::HideTicks($aFlg,$aFlg); - $this->show_angle_tick = !$aAngleFlg; + parent::HideTicks($aFlg,$aFlg); + $this->show_angle_tick = !$aAngleFlg; } function ShowAngleLabel($aFlg=true) { - $this->show_angle_label = $aFlg; + $this->show_angle_label = $aFlg; } function ShowGrid($aMajor=true,$aMinor=false,$aAngle=true) { - $this->show_minor_grid = $aMinor; - $this->show_major_grid = $aMajor; - $this->show_angle_grid = $aAngle ; + $this->show_minor_grid = $aMinor; + $this->show_major_grid = $aMajor; + $this->show_angle_grid = $aAngle ; } function SetAngleFont($aFontFam,$aFontStyle=FS_NORMAL,$aFontSize=10) { - $this->angle_fontfam = $aFontFam; - $this->angle_fontstyle = $aFontStyle; - $this->angle_fontsize = $aFontSize; + $this->angle_fontfam = $aFontFam; + $this->angle_fontstyle = $aFontStyle; + $this->angle_fontsize = $aFontSize; } function SetColor($aColor,$aRadColor='',$aAngleColor='') { - if( $aAngleColor == '' ) - $aAngleColor=$aColor; - parent::SetColor($aColor,$aRadColor); - $this->angle_fontcolor = $aAngleColor; + if( $aAngleColor == '' ) + $aAngleColor=$aColor; + parent::SetColor($aColor,$aRadColor); + $this->angle_fontcolor = $aAngleColor; } function SetGridColor($aMajorColor,$aMinorColor='',$aAngleColor='') { - if( $aMinorColor == '' ) - $aMinorColor = $aMajorColor; - if( $aAngleColor == '' ) - $aAngleColor = $aMajorColor; + if( $aMinorColor == '' ) + $aMinorColor = $aMajorColor; + if( $aAngleColor == '' ) + $aAngleColor = $aMajorColor; - $this->gridminor_color = $aMinorColor; - $this->gridmajor_color = $aMajorColor; - $this->angle_color = $aAngleColor; + $this->gridminor_color = $aMinorColor; + $this->gridmajor_color = $aMajorColor; + $this->angle_color = $aAngleColor; } function SetTickColors($aRadColor,$aAngleColor='') { - $this->radius_tick_color = $aRadColor; - $this->angle_tick_color = $aAngleColor; + $this->radius_tick_color = $aRadColor; + $this->angle_tick_color = $aAngleColor; } - + // Private methods function StrokeGrid($pos) { - $x = round($this->img->left_margin + $this->img->plotwidth/2); - $this->scale->ticks->Stroke($this->img,$this->scale,$pos); + $x = round($this->img->left_margin + $this->img->plotwidth/2); + $this->scale->ticks->Stroke($this->img,$this->scale,$pos); - // Stroke the minor arcs - $pmin = array(); - $p = $this->scale->ticks->ticks_pos; - $n = count($p); - $i = 0; - $this->img->SetColor($this->gridminor_color); - while( $i < $n ) { - $r = $p[$i]-$x+1; - $pmin[]=$r; - if( $this->show_minor_grid ) { - $this->img->Circle($x,$pos,$r); - } - $i++; - } - - $limit = max($this->img->plotwidth,$this->img->plotheight)*1.4 ; - while( $r < $limit ) { - $off = $r; - $i=1; - $r = $off + round($p[$i]-$x+1); - while( $r < $limit && $i < $n ) { - $r = $off+$p[$i]-$x; - $pmin[]=$r; - if( $this->show_minor_grid ) { - $this->img->Circle($x,$pos,$r); - } - $i++; - } - } + // Stroke the minor arcs + $pmin = array(); + $p = $this->scale->ticks->ticks_pos; + $n = count($p); + $i = 0; + $this->img->SetColor($this->gridminor_color); + while( $i < $n ) { + $r = $p[$i]-$x+1; + $pmin[]=$r; + if( $this->show_minor_grid ) { + $this->img->Circle($x,$pos,$r); + } + $i++; + } - // Stroke the major arcs - if( $this->show_major_grid ) { - // First determine how many minor step on - // every major step. We have recorded the minor radius - // in pmin and use these values. This is done in order - // to avoid rounding errors if we were to recalculate the - // different major radius. - $pmaj = $this->scale->ticks->maj_ticks_pos; - $p = $this->scale->ticks->ticks_pos; - if( $this->scale->name == 'lin' ) { - $step=round(($pmaj[1] - $pmaj[0])/($p[1] - $p[0])); - } - else { - $step=9; - } - $n = round(count($pmin)/$step); - $i = 0; - $this->img->SetColor($this->gridmajor_color); - $limit = max($this->img->plotwidth,$this->img->plotheight)*1.4 ; - $off = $r; - $i=0; - $r = $pmin[$i*$step]; - while( $r < $limit && $i < $n ) { - $r = $pmin[$i*$step]; - $this->img->Circle($x,$pos,$r); - $i++; - } - } + $limit = max($this->img->plotwidth,$this->img->plotheight)*1.4 ; + while( $r < $limit ) { + $off = $r; + $i=1; + $r = $off + round($p[$i]-$x+1); + while( $r < $limit && $i < $n ) { + $r = $off+$p[$i]-$x; + $pmin[]=$r; + if( $this->show_minor_grid ) { + $this->img->Circle($x,$pos,$r); + } + $i++; + } + } - // Draw angles - if( $this->show_angle_grid ) { - $this->img->SetColor($this->angle_color); - $d = max($this->img->plotheight,$this->img->plotwidth)*1.4 ; - $a = 0; - $p = $this->scale->ticks->ticks_pos; - $start_radius = $p[1]-$x; - while( $a < 360 ) { - if( $a == 90 || $a == 270 ) { - // Make sure there are no rounding problem with - // exactly vertical lines - $this->img->Line($x+$start_radius*cos($a/180*M_PI)+1, - $pos-$start_radius*sin($a/180*M_PI), - $x+$start_radius*cos($a/180*M_PI)+1, - $pos-$d*sin($a/180*M_PI)); - - } - else { - $this->img->Line($x+$start_radius*cos($a/180*M_PI)+1, - $pos-$start_radius*sin($a/180*M_PI), - $x+$d*cos($a/180*M_PI), - $pos-$d*sin($a/180*M_PI)); - } - $a += $this->angle_step; - } - } + // Stroke the major arcs + if( $this->show_major_grid ) { + // First determine how many minor step on + // every major step. We have recorded the minor radius + // in pmin and use these values. This is done in order + // to avoid rounding errors if we were to recalculate the + // different major radius. + $pmaj = $this->scale->ticks->maj_ticks_pos; + $p = $this->scale->ticks->ticks_pos; + if( $this->scale->name == 'lin' ) { + $step=round(($pmaj[1] - $pmaj[0])/($p[1] - $p[0])); + } + else { + $step=9; + } + $n = round(count($pmin)/$step); + $i = 0; + $this->img->SetColor($this->gridmajor_color); + $limit = max($this->img->plotwidth,$this->img->plotheight)*1.4 ; + $off = $r; + $i=0; + $r = $pmin[$i*$step]; + while( $r < $limit && $i < $n ) { + $r = $pmin[$i*$step]; + $this->img->Circle($x,$pos,$r); + $i++; + } + } + + // Draw angles + if( $this->show_angle_grid ) { + $this->img->SetColor($this->angle_color); + $d = max($this->img->plotheight,$this->img->plotwidth)*1.4 ; + $a = 0; + $p = $this->scale->ticks->ticks_pos; + $start_radius = $p[1]-$x; + while( $a < 360 ) { + if( $a == 90 || $a == 270 ) { + // Make sure there are no rounding problem with + // exactly vertical lines + $this->img->Line($x+$start_radius*cos($a/180*M_PI)+1, + $pos-$start_radius*sin($a/180*M_PI), + $x+$start_radius*cos($a/180*M_PI)+1, + $pos-$d*sin($a/180*M_PI)); + + } + else { + $this->img->Line($x+$start_radius*cos($a/180*M_PI)+1, + $pos-$start_radius*sin($a/180*M_PI), + $x+$d*cos($a/180*M_PI), + $pos-$d*sin($a/180*M_PI)); + } + $a += $this->angle_step; + } + } } function StrokeAngleLabels($pos,$type) { - if( !$this->show_angle_label ) - return; - - $x0 = round($this->img->left_margin+$this->img->plotwidth/2)+1; + if( !$this->show_angle_label ) + return; - $d = max($this->img->plotwidth,$this->img->plotheight)*1.42; - $a = $this->angle_step; - $t = new Text(); - $t->SetColor($this->angle_fontcolor); - $t->SetFont($this->angle_fontfam,$this->angle_fontstyle,$this->angle_fontsize); - $xright = $this->img->width - $this->img->right_margin; - $ytop = $this->img->top_margin; - $xleft = $this->img->left_margin; - $ybottom = $this->img->height - $this->img->bottom_margin; - $ha = 'left'; - $va = 'center'; - $w = $this->img->plotwidth/2; - $h = $this->img->plotheight/2; - $xt = $x0; $yt = $pos; - $margin=5; + $x0 = round($this->img->left_margin+$this->img->plotwidth/2)+1; - $tl = $this->angle_tick_len ; // Outer len - $tl2 = $this->angle_tick_len2 ; // Interior len + $d = max($this->img->plotwidth,$this->img->plotheight)*1.42; + $a = $this->angle_step; + $t = new Text(); + $t->SetColor($this->angle_fontcolor); + $t->SetFont($this->angle_fontfam,$this->angle_fontstyle,$this->angle_fontsize); + $xright = $this->img->width - $this->img->right_margin; + $ytop = $this->img->top_margin; + $xleft = $this->img->left_margin; + $ybottom = $this->img->height - $this->img->bottom_margin; + $ha = 'left'; + $va = 'center'; + $w = $this->img->plotwidth/2; + $h = $this->img->plotheight/2; + $xt = $x0; $yt = $pos; + $margin=5; - $this->img->SetColor($this->angle_tick_color); - $rot90 = $this->img->a == 90 ; + $tl = $this->angle_tick_len ; // Outer len + $tl2 = $this->angle_tick_len2 ; // Interior len - if( $type == POLAR_360 ) { - $ca1 = atan($h/$w)/M_PI*180; - $ca2 = 180-$ca1; - $ca3 = $ca1+180; - $ca4 = 360-$ca1; - $end = 360; - while( $a < $end ) { - $ca = cos($a/180*M_PI); - $sa = sin($a/180*M_PI); - $x = $d*$ca; - $y = $d*$sa; - $xt=1000;$yt=1000; - if( $a <= $ca1 || $a >= $ca4 ) { - $yt = $pos - $w * $y/$x; - $xt = $xright + $margin; - if( $rot90 ) { - $ha = 'center'; - $va = 'top'; - } - else { - $ha = 'left'; - $va = 'center'; - } - $x1=$xright-$tl2; $x2=$xright+$tl; - $y1=$y2=$yt; - } - elseif( $a > $ca1 && $a < $ca2 ) { - $xt = $x0 + $h * $x/$y; - $yt = $ytop - $margin; - if( $rot90 ) { - $ha = 'left'; - $va = 'center'; - } - else { - $ha = 'center'; - $va = 'bottom'; - } - $y1=$ytop+$tl2;$y2=$ytop-$tl; - $x1=$x2=$xt; - } - elseif( $a >= $ca2 && $a <= $ca3 ) { - $yt = $pos + $w * $y/$x; - $xt = $xleft - $margin; - if( $rot90 ) { - $ha = 'center'; - $va = 'bottom'; - } - else { - $ha = 'right'; - $va = 'center'; - } - $x1=$xleft+$tl2;$x2=$xleft-$tl; - $y1=$y2=$yt; - } - else { - $xt = $x0 - $h * $x/$y; - $yt = $ybottom + $margin; - if( $rot90 ) { - $ha = 'right'; - $va = 'center'; - } - else { - $ha = 'center'; - $va = 'top'; - } - $y1=$ybottom-$tl2;$y2=$ybottom+$tl; - $x1=$x2=$xt; - } - if( $a != 0 && $a != 180 ) { - $t->Align($ha,$va); - if( $this->show_angle_mark ) - $a .= '°'; - $t->Set($a); - $t->Stroke($this->img,$xt,$yt); - if( $this->show_angle_tick ) - $this->img->Line($x1,$y1,$x2,$y2); - } - $a += $this->angle_step; - } - } - else { - // POLAR_HALF - $ca1 = atan($h/$w*2)/M_PI*180; - $ca2 = 180-$ca1; - $end = 180; - while( $a < $end ) { - $ca = cos($a/180*M_PI); - $sa = sin($a/180*M_PI); - $x = $d*$ca; - $y = $d*$sa; - if( $a <= $ca1 ) { - $yt = $pos - $w * $y/$x; - $xt = $xright + $margin; - if( $rot90 ) { - $ha = 'center'; - $va = 'top'; - } - else { - $ha = 'left'; - $va = 'center'; - } - $x1=$xright-$tl2; $x2=$xright+$tl; - $y1=$y2=$yt; - } - elseif( $a > $ca1 && $a < $ca2 ) { - $xt = $x0 + 2*$h * $x/$y; - $yt = $ytop - $margin; - if( $rot90 ) { - $ha = 'left'; - $va = 'center'; - } - else { - $ha = 'center'; - $va = 'bottom'; - } - $y1=$ytop+$tl2;$y2=$ytop-$tl; - $x1=$x2=$xt; - } - elseif( $a >= $ca2 ) { - $yt = $pos + $w * $y/$x; - $xt = $xleft - $margin; - if( $rot90 ) { - $ha = 'center'; - $va = 'bottom'; - } - else { - $ha = 'right'; - $va = 'center'; - } - $x1=$xleft+$tl2;$x2=$xleft-$tl; - $y1=$y2=$yt; - } - $t->Align($ha,$va); - if( $this->show_angle_mark ) - $a .= '°'; - $t->Set($a); - $t->Stroke($this->img,$xt,$yt); - if( $this->show_angle_tick ) - $this->img->Line($x1,$y1,$x2,$y2); - $a += $this->angle_step; - } - } + $this->img->SetColor($this->angle_tick_color); + $rot90 = $this->img->a == 90 ; + + if( $type == POLAR_360 ) { + + // Corner angles of the four corners + $ca1 = atan($h/$w)/M_PI*180; + $ca2 = 180-$ca1; + $ca3 = $ca1+180; + $ca4 = 360-$ca1; + $end = 360; + + while( $a < $end ) { + $ca = cos($a/180*M_PI); + $sa = sin($a/180*M_PI); + $x = $d*$ca; + $y = $d*$sa; + $xt=1000;$yt=1000; + if( $a <= $ca1 || $a >= $ca4 ) { + $yt = $pos - $w * $y/$x; + $xt = $xright + $margin; + if( $rot90 ) { + $ha = 'center'; + $va = 'top'; + } + else { + $ha = 'left'; + $va = 'center'; + } + $x1=$xright-$tl2; $x2=$xright+$tl; + $y1=$y2=$yt; + } + elseif( $a > $ca1 && $a < $ca2 ) { + $xt = $x0 + $h * $x/$y; + $yt = $ytop - $margin; + if( $rot90 ) { + $ha = 'left'; + $va = 'center'; + } + else { + $ha = 'center'; + $va = 'bottom'; + } + $y1=$ytop+$tl2;$y2=$ytop-$tl; + $x1=$x2=$xt; + } + elseif( $a >= $ca2 && $a <= $ca3 ) { + $yt = $pos + $w * $y/$x; + $xt = $xleft - $margin; + if( $rot90 ) { + $ha = 'center'; + $va = 'bottom'; + } + else { + $ha = 'right'; + $va = 'center'; + } + $x1=$xleft+$tl2;$x2=$xleft-$tl; + $y1=$y2=$yt; + } + else { + $xt = $x0 - $h * $x/$y; + $yt = $ybottom + $margin; + if( $rot90 ) { + $ha = 'right'; + $va = 'center'; + } + else { + $ha = 'center'; + $va = 'top'; + } + $y1=$ybottom-$tl2;$y2=$ybottom+$tl; + $x1=$x2=$xt; + } + if( $a != 0 && $a != 180 ) { + $t->Align($ha,$va); + if( $this->scale->clockwise ) { + $t->Set(360-$a); + } + else { + $t->Set($a); + } + if( $this->show_angle_mark && $t->font_family > 4 ) { + $a .= SymChar::Get('degree'); + } + $t->Stroke($this->img,$xt,$yt); + if( $this->show_angle_tick ) { + $this->img->Line($x1,$y1,$x2,$y2); + } + } + $a += $this->angle_step; + } + } + else { + // POLAR_HALF + $ca1 = atan($h/$w*2)/M_PI*180; + $ca2 = 180-$ca1; + $end = 180; + while( $a < $end ) { + $ca = cos($a/180*M_PI); + $sa = sin($a/180*M_PI); + $x = $d*$ca; + $y = $d*$sa; + if( $a <= $ca1 ) { + $yt = $pos - $w * $y/$x; + $xt = $xright + $margin; + if( $rot90 ) { + $ha = 'center'; + $va = 'top'; + } + else { + $ha = 'left'; + $va = 'center'; + } + $x1=$xright-$tl2; $x2=$xright+$tl; + $y1=$y2=$yt; + } + elseif( $a > $ca1 && $a < $ca2 ) { + $xt = $x0 + 2*$h * $x/$y; + $yt = $ytop - $margin; + if( $rot90 ) { + $ha = 'left'; + $va = 'center'; + } + else { + $ha = 'center'; + $va = 'bottom'; + } + $y1=$ytop+$tl2;$y2=$ytop-$tl; + $x1=$x2=$xt; + } + elseif( $a >= $ca2 ) { + $yt = $pos + $w * $y/$x; + $xt = $xleft - $margin; + if( $rot90 ) { + $ha = 'center'; + $va = 'bottom'; + } + else { + $ha = 'right'; + $va = 'center'; + } + $x1=$xleft+$tl2;$x2=$xleft-$tl; + $y1=$y2=$yt; + } + $t->Align($ha,$va); + if( $this->show_angle_mark && $t->font_family > 4 ) { + $a .= SymChar::Get('degree'); + } + $t->Set($a); + $t->Stroke($this->img,$xt,$yt); + if( $this->show_angle_tick ) { + $this->img->Line($x1,$y1,$x2,$y2); + } + $a += $this->angle_step; + } + } } function Stroke($pos,$dummy=true) { - $this->img->SetLineWeight($this->weight); - $this->img->SetColor($this->color); - $this->img->SetFont($this->font_family,$this->font_style,$this->font_size); - if( !$this->hide_line ) - $this->img->FilledRectangle($this->img->left_margin,$pos, - $this->img->width-$this->img->right_margin,$pos+$this->weight-1); - $y=$pos+$this->img->GetFontHeight()+$this->title_margin+$this->title->margin; - if( $this->title_adjust=="high" ) - $this->title->SetPos($this->img->width-$this->img->right_margin,$y,"right","top"); - elseif( $this->title_adjust=="middle" || $this->title_adjust=="center" ) - $this->title->SetPos(($this->img->width-$this->img->left_margin- - $this->img->right_margin)/2+$this->img->left_margin, - $y,"center","top"); - elseif($this->title_adjust=="low") - $this->title->SetPos($this->img->left_margin,$y,"left","top"); - else { - JpGraphError::RaiseL(17002,$this->title_adjust); -//('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')'); - } + $this->img->SetLineWeight($this->weight); + $this->img->SetColor($this->color); + $this->img->SetFont($this->font_family,$this->font_style,$this->font_size); + if( !$this->hide_line ) { + $this->img->FilledRectangle($this->img->left_margin,$pos, + $this->img->width-$this->img->right_margin, + $pos+$this->weight-1); + } + $y=$pos+$this->img->GetFontHeight()+$this->title_margin+$this->title->margin; + if( $this->title_adjust=="high" ) { + $this->title->SetPos($this->img->width-$this->img->right_margin,$y,"right","top"); + } + elseif( $this->title_adjust=="middle" || $this->title_adjust=="center" ) { + $this->title->SetPos(($this->img->width-$this->img->left_margin-$this->img->right_margin)/2+$this->img->left_margin, + $y,"center","top"); + } + elseif($this->title_adjust=="low") { + $this->title->SetPos($this->img->left_margin,$y,"left","top"); + } + else { + JpGraphError::RaiseL(17002,$this->title_adjust); + //('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')'); + } - - if (!$this->hide_labels) { - $this->StrokeLabels($pos,false); - } - $this->img->SetColor($this->radius_tick_color); - $this->scale->ticks->Stroke($this->img,$this->scale,$pos); - // - // Mirror the positions for the left side of the scale + if (!$this->hide_labels) { + $this->StrokeLabels($pos,false); + } + $this->img->SetColor($this->radius_tick_color); + $this->scale->ticks->Stroke($this->img,$this->scale,$pos); + // - $mid = 2*($this->img->left_margin+$this->img->plotwidth/2); - $n = count($this->scale->ticks->ticks_pos); - $i=0; - while( $i < $n ) { - $this->scale->ticks->ticks_pos[$i] = - $mid-$this->scale->ticks->ticks_pos[$i] ; - ++$i; - } + // Mirror the positions for the left side of the scale + // + $mid = 2*($this->img->left_margin+$this->img->plotwidth/2); + $n = count($this->scale->ticks->ticks_pos); + $i=0; + while( $i < $n ) { + $this->scale->ticks->ticks_pos[$i] = + $mid-$this->scale->ticks->ticks_pos[$i] ; + ++$i; + } - $n = count($this->scale->ticks->maj_ticks_pos); - $i=0; - while( $i < $n ) { - $this->scale->ticks->maj_ticks_pos[$i] = - $mid-$this->scale->ticks->maj_ticks_pos[$i] ; - ++$i; - } - - $n = count($this->scale->ticks->maj_ticklabels_pos); - $i=1; - while( $i < $n ) { - $this->scale->ticks->maj_ticklabels_pos[$i] = - $mid-$this->scale->ticks->maj_ticklabels_pos[$i] ; - ++$i; - } + $n = count($this->scale->ticks->maj_ticks_pos); + $i=0; + while( $i < $n ) { + $this->scale->ticks->maj_ticks_pos[$i] = + $mid-$this->scale->ticks->maj_ticks_pos[$i] ; + ++$i; + } - // Draw the left side of the scale - $n = count($this->scale->ticks->ticks_pos); - $yu = $pos - $this->scale->ticks->direction*$this->scale->ticks->GetMinTickAbsSize(); + $n = count($this->scale->ticks->maj_ticklabels_pos); + $i=1; + while( $i < $n ) { + $this->scale->ticks->maj_ticklabels_pos[$i] = + $mid-$this->scale->ticks->maj_ticklabels_pos[$i] ; + ++$i; + } + + // Draw the left side of the scale + $n = count($this->scale->ticks->ticks_pos); + $yu = $pos - $this->scale->ticks->direction*$this->scale->ticks->GetMinTickAbsSize(); - // Minor ticks - if( ! $this->scale->ticks->supress_minor_tickmarks ) { - $i=1; - while( $i < $n/2 ) { - $x = round($this->scale->ticks->ticks_pos[$i]) ; - $this->img->Line($x,$pos,$x,$yu); - ++$i; - } - } + // Minor ticks + if( ! $this->scale->ticks->supress_minor_tickmarks ) { + $i=1; + while( $i < $n/2 ) { + $x = round($this->scale->ticks->ticks_pos[$i]) ; + $this->img->Line($x,$pos,$x,$yu); + ++$i; + } + } - $n = count($this->scale->ticks->maj_ticks_pos); - $yu = $pos - $this->scale->ticks->direction*$this->scale->ticks->GetMajTickAbsSize(); + $n = count($this->scale->ticks->maj_ticks_pos); + $yu = $pos - $this->scale->ticks->direction*$this->scale->ticks->GetMajTickAbsSize(); - // Major ticks - if( ! $this->scale->ticks->supress_tickmarks ) { - $i=1; - while( $i < $n/2 ) { - $x = round($this->scale->ticks->maj_ticks_pos[$i]) ; - $this->img->Line($x,$pos,$x,$yu); - ++$i; - } - } - if (!$this->hide_labels) { - $this->StrokeLabels($pos,false); - } - $this->title->Stroke($this->img); + // Major ticks + if( ! $this->scale->ticks->supress_tickmarks ) { + $i=1; + while( $i < $n/2 ) { + $x = round($this->scale->ticks->maj_ticks_pos[$i]) ; + $this->img->Line($x,$pos,$x,$yu); + ++$i; + } + } + if (!$this->hide_labels) { + $this->StrokeLabels($pos,false); + } + $this->title->Stroke($this->img); } } class PolarScale extends LinearScale { private $graph; + public $clockwise=false; - function PolarScale($aMax=0,$graph) { - parent::LinearScale(0,$aMax,'x'); - $this->graph = $graph; + function __construct($aMax,$graph,$aClockwise) { + parent::__construct(0,$aMax,'x'); + $this->graph = $graph; + $this->clockwise = $aClockwise; + } + + function SetClockwise($aFlg) { + $this->clockwise = $aFlg; } function _Translate($v) { - return parent::Translate($v); + return parent::Translate($v); } function PTranslate($aAngle,$aRad) { - - $m = $this->scale[1]; - $w = $this->graph->img->plotwidth/2; - $aRad = $aRad/$m*$w; - $x = cos( $aAngle/180 * M_PI ) * $aRad; - $y = sin( $aAngle/180 * M_PI ) * $aRad; + $m = $this->scale[1]; + $w = $this->graph->img->plotwidth/2; + $aRad = $aRad/$m*$w; - $x += $this->_Translate(0); + $a = $aAngle/180 * M_PI; + if( $this->clockwise ) { + $a = 2*M_PI-$a; + } - if( $this->graph->iType == POLAR_360 ) { - $y = ($this->graph->img->top_margin + $this->graph->img->plotheight/2) - $y; - } - else { - $y = ($this->graph->img->top_margin + $this->graph->img->plotheight) - $y; - } - return array($x,$y); + $x = cos($a) * $aRad; + $y = sin($a) * $aRad; + + $x += $this->_Translate(0); + + if( $this->graph->iType == POLAR_360 ) { + $y = ($this->graph->img->top_margin + $this->graph->img->plotheight/2) - $y; + } + else { + $y = ($this->graph->img->top_margin + $this->graph->img->plotheight) - $y; + } + return array($x,$y); } } class PolarLogScale extends LogScale { private $graph; - function PolarLogScale($aMax=1,$graph) { - parent::LogScale(0,$aMax,'x'); - $this->graph = $graph; - $this->ticks->SetLabelLogType(LOGLABELS_MAGNITUDE); + public $clockwise=false; + function __construct($aMax,$graph,$aClockwise=false) { + parent::__construct(0,$aMax,'x'); + $this->graph = $graph; + $this->ticks->SetLabelLogType(LOGLABELS_MAGNITUDE); + $this->clockwise = $aClockwise; + + } + + function SetClockwise($aFlg) { + $this->clockwise = $aFlg; } function PTranslate($aAngle,$aRad) { - if( $aRad == 0 ) - $aRad = 1; - $aRad = log10($aRad); - $m = $this->scale[1]; - $w = $this->graph->img->plotwidth/2; - $aRad = $aRad/$m*$w; + if( $aRad == 0 ) + $aRad = 1; + $aRad = log10($aRad); + $m = $this->scale[1]; + $w = $this->graph->img->plotwidth/2; + $aRad = $aRad/$m*$w; - $x = cos( $aAngle/180 * M_PI ) * $aRad; - $y = sin( $aAngle/180 * M_PI ) * $aRad; + $a = $aAngle/180 * M_PI; + if( $this->clockwise ) { + $a = 2*M_PI-$a; + } - $x += $w+$this->graph->img->left_margin;//$this->_Translate(0); - if( $this->graph->iType == POLAR_360 ) { - $y = ($this->graph->img->top_margin + $this->graph->img->plotheight/2) - $y; - } - else { - $y = ($this->graph->img->top_margin + $this->graph->img->plotheight) - $y; - } - return array($x,$y); + $x = cos( $a ) * $aRad; + $y = sin( $a ) * $aRad; + + $x += $w+$this->graph->img->left_margin;//$this->_Translate(0); + if( $this->graph->iType == POLAR_360 ) { + $y = ($this->graph->img->top_margin + $this->graph->img->plotheight/2) - $y; + } + else { + $y = ($this->graph->img->top_margin + $this->graph->img->plotheight) - $y; + } + return array($x,$y); } } @@ -640,199 +680,215 @@ class PolarGraph extends Graph { public $scale; public $axis; public $iType=POLAR_360; - - function PolarGraph($aWidth=300,$aHeight=200,$aCachedName="",$aTimeOut=0,$aInline=true) { - parent::Graph($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline) ; - $this->SetDensity(TICKD_DENSE); - $this->SetBox(); - $this->SetMarginColor('white'); + private $iClockwise=false; + + function __construct($aWidth=300,$aHeight=200,$aCachedName="",$aTimeOut=0,$aInline=true) { + parent::__construct($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline) ; + $this->SetDensity(TICKD_DENSE); + $this->SetBox(); + $this->SetMarginColor('white'); } function SetDensity($aDense) { - $this->SetTickDensity(TICKD_NORMAL,$aDense); + $this->SetTickDensity(TICKD_NORMAL,$aDense); + } + + function SetClockwise($aFlg) { + $this->scale->SetClockwise($aFlg); } function Set90AndMargin($lm=0,$rm=0,$tm=0,$bm=0) { - $adj = ($this->img->height - $this->img->width)/2; - $this->SetAngle(90); - $this->img->SetMargin($lm-$adj,$rm-$adj,$tm+$adj,$bm+$adj); - $this->img->SetCenter(floor($this->img->width/2),floor($this->img->height/2)); - $this->axis->SetLabelAlign('right','center'); - //JpGraphError::Raise('Set90AndMargin() is not supported for polar graphs.'); + $adj = ($this->img->height - $this->img->width)/2; + $this->SetAngle(90); + $lm2 = -$adj + ($lm-$rm+$tm+$bm)/2; + $rm2 = -$adj + (-$lm+$rm+$tm+$bm)/2; + $tm2 = $adj + ($tm-$bm+$lm+$rm)/2; + $bm2 = $adj + (-$tm+$bm+$lm+$rm)/2; + $this->SetMargin($lm2, $rm2, $tm2, $bm2); + $this->axis->SetLabelAlign('right','center'); } function SetScale($aScale,$rmax=0,$dummy1=1,$dummy2=1,$dummy3=1) { - if( $aScale == 'lin' ) - $this->scale = new PolarScale($rmax,$this); - elseif( $aScale == 'log' ) { - $this->scale = new PolarLogScale($rmax,$this); - } - else { - JpGraphError::RaiseL(17004);//('Unknown scale type for polar graph. Must be "lin" or "log"'); - } + if( $aScale == 'lin' ) { + $this->scale = new PolarScale($rmax,$this,$this->iClockwise); + } + elseif( $aScale == 'log' ) { + $this->scale = new PolarLogScale($rmax,$this,$this->iClockwise); + } + else { + JpGraphError::RaiseL(17004);//('Unknown scale type for polar graph. Must be "lin" or "log"'); + } - $this->axis = new PolarAxis($this->img,$this->scale); - $this->SetMargin(40,40,50,40); + $this->axis = new PolarAxis($this->img,$this->scale); + $this->SetMargin(40,40,50,40); } function SetType($aType) { - $this->iType = $aType; + $this->iType = $aType; } function SetPlotSize($w,$h) { - $this->SetMargin(($this->img->width-$w)/2,($this->img->width-$w)/2, - ($this->img->height-$h)/2,($this->img->height-$h)/2); + $this->SetMargin(($this->img->width-$w)/2,($this->img->width-$w)/2, + ($this->img->height-$h)/2,($this->img->height-$h)/2); } // Private methods function GetPlotsMax() { - $n = count($this->plots); - $m = $this->plots[0]->Max(); - $i=1; - while($i < $n) { - $m = max($this->plots[$i]->Max(),$m); - ++$i; - } - return $m; + $n = count($this->plots); + $m = $this->plots[0]->Max(); + $i=1; + while($i < $n) { + $m = max($this->plots[$i]->Max(),$m); + ++$i; + } + return $m; } function Stroke($aStrokeFileName="") { - // Start by adjusting the margin so that potential titles will fit. - $this->AdjustMarginsForTitles(); - - // If the filename is the predefined value = '_csim_special_' - // we assume that the call to stroke only needs to do enough - // to correctly generate the CSIM maps. - // We use this variable to skip things we don't strictly need - // to do to generate the image map to improve performance - // a best we can. Therefor you will see a lot of tests !$_csim in the - // code below. - $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); + // Start by adjusting the margin so that potential titles will fit. + $this->AdjustMarginsForTitles(); - // We need to know if we have stroked the plot in the - // GetCSIMareas. Otherwise the CSIM hasn't been generated - // and in the case of GetCSIM called before stroke to generate - // CSIM without storing an image to disk GetCSIM must call Stroke. - $this->iHasStroked = true; + // If the filename is the predefined value = '_csim_special_' + // we assume that the call to stroke only needs to do enough + // to correctly generate the CSIM maps. + // We use this variable to skip things we don't strictly need + // to do to generate the image map to improve performance + // a best we can. Therefor you will see a lot of tests !$_csim in the + // code below. + $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); - //Check if we should autoscale axis - if( !$this->scale->IsSpecified() && count($this->plots)>0 ) { - $max = $this->GetPlotsMax(); - $t1 = $this->img->plotwidth; - $this->img->plotwidth /= 2; - $t2 = $this->img->left_margin; - $this->img->left_margin += $this->img->plotwidth+1; - $this->scale->AutoScale($this->img,0,$max, - $this->img->plotwidth/$this->xtick_factor/2); - $this->img->plotwidth = $t1; - $this->img->left_margin = $t2; - } - else { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - //$min = 0; - $max = $this->scale->scale[1]; - $t1 = $this->img->plotwidth; - $this->img->plotwidth /= 2; - $t2 = $this->img->left_margin; - $this->img->left_margin += $this->img->plotwidth+1; - $this->scale->AutoScale($this->img,0,$max, - $this->img->plotwidth/$this->xtick_factor/2); - $this->img->plotwidth = $t1; - $this->img->left_margin = $t2; - } + // We need to know if we have stroked the plot in the + // GetCSIMareas. Otherwise the CSIM hasn't been generated + // and in the case of GetCSIM called before stroke to generate + // CSIM without storing an image to disk GetCSIM must call Stroke. + $this->iHasStroked = true; - if( $this->iType == POLAR_180 ) - $pos = $this->img->height - $this->img->bottom_margin; - else - $pos = $this->img->plotheight/2 + $this->img->top_margin; + //Check if we should autoscale axis + if( !$this->scale->IsSpecified() && count($this->plots)>0 ) { + $max = $this->GetPlotsMax(); + $t1 = $this->img->plotwidth; + $this->img->plotwidth /= 2; + $t2 = $this->img->left_margin; + $this->img->left_margin += $this->img->plotwidth+1; + $this->scale->AutoScale($this->img,0,$max, + $this->img->plotwidth/$this->xtick_factor/2); + $this->img->plotwidth = $t1; + $this->img->left_margin = $t2; + } + else { + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + //$min = 0; + $max = $this->scale->scale[1]; + $t1 = $this->img->plotwidth; + $this->img->plotwidth /= 2; + $t2 = $this->img->left_margin; + $this->img->left_margin += $this->img->plotwidth+1; + $this->scale->AutoScale($this->img,0,$max, + $this->img->plotwidth/$this->xtick_factor/2); + $this->img->plotwidth = $t1; + $this->img->left_margin = $t2; + } + + if( $this->iType == POLAR_180 ) { + $pos = $this->img->height - $this->img->bottom_margin; + } + else { + $pos = $this->img->plotheight/2 + $this->img->top_margin; + } + + if( !$_csim ) { + $this->StrokePlotArea(); + } + + $this->iDoClipping = true; + + if( $this->iDoClipping ) { + $oldimage = $this->img->CloneCanvasH(); + } + + if( !$_csim ) { + $this->axis->StrokeGrid($pos); + } + + // Stroke all plots for Y1 axis + for($i=0; $i < count($this->plots); ++$i) { + $this->plots[$i]->Stroke($this->img,$this->scale); + } - if( !$_csim ) { - $this->StrokePlotArea(); - } + if( $this->iDoClipping ) { + // Clipping only supports graphs at 0 and 90 degrees + if( $this->img->a == 0 ) { + $this->img->CopyCanvasH($oldimage,$this->img->img, + $this->img->left_margin,$this->img->top_margin, + $this->img->left_margin,$this->img->top_margin, + $this->img->plotwidth+1,$this->img->plotheight+1); + } + elseif( $this->img->a == 90 ) { + $adj1 = round(($this->img->height - $this->img->width)/2); + $adj2 = round(($this->img->width - $this->img->height)/2); + $lm = $this->img->left_margin; + $rm = $this->img->right_margin; + $tm = $this->img->top_margin; + $bm = $this->img->bottom_margin; + $this->img->CopyCanvasH($oldimage,$this->img->img, + $adj2 + round(($lm-$rm+$tm+$bm)/2), + $adj1 + round(($tm-$bm+$lm+$rm)/2), + $adj2 + round(($lm-$rm+$tm+$bm)/2), + $adj1 + round(($tm-$bm+$lm+$rm)/2), + $this->img->plotheight+1, + $this->img->plotwidth+1); + } + $this->img->Destroy(); + $this->img->SetCanvasH($oldimage); + } - $this->iDoClipping = true; + if( !$_csim ) { + $this->axis->Stroke($pos); + $this->axis->StrokeAngleLabels($pos,$this->iType); + } - if( $this->iDoClipping ) { - $oldimage = $this->img->CloneCanvasH(); - } + if( !$_csim ) { + $this->StrokePlotBox(); + $this->footer->Stroke($this->img); - if( !$_csim ) { - $this->axis->StrokeGrid($pos); - } + // The titles and legends never gets rotated so make sure + // that the angle is 0 before stroking them + $aa = $this->img->SetAngle(0); + $this->StrokeTitles(); + } - // Stroke all plots for Y1 axis - for($i=0; $i < count($this->plots); ++$i) { - $this->plots[$i]->Stroke($this->img,$this->scale); - } + for($i=0; $i < count($this->plots) ; ++$i ) { + $this->plots[$i]->Legend($this); + } + $this->legend->Stroke($this->img); - if( $this->iDoClipping ) { - // Clipping only supports graphs at 0 and 90 degrees - if( $this->img->a == 0 ) { - $this->img->CopyCanvasH($oldimage,$this->img->img, - $this->img->left_margin,$this->img->top_margin, - $this->img->left_margin,$this->img->top_margin, - $this->img->plotwidth+1,$this->img->plotheight+1); - } - elseif( $this->img->a == 90 ) { - $adj = round(($this->img->height - $this->img->width)/2); - $this->img->CopyCanvasH($oldimage,$this->img->img, - $this->img->bottom_margin-$adj,$this->img->left_margin+$adj, - $this->img->bottom_margin-$adj,$this->img->left_margin+$adj, - $this->img->plotheight,$this->img->plotwidth); - } - $this->img->Destroy(); - $this->img->SetCanvasH($oldimage); - } + if( !$_csim ) { - if( !$_csim ) { - $this->axis->Stroke($pos); - $this->axis->StrokeAngleLabels($pos,$this->iType); - } + $this->StrokeTexts(); + $this->img->SetAngle($aa); - if( !$_csim ) { - $this->StrokePlotBox(); - $this->footer->Stroke($this->img); + // Draw an outline around the image map + if(_JPG_DEBUG) + $this->DisplayClientSideaImageMapAreas(); - // The titles and legends never gets rotated so make sure - // that the angle is 0 before stroking them - $aa = $this->img->SetAngle(0); - $this->StrokeTitles(); - } - - for($i=0; $i < count($this->plots) ; ++$i ) { - $this->plots[$i]->Legend($this); - } - - $this->legend->Stroke($this->img); - - if( !$_csim ) { - - $this->StrokeTexts(); - $this->img->SetAngle($aa); - - // Draw an outline around the image map - if(_JPG_DEBUG) - $this->DisplayClientSideaImageMapAreas(); - - // If the filename is given as the special "__handle" - // then the image handler is returned and the image is NOT - // streamed back - if( $aStrokeFileName == _IMG_HANDLER ) { - return $this->img->img; - } - else { - // Finally stream the generated picture - $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline, - $aStrokeFileName); - } - } + // If the filename is given as the special "__handle" + // then the image handler is returned and the image is NOT + // streamed back + if( $aStrokeFileName == _IMG_HANDLER ) { + return $this->img->img; + } + else { + // Finally stream the generated picture + $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName); + } + } } } diff --git a/libs/jpgraph/jpgraph_radar.php b/libs/jpgraph/jpgraph_radar.php index b03df39..c71ffaf 100644 --- a/libs/jpgraph/jpgraph_radar.php +++ b/libs/jpgraph/jpgraph_radar.php @@ -1,195 +1,216 @@ GetMinVal(); - $limit = $aScale->GetMaxVal(); - $nextMajor = 10*$start; - $step = $nextMajor / 10.0; - $count=1; - - $ticklen_maj=5; - $dx_maj=round(sin($aAxisAngle)*$ticklen_maj); - $dy_maj=round(cos($aAxisAngle)*$ticklen_maj); - $ticklen_min=3; - $dx_min=round(sin($aAxisAngle)*$ticklen_min); - $dy_min=round(cos($aAxisAngle)*$ticklen_min); - - $aMajPos=array(); - $aMajLabel=array(); - - if( $this->supress_first ) - $aMajLabel[]=""; - else - $aMajLabel[]=$start; - $yr=$aScale->RelTranslate($start); - $xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0]; - $yt=$aPos-round($yr*sin($aAxisAngle)); - $aMajPos[]=$xt+2*$dx_maj; - $aMajPos[]=$yt-$aImg->GetFontheight()/2; - $grid[]=$xt; - $grid[]=$yt; + $start = $aScale->GetMinVal(); + $limit = $aScale->GetMaxVal(); + $nextMajor = 10*$start; + $step = $nextMajor / 10.0; + $count=1; - $aImg->SetLineWeight($this->weight); - - for($y=$start; $y<=$limit; $y+=$step,++$count ) { - $yr=$aScale->RelTranslate($y); - $xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0]; - $yt=$aPos-round($yr*sin($aAxisAngle)); - if( $count % 10 == 0 ) { - $grid[]=$xt; - $grid[]=$yt; - $aMajPos[]=$xt+2*$dx_maj; - $aMajPos[]=$yt-$aImg->GetFontheight()/2; - if( !$this->supress_tickmarks ) { - if( $this->majcolor!="" ) $aImg->PushColor($this->majcolor); - $aImg->Line($xt+$dx_maj,$yt+$dy_maj,$xt-$dx_maj,$yt-$dy_maj); - if( $this->majcolor!="" ) $aImg->PopColor(); - } - if( $this->label_formfunc != "" ) { - $f=$this->label_formfunc; - $l = call_user_func($f,$nextMajor); - } - else - $l = $nextMajor; + $ticklen_maj=5; + $dx_maj=round(sin($aAxisAngle)*$ticklen_maj); + $dy_maj=round(cos($aAxisAngle)*$ticklen_maj); + $ticklen_min=3; + $dx_min=round(sin($aAxisAngle)*$ticklen_min); + $dy_min=round(cos($aAxisAngle)*$ticklen_min); - $aMajLabel[]=$l; - $nextMajor *= 10; - $step *= 10; - $count=1; - } - else - if( !$this->supress_minor_tickmarks ) { - if( $this->mincolor!="" ) $aImg->PushColor($this->mincolor); - $aImg->Line($xt+$dx_min,$yt+$dy_min,$xt-$dx_min,$yt-$dy_min); - if( $this->mincolor!="" ) $aImg->PopColor(); - } - } - } + $aMajPos=array(); + $aMajLabel=array(); + + if( $this->supress_first ) { + $aMajLabel[] = ''; + } + else { + $aMajLabel[]=$start; + } + + $yr=$aScale->RelTranslate($start); + $xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0]; + $yt=$aPos-round($yr*sin($aAxisAngle)); + $aMajPos[]=$xt+2*$dx_maj; + $aMajPos[]=$yt-$aImg->GetFontheight()/2; + $grid[]=$xt; + $grid[]=$yt; + + $aImg->SetLineWeight($this->weight); + + for($y=$start; $y<=$limit; $y+=$step,++$count ) { + $yr=$aScale->RelTranslate($y); + $xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0]; + $yt=$aPos-round($yr*sin($aAxisAngle)); + if( $count % 10 == 0 ) { + $grid[]=$xt; + $grid[]=$yt; + $aMajPos[]=$xt+2*$dx_maj; + $aMajPos[]=$yt-$aImg->GetFontheight()/2; + if( !$this->supress_tickmarks ) { + if( $this->majcolor != '' ) { + $aImg->PushColor($this->majcolor); + } + $aImg->Line($xt+$dx_maj,$yt+$dy_maj,$xt-$dx_maj,$yt-$dy_maj); + if( $this->majcolor != '' ) { + $aImg->PopColor(); + } + } + if( $this->label_formfunc != '' ) { + $f=$this->label_formfunc; + $l = call_user_func($f,$nextMajor); + } + else { + $l = $nextMajor; + } + + $aMajLabel[]=$l; + $nextMajor *= 10; + $step *= 10; + $count=1; + } + else { + if( !$this->supress_minor_tickmarks ) { + if( $this->mincolor != '' ) { + $aImg->PushColor($this->mincolor); + } + $aImg->Line($xt+$dx_min,$yt+$dy_min,$xt-$dx_min,$yt-$dy_min); + if( $this->mincolor != '' ) { + $aImg->PopColor(); + } + } + } + } + } } - -class RadarLinearTicks extends Ticks { + +//=================================================== +// CLASS RadarLinear +// Description: Linear ticks +//=================================================== +class RadarLinearTicks extends Ticks { private $minor_step=1, $major_step=2; private $xlabel_offset=0,$xtick_offset=0; -//--------------- -// CONSTRUCTOR - function RadarLinearTicks() { - // Empty + function __construct() { + // Empty } -//--------------- -// PUBLIC METHODS - - // Return major step size in world coordinates function GetMajor() { - return $this->major_step; + return $this->major_step; } - + // Return minor step size in world coordinates function GetMinor() { - return $this->minor_step; + return $this->minor_step; } - + // Set Minor and Major ticks (in world coordinates) function Set($aMajStep,$aMinStep=false) { - if( $aMinStep==false ) - $aMinStep=$aMajStep; - - if( $aMajStep <= 0 || $aMinStep <= 0 ) { - JpGraphError::Raise(" Minor or major step size is 0. Check that you haven't - got an accidental SetTextTicks(0) in your code.

- If this is not the case you might have stumbled upon a bug in JpGraph. - Please report this and if possible include the data that caused the - problem."); - } - - $this->major_step=$aMajStep; - $this->minor_step=$aMinStep; - $this->is_set = true; + if( $aMinStep==false ) { + $aMinStep=$aMajStep; + } + + if( $aMajStep <= 0 || $aMinStep <= 0 ) { + JpGraphError::RaiseL(25064); + //JpGraphError::Raise(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem."); + } + + $this->major_step=$aMajStep; + $this->minor_step=$aMinStep; + $this->is_set = true; } function Stroke($aImg,&$grid,$aPos,$aAxisAngle,$aScale,&$aMajPos,&$aMajLabel) { - // Prepare to draw linear ticks - $maj_step_abs = abs($aScale->scale_factor*$this->major_step); - $min_step_abs = abs($aScale->scale_factor*$this->minor_step); - $nbrmaj = floor(($aScale->world_abs_size)/$maj_step_abs); - $nbrmin = floor(($aScale->world_abs_size)/$min_step_abs); - $skip = round($nbrmin/$nbrmaj); // Don't draw minor ontop of major + // Prepare to draw linear ticks + $maj_step_abs = abs($aScale->scale_factor*$this->major_step); + $min_step_abs = abs($aScale->scale_factor*$this->minor_step); + $nbrmaj = round($aScale->world_abs_size/$maj_step_abs); + $nbrmin = round($aScale->world_abs_size/$min_step_abs); + $skip = round($nbrmin/$nbrmaj); // Don't draw minor on top of major - // Draw major ticks - $ticklen2=$this->major_abs_size; - $dx=round(sin($aAxisAngle)*$ticklen2); - $dy=round(cos($aAxisAngle)*$ticklen2); - $label=$aScale->scale[0]+$this->major_step; - - $aImg->SetLineWeight($this->weight); - // NEW - $aMajPos = array(); - $aMajLabel = array(); - for($i=1; $i<=$nbrmaj; ++$i) { - $xt=round($i*$maj_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0]; - $yt=$aPos-round($i*$maj_step_abs*sin($aAxisAngle)); + // Draw major ticks + $ticklen2=$this->major_abs_size; + $dx=round(sin($aAxisAngle)*$ticklen2); + $dy=round(cos($aAxisAngle)*$ticklen2); + $label=$aScale->scale[0]+$this->major_step; - if( $this->label_formfunc != "" ) { - $f=$this->label_formfunc; - $l = call_user_func($f,$label); - } - else - $l = $label; + $aImg->SetLineWeight($this->weight); - $aMajLabel[]=$l; - $label += $this->major_step; - $grid[]=$xt; - $grid[]=$yt; - $aMajPos[($i-1)*2]=$xt+2*$dx; - $aMajPos[($i-1)*2+1]=$yt-$aImg->GetFontheight()/2; - if( !$this->supress_tickmarks ) { - if( $this->majcolor!="" ) $aImg->PushColor($this->majcolor); - $aImg->Line($xt+$dx,$yt+$dy,$xt-$dx,$yt-$dy); - if( $this->majcolor!="" ) $aImg->PopColor(); - } - } + $aMajPos = array(); + $aMajLabel = array(); - // Draw minor ticks - $ticklen2=$this->minor_abs_size; - $dx=round(sin($aAxisAngle)*$ticklen2); - $dy=round(cos($aAxisAngle)*$ticklen2); - if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) { - if( $this->mincolor!="" ) $aImg->PushColor($this->mincolor); - for($i=1; $i<=$nbrmin; ++$i) { - if( ($i % $skip) == 0 ) continue; - $xt=round($i*$min_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0]; - $yt=$aPos-round($i*$min_step_abs*sin($aAxisAngle)); - $aImg->Line($xt+$dx,$yt+$dy,$xt-$dx,$yt-$dy); - } - if( $this->mincolor!="" ) $aImg->PopColor(); - } + for($i=1; $i<=$nbrmaj; ++$i) { + $xt=round($i*$maj_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0]; + $yt=$aPos-round($i*$maj_step_abs*sin($aAxisAngle)); + + if( $this->label_formfunc != '' ) { + $f=$this->label_formfunc; + $l = call_user_func($f,$label); + } + else { + $l = $label; + } + + $aMajLabel[]=$l; + $label += $this->major_step; + $grid[]=$xt; + $grid[]=$yt; + $aMajPos[($i-1)*2]=$xt+2*$dx; + $aMajPos[($i-1)*2+1]=$yt-$aImg->GetFontheight()/2; + if( !$this->supress_tickmarks ) { + if( $this->majcolor != '' ) { + $aImg->PushColor($this->majcolor); + } + $aImg->Line($xt+$dx,$yt+$dy,$xt-$dx,$yt-$dy); + if( $this->majcolor != '' ) { + $aImg->PopColor(); + } + } + } + + // Draw minor ticks + $ticklen2=$this->minor_abs_size; + $dx=round(sin($aAxisAngle)*$ticklen2); + $dy=round(cos($aAxisAngle)*$ticklen2); + if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) { + if( $this->mincolor != '' ) { + $aImg->PushColor($this->mincolor); + } + for($i=1; $i<=$nbrmin; ++$i) { + if( ($i % $skip) == 0 ) { + continue; + } + $xt=round($i*$min_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0]; + $yt=$aPos-round($i*$min_step_abs*sin($aAxisAngle)); + $aImg->Line($xt+$dx,$yt+$dy,$xt-$dx,$yt-$dy); + } + if( $this->mincolor != '' ) { + $aImg->PopColor(); + } + } } } - //=================================================== // CLASS RadarAxis @@ -197,116 +218,114 @@ class RadarLinearTicks extends Ticks { //=================================================== class RadarAxis extends AxisPrototype { public $title=null; - private $title_color="navy"; + private $title_color='navy'; private $len=0; -//--------------- -// CONSTRUCTOR - function RadarAxis($img,$aScale,$color=array(0,0,0)) { - parent::Axis($img,$aScale,$color); - $this->len=$img->plotheight; - $this->title = new Text(); - $this->title->SetFont(FF_FONT1,FS_BOLD); - $this->color = array(0,0,0); + + function __construct($img,$aScale,$color=array(0,0,0)) { + parent::__construct($img,$aScale,$color); + $this->len = $img->plotheight; + $this->title = new Text(); + $this->title->SetFont(FF_FONT1,FS_BOLD); + $this->color = array(0,0,0); } -//--------------- -// PUBLIC METHODS - function SetTickLabels($aLabelArray,$aLabelColorArray=null) { - $this->ticks_label = $aLabelArray; - $this->ticks_label_colors = $aLabelColorArray; - } - - - // Stroke the axis - // $pos = Vertical position of axis + + // Stroke the axis + // $pos = Vertical position of axis // $aAxisAngle = Axis angle - // $grid = Returns an array with positions used to draw the grid - // $lf = Label flag, TRUE if the axis should have labels + // $grid = Returns an array with positions used to draw the grid + // $lf = Label flag, TRUE if the axis should have labels function Stroke($pos,$aAxisAngle,&$grid,$title,$lf) { - $this->img->SetColor($this->color); - - // Determine end points for the axis - $x=round($this->scale->world_abs_size*cos($aAxisAngle)+$this->scale->scale_abs[0]); - $y=round($pos-$this->scale->world_abs_size*sin($aAxisAngle)); - - // Draw axis - $this->img->SetColor($this->color); - $this->img->SetLineWeight($this->weight); - if( !$this->hide ) - $this->img->Line($this->scale->scale_abs[0],$pos,$x,$y); - - $this->scale->ticks->Stroke($this->img,$grid,$pos,$aAxisAngle,$this->scale,$majpos,$majlabel); - $ncolor=0; - if( isset($this->ticks_label_colors) ) - $ncolor=count($this->ticks_label_colors); - - // Draw labels - if( $lf && !$this->hide ) { - $this->img->SetFont($this->font_family,$this->font_style,$this->font_size); - $this->img->SetTextAlign("left","top"); - $this->img->SetColor($this->label_color); - - // majpos contains (x,y) coordinates for labels - if( ! $this->hide_labels ) { - $n = floor(count($majpos)/2); - for($i=0; $i < $n; ++$i) { - // Set specific label color if specified - if( $ncolor > 0 ) - $this->img->SetColor($this->ticks_label_colors[$i % $ncolor]); - - if( $this->ticks_label != null && isset($this->ticks_label[$i]) ) - $this->img->StrokeText($majpos[$i*2],$majpos[$i*2+1],$this->ticks_label[$i]); - else - $this->img->StrokeText($majpos[$i*2],$majpos[$i*2+1],$majlabel[$i]); - } - } - } - $this->_StrokeAxisTitle($pos,$aAxisAngle,$title); + $this->img->SetColor($this->color); + + // Determine end points for the axis + $x=round($this->scale->world_abs_size*cos($aAxisAngle)+$this->scale->scale_abs[0]); + $y=round($pos-$this->scale->world_abs_size*sin($aAxisAngle)); + + // Draw axis + $this->img->SetColor($this->color); + $this->img->SetLineWeight($this->weight); + if( !$this->hide ) { + $this->img->Line($this->scale->scale_abs[0],$pos,$x,$y); + } + + $this->scale->ticks->Stroke($this->img,$grid,$pos,$aAxisAngle,$this->scale,$majpos,$majlabel); + $ncolor=0; + if( isset($this->ticks_label_colors) ) { + $ncolor=count($this->ticks_label_colors); + } + + // Draw labels + if( $lf && !$this->hide ) { + $this->img->SetFont($this->font_family,$this->font_style,$this->font_size); + $this->img->SetTextAlign('left','top'); + $this->img->SetColor($this->label_color); + + // majpos contains (x,y) coordinates for labels + if( ! $this->hide_labels ) { + $n = floor(count($majpos)/2); + for($i=0; $i < $n; ++$i) { + // Set specific label color if specified + if( $ncolor > 0 ) { + $this->img->SetColor($this->ticks_label_colors[$i % $ncolor]); + } + + if( $this->ticks_label != null && isset($this->ticks_label[$i]) ) { + $this->img->StrokeText($majpos[$i*2],$majpos[$i*2+1],$this->ticks_label[$i]); + } + else { + $this->img->StrokeText($majpos[$i*2],$majpos[$i*2+1],$majlabel[$i]); + } + } + } + } + $this->_StrokeAxisTitle($pos,$aAxisAngle,$title); } -//--------------- -// PRIVATE METHODS - + function _StrokeAxisTitle($pos,$aAxisAngle,$title) { - $this->title->Set($title); - $marg=6+$this->title->margin; - $xt=round(($this->scale->world_abs_size+$marg)*cos($aAxisAngle)+$this->scale->scale_abs[0]); - $yt=round($pos-($this->scale->world_abs_size+$marg)*sin($aAxisAngle)); + $this->title->Set($title); + $marg=6+$this->title->margin; + $xt=round(($this->scale->world_abs_size+$marg)*cos($aAxisAngle)+$this->scale->scale_abs[0]); + $yt=round($pos-($this->scale->world_abs_size+$marg)*sin($aAxisAngle)); - // Position the axis title. - // dx, dy is the offset from the top left corner of the bounding box that sorrounds the text - // that intersects with the extension of the corresponding axis. The code looks a little - // bit messy but this is really the only way of having a reasonable position of the - // axis titles. - if( $this->title->iWordwrap > 0 ) { - $title = wordwrap($title,$this->title->iWordwrap,"\n"); - } + // Position the axis title. + // dx, dy is the offset from the top left corner of the bounding box that sorrounds the text + // that intersects with the extension of the corresponding axis. The code looks a little + // bit messy but this is really the only way of having a reasonable position of the + // axis titles. + if( $this->title->iWordwrap > 0 ) { + $title = wordwrap($title,$this->title->iWordwrap,"\n"); + } - $h=$this->img->GetTextHeight($title)*1.2; - $w=$this->img->GetTextWidth($title)*1.2; + $h=$this->img->GetTextHeight($title)*1.2; + $w=$this->img->GetTextWidth($title)*1.2; - while( $aAxisAngle > 2*M_PI ) $aAxisAngle -= 2*M_PI; - - // Around 3 a'clock - if( $aAxisAngle>=7*M_PI/4 || $aAxisAngle <= M_PI/4 ) $dx=-0.15; // Small trimming to make the dist to the axis more even - // Around 12 a'clock - if( $aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4 ) $dx=($aAxisAngle-M_PI/4)*2/M_PI; - // Around 9 a'clock - if( $aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4 ) $dx=1; - // Around 6 a'clock - if( $aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4 ) $dx=(1-($aAxisAngle-M_PI*5/4)*2/M_PI); - - if( $aAxisAngle>=7*M_PI/4 ) $dy=(($aAxisAngle-M_PI)-3*M_PI/4)*2/M_PI; - if( $aAxisAngle<=M_PI/12 ) $dy=(0.5-$aAxisAngle*2/M_PI); - if( $aAxisAngle<=M_PI/4 && $aAxisAngle > M_PI/12) $dy=(1-$aAxisAngle*2/M_PI); - if( $aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4 ) $dy=1; - if( $aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4 ) $dy=(1-($aAxisAngle-3*M_PI/4)*2/M_PI); - if( $aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4 ) $dy=0; - - if( !$this->hide ) { - $this->title->Stroke($this->img,$xt-$dx*$w,$yt-$dy*$h,$title); - } + while( $aAxisAngle > 2*M_PI ) + $aAxisAngle -= 2*M_PI; + + // Around 3 a'clock + if( $aAxisAngle>=7*M_PI/4 || $aAxisAngle <= M_PI/4 ) $dx=-0.15; // Small trimming to make the dist to the axis more even + + // Around 12 a'clock + if( $aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4 ) $dx=($aAxisAngle-M_PI/4)*2/M_PI; + + // Around 9 a'clock + if( $aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4 ) $dx=1; + + // Around 6 a'clock + if( $aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4 ) $dx=(1-($aAxisAngle-M_PI*5/4)*2/M_PI); + + if( $aAxisAngle>=7*M_PI/4 ) $dy=(($aAxisAngle-M_PI)-3*M_PI/4)*2/M_PI; + if( $aAxisAngle<=M_PI/12 ) $dy=(0.5-$aAxisAngle*2/M_PI); + if( $aAxisAngle<=M_PI/4 && $aAxisAngle > M_PI/12) $dy=(1-$aAxisAngle*2/M_PI); + if( $aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4 ) $dy=1; + if( $aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4 ) $dy=(1-($aAxisAngle-3*M_PI/4)*2/M_PI); + if( $aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4 ) $dy=0; + + if( !$this->hide ) { + $this->title->Stroke($this->img,$xt-$dx*$w,$yt-$dy*$h,$title); + } } - - + } // Class @@ -319,56 +338,56 @@ class RadarGrid { //extends Grid { private $grid_color='#DDDDDD'; private $show=false, $weight=1; -//------------ -// CONSTRUCTOR - function RadarGrid() { + function __construct() { + // Empty } -// PUBLIC METHODS function SetColor($aMajColor) { - $this->grid_color = $aMajColor; + $this->grid_color = $aMajColor; } - + function SetWeight($aWeight) { - $this->weight=$aWeight; + $this->weight=$aWeight; } - + // Specify if grid should be dashed, dotted or solid function SetLineStyle($aType) { - $this->type = $aType; + $this->type = $aType; } - + // Decide if both major and minor grid should be displayed function Show($aShowMajor=true) { - $this->show=$aShowMajor; + $this->show=$aShowMajor; } - -//---------------- -// PRIVATE METHODS + function Stroke($img,$grid) { - if( !$this->show ) return; - $nbrticks = count($grid[0])/2; - $nbrpnts = count($grid); - $img->SetColor($this->grid_color); - $img->SetLineWeight($this->weight); - for($i=0; $i<$nbrticks; ++$i) { - for($j=0; $j<$nbrpnts; ++$j) { - $pnts[$j*2]=$grid[$j][$i*2]; - $pnts[$j*2+1]=$grid[$j][$i*2+1]; - } - for($k=0; $k<$nbrpnts; ++$k ){ - $l=($k+1)%$nbrpnts; - if( $this->type == "solid" ) - $img->Line($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1]); - elseif( $this->type == "dotted" ) - $img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],1,6); - elseif( $this->type == "dashed" ) - $img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],2,4); - elseif( $this->type == "longdashed" ) - $img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],8,6); - } - $pnts=array(); - } + if( !$this->show ) { + return; + } + + $nbrticks = count($grid[0])/2; + $nbrpnts = count($grid); + $img->SetColor($this->grid_color); + $img->SetLineWeight($this->weight); + + for($i=0; $i<$nbrticks; ++$i) { + for($j=0; $j<$nbrpnts; ++$j) { + $pnts[$j*2]=$grid[$j][$i*2]; + $pnts[$j*2+1]=$grid[$j][$i*2+1]; + } + for($k=0; $k<$nbrpnts; ++$k ){ + $l=($k+1)%$nbrpnts; + if( $this->type == 'solid' ) + $img->Line($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1]); + elseif( $this->type == 'dotted' ) + $img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],1,6); + elseif( $this->type == 'dashed' ) + $img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],2,4); + elseif( $this->type == 'longdashed' ) + $img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],8,6); + } + $pnts=array(); + } } } // Class @@ -379,118 +398,153 @@ class RadarGrid { //extends Grid { //=================================================== class RadarPlot { public $mark=null; - public $legend=""; + public $legend=''; + public $legendcsimtarget=''; + public $legendcsimalt=''; + public $csimtargets=array(); // Array of targets for CSIM + public $csimareas=""; // Resultant CSIM area tags + public $csimalts=null; // ALT:s for corresponding target private $data=array(); private $fill=false, $fill_color=array(200,170,180); private $color=array(0,0,0); private $weight=1; private $linestyle='solid'; -//--------------- -// CONSTRUCTOR - function RadarPlot($data) { - $this->data = $data; - $this->mark = new PlotMark(); + + //--------------- + // CONSTRUCTOR + function __construct($data) { + $this->data = $data; + $this->mark = new PlotMark(); } -//--------------- -// PUBLIC METHODS function Min() { - return Min($this->data); + return Min($this->data); } - + function Max() { - return Max($this->data); + return Max($this->data); } - + function SetLegend($legend) { - $this->legend=$legend; + $this->legend=$legend; } function SetLineStyle($aStyle) { - $this->linestyle=$aStyle; + $this->linestyle=$aStyle; } - + function SetLineWeight($w) { - $this->weight=$w; + $this->weight=$w; } - + function SetFillColor($aColor) { - $this->fill_color = $aColor; - $this->fill = true; + $this->fill_color = $aColor; + $this->fill = true; } - + function SetFill($f=true) { - $this->fill = $f; + $this->fill = $f; } - + function SetColor($aColor,$aFillColor=false) { - $this->color = $aColor; - if( $aFillColor ) { - $this->SetFillColor($aFillColor); - $this->fill = true; - } + $this->color = $aColor; + if( $aFillColor ) { + $this->SetFillColor($aFillColor); + $this->fill = true; + } } - + + // Set href targets for CSIM + function SetCSIMTargets($aTargets,$aAlts=null) { + $this->csimtargets=$aTargets; + $this->csimalts=$aAlts; + } + + // Get all created areas function GetCSIMareas() { - JpGraphError::RaiseL(18001); -//("Client side image maps not supported for RadarPlots."); + return $this->csimareas; } - + function Stroke($img, $pos, $scale, $startangle) { - $nbrpnts = count($this->data); - $astep=2*M_PI/$nbrpnts; - $a=$startangle; - - // Rotate each point to the correct axis-angle - // TODO: Update for LogScale - for($i=0; $i<$nbrpnts; ++$i) { - //$c=$this->data[$i]; - $cs=$scale->RelTranslate($this->data[$i]); - $x=round($cs*cos($a)+$scale->scale_abs[0]); - $y=round($pos-$cs*sin($a)); - /* - $c=log10($c); - $x=round(($c-$scale->scale[0])*$scale->scale_factor*cos($a)+$scale->scale_abs[0]); - $y=round($pos-($c-$scale->scale[0])*$scale->scale_factor*sin($a)); - */ - $pnts[$i*2]=$x; - $pnts[$i*2+1]=$y; - $a += $astep; - } - if( $this->fill ) { - $img->SetColor($this->fill_color); - $img->FilledPolygon($pnts); - } - $img->SetLineWeight($this->weight); - $img->SetColor($this->color); - $img->SetLineStyle($this->linestyle); - $pnts[]=$pnts[0]; - $pnts[]=$pnts[1]; - $img->Polygon($pnts); - $img->SetLineStyle('solid'); // Reset line style to default - // Add plotmarks on top - if( $this->mark->show ) { - for($i=0; $i < $nbrpnts; ++$i) { - $this->mark->Stroke($img,$pnts[$i*2],$pnts[$i*2+1]); - } - } + $nbrpnts = count($this->data); + $astep=2*M_PI/$nbrpnts; + $a=$startangle; + + for($i=0; $i<$nbrpnts; ++$i) { + + // Rotate each non null point to the correct axis-angle + $cs=$scale->RelTranslate($this->data[$i]); + $x=round($cs*cos($a)+$scale->scale_abs[0]); + $y=round($pos-$cs*sin($a)); + + $pnts[$i*2]=$x; + $pnts[$i*2+1]=$y; + + // If the next point is null then we draw this polygon segment + // to the center, skip the next and draw the next segment from + // the center up to the point on the axis with the first non-null + // value and continues from that point. Some additoinal logic is necessary + // to handle the boundary conditions + if( $i < $nbrpnts-1 ) { + if( is_null($this->data[$i+1]) ) { + $cs = 0; + $x=round($cs*cos($a)+$scale->scale_abs[0]); + $y=round($pos-$cs*sin($a)); + $pnts[$i*2]=$x; + $pnts[$i*2+1]=$y; + $a += $astep; + } + } + + $a += $astep; + } + + if( $this->fill ) { + $img->SetColor($this->fill_color); + $img->FilledPolygon($pnts); + } + + $img->SetLineWeight($this->weight); + $img->SetColor($this->color); + $img->SetLineStyle($this->linestyle); + $pnts[] = $pnts[0]; + $pnts[] = $pnts[1]; + $img->Polygon($pnts); + $img->SetLineStyle('solid'); // Reset line style to default + + // Add plotmarks on top + if( $this->mark->show ) { + for($i=0; $i < $nbrpnts; ++$i) { + if( isset($this->csimtargets[$i]) ) { + $this->mark->SetCSIMTarget($this->csimtargets[$i]); + $this->mark->SetCSIMAlt($this->csimalts[$i]); + $this->mark->SetCSIMAltVal($pnts[$i*2], $pnts[$i*2+1]); + $this->mark->Stroke($img, $pnts[$i*2], $pnts[$i*2+1]); + $this->csimareas .= $this->mark->GetCSIMAreas(); + } + else { + $this->mark->Stroke($img,$pnts[$i*2],$pnts[$i*2+1]); + } + } + } } - -//--------------- -// PRIVATE METHODS + function GetCount() { - return count($this->data); + return count($this->data); } - + function Legend($graph) { - if( $this->legend=="" ) return; - if( $this->fill ) - $graph->legend->Add($this->legend,$this->fill_color,$this->mark); - else - $graph->legend->Add($this->legend,$this->color,$this->mark); + if( $this->legend == '' ) { + return; + } + if( $this->fill ) { + $graph->legend->Add($this->legend,$this->fill_color,$this->mark); + } else { + $graph->legend->Add($this->legend,$this->color,$this->mark); + } } - + } // Class //=================================================== @@ -500,231 +554,306 @@ class RadarPlot { class RadarGraph extends Graph { public $grid,$axis=null; private $posx,$posy; - private $len; + private $len; private $axis_title=null; -//--------------- -// CONSTRUCTOR - function RadarGraph($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) { - $this->Graph($width,$height,$cachedName,$timeout,$inline); - $this->posx=$width/2; - $this->posy=$height/2; - $this->len=min($width,$height)*0.35; - $this->SetColor(array(255,255,255)); - $this->SetTickDensity(TICKD_NORMAL); - $this->SetScale("lin"); - $this->SetGridDepth(DEPTH_FRONT); - } - -//--------------- -// PUBLIC METHODS - function SupressTickMarks($f=true) { - if( ERR_DEPRECATED ) - JpGraphError::RaiseL(18002); -//('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.'); - $this->axis->scale->ticks->SupressTickMarks($f); + function __construct($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) { + parent::__construct($width,$height,$cachedName,$timeout,$inline); + $this->posx = $width/2; + $this->posy = $height/2; + $this->len = min($width,$height)*0.35; + $this->SetColor(array(255,255,255)); + $this->SetTickDensity(TICKD_NORMAL); + $this->SetScale('lin'); + $this->SetGridDepth(DEPTH_FRONT); } function HideTickMarks($aFlag=true) { - $this->axis->scale->ticks->SupressTickMarks($aFlag); + $this->axis->scale->ticks->SupressTickMarks($aFlag); } - + function ShowMinorTickmarks($aFlag=true) { - $this->yscale->ticks->SupressMinorTickMarks(!$aFlag); + $this->yscale->ticks->SupressMinorTickMarks(!$aFlag); } - + function SetScale($axtype,$ymin=1,$ymax=1,$dummy1=null,$dumy2=null) { - if( $axtype != "lin" && $axtype != "log" ) { - JpGraphError::RaiseL(18003,$axtype); -//("Illegal scale for radarplot ($axtype). Must be \"lin\" or \"log\""); - } - if( $axtype=="lin" ) { - $this->yscale = new LinearScale($ymin,$ymax); - $this->yscale->ticks = new RadarLinearTicks(); - $this->yscale->ticks->SupressMinorTickMarks(); - } - elseif( $axtype=="log" ) { - $this->yscale = new LogScale($ymin,$ymax); - $this->yscale->ticks = new RadarLogTicks(); - } - - $this->axis = new RadarAxis($this->img,$this->yscale); - $this->grid = new RadarGrid(); + if( $axtype != 'lin' && $axtype != 'log' ) { + JpGraphError::RaiseL(18003,$axtype); + //("Illegal scale for radarplot ($axtype). Must be \"lin\" or \"log\""); + } + if( $axtype == 'lin' ) { + $this->yscale = new LinearScale($ymin,$ymax); + $this->yscale->ticks = new RadarLinearTicks(); + $this->yscale->ticks->SupressMinorTickMarks(); + } + elseif( $axtype == 'log' ) { + $this->yscale = new LogScale($ymin,$ymax); + $this->yscale->ticks = new RadarLogTicks(); + } + + $this->axis = new RadarAxis($this->img,$this->yscale); + $this->grid = new RadarGrid(); } function SetSize($aSize) { - if( $aSize < 0.1 || $aSize>1 ) - JpGraphError::RaiseL(18004,$aSize); -//("Radar Plot size must be between 0.1 and 1. (Your value=$s)"); - $this->len=min($this->img->width,$this->img->height)*$aSize/2; + if( $aSize < 0.1 || $aSize>1 ) { + JpGraphError::RaiseL(18004,$aSize); + //("Radar Plot size must be between 0.1 and 1. (Your value=$s)"); + } + $this->len=min($this->img->width,$this->img->height)*$aSize/2; } function SetPlotSize($aSize) { - $this->SetSize($aSize); + $this->SetSize($aSize); } function SetTickDensity($densy=TICKD_NORMAL,$dummy1=null) { - $this->ytick_factor=25; - switch( $densy ) { - case TICKD_DENSE: - $this->ytick_factor=12; - break; - case TICKD_NORMAL: - $this->ytick_factor=25; - break; - case TICKD_SPARSE: - $this->ytick_factor=40; - break; - case TICKD_VERYSPARSE: - $this->ytick_factor=70; - break; - default: - JpGraphError::RaiseL(18005,$densy); -//("RadarPlot Unsupported Tick density: $densy"); - } + $this->ytick_factor=25; + switch( $densy ) { + case TICKD_DENSE: + $this->ytick_factor=12; + break; + case TICKD_NORMAL: + $this->ytick_factor=25; + break; + case TICKD_SPARSE: + $this->ytick_factor=40; + break; + case TICKD_VERYSPARSE: + $this->ytick_factor=70; + break; + default: + JpGraphError::RaiseL(18005,$densy); + //("RadarPlot Unsupported Tick density: $densy"); + } } function SetPos($px,$py=0.5) { - $this->SetCenter($px,$py); + $this->SetCenter($px,$py); } function SetCenter($px,$py=0.5) { - assert($px > 0 && $py > 0 ); - $this->posx=$this->img->width*$px; - $this->posy=$this->img->height*$py; + if( $px >= 0 && $px <= 1 ) { + $this->posx = $this->img->width*$px; + } + else { + $this->posx = $px; + } + if( $py >= 0 && $py <= 1 ) { + $this->posy = $this->img->height*$py; + } + else { + $this->posy = $py; + } } - function SetColor($c) { - $this->SetMarginColor($c); - } - - function SetTitles($title) { - $this->axis_title = $title; + function SetColor($aColor) { + $this->SetMarginColor($aColor); } - function Add($splot) { - $this->plots[]=$splot; + function SetTitles($aTitleArray) { + $this->axis_title = $aTitleArray; } - + + function Add($aPlot) { + if( $aPlot == null ) { + JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph."); + } + if( is_array($aPlot) && count($aPlot) > 0 ) { + $cl = $aPlot[0]; + } + else { + $cl = $aPlot; + } + + if( $cl instanceof Text ) $this->AddText($aPlot); + elseif( class_exists('IconPlot',false) && ($cl instanceof IconPlot) ) $this->AddIcon($aPlot); + else { + $this->plots[] = $aPlot; + } + } + function GetPlotsYMinMax($aPlots) { - $min=$aPlots[0]->Min(); - $max=$aPlots[0]->Max(); - foreach( $this->plots as $p ) { - $max=max($max,$p->Max()); - $min=min($min,$p->Min()); - } - if( $min < 0 ) - JpGraphError::RaiseL(18006,$min); -//("Minimum data $min (Radar plots should only be used when all data points > 0)"); - return array($min,$max); - } + $min=$aPlots[0]->Min(); + $max=$aPlots[0]->Max(); + foreach( $this->plots as $p ) { + $max=max($max,$p->Max()); + $min=min($min,$p->Min()); + } + if( $min < 0 ) { + JpGraphError::RaiseL(18006,$min); + //("Minimum data $min (Radar plots should only be used when all data points > 0)"); + } + return array($min,$max); + } + + function StrokeIcons() { + if( $this->iIcons != null ) { + $n = count($this->iIcons); + for( $i=0; $i < $n; ++$i ) { + $this->iIcons[$i]->Stroke($this->img); + } + } + } + + function StrokeTexts() { + if( $this->texts != null ) { + $n = count($this->texts); + for( $i=0; $i < $n; ++$i ) { + $this->texts[$i]->Stroke($this->img); + } + } + } // Stroke the Radar graph - function Stroke($aStrokeFileName="") { - $n = count($this->plots); - // Set Y-scale - if( !$this->yscale->IsSpecified() && count($this->plots)>0 ) { - list($min,$max) = $this->GetPlotsYMinMax($this->plots); - $this->yscale->AutoScale($this->img,0,$max,$this->len/$this->ytick_factor); - } - elseif( $this->yscale->IsSpecified() && - ( $this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified()) ) { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - $min = $this->yscale->scale[0]; - $max = $this->yscale->scale[1]; - $this->yscale->AutoScale($this->img,$min,$max, - $this->len/$this->ytick_factor, - $this->yscale->auto_ticks); - } + function Stroke($aStrokeFileName='') { - // Set start position end length of scale (in absolute pixels) - $this->yscale->SetConstants($this->posx,$this->len); - - // We need as many axis as there are data points - $nbrpnts=$this->plots[0]->GetCount(); - - // If we have no titles just number the axis 1,2,3,... - if( $this->axis_title==null ) { - for($i=0; $i < $nbrpnts; ++$i ) - $this->axis_title[$i] = $i+1; - } - elseif(count($this->axis_title)<$nbrpnts) - JpGraphError::RaiseL(18007); -//("Number of titles does not match number of points in plot."); - for($i=0; $i < $n; ++$i ) - if( $nbrpnts != $this->plots[$i]->GetCount() ) - JpGraphError::RaiseL(18008); -//("Each radar plot must have the same number of data points."); + // If the filename is the predefined value = '_csim_special_' + // we assume that the call to stroke only needs to do enough + // to correctly generate the CSIM maps. + // We use this variable to skip things we don't strictly need + // to do to generate the image map to improve performance + // a best we can. Therefor you will see a lot of tests !$_csim in the + // code below. + $_csim = ( $aStrokeFileName === _CSIM_SPECIALFILE ); - if( $this->background_image != "" ) { - $this->StrokeFrameBackground(); - } - else { - $this->StrokeFrame(); - } - $astep=2*M_PI/$nbrpnts; + // We need to know if we have stroked the plot in the + // GetCSIMareas. Otherwise the CSIM hasn't been generated + // and in the case of GetCSIM called before stroke to generate + // CSIM without storing an image to disk GetCSIM must call Stroke. + $this->iHasStroked = true; - // Prepare legends - for($i=0; $i < $n; ++$i) - $this->plots[$i]->Legend($this); - $this->legend->Stroke($this->img); - $this->footer->Stroke($this->img); + $n = count($this->plots); + // Set Y-scale - if( $this->grid_depth == DEPTH_BACK ) { - // Draw axis and grid - for( $i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep ) { - $this->axis->Stroke($this->posy,$a,$grid[$i],$this->axis_title[$i],$i==0); - } - } - - // Plot points - $a=M_PI/2; - for($i=0; $i < $n; ++$i ) - $this->plots[$i]->Stroke($this->img, $this->posy, $this->yscale, $a); - - if( $this->grid_depth != DEPTH_BACK ) { - // Draw axis and grid - for( $i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep ) { - $this->axis->Stroke($this->posy,$a,$grid[$i],$this->axis_title[$i],$i==0); - } - } - $this->grid->Stroke($this->img,$grid); - $this->StrokeTitles(); - - // Stroke texts - if( $this->texts != null ) { - foreach( $this->texts as $t) - $t->Stroke($this->img); - } + if( !$this->yscale->IsSpecified() && count($this->plots) > 0 ) { + list($min,$max) = $this->GetPlotsYMinMax($this->plots); + $this->yscale->AutoScale($this->img,0,$max,$this->len/$this->ytick_factor); + } + elseif( $this->yscale->IsSpecified() && + ( $this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified()) ) { - // Should we do any final image transformation - if( $this->iImgTrans ) { - if( !class_exists('ImgTrans',false) ) { - require_once('jpgraph_imgtrans.php'); - } - - $tform = new ImgTrans($this->img->img); - $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, - $this->iImgTransDirection,$this->iImgTransHighQ, - $this->iImgTransMinSize,$this->iImgTransFillColor, - $this->iImgTransBorder); - } - - // If the filename is given as the special "__handle" - // then the image handler is returned and the image is NOT - // streamed back - if( $aStrokeFileName == _IMG_HANDLER ) { - return $this->img->img; - } - else { - // Finally stream the generated picture - $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline, - $aStrokeFileName); - } + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + $min = $this->yscale->scale[0]; + $max = $this->yscale->scale[1]; + $this->yscale->AutoScale($this->img,$min,$max, + $this->len/$this->ytick_factor, + $this->yscale->auto_ticks); + } + + // Set start position end length of scale (in absolute pixels) + $this->yscale->SetConstants($this->posx,$this->len); + + // We need as many axis as there are data points + $nbrpnts=$this->plots[0]->GetCount(); + + // If we have no titles just number the axis 1,2,3,... + if( $this->axis_title==null ) { + for($i=0; $i < $nbrpnts; ++$i ) { + $this->axis_title[$i] = $i+1; + } + } + elseif( count($this->axis_title) < $nbrpnts) { + JpGraphError::RaiseL(18007); + // ("Number of titles does not match number of points in plot."); + } + for( $i=0; $i < $n; ++$i ) { + if( $nbrpnts != $this->plots[$i]->GetCount() ) { + JpGraphError::RaiseL(18008); + //("Each radar plot must have the same number of data points."); + } + } + + if( !$_csim ) { + if( $this->background_image != '' ) { + $this->StrokeFrameBackground(); + } + else { + $this->StrokeFrame(); + $this->StrokeBackgroundGrad(); + } + } + $astep=2*M_PI/$nbrpnts; + + if( !$_csim ) { + if( $this->iIconDepth == DEPTH_BACK ) { + $this->StrokeIcons(); + } + + + // Prepare legends + for($i=0; $i < $n; ++$i) { + $this->plots[$i]->Legend($this); + } + $this->legend->Stroke($this->img); + $this->footer->Stroke($this->img); + } + + if( !$_csim ) { + if( $this->grid_depth == DEPTH_BACK ) { + // Draw axis and grid + for( $i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep ) { + $this->axis->Stroke($this->posy,$a,$grid[$i],$this->axis_title[$i],$i==0); + } + $this->grid->Stroke($this->img,$grid); + } + if( $this->iIconDepth == DEPTH_BACK ) { + $this->StrokeIcons(); + } + + } + + // Plot points + $a=M_PI/2; + for($i=0; $i < $n; ++$i ) { + $this->plots[$i]->Stroke($this->img, $this->posy, $this->yscale, $a); + } + + if( !$_csim ) { + if( $this->grid_depth != DEPTH_BACK ) { + // Draw axis and grid + for( $i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep ) { + $this->axis->Stroke($this->posy,$a,$grid[$i],$this->axis_title[$i],$i==0); + } + $this->grid->Stroke($this->img,$grid); + } + + $this->StrokeTitles(); + $this->StrokeTexts(); + if( $this->iIconDepth == DEPTH_FRONT ) { + $this->StrokeIcons(); + } + } + + // Should we do any final image transformation + if( $this->iImgTrans && !$_csim ) { + if( !class_exists('ImgTrans',false) ) { + require_once('jpgraph_imgtrans.php'); + } + + $tform = new ImgTrans($this->img->img); + $this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist, + $this->iImgTransDirection,$this->iImgTransHighQ, + $this->iImgTransMinSize,$this->iImgTransFillColor, + $this->iImgTransBorder); + } + + if( !$_csim ) { + // If the filename is given as the special "__handle" + // then the image handler is returned and the image is NOT + // streamed back + if( $aStrokeFileName == _IMG_HANDLER ) { + return $this->img->img; + } + else { + // Finally stream the generated picture + $this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName); + } + } } } // Class diff --git a/libs/jpgraph/jpgraph_regstat.php b/libs/jpgraph/jpgraph_regstat.php index e94b4f1..c327c95 100644 --- a/libs/jpgraph/jpgraph_regstat.php +++ b/libs/jpgraph/jpgraph_regstat.php @@ -1,13 +1,13 @@ -y2 = array(); - $this->xdata = $xdata; - $this->ydata = $ydata; + function __construct($xdata,$ydata) { + $this->y2 = array(); + $this->xdata = $xdata; + $this->ydata = $ydata; - $n = count($ydata); - $this->n = $n; - if( $this->n !== count($xdata) ) { - JpGraphError::RaiseL(19001); -//('Spline: Number of X and Y coordinates must be the same'); - } + $n = count($ydata); + $this->n = $n; + if( $this->n !== count($xdata) ) { + JpGraphError::RaiseL(19001); + //('Spline: Number of X and Y coordinates must be the same'); + } - // Natural spline 2:derivate == 0 at endpoints - $this->y2[0] = 0.0; - $this->y2[$n-1] = 0.0; - $delta[0] = 0.0; + // Natural spline 2:derivate == 0 at endpoints + $this->y2[0] = 0.0; + $this->y2[$n-1] = 0.0; + $delta[0] = 0.0; - // Calculate 2:nd derivate - for($i=1; $i < $n-1; ++$i) { - $d = ($xdata[$i+1]-$xdata[$i-1]); - if( $d == 0 ) { - JpGraphError::RaiseL(19002); -//('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.'); - } - $s = ($xdata[$i]-$xdata[$i-1])/$d; - $p = $s*$this->y2[$i-1]+2.0; - $this->y2[$i] = ($s-1.0)/$p; - $delta[$i] = ($ydata[$i+1]-$ydata[$i])/($xdata[$i+1]-$xdata[$i]) - - ($ydata[$i]-$ydata[$i-1])/($xdata[$i]-$xdata[$i-1]); - $delta[$i] = (6.0*$delta[$i]/($xdata[$i+1]-$xdata[$i-1])-$s*$delta[$i-1])/$p; - } + // Calculate 2:nd derivate + for($i=1; $i < $n-1; ++$i) { + $d = ($xdata[$i+1]-$xdata[$i-1]); + if( $d == 0 ) { + JpGraphError::RaiseL(19002); + //('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.'); + } + $s = ($xdata[$i]-$xdata[$i-1])/$d; + $p = $s*$this->y2[$i-1]+2.0; + $this->y2[$i] = ($s-1.0)/$p; + $delta[$i] = ($ydata[$i+1]-$ydata[$i])/($xdata[$i+1]-$xdata[$i]) - + ($ydata[$i]-$ydata[$i-1])/($xdata[$i]-$xdata[$i-1]); + $delta[$i] = (6.0*$delta[$i]/($xdata[$i+1]-$xdata[$i-1])-$s*$delta[$i-1])/$p; + } - // Backward substitution - for( $j=$n-2; $j >= 0; --$j ) { - $this->y2[$j] = $this->y2[$j]*$this->y2[$j+1] + $delta[$j]; - } + // Backward substitution + for( $j=$n-2; $j >= 0; --$j ) { + $this->y2[$j] = $this->y2[$j]*$this->y2[$j+1] + $delta[$j]; + } } // Return the two new data vectors function Get($num=50) { - $n = $this->n ; - $step = ($this->xdata[$n-1]-$this->xdata[0]) / ($num-1); - $xnew=array(); - $ynew=array(); - $xnew[0] = $this->xdata[0]; - $ynew[0] = $this->ydata[0]; - for( $j=1; $j < $num; ++$j ) { - $xnew[$j] = $xnew[0]+$j*$step; - $ynew[$j] = $this->Interpolate($xnew[$j]); - } - return array($xnew,$ynew); + $n = $this->n ; + $step = ($this->xdata[$n-1]-$this->xdata[0]) / ($num-1); + $xnew=array(); + $ynew=array(); + $xnew[0] = $this->xdata[0]; + $ynew[0] = $this->ydata[0]; + for( $j=1; $j < $num; ++$j ) { + $xnew[$j] = $xnew[0]+$j*$step; + $ynew[$j] = $this->Interpolate($xnew[$j]); + } + return array($xnew,$ynew); } // Return a single interpolated Y-value from an x value function Interpolate($xpoint) { - $max = $this->n-1; - $min = 0; + $max = $this->n-1; + $min = 0; - // Binary search to find interval - while( $max-$min > 1 ) { - $k = ($max+$min) / 2; - if( $this->xdata[$k] > $xpoint ) - $max=$k; - else - $min=$k; - } + // Binary search to find interval + while( $max-$min > 1 ) { + $k = ($max+$min) / 2; + if( $this->xdata[$k] > $xpoint ) + $max=$k; + else + $min=$k; + } - // Each interval is interpolated by a 3:degree polynom function - $h = $this->xdata[$max]-$this->xdata[$min]; + // Each interval is interpolated by a 3:degree polynom function + $h = $this->xdata[$max]-$this->xdata[$min]; - if( $h == 0 ) { - JpGraphError::RaiseL(19002); -//('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.'); - } + if( $h == 0 ) { + JpGraphError::RaiseL(19002); + //('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.'); + } - $a = ($this->xdata[$max]-$xpoint)/$h; - $b = ($xpoint-$this->xdata[$min])/$h; - return $a*$this->ydata[$min]+$b*$this->ydata[$max]+ - (($a*$a*$a-$a)*$this->y2[$min]+($b*$b*$b-$b)*$this->y2[$max])*($h*$h)/6.0; + $a = ($this->xdata[$max]-$xpoint)/$h; + $b = ($xpoint-$this->xdata[$min])/$h; + return $a*$this->ydata[$min]+$b*$this->ydata[$max]+ + (($a*$a*$a-$a)*$this->y2[$min]+($b*$b*$b-$b)*$this->y2[$max])*($h*$h)/6.0; } } @@ -110,91 +110,104 @@ class Spline { // Create a new data array from a number of control points //------------------------------------------------------------------------ class Bezier { -/** - * @author Thomas Despoix, openXtrem company - * @license released under QPL - * @abstract Bezier interoplated point generation, - * computed from control points data sets, based on Paul Bourke algorithm : - * http://astronomy.swin.edu.au/~pbourke/curves/bezier/ - */ + /** + * @author Thomas Despoix, openXtrem company + * @license released under QPL + * @abstract Bezier interoplated point generation, + * computed from control points data sets, based on Paul Bourke algorithm : + * http://local.wasp.uwa.edu.au/~pbourke/geometry/bezier/index2.html + */ private $datax = array(); private $datay = array(); private $n=0; - - function Bezier($datax, $datay, $attraction_factor = 1) { - // Adding control point multiple time will raise their attraction power over the curve - $this->n = count($datax); - if( $this->n !== count($datay) ) { - JpGraphError::RaiseL(19003); -//('Bezier: Number of X and Y coordinates must be the same'); - } - $idx=0; - foreach($datax as $datumx) { - for ($i = 0; $i < $attraction_factor; $i++) { - $this->datax[$idx++] = $datumx; - } - } - $idx=0; - foreach($datay as $datumy) { - for ($i = 0; $i < $attraction_factor; $i++) { - $this->datay[$idx++] = $datumy; - } - } - $this->n *= $attraction_factor; + + function __construct($datax, $datay, $attraction_factor = 1) { + // Adding control point multiple time will raise their attraction power over the curve + $this->n = count($datax); + if( $this->n !== count($datay) ) { + JpGraphError::RaiseL(19003); + //('Bezier: Number of X and Y coordinates must be the same'); + } + $idx=0; + foreach($datax as $datumx) { + for ($i = 0; $i < $attraction_factor; $i++) { + $this->datax[$idx++] = $datumx; + } + } + $idx=0; + foreach($datay as $datumy) { + for ($i = 0; $i < $attraction_factor; $i++) { + $this->datay[$idx++] = $datumy; + } + } + $this->n *= $attraction_factor; } + /** + * Return a set of data points that specifies the bezier curve with $steps points + * @param $steps Number of new points to return + * @return array($datax, $datay) + */ function Get($steps) { - $datax = array(); - $datay = array(); - for ($i = 0; $i < $steps; $i++) { - list($datumx, $datumy) = $this->GetPoint((double) $i / (double) $steps); - $datax[] = $datumx; - $datay[] = $datumy; - } - - $datax[] = end($this->datax); - $datay[] = end($this->datay); - - return array($datax, $datay); + $datax = array(); + $datay = array(); + for ($i = 0; $i < $steps; $i++) { + list($datumx, $datumy) = $this->GetPoint((double) $i / (double) $steps); + $datax[$i] = $datumx; + $datay[$i] = $datumy; + } + + $datax[] = end($this->datax); + $datay[] = end($this->datay); + + return array($datax, $datay); } - + + /** + * Return one point on the bezier curve. $mu is the position on the curve where $mu is in the + * range 0 $mu < 1 where 0 is tha start point and 1 is the end point. Note that every newly computed + * point depends on all the existing points + * + * @param $mu Position on the bezier curve + * @return array($x, $y) + */ function GetPoint($mu) { - $n = $this->n - 1; - $k = 0; - $kn = 0; - $nn = 0; - $nkn = 0; - $blend = 0.0; - $newx = 0.0; - $newy = 0.0; + $n = $this->n - 1; + $k = 0; + $kn = 0; + $nn = 0; + $nkn = 0; + $blend = 0.0; + $newx = 0.0; + $newy = 0.0; - $muk = 1.0; - $munk = (double) pow(1-$mu,(double) $n); + $muk = 1.0; + $munk = (double) pow(1-$mu,(double) $n); - for ($k = 0; $k <= $n; $k++) { - $nn = $n; - $kn = $k; - $nkn = $n - $k; - $blend = $muk * $munk; - $muk *= $mu; - $munk /= (1-$mu); - while ($nn >= 1) { - $blend *= $nn; - $nn--; - if ($kn > 1) { - $blend /= (double) $kn; - $kn--; - } - if ($nkn > 1) { - $blend /= (double) $nkn; - $nkn--; - } - } - $newx += $this->datax[$k] * $blend; - $newy += $this->datay[$k] * $blend; - } + for ($k = 0; $k <= $n; $k++) { + $nn = $n; + $kn = $k; + $nkn = $n - $k; + $blend = $muk * $munk; + $muk *= $mu; + $munk /= (1-$mu); + while ($nn >= 1) { + $blend *= $nn; + $nn--; + if ($kn > 1) { + $blend /= (double) $kn; + $kn--; + } + if ($nkn > 1) { + $blend /= (double) $nkn; + $nkn--; + } + } + $newx += $this->datax[$k] * $blend; + $newy += $this->datay[$k] * $blend; + } - return array($newx, $newy); + return array($newx, $newy); } } diff --git a/libs/jpgraph/jpgraph_rgb.inc.php b/libs/jpgraph/jpgraph_rgb.inc.php new file mode 100644 index 0000000..6464bc1 --- /dev/null +++ b/libs/jpgraph/jpgraph_rgb.inc.php @@ -0,0 +1,628 @@ +img = $aImg; + + // Conversion array between color names and RGB + $this->rgb_table = array( + 'aqua'=> array(0,255,255), + 'lime'=> array(0,255,0), + 'teal'=> array(0,128,128), + 'whitesmoke'=>array(245,245,245), + 'gainsboro'=>array(220,220,220), + 'oldlace'=>array(253,245,230), + 'linen'=>array(250,240,230), + 'antiquewhite'=>array(250,235,215), + 'papayawhip'=>array(255,239,213), + 'blanchedalmond'=>array(255,235,205), + 'bisque'=>array(255,228,196), + 'peachpuff'=>array(255,218,185), + 'navajowhite'=>array(255,222,173), + 'moccasin'=>array(255,228,181), + 'cornsilk'=>array(255,248,220), + 'ivory'=>array(255,255,240), + 'lemonchiffon'=>array(255,250,205), + 'seashell'=>array(255,245,238), + 'mintcream'=>array(245,255,250), + 'azure'=>array(240,255,255), + 'aliceblue'=>array(240,248,255), + 'lavender'=>array(230,230,250), + 'lavenderblush'=>array(255,240,245), + 'mistyrose'=>array(255,228,225), + 'white'=>array(255,255,255), + 'black'=>array(0,0,0), + 'darkslategray'=>array(47,79,79), + 'dimgray'=>array(105,105,105), + 'slategray'=>array(112,128,144), + 'lightslategray'=>array(119,136,153), + 'gray'=>array(190,190,190), + 'lightgray'=>array(211,211,211), + 'midnightblue'=>array(25,25,112), + 'navy'=>array(0,0,128), + 'indigo'=>array(75,0,130), + 'electricindigo'=>array(102,0,255), + 'deepindigo'=>array(138,43,226), + 'pigmentindigo'=>array(75,0,130), + 'indigodye'=>array(0,65,106), + 'cornflowerblue'=>array(100,149,237), + 'darkslateblue'=>array(72,61,139), + 'slateblue'=>array(106,90,205), + 'mediumslateblue'=>array(123,104,238), + 'lightslateblue'=>array(132,112,255), + 'mediumblue'=>array(0,0,205), + 'royalblue'=>array(65,105,225), + 'blue'=>array(0,0,255), + 'dodgerblue'=>array(30,144,255), + 'deepskyblue'=>array(0,191,255), + 'skyblue'=>array(135,206,235), + 'lightskyblue'=>array(135,206,250), + 'steelblue'=>array(70,130,180), + 'lightred'=>array(211,167,168), + 'lightsteelblue'=>array(176,196,222), + 'lightblue'=>array(173,216,230), + 'powderblue'=>array(176,224,230), + 'paleturquoise'=>array(175,238,238), + 'darkturquoise'=>array(0,206,209), + 'mediumturquoise'=>array(72,209,204), + 'turquoise'=>array(64,224,208), + 'cyan'=>array(0,255,255), + 'lightcyan'=>array(224,255,255), + 'cadetblue'=>array(95,158,160), + 'mediumaquamarine'=>array(102,205,170), + 'aquamarine'=>array(127,255,212), + 'darkgreen'=>array(0,100,0), + 'darkolivegreen'=>array(85,107,47), + 'darkseagreen'=>array(143,188,143), + 'seagreen'=>array(46,139,87), + 'mediumseagreen'=>array(60,179,113), + 'lightseagreen'=>array(32,178,170), + 'palegreen'=>array(152,251,152), + 'springgreen'=>array(0,255,127), + 'lawngreen'=>array(124,252,0), + 'green'=>array(0,255,0), + 'chartreuse'=>array(127,255,0), + 'mediumspringgreen'=>array(0,250,154), + 'greenyellow'=>array(173,255,47), + 'limegreen'=>array(50,205,50), + 'yellowgreen'=>array(154,205,50), + 'forestgreen'=>array(34,139,34), + 'olivedrab'=>array(107,142,35), + 'darkkhaki'=>array(189,183,107), + 'khaki'=>array(240,230,140), + 'palegoldenrod'=>array(238,232,170), + 'lightgoldenrodyellow'=>array(250,250,210), + 'lightyellow'=>array(255,255,200), + 'yellow'=>array(255,255,0), + 'gold'=>array(255,215,0), + 'lightgoldenrod'=>array(238,221,130), + 'goldenrod'=>array(218,165,32), + 'darkgoldenrod'=>array(184,134,11), + 'rosybrown'=>array(188,143,143), + 'indianred'=>array(205,92,92), + 'saddlebrown'=>array(139,69,19), + 'sienna'=>array(160,82,45), + 'peru'=>array(205,133,63), + 'burlywood'=>array(222,184,135), + 'beige'=>array(245,245,220), + 'wheat'=>array(245,222,179), + 'sandybrown'=>array(244,164,96), + 'tan'=>array(210,180,140), + 'chocolate'=>array(210,105,30), + 'firebrick'=>array(178,34,34), + 'brown'=>array(165,42,42), + 'darksalmon'=>array(233,150,122), + 'salmon'=>array(250,128,114), + 'lightsalmon'=>array(255,160,122), + 'orange'=>array(255,165,0), + 'darkorange'=>array(255,140,0), + 'coral'=>array(255,127,80), + 'lightcoral'=>array(240,128,128), + 'tomato'=>array(255,99,71), + 'orangered'=>array(255,69,0), + 'red'=>array(255,0,0), + 'hotpink'=>array(255,105,180), + 'deeppink'=>array(255,20,147), + 'pink'=>array(255,192,203), + 'lightpink'=>array(255,182,193), + 'palevioletred'=>array(219,112,147), + 'maroon'=>array(176,48,96), + 'mediumvioletred'=>array(199,21,133), + 'violetred'=>array(208,32,144), + 'magenta'=>array(255,0,255), + 'violet'=>array(238,130,238), + 'plum'=>array(221,160,221), + 'orchid'=>array(218,112,214), + 'mediumorchid'=>array(186,85,211), + 'darkorchid'=>array(153,50,204), + 'darkviolet'=>array(148,0,211), + 'blueviolet'=>array(138,43,226), + 'purple'=>array(160,32,240), + 'mediumpurple'=>array(147,112,219), + 'thistle'=>array(216,191,216), + 'snow1'=>array(255,250,250), + 'snow2'=>array(238,233,233), + 'snow3'=>array(205,201,201), + 'snow4'=>array(139,137,137), + 'seashell1'=>array(255,245,238), + 'seashell2'=>array(238,229,222), + 'seashell3'=>array(205,197,191), + 'seashell4'=>array(139,134,130), + 'AntiqueWhite1'=>array(255,239,219), + 'AntiqueWhite2'=>array(238,223,204), + 'AntiqueWhite3'=>array(205,192,176), + 'AntiqueWhite4'=>array(139,131,120), + 'bisque1'=>array(255,228,196), + 'bisque2'=>array(238,213,183), + 'bisque3'=>array(205,183,158), + 'bisque4'=>array(139,125,107), + 'peachPuff1'=>array(255,218,185), + 'peachpuff2'=>array(238,203,173), + 'peachpuff3'=>array(205,175,149), + 'peachpuff4'=>array(139,119,101), + 'navajowhite1'=>array(255,222,173), + 'navajowhite2'=>array(238,207,161), + 'navajowhite3'=>array(205,179,139), + 'navajowhite4'=>array(139,121,94), + 'lemonchiffon1'=>array(255,250,205), + 'lemonchiffon2'=>array(238,233,191), + 'lemonchiffon3'=>array(205,201,165), + 'lemonchiffon4'=>array(139,137,112), + 'ivory1'=>array(255,255,240), + 'ivory2'=>array(238,238,224), + 'ivory3'=>array(205,205,193), + 'ivory4'=>array(139,139,131), + 'honeydew'=>array(193,205,193), + 'lavenderblush1'=>array(255,240,245), + 'lavenderblush2'=>array(238,224,229), + 'lavenderblush3'=>array(205,193,197), + 'lavenderblush4'=>array(139,131,134), + 'mistyrose1'=>array(255,228,225), + 'mistyrose2'=>array(238,213,210), + 'mistyrose3'=>array(205,183,181), + 'mistyrose4'=>array(139,125,123), + 'azure1'=>array(240,255,255), + 'azure2'=>array(224,238,238), + 'azure3'=>array(193,205,205), + 'azure4'=>array(131,139,139), + 'slateblue1'=>array(131,111,255), + 'slateblue2'=>array(122,103,238), + 'slateblue3'=>array(105,89,205), + 'slateblue4'=>array(71,60,139), + 'royalblue1'=>array(72,118,255), + 'royalblue2'=>array(67,110,238), + 'royalblue3'=>array(58,95,205), + 'royalblue4'=>array(39,64,139), + 'dodgerblue1'=>array(30,144,255), + 'dodgerblue2'=>array(28,134,238), + 'dodgerblue3'=>array(24,116,205), + 'dodgerblue4'=>array(16,78,139), + 'steelblue1'=>array(99,184,255), + 'steelblue2'=>array(92,172,238), + 'steelblue3'=>array(79,148,205), + 'steelblue4'=>array(54,100,139), + 'deepskyblue1'=>array(0,191,255), + 'deepskyblue2'=>array(0,178,238), + 'deepskyblue3'=>array(0,154,205), + 'deepskyblue4'=>array(0,104,139), + 'skyblue1'=>array(135,206,255), + 'skyblue2'=>array(126,192,238), + 'skyblue3'=>array(108,166,205), + 'skyblue4'=>array(74,112,139), + 'lightskyblue1'=>array(176,226,255), + 'lightskyblue2'=>array(164,211,238), + 'lightskyblue3'=>array(141,182,205), + 'lightskyblue4'=>array(96,123,139), + 'slategray1'=>array(198,226,255), + 'slategray2'=>array(185,211,238), + 'slategray3'=>array(159,182,205), + 'slategray4'=>array(108,123,139), + 'lightsteelblue1'=>array(202,225,255), + 'lightsteelblue2'=>array(188,210,238), + 'lightsteelblue3'=>array(162,181,205), + 'lightsteelblue4'=>array(110,123,139), + 'lightblue1'=>array(191,239,255), + 'lightblue2'=>array(178,223,238), + 'lightblue3'=>array(154,192,205), + 'lightblue4'=>array(104,131,139), + 'lightcyan1'=>array(224,255,255), + 'lightcyan2'=>array(209,238,238), + 'lightcyan3'=>array(180,205,205), + 'lightcyan4'=>array(122,139,139), + 'paleturquoise1'=>array(187,255,255), + 'paleturquoise2'=>array(174,238,238), + 'paleturquoise3'=>array(150,205,205), + 'paleturquoise4'=>array(102,139,139), + 'cadetblue1'=>array(152,245,255), + 'cadetblue2'=>array(142,229,238), + 'cadetblue3'=>array(122,197,205), + 'cadetblue4'=>array(83,134,139), + 'turquoise1'=>array(0,245,255), + 'turquoise2'=>array(0,229,238), + 'turquoise3'=>array(0,197,205), + 'turquoise4'=>array(0,134,139), + 'cyan1'=>array(0,255,255), + 'cyan2'=>array(0,238,238), + 'cyan3'=>array(0,205,205), + 'cyan4'=>array(0,139,139), + 'darkslategray1'=>array(151,255,255), + 'darkslategray2'=>array(141,238,238), + 'darkslategray3'=>array(121,205,205), + 'darkslategray4'=>array(82,139,139), + 'aquamarine1'=>array(127,255,212), + 'aquamarine2'=>array(118,238,198), + 'aquamarine3'=>array(102,205,170), + 'aquamarine4'=>array(69,139,116), + 'darkseagreen1'=>array(193,255,193), + 'darkseagreen2'=>array(180,238,180), + 'darkseagreen3'=>array(155,205,155), + 'darkseagreen4'=>array(105,139,105), + 'seagreen1'=>array(84,255,159), + 'seagreen2'=>array(78,238,148), + 'seagreen3'=>array(67,205,128), + 'seagreen4'=>array(46,139,87), + 'palegreen1'=>array(154,255,154), + 'palegreen2'=>array(144,238,144), + 'palegreen3'=>array(124,205,124), + 'palegreen4'=>array(84,139,84), + 'springgreen1'=>array(0,255,127), + 'springgreen2'=>array(0,238,118), + 'springgreen3'=>array(0,205,102), + 'springgreen4'=>array(0,139,69), + 'chartreuse1'=>array(127,255,0), + 'chartreuse2'=>array(118,238,0), + 'chartreuse3'=>array(102,205,0), + 'chartreuse4'=>array(69,139,0), + 'olivedrab1'=>array(192,255,62), + 'olivedrab2'=>array(179,238,58), + 'olivedrab3'=>array(154,205,50), + 'olivedrab4'=>array(105,139,34), + 'darkolivegreen1'=>array(202,255,112), + 'darkolivegreen2'=>array(188,238,104), + 'darkolivegreen3'=>array(162,205,90), + 'darkolivegreen4'=>array(110,139,61), + 'khaki1'=>array(255,246,143), + 'khaki2'=>array(238,230,133), + 'khaki3'=>array(205,198,115), + 'khaki4'=>array(139,134,78), + 'lightgoldenrod1'=>array(255,236,139), + 'lightgoldenrod2'=>array(238,220,130), + 'lightgoldenrod3'=>array(205,190,112), + 'lightgoldenrod4'=>array(139,129,76), + 'yellow1'=>array(255,255,0), + 'yellow2'=>array(238,238,0), + 'yellow3'=>array(205,205,0), + 'yellow4'=>array(139,139,0), + 'gold1'=>array(255,215,0), + 'gold2'=>array(238,201,0), + 'gold3'=>array(205,173,0), + 'gold4'=>array(139,117,0), + 'goldenrod1'=>array(255,193,37), + 'goldenrod2'=>array(238,180,34), + 'goldenrod3'=>array(205,155,29), + 'goldenrod4'=>array(139,105,20), + 'darkgoldenrod1'=>array(255,185,15), + 'darkgoldenrod2'=>array(238,173,14), + 'darkgoldenrod3'=>array(205,149,12), + 'darkgoldenrod4'=>array(139,101,8), + 'rosybrown1'=>array(255,193,193), + 'rosybrown2'=>array(238,180,180), + 'rosybrown3'=>array(205,155,155), + 'rosybrown4'=>array(139,105,105), + 'indianred1'=>array(255,106,106), + 'indianred2'=>array(238,99,99), + 'indianred3'=>array(205,85,85), + 'indianred4'=>array(139,58,58), + 'sienna1'=>array(255,130,71), + 'sienna2'=>array(238,121,66), + 'sienna3'=>array(205,104,57), + 'sienna4'=>array(139,71,38), + 'burlywood1'=>array(255,211,155), + 'burlywood2'=>array(238,197,145), + 'burlywood3'=>array(205,170,125), + 'burlywood4'=>array(139,115,85), + 'wheat1'=>array(255,231,186), + 'wheat2'=>array(238,216,174), + 'wheat3'=>array(205,186,150), + 'wheat4'=>array(139,126,102), + 'tan1'=>array(255,165,79), + 'tan2'=>array(238,154,73), + 'tan3'=>array(205,133,63), + 'tan4'=>array(139,90,43), + 'chocolate1'=>array(255,127,36), + 'chocolate2'=>array(238,118,33), + 'chocolate3'=>array(205,102,29), + 'chocolate4'=>array(139,69,19), + 'firebrick1'=>array(255,48,48), + 'firebrick2'=>array(238,44,44), + 'firebrick3'=>array(205,38,38), + 'firebrick4'=>array(139,26,26), + 'brown1'=>array(255,64,64), + 'brown2'=>array(238,59,59), + 'brown3'=>array(205,51,51), + 'brown4'=>array(139,35,35), + 'salmon1'=>array(255,140,105), + 'salmon2'=>array(238,130,98), + 'salmon3'=>array(205,112,84), + 'salmon4'=>array(139,76,57), + 'lightsalmon1'=>array(255,160,122), + 'lightsalmon2'=>array(238,149,114), + 'lightsalmon3'=>array(205,129,98), + 'lightsalmon4'=>array(139,87,66), + 'orange1'=>array(255,165,0), + 'orange2'=>array(238,154,0), + 'orange3'=>array(205,133,0), + 'orange4'=>array(139,90,0), + 'darkorange1'=>array(255,127,0), + 'darkorange2'=>array(238,118,0), + 'darkorange3'=>array(205,102,0), + 'darkorange4'=>array(139,69,0), + 'coral1'=>array(255,114,86), + 'coral2'=>array(238,106,80), + 'coral3'=>array(205,91,69), + 'coral4'=>array(139,62,47), + 'tomato1'=>array(255,99,71), + 'tomato2'=>array(238,92,66), + 'tomato3'=>array(205,79,57), + 'tomato4'=>array(139,54,38), + 'orangered1'=>array(255,69,0), + 'orangered2'=>array(238,64,0), + 'orangered3'=>array(205,55,0), + 'orangered4'=>array(139,37,0), + 'deeppink1'=>array(255,20,147), + 'deeppink2'=>array(238,18,137), + 'deeppink3'=>array(205,16,118), + 'deeppink4'=>array(139,10,80), + 'hotpink1'=>array(255,110,180), + 'hotpink2'=>array(238,106,167), + 'hotpink3'=>array(205,96,144), + 'hotpink4'=>array(139,58,98), + 'pink1'=>array(255,181,197), + 'pink2'=>array(238,169,184), + 'pink3'=>array(205,145,158), + 'pink4'=>array(139,99,108), + 'lightpink1'=>array(255,174,185), + 'lightpink2'=>array(238,162,173), + 'lightpink3'=>array(205,140,149), + 'lightpink4'=>array(139,95,101), + 'palevioletred1'=>array(255,130,171), + 'palevioletred2'=>array(238,121,159), + 'palevioletred3'=>array(205,104,137), + 'palevioletred4'=>array(139,71,93), + 'maroon1'=>array(255,52,179), + 'maroon2'=>array(238,48,167), + 'maroon3'=>array(205,41,144), + 'maroon4'=>array(139,28,98), + 'violetred1'=>array(255,62,150), + 'violetred2'=>array(238,58,140), + 'violetred3'=>array(205,50,120), + 'violetred4'=>array(139,34,82), + 'magenta1'=>array(255,0,255), + 'magenta2'=>array(238,0,238), + 'magenta3'=>array(205,0,205), + 'magenta4'=>array(139,0,139), + 'mediumred'=>array(140,34,34), + 'orchid1'=>array(255,131,250), + 'orchid2'=>array(238,122,233), + 'orchid3'=>array(205,105,201), + 'orchid4'=>array(139,71,137), + 'plum1'=>array(255,187,255), + 'plum2'=>array(238,174,238), + 'plum3'=>array(205,150,205), + 'plum4'=>array(139,102,139), + 'mediumorchid1'=>array(224,102,255), + 'mediumorchid2'=>array(209,95,238), + 'mediumorchid3'=>array(180,82,205), + 'mediumorchid4'=>array(122,55,139), + 'darkorchid1'=>array(191,62,255), + 'darkorchid2'=>array(178,58,238), + 'darkorchid3'=>array(154,50,205), + 'darkorchid4'=>array(104,34,139), + 'purple1'=>array(155,48,255), + 'purple2'=>array(145,44,238), + 'purple3'=>array(125,38,205), + 'purple4'=>array(85,26,139), + 'mediumpurple1'=>array(171,130,255), + 'mediumpurple2'=>array(159,121,238), + 'mediumpurple3'=>array(137,104,205), + 'mediumpurple4'=>array(93,71,139), + 'thistle1'=>array(255,225,255), + 'thistle2'=>array(238,210,238), + 'thistle3'=>array(205,181,205), + 'thistle4'=>array(139,123,139), + 'gray1'=>array(10,10,10), + 'gray2'=>array(40,40,30), + 'gray3'=>array(70,70,70), + 'gray4'=>array(100,100,100), + 'gray5'=>array(130,130,130), + 'gray6'=>array(160,160,160), + 'gray7'=>array(190,190,190), + 'gray8'=>array(210,210,210), + 'gray9'=>array(240,240,240), + 'darkgray'=>array(100,100,100), + 'darkblue'=>array(0,0,139), + 'darkcyan'=>array(0,139,139), + 'darkmagenta'=>array(139,0,139), + 'darkred'=>array(139,0,0), + 'silver'=>array(192, 192, 192), + 'eggplant'=>array(144,176,168), + 'lightgreen'=>array(144,238,144)); + } + //---------------- + // PUBLIC METHODS + // Colors can be specified as either + // 1. #xxxxxx HTML style + // 2. "colorname" as a named color + // 3. array(r,g,b) RGB triple + // This function translates this to a native RGB format and returns an + // RGB triple. + function Color($aColor) { + if (is_string($aColor)) { + // Strip of any alpha factor + $pos = strpos($aColor,'@'); + if( $pos === false ) { + $alpha = 0; + } + else { + $pos2 = strpos($aColor,':'); + if( $pos2===false ) + $pos2 = $pos-1; // Sentinel + if( $pos > $pos2 ) { + $alpha = str_replace(',','.',substr($aColor,$pos+1)); + $aColor = substr($aColor,0,$pos); + } + else { + $alpha = substr($aColor,$pos+1,$pos2-$pos-1); + $aColor = substr($aColor,0,$pos).substr($aColor,$pos2); + } + } + + // Extract potential adjustment figure at end of color + // specification + $pos = strpos($aColor,":"); + if( $pos === false ) { + $adj = 1.0; + } + else { + $adj = 0.0 + str_replace(',','.',substr($aColor,$pos+1)); + $aColor = substr($aColor,0,$pos); + } + if( $adj < 0 ) { + JpGraphError::RaiseL(25077);//('Adjustment factor for color must be > 0'); + } + + if (substr($aColor, 0, 1) == "#") { + $r = hexdec(substr($aColor, 1, 2)); + $g = hexdec(substr($aColor, 3, 2)); + $b = hexdec(substr($aColor, 5, 2)); + } else { + if(!isset($this->rgb_table[$aColor]) ) { + JpGraphError::RaiseL(25078,$aColor);//(" Unknown color: $aColor"); + } + $tmp=$this->rgb_table[$aColor]; + $r = $tmp[0]; + $g = $tmp[1]; + $b = $tmp[2]; + } + // Scale adj so that an adj=2 always + // makes the color 100% white (i.e. 255,255,255. + // and adj=1 neutral and adj=0 black. + if( $adj > 1 ) { + $m = ($adj-1.0)*(255-min(255,min($r,min($g,$b)))); + return array(min(255,$r+$m), min(255,$g+$m), min(255,$b+$m),$alpha); + } + elseif( $adj < 1 ) { + $m = ($adj-1.0)*max(255,max($r,max($g,$b))); + return array(max(0,$r+$m), max(0,$g+$m), max(0,$b+$m),$alpha); + } + else { + return array($r,$g,$b,$alpha); + } + + } elseif( is_array($aColor) ) { + if( count($aColor)==3 ) { + $aColor[3]=0; + return $aColor; + } + else + return $aColor; + } + else { + JpGraphError::RaiseL(25079,$aColor,count($aColor));//(" Unknown color specification: $aColor , size=".count($aColor)); + } + } + + // Compare two colors + // return true if equal + function Equal($aCol1,$aCol2) { + $c1 = $this->Color($aCol1); + $c2 = $this->Color($aCol2); + if( $c1[0]==$c2[0] && $c1[1]==$c2[1] && $c1[2]==$c2[2] ) { + return true; + } + else { + return false; + } + } + + // Allocate a new color in the current image + // Return new color index, -1 if no more colors could be allocated + function Allocate($aColor,$aAlpha=0.0) { + list ($r, $g, $b, $a) = $this->color($aColor); + // If alpha is specified in the color string then this + // takes precedence over the second argument + if( $a > 0 ) { + $aAlpha = $a; + } + if( $aAlpha < 0 || $aAlpha > 1 ) { + JpGraphError::RaiseL(25080);//('Alpha parameter for color must be between 0.0 and 1.0'); + } + return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127)); + } + + static function tryHexConversion($aColor) { + if( is_array( $aColor ) ) { + if( count( $aColor ) == 3 ) { + if( is_numeric($aColor[0]) &&is_numeric($aColor[1]) && is_numeric($aColor[2]) ) { + if( ($aColor[0] >= 0 && $aColor[0] <= 255) && + ($aColor[1] >= 0 && $aColor[1] <= 255) && + ($aColor[2] >= 0 && $aColor[2] <= 255) ) { + return sprintf('#%02x%02x%02x',$aColor[0],$aColor[1],$aColor[2]); + } + } + } + } + return $aColor; + } + + + // Return a RGB tripple corresponding to a position in the normal light spectrum + // The argumen values is in the range [0, 1] where a value of 0 correponds to blue and + // a value of 1 corresponds to red. Values in betwen is mapped to a linear interpolation + // of the constituting colors in the visible color spectra. + // The $aDynamicRange specified how much of the dynamic range we shold use + // a value of 1.0 give the full dyanmic range and a lower value give more dark + // colors. In the extreme of 0.0 then all colors will be black. + static function GetSpectrum($aVal,$aDynamicRange=1.0) { + if( $aVal < 0 || $aVal > 1.0001 ) { + return array(0,0,0); // Invalid case - just return black + } + + $sat = round(255*$aDynamicRange); + $a = 0.25; + if( $aVal <= 0.25 ) { + return array(0, round($sat*$aVal/$a), $sat); + } + elseif( $aVal <= 0.5 ) { + return array(0, $sat, round($sat-$sat*($aVal-0.25)/$a)); + } + elseif( $aVal <= 0.75 ) { + return array(round($sat*($aVal-0.5)/$a), $sat, 0); + } + else { + return array($sat, round($sat-$sat*($aVal-0.75)/$a), 0); + } + } + + } // Class + +?> diff --git a/libs/jpgraph/jpgraph_scatter.php b/libs/jpgraph/jpgraph_scatter.php index 3b25cb5..141fdfa 100644 --- a/libs/jpgraph/jpgraph_scatter.php +++ b/libs/jpgraph/jpgraph_scatter.php @@ -1,13 +1,13 @@ -iSize = $aSize; - $this->iArrowSize = $aArrowSize; + $this->iSize = $aSize; + $this->iArrowSize = $aArrowSize; } function SetColor($aColor) { - $this->iColor = $aColor; + $this->iColor = $aColor; } function Stroke($aImg,$x,$y,$a) { - // First rotate the center coordinates - list($x,$y) = $aImg->Rotate($x,$y); + // First rotate the center coordinates + list($x,$y) = $aImg->Rotate($x,$y); - $old_origin = $aImg->SetCenter($x,$y); - $old_a = $aImg->a; - $aImg->SetAngle(-$a+$old_a); + $old_origin = $aImg->SetCenter($x,$y); + $old_a = $aImg->a; + $aImg->SetAngle(-$a+$old_a); - $dx = round($this->iSize/2); - $c = array($x-$dx,$y,$x+$dx,$y); - $x += $dx; + $dx = round($this->iSize/2); + $c = array($x-$dx,$y,$x+$dx,$y); + $x += $dx; - list($dx,$dy) = $this->isizespec[$this->iArrowSize]; - $ca = array($x,$y,$x-$dx,$y-$dy,$x-$dx,$y+$dy,$x,$y); + list($dx,$dy) = $this->isizespec[$this->iArrowSize]; + $ca = array($x,$y,$x-$dx,$y-$dy,$x-$dx,$y+$dy,$x,$y); - $aImg->SetColor($this->iColor); - $aImg->Polygon($c); - $aImg->FilledPolygon($ca); + $aImg->SetColor($this->iColor); + $aImg->Polygon($c); + $aImg->FilledPolygon($ca); - $aImg->SetCenter($old_origin[0],$old_origin[1]); - $aImg->SetAngle($old_a); + $aImg->SetCenter($old_origin[0],$old_origin[1]); + $aImg->SetAngle($old_a); } } @@ -64,64 +66,64 @@ class FieldPlot extends Plot { public $arrow = ''; private $iAngles = array(); private $iCallback = ''; - - function FieldPlot($datay,$datax,$angles) { - if( (count($datax) != count($datay)) ) - JpGraphError::RaiseL(20001);//("Fieldplots must have equal number of X and Y points."); - if( (count($datax) != count($angles)) ) - JpGraphError::RaiseL(20002);//("Fieldplots must have an angle specified for each X and Y points."); - - $this->iAngles = $angles; - $this->Plot($datay,$datax); - $this->value->SetAlign('center','center'); - $this->value->SetMargin(15); + function __construct($datay,$datax,$angles) { + if( (count($datax) != count($datay)) ) + JpGraphError::RaiseL(20001);//("Fieldplots must have equal number of X and Y points."); + if( (count($datax) != count($angles)) ) + JpGraphError::RaiseL(20002);//("Fieldplots must have an angle specified for each X and Y points."); - $this->arrow = new FieldArrow(); + $this->iAngles = $angles; + + parent::__construct($datay,$datax); + $this->value->SetAlign('center','center'); + $this->value->SetMargin(15); + + $this->arrow = new FieldArrow(); } function SetCallback($aFunc) { - $this->iCallback = $aFunc; + $this->iCallback = $aFunc; } function Stroke($img,$xscale,$yscale) { - // Remeber base color and size - $bc = $this->arrow->iColor; - $bs = $this->arrow->iSize; - $bas = $this->arrow->iArrowSize; + // Remeber base color and size + $bc = $this->arrow->iColor; + $bs = $this->arrow->iSize; + $bas = $this->arrow->iArrowSize; - for( $i=0; $i<$this->numpoints; ++$i ) { - // Skip null values - if( $this->coords[0][$i]==="" ) - continue; + for( $i=0; $i<$this->numpoints; ++$i ) { + // Skip null values + if( $this->coords[0][$i]==="" ) + continue; - $f = $this->iCallback; - if( $f != "" ) { - list($cc,$cs,$cas) = call_user_func($f,$this->coords[1][$i],$this->coords[0][$i],$this->iAngles[$i]); - // Fall back on global data if the callback isn't set - if( $cc == "" ) $cc = $bc; - if( $cs == "" ) $cs = $bs; - if( $cas == "" ) $cas = $bas; - $this->arrow->SetColor($cc); - $this->arrow->SetSize($cs,$cas); - } + $f = $this->iCallback; + if( $f != "" ) { + list($cc,$cs,$cas) = call_user_func($f,$this->coords[1][$i],$this->coords[0][$i],$this->iAngles[$i]); + // Fall back on global data if the callback isn't set + if( $cc == "" ) $cc = $bc; + if( $cs == "" ) $cs = $bs; + if( $cas == "" ) $cas = $bas; + $this->arrow->SetColor($cc); + $this->arrow->SetSize($cs,$cas); + } - $xt = $xscale->Translate($this->coords[1][$i]); - $yt = $yscale->Translate($this->coords[0][$i]); + $xt = $xscale->Translate($this->coords[1][$i]); + $yt = $yscale->Translate($this->coords[0][$i]); - $this->arrow->Stroke($img,$xt,$yt,$this->iAngles[$i]); - $this->value->Stroke($img,$this->coords[0][$i],$xt,$yt); - } + $this->arrow->Stroke($img,$xt,$yt,$this->iAngles[$i]); + $this->value->Stroke($img,$this->coords[0][$i],$xt,$yt); + } } - + // Framework function function Legend($aGraph) { - if( $this->legend != "" ) { - $aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - } + if( $this->legend != "" ) { + $aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + } } //=================================================== @@ -129,103 +131,112 @@ class FieldPlot extends Plot { // Description: Render X and Y plots //=================================================== class ScatterPlot extends Plot { - public $mark = ''; + public $mark,$link; private $impuls = false; - private $linkpoints = false, $linkpointweight=1, $linkpointcolor="black"; -//--------------- -// CONSTRUCTOR - function ScatterPlot($datay,$datax=false) { - if( (count($datax) != count($datay)) && is_array($datax)) - JpGraphError::RaiseL(20003);//("Scatterplot must have equal number of X and Y points."); - $this->Plot($datay,$datax); - $this->mark = new PlotMark(); - $this->mark->SetType(MARK_SQUARE); - $this->mark->SetColor($this->color); - $this->value->SetAlign('center','center'); - $this->value->SetMargin(0); + //--------------- + // CONSTRUCTOR + function __construct($datay,$datax=false) { + if( (count($datax) != count($datay)) && is_array($datax)) { + JpGraphError::RaiseL(20003);//("Scatterplot must have equal number of X and Y points."); + } + parent::__construct($datay,$datax); + $this->mark = new PlotMark(); + $this->mark->SetType(MARK_SQUARE); + $this->mark->SetColor($this->color); + $this->value->SetAlign('center','center'); + $this->value->SetMargin(0); + $this->link = new LineProperty(1,'black','solid'); + $this->link->iShow = false; } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS function SetImpuls($f=true) { - $this->impuls = $f; - } + $this->impuls = $f; + } + + function SetStem($f=true) { + $this->impuls = $f; + } // Combine the scatter plot points with a line - function SetLinkPoints($aFlag=true,$aColor="black",$aWeight=1) { - $this->linkpoints=$aFlag; - $this->linkpointcolor=$aColor; - $this->linkpointweight=$aWeight; + function SetLinkPoints($aFlag=true,$aColor="black",$aWeight=1,$aStyle='solid') { + $this->link->iShow = $aFlag; + $this->link->iColor = $aColor; + $this->link->iWeight = $aWeight; + $this->link->iStyle = $aStyle; } function Stroke($img,$xscale,$yscale) { - $ymin=$yscale->scale_abs[0]; - if( $yscale->scale[0] < 0 ) - $yzero=$yscale->Translate(0); - else - $yzero=$yscale->scale_abs[0]; - - $this->csimareas = ''; - for( $i=0; $i<$this->numpoints; ++$i ) { + $ymin=$yscale->scale_abs[0]; + if( $yscale->scale[0] < 0 ) + $yzero=$yscale->Translate(0); + else + $yzero=$yscale->scale_abs[0]; - // Skip null values - if( $this->coords[0][$i]==='' || $this->coords[0][$i]==='-' || $this->coords[0][$i]==='x') - continue; + $this->csimareas = ''; + for( $i=0; $i<$this->numpoints; ++$i ) { - if( isset($this->coords[1]) ) - $xt = $xscale->Translate($this->coords[1][$i]); - else - $xt = $xscale->Translate($i); - $yt = $yscale->Translate($this->coords[0][$i]); + // Skip null values + if( $this->coords[0][$i]==='' || $this->coords[0][$i]==='-' || $this->coords[0][$i]==='x') + continue; + + if( isset($this->coords[1]) ) + $xt = $xscale->Translate($this->coords[1][$i]); + else + $xt = $xscale->Translate($i); + $yt = $yscale->Translate($this->coords[0][$i]); - if( $this->linkpoints && isset($yt_old) ) { - $img->SetColor($this->linkpointcolor); - $img->SetLineWeight($this->linkpointweight); - $img->Line($xt_old,$yt_old,$xt,$yt); - } + if( $this->link->iShow && isset($yt_old) ) { + $img->SetColor($this->link->iColor); + $img->SetLineWeight($this->link->iWeight); + $old = $img->SetLineStyle($this->link->iStyle); + $img->StyleLine($xt_old,$yt_old,$xt,$yt); + $img->SetLineStyle($old); + } - if( $this->impuls ) { - $img->SetColor($this->color); - $img->SetLineWeight($this->weight); - $img->Line($xt,$yzero,$xt,$yt); - } - - if( !empty($this->csimtargets[$i]) ) { - if( !empty($this->csimwintargets[$i]) ) { - $this->mark->SetCSIMTarget($this->csimtargets[$i],$this->csimwintargets[$i]); - } - else { - $this->mark->SetCSIMTarget($this->csimtargets[$i]); - } - $this->mark->SetCSIMAlt($this->csimalts[$i]); - } - - if( isset($this->coords[1]) ) { - $this->mark->SetCSIMAltVal($this->coords[0][$i],$this->coords[1][$i]); - } - else { - $this->mark->SetCSIMAltVal($this->coords[0][$i],$i); - } + if( $this->impuls ) { + $img->SetColor($this->color); + $img->SetLineWeight($this->weight); + $img->Line($xt,$yzero,$xt,$yt); + } - $this->mark->Stroke($img,$xt,$yt); - - $this->csimareas .= $this->mark->GetCSIMAreas(); - $this->value->Stroke($img,$this->coords[0][$i],$xt,$yt); + if( !empty($this->csimtargets[$i]) ) { + if( !empty($this->csimwintargets[$i]) ) { + $this->mark->SetCSIMTarget($this->csimtargets[$i],$this->csimwintargets[$i]); + } + else { + $this->mark->SetCSIMTarget($this->csimtargets[$i]); + } + $this->mark->SetCSIMAlt($this->csimalts[$i]); + } - $xt_old = $xt; - $yt_old = $yt; - } + if( isset($this->coords[1]) ) { + $this->mark->SetCSIMAltVal($this->coords[0][$i],$this->coords[1][$i]); + } + else { + $this->mark->SetCSIMAltVal($this->coords[0][$i],$i); + } + + $this->mark->Stroke($img,$xt,$yt); + + $this->csimareas .= $this->mark->GetCSIMAreas(); + $this->value->Stroke($img,$this->coords[0][$i],$xt,$yt); + + $xt_old = $xt; + $yt_old = $yt; + } } - + // Framework function function Legend($aGraph) { - if( $this->legend != "" ) { - $aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0, - $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); - } - } + if( $this->legend != "" ) { + $aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0, + $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget); + } + } } // Class /* EOF */ ?> \ No newline at end of file diff --git a/libs/jpgraph/jpgraph_stock.php b/libs/jpgraph/jpgraph_stock.php index 6afe3bb..45a1368 100644 --- a/libs/jpgraph/jpgraph_stock.php +++ b/libs/jpgraph/jpgraph_stock.php @@ -1,13 +1,13 @@ iTupleSize ) { - JpGraphError::RaiseL(21001,$this->iTupleSize); -//('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.'); - } - $this->Plot($datay,$datax); - $this->numpoints /= $this->iTupleSize; + //--------------- + // CONSTRUCTOR + function __construct($datay,$datax=false) { + if( count($datay) % $this->iTupleSize ) { + JpGraphError::RaiseL(21001,$this->iTupleSize); + //('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.'); + } + parent::__construct($datay,$datax); + $this->numpoints /= $this->iTupleSize; } -//--------------- -// PUBLIC METHODS - + //--------------- + // PUBLIC METHODS + function SetColor($aColor,$aColor1='white',$aColor2='darkred',$aColor3='darkred') { - $this->color = $aColor; - $this->iStockColor1 = $aColor1; - $this->iStockColor2 = $aColor2; - $this->iStockColor3 = $aColor3; + $this->color = $aColor; + $this->iStockColor1 = $aColor1; + $this->iStockColor2 = $aColor2; + $this->iStockColor3 = $aColor3; } function SetWidth($aWidth) { - // Make sure it's odd - $this->iWidth = 2*floor($aWidth/2)+1; + // Make sure it's odd + $this->iWidth = 2*floor($aWidth/2)+1; } function HideEndLines($aHide=true) { - $this->iEndLines = !$aHide; + $this->iEndLines = !$aHide; } // Gets called before any axis are stroked function PreStrokeAdjust($graph) { - if( $this->center ) { - $a=0.5; $b=0.5; - $this->numpoints++; - } else { - $a=0; $b=0; - } - $graph->xaxis->scale->ticks->SetXLabelOffset($a); - $graph->SetTextScaleOff($b); + if( $this->center ) { + $a=0.5; $b=0.5; + $this->numpoints++; + } else { + $a=0; $b=0; + } + $graph->xaxis->scale->ticks->SetXLabelOffset($a); + $graph->SetTextScaleOff($b); } - + // Method description function Stroke($img,$xscale,$yscale) { - $n=$this->numpoints; - if( $this->center ) $n--; - if( isset($this->coords[1]) ) { - if( count($this->coords[1])!=$n ) - JpGraphError::RaiseL(2003,count($this->coords[1]),$n); -//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); - else - $exist_x = true; - } - else - $exist_x = false; + $n=$this->numpoints; + if( $this->center ) $n--; + if( isset($this->coords[1]) ) { + if( count($this->coords[1])!=$n ) { + JpGraphError::RaiseL(2003,count($this->coords[1]),$n); + // ("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); + } + else { + $exist_x = true; + } + } + else { + $exist_x = false; + } - if( $exist_x ) - $xs=$this->coords[1][0]; - else - $xs=0; - - $ts = $this->iTupleSize; - $this->csimareas = ''; - for( $i=0; $i<$n; ++$i) { + if( $exist_x ) { + $xs=$this->coords[1][0]; + } + else { + $xs=0; + } - //If value is NULL, then don't draw a bar at all - if ($this->coords[0][$i] === null) continue; + $ts = $this->iTupleSize; + $this->csimareas = ''; + for( $i=0; $i<$n; ++$i) { - if( $exist_x ) $x=$this->coords[1][$i]; - else $x=$i; - $xt = $xscale->Translate($x); - - $neg = $this->coords[0][$i*$ts] > $this->coords[0][$i*$ts+1] ; - $yopen = $yscale->Translate($this->coords[0][$i*$ts]); - $yclose = $yscale->Translate($this->coords[0][$i*$ts+1]); - $ymin = $yscale->Translate($this->coords[0][$i*$ts+2]); - $ymax = $yscale->Translate($this->coords[0][$i*$ts+3]); + //If value is NULL, then don't draw a bar at all + if ($this->coords[0][$i*$ts] === null) continue; - $dx = floor($this->iWidth/2); - $xl = $xt - $dx; - $xr = $xt + $dx; + if( $exist_x ) { + $x=$this->coords[1][$i]; + if ($x === null) continue; + } + else { + $x=$i; + } + $xt = $xscale->Translate($x); - if( $neg ) - $img->SetColor($this->iStockColor3); - else - $img->SetColor($this->iStockColor1); - $img->FilledRectangle($xl,$yopen,$xr,$yclose); - $img->SetLineWeight($this->weight); - if( $neg ) - $img->SetColor($this->iStockColor2); - else - $img->SetColor($this->color); - - $img->Rectangle($xl,$yopen,$xr,$yclose); + $neg = $this->coords[0][$i*$ts] > $this->coords[0][$i*$ts+1] ; + $yopen = $yscale->Translate($this->coords[0][$i*$ts]); + $yclose = $yscale->Translate($this->coords[0][$i*$ts+1]); + $ymin = $yscale->Translate($this->coords[0][$i*$ts+2]); + $ymax = $yscale->Translate($this->coords[0][$i*$ts+3]); - if( $yopen < $yclose ) { - $ytop = $yopen ; - $ybottom = $yclose ; - } - else { - $ytop = $yclose ; - $ybottom = $yopen ; - } - $img->SetColor($this->color); - $img->Line($xt,$ytop,$xt,$ymax); - $img->Line($xt,$ybottom,$xt,$ymin); + $dx = floor($this->iWidth/2); + $xl = $xt - $dx; + $xr = $xt + $dx; - if( $this->iEndLines ) { - $img->Line($xl,$ymax,$xr,$ymax); - $img->Line($xl,$ymin,$xr,$ymin); - } + if( $neg ) { + $img->SetColor($this->iStockColor3); + } + else { + $img->SetColor($this->iStockColor1); + } + $img->FilledRectangle($xl,$yopen,$xr,$yclose); + $img->SetLineWeight($this->weight); + if( $neg ) { + $img->SetColor($this->iStockColor2); + } + else { + $img->SetColor($this->color); + } - // A chance for subclasses to add things to the bar - // for data point i - $this->ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg); + $img->Rectangle($xl,$yopen,$xr,$yclose); - // Setup image maps - if( !empty($this->csimtargets[$i]) ) { - $this->csimareas.= 'csimareas .= ' href="'.$this->csimtargets[$i].'"'; - if( !empty($this->csimalts[$i]) ) { - $sval=$this->csimalts[$i]; - $this->csimareas .= " title=\"$sval\" alt=\"$sval\" "; - } - $this->csimareas.= " />\n"; - } - } - return true; + if( $yopen < $yclose ) { + $ytop = $yopen ; + $ybottom = $yclose ; + } + else { + $ytop = $yclose ; + $ybottom = $yopen ; + } + $img->SetColor($this->color); + $img->Line($xt,$ytop,$xt,$ymax); + $img->Line($xt,$ybottom,$xt,$ymin); + + if( $this->iEndLines ) { + $img->Line($xl,$ymax,$xr,$ymax); + $img->Line($xl,$ymin,$xr,$ymin); + } + + // A chance for subclasses to add things to the bar + // for data point i + $this->ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg); + + // Setup image maps + if( !empty($this->csimtargets[$i]) ) { + $this->csimareas.= 'csimareas .= ' href="'.$this->csimtargets[$i].'"'; + if( !empty($this->csimalts[$i]) ) { + $sval=$this->csimalts[$i]; + $this->csimareas .= " title=\"$sval\" alt=\"$sval\" "; + } + $this->csimareas.= " />\n"; + } + } + return true; } // A hook for subclasses to modify the plot @@ -158,24 +172,25 @@ class StockPlot extends Plot { //=================================================== class BoxPlot extends StockPlot { private $iPColor='black',$iNColor='white'; - function BoxPlot($datay,$datax=false) { - $this->iTupleSize=5; - parent::StockPlot($datay,$datax); + + function __construct($datay,$datax=false) { + $this->iTupleSize=5; + parent::__construct($datay,$datax); } function SetMedianColor($aPos,$aNeg) { - $this->iPColor = $aPos; - $this->iNColor = $aNeg; + $this->iPColor = $aPos; + $this->iNColor = $aNeg; } function ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg) { - if( $neg ) - $img->SetColor($this->iNColor); - else - $img->SetColor($this->iPColor); - - $y = $yscale->Translate($this->coords[0][$i*5+4]); - $img->Line($xl,$y,$xr,$y); + if( $neg ) + $img->SetColor($this->iNColor); + else + $img->SetColor($this->iPColor); + + $y = $yscale->Translate($this->coords[0][$i*5+4]); + $img->Line($xl,$y,$xr,$y); } } diff --git a/libs/jpgraph/jpgraph_text.inc.php b/libs/jpgraph/jpgraph_text.inc.php new file mode 100644 index 0000000..c93846b --- /dev/null +++ b/libs/jpgraph/jpgraph_text.inc.php @@ -0,0 +1,302 @@ +t = $aTxt; + $this->x = round($aXAbsPos); + $this->y = round($aYAbsPos); + $this->margin = 0; + } + //--------------- + // PUBLIC METHODS + // Set the string in the text object + function Set($aTxt) { + $this->t = $aTxt; + } + + // Alias for Pos() + function SetPos($aXAbsPos=0,$aYAbsPos=0,$aHAlign="left",$aVAlign="top") { + //$this->Pos($aXAbsPos,$aYAbsPos,$aHAlign,$aVAlign); + $this->x = $aXAbsPos; + $this->y = $aYAbsPos; + $this->halign = $aHAlign; + $this->valign = $aVAlign; + } + + function SetScalePos($aX,$aY) { + $this->iScalePosX = $aX; + $this->iScalePosY = $aY; + } + + // Specify alignment for the text + function Align($aHAlign,$aVAlign="top",$aParagraphAlign="") { + $this->halign = $aHAlign; + $this->valign = $aVAlign; + if( $aParagraphAlign != "" ) + $this->paragraph_align = $aParagraphAlign; + } + + // Alias + function SetAlign($aHAlign,$aVAlign="top",$aParagraphAlign="") { + $this->Align($aHAlign,$aVAlign,$aParagraphAlign); + } + + // Specifies the alignment for a multi line text + function ParagraphAlign($aAlign) { + $this->paragraph_align = $aAlign; + } + + // Specifies the alignment for a multi line text + function SetParagraphAlign($aAlign) { + $this->paragraph_align = $aAlign; + } + + function SetShadow($aShadowColor='gray',$aShadowWidth=3) { + $this->ishadowwidth=$aShadowWidth; + $this->shadow=$aShadowColor; + $this->boxed=true; + } + + function SetWordWrap($aCol) { + $this->iWordwrap = $aCol ; + } + + // Specify that the text should be boxed. fcolor=frame color, bcolor=border color, + // $shadow=drop shadow should be added around the text. + function SetBox($aFrameColor=array(255,255,255),$aBorderColor=array(0,0,0),$aShadowColor=false,$aCornerRadius=4,$aShadowWidth=3) { + if( $aFrameColor === false ) { + $this->boxed=false; + } + else { + $this->boxed=true; + } + $this->fcolor=$aFrameColor; + $this->bcolor=$aBorderColor; + // For backwards compatibility when shadow was just true or false + if( $aShadowColor === true ) { + $aShadowColor = 'gray'; + } + $this->shadow=$aShadowColor; + $this->icornerradius=$aCornerRadius; + $this->ishadowwidth=$aShadowWidth; + } + + function SetBox2($aFrameColor=array(255,255,255),$aBorderColor=array(0,0,0),$aShadowColor=false,$aCornerRadius=4,$aShadowWidth=3) { + $this->iBoxType=2; + $this->SetBox($aFrameColor,$aBorderColor,$aShadowColor,$aCornerRadius,$aShadowWidth); + } + + // Hide the text + function Hide($aHide=true) { + $this->hide=$aHide; + } + + // This looks ugly since it's not a very orthogonal design + // but I added this "inverse" of Hide() to harmonize + // with some classes which I designed more recently (especially) + // jpgraph_gantt + function Show($aShow=true) { + $this->hide=!$aShow; + } + + // Specify font + function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) { + $this->font_family=$aFamily; + $this->font_style=$aStyle; + $this->font_size=$aSize; + } + + // Center the text between $left and $right coordinates + function Center($aLeft,$aRight,$aYAbsPos=false) { + $this->x = $aLeft + ($aRight-$aLeft )/2; + $this->halign = "center"; + if( is_numeric($aYAbsPos) ) + $this->y = $aYAbsPos; + } + + // Set text color + function SetColor($aColor) { + $this->color = $aColor; + } + + function SetAngle($aAngle) { + $this->SetOrientation($aAngle); + } + + // Orientation of text. Note only TTF fonts can have an arbitrary angle + function SetOrientation($aDirection=0) { + if( is_numeric($aDirection) ) + $this->dir=$aDirection; + elseif( $aDirection=="h" ) + $this->dir = 0; + elseif( $aDirection=="v" ) + $this->dir = 90; + else + JpGraphError::RaiseL(25051);//(" Invalid direction specified for text."); + } + + // Total width of text + function GetWidth($aImg) { + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $w = $aImg->GetTextWidth($this->t,$this->dir); + return $w; + } + + // Hight of font + function GetFontHeight($aImg) { + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $h = $aImg->GetFontHeight(); + return $h; + + } + + function GetTextHeight($aImg) { + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $h = $aImg->GetTextHeight($this->t,$this->dir); + return $h; + } + + function GetHeight($aImg) { + // Synonym for GetTextHeight() + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $h = $aImg->GetTextHeight($this->t,$this->dir); + return $h; + } + + // Set the margin which will be interpretated differently depending + // on the context. + function SetMargin($aMarg) { + $this->margin = $aMarg; + } + + function StrokeWithScale($aImg,$axscale,$ayscale) { + if( $this->iScalePosX === null || $this->iScalePosY === null ) { + $this->Stroke($aImg); + } + else { + $this->Stroke($aImg, + round($axscale->Translate($this->iScalePosX)), + round($ayscale->Translate($this->iScalePosY))); + } + } + + function SetCSIMTarget($aURITarget,$aAlt='',$aWinTarget='') { + $this->iCSIMtarget = $aURITarget; + $this->iCSIMalt = $aAlt; + $this->iCSIMWinTarget = $aWinTarget; + } + + function GetCSIMareas() { + if( $this->iCSIMtarget !== '' ) { + return $this->iCSIMarea; + } + else { + return ''; + } + } + + // Display text in image + function Stroke($aImg,$x=null,$y=null) { + + if( $x !== null ) $this->x = round($x); + if( $y !== null ) $this->y = round($y); + + // Insert newlines + if( $this->iWordwrap > 0 ) { + $this->t = wordwrap($this->t,$this->iWordwrap,"\n"); + } + + // If position been given as a fraction of the image size + // calculate the absolute position + if( $this->x < 1 && $this->x > 0 ) $this->x *= $aImg->width; + if( $this->y < 1 && $this->y > 0 ) $this->y *= $aImg->height; + + $aImg->PushColor($this->color); + $aImg->SetFont($this->font_family,$this->font_style,$this->font_size); + $aImg->SetTextAlign($this->halign,$this->valign); + + if( $this->boxed ) { + if( $this->fcolor=="nofill" ) { + $this->fcolor=false; + } + + $oldweight=$aImg->SetLineWeight(1); + + if( $this->iBoxType == 2 && $this->font_family > FF_FONT2+2 ) { + + $bbox = $aImg->StrokeBoxedText2($this->x, $this->y, + $this->t, $this->dir, + $this->fcolor, + $this->bcolor, + $this->shadow, + $this->paragraph_align, + 2,4, + $this->icornerradius, + $this->ishadowwidth); + } + else { + $bbox = $aImg->StrokeBoxedText($this->x,$this->y,$this->t, + $this->dir,$this->fcolor,$this->bcolor,$this->shadow, + $this->paragraph_align,3,3,$this->icornerradius, + $this->ishadowwidth); + } + + $aImg->SetLineWeight($oldweight); + } + else { + $debug=false; + $bbox = $aImg->StrokeText($this->x,$this->y,$this->t,$this->dir,$this->paragraph_align,$debug); + } + + // Create CSIM targets + $coords = $bbox[0].','.$bbox[1].','.$bbox[2].','.$bbox[3].','.$bbox[4].','.$bbox[5].','.$bbox[6].','.$bbox[7]; + $this->iCSIMarea = "iCSIMtarget)."\" "; + if( trim($this->iCSIMalt) != '' ) { + $this->iCSIMarea .= " alt=\"".$this->iCSIMalt."\" "; + $this->iCSIMarea .= " title=\"".$this->iCSIMalt."\" "; + } + if( trim($this->iCSIMWinTarget) != '' ) { + $this->iCSIMarea .= " target=\"".$this->iCSIMWinTarget."\" "; + } + $this->iCSIMarea .= " />\n"; + + $aImg->PopColor($this->color); + } +} // Class + + +?> diff --git a/libs/jpgraph/jpgraph_ttf.inc.php b/libs/jpgraph/jpgraph_ttf.inc.php index 02050ee..1e0d524 100644 --- a/libs/jpgraph/jpgraph_ttf.inc.php +++ b/libs/jpgraph/jpgraph_ttf.inc.php @@ -1,73 +1,152 @@ g2312 == null ) { - include_once 'jpgraph_gb2312.php' ; - $this->g2312 = new GB2312toUTF8(); - } - return $this->g2312->gb2utf8($aTxt); - } - elseif( $aFF === FF_CHINESE ) { - if( !function_exists('iconv') ) { - JpGraphError::RaiseL(25006); -//('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).'); - } - return iconv('BIG5','UTF-8',$aTxt); - } - elseif( ASSUME_EUCJP_ENCODING && - ($aFF == FF_MINCHO || $aFF == FF_GOTHIC || $aFF == FF_PMINCHO || $aFF == FF_PGOTHIC) ) { - if( !function_exists('mb_convert_encoding') ) { - JpGraphError::RaiseL(25127); - } - return mb_convert_encoding($aTxt, 'UTF-8','EUC-JP'); - } - elseif( $aFF == FF_DAVID || $aFF == FF_MIRIAM || $aFF == FF_AHRON ) { - return LanguageConv::heb_iso2uni($aTxt); - } - else - return $aTxt; + if( LANGUAGE_GREEK ) { + if( GREEK_FROM_WINDOWS ) { + $unistring = LanguageConv::gr_win2uni($aTxt); + } else { + $unistring = LanguageConv::gr_iso2uni($aTxt); + } + return $unistring; + } elseif( LANGUAGE_CYRILLIC ) { + if( CYRILLIC_FROM_WINDOWS && (!defined('LANGUAGE_CHARSET') || stristr(LANGUAGE_CHARSET, 'windows-1251')) ) { + $aTxt = convert_cyr_string($aTxt, "w", "k"); + } + if( !defined('LANGUAGE_CHARSET') || stristr(LANGUAGE_CHARSET, 'koi8-r') || stristr(LANGUAGE_CHARSET, 'windows-1251')) { + $isostring = convert_cyr_string($aTxt, "k", "i"); + $unistring = LanguageConv::iso2uni($isostring); + } + else { + $unistring = $aTxt; + } + return $unistring; + } + elseif( $aFF === FF_SIMSUN ) { + // Do Chinese conversion + if( $this->g2312 == null ) { + include_once 'jpgraph_gb2312.php' ; + $this->g2312 = new GB2312toUTF8(); + } + return $this->g2312->gb2utf8($aTxt); + } + elseif( $aFF === FF_BIG5 ) { + if( !function_exists('iconv') ) { + JpGraphError::RaiseL(25006); + //('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).'); + } + return iconv('BIG5','UTF-8',$aTxt); + } + elseif( ASSUME_EUCJP_ENCODING && + ($aFF == FF_MINCHO || $aFF == FF_GOTHIC || $aFF == FF_PMINCHO || $aFF == FF_PGOTHIC) ) { + if( !function_exists('mb_convert_encoding') ) { + JpGraphError::RaiseL(25127); + } + return mb_convert_encoding($aTxt, 'UTF-8','EUC-JP'); + } + elseif( $aFF == FF_DAVID || $aFF == FF_MIRIAM || $aFF == FF_AHRON ) { + return LanguageConv::heb_iso2uni($aTxt); + } + else + return $aTxt; } // Translate iso encoding to unicode public static function iso2uni ($isoline){ - $uniline=''; - for ($i=0; $i < strlen($isoline); $i++){ - $thischar=substr($isoline,$i,1); - $charcode=ord($thischar); - $uniline.=($charcode>175) ? "&#" . (1040+($charcode-176)). ";" : $thischar; - } - return $uniline; + $uniline=''; + for ($i=0; $i < strlen($isoline); $i++){ + $thischar=substr($isoline,$i,1); + $charcode=ord($thischar); + $uniline.=($charcode>175) ? "&#" . (1040+($charcode-176)). ";" : $thischar; + } + return $uniline; } // Translate greek iso encoding to unicode public static function gr_iso2uni ($isoline) { - $uniline=''; - for ($i=0; $i < strlen($isoline); $i++) { - $thischar=substr($isoline,$i,1); - $charcode=ord($thischar); - $uniline.=($charcode>179 && $charcode!=183 && $charcode!=187 && $charcode!=189) ? "&#" . (900+($charcode-180)). ";" : $thischar; - } - return $uniline; + $uniline=''; + for ($i=0; $i < strlen($isoline); $i++) { + $thischar=substr($isoline,$i,1); + $charcode=ord($thischar); + $uniline.=($charcode>179 && $charcode!=183 && $charcode!=187 && $charcode!=189) ? "&#" . (900+($charcode-180)). ";" : $thischar; + } + return $uniline; } // Translate greek win encoding to unicode public static function gr_win2uni ($winline) { - $uniline=''; - for ($i=0; $i < strlen($winline); $i++) { - $thischar=substr($winline,$i,1); - $charcode=ord($thischar); - if ($charcode==161 || $charcode==162) { - $uniline.="&#" . (740+$charcode). ";"; - } - else { - $uniline.=(($charcode>183 && $charcode!=187 && $charcode!=189) || $charcode==180) ? "&#" . (900+($charcode-180)). ";" : $thischar; - } - } - return $uniline; + $uniline=''; + for ($i=0; $i < strlen($winline); $i++) { + $thischar=substr($winline,$i,1); + $charcode=ord($thischar); + if ($charcode==161 || $charcode==162) { + $uniline.="&#" . (740+$charcode). ";"; + } + else { + $uniline.=(($charcode>183 && $charcode!=187 && $charcode!=189) || $charcode==180) ? "&#" . (900+($charcode-180)). ";" : $thischar; + } + } + return $uniline; } public static function heb_iso2uni($isoline) { - $isoline = hebrev($isoline); - $o = ''; + $isoline = hebrev($isoline); + $o = ''; - $n = strlen($isoline); - for($i=0; $i < $n; $i++) { - $c=ord( substr($isoline,$i,1) ); - $o .= ($c > 223) && ($c < 251) ? '&#'.(1264+$c).';' : chr($c); - } - return utf8_encode($o); + $n = strlen($isoline); + for($i=0; $i < $n; $i++) { + $c=ord( substr($isoline,$i,1) ); + $o .= ($c > 223) && ($c < 251) ? '&#'.(1264+$c).';' : chr($c); + } + return utf8_encode($o); } } //============================================================= // CLASS TTF -// Description: Handle TTF font names and mapping and loading of +// Description: Handle TTF font names and mapping and loading of // font files //============================================================= class TTF { private $font_files,$style_names; -//--------------- -// CONSTRUCTOR - function TTF() { + function __construct() { - // String names for font styles to be used in error messages - $this->style_names=array(FS_NORMAL =>'normal', - FS_BOLD =>'bold', - FS_ITALIC =>'italic', - FS_BOLDITALIC =>'bolditalic'); + // String names for font styles to be used in error messages + $this->style_names=array( + FS_NORMAL =>'normal', + FS_BOLD =>'bold', + FS_ITALIC =>'italic', + FS_BOLDITALIC =>'bolditalic'); - // File names for available fonts - $this->font_files=array( - FF_COURIER => array(FS_NORMAL =>'cour.ttf', - FS_BOLD =>'courbd.ttf', - FS_ITALIC =>'couri.ttf', - FS_BOLDITALIC =>'courbi.ttf' ), - FF_GEORGIA => array(FS_NORMAL =>'georgia.ttf', - FS_BOLD =>'georgiab.ttf', - FS_ITALIC =>'georgiai.ttf', - FS_BOLDITALIC =>'' ), - FF_TREBUCHE =>array(FS_NORMAL =>'trebuc.ttf', - FS_BOLD =>'trebucbd.ttf', - FS_ITALIC =>'trebucit.ttf', - FS_BOLDITALIC =>'trebucbi.ttf' ), - FF_VERDANA => array(FS_NORMAL =>'verdana.ttf', - FS_BOLD =>'verdanab.ttf', - FS_ITALIC =>'verdanai.ttf', - FS_BOLDITALIC =>'' ), - FF_TIMES => array(FS_NORMAL =>'times.ttf', - FS_BOLD =>'timesbd.ttf', - FS_ITALIC =>'timesi.ttf', - FS_BOLDITALIC =>'timesbi.ttf' ), - FF_COMIC => array(FS_NORMAL =>'comic.ttf', - FS_BOLD =>'comicbd.ttf', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_ARIAL => array(FS_NORMAL =>'arial.ttf', - FS_BOLD =>'arialbd.ttf', - FS_ITALIC =>'ariali.ttf', - FS_BOLDITALIC =>'arialbi.ttf' ) , - FF_VERA => array(FS_NORMAL =>'Vera.ttf', - FS_BOLD =>'VeraBd.ttf', - FS_ITALIC =>'VeraIt.ttf', - FS_BOLDITALIC =>'VeraBI.ttf' ), - FF_VERAMONO => array(FS_NORMAL =>'VeraMono.ttf', - FS_BOLD =>'VeraMoBd.ttf', - FS_ITALIC =>'VeraMoIt.ttf', - FS_BOLDITALIC =>'VeraMoBI.ttf' ), - FF_VERASERIF=> array(FS_NORMAL =>'VeraSe.ttf', - FS_BOLD =>'VeraSeBd.ttf', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ) , + // File names for available fonts + $this->font_files=array( + FF_COURIER => array(FS_NORMAL =>'cour.ttf', + FS_BOLD =>'courbd.ttf', + FS_ITALIC =>'couri.ttf', + FS_BOLDITALIC =>'courbi.ttf' ), + FF_GEORGIA => array(FS_NORMAL =>'georgia.ttf', + FS_BOLD =>'georgiab.ttf', + FS_ITALIC =>'georgiai.ttf', + FS_BOLDITALIC =>'' ), + FF_TREBUCHE =>array(FS_NORMAL =>'trebuc.ttf', + FS_BOLD =>'trebucbd.ttf', + FS_ITALIC =>'trebucit.ttf', + FS_BOLDITALIC =>'trebucbi.ttf' ), + FF_VERDANA => array(FS_NORMAL =>'verdana.ttf', + FS_BOLD =>'verdanab.ttf', + FS_ITALIC =>'verdanai.ttf', + FS_BOLDITALIC =>'' ), + FF_TIMES => array(FS_NORMAL =>'times.ttf', + FS_BOLD =>'timesbd.ttf', + FS_ITALIC =>'timesi.ttf', + FS_BOLDITALIC =>'timesbi.ttf' ), + FF_COMIC => array(FS_NORMAL =>'comic.ttf', + FS_BOLD =>'comicbd.ttf', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_ARIAL => array(FS_NORMAL =>'arial.ttf', + FS_BOLD =>'arialbd.ttf', + FS_ITALIC =>'ariali.ttf', + FS_BOLDITALIC =>'arialbi.ttf' ) , + FF_VERA => array(FS_NORMAL =>'Vera.ttf', + FS_BOLD =>'VeraBd.ttf', + FS_ITALIC =>'VeraIt.ttf', + FS_BOLDITALIC =>'VeraBI.ttf' ), + FF_VERAMONO => array(FS_NORMAL =>'VeraMono.ttf', + FS_BOLD =>'VeraMoBd.ttf', + FS_ITALIC =>'VeraMoIt.ttf', + FS_BOLDITALIC =>'VeraMoBI.ttf' ), + FF_VERASERIF=> array(FS_NORMAL =>'VeraSe.ttf', + FS_BOLD =>'VeraSeBd.ttf', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ) , /* Chinese fonts */ - FF_SIMSUN => array(FS_NORMAL =>'simsun.ttc', - FS_BOLD =>'simhei.ttf', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_CHINESE => array(FS_NORMAL =>CHINESE_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_SIMSUN => array( + FS_NORMAL =>'simsun.ttc', + FS_BOLD =>'simhei.ttf', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_CHINESE => array( + FS_NORMAL =>CHINESE_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_BIG5 => array( + FS_NORMAL =>CHINESE_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), /* Japanese fonts */ - FF_MINCHO => array(FS_NORMAL =>MINCHO_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_PMINCHO => array(FS_NORMAL =>PMINCHO_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_GOTHIC => array(FS_NORMAL =>GOTHIC_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_PGOTHIC => array(FS_NORMAL =>PGOTHIC_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_MINCHO => array(FS_NORMAL =>PMINCHO_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_MINCHO => array( + FS_NORMAL =>MINCHO_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + + FF_PMINCHO => array( + FS_NORMAL =>PMINCHO_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + + FF_GOTHIC => array( + FS_NORMAL =>GOTHIC_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + + FF_PGOTHIC => array( + FS_NORMAL =>PGOTHIC_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), /* Hebrew fonts */ - FF_DAVID => array(FS_NORMAL =>'DAVIDNEW.TTF', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_DAVID => array( + FS_NORMAL =>'DAVIDNEW.TTF', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), - FF_MIRIAM => array(FS_NORMAL =>'MRIAMY.TTF', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_MIRIAM => array( + FS_NORMAL =>'MRIAMY.TTF', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), - FF_AHRON => array(FS_NORMAL =>'ahronbd.ttf', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_AHRON => array( + FS_NORMAL =>'ahronbd.ttf', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), /* Misc fonts */ - FF_DIGITAL => array(FS_NORMAL =>'DIGIRU__.TTF', - FS_BOLD =>'Digirtu_.ttf', - FS_ITALIC =>'Digir___.ttf', - FS_BOLDITALIC =>'DIGIRT__.TTF' ), - FF_SPEEDO => array(FS_NORMAL =>'Speedo.ttf', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_COMPUTER => array(FS_NORMAL =>'COMPUTER.TTF', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_CALCULATOR => array(FS_NORMAL =>'Triad_xs.ttf', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - ); + FF_DIGITAL => array( + FS_NORMAL =>'DIGIRU__.TTF', + FS_BOLD =>'Digirtu_.ttf', + FS_ITALIC =>'Digir___.ttf', + FS_BOLDITALIC =>'DIGIRT__.TTF' ), + + /* This is an experimental font for the speedometer development + FF_SPEEDO => array( + FS_NORMAL =>'Speedo.ttf', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + */ + + FF_COMPUTER => array( + FS_NORMAL =>'COMPUTER.TTF', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + + FF_CALCULATOR => array( + FS_NORMAL =>'Triad_xs.ttf', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + + /* Dejavu fonts */ + FF_DV_SANSSERIF => array( + FS_NORMAL =>array('DejaVuSans.ttf'), + FS_BOLD =>array('DejaVuSans-Bold.ttf','DejaVuSansBold.ttf'), + FS_ITALIC =>array('DejaVuSans-Oblique.ttf','DejaVuSansOblique.ttf'), + FS_BOLDITALIC =>array('DejaVuSans-BoldOblique.ttf','DejaVuSansBoldOblique.ttf') ), + + FF_DV_SANSSERIFMONO => array( + FS_NORMAL =>array('DejaVuSansMono.ttf','DejaVuMonoSans.ttf'), + FS_BOLD =>array('DejaVuSansMono-Bold.ttf','DejaVuMonoSansBold.ttf'), + FS_ITALIC =>array('DejaVuSansMono-Oblique.ttf','DejaVuMonoSansOblique.ttf'), + FS_BOLDITALIC =>array('DejaVuSansMono-BoldOblique.ttf','DejaVuMonoSansBoldOblique.ttf') ), + + FF_DV_SANSSERIFCOND => array( + FS_NORMAL =>array('DejaVuSansCondensed.ttf','DejaVuCondensedSans.ttf'), + FS_BOLD =>array('DejaVuSansCondensed-Bold.ttf','DejaVuCondensedSansBold.ttf'), + FS_ITALIC =>array('DejaVuSansCondensed-Oblique.ttf','DejaVuCondensedSansOblique.ttf'), + FS_BOLDITALIC =>array('DejaVuSansCondensed-BoldOblique.ttf','DejaVuCondensedSansBoldOblique.ttf') ), + + FF_DV_SERIF => array( + FS_NORMAL =>array('DejaVuSerif.ttf'), + FS_BOLD =>array('DejaVuSerif-Bold.ttf','DejaVuSerifBold.ttf'), + FS_ITALIC =>array('DejaVuSerif-Italic.ttf','DejaVuSerifItalic.ttf'), + FS_BOLDITALIC =>array('DejaVuSerif-BoldItalic.ttf','DejaVuSerifBoldItalic.ttf') ), + + FF_DV_SERIFCOND => array( + FS_NORMAL =>array('DejaVuSerifCondensed.ttf','DejaVuCondensedSerif.ttf'), + FS_BOLD =>array('DejaVuSerifCondensed-Bold.ttf','DejaVuCondensedSerifBold.ttf'), + FS_ITALIC =>array('DejaVuSerifCondensed-Italic.ttf','DejaVuCondensedSerifItalic.ttf'), + FS_BOLDITALIC =>array('DejaVuSerifCondensed-BoldItalic.ttf','DejaVuCondensedSerifBoldItalic.ttf') ), + + + /* Placeholders for defined fonts */ + FF_USERFONT1 => array( + FS_NORMAL =>'', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + + FF_USERFONT2 => array( + FS_NORMAL =>'', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + + FF_USERFONT3 => array( + FS_NORMAL =>'', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + + ); } -//--------------- -// PUBLIC METHODS + //--------------- + // PUBLIC METHODS // Create the TTF file from the font specification function File($family,$style=FS_NORMAL) { - $fam = @$this->font_files[$family]; - if( !$fam ) { - JpGraphError::RaiseL(25046,$family);//("Specified TTF font family (id=$family) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/"); - } - $f = @$fam[$style]; + $fam = @$this->font_files[$family]; + if( !$fam ) { + JpGraphError::RaiseL(25046,$family);//("Specified TTF font family (id=$family) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/"); + } + $ff = @$fam[$style]; - if( $f==='' ) - JpGraphError::RaiseL(25047,$this->style_names[$style],$this->font_files[$family][FS_NORMAL]);//('Style "'.$this->style_names[$style].'" is not available for font family '.$this->font_files[$family][FS_NORMAL].'.'); - if( !$f ) { - JpGraphError::RaiseL(25048,$fam);//("Unknown font style specification [$fam]."); - } + if( is_array($ff) ) { + // There are several optional file names. They are tried in order + // and the first one found is used + $n = count($ff); + } else { + $n = 1; + $ff = array($ff); + } + $i = 0; + do { + $f = $ff[$i]; + // All font families are guaranteed to have the normal style - if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) { - $f = MBTTF_DIR.$f; - } else { - $f = TTF_DIR.$f; - } + if( $f==='' ) + JpGraphError::RaiseL(25047,$this->style_names[$style],$this->font_files[$family][FS_NORMAL]);//('Style "'.$this->style_names[$style].'" is not available for font family '.$this->font_files[$family][FS_NORMAL].'.'); + if( !$f ) { + JpGraphError::RaiseL(25048,$fam);//("Unknown font style specification [$fam]."); + } - if( file_exists($f) === false || is_readable($f) === false ) { - JpGraphError::RaiseL(25049,$f);//("Font file \"$f\" is not readable or does not exist."); - } - return $f; + if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) { + $f = MBTTF_DIR.$f; + } else { + $f = TTF_DIR.$f; + } + ++$i; + } while( $i < $n && (file_exists($f) === false || is_readable($f) === false) ); + + if( !file_exists($f) ) { + JpGraphError::RaiseL(25049,$f);//("Font file \"$f\" is not readable or does not exist."); + } + return $f; } + + function SetUserFont($aNormal,$aBold='',$aItalic='',$aBoldIt='') { + $this->font_files[FF_USERFONT] = + array(FS_NORMAL => $aNormal, + FS_BOLD => $aBold, + FS_ITALIC => $aItalic, + FS_BOLDITALIC => $aBoldIt ) ; + } + + function SetUserFont1($aNormal,$aBold='',$aItalic='',$aBoldIt='') { + $this->font_files[FF_USERFONT1] = + array(FS_NORMAL => $aNormal, + FS_BOLD => $aBold, + FS_ITALIC => $aItalic, + FS_BOLDITALIC => $aBoldIt ) ; + } + + function SetUserFont2($aNormal,$aBold='',$aItalic='',$aBoldIt='') { + $this->font_files[FF_USERFONT2] = + array(FS_NORMAL => $aNormal, + FS_BOLD => $aBold, + FS_ITALIC => $aItalic, + FS_BOLDITALIC => $aBoldIt ) ; + } + + function SetUserFont3($aNormal,$aBold='',$aItalic='',$aBoldIt='') { + $this->font_files[FF_USERFONT3] = + array(FS_NORMAL => $aNormal, + FS_BOLD => $aBold, + FS_ITALIC => $aItalic, + FS_BOLDITALIC => $aBoldIt ) ; + } + } // Class +//============================================================================= +// CLASS SymChar +// Description: Code values for some commonly used characters that +// normally isn't available directly on the keyboard, for example +// mathematical and greek symbols. +//============================================================================= +class SymChar { + static function Get($aSymb,$aCapital=FALSE) { + $iSymbols = array( + /* Greek */ + array('alpha','03B1','0391'), + array('beta','03B2','0392'), + array('gamma','03B3','0393'), + array('delta','03B4','0394'), + array('epsilon','03B5','0395'), + array('zeta','03B6','0396'), + array('ny','03B7','0397'), + array('eta','03B8','0398'), + array('theta','03B8','0398'), + array('iota','03B9','0399'), + array('kappa','03BA','039A'), + array('lambda','03BB','039B'), + array('mu','03BC','039C'), + array('nu','03BD','039D'), + array('xi','03BE','039E'), + array('omicron','03BF','039F'), + array('pi','03C0','03A0'), + array('rho','03C1','03A1'), + array('sigma','03C3','03A3'), + array('tau','03C4','03A4'), + array('upsilon','03C5','03A5'), + array('phi','03C6','03A6'), + array('chi','03C7','03A7'), + array('psi','03C8','03A8'), + array('omega','03C9','03A9'), + /* Money */ + array('euro','20AC'), + array('yen','00A5'), + array('pound','20A4'), + /* Math */ + array('approx','2248'), + array('neq','2260'), + array('not','2310'), + array('def','2261'), + array('inf','221E'), + array('sqrt','221A'), + array('int','222B'), + /* Misc */ + array('copy','00A9'), + array('para','00A7'), + array('tm','2122'), /* Trademark symbol */ + array('rtm','00AE'), /* Registered trademark */ + array('degree','00b0'), + array('lte','2264'), /* Less than or equal */ + array('gte','2265'), /* Greater than or equal */ + + ); + + $n = count($iSymbols); + $i=0; + $found = false; + $aSymb = strtolower($aSymb); + while( $i < $n && !$found ) { + $found = $aSymb === $iSymbols[$i++][0]; + } + if( $found ) { + $ca = $iSymbols[--$i]; + if( $aCapital && count($ca)==3 ) + $s = $ca[2]; + else + $s = $ca[1]; + return sprintf('&#%04d;',hexdec($s)); + } + else + return ''; + } +} + ?> diff --git a/libs/jpgraph/jpgraph_utils.inc.php b/libs/jpgraph/jpgraph_utils.inc.php index af76d3a..bd9fc91 100644 --- a/libs/jpgraph/jpgraph_utils.inc.php +++ b/libs/jpgraph/jpgraph_utils.inc.php @@ -1,122 +1,47 @@ iFunc = $aFunc; - $this->iXFunc = $aXFunc; + + function __construct($aFunc,$aXFunc='') { + $this->iFunc = $aFunc; + $this->iXFunc = $aXFunc; } - + function E($aXMin,$aXMax,$aSteps=50) { - $this->iMin = $aXMin; - $this->iMax = $aXMax; - $this->iStepSize = ($aXMax-$aXMin)/$aSteps; + $this->iMin = $aXMin; + $this->iMax = $aXMax; + $this->iStepSize = ($aXMax-$aXMin)/$aSteps; - if( $this->iXFunc != '' ) - $t = 'for($i='.$aXMin.'; $i<='.$aXMax.'; $i += '.$this->iStepSize.') {$ya[]='.$this->iFunc.';$xa[]='.$this->iXFunc.';}'; - elseif( $this->iFunc != '' ) - $t = 'for($x='.$aXMin.'; $x<='.$aXMax.'; $x += '.$this->iStepSize.') {$ya[]='.$this->iFunc.';$xa[]=$x;} $x='.$aXMax.';$ya[]='.$this->iFunc.';$xa[]=$x;'; - else - JpGraphError::RaiseL(24001);//('FuncGenerator : No function specified. '); - - @eval($t); - - // If there is an error in the function specifcation this is the only - // way we can discover that. - if( empty($xa) || empty($ya) ) - JpGraphError::RaiseL(24002);//('FuncGenerator : Syntax error in function specification '); - - return array($xa,$ya); - } -} + if( $this->iXFunc != '' ) + $t = 'for($i='.$aXMin.'; $i<='.$aXMax.'; $i += '.$this->iStepSize.') {$ya[]='.$this->iFunc.';$xa[]='.$this->iXFunc.';}'; + elseif( $this->iFunc != '' ) + $t = 'for($x='.$aXMin.'; $x<='.$aXMax.'; $x += '.$this->iStepSize.') {$ya[]='.$this->iFunc.';$xa[]=$x;} $x='.$aXMax.';$ya[]='.$this->iFunc.';$xa[]=$x;'; + else + JpGraphError::RaiseL(24001);//('FuncGenerator : No function specified. '); -//============================================================================= -// CLASS SymChar -// Description: Code values for some commonly used characters that -// normally isn't available directly on the keyboard, for example -// mathematical and greek symbols. -//============================================================================= -class SymChar { - static function Get($aSymb,$aCapital=FALSE) { - $iSymbols = array( - /* Greek */ - array('alpha','03B1','0391'), - array('beta','03B2','0392'), - array('gamma','03B3','0393'), - array('delta','03B4','0394'), - array('epsilon','03B5','0395'), - array('zeta','03B6','0396'), - array('ny','03B7','0397'), - array('eta','03B8','0398'), - array('theta','03B8','0398'), - array('iota','03B9','0399'), - array('kappa','03BA','039A'), - array('lambda','03BB','039B'), - array('mu','03BC','039C'), - array('nu','03BD','039D'), - array('xi','03BE','039E'), - array('omicron','03BF','039F'), - array('pi','03C0','03A0'), - array('rho','03C1','03A1'), - array('sigma','03C3','03A3'), - array('tau','03C4','03A4'), - array('upsilon','03C5','03A5'), - array('phi','03C6','03A6'), - array('chi','03C7','03A7'), - array('psi','03C8','03A8'), - array('omega','03C9','03A9'), - /* Money */ - array('euro','20AC'), - array('yen','00A5'), - array('pound','20A4'), - /* Math */ - array('approx','2248'), - array('neq','2260'), - array('not','2310'), - array('def','2261'), - array('inf','221E'), - array('sqrt','221A'), - array('int','222B'), - /* Misc */ - array('copy','00A9'), - array('para','00A7'), - array('tm','2122'), /* Trademark symbol */ - array('rtm','00AE') /* Registered trademark */ + @eval($t); -); + // If there is an error in the function specifcation this is the only + // way we can discover that. + if( empty($xa) || empty($ya) ) + JpGraphError::RaiseL(24002);//('FuncGenerator : Syntax error in function specification '); - $n = count($iSymbols); - $i=0; - $found = false; - $aSymb = strtolower($aSymb); - while( $i < $n && !$found ) { - $found = $aSymb === $iSymbols[$i++][0]; - } - if( $found ) { - $ca = $iSymbols[--$i]; - if( $aCapital && count($ca)==3 ) - $s = $ca[2]; - else - $s = $ca[1]; - return sprintf('&#%04d;',hexdec($s)); - } - else - return ''; + return array($xa,$ya); } } @@ -125,402 +50,636 @@ class SymChar { // CLASS DateScaleUtils // Description: Help to create a manual date scale //============================================================================= -DEFINE('DSUTILS_MONTH',1); // Major and minor ticks on a monthly basis -DEFINE('DSUTILS_MONTH1',1); // Major and minor ticks on a monthly basis -DEFINE('DSUTILS_MONTH2',2); // Major ticks on a bi-monthly basis -DEFINE('DSUTILS_MONTH3',3); // Major icks on a tri-monthly basis -DEFINE('DSUTILS_MONTH6',4); // Major on a six-monthly basis -DEFINE('DSUTILS_WEEK1',5); // Major ticks on a weekly basis -DEFINE('DSUTILS_WEEK2',6); // Major ticks on a bi-weekly basis -DEFINE('DSUTILS_WEEK4',7); // Major ticks on a quod-weekly basis -DEFINE('DSUTILS_DAY1',8); // Major ticks on a daily basis -DEFINE('DSUTILS_DAY2',9); // Major ticks on a bi-daily basis -DEFINE('DSUTILS_DAY4',10); // Major ticks on a qoud-daily basis -DEFINE('DSUTILS_YEAR1',11); // Major ticks on a yearly basis -DEFINE('DSUTILS_YEAR2',12); // Major ticks on a bi-yearly basis -DEFINE('DSUTILS_YEAR5',13); // Major ticks on a five-yearly basis +define('DSUTILS_MONTH',1); // Major and minor ticks on a monthly basis +define('DSUTILS_MONTH1',1); // Major and minor ticks on a monthly basis +define('DSUTILS_MONTH2',2); // Major ticks on a bi-monthly basis +define('DSUTILS_MONTH3',3); // Major icks on a tri-monthly basis +define('DSUTILS_MONTH6',4); // Major on a six-monthly basis +define('DSUTILS_WEEK1',5); // Major ticks on a weekly basis +define('DSUTILS_WEEK2',6); // Major ticks on a bi-weekly basis +define('DSUTILS_WEEK4',7); // Major ticks on a quod-weekly basis +define('DSUTILS_DAY1',8); // Major ticks on a daily basis +define('DSUTILS_DAY2',9); // Major ticks on a bi-daily basis +define('DSUTILS_DAY4',10); // Major ticks on a qoud-daily basis +define('DSUTILS_YEAR1',11); // Major ticks on a yearly basis +define('DSUTILS_YEAR2',12); // Major ticks on a bi-yearly basis +define('DSUTILS_YEAR5',13); // Major ticks on a five-yearly basis class DateScaleUtils { - public $iMin=0, $iMax=0; + public static $iMin=0, $iMax=0; - private $starthour,$startmonth, $startday, $startyear; - private $endmonth, $endyear, $endday; - private $tickPositions=array(),$minTickPositions=array(); - private $iUseWeeks = true; + private static $starthour,$startmonth, $startday, $startyear; + private static $endmonth, $endyear, $endday; + private static $tickPositions=array(),$minTickPositions=array(); + private static $iUseWeeks = true; - function UseWeekFormat($aFlg) { - $this->iUseWeeks = $aFlg; + static function UseWeekFormat($aFlg) { + self::$iUseWeeks = $aFlg; } - function doYearly($aType,$aMinor=false) { - $i=0; $j=0; - $m = $this->startmonth; - $y = $this->startyear; + static function doYearly($aType,$aMinor=false) { + $i=0; $j=0; + $m = self::$startmonth; + $y = self::$startyear; - if( $this->startday == 1 ) { - $this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y); - } - ++$m; + if( self::$startday == 1 ) { + self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y); + } + ++$m; - switch( $aType ) { - case DSUTILS_YEAR1: - for($y=$this->startyear; $y <= $this->endyear; ++$y ) { - if( $aMinor ) { - while( $m <= 12 ) { - if( !($y == $this->endyear && $m > $this->endmonth) ) { - $this->minTickPositions[$j++] = mktime(0,0,0,$m,1,$y); - } - ++$m; - } - $m=1; - } - $this->tickPositions[$i++] = mktime(0,0,0,1,1,$y); - } - break; - case DSUTILS_YEAR2: - $y=$this->startyear; - while( $y <= $this->endyear ) { - $this->tickPositions[$i++] = mktime(0,0,0,1,1,$y); - for($k=0; $k < 1; ++$k ) { - ++$y; - if( $aMinor ) { - $this->minTickPositions[$j++] = mktime(0,0,0,1,1,$y); - } - } - ++$y; - } - break; - case DSUTILS_YEAR5: - $y=$this->startyear; - while( $y <= $this->endyear ) { - $this->tickPositions[$i++] = mktime(0,0,0,1,1,$y); - for($k=0; $k < 4; ++$k ) { - ++$y; - if( $aMinor ) { - $this->minTickPositions[$j++] = mktime(0,0,0,1,1,$y); - } - } - ++$y; - } - break; - } + switch( $aType ) { + case DSUTILS_YEAR1: + for($y=self::$startyear; $y <= self::$endyear; ++$y ) { + if( $aMinor ) { + while( $m <= 12 ) { + if( !($y == self::$endyear && $m > self::$endmonth) ) { + self::$minTickPositions[$j++] = mktime(0,0,0,$m,1,$y); + } + ++$m; + } + $m=1; + } + self::$tickPositions[$i++] = mktime(0,0,0,1,1,$y); + } + break; + case DSUTILS_YEAR2: + $y=self::$startyear; + while( $y <= self::$endyear ) { + self::$tickPositions[$i++] = mktime(0,0,0,1,1,$y); + for($k=0; $k < 1; ++$k ) { + ++$y; + if( $aMinor ) { + self::$minTickPositions[$j++] = mktime(0,0,0,1,1,$y); + } + } + ++$y; + } + break; + case DSUTILS_YEAR5: + $y=self::$startyear; + while( $y <= self::$endyear ) { + self::$tickPositions[$i++] = mktime(0,0,0,1,1,$y); + for($k=0; $k < 4; ++$k ) { + ++$y; + if( $aMinor ) { + self::$minTickPositions[$j++] = mktime(0,0,0,1,1,$y); + } + } + ++$y; + } + break; + } } - function doDaily($aType,$aMinor=false) { - $m = $this->startmonth; - $y = $this->startyear; - $d = $this->startday; - $h = $this->starthour; - $i=0;$j=0; + static function doDaily($aType,$aMinor=false) { + $m = self::$startmonth; + $y = self::$startyear; + $d = self::$startday; + $h = self::$starthour; + $i=0;$j=0; - if( $h == 0 ) { - $this->tickPositions[$i++] = mktime(0,0,0,$m,$d,$y); - $t = mktime(0,0,0,$m,$d,$y); - } - else { - $t = mktime(0,0,0,$m,$d,$y); - } - switch($aType) { - case DSUTILS_DAY1: - while( $t <= $this->iMax ) { - $t += 3600*24; - $this->tickPositions[$i++] = $t; - } - break; - case DSUTILS_DAY2: - while( $t <= $this->iMax ) { - $t += 3600*24; - if( $aMinor ) { - $this->minTickPositions[$j++] = $t; - } - $t += 3600*24; - $this->tickPositions[$i++] = $t; - } - break; - case DSUTILS_DAY4: - while( $t <= $this->iMax ) { - for($k=0; $k < 3; ++$k ) { - $t += 3600*24; - if( $aMinor ) { - $this->minTickPositions[$j++] = $t; - } - } - $t += 3600*24; - $this->tickPositions[$i++] = $t; - } - break; - } + if( $h == 0 ) { + self::$tickPositions[$i++] = mktime(0,0,0,$m,$d,$y); + } + $t = mktime(0,0,0,$m,$d,$y); + + switch($aType) { + case DSUTILS_DAY1: + while( $t <= self::$iMax ) { + $t = strtotime('+1 day',$t); + self::$tickPositions[$i++] = $t; + if( $aMinor ) { + self::$minTickPositions[$j++] = strtotime('+12 hours',$t); + } + } + break; + case DSUTILS_DAY2: + while( $t <= self::$iMax ) { + $t = strtotime('+1 day',$t); + if( $aMinor ) { + self::$minTickPositions[$j++] = $t; + } + $t = strtotime('+1 day',$t); + self::$tickPositions[$i++] = $t; + } + break; + case DSUTILS_DAY4: + while( $t <= self::$iMax ) { + for($k=0; $k < 3; ++$k ) { + $t = strtotime('+1 day',$t); + if( $aMinor ) { + self::$minTickPositions[$j++] = $t; + } + } + $t = strtotime('+1 day',$t); + self::$tickPositions[$i++] = $t; + } + break; + } } - function doWeekly($aType,$aMinor=false) { - $hpd = 3600*24; - $hpw = 3600*24*7; - // Find out week number of min date - $thursday = $this->iMin + $hpd * (3 - (date('w', $this->iMin) + 6) % 7); - $week = 1 + (date('z', $thursday) - (11 - date('w', mktime(0, 0, 0, 1, 1, date('Y', $thursday)))) % 7) / 7; - $daynumber = date('w',$this->iMin); - if( $daynumber == 0 ) $daynumber = 7; - $m = $this->startmonth; - $y = $this->startyear; - $d = $this->startday; - $i=0;$j=0; - // The assumption is that the weeks start on Monday. If the first day - // is later in the week then the first week tick has to be on the following - // week. - if( $daynumber == 1 ) { - $this->tickPositions[$i++] = mktime(0,0,0,$m,$d,$y); - $t = mktime(0,0,0,$m,$d,$y) + $hpw; - } - else { - $t = mktime(0,0,0,$m,$d,$y) + $hpd*(8-$daynumber); - } + static function doWeekly($aType,$aMinor=false) { + $hpd = 3600*24; + $hpw = 3600*24*7; + // Find out week number of min date + $thursday = self::$iMin + $hpd * (3 - (date('w', self::$iMin) + 6) % 7); + $week = 1 + (date('z', $thursday) - (11 - date('w', mktime(0, 0, 0, 1, 1, date('Y', $thursday)))) % 7) / 7; + $daynumber = date('w',self::$iMin); + if( $daynumber == 0 ) $daynumber = 7; + $m = self::$startmonth; + $y = self::$startyear; + $d = self::$startday; + $i=0;$j=0; + // The assumption is that the weeks start on Monday. If the first day + // is later in the week then the first week tick has to be on the following + // week. + if( $daynumber == 1 ) { + self::$tickPositions[$i++] = mktime(0,0,0,$m,$d,$y); + $t = mktime(0,0,0,$m,$d,$y) + $hpw; + } + else { + $t = mktime(0,0,0,$m,$d,$y) + $hpd*(8-$daynumber); + } - switch($aType) { - case DSUTILS_WEEK1: - $cnt=0; - break; - case DSUTILS_WEEK2: - $cnt=1; - break; - case DSUTILS_WEEK4: - $cnt=3; - break; - } - while( $t <= $this->iMax ) { - $this->tickPositions[$i++] = $t; - for($k=0; $k < $cnt; ++$k ) { - $t += $hpw; - if( $aMinor ) { - $this->minTickPositions[$j++] = $t; - } - } - $t += $hpw; - } + switch($aType) { + case DSUTILS_WEEK1: + $cnt=0; + break; + case DSUTILS_WEEK2: + $cnt=1; + break; + case DSUTILS_WEEK4: + $cnt=3; + break; + } + while( $t <= self::$iMax ) { + self::$tickPositions[$i++] = $t; + for($k=0; $k < $cnt; ++$k ) { + $t += $hpw; + if( $aMinor ) { + self::$minTickPositions[$j++] = $t; + } + } + $t += $hpw; + } } - function doMonthly($aType,$aMinor=false) { - $monthcount=0; - $m = $this->startmonth; - $y = $this->startyear; - $i=0; $j=0; + static function doMonthly($aType,$aMinor=false) { + $monthcount=0; + $m = self::$startmonth; + $y = self::$startyear; + $i=0; $j=0; - // Skip the first month label if it is before the startdate - if( $this->startday == 1 ) { - $this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y); - $monthcount=1; - } - if( $aType == 1 ) { - if( $this->startday < 15 ) { - $this->minTickPositions[$j++] = mktime(0,0,0,$m,15,$y); - } - } - ++$m; + // Skip the first month label if it is before the startdate + if( self::$startday == 1 ) { + self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y); + $monthcount=1; + } + if( $aType == 1 ) { + if( self::$startday < 15 ) { + self::$minTickPositions[$j++] = mktime(0,0,0,$m,15,$y); + } + } + ++$m; - // Loop through all the years included in the scale - for($y=$this->startyear; $y <= $this->endyear; ++$y ) { - // Loop through all the months. There are three cases to consider: - // 1. We are in the first year and must start with the startmonth - // 2. We are in the end year and we must stop at last month of the scale - // 3. A year in between where we run through all the 12 months - $stopmonth = $y == $this->endyear ? $this->endmonth : 12; - while( $m <= $stopmonth ) { - switch( $aType ) { - case DSUTILS_MONTH1: - // Set minor tick at the middle of the month - if( $aMinor ) { - if( $m <= $stopmonth ) { - if( !($y==$this->endyear && $m==$stopmonth && $this->endday < 15) ) - $this->minTickPositions[$j++] = mktime(0,0,0,$m,15,$y); - } - } - // Major at month - // Get timestamp of first hour of first day in each month - $this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y); + // Loop through all the years included in the scale + for($y=self::$startyear; $y <= self::$endyear; ++$y ) { + // Loop through all the months. There are three cases to consider: + // 1. We are in the first year and must start with the startmonth + // 2. We are in the end year and we must stop at last month of the scale + // 3. A year in between where we run through all the 12 months + $stopmonth = $y == self::$endyear ? self::$endmonth : 12; + while( $m <= $stopmonth ) { + switch( $aType ) { + case DSUTILS_MONTH1: + // Set minor tick at the middle of the month + if( $aMinor ) { + if( $m <= $stopmonth ) { + if( !($y==self::$endyear && $m==$stopmonth && self::$endday < 15) ) + self::$minTickPositions[$j++] = mktime(0,0,0,$m,15,$y); + } + } + // Major at month + // Get timestamp of first hour of first day in each month + self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y); - break; - case DSUTILS_MONTH2: - if( $aMinor ) { - // Set minor tick at start of each month - $this->minTickPositions[$j++] = mktime(0,0,0,$m,1,$y); - } + break; + case DSUTILS_MONTH2: + if( $aMinor ) { + // Set minor tick at start of each month + self::$minTickPositions[$j++] = mktime(0,0,0,$m,1,$y); + } - // Major at every second month - // Get timestamp of first hour of first day in each month - if( $monthcount % 2 == 0 ) { - $this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y); - } - break; - case DSUTILS_MONTH3: - if( $aMinor ) { - // Set minor tick at start of each month - $this->minTickPositions[$j++] = mktime(0,0,0,$m,1,$y); - } - // Major at every third month - // Get timestamp of first hour of first day in each month - if( $monthcount % 3 == 0 ) { - $this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y); - } - break; - case DSUTILS_MONTH6: - if( $aMinor ) { - // Set minor tick at start of each month - $this->minTickPositions[$j++] = mktime(0,0,0,$m,1,$y); - } - // Major at every third month - // Get timestamp of first hour of first day in each month - if( $monthcount % 6 == 0 ) { - $this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y); - } - break; - } - ++$m; - ++$monthcount; - } - $m=1; - } + // Major at every second month + // Get timestamp of first hour of first day in each month + if( $monthcount % 2 == 0 ) { + self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y); + } + break; + case DSUTILS_MONTH3: + if( $aMinor ) { + // Set minor tick at start of each month + self::$minTickPositions[$j++] = mktime(0,0,0,$m,1,$y); + } + // Major at every third month + // Get timestamp of first hour of first day in each month + if( $monthcount % 3 == 0 ) { + self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y); + } + break; + case DSUTILS_MONTH6: + if( $aMinor ) { + // Set minor tick at start of each month + self::$minTickPositions[$j++] = mktime(0,0,0,$m,1,$y); + } + // Major at every third month + // Get timestamp of first hour of first day in each month + if( $monthcount % 6 == 0 ) { + self::$tickPositions[$i++] = mktime(0,0,0,$m,1,$y); + } + break; + } + ++$m; + ++$monthcount; + } + $m=1; + } - // For the case where all dates are within the same month - // we want to make sure we have at least two ticks on the scale - // since the scale want work properly otherwise - if($this->startmonth == $this->endmonth && $this->startyear == $this->endyear && $aType==1 ) { - $this->tickPositions[$i++] = mktime(0 ,0 ,0, $this->startmonth + 1, 1, $this->startyear); - } + // For the case where all dates are within the same month + // we want to make sure we have at least two ticks on the scale + // since the scale want work properly otherwise + if(self::$startmonth == self::$endmonth && self::$startyear == self::$endyear && $aType==1 ) { + self::$tickPositions[$i++] = mktime(0 ,0 ,0, self::$startmonth + 1, 1, self::$startyear); + } - return array($this->tickPositions,$this->minTickPositions); + return array(self::$tickPositions,self::$minTickPositions); } - function GetTicks($aData,$aType=1,$aMinor=false,$aEndPoints=false) { - $n = count($aData); - return $this->GetTicksFromMinMax($aData[0],$aData[$n-1],$aType,$aMinor,$aEndPoints); + static function GetTicks($aData,$aType=1,$aMinor=false,$aEndPoints=false) { + $n = count($aData); + return self::GetTicksFromMinMax($aData[0],$aData[$n-1],$aType,$aMinor,$aEndPoints); } - function GetAutoTicks($aMin,$aMax,$aMaxTicks=10,$aMinor=false) { - $diff = $aMax - $aMin; - $spd = 3600*24; - $spw = $spd*7; - $spm = $spd*30; - $spy = $spd*352; + static function GetAutoTicks($aMin,$aMax,$aMaxTicks=10,$aMinor=false) { + $diff = $aMax - $aMin; + $spd = 3600*24; + $spw = $spd*7; + $spm = $spd*30; + $spy = $spd*352; - if( $this->iUseWeeks ) - $w = 'W'; - else - $w = 'd M'; + if( self::$iUseWeeks ) + $w = 'W'; + else + $w = 'd M'; - // Decision table for suitable scales - // First value: Main decision point - // Second value: Array of formatting depending on divisor for wanted max number of ticks. ,.. - $tt = array( - array($spw, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',-1,DSUTILS_DAY4,'d M')), - array($spm, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M', - 7,DSUTILS_WEEK1,$w,-1,DSUTILS_WEEK2,$w)), - array($spy, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M', - 7,DSUTILS_WEEK1,$w,14,DSUTILS_WEEK2,$w, - 30,DSUTILS_MONTH1,'M',60,DSUTILS_MONTH2,'M',-1,DSUTILS_MONTH3,'M')), - array(-1, array(30,DSUTILS_MONTH1,'M-Y',60,DSUTILS_MONTH2,'M-Y',90,DSUTILS_MONTH3,'M-Y', - 180,DSUTILS_MONTH6,'M-Y',352,DSUTILS_YEAR1,'Y',704,DSUTILS_YEAR2,'Y',-1,DSUTILS_YEAR5,'Y'))); + // Decision table for suitable scales + // First value: Main decision point + // Second value: Array of formatting depending on divisor for wanted max number of ticks. ,.. + $tt = array( + array($spw, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',-1,DSUTILS_DAY4,'d M')), + array($spm, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M',7,DSUTILS_WEEK1,$w,-1,DSUTILS_WEEK2,$w)), + array($spy, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M',7,DSUTILS_WEEK1,$w,14,DSUTILS_WEEK2,$w,30,DSUTILS_MONTH1,'M',60,DSUTILS_MONTH2,'M',-1,DSUTILS_MONTH3,'M')), + array(-1, array(30,DSUTILS_MONTH1,'M-Y',60,DSUTILS_MONTH2,'M-Y',90,DSUTILS_MONTH3,'M-Y',180,DSUTILS_MONTH6,'M-Y',352,DSUTILS_YEAR1,'Y',704,DSUTILS_YEAR2,'Y',-1,DSUTILS_YEAR5,'Y'))); - $ntt = count($tt); - $nd = floor($diff/$spd); - for($i=0; $i < $ntt; ++$i ) { - if( $diff <= $tt[$i][0] || $i==$ntt-1) { - $t = $tt[$i][1]; - $n = count($t)/3; - for( $j=0; $j < $n; ++$j ) { - if( $nd/$t[3*$j] <= $aMaxTicks || $j==$n-1) { - $type = $t[3*$j+1]; - $fs = $t[3*$j+2]; - list($tickPositions,$minTickPositions) = $this->GetTicksFromMinMax($aMin,$aMax,$type,$aMinor); - return array($fs,$tickPositions,$minTickPositions,$type); - } - } - } - } + $ntt = count($tt); + $nd = floor($diff/$spd); + for($i=0; $i < $ntt; ++$i ) { + if( $diff <= $tt[$i][0] || $i==$ntt-1) { + $t = $tt[$i][1]; + $n = count($t)/3; + for( $j=0; $j < $n; ++$j ) { + if( $nd/$t[3*$j] <= $aMaxTicks || $j==$n-1) { + $type = $t[3*$j+1]; + $fs = $t[3*$j+2]; + list($tickPositions,$minTickPositions) = self::GetTicksFromMinMax($aMin,$aMax,$type,$aMinor); + return array($fs,$tickPositions,$minTickPositions,$type); + } + } + } + } } - function GetTicksFromMinMax($aMin,$aMax,$aType,$aMinor=false,$aEndPoints=false) { - $this->starthour = date('G',$aMin); - $this->startmonth = date('n',$aMin); - $this->startday = date('j',$aMin); - $this->startyear = date('Y',$aMin); - $this->endmonth = date('n',$aMax); - $this->endyear = date('Y',$aMax); - $this->endday = date('j',$aMax); - $this->iMin = $aMin; - $this->iMax = $aMax; + static function GetTicksFromMinMax($aMin,$aMax,$aType,$aMinor=false,$aEndPoints=false) { + self::$starthour = date('G',$aMin); + self::$startmonth = date('n',$aMin); + self::$startday = date('j',$aMin); + self::$startyear = date('Y',$aMin); + self::$endmonth = date('n',$aMax); + self::$endyear = date('Y',$aMax); + self::$endday = date('j',$aMax); + self::$iMin = $aMin; + self::$iMax = $aMax; - if( $aType <= DSUTILS_MONTH6 ) { - $this->doMonthly($aType,$aMinor); - } - elseif( $aType <= DSUTILS_WEEK4 ) { - $this->doWeekly($aType,$aMinor); - } - elseif( $aType <= DSUTILS_DAY4 ) { - $this->doDaily($aType,$aMinor); - } - elseif( $aType <= DSUTILS_YEAR5 ) { - $this->doYearly($aType,$aMinor); - } - else { - JpGraphError::RaiseL(24003); - } - // put a label at the very left data pos - if( $aEndPoints ) { - $tickPositions[$i++] = $aData[0]; - } + if( $aType <= DSUTILS_MONTH6 ) { + self::doMonthly($aType,$aMinor); + } + elseif( $aType <= DSUTILS_WEEK4 ) { + self::doWeekly($aType,$aMinor); + } + elseif( $aType <= DSUTILS_DAY4 ) { + self::doDaily($aType,$aMinor); + } + elseif( $aType <= DSUTILS_YEAR5 ) { + self::doYearly($aType,$aMinor); + } + else { + JpGraphError::RaiseL(24003); + } + // put a label at the very left data pos + if( $aEndPoints ) { + $tickPositions[$i++] = $aData[0]; + } - // put a label at the very right data pos - if( $aEndPoints ) { - $tickPositions[$i] = $aData[$n-1]; - } + // put a label at the very right data pos + if( $aEndPoints ) { + $tickPositions[$i] = $aData[$n-1]; + } - return array($this->tickPositions,$this->minTickPositions); + return array(self::$tickPositions,self::$minTickPositions); } - } //============================================================================= // Class ReadFileData //============================================================================= Class ReadFileData { - //---------------------------------------------------------------------------- // Desciption: - // Read numeric data from a file. - // Each value should be separated by either a new line or by a specified + // Read numeric data from a file. + // Each value should be separated by either a new line or by a specified // separator character (default is ','). - // Before returning the data each value is converted to a proper float - // value. The routine is robust in the sense that non numeric data in the + // Before returning the data each value is converted to a proper float + // value. The routine is robust in the sense that non numeric data in the // file will be discarded. // - // Returns: + // Returns: // The number of data values read on success, FALSE on failure //---------------------------------------------------------------------------- static function FromCSV($aFile,&$aData,$aSepChar=',',$aMaxLineLength=1024) { - $rh = fopen($aFile,'r'); - if( $rh === false ) - return false; - $tmp = array(); - $lineofdata = fgetcsv($rh, 1000, ','); - while ( $lineofdata !== FALSE) { - $tmp = array_merge($tmp,$lineofdata); - $lineofdata = fgetcsv($rh, $aMaxLineLength, $aSepChar); - } - fclose($rh); + $rh = @fopen($aFile,'r'); + if( $rh === false ) { + return false; + } + $tmp = array(); + $lineofdata = fgetcsv($rh, 1000, ','); + while ( $lineofdata !== FALSE) { + $tmp = array_merge($tmp,$lineofdata); + $lineofdata = fgetcsv($rh, $aMaxLineLength, $aSepChar); + } + fclose($rh); - // Now make sure that all data is numeric. By default - // all data is read as strings - $n = count($tmp); - $aData = array(); - $cnt=0; - for($i=0; $i < $n; ++$i) { - if( $tmp[$i] !== "" ) { - $aData[$cnt++] = floatval($tmp[$i]); - } - } - return $cnt; + // Now make sure that all data is numeric. By default + // all data is read as strings + $n = count($tmp); + $aData = array(); + $cnt=0; + for($i=0; $i < $n; ++$i) { + if( $tmp[$i] !== "" ) { + $aData[$cnt++] = floatval($tmp[$i]); + } + } + return $cnt; } + + //---------------------------------------------------------------------------- + // Desciption: + // Read numeric data from a file. + // Each value should be separated by either a new line or by a specified + // separator character (default is ','). + // Before returning the data each value is converted to a proper float + // value. The routine is robust in the sense that non numeric data in the + // file will be discarded. + // + // Options: + // 'separator' => ',', + // 'enclosure' => '"', + // 'readlength' => 1024, + // 'ignore_first' => false, + // 'first_as_key' => false + // 'escape' => '\', # PHP >= 5.3 only + // + // Returns: + // The number of lines read on success, FALSE on failure + //---------------------------------------------------------------------------- + static function FromCSV2($aFile, &$aData, $aOptions = array()) { + $aDefaults = array( + 'separator' => ',', + 'enclosure' => chr(34), + 'escape' => chr(92), + 'readlength' => 1024, + 'ignore_first' => false, + 'first_as_key' => false + ); + + $aOptions = array_merge( + $aDefaults, is_array($aOptions) ? $aOptions : array()); + + if( $aOptions['first_as_key'] ) { + $aOptions['ignore_first'] = true; + } + + $rh = @fopen($aFile, 'r'); + + if( $rh === false ) { + return false; + } + + $aData = array(); + $aLine = fgetcsv($rh, + $aOptions['readlength'], + $aOptions['separator'], + $aOptions['enclosure'] + /*, $aOptions['escape'] # PHP >= 5.3 only */ + ); + + // Use numeric array keys for the columns by default + // If specified use first lines values as assoc keys instead + $keys = array_keys($aLine); + if( $aOptions['first_as_key'] ) { + $keys = array_values($aLine); + } + + $num_lines = 0; + $num_cols = count($aLine); + + while ($aLine !== false) { + if( is_array($aLine) && count($aLine) != $num_cols ) { + JpGraphError::RaiseL(24004); + // 'ReadCSV2: Column count mismatch in %s line %d' + } + + // fgetcsv returns NULL for empty lines + if( !is_null($aLine) ) { + $num_lines++; + + if( !($aOptions['ignore_first'] && $num_lines == 1) && is_numeric($aLine[0]) ) { + for( $i = 0; $i < $num_cols; $i++ ) { + $aData[ $keys[$i] ][] = floatval($aLine[$i]); + } + } + } + + $aLine = fgetcsv($rh, + $aOptions['readlength'], + $aOptions['separator'], + $aOptions['enclosure'] + /*, $aOptions['escape'] # PHP >= 5.3 only*/ + ); + } + + fclose($rh); + + if( $aOptions['ignore_first'] ) { + $num_lines--; + } + + return $num_lines; + } + + // Read data from two columns in a plain text file + static function From2Col($aFile, $aCol1, $aCol2, $aSepChar=' ') { + $lines = @file($aFile,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES); + if( $lines === false ) { + return false; + } + $s = '/[\s]+/'; + if( $aSepChar == ',' ) { + $s = '/[\s]*,[\s]*/'; + } + elseif( $aSepChar == ';' ) { + $s = '/[\s]*;[\s]*/'; + } + foreach( $lines as $line => $datarow ) { + $split = preg_split($s,$datarow); + $aCol1[] = floatval(trim($split[0])); + $aCol2[] = floatval(trim($split[1])); + } + + return count($lines); + } + + // Read data from one columns in a plain text file + static function From1Col($aFile, $aCol1) { + $lines = @file($aFile,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES); + if( $lines === false ) { + return false; + } + foreach( $lines as $line => $datarow ) { + $aCol1[] = floatval(trim($datarow)); + } + + return count($lines); + } + + static function FromMatrix($aFile,$aSepChar=' ') { + $lines = @file($aFile,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES); + if( $lines === false ) { + return false; + } + $mat = array(); + $reg = '/'.$aSepChar.'/'; + foreach( $lines as $line => $datarow ) { + $row = preg_split($reg,trim($datarow)); + foreach ($row as $key => $cell ) { + $row[$key] = floatval(trim($cell)); + } + $mat[] = $row; + } + return $mat; + } + + +} + +define('__LR_EPSILON', 1.0e-8); +//============================================================================= +// Class LinearRegression +//============================================================================= +class LinearRegression { + private $ix=array(),$iy=array(); + private $ib=0, $ia=0; + private $icalculated=false; + public $iDet=0, $iCorr=0, $iStdErr=0; + + public function __construct($aDataX,$aDataY) { + if( count($aDataX) !== count($aDataY) ) { + JpGraph::Raise('LinearRegression: X and Y data array must be of equal length.'); + } + $this->ix = $aDataX; + $this->iy = $aDataY; + } + + public function Calc() { + + $this->icalculated = true; + + $n = count($this->ix); + $sx2 = 0 ; + $sy2 = 0 ; + $sxy = 0 ; + $sx = 0 ; + $sy = 0 ; + + for( $i=0; $i < $n; ++$i ) { + $sx2 += $this->ix[$i] * $this->ix[$i]; + $sy2 += $this->iy[$i] * $this->iy[$i]; + $sxy += $this->ix[$i] * $this->iy[$i]; + $sx += $this->ix[$i]; + $sy += $this->iy[$i]; + } + + if( $n*$sx2 - $sx*$sx > __LR_EPSILON ) { + $this->ib = ($n*$sxy - $sx*$sy) / ( $n*$sx2 - $sx*$sx ); + $this->ia = ( $sy - $this->ib*$sx ) / $n; + + $sx = $this->ib * ( $sxy - $sx*$sy/$n ); + $sy2 = $sy2 - $sy*$sy/$n; + $sy = $sy2 - $sx; + + $this->iDet = $sx / $sy2; + $this->iCorr = sqrt($this->iDet); + if( $n > 2 ) { + $this->iStdErr = sqrt( $sy / ($n-2) ); + } + else { + $this->iStdErr = NAN ; + } + } + else { + $this->ib = 0; + $this->ia = 0; + } + + } + + public function GetAB() { + if( $this->icalculated == false ) + $this->Calc(); + return array($this->ia, $this->ib); + } + + public function GetStat() { + if( $this->icalculated == false ) + $this->Calc(); + return array($this->iStdErr, $this->iCorr, $this->iDet); + } + + public function GetY($aMinX, $aMaxX, $aStep=1) { + if( $this->icalculated == false ) + $this->Calc(); + + $yy = array(); + $i = 0; + for( $x=$aMinX; $x <= $aMaxX; $x += $aStep ) { + $xx[$i ] = $x; + $yy[$i++] = $this->ia + $this->ib * $x; + } + + return array($xx,$yy); + } + } ?> \ No newline at end of file diff --git a/libs/jpgraph/lang/de.inc.php b/libs/jpgraph/lang/de.inc.php index 04725f7..8626253 100644 --- a/libs/jpgraph/lang/de.inc.php +++ b/libs/jpgraph/lang/de.inc.php @@ -1,10 +1,11 @@ array('
JpGraph Fehler: -HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zeile %d.
Erklärung:
HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert würden und daher nur Mist dargestellt würde).

Wahrscheinlich steht Text im Skript bevor Graph::Stroke() aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrüchen, die eventuell bereits zum Browser gesendet wurden.

Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor Graph::Stroke() zu lassen."<?php".

',2), +HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zeile %d.Erklärung:
HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert würden und daher nur Mist dargestellt würde).

Wahrscheinlich steht Text im Skript bevor Graph::Stroke() aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrüchen, die eventuell bereits zum Browser gesendet wurden.

Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor Graph::Stroke() zu lassen."<?php".',2), /* ** Setup Fehler */ -11 => array('Es wurde kein Pfad für CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0), -12 => array('Es wurde kein Pfad für TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0), +11 => array('Es wurde kein Pfad für CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0), +12 => array('Es wurde kein Pfad für TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0), 13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2), /* @@ -33,24 +34,25 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei 2001 => array('Die Anzahl der Farben ist nicht gleich der Anzahl der Vorlagen in BarPlot::SetPattern().',0), 2002 => array('Unbekannte Vorlage im Aufruf von BarPlot::SetPattern().',0), 2003 => array('Anzahl der X- und Y-Koordinaten sind nicht identisch. Anzahl der X-Koordinaten: %d; Anzahl der Y-Koordinaten: %d.',2), -2004 => array('Alle Werte für ein Balkendiagramm (barplot) müssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2), -2005 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), -2006 => array('Unbekannte Position für die Werte der Balken: %s.',1), +2004 => array('Alle Werte für ein Balkendiagramm (barplot) müssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2), +2005 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), +2006 => array('Unbekannte Position für die Werte der Balken: %s.',1), 2007 => array('Kann GroupBarPlot nicht aus einem leeren Vektor erzeugen.',0), 2008 => array('GroupBarPlot Element nbr %d wurde nicht definiert oder ist leer.',0), 2009 => array('Eins der Objekte, das an GroupBar weitergegeben wurde ist kein Balkendiagramm (BarPlot). Versichere Dich, dass Du den GroupBarPlot aus einem Vektor von Balkendiagrammen (barplot) oder AccBarPlot-Objekten erzeugst. (Class = %s)',1), 2010 => array('Kann AccBarPlot nicht aus einem leeren Vektor erzeugen.',0), 2011 => array('AccBarPlot-Element nbr %d wurde nicht definiert oder ist leer.',1), 2012 => array('Eins der Objekte, das an AccBar weitergegeben wurde ist kein Balkendiagramm (barplot). Versichere Dich, dass Du den AccBar-Plot aus einem Vektor von Balkendiagrammen (barplot) erzeugst. (Class=%s)',1), -2013 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), +2013 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), 2014 => array('Die Anzahl der Datenpunkte jeder Datenreihe in AccBarPlot muss gleich sein.',0), +2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0), /* ** jpgraph_date */ -3001 => array('Es ist nur möglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0), +3001 => array('Es ist nur möglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0), /* ** jpgraph_error @@ -62,9 +64,9 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_flags */ -5001 => array('Unbekannte Flaggen-Größe (%d).',1), +5001 => array('Unbekannte Flaggen-Größe (%d).',1), 5002 => array('Der Flaggen-Index %s existiert nicht.',1), -5003 => array('Es wurde eine ungültige Ordnungszahl (%d) für den Flaggen-Index angegeben.',1), +5003 => array('Es wurde eine ungültige Ordnungszahl (%d) für den Flaggen-Index angegeben.',1), 5004 => array('Der Landesname %s hat kein korrespondierendes Flaggenbild. Die Flagge mag existieren, abr eventuell unter einem anderen Namen, z.B. versuche "united states" statt "usa".',1), @@ -72,35 +74,36 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_gantt */ -6001 => array('Interner Fehler. Die Höhe für ActivityTitles ist < 0.',0), -6002 => array('Es dürfen keine negativen Werte für die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0), -6003 => array('Ungültiges Format für den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1), -6004 => array('Ungültiges Format für den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1), +6001 => array('Interner Fehler. Die Höhe für ActivityTitles ist < 0.',0), +6002 => array('Es dürfen keine negativen Werte für die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0), +6003 => array('Ungültiges Format für den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1), +6004 => array('Ungültiges Format für den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1), 6005 => array('SetScale() ist nicht sinnvoll bei Gantt-Diagrammen.',0), -6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitäten mit Termin. [GetBarMinMax() start >= n]',0), -6007 => array('Plausibiltätsprüfung für die automatische Gantt-Diagramm-Größe schlug fehl. Entweder die Breite (=%d) oder die Höhe (=%d) ist größer als MAX_GANTTIMG_SIZE. Dies kann möglicherweise durch einen falschen Wert bei einer Aktivität hervorgerufen worden sein.',2), -6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivität hat.',2), +6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitäten mit Termin. [GetBarMinMax() start >= n]',0), +6007 => array('Plausibiltätsprüfung für die automatische Gantt-Diagramm-Größe schlug fehl. Entweder die Breite (=%d) oder die Höhe (=%d) ist größer als MAX_GANTTIMG_SIZE. Dies kann möglicherweise durch einen falschen Wert bei einer Aktivität hervorgerufen worden sein.',2), +6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivität hat.',2), 6009 => array('Unbekannter Bedingungstyp von Reihe=%d bis Reihe=%d',2), -6010 => array('Ungültiger Icon-Index für das eingebaute Gantt-Icon [%d]',1), -6011 => array('Argument für IconImage muss entweder ein String oder ein Integer sein.',0), +6010 => array('Ungültiger Icon-Index für das eingebaute Gantt-Icon [%d]',1), +6011 => array('Argument für IconImage muss entweder ein String oder ein Integer sein.',0), 6012 => array('Unbekannter Typ bei der Gantt-Objekt-Title-Definition.',0), -6015 => array('Ungültige vertikale Position %d',1), -6016 => array('Der eingegebene Datums-String (%s) für eine Gantt-Aktivität kann nicht interpretiert werden. Versichere Dich, dass es ein gültiger Datumsstring ist, z.B. 2005-04-23 13:30',1), +6015 => array('Ungültige vertikale Position %d',1), +6016 => array('Der eingegebene Datums-String (%s) für eine Gantt-Aktivität kann nicht interpretiert werden. Versichere Dich, dass es ein gültiger Datumsstring ist, z.B. 2005-04-23 13:30',1), 6017 => array('Unbekannter Datumstyp in GanttScale (%s).',1), -6018 => array('Intervall für Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1), -6019 => array('Die vorhandene Breite (%d) für die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Größenermittlung oder vergrößere die Breite des Diagramms.',1), -6020 => array('Das Intervall für die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1), -6021 => array('Unbekanntes Format für die Woche.',0), +6018 => array('Intervall für Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1), +6019 => array('Die vorhandene Breite (%d) für die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Größenermittlung oder vergrößere die Breite des Diagramms.',1), +6020 => array('Das Intervall für die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1), +6021 => array('Unbekanntes Format für die Woche.',0), 6022 => array('Die Gantt-Skala wurde nicht eingegeben.',0), 6023 => array('Wenn Du sowohl Stunden als auch Minuten anzeigen lassen willst, muss das Stunden-Interval gleich 1 sein (anderenfalls ist es nicht sinnvoll, Minuten anzeigen zu lassen).',0), 6024 => array('Das CSIM-Ziel muss als String angegeben werden. Der Start des Ziels ist: %d',1), 6025 => array('Der CSIM-Alt-Text muss als String angegeben werden. Der Beginn des Alt-Textes ist: %d',1), 6027 => array('Der Fortschrittswert muss im Bereich [0, 1] liegen.',0), -6028 => array('Die eingegebene Höhe (%d) für GanttBar ist nicht im zulässigen Bereich.',1), -6029 => array('Der Offset für die vertikale Linie muss im Bereich [0,1] sein.',0), -6030 => array('Unbekannte Pfeilrichtung für eine Verbindung.',0), -6031 => array('Unbekannter Pfeiltyp für eine Verbindung.',0), -6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) für eine Verbindung.',1), +6028 => array('Die eingegebene Höhe (%d) für GanttBar ist nicht im zulässigen Bereich.',1), +6029 => array('Der Offset für die vertikale Linie muss im Bereich [0,1] sein.',0), +6030 => array('Unbekannte Pfeilrichtung für eine Verbindung.',0), +6031 => array('Unbekannter Pfeiltyp für eine Verbindung.',0), +6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) für eine Verbindung.',1), +6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0), /* ** jpgraph_gradient @@ -112,107 +115,107 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_iconplot */ -8001 => array('Der Mix-Wert für das Icon muss zwischen 0 und 100 sein.',0), -8002 => array('Die Ankerposition für Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0), -8003 => array('Es ist nicht möglich, gleichzeitig ein Bild und eine Landesflagge für dasselbe Icon zu definieren',0), -8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufügen (per include).',0), +8001 => array('Der Mix-Wert für das Icon muss zwischen 0 und 100 sein.',0), +8002 => array('Die Ankerposition für Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0), +8003 => array('Es ist nicht möglich, gleichzeitig ein Bild und eine Landesflagge für dasselbe Icon zu definieren',0), +8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufügen (per include).',0), /* ** jpgraph_imgtrans */ -9001 => array('Der Wert für die Bildtransformation ist außerhalb des zulässigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0), +9001 => array('Der Wert für die Bildtransformation ist außerhalb des zulässigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0), /* ** jpgraph_lineplot */ 10001 => array('Die Methode LinePlot::SetFilled() sollte nicht mehr benutzt werden. Benutze lieber SetFillColor()',0), -10002 => array('Der Plot ist zu kompliziert für FastLineStroke. Benutze lieber den StandardStroke()',0), +10002 => array('Der Plot ist zu kompliziert für FastLineStroke. Benutze lieber den StandardStroke()',0), 10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0), /* ** jpgraph_log */ 11001 => array('Deine Daten enthalten nicht-numerische Werte.',0), -11002 => array('Negative Werte können nicht für logarithmische Achsen verwendet werden.',0), +11002 => array('Negative Werte können nicht für logarithmische Achsen verwendet werden.',0), 11003 => array('Deine Daten enthalten nicht-numerische Werte.',0), -11004 => array('Skalierungsfehler für die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der größte Wert muss größer sein als Null. Es ist mathematisch nicht möglich, einen Wert gleich Null in der Skala zu haben.',0), -11005 => array('Das Tick-Intervall für die logarithmische Achse ist nicht definiert. Lösche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0), +11004 => array('Skalierungsfehler für die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der größte Wert muss größer sein als Null. Es ist mathematisch nicht möglich, einen Wert gleich Null in der Skala zu haben.',0), +11005 => array('Das Tick-Intervall für die logarithmische Achse ist nicht definiert. Lösche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0), /* ** jpgraph_mgraph */ -12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0), -12002 => array('Ungültiger Dateiname für MGraph::SetBackgroundImage() : %s. Die Datei muss eine gültige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1), -12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() für Dateiname: %s',2), -12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1), +12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0), +12002 => array('Ungültiger Dateiname für MGraph::SetBackgroundImage() : %s. Die Datei muss eine gültige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1), +12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() für Dateiname: %s',2), +12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1), 12005 => array('Das Hintergrundbild kann nicht gelesen werden: %s',1), -12006 => array('Es wurden ungültige Größen für Breite oder Höhe beim Erstellen des Bildes angegeben, (Breite=%d, Höhe=%d)',2), -12007 => array('Das Argument für MGraph::Add() ist nicht gültig für GD.',0), -12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu unterstützen.',0), -12009 => array('Deine PHP-Installation unterstützt das gewählte Bildformat nicht: %s',1), -12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. Überprüfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1), -12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), -12012 => array('Es konnte kein Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), +12006 => array('Es wurden ungültige Größen für Breite oder Höhe beim Erstellen des Bildes angegeben, (Breite=%d, Höhe=%d)',2), +12007 => array('Das Argument für MGraph::Add() ist nicht gültig für GD.',0), +12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu unterstützen.',0), +12009 => array('Deine PHP-Installation unterstützt das gewählte Bildformat nicht: %s',1), +12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. Ãœberprüfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1), +12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. Ãœberprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), +12012 => array('Es konnte kein Bild erzeugt werden. Ãœberprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), /* ** jpgraph_pie3d */ -14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstücke zu kontrollieren.',0), +14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstücke zu kontrollieren.',0), 14002 => array('PiePlot3D::SetAngle() 3D-Torten-Projektionswinkel muss zwischen 5 und 85 Grad sein.',0), 14003 => array('Interne Festlegung schlug fehl. Pie3D::Pie3DSlice',0), -14004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0), -14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhüllen bei der Suche nach dem Startindex.',0,), -14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus für 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhüllen beim Erstellen des Bildes.',0), -14007 => array('Die Breite für das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0), +14004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0), +14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhüllen bei der Suche nach dem Startindex.',0,), +14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus für 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhüllen beim Erstellen des Bildes.',0), +14007 => array('Die Breite für das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0), /* ** jpgraph_pie */ 15001 => array('PiePLot::SetTheme() Unbekannter Stil: %s',1), -15002 => array('Argument für PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0), -15003 => array('Argument für PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0), -15004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0), +15002 => array('Argument für PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0), +15003 => array('Argument für PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0), +15004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0), 15005 => array('PiePlot::SetFont() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetFont().',0), -15006 => array('PiePlot::SetSize() Radius für Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgröße oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0), +15006 => array('PiePlot::SetSize() Radius für Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgröße oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0), 15007 => array('PiePlot::SetFontColor() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetColor()..',0), -15008 => array('PiePlot::SetLabelType() der Typ für Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1), -15009 => array('Ungültiges Tortendiagramm. Die Summe aller Daten ist Null.',0), +15008 => array('PiePlot::SetLabelType() der Typ für Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1), +15009 => array('Ungültiges Tortendiagramm. Die Summe aller Daten ist Null.',0), 15010 => array('Die Summe aller Daten ist Null.',0), -15011 => array('Um Bildtransformationen benutzen zu können, muss die Datei jpgraph_imgtrans.php eingefügt werden (per include).',0), +15011 => array('Um Bildtransformationen benutzen zu können, muss die Datei jpgraph_imgtrans.php eingefügt werden (per include).',0), /* ** jpgraph_plotband */ -16001 => array('Die Dichte für das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1), -16002 => array('Es wurde keine Position für das Pattern angegeben.',0), +16001 => array('Die Dichte für das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1), +16002 => array('Es wurde keine Position für das Pattern angegeben.',0), 16003 => array('Unbekannte Pattern-Definition (%d)',0), -16004 => array('Der Mindeswert für das PlotBand ist größer als der Maximalwert. Bitte korrigiere dies!',0), +16004 => array('Der Mindeswert für das PlotBand ist größer als der Maximalwert. Bitte korrigiere dies!',0), /* ** jpgraph_polar */ -17001 => array('PolarPlots müssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0), -17002 => array('Unbekannte Ausrichtung für X-Achsen-Titel. (%s)',1), -//17003 => array('Set90AndMargin() wird für PolarGraph nicht unterstützt.',0), -17004 => array('Unbekannter Achsentyp für PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0), +17001 => array('PolarPlots müssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0), +17002 => array('Unbekannte Ausrichtung für X-Achsen-Titel. (%s)',1), +//17003 => array('Set90AndMargin() wird für PolarGraph nicht unterstützt.',0), +17004 => array('Unbekannter Achsentyp für PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0), /* ** jpgraph_radar */ -18001 => array('ClientSideImageMaps werden für RadarPlots nicht unterstützt.',0), +18001 => array('ClientSideImageMaps werden für RadarPlots nicht unterstützt.',0), 18002 => array('RadarGraph::SupressTickMarks() sollte nicht mehr verwendet werden. Benutze stattdessen HideTickMarks().',0), -18003 => array('Ungültiger Achsentyp für RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1), -18004 => array('Die RadarPlot-Größe muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1), -18005 => array('RadarPlot: nicht unterstützte Tick-Dichte: %d',1), +18003 => array('Ungültiger Achsentyp für RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1), +18004 => array('Die RadarPlot-Größe muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1), +18005 => array('RadarPlot: nicht unterstützte Tick-Dichte: %d',1), 18006 => array('Minimum Daten %f (RadarPlots sollten nur verwendet werden, wenn alle Datenpunkte einen Wert > 0 haben).',1), 18007 => array('Die Anzahl der Titel entspricht nicht der Anzahl der Datenpunkte.',0), 18008 => array('Jeder RadarPlot muss die gleiche Anzahl von Datenpunkten haben.',0), @@ -222,29 +225,29 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei */ 19001 => array('Spline: Anzahl der X- und Y-Koordinaten muss gleich sein.',0), -19002 => array('Ungültige Dateneingabe für Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0), +19002 => array('Ungültige Dateneingabe für Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0), 19003 => array('Bezier: Anzahl der X- und Y-Koordinaten muss gleich sein.',0), /* ** jpgraph_scatter */ -20001 => array('Fieldplots müssen die gleiche Anzahl von X und Y Datenpunkten haben.',0), -20002 => array('Bei Fieldplots muss ein Winkel für jeden X und Y Datenpunkt angegeben werden.',0), -20003 => array('Scatterplots müssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0), +20001 => array('Fieldplots müssen die gleiche Anzahl von X und Y Datenpunkten haben.',0), +20002 => array('Bei Fieldplots muss ein Winkel für jeden X und Y Datenpunkt angegeben werden.',0), +20003 => array('Scatterplots müssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0), /* ** jpgraph_stock */ -21001 => array('Die Anzahl der Datenwerte für Stock-Charts müssen ein Mehrfaches von %d Datenpunkten sein.',1), +21001 => array('Die Anzahl der Datenwerte für Stock-Charts müssen ein Mehrfaches von %d Datenpunkten sein.',1), /* ** jpgraph_plotmark */ 23001 => array('Der Marker "%s" existiert nicht in der Farbe: %d',2), -23002 => array('Der Farb-Index ist zu hoch für den Marker "%s"',1), +23002 => array('Der Farb-Index ist zu hoch für den Marker "%s"',1), 23003 => array('Ein Dateiname muss angegeben werden, wenn Du den Marker-Typ auf MARK_IMG setzt.',0), /* @@ -254,69 +257,69 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei 24001 => array('FuncGenerator : Keine Funktion definiert. ',0), 24002 => array('FuncGenerator : Syntax-Fehler in der Funktionsdefinition ',0), 24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0), - +24004 => array('ReadCSV2: Die anzahl der spalten fehler in %s reihe %d',2), /* ** jpgraph */ -25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Unterstützung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0), -25002 => array('Diese PHP-Installation scheint nicht die benötigte GD-Bibliothek zu unterstützen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0), +25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Unterstützung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0), +25002 => array('Diese PHP-Installation scheint nicht die benötigte GD-Bibliothek zu unterstützen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0), 25003 => array('Genereller PHP Fehler : Bei %s:%d : %s',3), 25004 => array('Genereller PHP Fehler : %s ',1), 25005 => array('PHP_SELF, die PHP-Global-Variable kann nicht ermittelt werden. PHP kann nicht von der Kommandozeile gestartet werden, wenn der Cache oder die Bilddateien automatisch benannt werden sollen.',0), -25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie benötigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmäßig in PHP kompiliert (benötigt "--width-iconv" bei der Konfiguration).',0), -25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht unterstützt wird. Hinweis: Benutze \'\', um das defaultmäßige Lokale für diese geographische Region festzulegen.',1), -25008 => array('Die Bild-Breite und Höhe in Graph::Graph() müssen numerisch sein',0), +25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie benötigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmäßig in PHP kompiliert (benötigt "--width-iconv" bei der Konfiguration).',0), +25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht unterstützt wird. Hinweis: Benutze \'\', um das defaultmäßige Lokale für diese geographische Region festzulegen.',1), +25008 => array('Die Bild-Breite und Höhe in Graph::Graph() müssen numerisch sein',0), 25009 => array('Die Skalierung der Achsen muss angegeben werden mit Graph::SetScale()',0), -25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), -25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), -25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), -25013 => array('Es können nur Standard-Plots zu multiplen Y-Achsen hinzugefügt werden',0), -25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufügen.',0), -25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufügen.',0), -25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufügen.',0), -25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0), -25018 => array('Falscher Dateiname für Graph::SetBackgroundImage() : "%s" muss eine gültige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1), -25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() für Dateiname: "%s"',2), +25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), +25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), +25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), +25013 => array('Es können nur Standard-Plots zu multiplen Y-Achsen hinzugefügt werden',0), +25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufügen.',0), +25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufügen.',0), +25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufügen.',0), +25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0), +25018 => array('Falscher Dateiname für Graph::SetBackgroundImage() : "%s" muss eine gültige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1), +25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() für Dateiname: "%s"',2), -25020 => array('Graph::SetScale(): Dar Maximalwert muss größer sein als der Mindestwert.',0), -25021 => array('Unbekannte Achsendefinition für die Y-Achse. (%s)',1), -25022 => array('Unbekannte Achsendefinition für die X-Achse. (%s)',1), -25023 => array('Nicht unterstützter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), -25024 => array('Nicht unterstützter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), -25025 => array('Nicht unterstützte Tick-Dichte: %d',1), -25026 => array('Nicht unterstützter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp für automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0), -25027 => array('Kann cached CSIM "%s" zum Lesen nicht öffnen.',1), -25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. Überprüfe die Rechte.',1), -25029 => array('Kann nicht in das CSIM "%s" schreiben. Überprüfe die Schreibrechte und den freien Speicherplatz.',1), +25020 => array('Graph::SetScale(): Dar Maximalwert muss größer sein als der Mindestwert.',0), +25021 => array('Unbekannte Achsendefinition für die Y-Achse. (%s)',1), +25022 => array('Unbekannte Achsendefinition für die X-Achse. (%s)',1), +25023 => array('Nicht unterstützter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), +25024 => array('Nicht unterstützter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), +25025 => array('Nicht unterstützte Tick-Dichte: %d',1), +25026 => array('Nicht unterstützter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp für automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0), +25027 => array('Kann cached CSIM "%s" zum Lesen nicht öffnen.',1), +25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. Ãœberprüfe die Rechte.',1), +25029 => array('Kann nicht in das CSIM "%s" schreiben. Ãœberprüfe die Schreibrechte und den freien Speicherplatz.',1), -25030 => array('Fehlender Skriptname für StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0), +25030 => array('Fehlender Skriptname für StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0), 25031 => array('Der Achsentyp muss mittels Graph::SetScale() angegeben werden.',0), -25032 => array('Es existieren keine Plots für die Y-Achse nbr:%d',1), +25032 => array('Es existieren keine Plots für die Y-Achse nbr:%d',1), 25033 => array('',0), 25034 => array('Undefinierte X-Achse kann nicht gezeichnet werden. Es wurden keine Plots definiert.',0), -25035 => array('Du hast Clipping aktiviert. Clipping wird nur für Diagramme mit 0 oder 90 Grad Rotation unterstützt. Bitte verändere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1), +25035 => array('Du hast Clipping aktiviert. Clipping wird nur für Diagramme mit 0 oder 90 Grad Rotation unterstützt. Bitte verändere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1), 25036 => array('Unbekannter Achsentyp AxisStyle() : %s',1), -25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1), +25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1), 25038 => array('Das Hintergrundbild scheint von einem anderen Typ (unterschiedliche Dateierweiterung) zu sein als der angegebene Typ. Angegebenen: %s; Datei: %s',2), 25039 => array('Hintergrundbild kann nicht gelesen werden: "%s"',1), -25040 => array('Es ist nicht möglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0), -25041 => array('Um Landesflaggen als Hintergrund benutzen zu können, muss die Datei "jpgraph_flags.php" eingefügt werden (per include).',0), +25040 => array('Es ist nicht möglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0), +25041 => array('Um Landesflaggen als Hintergrund benutzen zu können, muss die Datei "jpgraph_flags.php" eingefügt werden (per include).',0), 25042 => array('Unbekanntes Hintergrundbild-Layout',0), 25043 => array('Unbekannter Titelhintergrund-Stil.',0), -25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmöglich ist, einen gültigen min/max Wert für die Y-Achse zu ermitteln (nur Null-Werte).',0), -25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfügbar. Diese Schriften können nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0), +25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmöglich ist, einen gültigen min/max Wert für die Y-Achse zu ermitteln (nur Null-Werte).',0), +25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfügbar. Diese Schriften können nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0), 25046 => array('Angegebene TTF-Schriftfamilie (id=%d) ist unbekannt oder existiert nicht. Bitte merke Dir, dass TTF-Schriften wegen Copyright-Problemen nicht mit JpGraph mitgeliefert werden. Du findest MS-TTF-Internetschriften (arial, courier, etc.) zum Herunterladen unter http://corefonts.sourceforge.net/',1), -25047 => array('Stil %s ist nicht verfügbar für Schriftfamilie %s',2), +25047 => array('Stil %s ist nicht verfügbar für Schriftfamilie %s',2), 25048 => array('Unbekannte Schriftstildefinition [%s].',1), 25049 => array('Schriftdatei "%s" ist nicht lesbar oder existiert nicht.',1), -25050 => array('Erstes Argument für Text::Text() muss ein String sein.',0), -25051 => array('Ungültige Richtung angegeben für Text.',0), -25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung für Text.',0), -25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung für Text.',0), +25050 => array('Erstes Argument für Text::Text() muss ein String sein.',0), +25051 => array('Ungültige Richtung angegeben für Text.',0), +25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung für Text.',0), +25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung für Text.',0), 25054 => array('Interner Fehler: Unbekannte Grid-Achse %s',1), 25055 => array('Axis::SetTickDirection() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetTickSide().',0), 25056 => array('SetTickLabelMargin() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelMargin().',0), @@ -324,81 +327,92 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei 25058 => array('TextLabelIntevall >= 1 muss angegeben werden.',0), 25059 => array('SetLabelPos() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelSide().',0), -25060 => array('Unbekannte Ausrichtung angegeben für X-Achsentitel (%s).',1), -25061 => array('Unbekannte Ausrichtung angegeben für Y-Achsentitel (%s).',1), -25062 => array('Label unter einem Winkel werden für die Y-Achse nicht unterstützt.',0), +25060 => array('Unbekannte Ausrichtung angegeben für X-Achsentitel (%s).',1), +25061 => array('Unbekannte Ausrichtung angegeben für Y-Achsentitel (%s).',1), +25062 => array('Label unter einem Winkel werden für die Y-Achse nicht unterstützt.',0), 25063 => array('Ticks::SetPrecision() sollte nicht mehr verwendet werden. Benutze stattdessen Ticks::SetLabelFormat() (oder Ticks::SetFormatCallback()).',0), -25064 => array('Kleinere oder größere Schrittgröße ist 0. Überprüfe, ob Du fälschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell über einen Bug in JpGraph gestolpert. Bitte sende einen Report und füge den Code an, der den Fehler verursacht hat.',0), -25065 => array('Tick-Positionen müssen als array() angegeben werden',0), +25064 => array('Kleinere oder größere Schrittgröße ist 0. Ãœberprüfe, ob Du fälschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell über einen Bug in JpGraph gestolpert. Bitte sende einen Report und füge den Code an, der den Fehler verursacht hat.',0), +25065 => array('Tick-Positionen müssen als array() angegeben werden',0), 25066 => array('Wenn die Tick-Positionen und -Label von Hand eingegeben werden, muss die Anzahl der Ticks und der Label gleich sein.',0), -25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein für den Tickabstand.',0), -25068 => array('Ein Plot hat eine ungültige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildfläche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0), -25069 => array('Grace muss größer sein als 0',0), +25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein für den Tickabstand.',0), +25068 => array('Ein Plot hat eine ungültige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildfläche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0), +25069 => array('Grace muss größer sein als 0',0), 25070 => array('Deine Daten enthalten nicht-numerische Werte.',0), -25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der größer ist als der Maximalwert für die Achse. Dies ist nicht möglich.',0), -25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht möglich.',0), -25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist außerhalb der Grenzen (r=%f).',1), -25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [für %s Achse]. Dieses Problem könnte verursacht werden durch den Versuch, \'ungültige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2), -25075 => array('Die automatischen Ticks können nicht gesetzt werden, weil min==max.',0), -25077 => array('Einstellfaktor für die Farbe muss größer sein als 0',0), +25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der größer ist als der Maximalwert für die Achse. Dies ist nicht möglich.',0), +25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht möglich.',0), +25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist außerhalb der Grenzen (r=%f).',1), +25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [für %s Achse]. Dieses Problem könnte verursacht werden durch den Versuch, \'ungültige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2), +25075 => array('Die automatischen Ticks können nicht gesetzt werden, weil min==max.',0), +25077 => array('Einstellfaktor für die Farbe muss größer sein als 0',0), 25078 => array('Unbekannte Farbe: %s',1), -25079 => array('Unbekannte Farbdefinition: %s, Größe=%d',2), +25079 => array('Unbekannte Farbdefinition: %s, Größe=%d',2), -25080 => array('Der Alpha-Parameter für Farben muss zwischen 0.0 und 1.0 liegen.',0), -25081 => array('Das ausgewählte Grafikformat wird entweder nicht unterstützt oder ist unbekannt [%s]',1), -25082 => array('Es wurden ungültige Größen für Breite und Höhe beim Erstellen des Bildes definiert (Breite=%d, Höhe=%d).',2), -25083 => array('Es wurde eine ungültige Größe beim Kopieren des Bildes angegeben. Die Größe für das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0), -25084 => array('Fehler beim Erstellen eines temporären GD-Canvas. Möglicherweise liegt ein Arbeitsspeicherproblem vor.',0), -25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht unterstützen Format oder er represäntiert ein kaputtes Bild.',0), -25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder höher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmäßig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0), -25087 => array('Diese PHP-Version wurde ohne TTF-Unterstützung konfiguriert. PHP muss mit TTF-Unterstützung neu kompiliert und installiert werden.',0), -25088 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0), -25089 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0), +25080 => array('Der Alpha-Parameter für Farben muss zwischen 0.0 und 1.0 liegen.',0), +25081 => array('Das ausgewählte Grafikformat wird entweder nicht unterstützt oder ist unbekannt [%s]',1), +25082 => array('Es wurden ungültige Größen für Breite und Höhe beim Erstellen des Bildes definiert (Breite=%d, Höhe=%d).',2), +25083 => array('Es wurde eine ungültige Größe beim Kopieren des Bildes angegeben. Die Größe für das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0), +25084 => array('Fehler beim Erstellen eines temporären GD-Canvas. Möglicherweise liegt ein Arbeitsspeicherproblem vor.',0), +25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht unterstützen Format oder er represäntiert ein kaputtes Bild.',0), +25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder höher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmäßig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0), +25087 => array('Diese PHP-Version wurde ohne TTF-Unterstützung konfiguriert. PHP muss mit TTF-Unterstützung neu kompiliert und installiert werden.',0), +25088 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0), +25089 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0), 25090 => array('Unbekannte Richtung angegeben im Aufruf von StrokeBoxedText() [%s].',1), -25091 => array('Die interne Schrift untestützt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0), -25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Möglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1), +25091 => array('Die interne Schrift untestützt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0), +25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Möglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1), 25093 => array('Die Schriftdatei "%s" kann nicht gelesen werden beim Aufruf von Image::GetBBoxTTF. Bitte versichere Dich, dass die Schrift gesetzt wurde, bevor diese Methode aufgerufen wird, und dass die Schrift im TTF-Verzeichnis installiert ist.',1), 25094 => array('Die Textrichtung muss in einem Winkel zwischen 0 und 90 engegeben werden.',0), 25095 => array('Unbekannte Schriftfamilien-Definition. ',0), -25096 => array('Der Farbpalette können keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die größtmögliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0), +25096 => array('Der Farbpalette können keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die größtmögliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0), 25097 => array('Eine Farbe wurde als leerer String im Aufruf von PushColor() angegegeben.',0), 25098 => array('Negativer Farbindex. Unpassender Aufruf von PopColor().',0), -25099 => array('Die Parameter für Helligkeit und Kontrast sind außerhalb des zulässigen Bereichs [-1,1]',0), +25099 => array('Die Parameter für Helligkeit und Kontrast sind außerhalb des zulässigen Bereichs [-1,1]',0), 25100 => array('Es liegt ein Problem mit der Farbpalette und dem GD-Setup vor. Bitte deaktiviere anti-aliasing oder verwende GD2 mit TrueColor. Wenn die GD2-Bibliothek installiert ist, versichere Dich, dass die Konstante USE_GD2 auf "true" gesetzt und TrueColor aktiviert ist.',0), -25101 => array('Ungültiges numerisches Argument für SetLineStyle(): (%d)',1), -25102 => array('Ungültiges String-Argument für SetLineStyle(): %s',1), -25103 => array('Ungültiges Argument für SetLineStyle %s',1), +25101 => array('Ungültiges numerisches Argument für SetLineStyle(): (%d)',1), +25102 => array('Ungültiges String-Argument für SetLineStyle(): %s',1), +25103 => array('Ungültiges Argument für SetLineStyle %s',1), 25104 => array('Unbekannter Linientyp: %s',1), -25105 => array('Es wurden NULL-Daten für ein gefülltes Polygon angegeben. Sorge dafür, dass keine NULL-Daten angegeben werden.',0), -25106 => array('Image::FillToBorder : es können keine weiteren Farben zugewiesen werden.',0), -25107 => array('In Datei "%s" kann nicht geschrieben werden. Überprüfe die aktuellen Schreibrechte.',1), -25108 => array('Das Bild kann nicht gestreamt werden. Möglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0), -25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu unterstützen. Sorge zunächst dafür, dass GD als PHP-Modul kompiliert ist. Wenn Du außerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0), +25105 => array('Es wurden NULL-Daten für ein gefülltes Polygon angegeben. Sorge dafür, dass keine NULL-Daten angegeben werden.',0), +25106 => array('Image::FillToBorder : es können keine weiteren Farben zugewiesen werden.',0), +25107 => array('In Datei "%s" kann nicht geschrieben werden. Ãœberprüfe die aktuellen Schreibrechte.',1), +25108 => array('Das Bild kann nicht gestreamt werden. Möglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0), +25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu unterstützen. Sorge zunächst dafür, dass GD als PHP-Modul kompiliert ist. Wenn Du außerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0), -25110 => array('Dein PHP-Installation unterstützt das gewählte Grafikformat nicht: %s',1), -25111 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1), +25110 => array('Dein PHP-Installation unterstützt das gewählte Grafikformat nicht: %s',1), +25111 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1), 25112 => array('Das Datum der gecacheten Datei (%s) liegt in der Zukunft.',1), -25113 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1), -25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte für die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1), -25115 => array('Berechtigung für gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1), -25116 => array('Datei kann nicht aus dem Cache %s geöffnet werden',1), -25117 => array('Gecachetes Bild %s kann nicht zum Lesen geöffnet werden.',1), +25113 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1), +25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte für die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1), +25115 => array('Berechtigung für gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1), +25116 => array('Datei kann nicht aus dem Cache %s geöffnet werden',1), +25117 => array('Gecachetes Bild %s kann nicht zum Lesen geöffnet werden.',1), 25118 => array('Verzeichnis %s kann nicht angelegt werden. Versichere Dich, dass PHP die Schreibrechte in diesem Verzeichnis hat.',1), -25119 => array('Rechte für Datei %s können nicht gesetzt werden. Problem mit den Rechten?',1), +25119 => array('Rechte für Datei %s können nicht gesetzt werden. Problem mit den Rechten?',1), -25120 => array('Die Position für die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0), -25121 => array('Eine leerer Datenvektor wurde für den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0), +25120 => array('Die Position für die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0), +25121 => array('Eine leerer Datenvektor wurde für den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0), 25122 => array('Stroke() muss als Subklasse der Klasse Plot definiert sein.',0), 25123 => array('Du kannst keine Text-X-Achse mit X-Koordinaten verwenden. Benutze stattdessen eine "int" oder "lin" Achse.',0), -25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwärts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0), -25125 => array('Ungültige Richtung für statische Linie.',0), -25126 => array('Es kann kein TrueColor-Bild erzeugt werden. Überprüfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0), +25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwärts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0), +25125 => array('Ungültige Richtung für statische Linie.',0), +25126 => array('Es kann kein TrueColor-Bild erzeugt werden. Ãœberprüfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0), 25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0), 25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0), 25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0), +25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2), + +25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0), + +/* +** jpgraph_led +*/ + +25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0), + + /* **--------------------------------------------------------------------------------------------- ** Pro-version strings @@ -409,19 +423,19 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_table */ -27001 => array('GTextTable: Ungültiges Argument für Set(). Das Array-Argument muss 2-- dimensional sein.',0), -27002 => array('GTextTable: Ungültiges Argument für Set()',0), -27003 => array('GTextTable: Falsche Anzahl von Argumenten für GTextTable::SetColor()',0), -27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungültig.',0), -27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) können nicht ein weiteres Mal verschmolzen werden.',4), -27006 => array('GTextTable: Spalten-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1), -27007 => array('GTextTable: Zeilen-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1), -27008 => array('GTextTable: Spalten- und Zeilengröße müssen zu den Dimensionen der Tabelle passen.',0), +27001 => array('GTextTable: Ungültiges Argument für Set(). Das Array-Argument muss 2-- dimensional sein.',0), +27002 => array('GTextTable: Ungültiges Argument für Set()',0), +27003 => array('GTextTable: Falsche Anzahl von Argumenten für GTextTable::SetColor()',0), +27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungültig.',0), +27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) können nicht ein weiteres Mal verschmolzen werden.',4), +27006 => array('GTextTable: Spalten-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1), +27007 => array('GTextTable: Zeilen-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1), +27008 => array('GTextTable: Spalten- und Zeilengröße müssen zu den Dimensionen der Tabelle passen.',0), 27009 => array('GTextTable: Die Anzahl der Tabellenspalten oder -zeilen ist 0. Versichere Dich, dass die Methoden Init() oder Set() aufgerufen werden.',0), 27010 => array('GTextTable: Es wurde keine Ausrichtung beim Aufruf von SetAlign() angegeben.',0), 27011 => array('GTextTable: Es wurde eine unbekannte Ausrichtung beim Aufruf von SetAlign() abgegeben. Horizontal=%s, Vertikal=%s',2), -27012 => array('GTextTable: Interner Fehler. Es wurde ein ungültiges Argument festgeleget %s',1), -27013 => array('GTextTable: Das Argument für FormatNumber() muss ein String sein.',0), +27012 => array('GTextTable: Interner Fehler. Es wurde ein ungültiges Argument festgeleget %s',1), +27013 => array('GTextTable: Das Argument für FormatNumber() muss ein String sein.',0), 27014 => array('GTextTable: Die Tabelle wurde weder mit einem Aufruf von Set() noch von Init() initialisiert.',0), 27015 => array('GTextTable: Der Zellenbildbedingungstyp muss entweder TIMG_WIDTH oder TIMG_HEIGHT sein.',0), @@ -429,25 +443,25 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_windrose */ -22001 => array('Die Gesamtsumme der prozentualen Anteile aller Windrosenarme darf 100%% nicht überschreiten!\n(Aktuell max: %d)',1), -22002 => array('Das Bild ist zu klein für eine Skala. Bitte vergrößere das Bild.',0), -22004 => array('Die Etikettendefinition für Windrosenrichtungen müssen 16 Werte haben (eine für jede Kompassrichtung).',0), -22005 => array('Der Linientyp für radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0), -22006 => array('Es wurde ein ungültiger Windrosentyp angegeben.',0), -22007 => array('Es wurden zu wenig Werte für die Bereichslegende angegeben.',0), +22001 => array('Die Gesamtsumme der prozentualen Anteile aller Windrosenarme darf 100%% nicht überschreiten!\n(Aktuell max: %d)',1), +22002 => array('Das Bild ist zu klein für eine Skala. Bitte vergrößere das Bild.',0), +22004 => array('Die Etikettendefinition für Windrosenrichtungen müssen 16 Werte haben (eine für jede Kompassrichtung).',0), +22005 => array('Der Linientyp für radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0), +22006 => array('Es wurde ein ungültiger Windrosentyp angegeben.',0), +22007 => array('Es wurden zu wenig Werte für die Bereichslegende angegeben.',0), 22008 => array('Interner Fehler: Versuch, eine freie Windrose zu plotten, obwohl der Typ keine freie Windrose ist.',0), 22009 => array('Du hast die gleiche Richtung zweimal angegeben, einmal mit einem Winkel und einmal mit einer Kompassrichtung (%f Grad).',0), 22010 => array('Die Richtung muss entweder ein numerischer Wert sein oder eine der 16 Kompassrichtungen',0), 22011 => array('Der Windrosenindex muss ein numerischer oder Richtungswert sein. Du hast angegeben Index=%d',1), -22012 => array('Die radiale Achsendefinition für die Windrose enthält eine nicht aktivierte Richtung.',0), -22013 => array('Du hast dasselbe Look&Feel für die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), -22014 => array('Der Index für eine Kompassrichtung muss zwischen 0 und 15 sein.',0), +22012 => array('Die radiale Achsendefinition für die Windrose enthält eine nicht aktivierte Richtung.',0), +22013 => array('Du hast dasselbe Look&Feel für die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), +22014 => array('Der Index für eine Kompassrichtung muss zwischen 0 und 15 sein.',0), 22015 => array('Du hast einen unbekannten Windrosenplottyp angegeben.',0), 22016 => array('Der Windrosenarmindex muss ein numerischer oder ein Richtungswert sein.',0), 22017 => array('Die Windrosendaten enthalten eine Richtung, die nicht aktiviert ist. Bitte berichtige, welche Label angezeigt werden sollen.',0), -22018 => array('Du hast für dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), -22019 => array('Der Index für eine Richtung muss zwischen 0 und 15 sein. Winkel dürfen nicht für einen regelmäßigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0), -22020 => array('Der Windrosenplot ist zu groß für die angegebene Bildgröße. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrößere das Bild im ursprünglichen Aufruf von WindroseGraph().',0), +22018 => array('Du hast für dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), +22019 => array('Der Index für eine Richtung muss zwischen 0 und 15 sein. Winkel dürfen nicht für einen regelmäßigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0), +22020 => array('Der Windrosenplot ist zu groß für die angegebene Bildgröße. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrößere das Bild im ursprünglichen Aufruf von WindroseGraph().',0), 22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0), /* @@ -455,7 +469,7 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei */ 13001 => array('Unbekannter Nadeltypstil (%d).',1), -13002 => array('Ein Wert für das Odometer (%f) ist außerhalb des angegebenen Bereichs [%f,%f]',3), +13002 => array('Ein Wert für das Odometer (%f) ist außerhalb des angegebenen Bereichs [%f,%f]',3), /* ** jpgraph_barcode @@ -463,38 +477,64 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei 1001 => array('Unbekannte Kodier-Specifikation: %s',1), 1002 => array('datenvalidierung schlug fehl. [%s] kann nicht mittels der Kodierung "%s" kodiert werden',2), -1003 => array('Interner Kodierfehler. Kodieren von %s ist nicht möglich in Code 128',1), +1003 => array('Interner Kodierfehler. Kodieren von %s ist nicht möglich in Code 128',1), 1004 => array('Interner barcode Fehler. Unbekannter UPC-E Kodiertyp: %s',1), 1005 => array('Interner Fehler. Das Textzeichen-Tupel (%s, %s) kann nicht im Code-128 Zeichensatz C kodiert werden.',2), -1006 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0), -1007 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0), -1008 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0), -1009 => array('Kodieren mittels CODE 93 wird noch nicht unterstützt.',0), -1010 => array('Kodieren mittels POSTNET wird noch nicht unterstützt.',0), -1011 => array('Nicht untrstütztes Barcode-Backend für den Typ %s',1), +1006 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0), +1007 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0), +1008 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0), +1009 => array('Kodieren mittels CODE 93 wird noch nicht unterstützt.',0), +1010 => array('Kodieren mittels POSTNET wird noch nicht unterstützt.',0), +1011 => array('Nicht untrstütztes Barcode-Backend für den Typ %s',1), /* ** PDF417 */ +26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0), 26001 => array('PDF417: Die Anzahl der Spalten muss zwischen 1 und 30 sein.',0), 26002 => array('PDF417: Der Fehler-Level muss zwischen 0 und 8 sein.',0), -26003 => array('PDF417: Ungültiges Format für Eingabedaten, um sie mit PDF417 zu kodieren.',0), -26004 => array('PDF417: die eigebenen Daten können nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2), -26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geöffnet werden.',1), -26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei für PDF417-Cluster %d ist fehlerhaft.',1), -26007 => array('PDF417: Interner Fehler. GetPattern: Ungültiger Code-Wert %d (Zeile %d)',2), +26003 => array('PDF417: Ungültiges Format für Eingabedaten, um sie mit PDF417 zu kodieren.',0), +26004 => array('PDF417: die eigebenen Daten können nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2), +26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geöffnet werden.',1), +26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei für PDF417-Cluster %d ist fehlerhaft.',1), +26007 => array('PDF417: Interner Fehler. GetPattern: Ungültiger Code-Wert %d (Zeile %d)',2), 26008 => array('PDF417: Interner Fehler. Modus wurde nicht in der Modusliste!! Modus %d',1), -26009 => array('PDF417: Kodierfehler: Ungültiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1), +26009 => array('PDF417: Kodierfehler: Ungültiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1), 26010 => array('PDF417: Interner Fehler: Keine Eingabedaten beim Dekodieren.',0), -26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht möglich.',0), -26012 => array('PDF417: Interner Fehler. Es wurden für den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0), +26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht möglich.',0), +26012 => array('PDF417: Interner Fehler. Es wurden für den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0), 26013 => array('PDF417: Interner Fehler. Checksum Fehler. Koeffiziententabellen sind fehlerhaft.',0), -26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewörtern eingegeben.',0), -26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusübertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1), -26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusübertragungsmodus beim Dekodieren.',0), +26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewörtern eingegeben.',0), +26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusübertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1), +26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusübertragungsmodus beim Dekodieren.',0), +/* +** jpgraph_contour +*/ + +28001 => array('Dritten parameter fur Contour muss ein vector der fargen sind.',0), +28002 => array('Die anzahlen der farges jeder isobar linien muss gleich sein.',0), +28003 => array('ContourPlot Interner Fehler: isobarHCrossing: Spalten index ist zu hoch (%d)',1), +28004 => array('ContourPlot Interner Fehler: isobarHCrossing: Reihe index ist zu hoch (%d)',1), +28005 => array('ContourPlot Interner Fehler: isobarVCrossing: Reihe index ist zu hoch (%d)',1), +28006 => array('ContourPlot Interner Fehler: isobarVCrossing: Spalten index ist zu hoch (%d)',1), +28007 => array('ContourPlot. Interpolation faktor ist zu hoch (>5)',0), + + +/* + * jpgraph_matrix and colormap +*/ +29201 => array('Min range value must be less or equal to max range value for colormaps',0), +29202 => array('The distance between min and max value is too small for numerical precision',0), +29203 => array('Number of color quantification level must be at least %d',1), +29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3), +29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1), +29206 => array('Invalid object added to MatrixGraph'), +29207 => array('Empty input data specified for MatrixPlot'), +29208 => array('Unknown side specifiction for matrix labels "%s"',1), + ); ?> diff --git a/libs/jpgraph/lang/en.inc.php b/libs/jpgraph/lang/en.inc.php index e61080e..cc7c47b 100644 --- a/libs/jpgraph/lang/en.inc.php +++ b/libs/jpgraph/lang/en.inc.php @@ -1,9 +1,9 @@ array('
JpGraph Error: +10 => array('
JpGraph Error: HTTP headers have already been sent.
Caused by output from file %s at line %d.
Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).

Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser.

For example it is a common mistake to leave a blank line before the opening "<?php".

',2), /* @@ -44,6 +44,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 2012 => array('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects. (Class=%s)',1), 2013 => array('You have specified an empty array for shadow colors in the bar plot.',0), 2014 => array('Number of datapoints for each data set in accbarplot must be the same',0), +2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0), /* @@ -74,8 +75,8 @@ HTTP headers have already been sent.
Caused by output from file %s at 6001 => array('Internal error. Height for ActivityTitles is < 0',0), 6002 => array('You can\'t specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.',0), -6003 => array('Invalid format for Constrain parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)',1), -6004 => array('Invalid format for Progress parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)',1), +6003 => array('Invalid format for Constrain parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)',1), +6004 => array('Invalid format for Progress parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)',1), 6005 => array('SetScale() is not meaningful with Gantt charts.',0), 6006 => array('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]',0), 6007 => array('Sanity check for automatic Gantt chart size failed. Either the width (=%d) or height (=%d) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities.',2), @@ -101,6 +102,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 6030 => array('Unknown arrow direction for link.',0), 6031 => array('Unknown arrow type for link.',0), 6032 => array('Internal error: Unknown path type (=%d) specified for link.',1), +6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0), /* ** jpgraph_gradient @@ -255,6 +257,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 24001 => array('FuncGenerator : No function specified. ',0), 24002 => array('FuncGenerator : Syntax error in function specification ',0), 24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0), +24004 => array('ReadCSV2: Column count mismatch in %s line %d',2), /* ** jpgraph */ @@ -270,11 +273,11 @@ HTTP headers have already been sent.
Caused by output from file %s at 25009 => array('You must specify what scale to use with a call to Graph::SetScale()',0), 25010 => array('Graph::Add() You tried to add a null plot to the graph.',0), -25011 => array('Graph::AddY2() You tried to add a null plot to the graph.',0), -25012 => array('Graph::AddYN() You tried to add a null plot to the graph.',0), +25011 => array('Graph::AddY2() You tried to add a null plot to the graph.',0), +25012 => array('Graph::AddYN() You tried to add a null plot to the graph.',0), 25013 => array('You can only add standard plots to multiple Y-axis',0), -25014 => array('Graph::AddText() You tried to add a null text to the graph.',0), -25015 => array('Graph::AddLine() You tried to add a null line to the graph.',0), +25014 => array('Graph::AddText() You tried to add a null text to the graph.',0), +25015 => array('Graph::AddLine() You tried to add a null line to the graph.',0), 25016 => array('Graph::AddBand() You tried to add a null band to the graph.',0), 25017 => array('You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.',0), 25018 => array('Incorrect file name for Graph::SetBackgroundImage() : "%s" Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1), @@ -300,7 +303,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 25036 => array('Unknown AxisStyle() : %s',1), 25037 => array('The image format of your background image (%s) is not supported in your system configuration. ',1), 25038 => array('Background image seems to be of different type (has different file extension) than specified imagetype. Specified: %s File: %s',2), -25039 => array('Can\'t read background image: "%s"',1), +25039 => array('Can\'t read background image: "%s"',1), 25040 => array('It is not possible to specify both a background image and a background country flag.',0), 25041 => array('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.',0), @@ -320,7 +323,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 25054 => array('Internal error: Unknown grid axis %s',1), 25055 => array('Axis::SetTickDirection() is deprecated. Use Axis::SetTickSide() instead',0), 25056 => array('SetTickLabelMargin() is deprecated. Use Axis::SetLabelMargin() instead.',0), -25057 => array('SetTextTicks() is deprecated. Use SetTextTickInterval() instead.',0), +25057 => array('SetTextTicks() is deprecated. Use SetTextTickInterval() instead.',0), 25058 => array('Text label interval must be specified >= 1.',0), 25059 => array('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.',0), @@ -364,7 +367,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 25096 => array('Can\'t allocate any more colors in palette image. Image has already allocated maximum of %d colors and the palette is now full. Change to a truecolor image instead',0), 25097 => array('Color specified as empty string in PushColor().',0), 25098 => array('Negative Color stack index. Unmatched call to PopColor()',0), -25099 => array('Parameters for brightness and Contrast out of range [-1,1]',0), +25099 => array('Parameters for brightness and Contrast out of range [-1,1]',0), 25100 => array('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and truecolor is enabled.',0), 25101 => array('Illegal numeric argument to SetLineStyle(): (%d)',1), @@ -383,7 +386,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 25113 => array('Can\'t delete cached image "%s". Permission problem?',1), 25114 => array('PHP has not enough permissions to write to the cache file "%s". Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.',1), 25115 => array('Can\'t set permission for cached image "%s". Permission problem?',1), -25116 => array('Cant open file from cache "%s"',1), +25116 => array('Cant open file from cache "%s"',1), 25117 => array('Can\'t open cached image "%s" for reading.',1), 25118 => array('Can\'t create directory "%s". Make sure PHP has write permission to this directory.',1), 25119 => array('Can\'t set permissions for "%s". Permission problems?',1), @@ -398,7 +401,15 @@ HTTP headers have already been sent.
Caused by output from file %s at 25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0), 25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0), 25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0), +25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2), +25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0), + +/* +** jpgraph_led +*/ + +25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0), /* **--------------------------------------------------------------------------------------------- @@ -407,7 +418,7 @@ HTTP headers have already been sent.
Caused by output from file %s at */ /* -** jpgraph_table +** jpgraph_table */ 27001 => array('GTextTable: Invalid argument to Set(). Array argument must be 2 dimensional',0), @@ -476,7 +487,7 @@ HTTP headers have already been sent.
Caused by output from file %s at /* ** PDF417 */ - +26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0), 26001 => array('PDF417: Number of Columns must be >= 1 and <= 30',0), 26002 => array('PDF417: Error level must be between 0 and 8',0), 26003 => array('PDF417: Invalid format for input data to encode with PDF417',0), @@ -494,6 +505,30 @@ HTTP headers have already been sent.
Caused by output from file %s at 26015 => array('PDF417: Internal error. State transition table entry 0 is NULL. Entry 1 = (%s)',1), 26016 => array('PDF417: Internal error: Unrecognized state transition mode in decode.',0), +/* +** jpgraph_contour +*/ + +28001 => array('Third argument to Contour must be an array of colors.',0), +28002 => array('Number of colors must equal the number of isobar lines specified',0), +28003 => array('ContourPlot Internal Error: isobarHCrossing: Coloumn index too large (%d)',1), +28004 => array('ContourPlot Internal Error: isobarHCrossing: Row index too large (%d)',1), +28005 => array('ContourPlot Internal Error: isobarVCrossing: Row index too large (%d)',1), +28006 => array('ContourPlot Internal Error: isobarVCrossing: Col index too large (%d)',1), +28007 => array('ContourPlot interpolation factor is too large (>5)',0), + +/* + * jpgraph_matrix and colormap +*/ +29201 => array('Min range value must be less or equal to max range value for colormaps',0), +29202 => array('The distance between min and max value is too small for numerical precision',0), +29203 => array('Number of color quantification level must be at least %d',1), +29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3), +29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1), +29206 => array('Invalid object added to MatrixGraph'), +29207 => array('Empty input data specified for MatrixPlot'), +29208 => array('Unknown side specifiction for matrix labels "%s"',1), + ); diff --git a/libs/jpgraph/lang/prod.inc.php b/libs/jpgraph/lang/prod.inc.php index f04e30d..969a4c8 100644 --- a/libs/jpgraph/lang/prod.inc.php +++ b/libs/jpgraph/lang/prod.inc.php @@ -1,10 +1,10 @@ array('
JpGraph Error: +10 => array('
JpGraph Error: HTTP headers have already been sent.
Caused by output from file %s at line %d.
Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).

Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser.

For example it is a common mistake to leave a blank line before the opening "<?php".

',2), @@ -75,6 +75,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 6030 => array(DEFAULT_ERROR_MESSAGE.'6030',0), 6031 => array(DEFAULT_ERROR_MESSAGE.'6031',0), 6032 => array(DEFAULT_ERROR_MESSAGE.'6032',0), +6033 => array(DEFAULT_ERROR_MESSAGE.'6033',0), 7001 => array(DEFAULT_ERROR_MESSAGE.'7001',0), 8001 => array(DEFAULT_ERROR_MESSAGE.'8001',0), 8002 => array(DEFAULT_ERROR_MESSAGE.'8002',0), @@ -147,6 +148,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 24001 => array(DEFAULT_ERROR_MESSAGE.'24001',0), 24002 => array(DEFAULT_ERROR_MESSAGE.'24002',0), 24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0), +24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0), 25001 => array(DEFAULT_ERROR_MESSAGE.'25001',0), 25002 => array(DEFAULT_ERROR_MESSAGE.'25002',0), 25003 => array(DEFAULT_ERROR_MESSAGE.'25003',0), @@ -275,6 +277,9 @@ HTTP headers have already been sent.
Caused by output from file %s at 25127 => array(DEFAULT_ERROR_MESSAGE.'25127',0), 25128 => array(DEFAULT_ERROR_MESSAGE.'25128',0), 25129 => array(DEFAULT_ERROR_MESSAGE.'25129',0), +25130 => array(DEFAULT_ERROR_MESSAGE.'25130',0), +25131 => array(DEFAULT_ERROR_MESSAGE.'25131',0), +25500 => array(DEFAULT_ERROR_MESSAGE.'25500',0), 24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0), 24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0), 24005 => array(DEFAULT_ERROR_MESSAGE.'24005',0), @@ -320,6 +325,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 1009 => array(DEFAULT_ERROR_MESSAGE.'1009',0), 1010 => array(DEFAULT_ERROR_MESSAGE.'1010',0), 1011 => array(DEFAULT_ERROR_MESSAGE.'1011',0), +26000 => array(DEFAULT_ERROR_MESSAGE.'26000',0), 26001 => array(DEFAULT_ERROR_MESSAGE.'26001',0), 26002 => array(DEFAULT_ERROR_MESSAGE.'26002',0), 26003 => array(DEFAULT_ERROR_MESSAGE.'26003',0), @@ -352,6 +358,24 @@ HTTP headers have already been sent.
Caused by output from file %s at 27013 => array(DEFAULT_ERROR_MESSAGE.'27013',0), 27014 => array(DEFAULT_ERROR_MESSAGE.'27014',0), 27015 => array(DEFAULT_ERROR_MESSAGE.'27015',0), + +28001 => array(DEFAULT_ERROR_MESSAGE.'28001',0), +28002 => array(DEFAULT_ERROR_MESSAGE.'28002',0), +28003 => array(DEFAULT_ERROR_MESSAGE.'28003',0), +28004 => array(DEFAULT_ERROR_MESSAGE.'28004',0), +28005 => array(DEFAULT_ERROR_MESSAGE.'28005',0), +28006 => array(DEFAULT_ERROR_MESSAGE.'28006',0), +28007 => array(DEFAULT_ERROR_MESSAGE.'28007',0), + +29201 => array(DEFAULT_ERROR_MESSAGE.'28001',0), +29202 => array(DEFAULT_ERROR_MESSAGE.'28002',0), +29203 => array(DEFAULT_ERROR_MESSAGE.'28003',0), +29204 => array(DEFAULT_ERROR_MESSAGE.'28004',0), +29205 => array(DEFAULT_ERROR_MESSAGE.'28005',0), +29206 => array(DEFAULT_ERROR_MESSAGE.'28006',0), +29207 => array(DEFAULT_ERROR_MESSAGE.'28007',0), +29208 => array(DEFAULT_ERROR_MESSAGE.'28008',0), + ); ?> diff --git a/utilities/lighttpd_mod_rewrite.txt b/lighttpd_mod_rewrite.txt similarity index 100% rename from utilities/lighttpd_mod_rewrite.txt rename to lighttpd_mod_rewrite.txt diff --git a/modules/default/controllers/AboutController.php b/modules/default/controllers/AboutController.php index 20ec4ca..3395463 100644 --- a/modules/default/controllers/AboutController.php +++ b/modules/default/controllers/AboutController.php @@ -1,7 +1,7 @@ view->translate('The URL you entered is incorrect. Please correct and try again.'); + break; + case 'Monkeys_AccessDeniedException': + return $this->view->translate('Access Denied - Maybe your session has expired? Try logging-in again.'); + break; + default: + return $ex; + } + } } diff --git a/modules/default/controllers/FeedbackController.php b/modules/default/controllers/FeedbackController.php index bcef031..e2ddad2 100644 --- a/modules/default/controllers/FeedbackController.php +++ b/modules/default/controllers/FeedbackController.php @@ -1,7 +1,7 @@ getUsers() as $user) { if ($user->role == Users_Model_User::ROLE_ADMIN) { continue; @@ -80,9 +83,9 @@ class MessageusersController extends CommunityID_Controller_Action try { $mail->send(); - $this->_helper->FlashMessenger->addMessage('Message has been sent'); + $this->_helper->FlashMessenger->addMessage($this->view->translate('Message has been sent')); } catch (Zend_Mail_Protocol_Exception $e) { - $this->_helper->FlashMessenger->addMessage('There was an error trying to send the message'); + $this->_helper->FlashMessenger->addMessage($this->view->translate('There was an error trying to send the message')); if ($this->_config->logging->level == Zend_Log::DEBUG) { $this->_helper->FlashMessenger->addMessage($e->getMessage()); diff --git a/modules/default/controllers/OpenidController.php b/modules/default/controllers/OpenidController.php index 6b362ab..2ac3dca 100644 --- a/modules/default/controllers/OpenidController.php +++ b/modules/default/controllers/OpenidController.php @@ -1,7 +1,7 @@ _helper->viewRenderer->setNeverRender(true); $this->_response->setRawHeader('HTTP/1.0 403 Forbidden'); Zend_Registry::get('logger')->log("OpenIdController::providerAction: FORBIDDEN", Zend_Log::DEBUG); - echo 'Forbidden'; + echo $this->view->translate('Forbidden'); return; } @@ -37,13 +37,15 @@ class OpenidController extends CommunityID_Controller_Action return $this->_sendResponse($server, $request->answer(false)); } + $trustRoot = $this->_getTrustRoot($request); + if ($request->idSelect()) { if ($this->user->role == Users_Model_User::ROLE_GUEST) { $this->_forward('login'); } else { - if ($sites->isTrusted($this->user, $request->trust_root)) { + if ($sites->isTrusted($this->user, $trustRoot)) { $this->_forward('proceed', null, null, array('allow' => true)); - } elseif ($sites->isNeverTrusted($this->user, $request->trust_root)) { + } elseif ($sites->isNeverTrusted($this->user, $trustRoot)) { $this->_forward('proceed', null, null, array('allow' => false)); } else { if ($request->immediate) { @@ -69,15 +71,28 @@ class OpenidController extends CommunityID_Controller_Action } $this->_forward('login'); - } else { - if ($sites->isTrusted($this->user, $request->trust_root)) { - $this->_forward('proceed', null, null, array('allow' => true)); - } elseif ($sites->isNeverTrusted($this->user, $request->trust_root)) { - $this->_forward('proceed', null, null, array('deny' => true)); - } else { - $this->_forward('trust'); + return; + } + + // Check if max_auth_age is requested through the PAPE extension + require_once 'libs/Auth/OpenID/PAPE.php'; + if ($papeRequest = Auth_OpenID_PAPE_Request::fromOpenIDRequest($request)) { + $extensionArgs = $papeRequest->getExtensionArgs(); + if (isset($extensionArgs['max_auth_age']) + && $extensionArgs['max_auth_age'] < $this->user->getSecondsSinceLastLogin()) + { + $this->_forward('login'); + return; } } + + if ($sites->isTrusted($this->user, $trustRoot)) { + $this->_forward('proceed', null, null, array('allow' => true)); + } elseif ($sites->isNeverTrusted($this->user, $trustRoot)) { + $this->_forward('proceed', null, null, array('deny' => true)); + } else { + $this->_forward('trust'); + } } } } @@ -90,16 +105,36 @@ class OpenidController extends CommunityID_Controller_Action $server = $this->_getOpenIdProvider(); $request = $server->decodeRequest(); + $this->view->yubikey = $this->_config->yubikey; + $authAttempts = new Users_Model_AuthAttempts(); $attempt = $authAttempts->get(); $this->view->useCaptcha = $attempt && $attempt->surpassedMaxAllowed(); $this->view->form = new Form_OpenidLogin(null, $this->view->base, $attempt && $attempt->surpassedMaxAllowed()); - if (!$request->idSelect()) { - $this->view->form->openIdIdentity->setValue(htmlspecialchars($request->identity)); + if ($this->_getParam('invalidCaptcha')) { + $this->view->form->captcha->addError($this->view->translate('Captcha value is wrong')); + } + + if ($this->_getParam('invalidLogin')) { + $this->view->form->addError($this->view->translate('Invalid credentials')); + } + + if ($request->idSelect()) { + $this->view->identity = false; + $this->view->form->openIdIdentity->setRequired(true); + } else { + $this->view->identity = $request->identity; } $this->view->queryString = $this->_queryString(); + + if ($this->user->role == Users_Model_User::ROLE_GUEST && @$_COOKIE['image']) { + $images = new Users_Model_SigninImages(); + $this->view->image = $images->getByCookie($_COOKIE['image']); + } else { + $this->view->image = false; + } } public function authenticateAction() @@ -115,22 +150,35 @@ class OpenidController extends CommunityID_Controller_Action $form->populate($formData); if (!$form->isValid($formData)) { - $this->_forward('login'); + $formErrors = $form->getErrors(); + // gotta resort to pass errors as params because we don't use the session here + if (@$formErrors['captcha']) { + $this->_forward('login', null, null, array('invalidCaptcha' => true)); + } else { + $this->_forward('login'); + } return; } $users = new Users_Model_Users(); - $result = $users->authenticate($form->getValue('openIdIdentity'), - $form->getValue('password'), true); + $result = $users->authenticate( + $request->idSelect()? $form->getValue('openIdIdentity') : $request->identity, + $this->_config->yubikey->enabled && $this->_config->yubikey->force? + $form->getValue('yubikey') + : $form->getValue('password'), + true, + $this->view + ); if ($result) { if ($attempt) { $attempt->delete(); } $sites = new Model_Sites(); - if ($sites->isTrusted($users->getUser(), $request->trust_root)) { + $trustRoot = $this->_getTrustRoot($request); + if ($sites->isTrusted($users->getUser(), $trustRoot)) { $this->_forward('proceed', null, null, array('allow' => true)); - } elseif ($sites->isNeverTrusted($users->getUser(), $request->trust_root)) { + } elseif ($sites->isNeverTrusted($users->getUser(), $trustRoot)) { $this->_forward('proceed', null, null, array('deny' => true)); } else { $this->_forward('trust'); @@ -142,7 +190,7 @@ class OpenidController extends CommunityID_Controller_Action $attempt->addFailure(); $attempt->save(); } - $this->_forward('login'); + $this->_forward('login', null, null, array('invalidLogin' => true)); } } @@ -151,38 +199,11 @@ class OpenidController extends CommunityID_Controller_Action $server = $this->_getOpenIdProvider(); $request = $server->decodeRequest(); - $this->view->siteRoot = $request->trust_root; + $this->view->siteRoot = $this->_getTrustRoot($request); $this->view->identityUrl = $this->user->openid; $this->view->queryString = $this->_queryString(); - $this->view->fields = array(); - $this->view->policyUrl = false; - - // The class Auth_OpenID_SRegRequest is included in the following file - require_once 'libs/Auth/OpenID/SReg.php'; - - $sregRequest = Auth_OpenID_SRegRequest::fromOpenIDRequest($request); - $props = $sregRequest->allRequestedFields(); - $args = $sregRequest->getExtensionArgs(); - if (isset($args['required'])) { - $required = explode(',', $args['required']); - } else { - $required = false; - } - - if (is_array($props) && count($props) > 0) { - $sregProps = array(); - foreach ($props as $field) { - $sregProps[$field] = $required && in_array($field, $required); - } - - $personalInfoForm = new Users_Form_PersonalInfo(null, $this->user, $sregProps); - $this->view->fields = $personalInfoForm->getElements(); - - if (isset($args['policy_url'])) { - $this->view->policyUrl = $args['policy_url']; - } - } + $this->view->showProfileForm = $this->_hasSreg($request); } public function proceedAction() @@ -202,25 +223,12 @@ class OpenidController extends CommunityID_Controller_Action $response = $request->answer(true, null, $id); - // The class Auth_OpenID_SRegRequest is included in the following file - require_once 'libs/Auth/OpenID/SReg.php'; - - $sregRequest = Auth_OpenID_SRegRequest::fromOpenIDRequest($request); - $props = $sregRequest->allRequestedFields(); - $args = $sregRequest->getExtensionArgs(); - if (isset($args['required'])) { - $required = explode(',', $args['required']); - } else { - $required = false; - } - - if (is_array($props) && count($props) > 0) { - $sregProps = array(); - foreach ($props as $field) { - $sregProps[$field] = $required && in_array($field, $required); - } - - $personalInfoForm = new Users_Form_PersonalInfo(null, $this->user, $sregProps); + if ($this->_hasSreg($request) + // profileId will be null if site is already trusted + && $this->_getParam('profileId')) { + $profiles = new Users_Model_Profiles(); + $profile = $profiles->getRowInstance($this->_getParam('profileId')); + $personalInfoForm = Users_Form_PersonalInfo::getForm($request, $profile); $formData = $this->_request->getPost(); $personalInfoForm->populate($formData); @@ -228,20 +236,23 @@ class OpenidController extends CommunityID_Controller_Action // for the date element to be filled properly $foo = $personalInfoForm->isValid($formData); - $sregResponse = Auth_OpenID_SRegResponse::extractResponse($sregRequest, + $sregResponse = Auth_OpenID_SRegResponse::extractResponse( + $personalInfoForm->getSregRequest(), $personalInfoForm->getUnqualifiedValues()); $sregResponse->toMessage($response->fields); } + $trustRoot= $this->_getTrustRoot($request); + if ($this->_getParam('allow')) { if ($this->_getParam('forever')) { $sites = new Model_Sites(); - $sites->deleteForUserSite($this->user, $request->trust_root); + $sites->deleteForUserSite($this->user, $trustRoot); $siteObj = $sites->createRow(); $siteObj->user_id = $this->user->id; - $siteObj->site = $request->trust_root; + $siteObj->site = $trustRoot; $siteObj->creation_date = date('Y-m-d'); if (isset($personalInfoForm)) { @@ -256,7 +267,12 @@ class OpenidController extends CommunityID_Controller_Action $siteObj->save(); } - $this->_saveHistory($request->trust_root, Model_History::AUTHORIZED); + $this->_saveHistory($trustRoot, Model_History::AUTHORIZED); + + require_once 'libs/Auth/OpenID/PAPE.php'; + if ($papeRequest = Auth_OpenID_PAPE_Request::fromOpenIDRequest($request)) { + $this->_processPape($papeRequest, $response); + } $webresponse = $server->encodeResponse($response); @@ -273,17 +289,17 @@ class OpenidController extends CommunityID_Controller_Action } elseif ($this->_getParam('deny')) { if ($this->_getParam('forever')) { $sites = new Model_Sites(); - $sites->deleteForUserSite($this->user, $request->trust_root); + $sites->deleteForUserSite($this->user, $trustRoot); $siteObj = $sites->createRow(); $siteObj->user_id = $this->user->id; - $siteObj->site = $request->trust_root; + $siteObj->site = $trustRoot; $siteObj->creation_date = date('Y-m-d'); $siteObj->trusted = serialize(false); $siteObj->save(); } - $this->_saveHistory($request->trust_root, Model_History::DENIED); + $this->_saveHistory($trustRoot, Model_History::DENIED); return $this->_sendResponse($server, $request->answer(false)); } @@ -301,15 +317,6 @@ class OpenidController extends CommunityID_Controller_Action $history->save(); } - private function _getOpenIdProvider() - { - $connection = new CommunityID_OpenId_DatabaseConnection(Zend_Registry::get('db')); - $store = new Auth_OpenID_MySQLStore($connection, 'associations', 'nonces'); - $server = new Auth_OpenID_Server($store, $this->_helper->ProviderUrl($this->_config)); - - return $server; - } - private function _sendResponse(Auth_OpenID_Server $server, Auth_OpenID_ServerResponse $response) { $this->_helper->layout->disableLayout(); @@ -334,37 +341,37 @@ class OpenidController extends CommunityID_Controller_Action $this->_response->appendBody($webresponse->body); } - - /** - * Circumvent PHP's automatic replacement of dots by underscore in var names in $_GET and $_POST - */ - private function _queryString() + private function _getTrustRoot(Auth_OpenID_Request $request) { - $unfilteredVars = array_merge($_GET, $_POST); - $varsTemp = array(); - $vars = array(); - $extensions = array(); - foreach ($unfilteredVars as $key => $value) { - if (substr($key, 0, 10) == 'openid_ns_') { - $extensions[] = substr($key, 10); - $varsTemp[str_replace('openid_ns_', 'openid.ns.', $key)] = $value; - } else { - $varsTemp[str_replace('openid_', 'openid.', $key)] = $value; - } - } - foreach ($extensions as $extension) { - foreach ($varsTemp as $key => $value) { - if (strpos($key, "openid.$extension") === 0) { - $prefix = "openid.$extension."; - $key = $prefix . substr($key, strlen($prefix)); - } - $vars[$key] = $value; - } - } - if (!$extensions) { - $vars = $varsTemp; - } + $trustRoot = $request->trust_root; + Zend_OpenId::normalizeUrl($trustRoot); - return '?' . http_build_query($vars); + return $trustRoot; + } + + private function _hasSreg(Auth_OpenID_Request $request) + { + // The class Auth_OpenID_SRegRequest is included in the following file + require_once 'libs/Auth/OpenID/SReg.php'; + + $sregRequest = Auth_OpenID_SRegRequest::fromOpenIDRequest($request); + $props = $sregRequest->allRequestedFields(); + + return (is_array($props) && count($props) > 0); + } + + private function _processPape(Auth_OpenID_PAPE_Request $papeRequest, $response) + { + if (($image = $this->user->getImage()) && @$_COOKIE['image']) { + $cidSupportedPolicies = array(PAPE_AUTH_PHISHING_RESISTANT); + if ($RPPreferredTypes = $papeRequest->preferredTypes($cidSupportedPolicies)) { + $this->user->getLastLoginUtc(); + $papeResponse = new Auth_OpenID_PAPE_Response( + $cidSupportedPolicies, + $this->user->getLastLoginUtc() + ); + $papeResponse->toMessage($response->fields); + } + } } } diff --git a/modules/default/controllers/PrivacyController.php b/modules/default/controllers/PrivacyController.php index 7df8534..37750df 100644 --- a/modules/default/controllers/PrivacyController.php +++ b/modules/default/controllers/PrivacyController.php @@ -1,7 +1,7 @@ view->getScriptPath('privacy'); - if (file_exists(APP_DIR . "/resources/$locale/privacy.txt")) { - $file = APP_DIR . "/resources/$locale/privacy.txt"; + $locale = Zend_Registry::get('Zend_Locale'); + // render() changes _ to - + $locale = str_replace('_', '-', $locale); + $localeElements = explode('-', $locale); + + if (file_exists("$scriptsDir/index-$locale.phtml")) { + $view = "index-$locale"; } else if (count($localeElements == 2) - && file_exists(APP_DIR . "/resources/".$localeElements[0]."/privacy.txt")) { - $file = APP_DIR . "/resources/".$localeElements[0]."/privacy.txt"; + && file_exists("$scriptsDir/index-".$localeElements[0].".phtml")) { + $view = 'index-'.$localeElements[0]; } else { - $file = APP_DIR . "/resources/en/privacy.txt"; + $view = 'index-en'; } - $this->view->privacyPolicy = nl2br(file_get_contents($file)); + $this->render($view); } } diff --git a/modules/default/controllers/ProfileController.php b/modules/default/controllers/ProfileController.php new file mode 100644 index 0000000..68a8de1 --- /dev/null +++ b/modules/default/controllers/ProfileController.php @@ -0,0 +1,40 @@ +view->queryString = $this->_queryString(); + + $server = $this->_getOpenIdProvider(); + $request = $server->decodeRequest(); + + $this->view->fields = array(); + $this->view->policyUrl = false; + + $profiles = new Users_Model_Profiles(); + $this->view->profiles = $profiles->getForUser($this->user); + $requestedProfileId = $this->_getParam('profile'); + foreach ($this->view->profiles as $profile) { + if ($requestedProfileId == 0 || $requestedProfileId == $profile->id) { + $this->view->profileId = $profile->id; + $personalInfoForm = Users_Form_PersonalInfo::getForm($request, $profile); + $this->view->fields = $personalInfoForm->getElements(); + if ($personalInfoForm->getPolicyUrl()) { + $this->view->policyUrl = $personalInfoForm->getPolicyUrl(); + } + break; + } + } + //$this->view->profiles->rewind(); + } +} diff --git a/modules/default/controllers/SitesController.php b/modules/default/controllers/SitesController.php index 139fe11..e27be1a 100644 --- a/modules/default/controllers/SitesController.php +++ b/modules/default/controllers/SitesController.php @@ -1,7 +1,7 @@ setLabel('OpenID URL') - ->setDecoratorOptions(array('dontMarkRequired' => true)) - ->setAttrib('style', 'width:300px') - ->setRequired(true); + + $openIdIdentity = new Monkeys_Form_Element_Text('openIdIdentity'); + translate('OpenID URL'); + $openIdIdentity->setLabel('OpenID URL') + ->setDecoratorOptions(array('dontMarkRequired' => true)) + ->setAttrib('style', 'width:300px') + ->setRequired(false); $password = new Monkeys_Form_Element_Password('password'); translate('Password'); $password->setLabel('Password') - ->setDecoratorOptions(array('dontMarkRequired' => true)) - ->setAttrib('style', 'width:300px') - ->setRequired(true); + ->setAttrib('style', 'width:300px'); - $this->addElements(array($openIdIdentity, $password)); + $yubikey = new Monkeys_Form_Element_Text('yubikey'); + $yubikey->setLabel('YubiKey') + ->setAttrib('class', 'yubiKeyInput'); + + $this->addElements(array($openIdIdentity, $password, $yubikey)); if ($this->_useCaptcha) { $captcha = new Monkeys_Form_Element_Captcha('captcha', array( diff --git a/modules/default/models/Association.php b/modules/default/models/Association.php index ed848ea..442dfe0 100644 --- a/modules/default/models/Association.php +++ b/modules/default/models/Association.php @@ -1,7 +1,7 @@ select(); + + return $this->fetchAll($select); + } + + public function getValues(Users_Model_Profile $profile) { - $userId = (int)$user->id; $select = $this->select() ->setIntegrityCheck(false) ->from('fields') - ->joinLeft('fields_values', "fields_values.field_id=fields.id AND fields_values.user_id=".$user->id); + ->joinLeft('fields_values', + $this->getAdapter()->quoteInto("fields_values.field_id=fields.id AND fields_values.profile_id=?", $profile->id), + array('user_id', 'profile_id', 'field_id', 'value') + ); return $this->fetchAll($select); } @@ -40,6 +49,14 @@ class Model_Fields extends Monkeys_Db_Table_Gateway return $this->_fieldsNames[$fieldIdentifier]; } + public function getByOpenIdIdentifier($openid) + { + $select = $this->select() + ->where('openid=?', $openid); + + return $this->fetchRow($select); + } + private function _translationPlaceholders() { translate('Nickname'); diff --git a/modules/default/models/FieldsValue.php b/modules/default/models/FieldsValue.php index 4d3ee63..098f34c 100644 --- a/modules/default/models/FieldsValue.php +++ b/modules/default/models/FieldsValue.php @@ -1,7 +1,7 @@ getAdapter()->quoteInto('user_id=?', $user->id); + $select = $this->select() + ->where('user_id=?', $user->id); + + return $this->fetchAll($select); + } + + public function deleteForProfile(Users_Model_Profile $profile) + { + $where = $this->getAdapter()->quoteInto('profile_id=?', $profile->id); $this->delete($where); } } diff --git a/modules/default/models/Histories.php b/modules/default/models/Histories.php old mode 100755 new mode 100644 index 2131b3c..4d9fe28 --- a/modules/default/models/Histories.php +++ b/modules/default/models/Histories.php @@ -1,7 +1,7 @@ + Community-ID è un servizio fornito da Keyboard Monkeys Ltd., Community as a Service ™. +

+ +

+ Keyboard Monkeys Ltd. si concentra sul fornire soluzioni open source e prodotti mirati a rendere più forti le community su Internet. Forniamo inoltre consulenza, con un ampio supporto per le tecnologie open source, sopratutto soluzioni e prodotti per le community. +

+ +

+ Questi sono i nostri prodotti e servizi attualmente forniti o in corso di sviluppo: +

    +
  • + Sciret - Enterprise Knowledge Base System +
  • +
  • + TextRoller - Piattaforma per blog +
  • +
  • + Community Solutions - Open Source Project Collaboration (Attualmente in sviluppo) +
  • +
+

diff --git a/modules/default/views/scripts/about/index-ja.phtml b/modules/default/views/scripts/about/index-ja.phtml new file mode 100644 index 0000000..a948fff --- /dev/null +++ b/modules/default/views/scripts/about/index-ja.phtml @@ -0,0 +1,23 @@ +

+ Community-IDã¯ã€Keyboard Monkeys Ltd., Community as a Service ™ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹ã‚µãƒ¼ãƒ“スã§ã™ã€‚ +

+ +

+ Keyboard Monkeys Ltd. ã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã«å¯¾ã—ã¦è²¢çŒ®ã§ãるオープンソースã®ã‚½ãƒªãƒ¥ãƒ¼ã‚·ãƒ§ãƒ³ã‚„製å“ã‚’æä¾›ã™ã‚‹ã“ã¨ã«åŠ›ã‚’注ã„ã§ãŠã‚Šã¾ã™ã€‚ ç§ã©ã‚‚ã¯å€‹åˆ¥ã®ã‚³ãƒ³ã‚µãƒ«ãƒ†ã‚£ãƒ³ã‚°ã«åŠ ãˆå¹…広ã„オープンソース技術ã«é–¢ã™ã‚‹ã‚µãƒãƒ¼ãƒˆã‚’è¡Œã£ã¦ãŠã‚Šã¾ã™ã€‚ãªã‹ã§ã‚‚コミュニティを基本ã¨ã—ãŸã‚½ãƒªãƒ¥ãƒ¼ã‚·ãƒ§ãƒ³ã‚„製å“ã‚’å¾—æ„ã¨ã—ã¦ã„ã¾ã™ã€‚ +

+ +

+ ãã®ä»–ã®ã‚µãƒ¼ãƒ“スや製å“(計画中をå«ã¿ã¾ã™ï¼‰ã«ã¯ä»¥ä¸‹ã®æ§˜ãªã‚‚ã®ãŒã‚ã‚Šã¾ã™: + +

    +
  • + Sciret - Enterprise Knowledge Base System +
  • +
  • + TextRoller - Blogging platform +
  • +
  • + Community Solutions - Open Source Project Collaboration (Currently under initial development stages) +
  • +
+

diff --git a/modules/default/views/scripts/error/error.phtml b/modules/default/views/scripts/error/error.phtml old mode 100755 new mode 100644 diff --git a/modules/default/views/scripts/history/index.phtml b/modules/default/views/scripts/history/index.phtml old mode 100755 new mode 100644 diff --git a/modules/default/views/scripts/index/index-de.phtml b/modules/default/views/scripts/index/index-de.phtml index 0b195f1..543ef53 100644 --- a/modules/default/views/scripts/index/index-de.phtml +++ b/modules/default/views/scripts/index/index-de.phtml @@ -33,7 +33,7 @@ - + news) == 0): ?>
translate('There are no news articles yet') ?> diff --git a/modules/default/views/scripts/index/index-it.phtml b/modules/default/views/scripts/index/index-it.phtml new file mode 100644 index 0000000..a73a464 --- /dev/null +++ b/modules/default/views/scripts/index/index-it.phtml @@ -0,0 +1,59 @@ +
+

+ Community ID: Autenticazione OpenID gratuita
+ Completamente basato su tecnologie Open Source +

+
+
+

+ Sin dalla fase di progettazione, Community-ID è stato costruito con la massima attenzione alla sicurezza. Ogni elemento della nostra piattaforma è stato scelto considerando la sua storia di sicurezza e, più importante, tutto è Open Source. +

+

+ Questo vuol dire che siamo aperti ai controlli di chiunque nel mondo. E' un dato provato che "security by obscurity" non funziona, e quando si usa un prodotto o servizio il cui meccanismo di funzionamento è tenuto segreto, si espone sè stessi e i propri dati ad un grande rischio. +

+

+ Perchè aspettare ancora?
+ Semplifica la tua vita e riduci il rischio.

+ APRI UN ACCOUNT ADESSO +

+
+
+
+

Latest News

+
    + news as $item): ?> +
  • +
    + title ?> +
    +
    + excerpt ?> + +
    +
  • + + news) == 0): ?> +
    + translate('There are no news articles yet') ?> +
    + +
  +
+
+ news) > 0): ?> + translate('View All') ?> + + user->role == Users_Model_User::ROLE_ADMIN): ?> +  |  + translate('Add New Article') ?> + +
+
+
+
+
+
+
+
diff --git a/modules/default/views/scripts/index/index-ja.phtml b/modules/default/views/scripts/index/index-ja.phtml new file mode 100644 index 0000000..65a8bc5 --- /dev/null +++ b/modules/default/views/scripts/index/index-ja.phtml @@ -0,0 +1,59 @@ +
+

+ Community ID: ç„¡æ–™ã®OpenIDèªè¨¼
+ 100%オープンソース技術ã§æ§‹ç¯‰ +

+
+
+

+ Community-IDã¯ã€é–‹ç™ºå½“åˆã‹ã‚‰ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚’最もé‡è¦ãªäº‹é …ã¨ä½ç½®ã¥ã‘ã¦é–‹ç™ºã•ã‚Œã¦ãã¾ã—ãŸã€‚技術è¦ç´ ã®é¸å®šã«ã‚ãŸã£ã¦ã¯ã€ãã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£é–¢ä¿‚ã®å•é¡ŒãŒã“ã‚Œã¾ã§ã©ã†ãªã®ã‹ã‚’å分ã«åŸå‘³ã—ã€ã™ã¹ã¦ã‚ªãƒ¼ãƒ—ンソースã§ã‚ã‚‹ã“ã¨ã‚’é‡è¦è¦–ã—ã¦ãã¾ã—ãŸã€‚ +

+

+ ã¤ã¾ã‚Šæˆ‘々ã®æŠ€è¡“ã¯ã©ãªãŸã§ã‚‚精査ã—ã¦ã„ãŸã ã„ã¦æ§‹ã‚ãªã„ã¨ã„ã†ã“ã¨ã§ã™ã€‚ 内容ãŒä¸æ˜Žãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã¨ã„ã†ã‚‚ã®ã¯ä½¿ã„物ã«ãªã‚‰ãªã„ã“ã¨ã¯ã‚ˆã知られã¦ã„ã¾ã™ã€‚ã‚‚ã—内容ãŒãƒ–ラックボックスã®ã¾ã¾ã®è£½å“やサービスを使ã†ã¨ã„ã†ã“ã¨ã¯ã€ã‚ãªãŸã®ãƒ‡ãƒ¼ã‚¿ï¼ˆãã—ã¦ã‚ãªãŸè‡ªèº«ã‚’)å±é™ºã«ã•ã‚‰ã—ã¦ã—ã¾ã†ã“ã¨ã«ã¤ãªãŒã‚Šã¾ã™ã€‚ +

+

+ ã•ã‚今ã™ãã«ç°¡å˜ã«ãƒªã‚¹ã‚¯ã‚’軽減ã™ã‚‹æ–¹æ³•ã‚’ã¨ã‚Šã¾ã—ょã†ã€‚
+
+ アカウントを登録 +

+
+
+
+

最新ニュース

+
    + news as $item): ?> +
  • +
    + title ?> +
    +
    + excerpt ?> + +
    +
  • + + news) == 0): ?> +
    + translate('There are no news articles yet') ?> +
    + +
  +
+
+ news) > 0): ?> + translate('View All') ?> + + user->role == Users_Model_User::ROLE_ADMIN): ?> +  |  + translate('Add New Article') ?> + +
+
+
+
+
+
+
+
diff --git a/modules/default/views/scripts/index/subheader-de.phtml b/modules/default/views/scripts/index/subheader-de.phtml old mode 100755 new mode 100644 diff --git a/modules/default/views/scripts/index/subheader-en.phtml b/modules/default/views/scripts/index/subheader-en.phtml old mode 100755 new mode 100644 diff --git a/modules/default/views/scripts/index/subheader-es.phtml b/modules/default/views/scripts/index/subheader-es.phtml old mode 100755 new mode 100644 diff --git a/modules/default/views/scripts/index/subheader-it.phtml b/modules/default/views/scripts/index/subheader-it.phtml new file mode 100644 index 0000000..1dbdd5f --- /dev/null +++ b/modules/default/views/scripts/index/subheader-it.phtml @@ -0,0 +1 @@ + diff --git a/modules/default/views/scripts/index/subheader-ja.phtml b/modules/default/views/scripts/index/subheader-ja.phtml new file mode 100644 index 0000000..1dbdd5f --- /dev/null +++ b/modules/default/views/scripts/index/subheader-ja.phtml @@ -0,0 +1 @@ + diff --git a/modules/default/views/scripts/index/subheader-sv.phtml b/modules/default/views/scripts/index/subheader-sv.phtml old mode 100755 new mode 100644 diff --git a/modules/default/views/scripts/openid/login.phtml b/modules/default/views/scripts/openid/login.phtml index 9a3c3ab..04c6401 100644 --- a/modules/default/views/scripts/openid/login.phtml +++ b/modules/default/views/scripts/openid/login.phtml @@ -1,16 +1,50 @@ -
- form->openIdIdentity ?> - form->password ?> - useCaptcha): ?> - form->captcha ?> - -
-
- - +
+ form->getErrorMessages()): ?> +
+ ', $this->form->getErrorMessages()) ?>
-
 
-
- + +
+ identity): ?> +
+
translate('OpenID URL') ?>:
+
escape($this->identity) ?>
+
+ + form->openIdIdentity ?> + + yubikey->enabled && $this->yubikey->force): ?> + form->yubikey ?> + + form->password ?> + + useCaptcha): ?> + form->captcha ?> + +
+
+ + +
+
 
+
+
+ image): ?> +
+ <?= $this->translate('This is the image that identifies your account in this computer') ?> +
+ + +
diff --git a/modules/default/views/scripts/openid/trust.phtml b/modules/default/views/scripts/openid/trust.phtml index 679cdd7..da7a468 100644 --- a/modules/default/views/scripts/openid/trust.phtml +++ b/modules/default/views/scripts/openid/trust.phtml @@ -4,21 +4,20 @@
- fields): ?> + showProfileForm): ?>
translate('It also requests this additional information about you:') ?>

translate('Fields are automatically filled according to the personal info stored in your community-id account.') ?>
translate('Fields marked with * are required.') ?>
-
-
- fields as $field): ?> - - - policyUrl): ?> - translate('The private policy can be found at %s', - ''.$this->policyUrl.''); ?>

- +
+ showProfileForm): ?> +
+ translate('Please wait') ?> + +
+ +
translate('Forever') ?> @@ -29,6 +28,11 @@
diff --git a/modules/default/views/scripts/privacy/index-de.phtml b/modules/default/views/scripts/privacy/index-de.phtml new file mode 100644 index 0000000..0f8c241 --- /dev/null +++ b/modules/default/views/scripts/privacy/index-de.phtml @@ -0,0 +1,18 @@ +

Datenschutzrichtlinie

+
+

Einleitung

+

Community-ID.org respektiert jedermann Recht bezüglich des Eigentums seiner privaten Daten. Erfasste und gesammelte Daten durch dieser Webseite werden nur verwendet wie in dieser Erklärung beschreiben. Diese Erklärung gilt ausschließlich für Informationen welche erfasst wurden durch die Community-ID.org Webseite.

+ + +

Erfassen von Daten

+

Community-ID.org erfasst Informationen über diese Webseite um den Benutzern einen besseren Service anbieten zu können. Erfasst werden die persönlichen Daten, einschließlich E-Mail-Adressen von registrierten Nutzern. Gespeichert wird auch die IP-Adresse und die Aktivität von Benutzern. Diese Informationen werden verwendet zur Diagnose oder zum Debuggen unserer Systeme oder zum verbessern unserer Dienstleistungen. Es können zusätzliche Nutzungsdaten gespeichert werden inklusive von Verweisen, Zugriffszeiten oder die Art der besuchten Plattform welche durch Benutzer verbreitet werden während des Besuchs der Seite.

+ +

Community-ID.org benutzt Cookies. Ein Cookie ist eine kleine Textdatei, welche der Webserver auf der Festplatte des Computer eines Benutzers speichert zum Zwecke einer eindeutigen Kennung. Cookies ermöglichen Community-ID.org ein Nutzungsmuster zu erstellen und maßgeschneiderte Inhalte für die Nutzer bereitzustellen. Unsere Cookies haben ein Ablaufdatum, und sammeln keine persönlich identifizierbaren Informationen.

+ + +

Verwendung von Informationen

+

Wir werden Ihre persönlichen Daten nicht verkaufen oder vermieten oder an Dritte weitergegeben. Wir werden persönliche Daten nur weitergeben in folgenden Fällen: 1) Geschaftsübergabe: Wenn Community-ID.org übernommen wird durch dritte, können persönliche Informationen übertragen werden im Einklang mit den Vereinbarungen der Übernahme. 2) Rechtssicherheit: Falls eine gesetzliche Verpflichtung vorliegt diese Informationen weiterzugeben wurde Community-ID.org diesen Folge leisten.

+ +

Kontroller und Speichern von Informationen

+

Wenn ein Benutzer sein Benutzerkonto in Community-ID.org löscht, werden alle im System gespeicherten Informationen entfernt. Natürlich können unsere Backups altere Kopien Ihrer Informationen enthalten, jedoch werden diese Backups regelmäßig gelöscht. Wir glauben, das Sie die Kontrolle über Ihre Informationen haben sollen und wir respektieren dies.

+
diff --git a/modules/default/views/scripts/privacy/index-en.phtml b/modules/default/views/scripts/privacy/index-en.phtml new file mode 100644 index 0000000..1fb8770 --- /dev/null +++ b/modules/default/views/scripts/privacy/index-en.phtml @@ -0,0 +1,16 @@ +

Privacy Policy

+
+

Introduction

+

Community-ID.org respects each individual's right to personal privacy. We will collect and use information through our Web site only in the ways disclosed in this statement. This statement applies solely to information collected at Community-ID.org's Web site.

+ +

Information Collection

+

Community-ID.org collects information through our Web site in order to provide users an efficient experience. We collect the personal information, including email addresses, of registered users. We also collect the IP address and use activity of visitors to our website, in order to diagnose and debug our systems and services. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site.

+ +

Community-ID.org employs cookies. A cookie is a small text file that our Web server places on a user's computer hard drive to be a unique identifier. Cookies enable Community-ID.org to track usage patterns and deliver customized content to users. Our cookies have an expiration date, and do not collect personally identifiable information.

+ +

Information Usage

+

We will not rent or sell your personal information to third parties. We will share personal information only in the following cases: 1) Business Transfer: If Community-ID.org were acquired, personal information would be transferred forward in accordance with acquisition agreements. 2) Legal Compliance: If compelled by law to share information, Community-ID.org would be required to do so.

+ +

Information Storage and Control

+

When a user deletes their account from Community-ID.org, all of their information is expunged from our systems. Of course, our backups may contain older copies of the information, but we expunge backups regularly. We believe that you control your information, and we absolutely respect that.

+
diff --git a/modules/default/views/scripts/privacy/index-es.phtml b/modules/default/views/scripts/privacy/index-es.phtml new file mode 100644 index 0000000..4514121 --- /dev/null +++ b/modules/default/views/scripts/privacy/index-es.phtml @@ -0,0 +1,17 @@ +

Política de Privacidad

+
+

Introducción

+

Community-ID.org respeta el derecho individual a la privacidad. Recuperaremos y usaremos información a través de nuestro sitio Web solamente como se describe en este documento. Este documento solo aplica a la información recolectada a través del sitio Web Community-ID.org.

+ +

Recolección de Información

+

Community-ID.org recolecta información a través de nuestro sitio Web con el fin de proveer a nuestros usuarios una experiencia eficiente. Recolectamos la información, incluyendo direcciones de correo electrónico, de los usuarios registrados. También recolectamos las direcciones IP y la actividad de uso de los visitantes a nuestro sitio, con el fin de diagnosticar y depurar nuestros sistemas y servicios. Podremos también recolectar alguna información extra, tal como remisiones, tiempos de acceso y tipo de plataforma, que nuestros usuarios divulgan cuando visitan el sitio.

+ +

Community-ID.org utiliza cookies. Una cookie es un pequeño archivo de texto que nuestro servidor Web coloca en el disco duro del computador del usuario. Las cookies permiten a Community-ID.org llevar un registro de los patrones de uso y entregar contenido personalizado a los usuarios. Nuestras cookies tienen una fecha de expiración, y no recolectan información personal identificable.

+ + +

Uso de la Información

+

No rentamos ni vendemos información personal de nuestros usuarios a terceros. Solamente entregaremos información personal en los siguientes casos: 1) Transferencia patrimonial: Si Community-ID.org fuera adquirido, la información personal sería transferida de acuerdo con el contrato de adquisición. 2) Cumplimiento legal: Si obligados por ley a revelar información, Community-ID.org estará obligada a entregarla.

+ +

Almacenamiento y Control de la Información

+

Cuando un usuario borra su cuenta de Community-ID.org, toda su información es borrada de nuestros sistemas. Por supuesto, nuestras copias de respaldo pueden contener copias antiguas de dicha información, pero rotamos estas copias regularmente. Creemos que nuestros usuarios son dueños de su información, y respetamos eso.

+
diff --git a/modules/default/views/scripts/privacy/index-ja.phtml b/modules/default/views/scripts/privacy/index-ja.phtml new file mode 100644 index 0000000..c4d46a7 --- /dev/null +++ b/modules/default/views/scripts/privacy/index-ja.phtml @@ -0,0 +1,17 @@ +

Privacy Policy

+
+

Introduction

+

Community-ID.org respects each individual's right to personal privacy. We will collect and use information through our Web site only in the ways disclosed in this statement. This statement applies solely to information collected at Community-ID.org's Web site.

+ +

Information Collection

+

Community-ID.org collects information through our Web site in order to provide users an efficient experience. We collect the personal information, including email addresses, of registered users. We also collect the IP address and use activity of visitors to our website, in order to diagnose and debug our systems and services. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site.

+ +

Community-ID.org employs cookies. A cookie is a small text file that our Web server places on a user's computer hard drive to be a unique identifier. Cookies enable Community-ID.org to track usage patterns and deliver customized content to users. Our cookies have an expiration date, and do not collect personally identifiable information.

+ +

Information Usage

+

We will not rent or sell your personal information to third parties. We will share personal information only in the following cases: 1) Business Transfer: If Community-ID.org were acquired, personal information would be transferred forward in accordance with acquisition agreements. 2) Legal Compliance: If compelled by law to share information, Community-ID.org would be required to do so.

+ +

Information Storage and Control

+

When a user deletes their account from Community-ID.org, all of their information is expunged from our systems. Of course, our backups may contain older copies of the information, but we expunge backups regularly. We believe that you control your information, and we absolutely respect that.

+
+ diff --git a/modules/default/views/scripts/privacy/index-nl.phtml b/modules/default/views/scripts/privacy/index-nl.phtml new file mode 100644 index 0000000..c4d46a7 --- /dev/null +++ b/modules/default/views/scripts/privacy/index-nl.phtml @@ -0,0 +1,17 @@ +

Privacy Policy

+
+

Introduction

+

Community-ID.org respects each individual's right to personal privacy. We will collect and use information through our Web site only in the ways disclosed in this statement. This statement applies solely to information collected at Community-ID.org's Web site.

+ +

Information Collection

+

Community-ID.org collects information through our Web site in order to provide users an efficient experience. We collect the personal information, including email addresses, of registered users. We also collect the IP address and use activity of visitors to our website, in order to diagnose and debug our systems and services. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site.

+ +

Community-ID.org employs cookies. A cookie is a small text file that our Web server places on a user's computer hard drive to be a unique identifier. Cookies enable Community-ID.org to track usage patterns and deliver customized content to users. Our cookies have an expiration date, and do not collect personally identifiable information.

+ +

Information Usage

+

We will not rent or sell your personal information to third parties. We will share personal information only in the following cases: 1) Business Transfer: If Community-ID.org were acquired, personal information would be transferred forward in accordance with acquisition agreements. 2) Legal Compliance: If compelled by law to share information, Community-ID.org would be required to do so.

+ +

Information Storage and Control

+

When a user deletes their account from Community-ID.org, all of their information is expunged from our systems. Of course, our backups may contain older copies of the information, but we expunge backups regularly. We believe that you control your information, and we absolutely respect that.

+
+ diff --git a/modules/default/views/scripts/privacy/index-pl.phtml b/modules/default/views/scripts/privacy/index-pl.phtml new file mode 100644 index 0000000..c4d46a7 --- /dev/null +++ b/modules/default/views/scripts/privacy/index-pl.phtml @@ -0,0 +1,17 @@ +

Privacy Policy

+
+

Introduction

+

Community-ID.org respects each individual's right to personal privacy. We will collect and use information through our Web site only in the ways disclosed in this statement. This statement applies solely to information collected at Community-ID.org's Web site.

+ +

Information Collection

+

Community-ID.org collects information through our Web site in order to provide users an efficient experience. We collect the personal information, including email addresses, of registered users. We also collect the IP address and use activity of visitors to our website, in order to diagnose and debug our systems and services. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site.

+ +

Community-ID.org employs cookies. A cookie is a small text file that our Web server places on a user's computer hard drive to be a unique identifier. Cookies enable Community-ID.org to track usage patterns and deliver customized content to users. Our cookies have an expiration date, and do not collect personally identifiable information.

+ +

Information Usage

+

We will not rent or sell your personal information to third parties. We will share personal information only in the following cases: 1) Business Transfer: If Community-ID.org were acquired, personal information would be transferred forward in accordance with acquisition agreements. 2) Legal Compliance: If compelled by law to share information, Community-ID.org would be required to do so.

+ +

Information Storage and Control

+

When a user deletes their account from Community-ID.org, all of their information is expunged from our systems. Of course, our backups may contain older copies of the information, but we expunge backups regularly. We believe that you control your information, and we absolutely respect that.

+
+ diff --git a/modules/default/views/scripts/privacy/index-sv.phtml b/modules/default/views/scripts/privacy/index-sv.phtml new file mode 100644 index 0000000..1b60db9 --- /dev/null +++ b/modules/default/views/scripts/privacy/index-sv.phtml @@ -0,0 +1,18 @@ +

Policy för personlig integritet

+
+

Introduktion

+

Community-ID.org respekterar varje individs rätt till personlig integritet. Vi samlar och använder därför bara den information som anges i denna policy. Policyn gäller all information på Community-ID.org's webbplats.

+ +

Informationsinsamling

+

Community-ID.org samlar information via webbplatsen för att kunna ge användarna en effektiv upplevelse. Vi samlar personlig information, inklusive e-postadresser, från registrerade användare. Vi samlar även in IP-addresser och hur besökarna använder vår webbplats, för att kunna felsöka och förbättra vårt system och våra tjänster. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site.

+ +

Cookies

+

Community-ID.org använder cookies. En cookie är en liten textfile som vår webbserver lägger i användarens dator för unik identifiering. Cookies gör det möjligt för Community-ID.org att spåra användningsmönster och leverera anpassat innehåll till användaren. Våra cookies har ett bäst-före-datum och används inte för att samla personrelaterad information.

+

Vill du inte acceptera cookies kan din webbläsare ställas in så att du automatiskt nekar till lagring av cookies eller informeras varje gång en webbplats begär att få lagra en cookie. Genom webbläsaren kan också tidigare lagrade cookies raderas. Se webbläsarens hjälpsidor för mer information.

+ +

Informationsanvändning

+

Vi kommer inte att hyra ut eller sälja din personliga information till tredje part. Vi kommer endast att dela med oss av personlig information i följande fall: 1) Affärstransaktioner: Om Community-ID.org blir uppköpt kommer den personliga informationen följa med om det framgår i kontraktet. 2) Lagkrav: Om det enligt lag krävs att information ska lämnas ut, så kommer Community-ID.org att göra det.

+ +

Informationsförvaring och - Kontroll

+

När en användare raderar sitt konto från Community-ID.org, kommer all deras information raderas fullständigt. Naturligtvis kan det finnas kvar äldre säkerhetskopior av informationen, men dessa raderas regelbundet. Vi anser att du ska kontrollera din egen information och respekterar det fullt ut.

+
diff --git a/modules/default/views/scripts/privacy/index.phtml b/modules/default/views/scripts/privacy/index.phtml deleted file mode 100644 index c272dd1..0000000 --- a/modules/default/views/scripts/privacy/index.phtml +++ /dev/null @@ -1,4 +0,0 @@ -

translate('Privacy Policy') ?>

-
- privacyPolicy ?> -
diff --git a/modules/default/views/scripts/profile/index.phtml b/modules/default/views/scripts/profile/index.phtml new file mode 100644 index 0000000..0672b15 --- /dev/null +++ b/modules/default/views/scripts/profile/index.phtml @@ -0,0 +1,22 @@ +
+
+profiles) > 0): ?> +
+ translate('Please select the profile you want to use:') ?> + + +
+ + +fields as $field): ?> + + +policyUrl): ?> + translate('The privacy policy can be found at %s', + ''.$this->policyUrl.''); ?>

+ diff --git a/modules/install/controllers/CompleteController.php b/modules/install/controllers/CompleteController.php index d3c3689..dc004aa 100644 --- a/modules/install/controllers/CompleteController.php +++ b/modules/install/controllers/CompleteController.php @@ -1,7 +1,7 @@ _connectToDbEngine($form)) { - $this->_helper->FlashMessenger->addMessage('We couldn\'t connect to the database using those credentials.'); - $this->_helper->FlashMessenger->addMessage('Please verify and try again.'); + $this->_helper->FlashMessenger->addMessage($this->view->translate('We couldn\'t connect to the database using those credentials.')); + $this->_helper->FlashMessenger->addMessage($this->view->translate('Please verify and try again.')); return $this->_forwardFormError($form); } if (!$this->_createDbIfMissing($form)) { - $this->_helper->FlashMessenger->addMessage( - 'The connection to the database engine worked, but the database "' . $form->getValue('dbname') . '" doesn\'t exist or the provided user doesn\'t have access to it. An attempt was made to create it, but the provided user doesn\'t have permissions to do so either. Please create it yourself and try again.'); + $this->_helper->FlashMessenger->addMessage($this->view->translate( + 'The connection to the database engine worked, but the database %s doesn\'t exist or the provided user doesn\'t have access to it. An attempt was made to create it, but the provided user doesn\'t have permissions to do so either. Please create it yourself and try again.', $form->getValue('dbname'))); return $this->_forwardFormError($form); } @@ -57,7 +59,7 @@ class Install_CredentialsController extends CommunityID_Controller_Action throw new Exception('Couldn\'t write to config file ' . APP_DIR . DIRECTORY_SEPARATOR . 'config.php'); } - $this->_forward('index', 'complete'); + $this->_redirect('/install/complete'); } private function _connectToDbEngine(Install_Form_Install $form) @@ -111,9 +113,12 @@ class Install_CredentialsController extends CommunityID_Controller_Action '{environment.YDN}' => $this->_config->environment->YDN? 'true' : 'false', '{environment.ajax_slowdown}' => $this->_config->environment->ajax_slowdown, '{environment.keep_history_days}' => $this->_config->environment->keep_history_days, + '{environment.unconfirmed_accounts_days_expire}' => $this->_config->environment->unconfirmed_accounts_days_expire, '{environment.registrations_enabled}' => $this->_config->environment->registrations_enabled? 'true' : 'false', '{environment.locale}' => $this->_config->environment->locale, '{environment.template}' => $this->_config->environment->template, + '{metadata.description}' => $this->_config->metadata->description, + '{metadata.keywords}' => $this->_config->metadata->keywords, '{logging.location}' => $this->_config->logging->location, '{logging.level}' => $this->_config->logging->level, '{subdomain.enabled}' => $this->_config->subdomain->enabled? 'true' : 'false', @@ -125,6 +130,31 @@ class Install_CredentialsController extends CommunityID_Controller_Action '{database.params.dbname}' => $this->_config->database->params->dbname, '{database.params.username}' => $this->_config->database->params->username, '{database.params.password}' => $this->_config->database->params->password, + '{security.passwords.dictionary}' => $this->_config->security->passwords->dictionary, + '{security.passwords.username_different}' => $this->_config->security->passwords->username_different? 'true' : 'false', + '{security.passwords.minimum_length}' => $this->_config->security->passwords->minimum_length, + '{security.passwords.include_numbers}'=> $this->_config->security->passwords->include_numbers? 'true' : 'false', + '{security.passwords.include_symbols}'=> $this->_config->security->passwords->include_symbols? 'true' : 'false', + '{security.passwords.lowercase_and_uppercase}' => $this->_config->security->passwords->lowercase_and_uppercase? 'true' : 'false', + '{security.usernames.exclude}' => $this->_config->security->usernames->exclude->current(), + '{ldap.enabled}' => $this->_config->ldap->enabled? 'true' : 'false', + '{ldap.host}' => $this->_config->ldap->host, + '{ldap.baseDn}' => $this->_config->ldap->baseDn, + '{ldap.bindRequiresDn}' => $this->_config->ldap->bindRequiresDn? 'true' : 'false', + '{ldap.username}' => $this->_config->ldap->username, + '{ldap.password}' => $this->_config->ldap->password, + '{ldap.admin}' => $this->_config->ldap->admin, + '{ldap.keepRecordsSynced}' => $this->_config->ldap->keepRecordsSynced? 'true' : 'false', + '{ldap.canChangePassword}' => $this->_config->ldap->canChangePassword? 'true' : 'false', + '{ldap.passwordHashing}' => $this->_config->ldap->passwordHashing, + '{ldap.fields.nickname}' => $this->_config->ldap->fields->nickname, + '{ldap.fields.email}' => $this->_config->ldap->fields->email, + '{ldap.fields.fullname}' => $this->_config->ldap->fields->fullname, + '{ldap.fields.postcode}' => $this->_config->ldap->fields->postcode, + '{yubikey.enabled}' => $this->_config->yubikey->enabled? 'true' : 'false', + '{yubikey.force}' => $this->_config->yubikey->force? 'true' : 'false', + '{yubikey.api_id}' => $this->_config->yubikey->api_id, + '{yubikey.api_key}' => $this->_config->yubikey->api_key, '{email.supportemail}' => $this->_config->email->supportemail, '{email.adminemail}' => $this->_config->email->adminemail, '{email.transport}' => $this->_config->email->transport, @@ -147,7 +177,7 @@ class Install_CredentialsController extends CommunityID_Controller_Action { $users = new Users_Model_Users(); $user = $users->createRow(); - $user->username = $form->getValue('adminUsername'); + $user->username = $form->getValue('username'); $user->accepted_eula = 1; $user->registration_date = date('Y-m-d'); $user->openid = ''; @@ -196,6 +226,10 @@ class Install_CredentialsController extends CommunityID_Controller_Action $errors = array(); $webServerUser = $this->_getProcessUser(); + if (version_compare(PHP_VERSION, self::PHP_MINIMAL_VERSION_REQUIRED, '<')) { + $errors[] = $this->view->translate('PHP version %s or greater is required', + self::PHP_MINIMAL_VERSION_REQUIRED); + } if (!is_writable(APP_DIR) && !is_writable(APP_DIR . DIRECTORY_SEPARATOR . 'config.php')) { $errors[] = $this->view->translate('The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user.', $webServerUser); } @@ -205,6 +239,18 @@ class Install_CredentialsController extends CommunityID_Controller_Action if (!extension_loaded('mysqli')) { $errors[] = $this->view->translate('You need to have the %s extension installed', 'MySQLi'); } + if (!extension_loaded('gd')) { + $errors[] = $this->view->translate('You need to have the %s extension installed', 'GD'); + } + if (!function_exists('imagepng')) { + $errors[] = $this->view->translate('You need to have PNG support in your GD configuration'); + } + if (!function_exists('imageftbbox')) { + $errors[] = $this->view->translate('You need to have Freetype support in your GD configuration'); + } + if (!function_exists('curl_init')) { + $errors[] = $this->view->translate('You need to have the %s extension installed', 'cURL'); + } return $errors; } diff --git a/modules/install/controllers/IndexController.php b/modules/install/controllers/IndexController.php index 38ba252..d338b3f 100644 --- a/modules/install/controllers/IndexController.php +++ b/modules/install/controllers/IndexController.php @@ -1,7 +1,7 @@ authenticate($this->_request->getPost('username'), - $this->_request->getPost('password')); + list($super, $mayor, $minor) = explode('.', $this->_getDbVersion()); + $greaterThan2 = $super >= 2; + $result = $users->authenticate( + $this->_request->getPost('username'), + $this->_request->getPost('password'), + false, + $this->view, + !$greaterThan2 // bypass mark successfull login 'cause last_login field only exists after v.2 + ); if (!$result) { $this->_helper->FlashMessenger->addMessage($this->view->translate('Invalid credentials')); @@ -72,6 +79,11 @@ class Install_UpgradeController extends CommunityID_Controller_Action $this->_helper->FlashMessenger->addMessage($this->view->translate('Upgrade was successful. You are now on version %s', $upgradedVersion)); + $missingConfigs = $this->_checkMissingConfigDirectives(); + if ($missingConfigs) { + $this->_helper->FlashMessenger->addMessage($this->view->translate('WARNING: there are some new configuration settings. To override their default values (as set in config.default.php) add them to your config.php file. The new settings correspond to the following directives: %s.', implode(', ', $missingConfigs))); + } + // we need to logout user in case the user table changed Zend_Auth::getInstance()->clearIdentity(); Zend_Session::forgetMe(); @@ -85,6 +97,7 @@ class Install_UpgradeController extends CommunityID_Controller_Action $includeFiles = false; $db = Zend_Registry::get('db'); + $errors = array(); foreach ($versions as $version) { if ($version == $this->_getDbVersion()) { $includeFiles = true; @@ -95,19 +108,29 @@ class Install_UpgradeController extends CommunityID_Controller_Action continue; } - $fileName = APP_DIR . '/setup/upgrade_'.$version.'.sql'; + $sqlFileName = APP_DIR . '/setup/upgrade_'.$version.'.sql'; + $phpFileName = APP_DIR . '/setup/upgrade_'.$version.'.php'; + $className = 'Upgrade_' . strtr($version, '.', '_'); if ($onlyCheckFiles) { - if (!file_exists($fileName)) { - $this->_helper->FlashMessenger->addMessage($this->view->translate('Correct before upgrading: File %s is required to proceed', $fileName)); + if (!file_exists($sqlFileName)) { + $this->_helper->FlashMessenger->addMessage($this->view->translate('Correct before upgrading: File %s is required to proceed', $sqlFileName)); $this->_redirect('index'); return; } + + if (file_exists($phpFileName)) { + require_once $phpFileName; + $upgradeStage = new $className($this->user, $db, $this->view); + $errors = array_merge($errors, $upgradeStage->requirements()); + } + continue; } $query = ''; - $lines = file($fileName); + $lines = file($sqlFileName); + Zend_Registry::get('logger')->log("Running upgrade file $sqlFileName", Zend_Log::DEBUG); foreach ($lines as $line) { $line = trim($line); if ($line != '') { @@ -123,8 +146,47 @@ class Install_UpgradeController extends CommunityID_Controller_Action $query = ''; } } + + if (file_exists($phpFileName)) { + Zend_Registry::get('logger')->log("Running upgrade file $phpFileName", Zend_Log::DEBUG); + $upgradeStage = new $className($this->user, $db, $this->view); + $upgradeStage->proceed(); + } + } + + if ($errors) { + $errorMessages = join('
', $errors); + $this->_helper->FlashMessenger->addMessage($this->view->translate('Please address the following requirements before proceeding with the upgrade:') . '
' . $errorMessages); + $this->_redirect('index'); } return $version; } + + private function _checkMissingConfigDirectives() + { + require 'config.default.php'; + $defaultConfig = $config; + unset($config); + require 'config.php'; + $missingConfigs = $this->_getMissingConfigs($defaultConfig, $config); + return $missingConfigs; + } + + private function _getMissingConfigs($defaultConfig, $config, $baseKey = false) + { + $missingConfigs = array(); + + foreach ($defaultConfig as $key => $value) { + if (!isset($config[$key])) { + $missingConfigs[] = $key; + } else if (is_array($value)) { + if ($this->_getMissingConfigs($defaultConfig[$key], $config[$key], $baseKey)) { + $missingConfigs[] = $baseKey? $baseKey : $key; + } + } + } + + return $missingConfigs; + } } diff --git a/modules/install/forms/Install.php b/modules/install/forms/Install.php index 84cc76a..89158aa 100644 --- a/modules/install/forms/Install.php +++ b/modules/install/forms/Install.php @@ -1,7 +1,7 @@ setLabel('Hostname') ->setDescription('usually localhost') ->setRequired(true) @@ -22,20 +24,25 @@ class Install_Form_Install extends Zend_Form ->setValue('localhost'); $dbname = new Monkeys_Form_Element_Text('dbname'); + translate('Database name'); $dbname->setLabel('Database name') ->setRequired(true) ->setDecoratorOptions(array('dontMarkRequired' => true)) ->setValue(Zend_Registry::get('config')->database->params->dbname); $dbusername = new Monkeys_Form_Element_Text('dbusername'); + translate('Database username'); $dbusername->setLabel('Database username') ->setRequired(true) ->setDecoratorOptions(array('dontMarkRequired' => true)); $dbpassword = new Monkeys_Form_Element_Password('dbpassword'); + translate('Database password'); $dbpassword->setLabel('Database password'); $supportemail = new Monkeys_Form_Element_Text('supportemail'); + translate('Support E-mail'); + translate('Will be used as the sender for any message sent by the system, and as the recipient for user feedback'); $supportemail->setLabel('Support E-mail') ->setDescription('Will be used as the sender for any message sent by the system, and as the recipient for user feedback') ->addFilter('StringToLower') @@ -43,24 +50,32 @@ class Install_Form_Install extends Zend_Form ->setRequired(true) ->setDecoratorOptions(array('dontMarkRequired' => true)); - $adminUsername = new Monkeys_Form_Element_Text('adminUsername'); - $adminUsername->setLabel('Username') - ->setRequired(true) - ->setDecoratorOptions(array('dontMarkRequired' => true)); + $username = new Monkeys_Form_Element_Text('username'); + $username->setLabel('Username') + ->setRequired(true) + ->setDecoratorOptions(array('dontMarkRequired' => true)); $password1 = new Monkeys_Form_Element_Password('password1'); + translate('Enter password'); + $passwordValidator = new Monkeys_Validate_Password(); $password1->setLabel('Enter password') ->setRequired(true) ->setDecoratorOptions(array('dontMarkRequired' => true)) - ->addValidator(new Monkeys_Validate_PasswordConfirmation()); + ->addValidator(new Monkeys_Validate_PasswordConfirmation()) + ->addValidator($passwordValidator); + + if ($restrictions = $passwordValidator->getPasswordRestrictionsDescription()) { + $password1->setDescription($restrictions); + } $password2 = new Monkeys_Form_Element_Password('password2'); + translate('Enter password again'); $password2->setLabel('Enter password again') ->setRequired(true) ->setDecoratorOptions(array('dontMarkRequired' => true)); $this->addElements(array($hostname, $dbname, $dbusername, $dbpassword, $supportemail, - $adminUsername, $password1, $password2)); + $username, $password1, $password2)); } } diff --git a/modules/install/forms/UpgradeLogin.php b/modules/install/forms/UpgradeLogin.php index 865879c..703d9db 100644 --- a/modules/install/forms/UpgradeLogin.php +++ b/modules/install/forms/UpgradeLogin.php @@ -1,7 +1,7 @@ setRequired(true); $password = new Monkeys_Form_Element_Password('password'); + translate('Password'); $password->setLabel('Password') ->setRequired(true); diff --git a/modules/install/views/scripts/credentials/index.phtml b/modules/install/views/scripts/credentials/index.phtml index b3bc738..04a5b50 100644 --- a/modules/install/views/scripts/credentials/index.phtml +++ b/modules/install/views/scripts/credentials/index.phtml @@ -13,7 +13,7 @@ translate('Administrator User Information') ?>
- form->adminUsername ?> + form->username ?> form->password1 ?> form->password2 ?>
diff --git a/modules/news/controllers/EditController.php b/modules/news/controllers/EditController.php index 49c8527..09b6a52 100644 --- a/modules/news/controllers/EditController.php +++ b/modules/news/controllers/EditController.php @@ -1,7 +1,7 @@ view->pluginsLeft = array(); + $this->view->pluginsRight = array(); + + $dir = dir(APP_DIR . Stats_Model_Report::STATS_PLUGIN_DIR); + $i = 0; + while (false !== ($entry = $dir->read())) { + if (in_array($entry, array('.', '..')) + || substr($entry, -4) != '.php') { + continue; + } + + try { + $reportName = substr($entry, 0, -4); + $statPlugins[$i] = Stats_Model_Report::getReportInstance($reportName); + $statPlugins[$i]->setView($this->view); + } catch (Monkeys_AccessDeniedException $ex) { + Zend_Registry::get('logger')->log("Unable to open Stats plugin: $entry", Zend_Log::WARN); + continue; + } + $i++; + } + $dir->close(); + usort($statPlugins, array($this, '_sortPlugins')); + + $location = self::LOCATION_LEFT; + foreach ($statPlugins as $statPlugin) { + if ($location == self::LOCATION_LEFT) { + $this->view->pluginsLeft[] = $statPlugin; + $location = self::LOCATION_RIGHT; + } else { + $this->view->pluginsRight[] = $statPlugin; + $location = self::LOCATION_LEFT; + } + } + } + + private function _sortPlugins(Stats_Model_Report $pluginA, Stats_Model_Report $pluginB) + { + return $pluginA->getPriority() - $pluginB->getPriority(); } } diff --git a/modules/stats/controllers/ReportsController.php b/modules/stats/controllers/ReportsController.php new file mode 100644 index 0000000..715d5b2 --- /dev/null +++ b/modules/stats/controllers/ReportsController.php @@ -0,0 +1,50 @@ +_getPlugin(); + $statPlugin->setTemplateVars(); + + $pluginView = clone $this->view; + $pluginView->plugin = $statPlugin; + $pluginView->setScriptPath(APP_DIR . Stats_Model_Report::STATS_PLUGIN_DIR); + $this->view->reportTitle = $statPlugin->getTitle(); + $this->view->content = $pluginView->render($statPlugin->getClassName().'.phtml'); + } + + public function graphAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + $this->_helper->layout->disableLayout(); + $statPlugin = $this->_getPlugin(); + $statPlugin->renderGraph(); + } + + private function _getPlugin() + { + $reportName = $this->_getParam('report'); + + try { + $statPlugin = Stats_Model_Report::getReportInstance($reportName); + } catch (Monkeys_AccessDeniedException $ex) { + throw new Exception("Unable to open Stats plugin: $entry"); + } + + $statPlugin->setControllerAction($this); + $statPlugin->setView($this->view); + + return $statPlugin; + } +} + diff --git a/modules/stats/controllers/TopController.php b/modules/stats/controllers/TopController.php deleted file mode 100644 index ec30579..0000000 --- a/modules/stats/controllers/TopController.php +++ /dev/null @@ -1,19 +0,0 @@ -view->sites = $stats->getTopTenSites(); - } -} diff --git a/modules/stats/models/Report.php b/modules/stats/models/Report.php new file mode 100644 index 0000000..c4406a3 --- /dev/null +++ b/modules/stats/models/Report.php @@ -0,0 +1,65 @@ +view = $view; + } + + public function setControllerAction(CommunityID_Controller_Action $controllerAction) + { + $this->_controllerAction = $controllerAction; + } + + public function getIdentifier() + { + return md5($this->getTitle()); + } + + public function getClassName() + { + return get_class($this); + } + + public static function getReportInstance($reportName) + { + $statPath = APP_DIR . self::STATS_PLUGIN_DIR . "/$reportName.php"; + if (Zend_Registry::get('config')->environment->production) { + $includeResult = @include $statPath; + } else { + $includeResult = include $statPath; + } + if (!$includeResult) { + throw new Monkeys_AccessDeniedException(); + Zend_Registry::get('logger')->log("Unable to open Stats plugin: $statPath", Zend_Log::WARN); + continue; + } + + $statPlugin = new $reportName(); + + return $statPlugin; + } +} diff --git a/modules/stats/models/Stats.php b/modules/stats/models/Stats.php index 771a91f..0508157 100644 --- a/modules/stats/models/Stats.php +++ b/modules/stats/models/Stats.php @@ -1,7 +1,7 @@ translate('Authorizations per day') ?> -
- translate('Select view') ?>: - -
- - diff --git a/modules/stats/views/scripts/index/index.phtml b/modules/stats/views/scripts/index/index.phtml index b8d3e5d..0e6dda7 100644 --- a/modules/stats/views/scripts/index/index.phtml +++ b/modules/stats/views/scripts/index/index.phtml @@ -1,12 +1,12 @@ +
-
-
+ pluginsRight as $plugin): ?> +
+ +
diff --git a/modules/stats/views/scripts/registrations/index.phtml b/modules/stats/views/scripts/registrations/index.phtml deleted file mode 100644 index 63dfa7f..0000000 --- a/modules/stats/views/scripts/registrations/index.phtml +++ /dev/null @@ -1,10 +0,0 @@ -

translate('Registrations per day') ?>

-
- translate('Select view') ?>: - -
- diff --git a/modules/stats/views/scripts/reports/index.phtml b/modules/stats/views/scripts/reports/index.phtml new file mode 100644 index 0000000..85d5726 --- /dev/null +++ b/modules/stats/views/scripts/reports/index.phtml @@ -0,0 +1,2 @@ +

reportTitle ?>

+content ?> diff --git a/modules/stats/views/scripts/sites/index.phtml b/modules/stats/views/scripts/sites/index.phtml deleted file mode 100644 index abdbce9..0000000 --- a/modules/stats/views/scripts/sites/index.phtml +++ /dev/null @@ -1,9 +0,0 @@ -

translate('Trusted Sites') ?>

-
- translate('Select view') ?>: - -
- diff --git a/modules/users/controllers/LoginController.php b/modules/users/controllers/LoginController.php old mode 100755 new mode 100644 index e1820a3..2c3e5cf --- a/modules/users/controllers/LoginController.php +++ b/modules/users/controllers/LoginController.php @@ -1,7 +1,7 @@ view->loginForm = new Users_Form_Login(null, $this->view->base, $this->view->useCaptcha); if ($this->_config->SSL->enable_mixed_mode) { - $this->view->loginTargetBase = 'https://' . $_SERVER['HTTP_HOST'] . $this->view->base; + if ($this->_config->subdomain->enabled) { + // in this case $this->view->base contains the full URL, so we just gotta replace the protocol + $this->view->loginTargetBase = 'https' . substr($this->view->base, strpos($this->view->base, '://')); + } else { + $this->view->loginTargetBase = 'https://' . $_SERVER['HTTP_HOST'] . $this->view->base; + } } else { $this->view->loginTargetBase = $this->view->base; } + $this->view->allowRegistrations = $this->_config->environment->registrations_enabled; + + + if ($this->user->role == Users_Model_User::ROLE_GUEST && @$_COOKIE['image']) { + $images = new Users_Model_SigninImages(); + $this->view->image = $images->getByCookie($_COOKIE['image']); + } else { + $this->view->image = false; + } + + $this->view->yubikey = $this->_config->yubikey; + $this->_helper->viewRenderer->setResponseSegment('sidebar'); } @@ -48,9 +65,15 @@ class Users_LoginController extends CommunityID_Controller_Action } $users = new Users_Model_Users(); - $result = $users->authenticate($this->_request->getPost('username'), - $this->_request->getPost('password')); - + $result = $users->authenticate( + $this->_request->getPost('username'), + $this->_config->yubikey->enabled && $this->_config->yubikey->force? + $this->_request->getPost('yubikey') + : $this->_request->getPost('password'), + false, + $this->view + ); + if ($result) { $user = $users->getUser(); diff --git a/modules/users/controllers/ManageusersController.php b/modules/users/controllers/ManageusersController.php index 42b2299..440b9d6 100644 --- a/modules/users/controllers/ManageusersController.php +++ b/modules/users/controllers/ManageusersController.php @@ -1,7 +1,7 @@ _helper->layout->disableLayout(); $this->_helper->viewRenderer->setNeverRender(true); + if ($this->_config->ldap->enabled && $this->_config->ldap->keepRecordsSynced) { + $ldap = Monkeys_Ldap::getInstance(); + $ldap->delete($this->targetUser); + } + $this->targetUser->delete(); + echo $this->view->translate('User has been deleted successfully'); } @@ -42,31 +48,30 @@ class Users_ManageusersController extends CommunityID_Controller_Action $mail = self::getMail($user, $this->view->translate('Community-ID registration reminder')); try { $mail->send(); - $user->reminders++; - $user->save(); - } catch (Zend_Mail_Protocol_Exception $e) { + $this->_increaseReminderCount($user); + } catch (Zend_Mail_Exception $e) { Zend_Registry::get('logger')->log($e->getMessage(), Zend_Log::ERR); + if (!$this->_config->environment->production) { + // still increase the reminder counter when testing + $this->_increaseReminderCount($user); + } } } } + private function _increaseReminderCount(Users_Model_User $user) + { + $user->reminders++; + $user->save(); + } + /** * @return Zend_Mail * @throws Zend_Mail_Protocol_Exception */ public static function getMail(Users_Model_User $user, $subject) { - $locale = Zend_Registry::get('Zend_Locale'); - $localeElements = explode('_', $locale); - if (file_exists(APP_DIR . "/resources/$locale/reminder_mail.txt")) { - $file = APP_DIR . "/resources/$locale/reminder_mail.txt"; - } else if (count($localeElements == 2) - && file_exists(APP_DIR . "/resources/".$localeElements[0]."/reminder_mail.txt")) { - $file = APP_DIR . "/resources/".$localeElements[0]."/reminder_mail.txt"; - } else { - $file = APP_DIR . "/resources/en/reminder_mail.txt"; - } - + $file = CommunityID_Resources::getResourcePath('reminder_mail.txt'); $emailTemplate = file_get_contents($file); $emailTemplate = str_replace('{userName}', $user->getFullName(), $emailTemplate); @@ -74,7 +79,7 @@ class Users_ManageusersController extends CommunityID_Controller_Action preg_match('#(.*)/manageusers/sendreminder#', $currentUrl, $matches); $emailTemplate = str_replace('{registrationURL}', $matches[1] . '/register/eula?token=' . $user->token, $emailTemplate); - // can't use $this-_config 'cause it's a static function + // can't use $this->_config 'cause it's a static function $configEmail = Zend_Registry::get('config')->email; switch (strtolower($configEmail->transport)) { diff --git a/modules/users/controllers/PersonalinfoController.php b/modules/users/controllers/PersonalinfoController.php index b76d17f..599ce6b 100644 --- a/modules/users/controllers/PersonalinfoController.php +++ b/modules/users/controllers/PersonalinfoController.php @@ -1,7 +1,7 @@ _helper->actionStack('index', 'login', 'users'); - } + $profiles = new Users_Model_Profiles(); + $this->view->profiles = $profiles->getForUser($this->user); - public function showAction() - { - $fields = new Model_Fields(); - $this->view->fields = $fields->getValues($this->user); + $this->_helper->actionStack('index', 'login', 'users'); } public function editAction() { + $this->view->profile = $this->_getProfile(); + $appSession = Zend_Registry::get('appSession'); if (isset($appSession->personalInfoForm)) { $this->view->fields = $appSession->personalInfoForm->getElements(); unset($appSession->personalInfoForm); } else { - $personalInfoForm = new Users_Form_PersonalInfo(null, $this->user); + $personalInfoForm = new Users_Form_PersonalInfo(null, $this->view->profile); $this->view->fields = $personalInfoForm->getElements(); } + + $this->_helper->actionStack('index', 'login', 'users'); } public function saveAction() { - $form = new Users_Form_PersonalInfo(null, $this->user); + $profile = $this->_getProfile(); + + $form = new Users_Form_PersonalInfo(null, $profile); $formData = $this->_request->getPost(); $form->populate($formData); @@ -55,15 +58,23 @@ class Users_PersonalinfoController extends CommunityID_Controller_Action } $fieldsValues = new Model_FieldsValues(); - $fieldsValues->deleteForUser($this->user); + + if ($this->_getParam('profile')) { + $fieldsValues->deleteForProfile($profile); + } else { + $profile->user_id = $this->user->id; + $profile->name = $form->getValue('profileName'); + $profile->save(); + } foreach ($form->getValues() as $fieldName => $fieldValue) { - if (!$fieldValue) { + if ($fieldName == 'profileName' || !$fieldValue) { continue; } $fieldsValue = $fieldsValues->createRow(); $fieldsValue->user_id = $this->user->id; + $fieldsValue->profile_id = $profile->id; list(, $fieldId) = explode('_', $fieldName); $fieldsValue->field_id = $fieldId; @@ -73,7 +84,34 @@ class Users_PersonalinfoController extends CommunityID_Controller_Action $fieldsValue->save(); } + $this->_helper->FlashMessenger->addMessage($this->view->translate('Profile has been saved')); + $this->_redirect('/users/personalinfo'); + } - $this->_forward('show'); + public function deleteAction() + { + $profile = $this->_getProfile(); + if ($profile->id) { + $profile->delete(); + } + + $this->_helper->FlashMessenger->addMessage($this->view->translate('Profile has been deleted')); + $this->_redirect('/users/personalinfo'); + } + + private function _getProfile() + { + $profiles = new Users_Model_Profiles(); + + if (!$this->_getParam('profile')) { + return $profiles->createRow(); + } + + $profile = $profiles->getRowInstance($this->_getParam('profile')); + if (!$profile || $profile->user_id != $this->user->id) { + throw new Monkeys_AccessDeniedException(); + } + + return $profile; } } diff --git a/modules/users/controllers/ProfileController.php b/modules/users/controllers/ProfileController.php old mode 100755 new mode 100644 index 8632320..0bf4732 --- a/modules/users/controllers/ProfileController.php +++ b/modules/users/controllers/ProfileController.php @@ -1,7 +1,7 @@ view->canEditAccountInfo = !$this->_config->ldap->enabled + || ($this->_config->ldap->enabled && $this->_config->ldap->keepRecordsSynced); + $this->view->canChangePassword = !$this->_config->ldap->enabled + || ($this->_config->ldap->enabled && $this->_config->ldap->canChangePassword); + + $this->view->yubikey = $this->_config->yubikey; + $this->_helper->actionStack('index', 'login', 'users'); } } diff --git a/modules/users/controllers/ProfilegeneralController.php b/modules/users/controllers/ProfilegeneralController.php index b901d97..52eac0c 100644 --- a/modules/users/controllers/ProfilegeneralController.php +++ b/modules/users/controllers/ProfilegeneralController.php @@ -1,7 +1,7 @@ view->yubikey = $this->_config->yubikey; } public function editaccountinfoAction() { - if ($this->targetUser->id != $this->user->id - // this condition checks for an non-admin trying to add a new user - && ($this->targetUser->id != 0 || $this->user->role != Users_Model_User::ROLE_ADMIN)) + if (($this->targetUser->id != $this->user->id + // this condition checks for an non-admin trying to add a new user + && ($this->targetUser->id != 0 || $this->user->role != Users_Model_User::ROLE_ADMIN)) + || ($this->_config->ldap->enabled && !$this->_config->ldap->keepRecordsSynced)) { throw new Monkeys_AccessDeniedException(); } @@ -46,16 +48,22 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action 'firstname' => $this->targetUser->firstname, 'lastname' => $this->targetUser->lastname, 'email' => $this->targetUser->email, + 'authMethod' => $this->targetUser->auth_type, + 'yubikey' => '' // of course empty )); } + + $this->view->yubikey = $this->_config->yubikey; } public function saveaccountinfoAction() { $isNewUser = is_null($this->targetUser->id)? true : false; - if (!$isNewUser && $this->targetUser->id != $this->user->id) { - // admins can add new users, but not edit existing ones + if ( + // admins can add new users, but not edit existing ones + (!$isNewUser && $this->targetUser->id != $this->user->id) + || ($this->_config->ldap->enabled && !$this->_config->ldap->keepRecordsSynced)) { throw new Monkeys_AccessDeniedException(); } @@ -68,9 +76,10 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action } $existingUsernameOrEmail = false; + $oldUsername = $this->targetUser->username; $newUsername = $form->getValue('username'); if (($isNewUser && $this->_usernameAlreadyExists($newUsername)) - || (!$isNewUser && ($this->targetUser->username != $newUsername) + || (!$isNewUser && ($oldUsername != $newUsername) && $this->_usernameAlreadyExists($newUsername))) { $form->username->addError($this->view->translate('This username is already in use')); @@ -90,6 +99,21 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action return $this->_redirectInvalidForm($form); } + if ($this->_config->yubikey->enabled) { + $this->targetUser->auth_type = $form->getValue('authMethod'); + $yubikey = trim($form->getValue('yubikey')); + if ($form->getValue('authMethod') == Users_Model_User::AUTH_YUBIKEY) { + // only store or update yubikey for new users or existing that filled in something + if ($isNewUser || $yubikey) { + if (!$publicId = $this->_getYubikeyPublicId($yubikey)) { + $form->yubikey->addError($this->view->translate('Could not validate Yubikey')); + return $this->_redirectInvalidForm($form); + } + $this->targetUser->yubikey_publicid = $publicId; + } + } + } + $this->targetUser->username = $newUsername; $this->targetUser->firstname = $form->getValue('firstname'); $this->targetUser->lastname = $form->getValue('lastname'); @@ -97,11 +121,35 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action if ($isNewUser) { $this->targetUser->accepted_eula = 1; $this->targetUser->registration_date = date('Y-m-d'); - $this->targetUser->openid = $this->_generateOpenId($this->targetUser->username); + + preg_match('#(.*)/users/profile.*#', Zend_OpenId::selfURL(), $matches); + $this->targetUser->generateOpenId($matches[1]); + $this->targetUser->role = Users_Model_User::ROLE_REGISTERED; $this->targetUser->setClearPassword($form->getValue('password1')); } + + if ($this->_config->ldap->enabled && $this->_config->ldap->keepRecordsSynced) { + $ldap = Monkeys_Ldap::getInstance(); + + if ($isNewUser) { + $this->targetUser->setPassword($form->getValue('password1')); + $ldap->add($this->targetUser); + } else { + if ($oldUsername != $newUsername) { + $ldap->modifyUsername($this->targetUser, $oldUsername); + } + $ldap->modify($this->targetUser); + } + + // LDAP passwords must not be stored in the DB + $this->targetUser->setPassword(''); + } + $this->targetUser->save(); + if ($isNewUser) { + $this->targetUser->createDefaultProfile($this->view); + } /** * When the form is submitted through a YUI request using a file, an iframe is used, @@ -115,7 +163,7 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action private function _usernameAlreadyExists($username) { $users = $this->_getUsers(); - return $users->getUserWithUsername($username); + return $users->getUserWithUsername($username, false, $this->view); } private function _emailAlreadyExists($email) @@ -144,8 +192,9 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action */ public function changepasswordAction() { - if ($this->targetUser->id != $this->user->id) - { + if (($this->targetUser->id != $this->user->id) + || ($this->_config->ldap->enabled && !$this->_config->ldap->canChangePassword) + || ($this->_config->yubikey->enabled && $this->_config->yubikey->force)) { throw new Monkeys_AccessDeniedException(); } @@ -154,18 +203,19 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action $this->view->changePasswordForm = $appSession->changePasswordForm; unset($appSession->changePasswordForm); } else { - $this->view->changePasswordForm = new Users_Form_ChangePassword(); + $this->view->changePasswordForm = new Users_Form_ChangePassword(null, $this->user->username); } } public function savepasswordAction() { - if ($this->targetUser->id != $this->user->id) - { + if (($this->targetUser->id != $this->user->id) + || ($this->_config->ldap->enabled && !$this->_config->ldap->canChangePassword) + || ($this->_config->yubikey->enabled && $this->_config->yubikey->force)) { throw new Monkeys_AccessDeniedException(); } - $form = new Users_Form_ChangePassword(); + $form = new Users_Form_ChangePassword(null, $this->user->username); $formData = $this->_request->getPost(); $form->populate($formData); if (!$form->isValid($formData)) { @@ -175,14 +225,21 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action } $this->targetUser->setClearPassword($form->getValue('password1')); - $this->targetUser->save(); + + if ($this->_config->ldap->enabled && $this->_config->ldap->canChangePassword) { + $ldap = Monkeys_Ldap::getInstance(); + $ldap->modify($this->targetUser, $form->getValue('password1')); + } else { + $this->targetUser->save(); + } return $this->_forward('accountinfo', null , null, array('userid' => $this->targetUser->id)); } public function confirmdeleteAction() { - if ($this->user->role == Users_Model_User::ROLE_ADMIN) { + if ($this->user->role == Users_Model_User::ROLE_ADMIN + || ($this->_config->ldap->enabled && !$this->_config->ldap->keepRecordsSynced)) { throw new Monkeys_AccessDeniedException(); } @@ -191,6 +248,11 @@ class Users_ProfilegeneralController extends CommunityID_Controller_Action public function deleteAction() { + if ($this->user->role == Users_Model_User::ROLE_ADMIN + || ($this->_config->ldap->enabled && !$this->_config->ldap->keepRecordsSynced)) { + throw new Monkeys_AccessDeniedException(); + } + $mail = self::getMail(); $mail->setFrom($this->_config->email->supportemail); $mail->addTo($this->_config->email->supportemail); @@ -234,42 +296,26 @@ EOT; $mail->setBodyText($body); try { $mail->send(); - } catch (Zend_Mail_Protocol_Exception $e) { + } catch (Zend_Mail_Exception $e) { if ($this->_config->logging->level == Zend_Log::DEBUG) { - $this->_helper->FlashMessenger->addMessage('Account was deleted, but feedback form couldn\'t be sent to admins'); + $this->_helper->FlashMessenger->addMessage($this->view->translate('Account was deleted, but feedback form couldn\'t be sent to admins')); } } $users = $this->_getUsers(); $users->deleteUser($this->user); + + if ($this->_config->ldap->enabled && $this->_config->ldap->keepRecordsSynced) { + $ldap = Monkeys_Ldap::getInstance(); + $ldap->delete($this->user); + } + Zend_Auth::getInstance()->clearIdentity(); $this->_helper->FlashMessenger->addMessage($this->view->translate('Your acccount has been successfully deleted')); $this->_redirect(''); } - private function _generateOpenId($username) - { - $selfUrl = Zend_OpenId::selfUrl(); - if (!preg_match('#(.*)/users/profile.*#', $selfUrl, $matches)) { - throw new Exception('Couldn\'t retrieve current URL'); - } - - if ($this->_config->subdomain->enabled) { - $openid = $this->getProtocol() . '://' . $username . '.' . $this->_config->subdomain->hostname; - } else { - $openid = $matches[1] . "/identity/$username"; - } - - if ($this->_config->SSL->enable_mixed_mode) { - $openid = str_replace('http://', 'https://', $openid); - } - - Zend_OpenId::normalizeUrl($openid); - - return $openid; - } - /** * @return Zend_Mail * @throws Zend_Mail_Protocol_Exception @@ -308,4 +354,33 @@ EOT; return $this->_users; } + + private function _getYubikeyPublicId($yubikey) + { + $authAdapter = new Monkeys_Auth_Adapter_Yubikey( + array( + 'api_id' => $this->_config->yubikey->api_id, + 'api_key' => $this->_config->yubikey->api_key + ), + null, + $yubikey + ); + + // do not go through Zend_Auth::getInstance() to avoid losing the session if + // the yubikey is invalid + $result = $authAdapter->authenticate($authAdapter); + if ($result->isValid()) { + $parts = Yubico_Auth::parsePasswordOTP($yubikey); + return $parts['prefix']; + } + + $logger = Zend_Registry::get('logger'); + $logger->log("Invalid authentication: " . implode(' - ', $result->getMessages()), Zend_Log::DEBUG); + $authOptions = $authAdapter->getOptions(); + if ($yubi = @$authOptions['yubiClient']) { + $logger->log("Yubi request was: " . $yubi->getlastQuery(), Zend_Log::DEBUG); + } + + return false; + } } diff --git a/modules/users/controllers/RecoverpasswordController.php b/modules/users/controllers/RecoverpasswordController.php old mode 100755 new mode 100644 index c99a8ba..6fe9b4a --- a/modules/users/controllers/RecoverpasswordController.php +++ b/modules/users/controllers/RecoverpasswordController.php @@ -1,7 +1,7 @@ token = Users_Model_User::generateToken(); $user->save(); - $locale = Zend_Registry::get('Zend_Locale'); - $localeElements = explode('_', $locale); - if (file_exists(APP_DIR . "/resources/$locale/passwordreset_mail.txt")) { - $file = APP_DIR . "/resources/$locale/passwordreset_mail.txt"; - } else if (count($localeElements == 2) - && file_exists(APP_DIR . "/resources/".$localeElements[0]."/passwordreset_mail.txt")) { - $file = APP_DIR . "/resources/".$localeElements[0]."/passwordreset_mail.txt"; - } else { - $file = APP_DIR . "/resources/en/passwordreset_mail.txt"; - } - + $file = CommunityID_Resources::getResourcePath('passwordreset_mail.txt'); $emailTemplate = file_get_contents($file); $emailTemplate = str_replace('{userName}', $user->getFullName(), $emailTemplate); $emailTemplate = str_replace('{IP}', $_SERVER['REMOTE_ADDR'], $emailTemplate); // $_SERVER['SCRIPT_URI'] is not always available - $URI = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + $URI = self::getProtocol() . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; preg_match('#(.*)/users/recoverpassword#', $URI, $matches); $emailTemplate = str_replace('{passwordResetURL}', $matches[1] . '/users/recoverpassword/reset?token=' . $user->token, @@ -90,7 +80,7 @@ class Users_RecoverpasswordController extends CommunityID_Controller_Action $users = new Users_Model_Users(); $user = $users->getUserWithToken($this->_getParam('token')); if (!$user) { - $this->_helper->FlashMessenger->addMessage('Wrong Token'); + $this->_helper->FlashMessenger->addMessage($this->view->translate('Wrong Token')); $this->_redirect(''); return; } @@ -103,17 +93,7 @@ class Users_RecoverpasswordController extends CommunityID_Controller_Action $user->save(); - $locale = Zend_Registry::get('Zend_Locale'); - $localeElements = explode('_', $locale); - if (file_exists(APP_DIR . "/resources/$locale/passwordreset2_mail.txt")) { - $file = APP_DIR . "/resources/$locale/passwordreset2_mail.txt"; - } else if (count($localeElements == 2) - && file_exists(APP_DIR . "/resources/".$localeElements[0]."/passwordreset2_mail.txt")) { - $file = APP_DIR . "/resources/".$localeElements[0]."/passwordreset2_mail.txt"; - } else { - $file = APP_DIR . "/resources/en/passwordreset2_mail.txt"; - } - + $file = CommunityID_Resources::getResourcePath('passwordreset2_mail.txt'); $emailTemplate = file_get_contents($file); $emailTemplate = str_replace('{userName}', $user->getFullName(), $emailTemplate); $emailTemplate = str_replace('{password}', $newPassword, $emailTemplate); diff --git a/modules/users/controllers/RegisterController.php b/modules/users/controllers/RegisterController.php old mode 100755 new mode 100644 index 6e6c18a..71f0c06 --- a/modules/users/controllers/RegisterController.php +++ b/modules/users/controllers/RegisterController.php @@ -1,7 +1,7 @@ getUserWithUsername($form->getValue('username'))) { + if ($users->getUserWithUsername($form->getValue('username'), false, $this->view)) { $form->username->addError($this->view->translate('This username is already in use')); $appSession = Zend_Registry::get('appSession'); $appSession->registerForm = $form; @@ -76,35 +76,37 @@ class Users_RegisterController extends CommunityID_Controller_Action $user->email = $form->getValue('email'); $user->username = $form->getValue('username'); - $currentUrl = Zend_OpenId::selfURL(); - preg_match('#(.*)/users/register/save#', $currentUrl, $matches); - if ($this->_config->subdomain->enabled) { - $openid = $this->getProtocol() . '://' . $user->username . '.' . $this->_config->subdomain->hostname; + preg_match('#(.*)/users/register/save#', Zend_OpenId::selfURL(), $matches); + $user->generateOpenId($matches[1]); + + if ($this->_config->ldap->enabled) { + // when using ldap, unconfirmed users' password is saved unhashed temporarily, while he registers, + // and then it's stored in LDAP and cleared from the db + $user->setPassword($form->getValue('password1')); } else { - $openid = $matches[1] . '/identity/' . $user->username; + $user->setClearPassword($form->getValue('password1')); } - if ($this->_config->SSL->enable_mixed_mode) { - $openid = str_replace('http://', 'https://', $openid); - } - Zend_OpenId::normalizeUrl($openid); - $user->openid = $openid; - - $user->setClearPassword($form->getValue('password1')); $user->role = Users_Model_User::ROLE_GUEST; - $registrationToken = Users_Model_User::generateToken(); - $user->token = $registrationToken; + $user->token = Users_Model_User::generateToken(); $user->accepted_eula = 0; $user->registration_date = date('Y-m-d'); - $user->save(); $mail = self::getMail($user, $this->view->translate('Community-ID registration confirmation')); try { $mail->send(); + $user->save(); + $user->createDefaultProfile($this->view); $this->_helper->FlashMessenger->addMessage($this->view->translate('Thank you.')); $this->_helper->FlashMessenger->addMessage($this->view->translate('You will receive an E-mail with instructions to activate the account.')); - } catch (Zend_Mail_Protocol_Exception $e) { - $this->_helper->FlashMessenger->addMessage($this->view->translate('The account was created but the E-mail could not be sent')); + } catch (Zend_Mail_Exception $e) { + if ($this->_config->environment->production) { + $this->_helper->FlashMessenger->addMessage($this->view->translate('The confirmation E-mail could not be sent, so the account creation was cancelled. Please contact support.')); + } else { + $this->_helper->FlashMessenger->addMessage($this->view->translate('The account was created but the E-mail could not be sent')); + // I still wanna create the user when in development mode + $user->save(); + } if ($this->_config->logging->level == Zend_Log::DEBUG) { $this->_helper->FlashMessenger->addMessage($e->getMessage()); } @@ -125,18 +127,7 @@ class Users_RegisterController extends CommunityID_Controller_Action $this->view->token = $user->token; - $locale = Zend_Registry::get('Zend_Locale'); - $localeElements = explode('_', $locale); - - if (file_exists(APP_DIR . "/resources/$locale/eula.txt")) { - $file = APP_DIR . "/resources/$locale/eula.txt"; - } else if (count($localeElements == 2) - && file_exists(APP_DIR . "/resources/".$localeElements[0]."/eula.txt")) { - $file = APP_DIR . "/resources/".$localeElements[0]."/eula.txt"; - } else { - $file = APP_DIR . "/resources/en/eula.txt"; - } - + $file = CommunityID_Resources::getResourcePath('eula.txt'); $this->view->eula = file_get_contents($file); } @@ -171,6 +162,15 @@ class Users_RegisterController extends CommunityID_Controller_Action $user->accepted_eula = 1; $user->registration_date = date('Y-m-d'); $user->token = ''; + + if ($this->_config->ldap->enabled) { + $ldap = Monkeys_Ldap::getInstance(); + $ldap->add($user); + + // clear unencrypted password + $user->setPassword(''); + } + $user->save(); $auth = Zend_Auth::getInstance(); @@ -185,17 +185,7 @@ class Users_RegisterController extends CommunityID_Controller_Action */ public static function getMail(Users_Model_User $user, $subject) { - $locale = Zend_Registry::get('Zend_Locale'); - $localeElements = explode('_', $locale); - if (file_exists(APP_DIR . "/resources/$locale/registration_mail.txt")) { - $file = APP_DIR . "/resources/$locale/registration_mail.txt"; - } else if (count($localeElements == 2) - && file_exists(APP_DIR . "/resources/".$localeElements[0]."/registration_mail.txt")) { - $file = APP_DIR . "/resources/".$localeElements[0]."/registration_mail.txt"; - } else { - $file = APP_DIR . "/resources/en/registration_mail.txt"; - } - + $file = CommunityID_Resources::getResourcePath('registration_mail.txt'); $emailTemplate = file_get_contents($file); $emailTemplate = str_replace('{userName}', $user->getFullName(), $emailTemplate); diff --git a/modules/users/controllers/SigninimageController.php b/modules/users/controllers/SigninimageController.php new file mode 100644 index 0000000..f08bdd4 --- /dev/null +++ b/modules/users/controllers/SigninimageController.php @@ -0,0 +1,119 @@ +signinImageForm)) { + $this->view->signinImageForm = $appSession->signinImageForm; + unset($appSession->signinImageForm); + } else { + $this->view->signinImageForm = new Users_Form_SigninImage(); + } + + if (@$_COOKIE['image']) { + $this->view->enabled = true; + } else { + $this->view->enabled = false; + } + + $this->_helper->actionStack('index', 'login', 'users'); + } + + public function saveimageAction() + { + $form = new Users_Form_SigninImage(); + $formData = $this->_request->getPost(); + + // the framework doesn't allow doing this cleanly yet + $formData = array_merge($formData, array('image' => $_FILES['image']['name'])); + + $form->populate($formData); + if (!$form->isValid($formData)) { + $appSession = Zend_Registry::get('appSession'); + $appSession->signinImageForm = $form; + + $this->_forward('index'); + return; + } + + $fileInfo = $form->image->getFileInfo(); + $images = new Users_Model_SigninImages(); + $images->deleteForUser($this->user); + $image = $images->createRow(); + $image->user_id = $this->user->id; + $image->image = file_get_contents($fileInfo['image']['tmp_name']); + $image->mime = $fileInfo['image']['type']; + $image->cookie = $images->generateCookieId($this->user); + $image->save(); + + // delete cookie + setcookie('image', $image->cookie, time() - 3600, '/', $this->_getCookieDomain()); + + $this->_redirect('/users/signinimage'); + } + + public function setcookieAction() + { + if ($this->_request->getParam('enable')) { + $images = new Users_Model_SigninImages(); + if (!$image = $images->getForUser($this->user)) { + $this->_helper->FlashMessenger->addMessage($this->view->translate('There is no image uploaded')); + $this->_redirect('/users/signinimage'); + return; + } + + if (!setcookie('image', $image->cookie, time() + 24*60*60*10000, '/', $this->_getCookieDomain())) { + $this->_helper->FlashMessenger->addMessage($this->view->translate('There was a problem setting the cookie')); + $this->_redirect('/users/signinimage'); + return; + } + + $this->_helper->FlashMessenger->addMessage($this->view->translate('Image has been set successfully on this computer/browser')); + } else { + setcookie('image', $image->cookie, time() - 3600, '/', $this->_getCookieDomain()); + + $this->_helper->FlashMessenger->addMessage($this->view->translate('Image has been disabled successfully on this computer/browser')); + } + + $this->_redirect('/users/signinimage'); + } + + public function imageAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + $this->_helper->layout->disableLayout(); + + $images = new Users_Model_SigninImages(); + + if ($cookie = $this->_request->getParam('id')) { + $image = $images->getByCookie($cookie); + } else if ($this->user->role != Users_Model_User::ROLE_GUEST) { + $image = $images->getForUser($this->user); + } else { + return; + } + + $this->_response->setHeader('Content-type', $image->mime); + echo $image->image; + } + + private function _getCookieDomain() + { + if ($this->_config->subdomain->enabled) { + $domain = '.' . $this->_config->subdomain->hostname; + } else { + $domain = $_SERVER['HTTP_HOST']; + } + } +} diff --git a/modules/users/controllers/UserslistController.php b/modules/users/controllers/UserslistController.php old mode 100755 new mode 100644 index a7d833a..2d55448 --- a/modules/users/controllers/UserslistController.php +++ b/modules/users/controllers/UserslistController.php @@ -1,7 +1,7 @@ getUsers( $this->_getParam('startIndex'), $this->_getParam('results'), @@ -49,6 +52,10 @@ class Users_UserslistController extends CommunityID_Controller_Action foreach ($usersRows as $user) { if ($user->role == Users_Model_User::ROLE_ADMIN) { + if ($this->_config->ldap->enabled && $user->username != $this->_config->ldap->admin) { + // this is the admin created during the installation, that is not used when ldap is enabled + continue; + } $status = $this->view->translate('admin'); } else if ($user->accepted_eula) { $status = $this->view->translate('confirmed'); @@ -61,7 +68,7 @@ class Users_UserslistController extends CommunityID_Controller_Action $jsonObjUser->registration = $user->registration_date; $jsonObjUser->role = $user->role; $jsonObjUser->status = $status; - $jsonObjUser->reminders = $user->reminders; + $jsonObjUser->reminders = $user->accepted_eula? 0 : $user->reminders; $jsonObj->records[] = $jsonObjUser; } diff --git a/modules/users/forms/AccountInfo.php b/modules/users/forms/AccountInfo.php index 18cd4fd..a77f304 100644 --- a/modules/users/forms/AccountInfo.php +++ b/modules/users/forms/AccountInfo.php @@ -1,7 +1,7 @@ setRequired(true) ->addValidator('EmailAddress'); - $this->addElements(array($username, $firstname, $lastname, $email)); + $authMethod = new Monkeys_Form_Element_Select('authMethod'); + translate('Auth Method'); + $authMethod->setLabel('Auth Method') + ->addMultiOption(Users_Model_User::AUTH_PASSWORD, 'Password') + ->addMultiOption(Users_Model_User::AUTH_YUBIKEY, 'YubiKey') + ->setAttrib('onchange', 'COMMID.general.toggleYubikey()'); + + $yubikey = new Monkeys_Form_Element_Text('yubikey'); + translate('Associated YubiKey'); + $yubikey->setLabel('Associated YubiKey') + ->setAttrib('class', 'yubiKeyInput'); + + $this->addElements(array($username, $firstname, $lastname, $email, $authMethod, $yubikey)); if (!$this->_targetUser->id) { $password1 = new Monkeys_Form_Element_Password('password1'); translate('Enter password'); + $passwordValidator = new Monkeys_Validate_Password(); $password1->setLabel('Enter password') ->setRequired(true) - ->addValidator(new Monkeys_Validate_PasswordConfirmation()); + ->addValidator(new Monkeys_Validate_PasswordConfirmation()) + ->addValidator($passwordValidator); + + if ($restrictions = $passwordValidator->getPasswordRestrictionsDescription()) { + $password1->setDescription($restrictions); + } $password2 = new Monkeys_Form_Element_Password('password2'); translate('Enter password again'); diff --git a/modules/users/forms/ChangePassword.php b/modules/users/forms/ChangePassword.php index 1d0be99..8af9d55 100644 --- a/modules/users/forms/ChangePassword.php +++ b/modules/users/forms/ChangePassword.php @@ -1,7 +1,7 @@ _username = $username; + parent::__construct($options); + } + public function init() { $password1 = new Monkeys_Form_Element_Password('password1'); translate('Enter password'); + $passwordValidator = new Monkeys_Validate_Password($this->_username); $password1->setLabel('Enter password') ->setRequired(true) - ->addValidator(new Monkeys_Validate_PasswordConfirmation()); + ->addValidator(new Monkeys_Validate_PasswordConfirmation()) + ->addValidator($passwordValidator); + + if ($restrictions = $passwordValidator->getPasswordRestrictionsDescription()) { + $password1->setDescription($restrictions); + } $password2 = new Monkeys_Form_Element_Password('password2'); translate('Enter password again'); diff --git a/modules/users/forms/Login.php b/modules/users/forms/Login.php old mode 100755 new mode 100644 index f23d956..242a375 --- a/modules/users/forms/Login.php +++ b/modules/users/forms/Login.php @@ -28,14 +28,19 @@ class Users_Form_Login extends Zend_Form $password->setLabel('PASSWORD') ->setDecoratorOptions(array( 'separateLine' => true, - 'dontMarkRequired' => true, - )) - ->setRequired(true); + )); + + $yubikey = new Monkeys_Form_Element_Text('yubikey'); + $yubikey->setLabel('YUBIKEY') + ->setDecoratorOptions(array( + 'separateLine' => true, + )) + ->setAttrib('class', 'yubiKeyInput'); $rememberme = new Monkeys_Form_Element_Checkbox('rememberme'); $rememberme->setLabel('Remember me'); - $this->addElements(array($username, $password, $rememberme)); + $this->addElements(array($username, $password, $yubikey, $rememberme)); if ($this->_useCaptcha) { $captcha = new Monkeys_Form_Element_Captcha('captcha', array( diff --git a/modules/users/forms/PersonalInfo.php b/modules/users/forms/PersonalInfo.php index 8492112..7a92fae 100644 --- a/modules/users/forms/PersonalInfo.php +++ b/modules/users/forms/PersonalInfo.php @@ -1,7 +1,7 @@ _profile = $profile; + $this->_sregRequest= $sregRequest; $this->_sregProps = $sregProps; $fields = new Model_Fields(); - $fieldsArr = $fields->getValues($user); + $fieldsArr = $fields->getValues($this->_profile); for ($i = 0; $i < count($fieldsArr); $i++) { $this->_formElements[$fieldsArr[$i]->openid] = array( 'field' => $fieldsArr[$i], @@ -57,6 +61,14 @@ class Users_Form_PersonalInfo extends Zend_Form $this->addElement($element); } } else { + $profileName = new Monkeys_Form_Element_Text('profileName'); + translate('Profile Name'); + $profileName->setLabel('Profile Name') + ->setRequired(true) + ->setValue($this->_profile->name); + + $this->addElement($profileName); + foreach ($this->_formElements as $formElement) { $this->addElement($formElement['element']); } @@ -75,4 +87,44 @@ class Users_Form_PersonalInfo extends Zend_Form return $values; } + + public function getSregRequest() + { + return $this->_sregRequest; + } + + public function getPolicyUrl() + { + $args = $this->_sregRequest->getExtensionArgs(); + + if (!$args || !isset($args['policy_url'])) { + return false; + } + + return $args['policy_url']; + } + + public static function getForm(Auth_OpenID_Request $request, Users_Model_Profile $profile) + { + // The class Auth_OpenID_SRegRequest is included in the following file + require_once 'libs/Auth/OpenID/SReg.php'; + + $sregRequest = Auth_OpenID_SRegRequest::fromOpenIDRequest($request); + $props = $sregRequest->allRequestedFields(); + $args = $sregRequest->getExtensionArgs(); + if (isset($args['required'])) { + $required = explode(',', $args['required']); + } else { + $required = false; + } + + $sregProps = array(); + foreach ($props as $field) { + $sregProps[$field] = $required && in_array($field, $required); + } + + $personalInfoForm = new Users_Form_PersonalInfo(null, $profile, $sregRequest, $sregProps); + + return $personalInfoForm; + } } diff --git a/modules/users/forms/RecoverPassword.php b/modules/users/forms/RecoverPassword.php index 343c8b1..5e4691c 100644 --- a/modules/users/forms/RecoverPassword.php +++ b/modules/users/forms/RecoverPassword.php @@ -1,7 +1,7 @@ _baseWebDir = $baseWebDir; + $this->_config = Zend_Registry::get('config'); parent::__construct($options); } @@ -47,9 +49,15 @@ class Users_Form_Register extends Zend_Form $password1 = new Monkeys_Form_Element_Password('password1'); translate('Enter desired password'); + $passwordValidator = new Monkeys_Validate_Password(); $password1->setLabel('Enter desired password') ->setRequired(true) - ->addValidator(new Monkeys_Validate_PasswordConfirmation()); + ->addValidator(new Monkeys_Validate_PasswordConfirmation()) + ->addValidator($passwordValidator); + + if ($restrictions = $passwordValidator->getPasswordRestrictionsDescription()) { + $password1->setDescription($restrictions); + } $password2 = new Monkeys_Form_Element_Password('password2'); translate('Enter password again'); diff --git a/modules/users/forms/SigninImage.php b/modules/users/forms/SigninImage.php new file mode 100644 index 0000000..c87bc4d --- /dev/null +++ b/modules/users/forms/SigninImage.php @@ -0,0 +1,30 @@ +setLabel('') + ->setRequired(true) + ->setDescription('Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB.') + ->addValidator('Count', false, 1) + ->addValidator('Size', false, 2097152) // 2 MB + ->addValidator('Extension', false, 'jpg, jpeg, png, gif') + ->addFilter('StripNewlines'); // just a hack to circumvent ZF bug + translate('Only files of type jpg, jpeg, png and gif are allowed.
Maximum size is 2 MB.'); + + $this->addElements(array($image)); + } +} + diff --git a/modules/users/models/AuthAttempt.php b/modules/users/models/AuthAttempt.php index 79ed29a..11aacfc 100644 --- a/modules/users/models/AuthAttempt.php +++ b/modules/users/models/AuthAttempt.php @@ -1,7 +1,7 @@ getValues($this); + } +} diff --git a/modules/users/models/Profiles.php b/modules/users/models/Profiles.php new file mode 100644 index 0000000..da48be4 --- /dev/null +++ b/modules/users/models/Profiles.php @@ -0,0 +1,26 @@ +select() + ->where('user_id=?', $user->id); + + return $this->fetchAll($select); + } +} diff --git a/modules/users/models/SigninImage.php b/modules/users/models/SigninImage.php new file mode 100644 index 0000000..9b705b3 --- /dev/null +++ b/modules/users/models/SigninImage.php @@ -0,0 +1,59 @@ +_getDimensions(); + return $height; + } + + public function getWidth() + { + list ($width,) = $this->_getDimensions(); + return $width; + } + + private function _getDimensions() + { + if (!isset($this->_width) || !isset($this->_height)) { + $image = imagecreatefromstring($this->image); + $this->_width = imagesx($image); + $this->_height = imagesy($image); + + if ($this->_height >= $this->_width * self::MAX_HEIGHT / self::MAX_WIDTH + && $this->_height > self::MAX_HEIGHT) { + $newHeight = self::MAX_HEIGHT; + $newWidth = floor($width * $newHeight / $height); + + $this->_height = $newHeight; + $this->_width = $newWidth; + } elseif ($this->_height < $this->_width * self::MAX_HEIGHT / self::MAX_WIDTH + && $this->_width > self::MAX_WIDTH) { + $newWidth = self::MAX_WIDTH; + $newHeight = floor($newWidth * $this->_height / $this->_width); + $this->_height = $newHeight; + $this->_width = $newWidth; + } + } + + return array($this->_width, $this->_height); + } +} + diff --git a/modules/users/models/SigninImages.php b/modules/users/models/SigninImages.php new file mode 100644 index 0000000..9c9686d --- /dev/null +++ b/modules/users/models/SigninImages.php @@ -0,0 +1,53 @@ +select() + ->where('user_id=?', $user->id); + + return $this->fetchRow($select); + } + + public function getByCookie($cookie) + { + $select = $this->select() + ->where('cookie=?', $cookie); + + return $this->fetchRow($select); + } + + public function deleteForUser(Users_Model_User $user) + { + $where = $this->getAdapter()->quoteInto('user_id=?', $user->id); + $this->delete($where); + } + + public function generateCookieId(Users_Model_User $user) + { + do { + $cookie = md5($user->username . rand(1, 1000)); + $select = $this->select() + ->where('cookie=?', $cookie); + $row = $this->fetchRow($select); + } while($row); + + return $cookie; + } +} + diff --git a/modules/users/models/User.php b/modules/users/models/User.php old mode 100755 new mode 100644 index e33d41a..2da7986 --- a/modules/users/models/User.php +++ b/modules/users/models/User.php @@ -1,7 +1,7 @@ openid.$password) because * that's what's used in Zend_OpenId */ + public function setPassword($password) + { + $this->password = $password; + $this->password_changed = date('Y-m-d'); + } + public function setClearPassword($password) { - $this->password = md5($this->openid.$password); - $this->password_changed = date('Y-m-d'); + $this->setPassword(md5($this->openid.$password)); } public function isAllowed($resource, $privilege) @@ -56,4 +66,144 @@ class Users_Model_User extends Zend_Db_Table_Row_Abstract return md5($token.time()); } + + public function overrideWithLdapData(Array $ldapData, $syncDb = false) + { + $acceptedEula = 1; + $username = $ldapData['cn'][0]; + $firstname = $ldapData['givenname'][0]; + $lastname = $ldapData['sn'][0]; + $email = $ldapData['mail'][0]; + + if (Zend_Registry::get('config')->ldap->admin == $username) { + $role = Users_Model_User::ROLE_ADMIN; + } else { + $role = Users_Model_User::ROLE_REGISTERED; + } + + if ($this->accepted_eula != $acceptedEula + || $this->username != $username + || $this->firstname != $firstname + || $this->lastname != $lastname + || $this->email != $email + || $this->role != $role) { + $userChanged = true; + } else { + $userChanged = false; + } + + $this->accepted_eula = $acceptedEula; + $this->username = $username; + $this->firstname = $firstname; + $this->lastname = $lastname; + $this->email = $email; + $this->role = $role; + + if ($syncDb && $userChanged) { + $this->save(); + } + } + + public function generateOpenId($baseUrl) + { + $config = Zend_Registry::get('config'); + if ($config->subdomain->enabled) { + $openid = Monkeys_Controller_Action::getProtocol() . '://' . $this->username . '.' . $config->subdomain->hostname; + } else { + $openid = $baseUrl . '/identity/' . $this->username; + } + + if ($config->SSL->enable_mixed_mode) { + $openid = str_replace('http://', 'https://', $openid); + } + Zend_OpenId::normalizeUrl($openid); + + $this->openid = $openid; + } + + public function createDefaultProfile(Zend_View $view) + { + $profiles = new Users_Model_Profiles(); + $profile = $profiles->createRow(); + $profile->user_id = $this->id; + $profile->name = $view->translate('Default profile'); + $profile->save(); + + return $profile->id; + } + + public function generatePersonalInfo(Array $ldapData, $profileId) + { + if (!$this->id) { + throw new Exception('Can\'t call User::generatePersonalInfo() on an empty User object'); + } + + $ldapConfig = Zend_Registry::get('config')->ldap; + if (!isset($ldapConfig->fields)) { + return; + } + + $fieldValues = new Model_FieldsValues(); + $fields = new Model_Fields(); + foreach ($ldapConfig->fields->toArray() as $openIdField => $ldapField) { + if (!$fieldRow = $fields->getByOpenIdIdentifier($openIdField)) { + continue; + } + + if (!isset($ldapData[$ldapField])) { + if (strpos($ldapField, '+') == false) { + continue; + } + $subfields = explode('+', $ldapField); + array_walk($subfields, 'trim'); + $value = array(); + foreach ($subfields as $subfield) { + if (!isset($ldapData[$subfield])) { + continue; + } + $value[] = $ldapData[$subfield][0]; + } + $value = implode(' ', $value); + } else { + $value = $ldapData[$ldapField][0]; + } + + $fieldsValue = $fieldValues->createRow(); + $fieldsValue->user_id = $this->id; + $fieldsValue->profile_id = $profileId; + $fieldsValue->field_id = $fieldRow->id; + $fieldsValue->value = $value; + $fieldsValue->save(); + } + } + + public function getImage() + { + if (!isset($this->_image)) { + $images = new Users_Model_SigninImages(); + if (!$row = $images->getForUser($this)) { + $this->_image = false; + } else { + $this->_image = $row; + } + } + + return $this->_image; + } + + public function markSuccessfullLogin() + { + $this->last_login = date('Y-m-d H:i:s'); + } + + public function getLastLoginUtc() + { + $time = strtotime($this->last_login); + return gmdate('Y-m-d\TH:i:s\Z', $time); + } + + public function getSecondsSinceLastLogin() + { + return time() - strtotime($this->last_login); + } } diff --git a/modules/users/models/Users.php b/modules/users/models/Users.php old mode 100755 new mode 100644 index 3188ab0..e1883c3 --- a/modules/users/models/Users.php +++ b/modules/users/models/Users.php @@ -1,7 +1,7 @@ getAdapter(); + $config = Zend_Registry::get('config'); + $useYubikey = false; - $result = $db->query("SHOW VARIABLES LIKE 'character_set_client'")->fetch(); - $clientCharset = $result['Value']; if ($isOpenId) { if (!Zend_OpenId::normalize($identity)) { return false; } - $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'openid', 'password', - 'MD5(CONCAT(CONVERT(openid using ' . $clientCharset . '), CONVERT(? using ' . $clientCharset . ')))'); + if (!$this->_user = $this->getUserWithOpenId($identity)) { + return false; + } + + $cn = $this->_user->username; } else { - $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'username', 'password', - 'MD5(CONCAT(CONVERT(openid using ' . $clientCharset . '), CONVERT(? using ' . $clientCharset . ')))'); + $cn = $identity; + $this->_user = $this->getUserWithUsername($identity, false, $view); } - $authAdapter->setIdentity($identity); - $authAdapter->setCredential($password); + if ($this->_user + && $config->yubikey->enabled + && ($this->_user->auth_type == Users_Model_User::AUTH_YUBIKEY + || $config->yubikey->force)) { + $parts = Yubico_Auth::parsePasswordOTP($password); + if (!$parts || $this->_user->yubikey_publicid != $parts['prefix']) { + return false; + } + $useYubikey = true; + } + $config = Zend_Registry::get('config'); + $ldapConfig = $config->ldap; + if ($useYubikey) { + if (!@$config->yubikey->api_id || !@$config->yubikey->api_key) { + throw new Zend_Exception('Admin must set the yubikey configuration options before attempting to log in using this method'); + } + + $authAdapter = new Monkeys_Auth_Adapter_Yubikey( + array( + 'api_id' => $config->yubikey->api_id, + 'api_key' => $config->yubikey->api_key + ), + $identity, + $password + ); + } else if ($ldapConfig->enabled) { + $ldapOptions = $ldapConfig->toArray(); + $ldapOptions['accountCanonicalForm'] = Zend_Ldap::ACCTNAME_FORM_USERNAME; + unset($ldapOptions['enabled']); + unset($ldapOptions['admin']); + unset($ldapOptions['fields']); + unset($ldapOptions['keepRecordsSynced']); + unset($ldapOptions['canChangePassword']); + unset($ldapOptions['passwordHashing']); + + // we'll try to bind directly as the user to be authenticated, so we're unsetting + // the LDAP admin credentials + unset($ldapOptions['username']); + unset($ldapOptions['password']); + + $username = "cn=$cn,{$ldapOptions['baseDn']}"; + + $authAdapter = new Zend_Auth_Adapter_Ldap( + array('server1' => $ldapOptions), + $username, + $password + ); + } else { + $db = $this->getAdapter(); + + $result = $db->query("SHOW VARIABLES LIKE 'character_set_client'")->fetch(); + $clientCharset = $result['Value']; + if ($isOpenId) { + $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'openid', 'password', + 'MD5(CONCAT(CONVERT(openid using ' . $clientCharset . '), CONVERT(? using ' . $clientCharset . ')))'); + } else { + $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'username', 'password', + 'MD5(CONCAT(CONVERT(openid using ' . $clientCharset . '), CONVERT(? using ' . $clientCharset . ')))'); + } + + $authAdapter->setIdentity($identity); + $authAdapter->setCredential($password); + } + + $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()) { - if ($isOpenId) { - $this->_user = $this->getUserWithOpenId($identity); - } else { - $this->_user = $this->getUserWithUsername($identity); + if (!$isOpenId) { + try { + $this->_user = $this->getUserWithUsername($identity, true, $view); + } catch (Exception $e) { + // avoid leaving in the session an empty user object + Zend_Auth::getInstance()->clearIdentity(); + Zend_Session::forgetMe(); + + throw $e; + } } + if (!$bypassMarkSuccessfullLogin) { + $this->_user->markSuccessfullLogin(); + } + $this->_user->save(); + $auth->getStorage()->write($this->_user); Zend_Registry::set('user', $this->_user); return true; } + // this is ugly, logging should be done in the controller, not here + $logger = Zend_Registry::get('logger'); + $logger->log("Invalid authentication: " . implode(' - ', $result->getMessages()), Zend_Log::DEBUG); + if (is_a($authAdapter, 'Monkeys_Auth_Adapter_Yubikey')) { + $authOptions = $authAdapter->getOptions(); + if ($yubi = @$authOptions['yubiClient']) { + $logger->log("Yubi request was: " . $yubi->getlastQuery(), Zend_Log::DEBUG); + } + } + return false; } @@ -152,18 +237,80 @@ class Users_Model_Users extends Monkeys_Db_Table_Gateway public function getUserWithEmail($email) { - $select = $this->select() - ->where('email=?', $email); + $ldapOptions = Zend_Registry::get('config')->ldap; + if ($ldapOptions->enabled) { + $ldap = Monkeys_Ldap::getInstance(); + try { + $ldapUserData = $ldap->search($ldapOptions->baseDn, 'mail', $email); + } catch (Exception $e) { + if ($e->getCode() == Monkeys_Ldap::EXCEPTION_GET_ENTRIES) { + return false; + } - return $this->fetchRow($select); + throw $e; + } + + $select = $this->select() + ->where('username=?', $ldapUserData['cn'][0]); + $user = $this->fetchRow($select); + if (!$user) { + // user is registered in LDAP, but not in CID's db + $user = $this->createRow(); + $user->registration_date = date('Y-m-d'); + } + // this fields are always overridden from what comes from LDAP, because they might change + $user->overrideWithLdapData($ldapUserData); + } else { + $select = $this->select() + ->where('email=?', $email); + $user = $this->fetchRow($select); + } + + return $user; } - public function getUserWithUsername($username) + public function getUserWithUsername($username, $generateNewIfMissing = false, Zend_View $view = null) { $select = $this->select() ->where('username=?', $username); + $user = $this->fetchRow($select); - return $this->fetchRow($select); + $ldapOptions = Zend_Registry::get('config')->ldap; + if ($ldapOptions->enabled) { + $ldap = Monkeys_Ldap::getInstance(); + try { + $ldapUserData = $ldap->get("cn=$username,{$ldapOptions->baseDn}"); + } catch (Exception $e) { + if ($e->getCode() == Monkeys_Ldap::EXCEPTION_SEARCH) { + return false; + } + + throw $e; + } + + if ($user) { + // this fields are always overridden from what comes from LDAP, because they might change + $user->overrideWithLdapData($ldapUserData); + } else { + // user is registered in LDAP, but not in CID's db + $user = $this->createRow(); + $user->registration_date = date('Y-m-d'); + $user->overrideWithLdapData($ldapUserData); + + if ($user->role != Users_Model_User::ROLE_ADMIN) { + preg_match('#(.*)/users/login/authenticate#', Zend_OpenId::selfURL(), $matches); + $user->generateOpenId($matches[1]); + } + + if ($generateNewIfMissing) { + $user->save(); + $profileId = $user->createDefaultProfile($view); + $user->generatePersonalInfo($ldapUserData, $profileId); + } + } + } + + return $user; } public function getUserWithOpenId($openid) @@ -305,6 +452,40 @@ class Users_Model_Users extends Monkeys_Db_Table_Gateway 'PRIMARY_POSITION' => NULL, 'IDENTITY' => false, ), + 'last_login' => + array( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'last_login', + 'COLUMN_POSITION' => 7, + 'DATA_TYPE' => 'datetime', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => NULL, + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), + 'auth_type' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'auth_type', + 'COLUMN_POSITION' => 7, + 'DATA_TYPE' => 'tinyint', + 'DEFAULT' => '0', + 'NULLABLE' => false, + 'LENGTH' => NULL, + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), 'password' => array ( 'SCHEMA_NAME' => NULL, @@ -339,6 +520,23 @@ class Users_Model_Users extends Monkeys_Db_Table_Gateway 'PRIMARY_POSITION' => NULL, 'IDENTITY' => false, ), + 'yubikey_publicid' => + array ( + 'SCHEMA_NAME' => NULL, + 'TABLE_NAME' => 'users', + 'COLUMN_NAME' => 'yubikey_publicid', + 'COLUMN_POSITION' => 9, + 'DATA_TYPE' => 'varchar', + 'DEFAULT' => NULL, + 'NULLABLE' => false, + 'LENGTH' => '50', + 'SCALE' => NULL, + 'PRECISION' => NULL, + 'UNSIGNED' => NULL, + 'PRIMARY' => false, + 'PRIMARY_POSITION' => NULL, + 'IDENTITY' => false, + ), 'firstname' => array ( 'SCHEMA_NAME' => NULL, diff --git a/modules/users/views/scripts/login/index.phtml b/modules/users/views/scripts/login/index.phtml old mode 100755 new mode 100644 index 93470b7..fb463fb --- a/modules/users/views/scripts/login/index.phtml +++ b/modules/users/views/scripts/login/index.phtml @@ -10,6 +10,9 @@
  • translate('Personal Info') ?>
  • +
  • + translate('Sign-in Image') ?> +
  • translate('Sites database') ?>
  • @@ -53,9 +56,22 @@
    -
    + image): ?> +
    + <?= $this->translate('This is the image that identifies your account in this computer') ?> +
    + +
    loginForm->username ?> - loginForm->password ?> + yubikey->enabled && $this->yubikey->force): ?> + loginForm->yubikey ?> + + loginForm->password ?> + useCaptcha): ?> loginForm->captcha ?> @@ -72,16 +88,18 @@

    - translate('Forgot you password?') ?> + translate('Forgot your password?') ?>

    -
    -
    -

    - translate('You don\'t have an account?') ?> -

    -

      -
    - + allowRegistrations): ?> +
    +
    +

    + translate('You don\'t have an account?') ?> +

    +

      +
    + + diff --git a/modules/users/views/scripts/personalinfo/edit.phtml b/modules/users/views/scripts/personalinfo/edit.phtml index 4f3c734..eecca20 100644 --- a/modules/users/views/scripts/personalinfo/edit.phtml +++ b/modules/users/views/scripts/personalinfo/edit.phtml @@ -1,8 +1,8 @@ -
    + fields as $field): ?>
    - + diff --git a/modules/users/views/scripts/personalinfo/index.phtml b/modules/users/views/scripts/personalinfo/index.phtml index f4d2907..e85e9ae 100644 --- a/modules/users/views/scripts/personalinfo/index.phtml +++ b/modules/users/views/scripts/personalinfo/index.phtml @@ -11,18 +11,50 @@ YAHOO.util.Event.onDOMReady(function () {

    translate('Personal Info') ?>

    -
    translate('This information will be used to automatically populate registration fields to any OpenID transaction that requires so') ?>
    -
    - action('show', 'personalinfo', 'users', array('userid' => $this->targetUser->id)) ?> + profiles as $profile): ?> + +
    +
    + + translate('Edit profile') ?> + + 1 || count($this->profiles) > 1): ?> + + + + translate('Delete profile') ?> + + + +
    +
    +
    +
    + translate('Profile Name') ?>: +
    +
    + name ?> +
    +
    + getFields() as $field): ?> +
    +
    + translate($field->name) ?>: +
    +
    + value)? $this->translate('Not Entered') : $field->value ?> +
    +
    + +
    +
    + +
    diff --git a/modules/users/views/scripts/personalinfo/show.phtml b/modules/users/views/scripts/personalinfo/show.phtml deleted file mode 100644 index d29bcf6..0000000 --- a/modules/users/views/scripts/personalinfo/show.phtml +++ /dev/null @@ -1,12 +0,0 @@ -
    - fields as $field): ?> -
    -
    - translate($field->name) ?>: -
    -
    - value)? $this->translate('Not Entered') : $field->value ?> -
    -
    - -
    diff --git a/modules/users/views/scripts/profile/index.phtml b/modules/users/views/scripts/profile/index.phtml old mode 100755 new mode 100644 index 383e8af..6b9bf06 --- a/modules/users/views/scripts/profile/index.phtml +++ b/modules/users/views/scripts/profile/index.phtml @@ -13,12 +13,17 @@ YAHOO.util.Event.onDOMReady(function () {

    translate('Account info') ?>

    targetUser->id == $this->user->id): ?>
    - - translate('Edit') ?> -  |  - - translate('Change Password') ?> - + canEditAccountInfo): ?> + + translate('Edit') ?> + + + canChangePassword && (!$this->yubikey->enabled || !$this->yubikey->force)): ?> +  |  + + translate('Change Password') ?> + +
    @@ -34,7 +39,7 @@ YAHOO.util.Event.onDOMReady(function () { targetUser->id && $this->targetUser->id == $this->user->id): ?>
    - user->role == Users_Model_User::ROLE_REGISTERED): ?> + user->role == Users_Model_User::ROLE_REGISTERED && $this->canEditAccountInfo): ?> translate('Delete Account') ?> diff --git a/modules/users/views/scripts/profilegeneral/accountinfo.phtml b/modules/users/views/scripts/profilegeneral/accountinfo.phtml index 4c4e3b0..fc7a2cb 100644 --- a/modules/users/views/scripts/profilegeneral/accountinfo.phtml +++ b/modules/users/views/scripts/profilegeneral/accountinfo.phtml @@ -31,4 +31,18 @@ targetUser->openid ?>
    + yubikey->enabled && !$this->yubikey->force): ?> +
    +
    + translate('Auth Method') ?>: +
    +
    + targetUser->auth_type == Users_Model_User::AUTH_PASSWORD): ?> + translate('Password') ?> + + YubiKey + +
    +
    +
    diff --git a/modules/users/views/scripts/profilegeneral/confirmdelete.phtml b/modules/users/views/scripts/profilegeneral/confirmdelete.phtml old mode 100755 new mode 100644 diff --git a/modules/users/views/scripts/profilegeneral/editaccountinfo.phtml b/modules/users/views/scripts/profilegeneral/editaccountinfo.phtml index e2af3e7..bfc7cad 100644 --- a/modules/users/views/scripts/profilegeneral/editaccountinfo.phtml +++ b/modules/users/views/scripts/profilegeneral/editaccountinfo.phtml @@ -7,6 +7,14 @@ echo $this->accountInfoForm->password1; echo $this->accountInfoForm->password2; } ?> + yubikey->enabled): ?> + yubikey->force): ?> + accountInfoForm->authMethod ?> + +
    + accountInfoForm->yubikey ?> +
    +
     
    @@ -14,6 +22,10 @@ +
    + +

    + translate('This image will be shown in the log-in and OpenID authentication screens of Community-ID.') ?> +

    +

    + translate('It serves as a phishing counter-measure, as only you will recognize your image, proving these pages haven\'t been falsified.') ?> +

    +

    + translate('After having uploaded the image, for the it to be shown you need to enable it on each computer/browser you want to use (the system is cookie-based).') ?> +

    + +user->getImage()): ?> +

    + translate('Use the following button to enable/disable it in the current computer/browser:') ?>
    +

    +
    + enabled): ?> + + + + + + + +
    + +

    + translate('Further instructions will appear after you upload the image.') ?> +

    + diff --git a/modules/stats/controllers/AuthorizationsController.php b/plugins/stats/Authorizations.php similarity index 83% rename from modules/stats/controllers/AuthorizationsController.php rename to plugins/stats/Authorizations.php index e7e5cff..abdafef 100644 --- a/modules/stats/controllers/AuthorizationsController.php +++ b/plugins/stats/Authorizations.php @@ -1,22 +1,32 @@ view->translate('Authorizations per day'); + } + + public function setTemplateVars() { $this->view->weekSelected = ''; $this->view->yearSelected = ''; - switch ($this->_getParam('type')) { + switch ($this->_controllerAction->getRequest()->getParam('type')) { case 'year': $this->view->yearSelected = 'selected="true"'; $this->view->type = 'year'; @@ -29,14 +39,11 @@ class Stats_AuthorizationsController extends CommunityID_Controller_Action $this->view->rand = rand(0, 1000); } - public function graphAction() + public function renderGraph() { require_once 'libs/jpgraph/jpgraph.php'; require_once 'libs/jpgraph/jpgraph_bar.php'; - $this->_helper->viewRenderer->setNeverRender(true); - $this->_helper->layout->disableLayout(); - $graph = new Graph(300,200 ,'auto'); $graph->SetMarginColor('white'); $graph->SetFrame(false); @@ -50,7 +57,7 @@ class Stats_AuthorizationsController extends CommunityID_Controller_Action $labelsy = array(); $datay = array(); - switch ($this->_getParam('type')) { + switch ($this->_controllerAction->getRequest()->getParam('type')) { case 'year': $this->_populateYearData($labelsy, $datay); break; diff --git a/plugins/stats/Authorizations.phtml b/plugins/stats/Authorizations.phtml new file mode 100644 index 0000000..506c4a7 --- /dev/null +++ b/plugins/stats/Authorizations.phtml @@ -0,0 +1,9 @@ +
    + translate('Select view') ?>: + +
    + + diff --git a/modules/stats/controllers/RegistrationsController.php b/plugins/stats/Registrations.php similarity index 84% rename from modules/stats/controllers/RegistrationsController.php rename to plugins/stats/Registrations.php index 0a83291..8bfe823 100644 --- a/modules/stats/controllers/RegistrationsController.php +++ b/plugins/stats/Registrations.php @@ -1,22 +1,32 @@ view->translate('Registrations per day'); + } + + public function setTemplateVars() { $this->view->weekSelected = ''; $this->view->yearSelected = ''; - switch ($this->_getParam('type')) { + switch ($this->_controllerAction->getRequest()->getParam('type')) { case 'month': $this->view->monthSelected = 'selected="true"'; $this->view->type = 'month'; @@ -33,15 +43,12 @@ class Stats_RegistrationsController extends CommunityID_Controller_Action $this->view->rand = rand(0, 1000); } - public function graphAction() + public function renderGraph() { require_once 'libs/jpgraph/jpgraph.php'; require_once 'libs/jpgraph/jpgraph_bar.php'; - $this->_helper->viewRenderer->setNeverRender(true); - $this->_helper->layout->disableLayout(); - - $graph = new Graph($this->_getParam('type') == 'month'? 400 : 300, 200 ,'auto'); + $graph = new Graph($this->_controllerAction->getRequest()->getParam('type') == 'month'? 400 : 300, 200 ,'auto'); $graph->SetMarginColor('white'); $graph->SetFrame(false); $graph->SetScale("textlin"); @@ -54,7 +61,7 @@ class Stats_RegistrationsController extends CommunityID_Controller_Action $labelsy = array(); $datay = array(); - switch ($this->_getParam('type')) { + switch ($this->_controllerAction->getRequest()->getParam('type')) { case 'month': $this->_populateMonthData($labelsy, $datay); break; diff --git a/plugins/stats/Registrations.phtml b/plugins/stats/Registrations.phtml new file mode 100644 index 0000000..b78f2fa --- /dev/null +++ b/plugins/stats/Registrations.phtml @@ -0,0 +1,10 @@ +
    + translate('Select view') ?>: + +
    + + diff --git a/modules/stats/controllers/SitesController.php b/plugins/stats/Sites.php similarity index 76% rename from modules/stats/controllers/SitesController.php rename to plugins/stats/Sites.php index e8ba5e3..be37eef 100644 --- a/modules/stats/controllers/SitesController.php +++ b/plugins/stats/Sites.php @@ -1,22 +1,32 @@ view->translate('Trusted Sites'); + } + + public function setTemplateVars() { $this->view->weekSelected = ''; $this->view->yearSelected = ''; - switch ($this->_getParam('type')) { + switch ($this->_controllerAction->getRequest()->getParam('type')) { case 'year': $this->view->yearSelected = 'selected="true"'; $this->view->type = 'year'; @@ -29,21 +39,18 @@ class Stats_SitesController extends CommunityID_Controller_Action $this->view->rand = rand(0, 1000); } - public function graphAction() + public function renderGraph() { require_once 'libs/jpgraph/jpgraph.php'; require_once 'libs/jpgraph/jpgraph_bar.php'; require_once 'libs/jpgraph/jpgraph_line.php'; - $this->_helper->viewRenderer->setNeverRender(true); - $this->_helper->layout->disableLayout(); - $graph = new Graph(300,200 ,'auto'); $graph->SetMarginColor('white'); $graph->SetFrame(false); $graph->SetScale("textlin"); $graph->SetY2Scale("lin"); - $graph->img->SetMargin(0,30,20,50); + $graph->img->SetMargin(0,30,20,65); $graph->yaxis->HideLabels(); $graph->yaxis->HideTicks(); $graph->yaxis->scale->SetGrace(20); @@ -54,7 +61,7 @@ class Stats_SitesController extends CommunityID_Controller_Action $datay = array(); $datay2 = array(); - switch ($this->_getParam('type')) { + switch ($this->_controllerAction->getRequest()->getParam('type')) { case 'year': $this->_populateYearData($labelsy, $datay, $datay2); break; @@ -64,20 +71,33 @@ class Stats_SitesController extends CommunityID_Controller_Action $graph->xaxis->SetTickLabels($labelsy); + $locale = Zend_Registry::get('Zend_Locale'); + if ($locale == 'ja') { + // the ttf file for FF_MINCHO is already encoded in utf-8 + $legend1 = $this->view->translate('Trusted sites'); + $legend2 = $this->view->translate('Sites per user'); + } else { + // default ttf files are latin-1 encoded + $legend1 = utf8_decode($this->view->translate('Trusted sites')); + $legend2 = utf8_decode($this->view->translate('Sites per user')); + } $bplot = new BarPlot($datay); - $bplot->setLegend(utf8_decode($this->view->translate('Trusted sites'))); + $bplot->setLegend($legend1); $bplot->SetFillGradient("navy","lightsteelblue",GRAD_WIDE_MIDVER); $bplot->value->Show(); $bplot->value->SetFormat('%d'); $p1 = new LinePlot($datay2); $p1->SetColor("red"); - $p1->SetLegend(utf8_decode($this->view->translate('Sites per user'))); + $p1->SetLegend($legend2); $graph->Add($bplot); $graph->AddY2($p1); $graph->legend->SetLayout(LEGEND_HOR); + if ($locale == 'ja') { + $graph->legend->setFont(FF_MINCHO, FS_NORMAL); + } $graph->legend->Pos(0.5,0.99,"center","bottom"); $graph->Stroke(); @@ -119,7 +139,9 @@ class Stats_SitesController extends CommunityID_Controller_Action } for ($i = 0; $i < count($datay2); $i++) { - $datay2[$i] = round($datay[$i] / $datay2[$i], 2); + if ($datay2[$i] > 0) { + $datay2[$i] = round($datay[$i] / $datay2[$i], 2); + } } } @@ -161,8 +183,9 @@ class Stats_SitesController extends CommunityID_Controller_Action } for ($i = 0; $i < count($datay2); $i++) { - $datay2[$i] = round($datay[$i] / $datay2[$i], 2); + if ($datay2[$i] > 0) { + $datay2[$i] = round($datay[$i] / $datay2[$i], 2); + } } } } - diff --git a/plugins/stats/Sites.phtml b/plugins/stats/Sites.phtml new file mode 100644 index 0000000..e1820c2 --- /dev/null +++ b/plugins/stats/Sites.phtml @@ -0,0 +1,8 @@ +
    + translate('Select view') ?>: + +
    + diff --git a/plugins/stats/Top.php b/plugins/stats/Top.php new file mode 100644 index 0000000..bb998a5 --- /dev/null +++ b/plugins/stats/Top.php @@ -0,0 +1,29 @@ +view->translate('Top 10 Trusted Sites'); + } + + public function setTemplateVars() + { + $stats = new Stats_Model_Stats(); + $this->view->sites = $stats->getTopTenSites(); + } +} diff --git a/modules/stats/views/scripts/top/index.phtml b/plugins/stats/Top.phtml similarity index 82% rename from modules/stats/views/scripts/top/index.phtml rename to plugins/stats/Top.phtml index b020614..af842e4 100644 --- a/modules/stats/views/scripts/top/index.phtml +++ b/plugins/stats/Top.phtml @@ -1,4 +1,3 @@ -

    translate('Top 10 Trusted Sites') ?>

    sites as $num => $siteInfo): ?> @@ -8,3 +7,4 @@
    + diff --git a/resources/ca/eula.txt b/resources/ca/eula.txt new file mode 100644 index 0000000..98e55dc --- /dev/null +++ b/resources/ca/eula.txt @@ -0,0 +1,31 @@ +EL SERVEI +Per poder usar el servei de Community-ID.org ha d'estar d'acord i de poder complir amb aquests termes de servei (cada punt individual i col·lectivament referit com el "Servei"). + +L'ACORD +Aquest és un acord legal ("Acord") entre vostè i Community-ID.org. Si us plau llegeixi l'Acord comlpeto amb deteniment abans d'usar el servei de Community-ID.org. En usar aquest Servei, vostè manifesta estar d'acord amb els termes i condicions d'aquest Acord (els "Termes") durant el seu ús del Servei. + +CONDUCTA +Com a condició d'ús del Servei, vostè garanteix Community-ID.org que no usarà el Servei per a cap final|finalitat no legal o prohibit per aquests termes, condicions i avisos. El Servei està proveído a individus només, per a ús personal només. Qualsevol ús comercial no autoritzat del Servei, o la revenda del Servei, està expressament prohibit. ELS USUARIS MANIFESTEN EL SEU ACORD EN NO USAR AQUEST SERVEI PER FER SPAM. ELS USUARIS MANIFESTEN EL SEU ACORD EN NO REPRESENTAR FRAUDULENTAMENTE A UN INDIVIDU O ENTITAT CORPORATIVA EN EL SERVEI. Vostè manifesta el seu acord en seguir totes les lleis i regulacions aplicables locals, estatals, nacionals i internacionals, i a vostè és l'únic responsable per tot acte o omissió que succeeixi, uncluído el contingut de les seves transmissions en l'ús del Servei. A tall d'exemple, però no limitat a, vostè aquesta d'acord amb: +* No usar el Servei en connexió amb enquestes, concursos, esquemes de piràmide, cadenes de correu, correu escombraries o qualsevol altre tipus de missatge duplicativo o no sol·licitat (comercial o d'un altre tipus). +* No difamar, abusar, assetjar, sotjar, amenaçar o qualsevol altra actitud que violi els drets legals dels altres. +* No publicar, distribuir or disseminar qualsevol material o informació inapropiat, profà, difamatori, il·legal, obscè o indecent. +* No publicitar o ofertar béns o serveis que no sigui per a propòsit personal. +* No recollir informació sobre els altres. +* No usar una identitat false per tal d'enganyar els altres. +* No crear comptes per a tercers, cobrant o no, sense que importi si el tercer va donar o no el seu permís. +* No interferir o tractar de pertorbar la xarxa connectada al Servei o violar les regulacions, polítiques o procediments d'ús de l'esmentada xarxa. + + +EXCENSION DE RESPONSABILITAT +Community-ID.org no garanteix que el Servei sigui ininterromput o lliure d'errors. Community-ID.org no garanteix que l'ús o resultats de l'ús del Servei siguin correctes, exactes o fiables. Vostè està d'acord en el qual Community-ID.org no es farà responsable per accessos no autoritzats o alteracions en la transmissió de dades a través del Servei. Vostè està d'acord que Community-ID.org no és responsable per qualsevol amenaça, difamació, obscenitat, o conducta ofensiva o il·legal de qualsevol tercer o la infracció dels drets d'un tercer, inclosos els drets de propietat intel·lectual. +Vostè està d'acord en el qual Community-ID.org no és responsable per cap contingut enviat usant el Servei. Community-ID.org Y/O SEUS RESPECTIUS PROVEEDORS no es FAN RESPONSABLES PER LA IDONEÃTAT, FIABILITAT, PROMPTITUD, i EXACTITUD DEL SERVEI PER A QUALSEVOL FINAL|FINALITAT. EL SERVEI ÉS PROVEIDO "TAL QUAL" SENSE CAP GARANTIA DE NINGUN TIPUS. Community-ID.org I/O ELS SEUS RESPECTIUS PROVEÃDORS RENUNCIEN A DONAR QUALSEVOL GARANTIA O CONDICION RESPECTE AL SERVEI, INCLOENT TOTES LES GARANTIAS I CONDITIONES IMPLICADES DE COMERCIALIZACION, IDONEÃTAT PER A UN PROPOSITO PARTICULAR, TITULO I NO INFRACCION. SOTA CAP CIRCUNSTANCION NO DEU Community-ID.org I/O ELS SEUS PROVEÃDORS SER RESPONSABLIZADOS PER NINGUN DAO DIRECTE, INDERECTO, PUNITIU, INCIDENTAL O DE QUALSEVOL TIPUS, INCLOENT SENSE LIMITACION, DAOS PER PERDUDA D'USO, DADES O BENEFICIS, CONNECTATS, AMB L'ÚS O IDONEÃTAT DEL SERVEI. + +RESOLUCION DE CONFLICTES +En el cas de reclamacions per conflictes, Community-ID.org, sota cap obligació per llei, no permetrà que les parts en conflicte resolguin el seu conflicte, i actuarà sota el resultat mútuament acordat. + +INDEMNIZACION +Vostè manifesta el seu acord en eximir a Community-ID.org, la seva matriu, subsidiaris, afiliats, oficials i empleats, de qualsevol reclamació, demanda o indemnització, incloent costos d'advocats, presentats per qualsevol part com a conseqüència del seu ús o conducta en el Servei. + +MODIFICACION DELS TERMINOS DE SERVEI +Community-ID.org es reserva el dret de canviar els Termes de Servei o polítiques relatives a l'ús del servei en qualsevol moment i notificar-lo publicant una versió actualitzada dels termes de servei al lloc Web. Vostè es fa responsable per revisar regularment aquests termes de servei. L'ús continuat del servei després dels esmentats canvis constitueix el seu consentiment als esmentats canvis. + diff --git a/resources/ca/passwordreset2_mail.txt b/resources/ca/passwordreset2_mail.txt new file mode 100644 index 0000000..3b78b54 --- /dev/null +++ b/resources/ca/passwordreset2_mail.txt @@ -0,0 +1,8 @@ +Benvolgut {userName}, + +La seva contrasenya és ara: {password} + +El hi recomendem que si us plau es registri de nou, i la canvií. + +Gràcies, +L'Equip de Community-ID.org diff --git a/resources/ca/passwordreset_mail.txt b/resources/ca/passwordreset_mail.txt new file mode 100644 index 0000000..d082ea2 --- /dev/null +++ b/resources/ca/passwordreset_mail.txt @@ -0,0 +1,13 @@ +Benvolgut {userName}, + +Ha demanat el restabliment de la seva contrasenya des de la següent IP: {IP} + +Si us plau, gfaci un click en el següent enllaç per a restablir la seva contrasenya: + +{passwordResetURL} + +Si vosté no l'ha demanat, si us plau ignori i no faci cas d'aquest missatge. + + +Gràcies +L'Equipo de Community-ID.org diff --git a/resources/ca/registration_mail.txt b/resources/ca/registration_mail.txt new file mode 100644 index 0000000..d018d74 --- /dev/null +++ b/resources/ca/registration_mail.txt @@ -0,0 +1,11 @@ +Benvolgut {userName}, + +Gràcies per registrar-se en Community-ID.org + +Per a continuar amb el procés de registre, si us plau cliqui en el següent enllaç: + +{registrationURL} + + +Gràcies, +L'Equip de Community-ID.org diff --git a/resources/ca/reminder_mail.txt b/resources/ca/reminder_mail.txt new file mode 100644 index 0000000..60d4345 --- /dev/null +++ b/resources/ca/reminder_mail.txt @@ -0,0 +1,11 @@ +Benvolgut {userName}, + +No hem rebut la confirmació del seu compte en Community-ID.org + +Si us plau confirmi'ns el seu compte fent clic en el següent enllaç, o el seu compte serà totalment el·liminat aquí a pocs dies: + +{registrationURL} + + +Gràcies, +L'equip de Community-ID.org diff --git a/resources/de/eula.txt b/resources/de/eula.txt old mode 100755 new mode 100644 diff --git a/resources/de/passwordreset2_mail.txt b/resources/de/passwordreset2_mail.txt index 84946c7..50520fe 100644 --- a/resources/de/passwordreset2_mail.txt +++ b/resources/de/passwordreset2_mail.txt @@ -6,3 +6,6 @@ Wir empfehlen Ihnen sich nochmals anzumelden, und ihr Passwort zu ändern. Vielen Dank, Das Community-ID Team + +Community-ID ist ein Service von Keyboard Monkeys Ltd. (Community as a +Service) diff --git a/resources/de/passwordreset_mail.txt b/resources/de/passwordreset_mail.txt old mode 100755 new mode 100644 index ed1a69d..51b6c0e --- a/resources/de/passwordreset_mail.txt +++ b/resources/de/passwordreset_mail.txt @@ -12,3 +12,6 @@ diese Nachricht. Vielen Dank, Das Community-ID Team + +Community-ID ist ein Service von Keyboard Monkeys Ltd. (Community as a +Service) diff --git a/resources/de/privacy.txt b/resources/de/privacy.txt deleted file mode 100644 index df7f75a..0000000 --- a/resources/de/privacy.txt +++ /dev/null @@ -1,15 +0,0 @@ -EINLEITUNG -Community-ID.org respektiert jedermann Recht bezüglich des Eigentums seiner privaten Daten. Erfasste und gesammelte Daten durch dieser Webseite werden nur verwendet wie in dieser Erklärung beschreiben. Diese Erklärung gilt ausschließlich für Informationen welche erfasst wurden durch die Community-ID.org Webseite. - - -ERFASSEN VON DATEN -Community-ID.org erfasst Informationen über diese Webseite um den Benutzern einen besseren Service anbieten zu können. Erfasst werden die persönlichen Daten, einschließlich E-Mail-Adressen von registrierten Nutzern. Gespeichert wird auch die IP-Adresse und die Aktivität von Benutzern. Diese Informationen werden verwendet zur Diagnose oder zum Debuggen unserer Systeme oder zum verbessern unserer Dienstleistungen. Es können zusätzliche Nutzungsdaten gespeichert werden inklusive von Verweisen, Zugriffszeiten oder die Art der besuchten Plattform welche durch Benutzer verbreitet werden während des Besuchs der Seite. - -Community-ID.org benutzt Cookies. Ein Cookie ist eine kleine Textdatei, welche der Webserver auf der Festplatte des Computer eines Benutzers speichert zum Zwecke einer eindeutigen Kennung. Cookies ermöglichen Community-ID.org ein Nutzungsmuster zu erstellen und maßgeschneiderte Inhalte für die Nutzer bereitzustellen. Unsere Cookies haben ein Ablaufdatum, und sammeln keine persönlich identifizierbaren Informationen. - - -VERWENDUNG VON INFORMATIONEN -Wir werden Ihre persönlichen Daten nicht verkaufen oder vermieten oder an Dritte weitergegeben. Wir werden persönliche Daten nur weitergeben in folgenden Fällen: 1) Geschaftsübergabe: Wenn Community-ID.org übernommen wird durch dritte, können persönliche Informationen übertragen werden im Einklang mit den Vereinbarungen der Ãœbernahme. 2) Rechtssicherheit: Falls eine gesetzliche Verpflichtung vorliegt diese Informationen weiterzugeben wurde Community-ID.org diesen Folge leisten. - -KONTROLLE UND SPEICHERN VON INFORMATIONEN -Wenn ein Benutzer sein Benutzerkonto in Community-ID.org löscht, werden alle im System gespeicherten Informationen entfernt. Natürlich können unsere Backups altere Kopien Ihrer Informationen enthalten, jedoch werden diese Backups regelmäßig gelöscht. Wir glauben, das Sie die Kontrolle über Ihre Informationen haben sollen und wir respektieren dies. diff --git a/resources/de/registration_mail.txt b/resources/de/registration_mail.txt old mode 100755 new mode 100644 index 086bf0f..9907b43 --- a/resources/de/registration_mail.txt +++ b/resources/de/registration_mail.txt @@ -10,3 +10,6 @@ Link: Vielen Dank, Das Community-ID Team + +Community-ID ist ein Service von Keyboard Monkeys Ltd. (Community as a +Service) diff --git a/resources/de/reminder_mail.txt b/resources/de/reminder_mail.txt index dbf0e03..356906f 100644 --- a/resources/de/reminder_mail.txt +++ b/resources/de/reminder_mail.txt @@ -11,3 +11,6 @@ Benutzerkonto wird gelöscht in einigen Tagen. Danke, Das Community-ID Team + +Community-ID ist ein Service von Keyboard Monkeys Ltd. (Community as a +Service) diff --git a/resources/en/eula.txt b/resources/en/eula.txt old mode 100755 new mode 100644 diff --git a/resources/en/passwordreset2_mail.txt b/resources/en/passwordreset2_mail.txt index e9ff51b..31ba145 100644 --- a/resources/en/passwordreset2_mail.txt +++ b/resources/en/passwordreset2_mail.txt @@ -6,3 +6,5 @@ We recommend that you please log back in, and change it. Thanks, The Community-ID Team + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/en/passwordreset_mail.txt b/resources/en/passwordreset_mail.txt old mode 100755 new mode 100644 index 63b6608..d76facd --- a/resources/en/passwordreset_mail.txt +++ b/resources/en/passwordreset_mail.txt @@ -11,3 +11,5 @@ If you didn't ask for this reset, then you can ignore this message. Thanks, The Community-ID Team + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/en/privacy.txt b/resources/en/privacy.txt deleted file mode 100644 index 16a85c9..0000000 --- a/resources/en/privacy.txt +++ /dev/null @@ -1,13 +0,0 @@ -INTRODUCTION -Community-ID.org respects each individual's right to personal privacy. We will collect and use information through our Web site only in the ways disclosed in this statement. This statement applies solely to information collected at Community-ID.org's Web site. - -INFORMATION COLLECTION -Community-ID.org collects information through our Web site in order to provide users an efficient experience. We collect the personal information, including email addresses, of registered users. We also collect the IP address and use activity of visitors to our website, in order to diagnose and debug our systems and services. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site. - -Community-ID.org employs cookies. A cookie is a small text file that our Web server places on a user's computer hard drive to be a unique identifier. Cookies enable Community-ID.org to track usage patterns and deliver customized content to users. Our cookies have an expiration date, and do not collect personally identifiable information. - -INFORMATION USAGE -We will not rent or sell your personal information to third parties. We will share personal information only in the following cases: 1) Business Transfer: If Community-ID.org were acquired, personal information would be transferred forward in accordance with acquisition agreements. 2) Legal Compliance: If compelled by law to share information, Community-ID.org would be required to do so. - -INFORMATION STORAGE AND CONTROL -When a user deletes their account from Community-ID.org, all of their information is expunged from our systems. Of course, our backups may contain older copies of the information, but we expunge backups regularly. We believe that you control your information, and we absolutely respect that. diff --git a/resources/en/registration_mail.txt b/resources/en/registration_mail.txt old mode 100755 new mode 100644 index d891ff0..de37af1 --- a/resources/en/registration_mail.txt +++ b/resources/en/registration_mail.txt @@ -9,3 +9,5 @@ To continue with the registration process, please click on the following link: Thanks, The Community-ID Team + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/en/reminder_mail.txt b/resources/en/reminder_mail.txt index 608fada..7c3d621 100644 --- a/resources/en/reminder_mail.txt +++ b/resources/en/reminder_mail.txt @@ -10,3 +10,4 @@ Please confirm your account by clicking on the following link, or else your acco Thanks, The Community-ID Team +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/es/eula.txt b/resources/es/eula.txt old mode 100755 new mode 100644 diff --git a/resources/es/passwordreset_mail.txt b/resources/es/passwordreset_mail.txt old mode 100755 new mode 100644 diff --git a/resources/es/privacy.txt b/resources/es/privacy.txt deleted file mode 100644 index 8990d6e..0000000 --- a/resources/es/privacy.txt +++ /dev/null @@ -1,14 +0,0 @@ -INTRODUCCION -Community-ID.org respeta el derecho individual a la privacidad. Recuperaremos y usaremos información a través de nuestro sitio Web solamente como se describe en este documento. Este documento solo aplica a la información recolectada a través del sitio Web Community-ID.org. - -RECOLECCION DE INFORMACION -Community-ID.org recolecta información a través de nuestro sitio Web con el fin de proveer a nuestros usuarios una experiencia eficiente. Recolectamos la información, incluyendo direcciones de correo electrónico, de los usuarios registrados. También recolectamos las direcciones IP y la actividad de uso de los visitantes a nuestro sitio, con el fin de diagnosticar y depurar nuestros sistemas y servicios. Podremos también recolectar alguna información extra, tal como remisiones, tiempos de acceso y tipo de plataforma, que nuestros usuarios divulgan cuando visitan el sitio. - -Community-ID.org utiliza cookies. Una cookie es un pequeño archivo de texto que nuestro servidor Web coloca en el disco duro del computador del usuario. Las cookies permiten a Community-ID.org llevar un registro de los patrones de uso y entregar contenido personalizado a los usuarios. Nuestras cookies tienen una fecha de expiración, y no recolectan información personal identificable. - - -USO DE LA INFORMACION -No rentamos ni vendemos información personal de nuestros usuarios a terceros. Solamente entregaremos información personal en los siguientes casos: 1) Transferencia patrimonial: Si Community-ID.org fuera adquirido, la información personal sería transferida de acuerdo con el contrato de adquisición. 2) Cumplimiento legal: Si obligados por ley a revelar información, Community-ID.org estará obligada a entregarla. - -ALMACENAMIENTO Y CONTROL DE LA INFORMACION -Cuando un usuario borra su cuenta de Community-ID.org, toda su información es borrada de nuestros sistemas. Por supuesto, nuestras copias de respaldo pueden contener copias antiguas de dicha información, pero rotamos estas copias regularmente. Creemos que nuestros usuarios son dueños de su información, y respetamos eso. diff --git a/resources/es/registration_mail.txt b/resources/es/registration_mail.txt old mode 100755 new mode 100644 diff --git a/resources/it/eula.txt b/resources/it/eula.txt new file mode 100644 index 0000000..728b414 --- /dev/null +++ b/resources/it/eula.txt @@ -0,0 +1,30 @@ +THE SERVICE +In order to use the Community-ID.org service you must agree to abide to and comply with these service terms (each feature individually and collectively referred to as the "Service"). + +THE AGREEMENT +This is a legal agreement ("Agreement") between you and Community-ID.org. Please read the entire Agreement carefully before using the Community-ID.org service. By using this Service you agree to be bound by the terms and conditions of this Agreement (the "Terms") for as long as you continue to use the Service. + +CONDUCT +As a condition of your use of the Service, you warrant to Community-ID.org that you will not use the Service for any purpose that is unlawful or prohibited by these terms, conditions, and notices. The Service is provided to individuals only, and for personal use only. Any unauthorized commercial use of the Service, or the resale of its services, is expressly prohibited. USERS AGREE NOT TO USE THIS SERVICE FOR SPAM. USERS AGREE TO NOT MIS-REPRESENT AN INDIVIDUAL OR CORPORATE ENTITY IN THE SERVICE. You agree to abide by all applicable local, state, national and international laws and regulations and are solely responsible for all acts or omissions that occur, including the content of your transmissions through the Service. By way of example, and not as a limitation, you agree: + * Not to use the Service in connection with surveys, contests, pyramid schemes, chain letters, junk email, spamming or any duplicative or unsolicited messages (commercial or otherwise). + * Not to defame, abuse, harass, stalk, threaten or otherwise violate the legal rights (such as rights of privacy and publicity) of others. + * Not to Publish, distribute or disseminate any inappropriate, profane, defamatory, infringing, obscene, indecent or unlawful material or information. + * Not to advertise or offer to sell or buy any goods or services for any non-personal purpose. + * Not to harvest or otherwise collect information about others. + * Not to use a false identity for the purpose of misleading others as to the identity of the individual who is being represented in Community-ID.org. + * Not to create accounts for a third party, for a fee or otherwise, regardless of the third party's permission. + * Not to use, download or otherwise copy, or provide (whether or not for a fee) to a person or entity that is not a Service member any directory of the Service members or other user or usage information or any portion thereof other than in the context of your use of the Service as permitted under the Terms of Service. + * Not to interfere with or disrupt networks connected to the Service or violate the regulations, policies or procedures of such networks. + * Not to interfere with another's use and enjoyment of the Service or another individual's or entity's use and enjoyment of similar services. Community-ID.org has no obligation to monitor the Service or any user's use thereof or retain the content of any session. However, Community-ID.org reserves the right at all times to monitor, review, retain and/or disclose any information as necessary to satisfy any applicable law, regulation, legal process or governmental request. + +DISCLAIMERS/LIMITATION OF LIABILITIES +The information and services included in or available through the Service may include inaccuracies or typographical errors. Changes are periodically added to the information herein. Community-ID.org and/or its respective suppliers may make improvements and/or changes in the Service at any time. Community-ID.org does not represent or warrant that the Service will be uninterrupted or error-free. Community-ID.org does not warrant or represent that the use or the results of the use of the Service or the materials made available as part of the Service will be correct, accurate, timely, or otherwise reliable. You specifically agree that Community-ID.org shall not be responsible for unauthorized access to or alteration of your transmissions or data, any material or data sent or received or not sent or received, or any transactions entered into through the Service. You specifically agree that Community-ID.org is not responsible or liable for any threatening, defamatory, obscene, offensive or illegal content or conduct of any other party or any infringement of another's rights, including intellectual property rights. You specifically agree that Community-ID.org is not responsible for any content sent using and/or included in the Service by any third party. Community-ID.org AND/OR ITS RESPECTIVE SUPPLIERS MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY, RELIABILITY, AVAILABILITY, TIMELINESS, AND ACCURACY OF THE SERVICE FOR ANY PURPOSE. THE SERVICE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. Community-ID.org AND/OR ITS RESPECTIVE SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH REGARD TO THE SERVICE, INCLUDING ALL IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL Community-ID.org AND/OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF USE, DATA OR PROFITS, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE USE OR PERFORMANCE OF THE SERVICE OR RELATED WEB SITES, WITH THE DELAY OR INABILITY TO USE THE SERVICE OR RELATED WEB SITES, THE PROVISION OF OR FAILURE TO PROVIDE SERVICES, OR FOR ANY INFORMATION, SOFTWARE, PRODUCTS, SERVICES AND RELATED GRAPHICS OBTAINED THROUGH THE SERVICE, OR OTHERWISE ARISING OUT OF THE USE OF THE SERVICE, WHETHER BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY OR OTHERWISE, EVEN IF COMMUNITY-ID.ORG OR ANY OF ITS SUPPLIERS HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES. BECAUSE SOME STATES/JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU. IF YOU ARE DISSATISFIED WITH ANY PORTION OF THE SERVICE, OR WITH ANY OF THESE TERMS OF USE, YOUR SOLE AND EXCLUSIVE REMEDY IS TO DISCONTINUE USING THE SERVICE AND ITS RELATED SERVICES. + +CONFLICT RESOLUTION +In the case of conflicting claims, Community-ID.org will, under no obligation of law, allow the two conflicting parties to resolve their conflict, and act on the mutually agreed upon result. + +INDEMNIFICATION +You agree to indemnify and hold Community-ID.org, its parents, subsidiaries, affiliates, officers and employees, harmless from any claim, demand, or damage, including reasonable attorneys' fees, asserted by any third party due to or arising out of your use of or conduct on the Service. + +MODIFICATIONS OF TERMS OF SERVICE +Community-ID.org reserves the right to change the Terms of Service or policies regarding the use of the Service at any time and to notify you by posting an updated version of the Terms of Service on this Web site. You are responsible for regularly reviewing the Terms of Service. Continued use of the Service after any such changes shall constitute your consent to such changes. diff --git a/resources/it/passwordreset2_mail.txt b/resources/it/passwordreset2_mail.txt new file mode 100644 index 0000000..06daa8c --- /dev/null +++ b/resources/it/passwordreset2_mail.txt @@ -0,0 +1,10 @@ +Gentile {userName}, + +La tua nuova password è: {password} + +Ti invitiamo a collegarti e a modificarla. + +Grazie, +Il team Community-ID + +Community-ID è un servizio di Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/it/passwordreset_mail.txt b/resources/it/passwordreset_mail.txt new file mode 100644 index 0000000..352ab76 --- /dev/null +++ b/resources/it/passwordreset_mail.txt @@ -0,0 +1,15 @@ +Gentile {userName}, + +Una richiesta di riassegnazione della password è stata generata dal seguente IP: {IP} + +Clicca sul link seguente per procedere con la riassegnazione: + +{passwordResetURL} + +Se non si è richiesta la reimpostazione, ignorare questo messaggio. + + +Grazie, +Il team Community-ID + +Community-ID è un servizio di Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/it/privacy.txt b/resources/it/privacy.txt new file mode 100644 index 0000000..fbb3b90 --- /dev/null +++ b/resources/it/privacy.txt @@ -0,0 +1,15 @@ +INTRODUZIONE +Community-ID.org rispetta il diritto di ogni individuo alla privacy. Le informazioni saranno raccolte ed usate tramite il +nostro sito web solo secondo quanto previsto da questo accordo. Questo accordo si applica solo alle informazioni raccolte +nel sito web Community-ID.org + +RACCOLTA DEI DATI +Community-ID.org raccoglie i dati tramite il nostro sito web in modo da fornire ai nostri utenti una esperienza utile. Raccogliamo le informazioni personali, compreso l'indirizzo e-mail, dei nostri utenti registrati. Inoltre raccogliamo l'indirizzo IP e le attività svolte dai visitatori del nostro sito web, in modo da diagnosticare e correggere gli errori dei nostri sistemi e servizi. Inoltre raccogliamo informazioni ulteriori, come i referrals, gli orari di accesso e il tipo di piattaforma, che i nostri utenti forniscono quando visitano il sito + +Community-ID.org utilizza i cookie. Un cookie è un piccolo file di testo che il nostro sito Web inserisce nel disco fisso del computer di un utente come identificatore univoco. I cookie permetto a Community-ID.org di tenere traccia delle modalità di accesso e di fornire del contenuto specifico per gli utenti. I nostri cookie hanno una data di scadenza, e non raccogliamo informazioni che consentano di identificare la persona + +UTILIZZO DEI DATI +Noi non venderemo o forniremo i vostri dati personali a terze parti. Condivideremo i vostri dati personali solo nei seguenti casi: 1) Trasferimento dell'attività: se Community-ID.org venisse acquistato, le informazioni personali sarebbero trasferite secondo quanto previsto dal contratto d'acquisto. 2) Motivi legali: quando richiesto per motivi di legge. + +MEMORIZZAZIONE DEI DATI E CONTROLLO +Quando un utente cancella il suo account da Community-ID.org, tutte le sue informazioni sono rimosse dai nostri sistemi. Ovviamente le nostre copie di sicurezza possono contenere tali dati, ma tali copie sono rimosse su base regolare. Crediamo che l'utente sia colui che controlla i suoi dati, e rispettiamo assolutamente questo fatto. diff --git a/resources/it/registration_mail.txt b/resources/it/registration_mail.txt new file mode 100644 index 0000000..e77695a --- /dev/null +++ b/resources/it/registration_mail.txt @@ -0,0 +1,13 @@ +Gentile {userName}, + +grazie per essersi registrato con community-id.org + +Per completare il processo di registrazione, si prega di cliccare il seguente link: + +{registrationURL} + + +Grazie, +Il team Community-ID + +Community-ID è un servizio di Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/it/reminder_mail.txt b/resources/it/reminder_mail.txt new file mode 100644 index 0000000..dea2b6a --- /dev/null +++ b/resources/it/reminder_mail.txt @@ -0,0 +1,13 @@ +Gentile {userName}, + +Non abbiamo ricevuto la conferma del suo account di community-id.org. + +Si prega di confermare l'account cliccando sul link seguente, viceversa tale account sarà cancellato nei prossimi giorni: + +{registrationURL} + + +Grazie, +Il team Community-ID + +Community-ID è un servizio di Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/ja/eula.txt b/resources/ja/eula.txt new file mode 100644 index 0000000..728b414 --- /dev/null +++ b/resources/ja/eula.txt @@ -0,0 +1,30 @@ +THE SERVICE +In order to use the Community-ID.org service you must agree to abide to and comply with these service terms (each feature individually and collectively referred to as the "Service"). + +THE AGREEMENT +This is a legal agreement ("Agreement") between you and Community-ID.org. Please read the entire Agreement carefully before using the Community-ID.org service. By using this Service you agree to be bound by the terms and conditions of this Agreement (the "Terms") for as long as you continue to use the Service. + +CONDUCT +As a condition of your use of the Service, you warrant to Community-ID.org that you will not use the Service for any purpose that is unlawful or prohibited by these terms, conditions, and notices. The Service is provided to individuals only, and for personal use only. Any unauthorized commercial use of the Service, or the resale of its services, is expressly prohibited. USERS AGREE NOT TO USE THIS SERVICE FOR SPAM. USERS AGREE TO NOT MIS-REPRESENT AN INDIVIDUAL OR CORPORATE ENTITY IN THE SERVICE. You agree to abide by all applicable local, state, national and international laws and regulations and are solely responsible for all acts or omissions that occur, including the content of your transmissions through the Service. By way of example, and not as a limitation, you agree: + * Not to use the Service in connection with surveys, contests, pyramid schemes, chain letters, junk email, spamming or any duplicative or unsolicited messages (commercial or otherwise). + * Not to defame, abuse, harass, stalk, threaten or otherwise violate the legal rights (such as rights of privacy and publicity) of others. + * Not to Publish, distribute or disseminate any inappropriate, profane, defamatory, infringing, obscene, indecent or unlawful material or information. + * Not to advertise or offer to sell or buy any goods or services for any non-personal purpose. + * Not to harvest or otherwise collect information about others. + * Not to use a false identity for the purpose of misleading others as to the identity of the individual who is being represented in Community-ID.org. + * Not to create accounts for a third party, for a fee or otherwise, regardless of the third party's permission. + * Not to use, download or otherwise copy, or provide (whether or not for a fee) to a person or entity that is not a Service member any directory of the Service members or other user or usage information or any portion thereof other than in the context of your use of the Service as permitted under the Terms of Service. + * Not to interfere with or disrupt networks connected to the Service or violate the regulations, policies or procedures of such networks. + * Not to interfere with another's use and enjoyment of the Service or another individual's or entity's use and enjoyment of similar services. Community-ID.org has no obligation to monitor the Service or any user's use thereof or retain the content of any session. However, Community-ID.org reserves the right at all times to monitor, review, retain and/or disclose any information as necessary to satisfy any applicable law, regulation, legal process or governmental request. + +DISCLAIMERS/LIMITATION OF LIABILITIES +The information and services included in or available through the Service may include inaccuracies or typographical errors. Changes are periodically added to the information herein. Community-ID.org and/or its respective suppliers may make improvements and/or changes in the Service at any time. Community-ID.org does not represent or warrant that the Service will be uninterrupted or error-free. Community-ID.org does not warrant or represent that the use or the results of the use of the Service or the materials made available as part of the Service will be correct, accurate, timely, or otherwise reliable. You specifically agree that Community-ID.org shall not be responsible for unauthorized access to or alteration of your transmissions or data, any material or data sent or received or not sent or received, or any transactions entered into through the Service. You specifically agree that Community-ID.org is not responsible or liable for any threatening, defamatory, obscene, offensive or illegal content or conduct of any other party or any infringement of another's rights, including intellectual property rights. You specifically agree that Community-ID.org is not responsible for any content sent using and/or included in the Service by any third party. Community-ID.org AND/OR ITS RESPECTIVE SUPPLIERS MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY, RELIABILITY, AVAILABILITY, TIMELINESS, AND ACCURACY OF THE SERVICE FOR ANY PURPOSE. THE SERVICE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. Community-ID.org AND/OR ITS RESPECTIVE SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH REGARD TO THE SERVICE, INCLUDING ALL IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL Community-ID.org AND/OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF USE, DATA OR PROFITS, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE USE OR PERFORMANCE OF THE SERVICE OR RELATED WEB SITES, WITH THE DELAY OR INABILITY TO USE THE SERVICE OR RELATED WEB SITES, THE PROVISION OF OR FAILURE TO PROVIDE SERVICES, OR FOR ANY INFORMATION, SOFTWARE, PRODUCTS, SERVICES AND RELATED GRAPHICS OBTAINED THROUGH THE SERVICE, OR OTHERWISE ARISING OUT OF THE USE OF THE SERVICE, WHETHER BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY OR OTHERWISE, EVEN IF COMMUNITY-ID.ORG OR ANY OF ITS SUPPLIERS HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES. BECAUSE SOME STATES/JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU. IF YOU ARE DISSATISFIED WITH ANY PORTION OF THE SERVICE, OR WITH ANY OF THESE TERMS OF USE, YOUR SOLE AND EXCLUSIVE REMEDY IS TO DISCONTINUE USING THE SERVICE AND ITS RELATED SERVICES. + +CONFLICT RESOLUTION +In the case of conflicting claims, Community-ID.org will, under no obligation of law, allow the two conflicting parties to resolve their conflict, and act on the mutually agreed upon result. + +INDEMNIFICATION +You agree to indemnify and hold Community-ID.org, its parents, subsidiaries, affiliates, officers and employees, harmless from any claim, demand, or damage, including reasonable attorneys' fees, asserted by any third party due to or arising out of your use of or conduct on the Service. + +MODIFICATIONS OF TERMS OF SERVICE +Community-ID.org reserves the right to change the Terms of Service or policies regarding the use of the Service at any time and to notify you by posting an updated version of the Terms of Service on this Web site. You are responsible for regularly reviewing the Terms of Service. Continued use of the Service after any such changes shall constitute your consent to such changes. diff --git a/resources/ja/passwordreset2_mail.txt b/resources/ja/passwordreset2_mail.txt new file mode 100644 index 0000000..a7a7717 --- /dev/null +++ b/resources/ja/passwordreset2_mail.txt @@ -0,0 +1,10 @@ +{userName}ã•ã‚“, + +ã‚ãªãŸã®æ–°ã—ã„パスワード: {password} + +ログインã—ã¦å¤‰æ›´ã—ã¾ã—ょã†ã€‚ + +ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ +The Community-ID Team + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/ja/passwordreset_mail.txt b/resources/ja/passwordreset_mail.txt new file mode 100644 index 0000000..7a987a1 --- /dev/null +++ b/resources/ja/passwordreset_mail.txt @@ -0,0 +1,15 @@ +{userName}ã•ã‚“, + +パスワードリセットã®è¦æ±‚ã¯ã€æ¬¡ã®IPアドレスã‹ã‚‰ãªã•ã‚Œã¾ã—ãŸ: {IP} + +リセットã™ã‚‹ã«ã¯ä»¥ä¸‹ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãã ã•ã„: + +{passwordResetURL} + +ã‚‚ã—ã“ã®ãƒªã‚»ãƒƒãƒˆã®è¦æ±‚ã‚’ã•ã‚Œã¦ã„ãªã„å ´åˆã«ã¯ã€ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚’無視ã—ã¦ãã ã•ã„。 + + +ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ +The Community-ID Team + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/ja/registration_mail.txt b/resources/ja/registration_mail.txt new file mode 100644 index 0000000..c37c1ea --- /dev/null +++ b/resources/ja/registration_mail.txt @@ -0,0 +1,12 @@ +{userName}ã•ã‚“, + +Community-IDã®openidサーãƒã«ç™»éŒ²ã„ãŸã ãã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ + +登録を終了ã™ã‚‹ã«ã¯ã€æ¬¡ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãã ã•ã„。 + +{registrationURL} + +ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ +The Community-ID Team + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/ja/reminder_mail.txt b/resources/ja/reminder_mail.txt new file mode 100644 index 0000000..d4741b5 --- /dev/null +++ b/resources/ja/reminder_mail.txt @@ -0,0 +1,14 @@ +{userName}ã•ã‚“, + +ã‚ãªãŸã®OpenIDã®ç™»éŒ²ã‚’ã¾ã ç¢ºèªã—ã¦ã„ãŸã ã„ã¦ãŠã‚Šã¾ã›ã‚“。 + +以下ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ç¢ºèªã‚’ã—ã¦ãã ã•ã„。確èªã„ãŸã ã‘ãªã„å ´åˆã¯æ•°æ—¥ã®ã†ã¡ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯å‰Šé™¤ã•ã‚Œã¾ã™ã€‚ + +{registrationURL} + + +ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚ +The Community-ID Team + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) + diff --git a/resources/nl/eula.txt b/resources/nl/eula.txt old mode 100755 new mode 100644 diff --git a/resources/nl/privacy.txt b/resources/nl/privacy.txt deleted file mode 100644 index 38e3387..0000000 --- a/resources/nl/privacy.txt +++ /dev/null @@ -1,15 +0,0 @@ -INTRODUCTION -Community-ID.org respects each individual's right to personal privacy. We will collect and use information through our Web site only in the ways disclosed in this statement. This statement applies solely to information collected at Community-ID.org's Web site. - -INFORMATION COLLECTION -Community-ID.org collects information through our Web site in order to provide users an efficient experience. We collect the personal information, including email addresses, of registered users. We also collect the IP address and use activity of visitors to our website, in order to diagnose and debug our systems and services. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site. - -Community-ID.org employs cookies. A cookie is a small text file that our Web server places on a user's computer hard drive to be a unique identifier. Cookies enable Community-ID.org to track usage patterns and deliver customized content to users. Our cookies have an expiration date, and do not collect personally identifiable information. - -INFORMATION USAGE -We will not rent or sell your personal information to third parties. We will share personal information only in the following cases: 1) Business Transfer: If Community-ID.org were acquired, personal information would be transferred forward in accordance with acquisition agreements. 2) Legal Compliance: If compelled by law to share information, Community-ID.org would be required to do so. - -Unless they opt in, Community-ID.org users will not receive announcements from us. We may provide users the ability to opt-in to communications from Community-ID.org, but we will never contact you unless you opt-in to these communications. - -INFORMATION STORAGE AND CONTROL -When a user deletes their account from Community-ID.org, all of their information is expunged from our systems. Of course, our backups may contain older copies of the information, but we expunge backups regularly. We believe that you control your information, and we absolutely respect that. diff --git a/resources/pl/eula.txt b/resources/pl/eula.txt old mode 100755 new mode 100644 diff --git a/resources/pl/privacy.txt b/resources/pl/privacy.txt deleted file mode 100644 index 38e3387..0000000 --- a/resources/pl/privacy.txt +++ /dev/null @@ -1,15 +0,0 @@ -INTRODUCTION -Community-ID.org respects each individual's right to personal privacy. We will collect and use information through our Web site only in the ways disclosed in this statement. This statement applies solely to information collected at Community-ID.org's Web site. - -INFORMATION COLLECTION -Community-ID.org collects information through our Web site in order to provide users an efficient experience. We collect the personal information, including email addresses, of registered users. We also collect the IP address and use activity of visitors to our website, in order to diagnose and debug our systems and services. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site. - -Community-ID.org employs cookies. A cookie is a small text file that our Web server places on a user's computer hard drive to be a unique identifier. Cookies enable Community-ID.org to track usage patterns and deliver customized content to users. Our cookies have an expiration date, and do not collect personally identifiable information. - -INFORMATION USAGE -We will not rent or sell your personal information to third parties. We will share personal information only in the following cases: 1) Business Transfer: If Community-ID.org were acquired, personal information would be transferred forward in accordance with acquisition agreements. 2) Legal Compliance: If compelled by law to share information, Community-ID.org would be required to do so. - -Unless they opt in, Community-ID.org users will not receive announcements from us. We may provide users the ability to opt-in to communications from Community-ID.org, but we will never contact you unless you opt-in to these communications. - -INFORMATION STORAGE AND CONTROL -When a user deletes their account from Community-ID.org, all of their information is expunged from our systems. Of course, our backups may contain older copies of the information, but we expunge backups regularly. We believe that you control your information, and we absolutely respect that. diff --git a/resources/sv/passwordreset2_mail.txt b/resources/sv/passwordreset2_mail.txt index 3c2e91c..df09fc0 100644 --- a/resources/sv/passwordreset2_mail.txt +++ b/resources/sv/passwordreset2_mail.txt @@ -7,3 +7,5 @@ Vi rekommenderar att du omedelbart loggar in och byter det. Vänliga hälsningar! Community-ID-teamet + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/sv/passwordreset_mail.txt b/resources/sv/passwordreset_mail.txt index 9130439..31d034b 100644 --- a/resources/sv/passwordreset_mail.txt +++ b/resources/sv/passwordreset_mail.txt @@ -11,3 +11,5 @@ Om du inte har begärt byte av lösenordet kan du bortse frÃ¥n detta meddelande. Vänliga hälsningar! Community-ID-teamet + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/sv/privacy.txt b/resources/sv/privacy.txt deleted file mode 100644 index 2ecfd47..0000000 --- a/resources/sv/privacy.txt +++ /dev/null @@ -1,15 +0,0 @@ -INTRODUKTION -Community-ID.org respekterar varje individs rätt till personlig integritet. Vi samlar och använder därför bara den information som anges i denna policy. Policyn gäller all information pÃ¥ Community-ID.org's webbplats. - -INFORMATIONSINSAMLING -Community-ID.org samlar information via webbplatsen för att kunna ge användarna en effektiv upplevelse. Vi samlar personlig information, inklusive e-postadresser, frÃ¥n registrerade användare. Vi samlar även in IP-addresser och hur besökarna använder vÃ¥r webbplats, för att kunna felsöka och förbättra vÃ¥rt system och vÃ¥ra tjänster. We may also collect ancillary usage information, including referrals, access times and platform type, which our users divulge through visiting the site. - -COOKIES -Community-ID.org använder cookies. En cookie är en liten textfile som vÃ¥r webbserver lägger i användarens dator för unik identifiering. Cookies gör det möjligt för Community-ID.org att spÃ¥ra användningsmönster och leverera anpassat innehÃ¥ll till användaren. VÃ¥ra cookies har ett bäst-före-datum och används inte för att samla personrelaterad information. -Vill du inte acceptera cookies kan din webbläsare ställas in sÃ¥ att du automatiskt nekar till lagring av cookies eller informeras varje gÃ¥ng en webbplats begär att fÃ¥ lagra en cookie. Genom webbläsaren kan ocksÃ¥ tidigare lagrade cookies raderas. Se webbläsarens hjälpsidor för mer information. - -INFORMATIONSANVÄNDNING -Vi kommer inte att hyra ut eller sälja din personliga information till tredje part. Vi kommer endast att dela med oss av personlig information i följande fall: 1) Affärstransaktioner: Om Community-ID.org blir uppköpt kommer den personliga informationen följa med om det framgÃ¥r i kontraktet. 2) Lagkrav: Om det enligt lag krävs att information ska lämnas ut, sÃ¥ kommer Community-ID.org att göra det. - -INFORMATIONSFÖRVARING OCH -KONTROLL -När en användare raderar sitt konto frÃ¥n Community-ID.org, kommer all deras information raderas fullständigt. Naturligtvis kan det finnas kvar äldre säkerhetskopior av informationen, men dessa raderas regelbundet. Vi anser att du ska kontrollera din egen information och respekterar det fullt ut. diff --git a/resources/sv/registration_mail.txt b/resources/sv/registration_mail.txt index 4e88eaa..35286e2 100644 --- a/resources/sv/registration_mail.txt +++ b/resources/sv/registration_mail.txt @@ -9,3 +9,5 @@ För att bekräfta registreringen, vänligen klicka pÃ¥ följande länk: Vänliga hälsningar! Community-ID-teamet + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/resources/sv/reminder_mail.txt b/resources/sv/reminder_mail.txt index 7a91b74..eb423db 100644 --- a/resources/sv/reminder_mail.txt +++ b/resources/sv/reminder_mail.txt @@ -9,3 +9,5 @@ Vänligen bekräfta din registrering via nedanstÃ¥ende länk, annars riskerar du Vänliga hälsningar! Community-ID-teamet + +Community-ID is a service from Keyboard Monkeys Ltd. (Community as a Service) diff --git a/scripts/clear_logs.php b/scripts/clear_logs.php deleted file mode 100644 index 8e525d1..0000000 --- a/scripts/clear_logs.php +++ /dev/null @@ -1,33 +0,0 @@ -clearOldEntries(); - -?> diff --git a/setup/final.sql b/setup/final.sql index f4fd057..d097ca6 100644 --- a/setup/final.sql +++ b/setup/final.sql @@ -5,8 +5,11 @@ CREATE TABLE `users` ( `openid` varchar(100) NOT NULL, `accepted_eula` tinyint(4) NOT NULL default '0', `registration_date` date NOT NULL, + `last_login` datetime NOT NULL, + `auth_type` tinyint(4) NOT NULL default '0', `password` char(40) NOT NULL, `password_changed` date NOT NULL, + `yubikey_publicid` varchar(50) NOT NULL, `firstname` varchar(50) NOT NULL, `lastname` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, @@ -23,7 +26,7 @@ CREATE TABLE `associations` ( `issued` int(11) NOT NULL, `lifetime` int(11) NOT NULL, `assoc_type` varchar(64) NOT NULL, - PRIMARY KEY (`server_url`(255),`handle`) + PRIMARY KEY (`handle`) ) ENGINE=MyISAM; CREATE TABLE `nonces` ( @@ -33,7 +36,7 @@ CREATE TABLE `nonces` ( UNIQUE KEY `server_url` (`server_url`(255),`timestamp`,`salt`) ) ENGINE=InnoDB; -CREATE TABLE IF NOT EXISTS `sites` ( +CREATE TABLE `sites` ( `id` int(11) NOT NULL auto_increment, `user_id` int(11) NOT NULL, `site` varchar(100) NOT NULL, @@ -71,15 +74,32 @@ CREATE TABLE `fields` ( ) ENGINE=InnoDB ; -CREATE TABLE `fields_values` ( +CREATE TABLE `profiles` ( + `id` int(11) NOT NULL auto_increment, `user_id` int(11) NOT NULL, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB; + +ALTER TABLE `profiles` + ADD CONSTRAINT `profiles_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; + + +CREATE TABLE `fields_values` ( + `id` int(11) NOT NULL auto_increment, + `user_id` int(11) NOT NULL, + `profile_id` int(11) NOT NULL, `field_id` int(11) NOT NULL, `value` text NOT NULL, - PRIMARY KEY (`user_id`,`field_id`), - KEY `field_id` (`field_id`) + PRIMARY KEY (`id`), + KEY `field_id` (`field_id`), + KEY `profile_id` (`profile_id`), + KEY `user_id` (`user_id`) ) ENGINE=InnoDB; ALTER TABLE `fields_values` + ADD CONSTRAINT `fields_values_ibfk_3` FOREIGN KEY (`profile_id`) REFERENCES `profiles` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `fields_values_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `fields_values_ibfk_2` FOREIGN KEY (`field_id`) REFERENCES `fields` (`id`) ON DELETE CASCADE; @@ -100,7 +120,7 @@ CREATE TABLE `settings` ( ) ENGINE = MYISAM ; INSERT INTO `settings` (`name`, `value`) VALUES ('maintenance_mode', '0'); -INSERT INTO `settings` (`name`, `value`) VALUES ('version', '1.1.0.RC2'); +INSERT INTO `settings` (`name`, `value`) VALUES ('version', '2.0.0.RC3'); CREATE TABLE `news` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , @@ -119,3 +139,16 @@ CREATE TABLE `auth_attempts` ( `last_attempt` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; + +CREATE TABLE `users_images` ( + `id` int(11) NOT NULL auto_increment, + `user_id` int(11) NOT NULL, + `image` mediumblob NOT NULL, + `mime` varchar(15) NOT NULL, + `cookie` char(32) NOT NULL, + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB; + +ALTER TABLE `users_images` + ADD CONSTRAINT `users_images_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; diff --git a/setup/upgrade_1.1.0.sql b/setup/upgrade_1.1.0.sql new file mode 100644 index 0000000..3b87f1c --- /dev/null +++ b/setup/upgrade_1.1.0.sql @@ -0,0 +1,5 @@ +ALTER TABLE `associations` DROP PRIMARY KEY; + +ALTER TABLE `associations` ADD PRIMARY KEY ( `handle` ); + +REPLACE INTO `settings` (`name`, `value`) VALUES ('version', '1.1.0'); diff --git a/setup/upgrade_1.1.1.sql b/setup/upgrade_1.1.1.sql new file mode 100644 index 0000000..706c149 --- /dev/null +++ b/setup/upgrade_1.1.1.sql @@ -0,0 +1 @@ +REPLACE INTO `settings` (`name`, `value`) VALUES ('version', '1.1.1'); diff --git a/setup/upgrade_1.2.0.RC1.sql b/setup/upgrade_1.2.0.RC1.sql new file mode 100644 index 0000000..0bf681d --- /dev/null +++ b/setup/upgrade_1.2.0.RC1.sql @@ -0,0 +1 @@ +REPLACE INTO `settings` (`name`, `value`) VALUES ('version', '1.2.0.RC1'); diff --git a/setup/upgrade_1.2.0.RC2.sql b/setup/upgrade_1.2.0.RC2.sql new file mode 100644 index 0000000..190bb0c --- /dev/null +++ b/setup/upgrade_1.2.0.RC2.sql @@ -0,0 +1 @@ +REPLACE INTO `settings` (`name`, `value`) VALUES ('version', '1.2.0.RC2'); diff --git a/setup/upgrade_1.2.1.sql b/setup/upgrade_1.2.1.sql new file mode 100644 index 0000000..91ef36c --- /dev/null +++ b/setup/upgrade_1.2.1.sql @@ -0,0 +1,2 @@ +REPLACE INTO `settings` (`name`, `value`) VALUES ('version', '1.2.1'); + diff --git a/setup/upgrade_2.0.0.RC3.sql b/setup/upgrade_2.0.0.RC3.sql new file mode 100644 index 0000000..1793d8c --- /dev/null +++ b/setup/upgrade_2.0.0.RC3.sql @@ -0,0 +1,2 @@ +REPLACE INTO `settings` (`name`, `value`) VALUES ('version', '2.0.0.RC3'); + diff --git a/setup/upgrade_2.0.0.beta1.php b/setup/upgrade_2.0.0.beta1.php new file mode 100644 index 0000000..51880d3 --- /dev/null +++ b/setup/upgrade_2.0.0.beta1.php @@ -0,0 +1,32 @@ +getUsers() as $user) { + $profileId = $user->createDefaultProfile($this->_view); + foreach ($fieldsValues->getForUser($user) as $fieldValue) { + $fieldValue->profile_id = $profileId; + $fieldValue->save(); + } + } + + $this->_db->query('ALTER TABLE `fields_values` ADD FOREIGN KEY ( `profile_id` ) REFERENCES `profiles` (`id`) ON DELETE CASCADE'); + } +} diff --git a/setup/upgrade_2.0.0.beta1.sql b/setup/upgrade_2.0.0.beta1.sql new file mode 100644 index 0000000..70cb450 --- /dev/null +++ b/setup/upgrade_2.0.0.beta1.sql @@ -0,0 +1,38 @@ +REPLACE INTO `settings` (`name`, `value`) VALUES ('version', '2.0.0.beta1'); + +CREATE TABLE `users_images` ( + `id` int(11) NOT NULL auto_increment, + `user_id` int(11) NOT NULL, + `image` mediumblob NOT NULL, + `mime` varchar(15) NOT NULL, + `cookie` char(32) NOT NULL, + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB; + +ALTER TABLE `users_images` + ADD CONSTRAINT `users_images_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; + +CREATE TABLE `profiles` ( + `id` int(11) NOT NULL auto_increment, + `user_id` int(11) NOT NULL, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB; + +ALTER TABLE `profiles` ADD CONSTRAINT `profiles_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; + +ALTER TABLE `fields_values` ADD `profile_id` INT NOT NULL AFTER `user_id`; +ALTER TABLE `fields_values`ADD INDEX ( `profile_id` ); + +ALTER TABLE `fields_values` DROP FOREIGN KEY `fields_values_ibfk_1` ; +ALTER TABLE `fields_values` DROP PRIMARY KEY; +ALTER TABLE `fields_values` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ; +ALTER TABLE `fields_values` ADD INDEX ( `user_id` ); +ALTER TABLE `fields_values` ADD FOREIGN KEY ( `user_id` ) REFERENCES `users` (`id`) ON DELETE CASCADE ; + +ALTER TABLE `users` ADD `last_login` DATETIME NOT NULL AFTER `registration_date`; + +ALTER TABLE `users` ADD `auth_type` TINYINT NOT NULL DEFAULT '0' AFTER `last_login`; +ALTER TABLE `users` ADD `yubikey_publicid` VARCHAR( 50 ) NOT NULL AFTER `password_changed`; diff --git a/setup/upgrade_2.0.0.beta2.sql b/setup/upgrade_2.0.0.beta2.sql new file mode 100644 index 0000000..ff5dda6 --- /dev/null +++ b/setup/upgrade_2.0.0.beta2.sql @@ -0,0 +1,2 @@ +REPLACE INTO `settings` (`name`, `value`) VALUES ('version', '2.0.0.beta2'); + diff --git a/setup/versions.php b/setup/versions.php index e655d8e..427b75c 100644 --- a/setup/versions.php +++ b/setup/versions.php @@ -5,4 +5,12 @@ $versions = array( '1.1.0.beta1', '1.1.0.RC1', '1.1.0.RC2', + '1.1.0', + '1.1.1', + '1.2.0.RC1', + '1.2.0.RC2', + '1.2.1', + '2.0.0.beta1', + '2.0.0.beta2', + '2.0.0.RC3', ); diff --git a/webdir/styles/style.css b/styles/style.css similarity index 98% rename from webdir/styles/style.css rename to styles/style.css index 7ae94ef..7e548ea 100644 --- a/webdir/styles/style.css +++ b/styles/style.css @@ -422,6 +422,11 @@ strong { font-size : 116%; } +.yubiKeyInput { + background: url(../images/yubiright_16x16.gif) no-repeat scroll 2px 5px; + padding-left: 20px; +} + /* -------- YUI RTE ---------- */ diff --git a/tests/AllTests.php b/tests/AllTests.php deleted file mode 100644 index b1267d8..0000000 --- a/tests/AllTests.php +++ /dev/null @@ -1,42 +0,0 @@ -setName('Community-ID'); - - // gotta test one by one, or else I'll get random segfaults - // I got tired of figuring out where those come from. PHP sucks. - //$suite->addTestSuite('UsersTests'); - //$suite->addTestSuite('Users_RegisterControllerTests'); - //$suite->addTestSuite('Users_ProfilegeneralControllerTests'); - //$suite->addTestSuite('MessageusersControllerTests'); - //$suite->addTestSuite('HistoryControllerTests'); - //$suite->addTestSuite('OpenidControllerTests'); - //$suite->addTestSuite('IdentityControllerTests'); - //$suite->addTestSuite('FeedbackControllerTests'); - return $suite; - } -} diff --git a/tests/CaptchaImageTestSessionContainer.php b/tests/CaptchaImageTestSessionContainer.php deleted file mode 100644 index ebcc3e1..0000000 --- a/tests/CaptchaImageTestSessionContainer.php +++ /dev/null @@ -1,56 +0,0 @@ -$name = $value; - } - } - - public function __isset($name) - { - if (('word' == $name) && (null !== self::$word)) { - return true; - } - - return false; - } - - public function __call($method, $args) - { - switch ($method) { - case 'setExpirationHops': - case 'setExpirationSeconds': - $this->$method = array_shift($args); - break; - default: - } - } -} diff --git a/tests/TestHarness.php b/tests/TestHarness.php deleted file mode 100644 index ed336b7..0000000 --- a/tests/TestHarness.php +++ /dev/null @@ -1,57 +0,0 @@ -environment->production = false; - Application::setErrorReporting(); - - Zend_Registry::get('config')->logging->level = Zend_Log::DEBUG; - Application::setLogger(true); - - Application::logRequest(); - Application::setDatabase(); - Application::setSession(); - Application::setAcl(); - Application::setI18N(); - Application::setLayout(); - Application::setFrontController(); - Application::$front->throwExceptions(true); - - // disable e-mailing - require_once 'tests/Zend_Mail_Transport_Mock.php'; - Zend_Registry::get('config')->email->transport = 'mock'; - } -} - -TestHarness::Setup(); diff --git a/tests/TestRequest.php b/tests/TestRequest.php deleted file mode 100644 index 07ec4e2..0000000 --- a/tests/TestRequest.php +++ /dev/null @@ -1,21 +0,0 @@ -setBaseUrl('/communityid'); - } -} diff --git a/tests/Zend_Mail_Transport_Mock.php b/tests/Zend_Mail_Transport_Mock.php deleted file mode 100755 index 7b96897..0000000 --- a/tests/Zend_Mail_Transport_Mock.php +++ /dev/null @@ -1,34 +0,0 @@ -mail = $this->_mail; - $this->subject = $this->_mail->getSubject(); - $this->from = $this->_mail->getFrom(); - $this->returnPath = $this->_mail->getReturnPath(); - $this->headers = $this->_headers; - $this->called = true; - } -} diff --git a/tests/modules/default/controllers/FeedbackControllerTests.php b/tests/modules/default/controllers/FeedbackControllerTests.php deleted file mode 100644 index ac32817..0000000 --- a/tests/modules/default/controllers/FeedbackControllerTests.php +++ /dev/null @@ -1,146 +0,0 @@ -returnResponse(true); - $this->_response = new Zend_Controller_Response_Http(); - Application::$front->setResponse($this->_response); - } - - public function testIndexAction() - { - Application::$front->setRequest(new TestRequest('/feedback')); - Application::dispatch(); - - $this->assertContains('
    _response->getBody()); - } - - /** - * @dataProvider provideBadFormInput - */ - public function testSendWithEmptyFieldsAction($name, $email, $feedback) - { - $_POST = array( - 'name' => $name, - 'email' => $email, - 'feedback' => $feedback, - ); - - Application::$front->setRequest(new TestRequest('/feedback/send')); - Application::dispatch(); - - $this->assertContains('Value is required and can\'t be empty', $this->_response->getBody()); - } - - public function testSendWithBadEmailAction() - { - $_POST = array( - 'name' => 'john doe', - 'email' => 'john.doe.mailinator.com', - 'feedback' => 'whateva', - ); - - Application::$front->setRequest(new TestRequest('/feedback/send')); - Application::dispatch(); - - $this->assertContains('is not a valid email address', $this->_response->getBody()); - } - - public function testSendWithBadCaptchaAction() - { - $_POST = array( - 'name' => 'john doe', - 'email' => 'john.doe@mailinator.com', - 'feedback' => 'whateva', - 'captcha' => 'whatever', - ); - - Application::$front->setRequest(new TestRequest('/feedback/send')); - Application::dispatch(); - - $this->assertContains('Captcha value is wrong', $this->_response->getBody()); - } - - public function testSuccessSendAction() - { - // I gotta render the form first to generate the captcha - $sessionStub = new CaptchaImageTestSessionContainer(); - Zend_Registry::set('appSession', $sessionStub); - Application::$front->setRequest(new TestRequest('/feedback/send')); - Application::dispatch(); - $this->assertEquals(preg_match('/name="captcha\[id\]" value="([0-9a-f]+)"/', $this->_response->__toString(), $matches), 1); - - $email = 'john_' . rand(0, 1000) . '@mailinator.com'; - $_POST = array( - 'name' => 'john', - 'email' => $email, - 'feedback' => 'whateva', - 'captcha' => array( - 'input' => CaptchaImageTestSessionContainer::$word, - 'id' => $matches[1], - ) - ); - - Application::$front->setRequest(new TestRequest('/feedback/send')); - - Application::$mockLogger->events = array(); - try { - Application::dispatch(); - } catch (Zend_Controller_Response_Exception $e) { - // I still don't know how to avoid the "headers already sent" problem here... - } - $lastLog = array_pop(Application::$mockLogger->events); - $this->assertEquals("redirected to ''", $lastLog['message']); - } - - public function testGetMail() - { - require_once APP_DIR . '/modules/default/controllers/FeedbackController.php'; - $mail = FeedbackController::getMail('John Black', 'john@mailinator.com', 'whateva'); - $this->assertType('Zend_Mail', $mail); - $mailBody = $mail->getBodyText(true); - $mailBody = str_replace("=\n", '', $mailBody); // remove line splitters - $this->assertContains('Dear Administrator', $mailBody); - $this->assertContains('John Black', $mailBody); - $this->assertContains('john@mailinator.com', $mailBody); - $this->assertContains('whateva', $mailBody); - } - - public function provideBadFormInput() - { - return array( - array( - 'name' => '', - 'email' => 'john@mailinator.com', - 'feedback' => 'whateva', - ), - array( - 'name' => 'john doe', - 'email' => '', - 'feedback' => 'whateva', - ), - array( - 'name' => 'john doe', - 'email' => 'john@mailinator.com', - 'feedback' => '', - ), - ); - } -} diff --git a/tests/modules/default/controllers/HistoryControllerTests.php b/tests/modules/default/controllers/HistoryControllerTests.php deleted file mode 100755 index cfb8c72..0000000 --- a/tests/modules/default/controllers/HistoryControllerTests.php +++ /dev/null @@ -1,91 +0,0 @@ -returnResponse(true); - $this->_response = new Zend_Controller_Response_Http(); - Application::$front->setResponse($this->_response); - - $users = new Users_Model_Users(); - $user = $users->createRow(); - $user->id = 23; - $user->role = Users_Model_User::ROLE_REGISTERED; - $user->username = 'testuser'; - Zend_Registry::set('user', $user); - } - - public function testIndexGuestUserAction() - { - Zend_Registry::get('user')->role = Users_Model_User::ROLE_GUEST; - - Application::$front->setRequest(new TestRequest('/history')); - try { - Application::dispatch(); - } catch (Monkeys_AccessDeniedException $e) { - $this->assertTrue(true); - return; - } - - $this->fail('Expected Monkeys_AccessDeniedException was not raised'); - } - - public function testIndexAction() - { - Application::$front->setRequest(new TestRequest('/history')); - Application::dispatch(); - - $this->assertContains('COMMID.history', $this->_response->getBody()); - } - - public function testListAction() - { - $request = new TestRequest('/history/list?startIndex=0&results=15'); - $request->setHeader('X_REQUESTED_WITH', 'XMLHttpRequest'); - Application::$front->setRequest($request); - Application::dispatch(); - - $this->assertRegExp( - '#\{("__className":"stdClass",)?"recordsReturned":\d+,"totalRecords":\d+,"startIndex":"\d+",("sort":null,)?"dir":"asc","records":\[.*\]\}#', - $this->_response->getBody() - ); - } - - /** - * Weak test, till I set up a mock db obj to avoid touching the db - */ - public function testClearAction() - { - $request = new TestRequest('/history/clear'); - $request->setHeader('X_REQUESTED_WITH', 'XMLHttpRequest'); - Application::$front->setRequest($request); - Application::dispatch(); - - $this->assertRegExp( - '{"code":200}', - $this->_response->getBody() - ); - } - - public function tearDown() - { - // I know this is done again in setUp(), but if I don't do it here too, - // hell breaks appart - Application::cleanUp(); - } -} diff --git a/tests/modules/default/controllers/IdentityControllerTests.php b/tests/modules/default/controllers/IdentityControllerTests.php deleted file mode 100755 index d6ce1f9..0000000 --- a/tests/modules/default/controllers/IdentityControllerTests.php +++ /dev/null @@ -1,54 +0,0 @@ -returnResponse(true); - $this->_response = new Zend_Controller_Response_Http(); - Application::$front->setResponse($this->_response); - - // guest user - $users = new Users_Model_Users(); - $user = $users->createRow(); - Zend_Registry::set('user', $user); - } - - public function testIndexNoIdentityAction() - { - Application::$front->setRequest(new TestRequest('/identity')); - try { - Application::dispatch(); - } catch (Monkeys_BadUrlException $e) { - $this->assertTrue(true); - return; - } - - $this->fail('Expected Monkeys_BadUrlException was not raised'); - } - - public function testIdAction() - { - Application::$front->setRequest(new TestRequest('/identity/whateva')); - $_SERVER['SCRIPT_URI'] = 'http://localhost/communityid/identity/whateva'; - Application::dispatch(); - $this->assertContains('', - $this->_response->getBody()); - $this->assertContains('

    http://localhost/communityid/identity/whateva

    ', - $this->_response->getBody()); - } -} diff --git a/tests/modules/default/controllers/MessageusersControllerTests.php b/tests/modules/default/controllers/MessageusersControllerTests.php deleted file mode 100644 index 2637fe3..0000000 --- a/tests/modules/default/controllers/MessageusersControllerTests.php +++ /dev/null @@ -1,156 +0,0 @@ -returnResponse(true); - $this->_response = new Zend_Controller_Response_Http(); - Application::$front->setResponse($this->_response); - - $users = new Users_Model_Users(); - $this->_user = $users->createRow(); - $this->_user->id = 23; - $this->_user->role = Users_Model_User::ROLE_ADMIN; - $this->_user->username = 'testadmin'; - Zend_Registry::set('user', $this->_user); - - } - - public function testIndexGuestUserAction() - { - $this->_user->role = Users_Model_User::ROLE_GUEST; - - Application::$front->setRequest(new TestRequest('/messageusers')); - try { - Application::dispatch(); - } catch (Monkeys_AccessDeniedException $e) { - $this->assertTrue(true); - return; - } - - $this->fail('Expected Monkeys_AccessDeniedException was not raised'); - } - - public function testIndexRegisteredUserAction() - { - $this->_user->role = Users_Model_User::ROLE_REGISTERED; - - Application::$front->setRequest(new TestRequest('/messageusers')); - try { - Application::dispatch(); - } catch (Monkeys_AccessDeniedException $e) { - $this->assertTrue(true); - return; - } - - $this->fail('Expected Monkeys_AccessDeniedException was not raised'); - } - - public function testIndexAction() - { - Application::$front->setRequest(new TestRequest('/messageusers')); - Application::dispatch(); - - $this->assertContains('
    ', $this->_response->getBody()); - } - - public function testSaveActionWithEmptySubject() - { - $_POST = array( - 'messageType' => 'rich', - 'subject' => '', - 'cc' => '', - 'bodyPlain' => '', - 'bodyHTML' => 'Hello world', - ); - - Application::$front->setRequest(new TestRequest('/messageusers/send')); - Application::dispatch(); - - $this->assertContains('Value is required and can\'t be empty', $this->_response->getBody()); - } - - public function testSaveActionWithBadCC() - { - $_POST = array( - 'messageType' => 'rich', - 'subject' => 'whateva', - 'cc' => 'asdfdf', - 'bodyPlain' => '', - 'bodyHTML' => 'Hello world', - ); - - Application::$front->setRequest(new TestRequest('/messageusers/send')); - Application::dispatch(); - - $this->assertContains('CC field must be a comma-separated list of valid E-mails', $this->_response->getBody()); - } - - public function testSaveGuestUser() - { - $this->_user->role = Users_Model_User::ROLE_GUEST; - - Application::$front->setRequest(new TestRequest('/messageusers/send')); - try { - Application::dispatch(); - } catch (Monkeys_AccessDeniedException $e) { - $this->assertTrue(true); - return; - } - - $this->fail('Expected Monkeys_AccessDeniedException was not raised'); - } - - public function testSaveRegisteredUser() - { - $this->_user->role = Users_Model_User::ROLE_REGISTERED; - - Application::$front->setRequest(new TestRequest('/messageusers/send')); - try { - Application::dispatch(); - } catch (Monkeys_AccessDeniedException $e) { - $this->assertTrue(true); - return; - } - - $this->fail('Expected Monkeys_AccessDeniedException was not raised'); - } - - public function testSaveSuccessfull() - { - $_POST = array( - 'messageType' => 'rich', - 'subject' => 'whateva', - 'cc' => 'one@mailinator.com, two@mailinator.com', - 'bodyPlain' => '', - 'bodyHTML' => 'Hello world', - ); - - Application::$front->setRequest(new TestRequest('/messageusers/send')); - Application::$mockLogger->events = array(); - try { - Application::dispatch(); - } catch (Zend_Controller_Response_Exception $e) { - // I still don't know how to avoid the "headers already sent" problem here... - } - - $lastLog = array_pop(Application::$mockLogger->events); - $this->assertEquals("redirected to ''", $lastLog['message']); - } -} diff --git a/tests/modules/default/controllers/OpenidControllerTests.php b/tests/modules/default/controllers/OpenidControllerTests.php deleted file mode 100755 index 3f4cae4..0000000 --- a/tests/modules/default/controllers/OpenidControllerTests.php +++ /dev/null @@ -1,356 +0,0 @@ -_tempDir = APP_DIR . '/tests/temp'; - } - - public function setUp() - { - TestHarness::setUp(); - - Application::$front->returnResponse(true); - $this->_response = new Zend_Controller_Response_Http(); - $this->_response->headersSentThrowsException = false; - Application::$front->setResponse($this->_response); - - $users = new Users_Model_Users(); - - $users->deleteTestEntries(); - - $this->_user = $users->createRow(); - $this->_user->test = 1; - $this->_user->username = 'testuser'; - $this->_user->role = Users_Model_User::ROLE_REGISTERED; - $this->_user->openid = 'http://localhost/communityid/identity/'.$this->_user->username; - $this->_user->setClearPassword(self::USER_PASSWORD); - $this->_user->accepted_eula = 1; - $this->_user->firstname = 'firstnametest'; - $this->_user->lastname = 'lastnametest'; - $this->_user->email = 'usertest@mailinator.com'; - $this->_user->token = ''; - $this->_user->save(); - Zend_Registry::set('user', $this->_user); - - // php-openid lib sucks - $GLOBALS['Auth_OpenID_registered_aliases'] = array(); - $GLOBALS['_Auth_OpenID_Request_Modes'] = array('checkid_setup', 'checkid_immediate'); - $GLOBALS['Auth_OpenID_sreg_data_fields'] = array( - 'fullname' => 'Full Name', - 'nickname' => 'Nickname', - 'dob' => 'Date of Birth', - 'email' => 'E-mail Address', - 'gender' => 'Gender', - 'postcode' => 'Postal Code', - 'country' => 'Country', - 'language' => 'Language', - 'timezone' => 'Time Zone'); - } - - public function testIndexAction() - { - Application::$front->setRequest(new TestRequest('/openid')); - try { - Application::dispatch(); - } catch (Monkeys_BadUrlException $e) { - $this->assertTrue(true); - return; - } - - $this->fail('Expected Monkeys_BadUrlException was not raised'); - } - - public function testProviderAssociateAction() - { - $_GET = array( - 'openid.ns' => 'http://specs.openid.net/auth/2.0', - 'openid.mode' => 'associate', - 'openid.assoc_type' => 'HMAC-SHA256', - 'openid.session_type' => 'DH-SHA256', - 'openid.dh_modulus' => 'ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX+YkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi/368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI+XUkKJX8Fvf8W8vsixYOr', - 'openid.dh_gen' => 'Ag==', - 'openid.dh_consumer_public' => 'MFzHUMsSa4YSQ3JrcPSqyUaTQ3Z+QWKH6knvrREW7b6zQ2qMdOrpckgnUgo0pILMQpls8Ty/3JDv+IO29qASk2PwwZwxC2kXK/MQC/om5gs/IpjPSw1wK4bz2QTUHTRSxmtTxiq0tHYmIIqadz4TTMfXohMU2VCuYBqDNMHZFpk=', - ); - - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_SERVER['QUERY_STRING'] = http_build_query($_GET); - - Application::$front->setRequest(new TestRequest('/openid/provider')); - Application::dispatch(); - - $this->assertEquals( - preg_match( - "% - assoc_handle:(\{HMAC-SHA256\}\{[a-f0-9]+\}\{.*==\})\\x0A - assoc_type:HMAC-SHA256\\x0A - dh_server_public:.*\\x0A - enc_mac_key:.*\\x0A - expires_in:\d+\\x0A - ns:http://specs\.openid\.net/auth/2\.0\\x0A - session_type:DH-SHA256\\x0A - %x", - $this->_response->getBody(), - $matches - ), - 1 - ); - self::$assocHandle = urlencode($matches[1]); - } - - public function testProviderCheckidSetupAction() - { - Zend_Auth::getInstance()->clearIdentity(); - Zend_Registry::getInstance()->offsetUnset('user'); - - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_SERVER['QUERY_STRING'] = 'openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=checkid_setup&openid.identity=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser&openid.claimed_id=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser&openid.assoc_handle='.self::$assocHandle.'&openid.return_to=http%3A%2F%2Fwww.example.com&openid.realm=http%3A%2F%2Fwww.example.com'; - - Zend_OpenId::$exitOnRedirect = false; - - Application::$front->setRequest(new TestRequest('/openid/provider?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains('
    ', $this->_response->getBody()); - } - - public function testLoginAction() - { - Zend_Auth::getInstance()->clearIdentity(); - Zend_Registry::getInstance()->offsetUnset('user'); - - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - - Application::$front->setRequest(new TestRequest('/openid/login?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains('', $this->_response->getBody()); - } - - public function testAuthenticateEmptyUsernameAction() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - - $_POST = array( - 'openIdIdentity' => '', - 'password' => self::USER_PASSWORD, - ); - - Application::$front->setRequest(new TestRequest('/openid/authenticate?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains('Login', $this->_response->getBody()); - } - - public function testAuthenticateBadUsernameAction() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - - $_POST = array( - 'openIdIdentity' => 'whateva', - 'password' => 'whatevaagain', - ); - - Application::$front->setRequest(new TestRequest('/openid/authenticate?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains('Login', $this->_response->getBody()); - } - - public function testAuthenticateBadPasswordAction() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - - $_POST = array( - 'openIdIdentity' => $this->_user->openid, - 'password' => 'badpassword', - ); - - Application::$front->setRequest(new TestRequest('/openid/authenticate?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains('Login', $this->_response->getBody()); - } - - public function testAuthenticateSuccessfulAction() - { - Zend_Auth::getInstance()->clearIdentity(); - Zend_Registry::getInstance()->offsetUnset('user'); - - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - - $_POST = array( - 'openIdIdentity' => $this->_user->openid, - 'password' => self::USER_PASSWORD, - ); - - Application::$front->setRequest(new TestRequest('/openid/authenticate?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains( - 'A site identifying as http://www.example.com has asked for confirmation that '.$this->_user->openid.' is your identity URL.', - $this->_response->getBody() - ); - } - - public function testTrustAction1() - { - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - - Application::$front->setRequest(new TestRequest('/openid/provider?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains( - 'A site identifying as http://www.example.com has asked for confirmation that '.$this->_user->openid.' is your identity URL.', - $this->_response->getBody() - ); - } - - public function testTrustAction2() - { - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - - Application::$front->setRequest(new TestRequest('/openid/trust?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains( - 'A site identifying as http://www.example.com has asked for confirmation that '.$this->_user->openid.' is your identity URL.', - $this->_response->getBody() - ); - } - - public function testTrustWithSreg() - { - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - $_SERVER['QUERY_STRING'] .= '&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1&openid.sreg.optional=nickname%2Cmobilenum'; - - Application::$front->setRequest(new TestRequest('/openid/trust?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $this->assertContains('_response->getBody()); - } - - public function testProceedAction() - { - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_SERVER['QUERY_STRING'] = sprintf(self::CHECKID_QUERY, self::$assocHandle); - - // required for logging - $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; - - $_POST = array( - 'action' => 'proceed', - 'allow' => 'Allow', - ); - Application::$front->setRequest(new TestRequest('/openid/proceed?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $responseHeaders = $this->_response->getHeaders(); - - $this->assertEquals( - preg_match( - '# - http://www.example.com\? - openid.assoc_handle='.self::$assocHandle.' - &openid.claimed_id=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser - &openid.identity=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser - &openid.mode=id_res - &openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 - &openid.op_endpoint=http%3A%2F%2F.* - &openid.response_nonce='.gmdate('Y-m-d\T').'.* - &openid.return_to=http%3A%2F%2Fwww.example.com - &openid.sig=.* - &openid.signed=assoc_handle%2Cclaimed_id%2Cidentity%2Cmode%2Cns%2Cop_endpoint%2Cresponse_nonce%2Creturn_to%2Csigned - #x', - $responseHeaders[0]['value'] - ), - 1 - ); - } - - public function testProceedWithSreg() - { - $_POST = array( - 'openid_sreg_nickname' => 'nicktest', - 'openid_sreg_email' => 'test_x@mailinator.com', - 'openid_sreg_fullname' => 'Michael Jordan', - 'action' => 'proceed', - 'allow' => 'Allow', - ); - - $queryString = self::CHECKID_QUERY . "&openid.ns.sreg=http%%3A%%2F%%2Fopenid.net%%2Fextensions%%2Fsreg%%2F1.1&openid.sreg.required=nickname&openid.sreg.optional=email%%2Cfullname"; - - $_SERVER["REQUEST_METHOD"] = 'POST'; - $_SERVER['QUERY_STRING'] = sprintf($queryString, self::$assocHandle); - - // required for logging - $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; - - Application::$front->setRequest(new TestRequest('/openid/proceed?' . $_SERVER['QUERY_STRING'])); - Application::dispatch(); - - $responseHeaders = $this->_response->getHeaders(); - - $this->assertEquals( - preg_match( - '# - http://www.example.com\? - openid.assoc_handle='.self::$assocHandle.' - &openid.claimed_id=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser - &openid.identity=http%3A%2F%2Flocalhost%2Fcommunityid%2Fidentity%2Ftestuser - &openid.mode=id_res - &openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0 - &openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1 - &openid.op_endpoint=http%3A%2F%2F.* - &openid.response_nonce='.gmdate('Y-m-d\T').'.* - &openid.return_to=http%3A%2F%2Fwww.example.com - &openid.sig=.* - &openid.signed=assoc_handle%2Cclaimed_id%2Cidentity%2Cmode%2Cns%2Cns.sreg%2Cop_endpoint%2Cresponse_nonce%2Creturn_to%2Csigned%2Csreg.email%2Csreg.fullname%2Csreg.nickname - - &openid.sreg.email=test_x%40mailinator.com - &openid.sreg.fullname=Michael\+Jordan - &openid.sreg.nickname=nicktest - #x', - $responseHeaders[0]['value'] - ), - 1 - ); - } - - public function tearDown() - { - $users = new Users_Model_Users(); - $this->_user->delete(); - } -} diff --git a/tests/modules/users/controllers/ProfilegeneralControllerTests.php b/tests/modules/users/controllers/ProfilegeneralControllerTests.php deleted file mode 100644 index 9874eac..0000000 --- a/tests/modules/users/controllers/ProfilegeneralControllerTests.php +++ /dev/null @@ -1,52 +0,0 @@ -returnResponse(true); - $this->_response = new Zend_Controller_Response_Http(); - Application::$front->setResponse($this->_response); - } - - public function testChangepasswordAction() - { - $users = new Users_Model_Users(); - $user = $users->createRow(); - $user->id = 23; - $user->role = Users_Model_User::ROLE_REGISTERED; - Zend_Registry::set('user', $user); - - $targetUser = $users->createRow(); - $targetUser->id = 24; - Zend_Registry::set('targetUser', $targetUser); - - Application::$front->setRequest(new TestRequest('/users/profilegeneral/changepassword')); - try { - Application::dispatch(); - $this->fail(); - } catch (Exception $e) { - $this->assertType('Monkeys_AccessDeniedException', $e); - } - - $targetUser = clone $user; - Zend_Registry::set('targetUser', $targetUser); - Application::dispatch(); - $this->assertContains('_response->getBody()); - } -} diff --git a/tests/modules/users/controllers/RegisterControllerTests.php b/tests/modules/users/controllers/RegisterControllerTests.php deleted file mode 100644 index 7ba039f..0000000 --- a/tests/modules/users/controllers/RegisterControllerTests.php +++ /dev/null @@ -1,324 +0,0 @@ -returnResponse(true); - $this->_response = new Zend_Controller_Response_Http(); - $this->_response->headersSentThrowsException = false; - Application::$front->setResponse($this->_response); - - // this is to be able to catch the redirection headers and avoid the - // "headers already sent" error - $redirectorHelper = new Zend_Controller_Action_Helper_Redirector(); - $redirectorHelper->setExit(false); - Zend_Controller_Action_HelperBroker::addHelper($redirectorHelper); - } - - public function testIndexAction() - { - Application::$front->setRequest(new TestRequest('/users/register')); - Application::dispatch(); - - $this->assertContains('
    ', $this->_response->getBody()); - } - - /** - * @dataProvider provideBadRegistrationInput - */ - public function testSaveActionWithSomeEmptyFields( - $firstname, $lastname, $email, $username, $password1, $password2 - ) - { - $_POST = array( - 'firstname' => $firstname, - 'lastname' => $lastname, - 'email' => $email, - 'username' => $username, - 'password1' => $password1, - 'password2' => $password2, - ); - - Application::$front->setRequest(new TestRequest('/users/register/save')); - Application::dispatch(); - - $this->assertContains('Value is required and can\'t be empty', $this->_response->getBody()); - } - - public function testSaveActionWithBadEmail() - { - $_POST = array( - 'firstname' => 'john', - 'lastname' => 'smith', - 'email' => 'john.mailinator.com', - 'username' => 'johns34', - 'password1' => 'johns', - 'password2' => 'johns', - ); - - Application::$front->setRequest(new TestRequest('/users/register/save')); - Application::dispatch(); - - $this->assertContains('is not a valid email address', $this->_response->getBody()); - } - - public function testSaveActionWithUnmatchedPasswords() - { - $_POST = array( - 'firstname' => 'john', - 'lastname' => 'smith', - 'email' => 'john@mailinator.com', - 'username' => 'johns34', - 'password1' => 'johnsa', - 'password2' => 'johns', - ); - - Application::$front->setRequest(new TestRequest('/users/register/save')); - Application::dispatch(); - - $this->assertContains('Password confirmation does not match', $this->_response->getBody()); - } - - public function testSaveActionWithBadCaptcha() - { - $_POST = array( - 'firstname' => 'john', - 'lastname' => 'smith', - 'email' => 'john@mailinator.com', - 'username' => 'johns34', - 'password1' => 'johns', - 'password2' => 'johns', - 'captcha' => 'whatever', - ); - - Application::$front->setRequest(new TestRequest('/users/register/save')); - Application::dispatch(); - - $this->assertContains('Captcha value is wrong', $this->_response->getBody()); - } - - public function testSuccessfullSaveAction() - { - // I gotta render the form first to generate the captcha - $sessionStub = new CaptchaImageTestSessionContainer(); - Zend_Registry::set('appSession', $sessionStub); - Application::$front->setRequest(new TestRequest('/users/register')); - Application::dispatch(); - $this->assertEquals(preg_match('/name="captcha\[id\]" value="([0-9a-f]+)"/', $this->_response->__toString(), $matches), 1); - - $email = 'john_' . rand(0, 1000) . '@mailinator.com'; - $_POST = array( - 'firstname' => 'john', - 'lastname' => 'smith', - 'email' => $email, - 'username' => 'johns34', - 'password1' => 'johns', - 'password2' => 'johns', - 'captcha' => array( - 'input' => CaptchaImageTestSessionContainer::$word, - 'id' => $matches[1], - ) - ); - - // this is used to build the users's openid URL - $_SERVER['SCRIPT_URI'] = 'http://localhost/communityid/users/register/save'; - Application::$front->setRequest(new TestRequest('/users/register/save')); - - Application::$mockLogger->events = array(); - try { - Application::dispatch(); - } catch (Zend_Controller_Response_Exception $e) { - // I still don't know how to avoid the "headers already sent" problem here... - } - $this->_assertRedirectedTo('/communityid/'); - - $users = new Users_Model_Users(); - $user = $users->getUserWithEmail($email); - $this->assertType('Users_Model_User', $user); - $this->assertEquals('johns34', $user->username); - $this->assertEquals('http://localhost/communityid/identity/johns34', $user->openid); - $this->assertEquals(0, $user->accepted_eula); - $this->assertEquals('john', $user->firstname); - $this->assertEquals('smith', $user->lastname); - $this->assertEquals($email, $user->email); - $this->assertEquals(Users_Model_User::ROLE_GUEST, $user->role); - $this->assertNotEquals('', $user->token); - - $user->delete(); - } - - public function testGetMail() - { - $user = $this->_getUser(); - - // this is used to build the the registration URL - $_SERVER['SCRIPT_URI'] = 'http://localhost/communityid/users/register/save'; - - $mail = Users_RegisterController::getMail($user, 'Community-ID registration confirmation'); - $this->assertType('Zend_Mail', $mail); - $mailBody = $mail->getBodyText(true); - $mailBody = str_replace("=\n", '', $mailBody); // remove line splitters - $this->assertContains('Dear ' . $user->getFullName(), $mailBody); - $this->assertEquals(preg_match('#http://localhost/communityid/users/register/eula\?token=3D([0-9a-f=\n]+)#', $mailBody, $matches), 1); - $token = str_replace('=0', '', $matches[1]); // remove trailing return chars - $token = str_replace(array('=', "\n"), '', $token); - $this->assertEquals($token, $user->token); - unset($user); - } - - public function testEulaBadTokenAction() - { - $_GET = array('token' => 'asdfsdf'); - Application::$front->setRequest(new TestRequest('/users/register/eula')); - - Application::dispatch(); - - $this->_assertRedirectedTo('/communityid/'); - } - - public function testEulaAction() - { - $user = $this->_getUser(); - $user->save(); - $_GET = array('token' => $user->token); - Application::$front->setRequest(new TestRequest('/users/register/eula')); - Application::dispatch(); - $fp = fopen(dirname(__FILE__) . '/../../../../resources/en/eula.txt', 'r'); - $firstLine = fgets($fp); - $this->assertContains($firstLine, $this->_response->getBody()); - $user->delete(); - } - - public function testDeclineeulaBadTokenAction() - { - $_GET = array('token' => 'asdfsdf'); - Application::$front->setRequest(new TestRequest('/users/register/declineeula')); - try { - Application::dispatch(); - } catch (Zend_Controller_Response_Exception $e) { - } - $this->_assertRedirectedTo('/communityid/'); - $lastLog = array_pop(Application::$mockLogger->events); - $lastLog = array_pop(Application::$mockLogger->events); - $this->assertEquals("invalid token", $lastLog['message']); - } - - public function testDeclineeulaAction() - { - $user = $this->_getUser(); - $user->save(); - $token = $user->token; - - $_GET = array('token' => $user->token); - Application::$front->setRequest(new TestRequest('/users/register/declineeula')); - try { - Application::dispatch(); - } catch (Zend_Controller_Response_Exception $e) { - } - $this->_assertRedirectedTo('/communityid/'); - - $users = new Users_Model_Users(); - $user = $users->getUserWithToken($token); - $this->assertNull($user); - } - - public function testAccepteulaBadTokenAction() - { - $_GET = array('token' => 'asdfsdf'); - Application::$front->setRequest(new TestRequest('/users/register/accepteula')); - try { - Application::dispatch(); - } catch (Zend_Controller_Response_Exception $e) { - } - $this->_assertRedirectedTo('/communityid/'); - } - - public function testAccepteulaAction() - { - $user = $this->_getUser(); - $user->save(); - $token = $user->token; - - $_GET = array('token' => $user->token); - - Application::$front->setRequest(new TestRequest('/users/register/accepteula')); - Application::dispatch(); - - $this->_assertRedirectedTo('/communityid/users/profile'); - - $user->delete(); - } - - public function tearDown() - { - // I know this is done again in setUp(), but if I don't do it here too, - // hell breaks appart - Application::cleanUp(); - } - - public function provideBadRegistrationInput() - { - return array( - array( - 'firstname' => '', - 'lastname' => 'smith', - 'email' => 'john@mailinator.com', - 'username' => 'johns34', - 'password1' => 'johns', - 'password2' => 'johns', - ), - array( - 'firstname' => 'john', - 'lastname' => '', - 'email' => 'john@mailinator.com', - 'username' => 'johns34', - 'password1' => 'johns', - 'password2' => 'johns', - ), - array( - 'firstname' => 'john', - 'lastname' => 'smith', - 'email' => 'john@mailinator.com', - 'username' => 'johns34', - 'password1' => '', - 'password2' => '', - ), - ); - } - - private function _getUser() - { - $users = new Users_Model_Users(); - $user = $users->createRow(); - $user->firstname = 'john'; - $user->lastname = 'smith'; - $user->token = Users_Model_User::generateToken(); - $user->email = 'john@mailinator.com'; - - return $user; - } - - private function _assertRedirectedTo($location) - { - $responseHeaders = $this->_response->getHeaders(); - $this->assertEquals($responseHeaders[0]['name'], 'Location'); - $this->assertEquals($responseHeaders[0]['value'], $location); - } -} diff --git a/tests/modules/users/models/UsersTests.php b/tests/modules/users/models/UsersTests.php deleted file mode 100644 index 77e6560..0000000 --- a/tests/modules/users/models/UsersTests.php +++ /dev/null @@ -1,57 +0,0 @@ -getUserWithEmail('thisshouldntexist'); - $this->assertNull($user); - - $user = $users->createRow(); - $user->test = 1; - $user->username = 'usernametest'; - $user->openid = 'http://example.com'; - $user->accepted_eula = 1; - $user->firstname = 'firstnametest'; - $user->lastname = 'lastnametest'; - $user->email = 'usertest@mailinator.com'; - $user->role = Users_Model_User::ROLE_REGISTERED; - $user->token = ''; - $user->save(); - - $user = $users->getUserWithEmail('usertest@mailinator.com'); - $this->assertType('Users_Model_User', $user); - $this->assertEquals('usernametest', $user->username); - $this->assertEquals('http://example.com', $user->openid); - $this->assertEquals(1, $user->accepted_eula); - $this->assertEquals('firstnametest', $user->firstname); - $this->assertEquals('lastnametest', $user->lastname); - $this->assertEquals('usertest@mailinator.com', $user->email); - $this->assertEquals(Users_Model_User::ROLE_REGISTERED, $user->role); - $this->assertEquals('', $user->token); - - $user->delete(); - - $user = $users->getUserWithEmail('thisshouldntexist'); - $this->assertNull($user); - } -} diff --git a/utilities/RandomText.php b/utilities/RandomText.php deleted file mode 100644 index 485d762..0000000 --- a/utilities/RandomText.php +++ /dev/null @@ -1,47 +0,0 @@ -deleteTestEntries(); diff --git a/utilities/deleteTestUsers.php b/utilities/deleteTestUsers.php deleted file mode 100644 index 54a04e9..0000000 --- a/utilities/deleteTestUsers.php +++ /dev/null @@ -1,26 +0,0 @@ -deleteTestEntries(); diff --git a/utilities/generateRandomHistory.php b/utilities/generateRandomHistory.php deleted file mode 100644 index 0f7c3a5..0000000 --- a/utilities/generateRandomHistory.php +++ /dev/null @@ -1,65 +0,0 @@ -_words = file(dirname(__FILE__).'/../libs/Monkeys/tests/words.txt'); - $this->_numWords= count($this->_words); - } - - public function generate() - { - $histories = new Model_Histories(); - - $stats = new Stats_Model_Stats(); - $userIds = $stats->getAllTestUsersIds(); - $numUsers = count($userIds); - - for ($i = 0; $i < NUM_ENTRIES; $i++) { - $history = $histories->createRow(); - - $history->user_id = $userIds[rand(0, $numUsers - 1)]['id']; - $history->date = date('Y-m-d H:i:s', time() - rand(0, 365) * 24 * 60 * 60); - $history->site = 'http://' . strtolower(trim($this->_words[rand(0, $this->_numWords)])) . '.com/' - . strtolower(trim($this->_words[rand(0, $this->_numWords)])); - $history->ip = rand(1, 255) . '.' . rand(1, 255) . '.' . rand(1, 255) . '.' . rand(1, 255); - $history->result = Model_History::AUTHORIZED; - $history->save(); - } - } -} - -$generate = new GenerateRandomHistory(); -$generate->generate(); diff --git a/utilities/generateRandomNews.php b/utilities/generateRandomNews.php deleted file mode 100644 index 288bb63..0000000 --- a/utilities/generateRandomNews.php +++ /dev/null @@ -1,51 +0,0 @@ -createRow(); - $article->test = 1; - $article->title = RandomText::getRandomWord() . ' ' - . RandomText::getRandomWord() . ' ' . RandomText::getRandomWord(); - $article->date = date('Y-m-d', time() - 24*60*60 * rand(0, 15)); - $article->excerpt = RandomText::getRandomText(50); - $article->content = RandomText::getRandomText(700); - $article->save(); - } - } -} - -$generate = new GenerateRandomNews(); -$generate->generate(); diff --git a/utilities/generateRandomTrustedSites.php b/utilities/generateRandomTrustedSites.php deleted file mode 100644 index 28b1a56..0000000 --- a/utilities/generateRandomTrustedSites.php +++ /dev/null @@ -1,64 +0,0 @@ -_words = file(dirname(__FILE__).'/../libs/Monkeys/tests/words.txt'); - $this->_numWords= count($this->_words); - } - - public function generate() - { - $sites = new Model_Sites(); - - $stats = new Stats_Model_Stats(); - $userIds = $stats->getAllTestUsersIds(); - $numUsers = count($userIds); - - for ($i = 0; $i < NUM_ENTRIES; $i++) { - $site = $sites->createRow(); - - $site->user_id = $userIds[rand(0, $numUsers - 1)]['id']; - $site->site = 'http://' . strtolower(trim($this->_words[rand(0, $this->_numWords)])) . '.com/' - . strtolower(trim($this->_words[rand(0, $this->_numWords)])); - $site->creation_date = date('Y-m-d H:i:s', time() - rand(0, 365) * 24 * 60 * 60); - $site->trusted = 'a:1:{s:26:"Zend_OpenId_Extension_Sreg";a:0:{}}'; - $site->save(); - } - } -} - -$generate = new GenerateRandomSites(); -$generate->generate(); diff --git a/utilities/generateRandomUsers.php b/utilities/generateRandomUsers.php deleted file mode 100755 index 11aa8ba..0000000 --- a/utilities/generateRandomUsers.php +++ /dev/null @@ -1,68 +0,0 @@ -_names = file(dirname(__FILE__).'/../libs/Monkeys/tests/names.txt'); - $this->_numNames = count($this->_names); - } - - public function generate() - { - $users = new Users_Model_Users(); - for ($i = 0; $i < NUM_USERS ; $i++) { - $confirmed = array_rand(array(true, false)); - - $firstname = trim($this->_names[rand(0, $this->_numNames)]); - $username = strtolower(substr($firstname, 0, 4)); - $user = $users->createRow(); - - $user->test = 1; - $user->username = $username; - $user->openid = "http://localhost/communityid/identity/$username"; - $user->accepted_eula = $confirmed? 1 : 0; - $user->registration_date = date('Y-m-d', time() - rand(0, 365) * 24 * 60 * 60); - $user->firstname = $firstname; - $user->lastname = trim($this->_names[rand(0, $this->_numNames)]); - $user->email = "$username@mailinator.com"; - $user->role = $confirmed? Users_Model_User::ROLE_REGISTERED : Users_Model_User::ROLE_GUEST; - $user->token = $confirmed? '' : Users_Model_User::generateToken(); - $user->save(); - } - } -} - -$generate = new GenerateRandomUsers(); -$generate->generate(); diff --git a/views/layouts/layout.phtml b/views/layouts/layout.phtml index 56f2be1..0820eae 100644 --- a/views/layouts/layout.phtml +++ b/views/layouts/layout.phtml @@ -2,6 +2,7 @@ + headMeta() ?> headTitle('Community ID'); ?> diff --git a/webdir/index.php b/webdir/index.php deleted file mode 100755 index 08598ce..0000000 --- a/webdir/index.php +++ /dev/null @@ -1,17 +0,0 @@ -